ZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLm1rIGIvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggMmYxNjkyMy4uNzI4NmY5MiAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTYsMjEgKzYsMTggQEAKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKLQlJQ2FtZXJhU2VydmljZS5jcHAKKwlJQ2FtZXJhU2VydmljZS5jcHAgXAorCUlDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAgXAorCUlDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdXRpbHMgXAogCWxpYnV0aWxzIFwKIAlsaWJiaW5kZXIgXAogCWxpYmhhcmR3YXJlIFwKLQlsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAogCWxpYnVpIFwKIAlsaWJndWkKIAogTE9DQUxfTU9EVUxFOj0gbGliY2FtZXJhX2NsaWVudAogCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi0gICAgTE9DQUxfTERMSUJTICs9IC1scHRocmVhZAotZW5kaWYKLQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCBlMjg4MzEyLi43YWMzY2MxIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtMTksMTEgKzE5LDEyIEBACiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KIAogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KQEAgLTIwNSwyMiArMjA2LDYgQEAKICAgICByZXR1cm4gYy0+c3RhcnRQcmV2aWV3KCk7CiB9CiAKLWludDMyX3QgQ2FtZXJhOjpnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIGNvbnN0Ci17Ci0gICAgTE9HVigiZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMiKTsKLSAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGMtPmdldE51bWJlck9mVmlkZW9CdWZmZXJzKCk7Ci19Ci0KLXNwPElNZW1vcnk+IENhbWVyYTo6Z2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3QKLXsKLSAgICBMT0dWKCJnZXRWaWRlb0J1ZmZlcjogJWQiLCBpbmRleCk7Ci0gICAgc3AgPElDYW1lcmE+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBjLT5nZXRWaWRlb0J1ZmZlcihpbmRleCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYTo6c3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpCiB7CiAgICAgTE9HVigic3RvcmVNZXRhRGF0YUluQnVmZmVyczogJXMiLApAQCAtMjUyLDYgKzIzNywxMCBAQAogdm9pZCBDYW1lcmE6OnN0b3BSZWNvcmRpbmcoKQogewogICAgIExPR1YoInN0b3BSZWNvcmRpbmciKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1SZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNsZWFyKCk7CisgICAgfQogICAgIHNwIDxJQ2FtZXJhPiBjID0gbUNhbWVyYTsKICAgICBpZiAoYyA9PSAwKSByZXR1cm47CiAgICAgYy0+c3RvcFJlY29yZGluZygpOwpAQCAtMzQzLDYgKzMzMiwxMiBAQAogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCit2b2lkIENhbWVyYTo6c2V0UmVjb3JkaW5nUHJveHlMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwogdm9pZCBDYW1lcmE6OnNldFByZXZpZXdDYWxsYmFja0ZsYWdzKGludCBmbGFnKQogewogICAgIExPR1YoInNldFByZXZpZXdDYWxsYmFja0ZsYWdzIik7CkBAIC0zNjUsNyArMzYwLDggQEAKIH0KIAogLy8gY2FsbGJhY2sgZnJvbSBjYW1lcmEgc2VydmljZSB3aGVuIGZyYW1lIG9yIGltYWdlIGlzIHJlYWR5Ci12b2lkIENhbWVyYTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpCit2b2lkIENhbWVyYTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSkKIHsKICAgICBzcDxDYW1lcmFMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgewpAQCAtMzczLDEzICszNjksMjYgQEAKICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXI7CiAgICAgfQogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5wb3N0RGF0YShtc2dUeXBlLCBkYXRhUHRyKTsKKyAgICAgICAgbGlzdGVuZXItPnBvc3REYXRhKG1zZ1R5cGUsIGRhdGFQdHIsIG1ldGFkYXRhKTsKICAgICB9CiB9CiAKIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2Ugd2hlbiB0aW1lc3RhbXBlZCBmcmFtZSBpcyByZWFkeQogdm9pZCBDYW1lcmE6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikKIHsKKyAgICAvLyBJZiByZWNvcmRpbmcgcHJveHkgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCwgZm9yd2FyZCB0aGUgZnJhbWUgYW5kIHJldHVybi4KKyAgICAvLyBUaGUgb3RoZXIgbGlzdGVuZXIgKG1MaXN0ZW5lcikgaXMgaWdub3JlZCBiZWNhdXNlIHRoZSByZWNlaXZlciBuZWVkcyB0bworICAgIC8vIGNhbGwgcmVsZWFzZVJlY29yZGluZ0ZyYW1lLgorICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiBwcm94eWxpc3RlbmVyOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgcHJveHlsaXN0ZW5lciA9IG1SZWNvcmRpbmdQcm94eUxpc3RlbmVyOworICAgIH0KKyAgICBpZiAocHJveHlsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIHByb3h5bGlzdGVuZXItPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGRhdGFQdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3A8Q2FtZXJhTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQwNSw0ICs0MTQsMzQgQEAKICAgICBMT0dXKCJDYW1lcmEgc2VydmVyIGRpZWQhIik7CiB9CiAKK3NwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gQ2FtZXJhOjpnZXRSZWNvcmRpbmdQcm94eSgpIHsKKyAgICBMT0dWKCJnZXRQcm94eSIpOworICAgIHJldHVybiBuZXcgUmVjb3JkaW5nUHJveHkodGhpcyk7Cit9CisKK3N0YXR1c190IENhbWVyYTo6UmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nKGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiYgbGlzdGVuZXIpCit7CisgICAgTE9HVigiUmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nIik7CisgICAgbUNhbWVyYS0+c2V0UmVjb3JkaW5nUHJveHlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgbUNhbWVyYS0+cmVjb25uZWN0KCk7CisgICAgcmV0dXJuIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCk7Cit9CisKK3ZvaWQgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6c3RvcFJlY29yZGluZygpCit7CisgICAgTE9HVigiUmVjb3JkaW5nUHJveHk6OnN0b3BSZWNvcmRpbmciKTsKKyAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7Cit9CisKK3ZvaWQgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCit7CisgICAgTE9HVigiUmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZSIpOworICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShtZW0pOworfQorCitDYW1lcmE6OlJlY29yZGluZ1Byb3h5OjpSZWNvcmRpbmdQcm94eShjb25zdCBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgbUNhbWVyYSA9IGNhbWVyYTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCAwZmQ3OWE0Li41MWI5NmMxIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC01OSw2ICs1OSw4IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVNbXSA9ICJmbGFzaC1tb2RlLXZhbHVlcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19NT0RFW10gPSAiZm9jdXMtbW9kZSI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRk9DVVNfTU9ERVNbXSA9ICJmb2N1cy1tb2RlLXZhbHVlcyI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX0ZPQ1VTX0FSRUFTW10gPSAibWF4LW51bS1mb2N1cy1hcmVhcyI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBU1tdID0gImZvY3VzLWFyZWFzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ0FMX0xFTkdUSFtdID0gImZvY2FsLWxlbmd0aCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9IT1JJWk9OVEFMX1ZJRVdfQU5HTEVbXSA9ICJob3Jpem9udGFsLXZpZXctYW5nbGUiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVkVSVElDQUxfVklFV19BTkdMRVtdID0gInZlcnRpY2FsLXZpZXctYW5nbGUiOwpAQCAtNjYsNiArNjgsMTIgQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9FWFBPU1VSRV9DT01QRU5TQVRJT05bXSA9ICJtYXgtZXhwb3N1cmUtY29tcGVuc2F0aW9uIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01JTl9FWFBPU1VSRV9DT01QRU5TQVRJT05bXSA9ICJtaW4tZXhwb3N1cmUtY29tcGVuc2F0aW9uIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9TVEVQW10gPSAiZXhwb3N1cmUtY29tcGVuc2F0aW9uLXN0ZXAiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfQVVUT19FWFBPU1VSRV9MT0NLW10gPSAiYXV0by1leHBvc3VyZS1sb2NrIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fRVhQT1NVUkVfTE9DS19TVVBQT1JURURbXSA9ICJhdXRvLWV4cG9zdXJlLWxvY2stc3VwcG9ydGVkIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0tbXSA9ICJhdXRvLXdoaXRlYmFsYW5jZS1sb2NrIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0tfU1VQUE9SVEVEW10gPSAiYXV0by13aGl0ZWJhbGFuY2UtbG9jay1zdXBwb3J0ZWQiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9NRVRFUklOR19BUkVBU1tdID0gIm1heC1udW0tbWV0ZXJpbmctYXJlYXMiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUVURVJJTkdfQVJFQVNbXSA9ICJtZXRlcmluZy1hcmVhcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NW10gPSAiem9vbSI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfWk9PTVtdID0gIm1heC16b29tIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1pPT01fUkFUSU9TW10gPSAiem9vbS1yYXRpb3MiOwpAQCAtNzYsOCArODQsMTIgQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1ZJREVPX1NJWkVbXSA9ICJ2aWRlby1zaXplIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9WSURFT19TSVpFU1tdID0gInZpZGVvLXNpemUtdmFsdWVzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRUZFUlJFRF9QUkVWSUVXX1NJWkVfRk9SX1ZJREVPW10gPSAicHJlZmVycmVkLXByZXZpZXctc2l6ZS1mb3ItdmlkZW8iOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19IV1tdID0gIm1heC1udW0tZGV0ZWN0ZWQtZmFjZXMtaHciOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19TV1tdID0gIm1heC1udW0tZGV0ZWN0ZWQtZmFjZXMtc3ciOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUkVDT1JESU5HX0hJTlRbXSA9ICJyZWNvcmRpbmctaGludCI7CiAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6VFJVRVtdID0gInRydWUiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpGQUxTRVtdID0gImZhbHNlIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfRElTVEFOQ0VfSU5GSU5JVFlbXSA9ICJJbmZpbml0eSI7CiAKIC8vIFZhbHVlcyBmb3Igd2hpdGUgYmFsYW5jZSBzZXR0aW5ncy4KQEAgLTEzNyw3ICsxNDksOSBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIySVtdID0gInl1djQyMmkteXV5diI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBQW10gID0gInl1djQyMHAiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCNTY1W10gPSAicmdiNTY1IjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQkE4ODg4W10gPSAicmdiYTg4ODgiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFR1tdID0gImpwZWciOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfQkFZRVJfUkdHQltdID0gImJheWVyLXJnZ2IiOwogCiAvLyBWYWx1ZXMgZm9yIGZvY3VzIG1vZGUgc2V0dGluZ3MuCiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQVVUT1tdID0gImF1dG8iOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmEuY3BwIGIvY2FtZXJhL0lDYW1lcmEuY3BwCmluZGV4IDkzMWI1N2QuLjVmNmU1ZWYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYS5jcHAKQEAgLTQ2LDggKzQ2LDYgQEAKICAgICBTVE9QX1JFQ09SRElORywKICAgICBSRUNPUkRJTkdfRU5BQkxFRCwKICAgICBSRUxFQVNFX1JFQ09SRElOR19GUkFNRSwKLSAgICBHRVRfTlVNX1ZJREVPX0JVRkZFUlMsCi0gICAgR0VUX1ZJREVPX0JVRkZFUiwKICAgICBTVE9SRV9NRVRBX0RBVEFfSU5fQlVGRkVSUywKIH07CiAKQEAgLTE0OSwyNyArMTQ3LDYgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIGludDMyX3QgZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSBjb25zdAotICAgIHsKLSAgICAgICAgTE9HVigiZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9OVU1fVklERU9fQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHNwPElNZW1vcnk+IGdldFZpZGVvQnVmZmVyKGludDMyX3QgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBMT0dWKCJnZXRWaWRlb0J1ZmZlcjogJWQiLCBpbmRleCk7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVklERU9fQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICByZXR1cm4gbWVtOwotICAgIH0KLQogICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoYm9vbCBlbmFibGVkKQogICAgIHsKICAgICAgICAgTE9HVigic3RvcmVNZXRhRGF0YUluQnVmZmVyczogJXMiLCBlbmFibGVkPyAidHJ1ZSI6ICJmYWxzZSIpOwpAQCAtMzU1LDE5ICszMzIsNiBAQAogICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKG1lbSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX05VTV9WSURFT19CVUZGRVJTOiB7Ci0gICAgICAgICAgICBMT0dWKCJHRVRfTlVNX1ZJREVPX0JVRkZFUlMiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfVklERU9fQlVGRkVSOiB7Ci0gICAgICAgICAgICBMT0dWKCJHRVRfVklERU9fQlVGRkVSIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0VmlkZW9CdWZmZXIoaW5kZXgpLT5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVE9SRV9NRVRBX0RBVEFfSU5fQlVGRkVSUzogewogICAgICAgICAgICAgTE9HVigiU1RPUkVfTUVUQV9EQVRBX0lOX0JVRkZFUlMiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAgYi9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKaW5kZXggY2IzYmQwYy4uMTgzNDI5YSAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcApAQCAtNTEsMTMgKzUxLDE4IEBACiAgICAgfQogCiAgICAgLy8gZ2VuZXJpYyBkYXRhIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwIHdpdGggaW1hZ2UgZGF0YQotICAgIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGltYWdlRGF0YSkKKyAgICB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBpbWFnZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKQogICAgIHsKICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2dUeXBlKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihpbWFnZURhdGEtPmFzQmluZGVyKCkpOworICAgICAgICBpZiAobWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtZXRhZGF0YS0+bnVtYmVyX29mX2ZhY2VzKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGUobWV0YWRhdGEtPmZhY2VzLCBzaXplb2YoY2FtZXJhX2ZhY2VfdCkgKiBtZXRhZGF0YS0+bnVtYmVyX29mX2ZhY2VzKTsKKyAgICAgICAgfQogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREFUQV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCkBAIC05Niw3ICsxMDEsMTUgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gaW1hZ2VEYXRhID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGltYWdlRGF0YSk7CisgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKGRhdGEuZGF0YUF2YWlsKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBuZXcgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3Q7CisgICAgICAgICAgICAgICAgbWV0YWRhdGEtPm51bWJlcl9vZl9mYWNlcyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICAgICAgbWV0YWRhdGEtPmZhY2VzID0gKGNhbWVyYV9mYWNlX3QgKikgZGF0YS5yZWFkSW5wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjYW1lcmFfZmFjZV90KSAqIG1ldGFkYXRhLT5udW1iZXJfb2ZfZmFjZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGltYWdlRGF0YSwgbWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKG1ldGFkYXRhKSBkZWxldGUgbWV0YWRhdGE7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgREFUQV9DQUxMQkFDS19USU1FU1RBTVA6IHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwIGIvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNmE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJQ2FtZXJhUmVjb3JkaW5nUHJveHkiCisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgorI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIFNUQVJUX1JFQ09SRElORyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgU1RPUF9SRUNPUkRJTkcsCisgICAgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUUsCit9OworCisKK2NsYXNzIEJwQ2FtZXJhUmVjb3JkaW5nUHJveHk6IHB1YmxpYyBCcEludGVyZmFjZTxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+Cit7CitwdWJsaWM6CisgICAgQnBDYW1lcmFSZWNvcmRpbmdQcm94eShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nKGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiYgbGlzdGVuZXIpCisgICAgeworICAgICAgICBMT0dWKCJzdGFydFJlY29yZGluZyIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfUkVDT1JESU5HLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdm9pZCBzdG9wUmVjb3JkaW5nKCkKKyAgICB7CisgICAgICAgIExPR1YoInN0b3BSZWNvcmRpbmciKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9SRUNPUkRJTkcsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKKyAgICB7CisgICAgICAgIExPR1YoInJlbGVhc2VSZWNvcmRpbmdGcmFtZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobWVtLT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FLCBkYXRhLCAmcmVwbHkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFSZWNvcmRpbmdQcm94eSwgImFuZHJvaWQuaGFyZHdhcmUuSUNhbWVyYVJlY29yZGluZ1Byb3h5Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5DYW1lcmFSZWNvcmRpbmdQcm94eTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgU1RBUlRfUkVDT1JESU5HOiB7CisgICAgICAgICAgICBMT0dWKCJTVEFSVF9SRUNPUkRJTkciKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHksIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXJ0UmVjb3JkaW5nKGxpc3RlbmVyKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUF9SRUNPUkRJTkc6IHsKKyAgICAgICAgICAgIExPR1YoIlNUT1BfUkVDT1JESU5HIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUU6IHsKKyAgICAgICAgICAgIExPR1YoIlJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUobWVtKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjZWNlNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIiCisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgREFUQV9DQUxMQkFDS19USU1FU1RBTVAgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworY2xhc3MgQnBDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+Cit7CitwdWJsaWM6CisgICAgQnBDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgaW1hZ2VEYXRhKQorICAgIHsKKyAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZXN0YW1wKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZ1R5cGUpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGltYWdlRGF0YS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChEQVRBX0NBTExCQUNLX1RJTUVTVEFNUCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKENhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIsICJhbmRyb2lkLmhhcmR3YXJlLklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBEQVRBX0NBTExCQUNLX1RJTUVTVEFNUDogeworICAgICAgICAgICAgTE9HVigiREFUQV9DQUxMQkFDS19USU1FU1RBTVAiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGltYWdlRGF0YSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGltYWdlRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggMWIxM2RkOS4uZTk2NDJmNyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtOCw3ICs4LDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJza2lhIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBsaWJndWkKKyAgICAgICAgbGlic2tpYSBsaWJndWkKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICBzdHJlYW0uY3BwICAgIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGliZ3VpIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYQogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtMTMyLDcgKzEzMiw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYm1lZGlhIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBsaWJjdXRpbHMgbGlidWkKKyAgICAgICAgbGlibWVkaWEgbGliZ3VpIGxpYmN1dGlscyBsaWJ1aQogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCmluZGV4IDg3MzM2NjIuLjg1ODY4MWYgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBpbnQgbWFpbigpIHsKQEAgLTMxLDggKzMzLDggQEAKICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULAogICAgICAgICAgICAga1NhbXBsZVJhdGUsCiAgICAgICAgICAgICBrTnVtQ2hhbm5lbHMgPT0gMQotICAgICAgICAgICAgICAgID8gQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fTU9OTwotICAgICAgICAgICAgICAgIDogQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fU1RFUkVPKTsKKyAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfSU5fTU9OTworICAgICAgICAgICAgICAgIDogQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pOwogI2VuZGlmCiAKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKaW5kZXggMTI2NDIxNS4uYzQwMjI4NiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlc1xuIiwgbWUpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1oKGVscClcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1iIGJpdCByYXRlIGluIGJpdHMgcGVyIHNlY29uZCAoZGVmYXVsdDogMzAwMDAwKVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWMgWVVWNDIwIGNvbG9yIGZvcm1hdDogWzBdIHNlbWkgcGxhbmFyIG9yIFsxXSBwbGFuYXIgKGRlZmF1bHQ6IDEpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYyBZVVY0MjAgY29sb3IgZm9ybWF0OiBbMF0gc2VtaSBwbGFuYXIgb3IgWzFdIHBsYW5hciBvciBvdGhlciBvbXggWVVWNDIwIGNvbG9yIGZvcm1hdCAoZGVmYXVsdDogMSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1mIGZyYW1lIHJhdGUgaW4gZnJhbWVzIHBlciBzZWNvbmQgKGRlZmF1bHQ6IDMwKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWkgSSBmcmFtZSBpbnRlcnZhbCBpbiBzZWNvbmRzIChkZWZhdWx0OiAxKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW4gbnVtYmVyIG9mIGZyYW1lcyB0byBiZSByZWNvcmRlZCAoZGVmYXVsdDogMzAwKVxuIik7CkBAIC01OSwxMSArNTksNiBAQAogICAgICAgICAgIG1TaXplKCh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMikgewogCiAgICAgICAgIG1Hcm91cC5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtU2l6ZSkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBjb2xvciBmb3JtYXQgdG8gbWFrZSBzdXJlCi0gICAgICAgIC8vIHRoYXQgdGhlIGJ1ZmZlciBzaXplIG1TaXplIGl0IHNldCBjb3JyZWN0bHkgYWJvdmUuCi0gICAgICAgIENIRUNLKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8Ci0gICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIHsKQEAgLTE0NCw5ICsxMzksMTMgQEAKICAgICAgICAgY2FzZSBrWVVWNDIwUDoKICAgICAgICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBjb2xvcjogJWRcbiIsIGNvbG9yKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ3VzdG9tIE9NWCBjb2xvciBmb3JtYXQ6ICVkXG4iLCBjb2xvcik7CisgICAgICAgICAgICBpZiAoY29sb3IgPT0gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgfHwKKyAgICAgICAgICAgICAgICBjb2xvciA9PSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworICAgICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGMxZDA4MDMuLjZmYTY2Y2YgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlQ29tcG9zZXIuaD4KQEAgLTM5LDEwICs0MCwxMiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0cnVjdCBDb250cm9sbGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBDb250cm9sbGVyKGNvbnN0IGNoYXIgKnVyaSwgYm9vbCBkZWNvZGVBdWRpbywgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpCisgICAgQ29udHJvbGxlcihjb25zdCBjaGFyICp1cmksIGJvb2wgZGVjb2RlQXVkaW8sCisgICAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgYm9vbCByZW5kZXJUb1N1cmZhY2UpCiAgICAgICAgIDogbVVSSSh1cmkpLAogICAgICAgICAgIG1EZWNvZGVBdWRpbyhkZWNvZGVBdWRpbyksCiAgICAgICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCisgICAgICAgICAgbVJlbmRlclRvU3VyZmFjZShyZW5kZXJUb1N1cmZhY2UpLAogICAgICAgICAgIG1Db2RlYyhuZXcgQUNvZGVjKSB7CiAgICAgICAgIENIRUNLKCFtRGVjb2RlQXVkaW8gfHwgbVN1cmZhY2UgPT0gTlVMTCk7CiAgICAgfQpAQCAtOTcsNyArMTAwLDggQEAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbWFrZUZvcm1hdChtU291cmNlLT5nZXRGb3JtYXQoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgic3VyZmFjZSIsIG1TdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hdGl2ZS13aW5kb3ciLCBuZXcgTmF0aXZlV2luZG93V3JhcHBlcihtU3VyZmFjZSkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOwpAQCAtMjIwLDYgKzIyNCw3IEBACiAgICAgQVN0cmluZyBtVVJJOwogICAgIGJvb2wgbURlY29kZUF1ZGlvOwogICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworICAgIGJvb2wgbVJlbmRlclRvU3VyZmFjZTsKICAgICBzcDxBQ29kZWM+IG1Db2RlYzsKICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKIApAQCAtNDUxLDcgKzQ1Niw3IEBACiAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBpbkJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAvLyBicmVhazsgIC8vIERvbid0IGNvYWxlc2NlCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBEb24ndCBjb2FsZXNjZQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBMT0dWKCJjb2FsZXNjZWQgJWQgaW5wdXQgYnVmZmVycyIsIG4pOwpAQCAtNDc5LDYgKzQ4NCwxMCBAQAogICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CiAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CiAKKyAgICAgICAgaWYgKG1SZW5kZXJUb1N1cmZhY2UpIHsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVuZGVyIiwgMSk7CisgICAgICAgIH0KKwogICAgICAgICByZXBseS0+cG9zdCgpOwogICAgIH0KIApAQCAtNDkxLDcgKzUwMCw4IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWEodWRpbylcbiIpOwogCiAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiICAgICAgIC1zKHN1cmZhY2UpIEFsbG9jYXRlIG91dHB1dCBidWZmZXJzIG9uIGEgc3VyZmFjZS5cbiIpOworICAgICAgICAgICAgIiAgICAgICAtUyh1cmZhY2UpIEFsbG9jYXRlIG91dHB1dCBidWZmZXJzIG9uIGEgc3VyZmFjZS5cbiIKKyAgICAgICAgICAgICIgICAgICAgLVIoZW5kZXIpICBSZW5kZXIgc3VyZmFjZS1hbGxvY2F0ZWQgYnVmZmVycy5cbiIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKQEAgLTQ5OSwxOCArNTA5LDIzIEBACiAKICAgICBib29sIGRlY29kZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCB1c2VTdXJmYWNlID0gZmFsc2U7CisgICAgYm9vbCByZW5kZXJUb1N1cmZhY2UgPSBmYWxzZTsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhcyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhU1IiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICAgICAgZGVjb2RlQXVkaW8gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAgICAgIHVzZVN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICByZW5kZXJUb1N1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTU0Myw3ICs1NTgsNiBAQAogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKICAgICAgICAgY29udHJvbCA9IGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgIGdldHBpZCgpLAogICAgICAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgMTI4MCwKQEAgLTU1NCwxNiArNTY4LDE4IEBACiAgICAgICAgIENIRUNLKGNvbnRyb2wgIT0gTlVMTCk7CiAgICAgICAgIENIRUNLKGNvbnRyb2wtPmlzVmFsaWQoKSk7CiAKLSAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPm9wZW5UcmFuc2FjdGlvbigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwogICAgICAgICBDSEVDS19FUShjb250cm9sLT5zZXRMYXllcigzMDAwMCksIChzdGF0dXNfdClPSyk7CiAgICAgICAgIENIRUNLX0VRKGNvbnRyb2wtPnNob3coKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmNsb3NlVHJhbnNhY3Rpb24oKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CiAKICAgICAgICAgc3VyZmFjZSA9IGNvbnRyb2wtPmdldFN1cmZhY2UoKTsKICAgICAgICAgQ0hFQ0soc3VyZmFjZSAhPSBOVUxMKTsKICAgICB9CiAKLSAgICBzcDxDb250cm9sbGVyPiBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoYXJndlswXSwgZGVjb2RlQXVkaW8sIHN1cmZhY2UpOworICAgIHNwPENvbnRyb2xsZXI+IGNvbnRyb2xsZXIgPQorICAgICAgICBuZXcgQ29udHJvbGxlcihhcmd2WzBdLCBkZWNvZGVBdWRpbywgc3VyZmFjZSwgcmVuZGVyVG9TdXJmYWNlKTsKKwogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCiAgICAgY29udHJvbGxlci0+c3RhcnRBc3luYygpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBhODc1YzNhLi4zNGYwYTY0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtNjYsNiArNjYsNyBAQAogc3RhdGljIGxvbmcgZ01heE51bUZyYW1lczsgIC8vIDAgbWVhbnMgZGVjb2RlIGFsbCBhdmFpbGFibGUuCiBzdGF0aWMgbG9uZyBnUmVwcm9kdWNlQnVnOyAgLy8gaWYgbm90IC0xLgogc3RhdGljIGJvb2wgZ1ByZWZlclNvZnR3YXJlQ29kZWM7CitzdGF0aWMgYm9vbCBnRm9yY2VUb1VzZUhhcmR3YXJlQ29kZWM7CiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOwpAQCAtNzMsOCArNzQsNiBAQAogCiBzdGF0aWMgc3A8QU5hdGl2ZVdpbmRvdz4gZ1N1cmZhY2U7CiAKLSNkZWZpbmUgVVNFX1NVUkZBQ0VfQ09NUE9TRVIgMAotCiBzdGF0aWMgaW50NjRfdCBnZXROb3dVcygpIHsKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKQEAgLTE0NCwxMCArMTQzLDE4IEBACiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgbWltZSkpIHsKICAgICAgICAgcmF3U291cmNlID0gc291cmNlOwogICAgIH0gZWxzZSB7CisgICAgICAgIGludCBmbGFncyA9IDA7CisgICAgICAgIGlmIChnUHJlZmVyU29mdHdhcmVDb2RlYykgeworICAgICAgICAgICAgZmxhZ3MgfD0gT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ0ZvcmNlVG9Vc2VIYXJkd2FyZUNvZGVjKSB7CisgICAgICAgICAgICBDSEVDSyghZ1ByZWZlclNvZnR3YXJlQ29kZWMpOworICAgICAgICAgICAgZmxhZ3MgfD0gT01YQ29kZWM6OmtIYXJkd2FyZUNvZGVjc09ubHk7CisgICAgICAgIH0KICAgICAgICAgcmF3U291cmNlID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIGNsaWVudC0+aW50ZXJmYWNlKCksIG1ldGEsIGZhbHNlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIHNvdXJjZSwKICAgICAgICAgICAgIE5VTEwgLyogbWF0Y2hDb21wb25lbnROYW1lICovLAotICAgICAgICAgICAgZ1ByZWZlclNvZnR3YXJlQ29kZWMgPyBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzIDogMCwKKyAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgZ1N1cmZhY2UpOwogCiAgICAgICAgIGlmIChyYXdTb3VyY2UgPT0gTlVMTCkgewpAQCAtMzc5LDEzICszODYsMTUgQEAKIAogICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIFN0cmVhbVR5cGUgbVN0cmVhbVR5cGU7CisgICAgYm9vbCBtU2F3Rmlyc3RJRFJGcmFtZTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERldGVjdFN5bmNTb3VyY2UpOwogfTsKIAogRGV0ZWN0U3luY1NvdXJjZTo6RGV0ZWN0U3luY1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1TdHJlYW1UeXBlKE9USEVSKSB7CisgICAgICBtU3RyZWFtVHlwZShPVEhFUiksCisgICAgICBtU2F3Rmlyc3RJRFJGcmFtZShmYWxzZSkgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIApAQCAtNDAxLDYgKzQxMCw4IEBACiB9CiAKIHN0YXR1c190IERldGVjdFN5bmNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBtU2F3Rmlyc3RJRFJGcmFtZSA9IGZhbHNlOworCiAgICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CiB9CiAKQEAgLTQzMCwxNiArNDQxLDMwIEBACiAKIHN0YXR1c190IERldGVjdFN5bmNTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKIAotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KIAotICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVkMgJiYgaXNJRFJGcmFtZSgqYnVmZmVyKSkgewotICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVkMpIHsKKyAgICAgICAgICAgIGJvb2wgaXNJRFIgPSBpc0lEUkZyYW1lKCpidWZmZXIpOworICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc0lEUik7CisgICAgICAgICAgICBpZiAoaXNJRFIpIHsKKyAgICAgICAgICAgICAgICBtU2F3Rmlyc3RJRFJGcmFtZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdHJlYW1UeXBlICE9IEFWQyB8fCBtU2F3Rmlyc3RJRFJGcmFtZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZ25vcmUgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgSURSIGZyYW1lLgorICAgICAgICAoKmJ1ZmZlciktPnJlbGVhc2UoKTsKKyAgICAgICAgKmJ1ZmZlciA9IE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNTQ1LDEyICs1NzAsMTQgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdChodW1ibmFpbCkgZXh0cmFjdCB2aWRlbyB0aHVtYm5haWwgb3IgYWxidW0gYXJ0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdyhyaXRlKSBmaWxlbmFtZSAod3JpdGUgdG8gLm1wNCBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWsgc2VlayB0ZXN0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAteCBkaXNwbGF5IGEgaGlzdG9ncmFtIG9mIGRlY29kaW5nIHRpbWVzL2ZwcyAiCiAgICAgICAgICAgICAgICAgICAgICIodmlkZW8gb25seSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1TIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1UIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2UgdGV4dHVyZVxuIik7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewpAQCAtNTYyLDEwICs1ODksMTIgQEAKICAgICBib29sIGV4dHJhY3RUaHVtYm5haWwgPSBmYWxzZTsKICAgICBib29sIHNlZWtUZXN0ID0gZmFsc2U7CiAgICAgYm9vbCB1c2VTdXJmYWNlQWxsb2MgPSBmYWxzZTsKKyAgICBib29sIHVzZVN1cmZhY2VUZXhBbGxvYyA9IGZhbHNlOwogICAgIGdOdW1SZXBldGl0aW9ucyA9IDE7CiAgICAgZ01heE51bUZyYW1lcyA9IDA7CiAgICAgZ1JlcHJvZHVjZUJ1ZyA9IC0xOwogICAgIGdQcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CisgICAgZ0ZvcmNlVG9Vc2VIYXJkd2FyZUNvZGVjID0gZmFsc2U7CiAgICAgZ1BsYXliYWNrQXVkaW8gPSBmYWxzZTsKICAgICBnV3JpdGVNUDQgPSBmYWxzZTsKICAgICBnRGlzcGxheUhpc3RvZ3JhbSA9IGZhbHNlOwpAQCAtNTc1LDcgKzYwNCw3IEBACiAgICAgc3A8TGl2ZVNlc3Npb24+IGxpdmVTZXNzaW9uOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFuOmxtOmI6cHRzb3c6a3hTIikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFuOmxtOmI6cHRzcm93Omt4U1QiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC02MzYsNiArNjY1LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdGb3JjZVRvVXNlSGFyZHdhcmVDb2RlYyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGdQbGF5YmFja0F1ZGlvID0gdHJ1ZTsKQEAgLTY2MCw2ICs2OTUsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNlU3VyZmFjZVRleEFsbG9jID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC02OTUsMTIgKzczNiwxNCBAQAogICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgewogICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOwogCisgICAgICAgICAgICBib29sIGZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICBDSEVDS19FUShyZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmlsZW5hbWUpLCAoc3RhdHVzX3QpT0spOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0KICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKIAogICAgICAgICAgICAgaWYgKG1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXRGcmFtZUF0VGltZSglcykgPT4gT0tcbiIsIGZpbGVuYW1lKTsKIAogICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUgKmZyYW1lID0gKFZpZGVvRnJhbWUgKiltZW0tPnBvaW50ZXIoKTsKQEAgLTcxNSwxNiArNzU4LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZGNhcmQvb3V0LmpwZyIsIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0ltYWdlRW5jb2Rlcjo6a0pQRUdfVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0ltYWdlRW5jb2Rlcjo6a0RlZmF1bHRRdWFsaXR5KSk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbWVtID0gcmV0cmlldmVyLT5leHRyYWN0QWxidW1BcnQoKTsKIAogICAgICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJleHRyYWN0QWxidW1BcnQoJXMpID0+IE9LXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJib3RoIGdldEZyYW1lQXRUaW1lIGFuZCBleHRyYWN0QWxidW1BcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBvbiBmaWxlICclcycuXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJib3RoIGdldEZyYW1lQXRUaW1lIGFuZCBleHRyYWN0QWxidW1BcnQgIgorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIG9uIGZpbGUgJyVzJy5cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiAwOwpAQCAtNzQ1LDcgKzc5Myw5IEBACiAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAogICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLAogICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsCi0gICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHCisgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCisgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWAogICAgICAgICB9OwogCiAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOwpAQCAtNzUzLDYgKzgwMyw3IEBACiAgICAgICAgICAgICBwcmludGYoInR5cGUgJyVzJzpcbiIsIGtNaW1lVHlwZXNba10pOwogCiAgICAgICAgICAgICBWZWN0b3I8Q29kZWNDYXBhYmlsaXRpZXM+IHJlc3VsdHM7CisgICAgICAgICAgICAvLyB3aWxsIHJldHJpZXZlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBjb2RlY3MKICAgICAgICAgICAgIENIRUNLX0VRKFF1ZXJ5Q29kZWNzKG9teCwga01pbWVUeXBlc1trXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIHF1ZXJ5RGVjb2RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzKSwgKHN0YXR1c190KU9LKTsKQEAgLTc5NCw0MSArODQ1LDQ3IEBACiAKICAgICAgICAgZm9yIChMaXN0PElPTVg6OkNvbXBvbmVudEluZm8+OjppdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKTsKICAgICAgICAgICAgICBpdCAhPSBsaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzXG4iLCAoKml0KS5tTmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICBwcmludGYoIiVzXHQgUm9sZXM6ICIsICgqaXQpLm1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIGZvciAoTGlzdDxTdHJpbmc4Pjo6aXRlcmF0b3IgaXRSb2xlcyA9ICgqaXQpLm1Sb2xlcy5iZWdpbigpIDsKKyAgICAgICAgICAgICAgICAgICAgaXRSb2xlcyAhPSAoKml0KS5tUm9sZXMuZW5kKCkgOyArK2l0Um9sZXMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXHQiLCAoKml0Um9sZXMpLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CiAgICAgc3A8U3VyZmFjZUNvbnRyb2w+IGNvbnRyb2w7CiAKLSAgICBpZiAodXNlU3VyZmFjZUFsbG9jICYmICFhdWRpb09ubHkpIHsKLSNpZiBVU0VfU1VSRkFDRV9DT01QT1NFUgotICAgICAgICBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci0gICAgICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKKyAgICBpZiAoKHVzZVN1cmZhY2VBbGxvYyB8fCB1c2VTdXJmYWNlVGV4QWxsb2MpICYmICFhdWRpb09ubHkpIHsKKyAgICAgICAgaWYgKHVzZVN1cmZhY2VBbGxvYykgeworICAgICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OworICAgICAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIGNvbnRyb2wgPSBjb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIDEyODAsCi0gICAgICAgICAgICAgICAgODAwLAotICAgICAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgY29udHJvbCA9IGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgMTI4MCwKKyAgICAgICAgICAgICAgICAgICAgODAwLAorICAgICAgICAgICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzU2NSwKKyAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKKyAgICAgICAgICAgIENIRUNLKGNvbnRyb2wgIT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyhjb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5vcGVuVHJhbnNhY3Rpb24oKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2V0TGF5ZXIoMzAwMDApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBDSEVDS19FUShjb250cm9sLT5zaG93KCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5jbG9zZVRyYW5zYWN0aW9uKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2V0TGF5ZXIoMzAwMDApLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2hvdygpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CiAKLSAgICAgICAgZ1N1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIENIRUNLKGdTdXJmYWNlICE9IE5VTEwpOwotI2Vsc2UKLSAgICAgICAgc3A8U3VyZmFjZVRleHR1cmU+IHRleHR1cmUgPSBuZXcgU3VyZmFjZVRleHR1cmUoMCAvKiB0ZXggKi8pOwotICAgICAgICBnU3VyZmFjZSA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudCh0ZXh0dXJlKTsKLSNlbmRpZgorICAgICAgICAgICAgZ1N1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgICAgICAgICBDSEVDSyhnU3VyZmFjZSAhPSBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKHVzZVN1cmZhY2VUZXhBbGxvYyk7CisKKyAgICAgICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlPiB0ZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKDAgLyogdGV4ICovKTsKKyAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHRleHR1cmUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKQEAgLTkyMSw2ICs5NzgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY3JlYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICAgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jSW5mb1ByZXNlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKQEAgLTEwMDgsMTIgKzEwNzYsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICh1c2VTdXJmYWNlQWxsb2MgJiYgIWF1ZGlvT25seSkgeworICAgIGlmICgodXNlU3VyZmFjZUFsbG9jIHx8IHVzZVN1cmZhY2VUZXhBbGxvYykgJiYgIWF1ZGlvT25seSkgewogICAgICAgICBnU3VyZmFjZS5jbGVhcigpOwogCi0jaWYgVVNFX1NVUkZBQ0VfQ09NUE9TRVIKLSAgICAgICAgY29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKLSNlbmRpZgorICAgICAgICBpZiAodXNlU3VyZmFjZUFsbG9jKSB7CisgICAgICAgICAgICBjb21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiYjg0YmQxLi5lZTkxYzI5IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMCw2ICsyMCwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CkBAIC0zMSw3ICszNiw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RydWN0IE15U3RyZWFtU291cmNlIDogcHVibGljIEJuU3RyZWFtU291cmNlIHsKLSAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgZmQuCisgICAgLy8gT2JqZWN0IGFzc3VtZXMgb3duZXJzaGlwIG9mIGZkLgogICAgIE15U3RyZWFtU291cmNlKGludCBmZCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SVN0cmVhbUxpc3RlbmVyPiAmbGlzdGVuZXIpOwpAQCAtNjQsNiArNjksOCBAQAogfQogCiBNeVN0cmVhbVNvdXJjZTo6fk15U3RyZWFtU291cmNlKCkgeworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CiB9CiAKIHZvaWQgTXlTdHJlYW1Tb3VyY2U6OnNldExpc3RlbmVyKGNvbnN0IHNwPElTdHJlYW1MaXN0ZW5lcj4gJmxpc3RlbmVyKSB7CkBAIC05OSw2ICsxMDYsMTQzIEBACiAgICAgICAgIG1MaXN0ZW5lci0+cXVldWVCdWZmZXIoaW5kZXgsIG4pOwogICAgIH0KIH0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UgOiBwdWJsaWMgQm5TdHJlYW1Tb3VyY2UgeworICAgIE15Q29udmVydGluZ1N0cmVhbVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SVN0cmVhbUxpc3RlbmVyPiAmbGlzdGVuZXIpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxzcDxJTWVtb3J5PiA+ICZidWZmZXJzKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckF2YWlsYWJsZShzaXplX3QgaW5kZXgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TXlDb252ZXJ0aW5nU3RyZWFtU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBzcDxJU3RyZWFtTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBWZWN0b3I8c3A8SU1lbW9yeT4gPiBtQnVmZmVyczsKKworICAgIHNwPE1QRUcyVFNXcml0ZXI+IG1Xcml0ZXI7CisKKyAgICBzc2l6ZV90IG1DdXJyZW50QnVmZmVySW5kZXg7CisgICAgc2l6ZV90IG1DdXJyZW50QnVmZmVyT2Zmc2V0OworCisgICAgTGlzdDxzaXplX3Q+IG1CdWZmZXJRdWV1ZTsKKworICAgIHN0YXRpYyBzc2l6ZV90IFdyaXRlRGF0YVdyYXBwZXIodm9pZCAqbWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHdyaXRlRGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKKyAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKKworICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworICAgIENIRUNLKGV4dHJhY3RvciAhPSBOVUxMKTsKKworICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcigKKyAgICAgICAgICAgIHRoaXMsICZNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2U6OldyaXRlRGF0YVdyYXBwZXIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgJiYgc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKG1Xcml0ZXItPmFkZFNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKSwgKHN0YXR1c190KU9LKTsKKyAgICB9CisKKyAgICBDSEVDS19FUShtV3JpdGVyLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOworfQorCitNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2U6On5NeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoKSB7Cit9CisKK3ZvaWQgTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpzZXRMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3A8SVN0cmVhbUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwordm9pZCBNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2U6OnNldEJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxJTWVtb3J5PiA+ICZidWZmZXJzKSB7CisgICAgbUJ1ZmZlcnMgPSBidWZmZXJzOworfQorCitzc2l6ZV90IE15Q29udmVydGluZ1N0cmVhbVNvdXJjZTo6V3JpdGVEYXRhV3JhcHBlcigKKyAgICAgICAgdm9pZCAqbWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE15Q29udmVydGluZ1N0cmVhbVNvdXJjZSAqPihtZSktPndyaXRlRGF0YShkYXRhLCBzaXplKTsKK30KKworc3NpemVfdCBNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2U6OndyaXRlRGF0YShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCB0b3RhbFdyaXR0ZW4gPSAwOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgaWYgKG1DdXJyZW50QnVmZmVySW5kZXggPCAwKSB7CisgICAgICAgICAgICB3aGlsZSAobUJ1ZmZlclF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlckluZGV4ID0gKm1CdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUN1cnJlbnRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgICAgICAgICBtQnVmZmVyUXVldWUuZXJhc2UobUJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbUJ1ZmZlcnMuaXRlbUF0KG1DdXJyZW50QnVmZmVySW5kZXgpOworCisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZTsKKyAgICAgICAgaWYgKGNvcHkgKyBtQ3VycmVudEJ1ZmZlck9mZnNldCA+IG1lbS0+c2l6ZSgpKSB7CisgICAgICAgICAgICBjb3B5ID0gbWVtLT5zaXplKCkgLSBtQ3VycmVudEJ1ZmZlck9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgbUN1cnJlbnRCdWZmZXJPZmZzZXQsIGRhdGEsIGNvcHkpOworICAgICAgICBtQ3VycmVudEJ1ZmZlck9mZnNldCArPSBjb3B5OworCisgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlck9mZnNldCA9PSBtZW0tPnNpemUoKSkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5xdWV1ZUJ1ZmZlcihtQ3VycmVudEJ1ZmZlckluZGV4LCBtQ3VycmVudEJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlckluZGV4ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgY29weTsKKyAgICAgICAgc2l6ZSAtPSBjb3B5OworCisgICAgICAgIHRvdGFsV3JpdHRlbiArPSBjb3B5OworICAgIH0KKworICAgIHJldHVybiAoc3NpemVfdCl0b3RhbFdyaXR0ZW47Cit9CisKK3ZvaWQgTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpvbkJ1ZmZlckF2YWlsYWJsZShzaXplX3QgaW5kZXgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbUJ1ZmZlclF1ZXVlLnB1c2hfYmFjayhpbmRleCk7CisgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKKworICAgIGlmIChtV3JpdGVyLT5yZWFjaGVkRU9TKCkpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QnVmZmVySW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5xdWV1ZUJ1ZmZlcihtQ3VycmVudEJ1ZmZlckluZGV4LCBtQ3VycmVudEJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlckluZGV4ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdGVuZXItPmlzc3VlQ29tbWFuZChJU3RyZWFtTGlzdGVuZXI6OkVPUywgZmFsc2UgLyogc3luY2hyb25vdXMgKi8pOworICAgIH0KK30KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtMTA3LDcgKzI1MSw3IEBACiAgICAgICAgIDogbUVPUyhmYWxzZSkgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICAgICAgaWYgKG1zZyA9PSBNRURJQV9FUlJPUiB8fCBtc2cgPT0gTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpIHsKQEAgLTEzOSw2ICsyODMsOCBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCisgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKKwogICAgIGlmIChhcmdjICE9IDIpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZmlsZW5hbWVcbiIsIGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gMTsKQEAgLTE0OSw3ICsyOTUsNiBAQAogCiAgICAgc3A8U3VyZmFjZUNvbnRyb2w+IGNvbnRyb2wgPQogICAgICAgICBjb21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICBTdHJpbmc4KCJBIFN1cmZhY2UiKSwKICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIDEyODAsCkBAIC0xNjAsMTAgKzMwNSwxMCBAQAogICAgIENIRUNLKGNvbnRyb2wgIT0gTlVMTCk7CiAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKIAotICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5vcGVuVHJhbnNhY3Rpb24oKSwgKHN0YXR1c190KU9LKTsKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwogICAgIENIRUNLX0VRKGNvbnRyb2wtPnNldExheWVyKDMwMDAwKSwgKHN0YXR1c190KU9LKTsKICAgICBDSEVDS19FUShjb250cm9sLT5zaG93KCksIChzdGF0dXNfdClPSyk7Ci0gICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmNsb3NlVHJhbnNhY3Rpb24oKSwgKHN0YXR1c190KU9LKTsKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKIAogICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgQ0hFQ0soc3VyZmFjZSAhPSBOVUxMKTsKQEAgLTE3NCwxNyArMzE5LDI4IEBACiAKICAgICBDSEVDSyhzZXJ2aWNlLmdldCgpICE9IE5VTEwpOwogCi0gICAgaW50IGZkID0gb3Blbihhcmd2WzFdLCBPX1JET05MWSk7Ci0KLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiIsIGFyZ3ZbMV0pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KICAgICBzcDxNeUNsaWVudD4gY2xpZW50ID0gbmV3IE15Q2xpZW50OwogCisgICAgc3A8SVN0cmVhbVNvdXJjZT4gc291cmNlOworCisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihhcmd2WzFdKTsKKyAgICBpZiAobGVuID49IDMgJiYgIXN0cmNhc2VjbXAoIi50cyIsICZhcmd2WzFdW2xlbiAtIDNdKSkgeworICAgICAgICBpbnQgZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKKworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4iLCBhcmd2WzFdKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlID0gbmV3IE15U3RyZWFtU291cmNlKGZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIkNvbnZlcnRpbmcgZmlsZSB0byB0cmFuc3BvcnQgc3RyZWFtIGZvciBzdHJlYW1pbmcuLi5cbiIpOworCisgICAgICAgIHNvdXJjZSA9IG5ldyBNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoYXJndlsxXSk7CisgICAgfQorCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoZ2V0cGlkKCksIGNsaWVudCwgbmV3IE15U3RyZWFtU291cmNlKGZkKSwgMCk7CisgICAgICAgIHNlcnZpY2UtPmNyZWF0ZShnZXRwaWQoKSwgY2xpZW50LCBzb3VyY2UsIDApOwogCiAgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgIHBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpOwpAQCAtMTk3LDkgKzM1Myw2IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGluc3RhbnRpYXRlIHBsYXllci5cbiIpOwogICAgIH0KIAotICAgIGNsb3NlKGZkKTsKLSAgICBmZCA9IC0xOwotCiAgICAgY29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwIGIvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwCmluZGV4IDhkMTE1YTguLjI3YTVhMmQgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcAorKysgYi9kcm0vY29tbW9uL0RybUluZm9FdmVudC5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLURybUluZm9FdmVudDo6RHJtSW5mb0V2ZW50KGludCB1bmlxdWVJZCwgaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtZXNzYWdlKQorRHJtSW5mb0V2ZW50OjpEcm1JbmZvRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgaW5mb1R5cGUsIGNvbnN0IFN0cmluZzggbWVzc2FnZSkKICAgICA6IG1VbmlxdWVJZCh1bmlxdWVJZCksCiAgICAgICBtSW5mb1R5cGUoaW5mb1R5cGUpLAogICAgICAgbU1lc3NhZ2UobWVzc2FnZSkgewpAQCAtMzQsNyArMzQsNyBAQAogICAgIHJldHVybiBtSW5mb1R5cGU7CiB9CiAKLWNvbnN0IFN0cmluZzgmIERybUluZm9FdmVudDo6Z2V0TWVzc2FnZSgpIGNvbnN0IHsKK2NvbnN0IFN0cmluZzggRHJtSW5mb0V2ZW50OjpnZXRNZXNzYWdlKCkgY29uc3QgewogICAgIHJldHVybiBtTWVzc2FnZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1TdXBwb3J0SW5mby5jcHAgYi9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcAppbmRleCBjMGJmZjBlLi41NDAwYmRkIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcAorKysgYi9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcApAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC00Miw2ICs0MywxMCBAQAogfQogCiBib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSBjb25zdCB7CisgICAgaWYgKFN0cmluZzgoIiIpID09IG1pbWVUeXBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1NaW1lVHlwZVZlY3Rvci5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtTWltZVR5cGVWZWN0b3IuaXRlbUF0KGkpOwogCkBAIC0xNTIsNCArMTU3LDMgQEAKICAgICBtSW5kZXgrKzsKICAgICByZXR1cm4gdmFsdWU7CiB9Ci0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCAzNDY5MzRiLi4wYjc2YTM2IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNyw3ICszNyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgdm9pZCB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YSgKK3N0YXRpYyB2b2lkIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YSgKICAgICAgICAgY29uc3QgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CkBAIC00NiwxNCArNDYsMTQgQEAKIAogICAgIGludCBzaXplID0gaGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5zaXplKCk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmtleUF0KGkpKTsKICAgICAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLnZhbHVlQXQoaSkpOwogICAgIH0KIAogICAgIHNpemUgPSBoYW5kbGUtPmV4dGVuZGVkRGF0YS5zaXplKCk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgZGF0YS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+ZXh0ZW5kZWREYXRhLmtleUF0KGkpKTsKICAgICAgICAgZGF0YS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+ZXh0ZW5kZWREYXRhLnZhbHVlQXQoaSkpOwogICAgIH0KQEAgLTc3LDE0ICs3NywxNCBAQAogICAgIGhhbmRsZS0+c3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgIGludCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBEcm1Db3B5Q29udHJvbCBrZXkgPSAoRHJtQ29weUNvbnRyb2wpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaW50IHZhbHVlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBrZXkgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIGhhbmRsZS0+ZXh0ZW5kZWREYXRhLmFkZChrZXksIHZhbHVlKTsKQEAgLTEwNywxMyArMTA3LDE0IEBACiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIH0KICAgICBoYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CisgICAgaGFuZGxlLT5leHRlbmRlZERhdGEuY2xlYXIoKTsKIH0KIAotaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGJvb2wgaXNOYXRpdmUpIHsKICAgICBMT0dWKCJhZGQgdW5pcXVlaWQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVJbnQzMihpc05hdGl2ZSk7CiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFERF9VTklRVUVJRCwgZGF0YSwgJnJlcGx5KTsKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CkBAIC00MTYsNyArNDE3LDcgQEAKICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CiAKLSAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CisgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKIAogICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOwogICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDwgaW50PihyZXNlcnZlKSk7CkBAIC00MzMsNyArNDM0LDcgQEAKICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CiAKLSAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CisgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKIAogICAgIGRhdGEud3JpdGVJbnQzMihwbGF5YmFja1N0YXR1cyk7CiAgICAgZGF0YS53cml0ZUludDY0KHBvc2l0aW9uKTsKQEAgLTY0NiwxNSArNjQ3LDEwIEBACiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOwogCi0gICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOworICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKLSAgICAgICAgTE9HVigiZGVsZXRpbmcgZGVjcnlwdEluZm8iKTsKLSAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOyBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOyBkZWNyeXB0SGFuZGxlID0gTlVMTDsKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CiAKQEAgLTY2Nyw3ICs2NjMsNyBAQAogICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKIAotICAgIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKKyAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOwogCiAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRVbml0SWQpOwogCkBAIC02ODcsNyArNjgzLDcgQEAKICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CiAKLSAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CisgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKIAogICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0VW5pdElkKTsKICAgICBkYXRhLndyaXRlSW50MzIoKCpkZWNCdWZmZXIpLT5sZW5ndGgpOwpAQCAtNzIwLDcgKzcxNiw3IEBACiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOwogCi0gICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOworICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CiAKICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdFVuaXRJZCk7CiAKQEAgLTczOCw3ICs3MzQsNyBAQAogICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKIAotICAgIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKKyAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOwogCiAgICAgZGF0YS53cml0ZUludDMyKG51bUJ5dGVzKTsKICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKQEAgLTgxMiw3ICs4MDgsOSBAQAogICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpJTlNUQUxMX0RSTV9FTkdJTkUiKTsKICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxEcm1FbmdpbmUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBlbmdpbmVGaWxlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsRHJtRW5naW5lKHVuaXF1ZUlkLCBlbmdpbmVGaWxlKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwpAQCAtODI2LDcgKzgyNCw4IEBACiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBnZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgJnBhdGgsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMKKyAgICAgICAgICAgID0gZ2V0Q29uc3RyYWludHModW5pcXVlSWQsICZwYXRoLCBkYXRhLnJlYWRJbnQzMigpKTsKIAogICAgICAgICBpZiAoTlVMTCAhPSBkcm1Db25zdHJhaW50cykgewogICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBDb25zdHJhaW50cyBjb250ZW50cwpAQCAtOTUyLDcgKzk1MSw5IEBACiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgLy9GaWxsaW5nIERSTSBpbmZvIFJlcXVlc3QKLSAgICAgICAgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0ID0gbmV3IERybUluZm9SZXF1ZXN0KGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IGludCBpbmZvVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCA9IG5ldyBEcm1JbmZvUmVxdWVzdChpbmZvVHlwZSwgbWltZVR5cGUpOwogCiAgICAgICAgIGNvbnN0IGludCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKQEAgLTEwMjUsNyArMTAyNiw5IEBACiAgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9PUklHSU5BTF9NSU1FVFlQRSIpOwogICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgY29uc3QgU3RyaW5nOCBvcmlnaW5hbE1pbWVUeXBlID0gZ2V0T3JpZ2luYWxNaW1lVHlwZShkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IHBhdGggPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggb3JpZ2luYWxNaW1lVHlwZSA9IGdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIHBhdGgpOwogCiAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgob3JpZ2luYWxNaW1lVHlwZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CkBAIC0xMDM2LDggKzEwMzksMTAgQEAKICAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX0RSTV9PQkpFQ1RfVFlQRSIpOwogICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgY29uc3QgaW50IGRybU9iamVjdFR5cGUKLSAgICAgICAgICAgID0gZ2V0RHJtT2JqZWN0VHlwZShkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgY29uc3QgaW50IGRybU9iamVjdFR5cGUgPSBnZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CiAKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtT2JqZWN0VHlwZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CkBAIC0xMDQ4LDggKzEwNTMsMTAgQEAKICAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q0hFQ0tfUklHSFRTX1NUQVRVUyIpOwogICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgY29uc3QgaW50IHJlc3VsdAotICAgICAgICAgICAgPSBjaGVja1JpZ2h0c1N0YXR1cyhkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCksIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IHBhdGggPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGNvbnN0IGludCBhY3Rpb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgcmVzdWx0ID0gY2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CiAKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKQEAgLTEwNjUsOSArMTA3MiwxMCBAQAogICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKIAorICAgICAgICBjb25zdCBpbnQgYWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgYm9vbCByZXNlcnZlID0gc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAogICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CkBAIC0xMDg0LDggKzEwOTIsMTAgQEAKICAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CiAKKyAgICAgICAgY29uc3QgaW50IHBsYXliYWNrU3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgJmhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50NjQoKSk7CisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCAmaGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCiAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKQEAgLTEwOTcsMTEgKzExMDcsMTMgQEAKICAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6VkFMSURBVEVfQUNUSU9OIik7CiAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICBib29sIHJlc3VsdCA9IHZhbGlkYXRlQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJpbmc4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkRlc2NyaXB0aW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBwYXRoID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICBjb25zdCBpbnQgYWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IG91dHB1dFR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgY29uZmlndXJhdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gdmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwKKyAgICAgICAgICAgICAgICBBY3Rpb25EZXNjcmlwdGlvbihvdXRwdXRUeXBlLCBjb25maWd1cmF0aW9uKSk7CiAKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKQEAgLTExMTIsNyArMTEyNCw5IEBACiAgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFTU9WRV9SSUdIVFMiKTsKICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVJpZ2h0cyhkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBTdHJpbmc4IHBhdGggPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVJpZ2h0cyh1bmlxdWVJZCwgcGF0aCk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKQEAgLTExMzQsNyArMTE0OCw5IEBACiAgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOk9QRU5fQ09OVkVSVF9TRVNTSU9OIik7CiAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICBjb25zdCBpbnQgY29udmVydElkID0gb3BlbkNvbnZlcnRTZXNzaW9uKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGNvbnN0IGludCBjb252ZXJ0SWQgPSBvcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1pbWVUeXBlKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb252ZXJ0SWQpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwpAQCAtMTE4MCw4ICsxMTk2LDEwIEBACiAgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNMT1NFX0NPTlZFUlRfU0VTU0lPTiIpOwogICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgRHJtQ29udmVydGVkU3RhdHVzKiAgICBkcm1Db252ZXJ0ZWRTdGF0dXMKLSAgICAgICAgICAgID0gY2xvc2VDb252ZXJ0U2Vzc2lvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGNvbnZlcnRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIERybUNvbnZlcnRlZFN0YXR1cyogZHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGNsb3NlQ29udmVydFNlc3Npb24odW5pcXVlSWQsIGNvbnZlcnRJZCk7CiAKICAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29udmVydGVkU3RhdHVzKSB7CiAgICAgICAgICAgICAvL0ZpbGxpbmcgRHJtIENvbnZlcnRlZCBTdHN0dXMKQEAgLTEyNDUsMTEgKzEyNjMsMTMgQEAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgaW50IGZkID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKIAorICAgICAgICBjb25zdCBvZmY2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CisgICAgICAgIGNvbnN0IG9mZjY0X3QgbGVuZ3RoID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCi0gICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIGRhdGEucmVhZEludDY0KCksIGRhdGEucmVhZEludDY0KCkpOworICAgICAgICAgICAgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKICAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKICAgICAgICAgfQpAQCAtMTI2Nyw3ICsxMjg3LDcgQEAKICAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCkpOwogCiAgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CiAKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tayBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBmOTRmOWEzLi5mZDQxN2NiIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKKysrIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCkBAIC0yMiwxNCArMjIsMTAgQEAKICAgICBEcm1NYW5hZ2VyU2VydmljZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWEgXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIKLQotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotIExPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCi0gTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmRsCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IDFlZWU1ZjIuLjNlNGZlOGMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMzcsNyArMzcsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotVmVjdG9yPGludD4gRHJtTWFuYWdlcjo6bVVuaXF1ZUlkVmVjdG9yOwogY29uc3QgU3RyaW5nOCBEcm1NYW5hZ2VyOjpFTVBUWV9TVFJJTkcoIiIpOwogCiBEcm1NYW5hZ2VyOjpEcm1NYW5hZ2VyKCkgOgpAQCAtNTAsMzIgKzQ5LDQyIEBACiAKIH0KIAotaW50IERybU1hbmFnZXI6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworaW50IERybU1hbmFnZXI6OmFkZFVuaXF1ZUlkKGJvb2wgaXNOYXRpdmUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgwID09IHVuaXF1ZUlkKSB7Ci0gICAgICAgIGludCB0ZW1wID0gMDsKLSAgICAgICAgYm9vbCBmb3VuZFVuaXF1ZUlkID0gZmFsc2U7Ci0gICAgICAgIHNyYW5kKHRpbWUoTlVMTCkpOwogCi0gICAgICAgIHdoaWxlICghZm91bmRVbmlxdWVJZCkgewotICAgICAgICAgICAgY29uc3QgaW50IHNpemUgPSBtVW5pcXVlSWRWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgICAgdGVtcCA9IHJhbmQoKSAlIDEwMDsKKyAgICBpbnQgdGVtcCA9IDA7CisgICAgYm9vbCBmb3VuZFVuaXF1ZUlkID0gZmFsc2U7CisgICAgY29uc3QgaW50IHNpemUgPSBtVW5pcXVlSWRWZWN0b3Iuc2l6ZSgpOworICAgIGNvbnN0IGludCB1bmlxdWVJZFJhbmdlID0gMHhmZmY7CisgICAgaW50IG1heExvb3BUaW1lcyA9ICh1bmlxdWVJZFJhbmdlIC0gMSkgLyAyOworICAgIHNyYW5kKHRpbWUoTlVMTCkpOwogCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgZm9yICg7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChtVW5pcXVlSWRWZWN0b3IuaXRlbUF0KGluZGV4KSA9PSB0ZW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kVW5pcXVlSWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4ID09IHNpemUpIHsKLSAgICAgICAgICAgICAgICBmb3VuZFVuaXF1ZUlkID0gdHJ1ZTsKKyAgICB3aGlsZSAoIWZvdW5kVW5pcXVlSWQpIHsKKyAgICAgICAgdGVtcCA9IHJhbmQoKSAmIHVuaXF1ZUlkUmFuZ2U7CisKKyAgICAgICAgaWYgKGlzTmF0aXZlKSB7CisgICAgICAgICAgICAvLyBzZXQgYSBmbGFnIHRvIGRpZmZlcmVudGlhdGUgRHJtTWFuYWdlckNsaWVudAorICAgICAgICAgICAgLy8gY3JlYXRlZCBmcm9tIG5hdGl2ZSBzaWRlIGFuZCBqYXZhIHNpZGUKKyAgICAgICAgICAgIHRlbXAgfD0gMHgxMDAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgZm9yICg7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgaWYgKG1VbmlxdWVJZFZlY3Rvci5pdGVtQXQoaW5kZXgpID09IHRlbXApIHsKKyAgICAgICAgICAgICAgICBmb3VuZFVuaXF1ZUlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdW5pcXVlSWQgPSB0ZW1wOworICAgICAgICBpZiAoaW5kZXggPT0gc2l6ZSkgeworICAgICAgICAgICAgZm91bmRVbmlxdWVJZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBtYXhMb29wVGltZXMgLS07CisgICAgICAgIExPR19GQVRBTF9JRihtYXhMb29wVGltZXMgPD0gMCwgImNhbm5vdCBmaW5kIGFuIHVuaXF1ZSBJRCBmb3IgdGhpcyBzZXNzaW9uIik7CiAgICAgfQotICAgIG1VbmlxdWVJZFZlY3Rvci5wdXNoKHVuaXF1ZUlkKTsKLSAgICByZXR1cm4gdW5pcXVlSWQ7CisKKyAgICBtVW5pcXVlSWRWZWN0b3IucHVzaCh0ZW1wKTsKKyAgICByZXR1cm4gdGVtcDsKIH0KIAogdm9pZCBEcm1NYW5hZ2VyOjpyZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKQEAgLTEwMiw2ICsxMTEsNyBAQAogICAgICAgICAgICAgRHJtU3VwcG9ydEluZm8qIGluZm8gPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luUGF0aCkuZ2V0U3VwcG9ydEluZm8oMCk7CiAgICAgICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CiAgICAgICAgICAgICAgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIHBsdWdJblBhdGgpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTc5LDYgKzE4OSw3IEBACiAKICAgICBEcm1TdXBwb3J0SW5mbyogaW5mbyA9IHJEcm1FbmdpbmUuZ2V0U3VwcG9ydEluZm8oMCk7CiAgICAgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5hZGQoKmluZm8sIGFic29sdXRlUGF0aCk7CisgICAgZGVsZXRlIGluZm87CiAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCAwOTAxYTQ0Li43ZWJjYWMzIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC03Nyw4ICs3OCw4IEBACiAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyOyBtRHJtTWFuYWdlciA9IE5VTEw7CiB9CiAKLWludCBEcm1NYW5hZ2VyU2VydmljZTo6YWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7Ci0gICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5hZGRVbmlxdWVJZCh1bmlxdWVJZCk7CitpbnQgRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGJvb2wgaXNOYXRpdmUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmFkZFVuaXF1ZUlkKGlzTmF0aXZlKTsKIH0KIAogdm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CkBAIC0yNTYsMyArMjU3LDMxIEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIAorc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIERybU1hbmFnZXJTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworI2lmIERSTV9NRU1PUllfTEVBS19UUkFDSworICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgICAgICBkdW1wTWVtb3J5QWRkcmVzc2VzKGZkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rCmluZGV4IDk5MTMzYmEuLmM1MzQ0MDIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5taworKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQubWsKQEAgLTI1LDEzICsyNSw4IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIKLQotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotIExPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCi0gTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmRsCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmRybWZyYW1ld29ya2NvbW1vbgpAQCAtNDAsNyArMzUsNyBAQAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcAppbmRleCBjMWYzODJhLi5jOWMwZDU3IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIAogRHJtTWFuYWdlckNsaWVudDo6RHJtTWFuYWdlckNsaWVudCgpOgogICAgICAgICBtVW5pcXVlSWQoMCksIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbChOVUxMKSB7Ci0gICAgbURybU1hbmFnZXJDbGllbnRJbXBsID0gRHJtTWFuYWdlckNsaWVudEltcGw6OmNyZWF0ZSgmbVVuaXF1ZUlkKTsKKyAgICBtRHJtTWFuYWdlckNsaWVudEltcGwgPSBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y3JlYXRlKCZtVW5pcXVlSWQsIHRydWUpOwogICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+YWRkQ2xpZW50KG1VbmlxdWVJZCk7CiB9CiAKQEAgLTc2LDEyICs3NiwxMyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNoZWNrUmlnaHRzU3RhdHVzKG1VbmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6Y29uc3VtZVJpZ2h0cyhEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y29uc3VtZVJpZ2h0cyhtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbAogICAgICAgICAgICAgLT5zZXRQbGF5YmFja1N0YXR1cyhtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiB9CkBAIC0xMTUsMzcgKzExNiwzOSBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmdldEFsbFN1cHBvcnRJbmZvKG1VbmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKICAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5vcGVuRGVjcnlwdFNlc3Npb24obVVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuRGVjcnlwdFNlc3Npb24oY29uc3QgY2hhciogdXJpKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuRGVjcnlwdFNlc3Npb24oY29uc3QgY2hhciogdXJpKSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+b3BlbkRlY3J5cHRTZXNzaW9uKG1VbmlxdWVJZCwgdXJpKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpjbG9zZURlY3J5cHRTZXNzaW9uKHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlKSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50Ojppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKICAgICAgICAgICAgIG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmRlY3J5cHQoCi0gICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCi0gICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmRlY3J5cHQoCiAgICAgICAgICAgICBtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmZpbmFsaXplRGVjcnlwdFVuaXQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKLSAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5maW5hbGl6ZURlY3J5cHRVbml0KG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+ZmluYWxpemVEZWNyeXB0VW5pdChtVW5pcXVlSWQsCisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAogc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50OjpwcmVhZCgKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cHJlYWQobVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IDljN2ZlZDMuLjY3ZjU4Y2EgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0zMywxMyArMzMsMTAgQEAKIHNwPERybU1hbmFnZXJDbGllbnRJbXBsOjpEZWF0aE5vdGlmaWVyPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6c0RlYXRoTm90aWZpZXI7CiBjb25zdCBTdHJpbmc4IERybU1hbmFnZXJDbGllbnRJbXBsOjpFTVBUWV9TVFJJTkcoIiIpOwogCi1Ecm1NYW5hZ2VyQ2xpZW50SW1wbCogRHJtTWFuYWdlckNsaWVudEltcGw6OmNyZWF0ZShpbnQqIHBVbmlxdWVJZCkgewotICAgIGlmICgwID09ICpwVW5pcXVlSWQpIHsKLSAgICAgICAgaW50IHVuaXF1ZUlkID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkVW5pcXVlSWQoKnBVbmlxdWVJZCk7Ci0gICAgICAgICpwVW5pcXVlSWQgPSB1bmlxdWVJZDsKLSAgICB9IGVsc2UgewotICAgICAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5hZGRVbmlxdWVJZCgqcFVuaXF1ZUlkKTsKLSAgICB9CitEcm1NYW5hZ2VyQ2xpZW50SW1wbCogRHJtTWFuYWdlckNsaWVudEltcGw6OmNyZWF0ZSgKKyAgICAgICAgaW50KiBwVW5pcXVlSWQsIGJvb2wgaXNOYXRpdmUpIHsKKyAgICAqcFVuaXF1ZUlkID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkVW5pcXVlSWQoaXNOYXRpdmUpOworCiAgICAgcmV0dXJuIG5ldyBEcm1NYW5hZ2VyQ2xpZW50SW1wbCgpOwogfQogCkBAIC04MSwxNCArNzgsMTYgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OnNldE9uSW5mb0xpc3RlbmVyKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1PbkluZm9MaXN0ZW5lciA9IGluZm9MaXN0ZW5lcjsKICAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0RHJtU2VydmljZUxpc3RlbmVyKHVuaXF1ZUlkLAogICAgICAgICAgICAgKE5VTEwgIT0gaW5mb0xpc3RlbmVyLmdldCgpKSA/IHRoaXMgOiBOVUxMKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Omluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6aW5zdGFsbERybUVuZ2luZSgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKEVNUFRZX1NUUklORyAhPSBkcm1FbmdpbmVGaWxlKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluc3RhbGxEcm1FbmdpbmUodW5pcXVlSWQsIGRybUVuZ2luZUZpbGUpOwpAQCAtMTAwLDcgKzk5LDggQEAKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKSB7CiAgICAgRHJtQ29uc3RyYWludHMgKmRybUNvbnN0cmFpbnRzID0gTlVMTDsKICAgICBpZiAoKE5VTEwgIT0gcGF0aCkgJiYgKEVNUFRZX1NUUklORyAhPSAqcGF0aCkpIHsKLSAgICAgICAgZHJtQ29uc3RyYWludHMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRDb25zdHJhaW50cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKKyAgICAgICAgZHJtQ29uc3RyYWludHMgPQorICAgICAgICAgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0Q29uc3RyYWludHModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CiAgICAgfQogICAgIHJldHVybiBkcm1Db25zdHJhaW50czsKIH0KQEAgLTExMyw3ICsxMTMsOCBAQAogICAgIHJldHVybiBkcm1NZXRhZGF0YTsKIH0KIAotYm9vbCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKK2Jvb2wgRHJtTWFuYWdlckNsaWVudEltcGw6OmNhbkhhbmRsZSgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIGJvb2wgcmV0Q29kZSA9IGZhbHNlOwogICAgIGlmICgoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHx8IChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpKSB7CiAgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKQEAgLTEyMSw3ICsxMjIsOCBAQAogICAgIHJldHVybiByZXRDb2RlOwogfQogCi1Ecm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJvY2Vzc0RybUluZm8oCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgewogICAgIERybUluZm9TdGF0dXMgKmRybUluZm9TdGF0dXMgPSBOVUxMOwogICAgIGlmIChOVUxMICE9IGRybUluZm8pIHsKICAgICAgICAgZHJtSW5mb1N0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKQEAgLTEyOSw3ICsxMzEsOCBAQAogICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOwogfQogCi1Ecm1JbmZvKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6YWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKK0RybUluZm8qIERybU1hbmFnZXJDbGllbnRJbXBsOjphY3F1aXJlRHJtSW5mbygKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKICAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvUmVxdWVzdCkgewogICAgICAgICBkcm1JbmZvID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWNxdWlyZURybUluZm8odW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKQEAgLTEzOSwxNCArMTQyLDEyIEBACiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gY29udGVudFBhdGgpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2F2ZVJpZ2h0cyh1bmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNhdmVSaWdodHMoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOwogfQogCi1TdHJpbmc4IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0T3JpZ2luYWxNaW1lVHlwZSgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CiAgICAgU3RyaW5nOCBtaW1lVHlwZSA9IEVNUFRZX1NUUklORzsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKICAgICAgICAgbWltZVR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBwYXRoKTsKQEAgLTE1OCw3ICsxNTksOCBAQAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIGludCBkcm1PamVjdFR5cGUgPSBEcm1PYmplY3RUeXBlOjpVTktOT1dOOwogICAgIGlmICgoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHx8IChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpKSB7Ci0gICAgICAgICBkcm1PamVjdFR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgICAgICBkcm1PamVjdFR5cGUgPQorICAgICAgICAgICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKICAgICB9CiAgICAgcmV0dXJuIGRybU9qZWN0VHlwZTsKIH0KQEAgLTE2NywzNSArMTY5LDQxIEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKICAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKLSAgICAgICAgcmlnaHRzU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgICAgIHJpZ2h0c1N0YXR1cyA9CisgICAgICAgICAgICBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047Ci0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIGJvb2wgRHJtTWFuYWdlckNsaWVudEltcGw6OnZhbGlkYXRlQWN0aW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgewogICAgIGJvb2wgcmV0Q29kZSA9IGZhbHNlOwogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgewotICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+dmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KQEAgLTIxMiw3ICsyMjAsOCBAQAogICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOwogfQogCi1pbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CitpbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIGludCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKICAgICBpZiAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSB7CiAgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1pbWVUeXBlKTsKQEAgLTIyNCwxMiArMjMzLDE0IEBACiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CiAgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOwogICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSkgewotICAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9CisgICAgICAgICAgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKICAgICB9CiAgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKIH0KIAotRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmNsb3NlQ29udmVydFNlc3Npb24oCisgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgewogICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOwogfQogCkBAIC0yMzcsMTcgKzI0OCwxOSBAQAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKChOVUxMICE9IGRybVN1cHBvcnRJbmZvQXJyYXkpICYmIChOVUxMICE9IGxlbmd0aCkpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKICAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgewogICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpKTsKQEAgLTI1NSw1MCArMjY4LDU3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VEZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKLSAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbiggdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgeworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAotICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpkZWNyeXB0KAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKICAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7Ci0gICAgICAgIHN0YXR1cwotICAgICAgICAgICAgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOwotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJiAoTlVMTCAhPSBidWZmZXIpICYmICgwIDwgbnVtQnl0ZXMpKSB7Ci0gICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gYnVmZmVyKSAmJiAoMCA8IG51bUJ5dGVzKSkgeworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJlYWQoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgfQogICAgIHJldHVybiByZXRDb2RlOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKaW5kZXggYzcyNzZmOS4uYWMyYjk0NiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlci5oCkBAIC0zMCw3ICszMCw2IEBACiBjbGFzcyBEcm1SZWdpc3RyYXRpb25JbmZvOwogY2xhc3MgRHJtVW5yZWdpc3RyYXRpb25JbmZvOwogY2xhc3MgRHJtUmlnaHRzQWNxdWlzaXRpb25JbmZvOwotY2xhc3MgRHJtQ29udGVudElkczsKIGNsYXNzIERybUNvbnN0cmFpbnRzOwogY2xhc3MgRHJtTWV0YWRhdGE7CiBjbGFzcyBEcm1SaWdodHM7CkBAIC01NCw3ICs1Myw3IEBACiAgICAgdmlydHVhbCB+RHJtTWFuYWdlcigpOwogCiBwdWJsaWM6Ci0gICAgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisgICAgaW50IGFkZFVuaXF1ZUlkKGJvb2wgaXNOYXRpdmUpOwogCiAgICAgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOwogCkBAIC0xNDEsNyArMTQwLDcgQEAKICAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBWZWN0b3I8aW50PiBtVW5pcXVlSWRWZWN0b3I7CisgICAgVmVjdG9yPGludD4gbVVuaXF1ZUlkVmVjdG9yOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IEVNUFRZX1NUUklORzsKIAogICAgIGludCBtRGVjcnlwdFNlc3Npb25JZDsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKaW5kZXggNDI5ZTRjMy4uZTMzMzhkOSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbCgpIHsgfQogCiBwdWJsaWM6Ci0gICAgc3RhdGljIERybU1hbmFnZXJDbGllbnRJbXBsKiBjcmVhdGUoaW50KiBwVW5pcXVlSWQpOworICAgIHN0YXRpYyBEcm1NYW5hZ2VyQ2xpZW50SW1wbCogY3JlYXRlKGludCogcFVuaXF1ZUlkLCBib29sIGlzTmF0aXZlKTsKIAogICAgIHN0YXRpYyB2b2lkIHJlbW92ZShpbnQgdW5pcXVlSWQpOwogCkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIC8qKgogICAgICAqIEluZm9ybXMgdGhlIERSTSBlbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KQEAgLTMwMyw3ICszMDMsNyBAQAogICAgICAqIEByZXR1cm4KICAgICAgKiAgICAgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCiAgICAgICovCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIC8qKgogICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudApAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KICAgICAgKi8KLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CiAKICAgICAvKioKICAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCkBAIC0zMjMsNyArMzIzLDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUpOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCiAgICAgLyoqCkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKICAgICAvKioKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTM4MCw3ICszODAsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCBkMGEwZGI3Li45Y2I1ODA0IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtNDYsNyArNDYsNyBAQAogICAgIHZpcnR1YWwgfkRybU1hbmFnZXJTZXJ2aWNlKCk7CiAKIHB1YmxpYzoKLSAgICBpbnQgYWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKyAgICBpbnQgYWRkVW5pcXVlSWQoYm9vbCBpc05hdGl2ZSk7CiAKICAgICB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CiAKQEAgLTExNSw2ICsxMTUsOCBAQAogICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKwogcHJpdmF0ZToKICAgICBEcm1NYW5hZ2VyKiBtRHJtTWFuYWdlcjsKIH07CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggMjQyNGVhNS4uYjk2MThiYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMjUsNyArMjUsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERybUNvbnRlbnRJZHM7CiBjbGFzcyBEcm1Db25zdHJhaW50czsKIGNsYXNzIERybU1ldGFkYXRhOwogY2xhc3MgRHJtUmlnaHRzOwpAQCAtODIsNyArODEsNyBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRHJtTWFuYWdlclNlcnZpY2UpOwogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCBpbnQgYWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSA9IDA7CisgICAgdmlydHVhbCBpbnQgYWRkVW5pcXVlSWQoYm9vbCBpc05hdGl2ZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgPSAwOwogCkBAIC0xNjgsNyArMTY3LDcgQEAKICAgICBCcERybU1hbmFnZXJTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQogICAgICAgICAgICAgOiBCcEludGVyZmFjZTxJRHJtTWFuYWdlclNlcnZpY2U+KGltcGwpIHt9CiAKLSAgICB2aXJ0dWFsIGludCBhZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworICAgIHZpcnR1YWwgaW50IGFkZFVuaXF1ZUlkKGJvb2wgaXNOYXRpdmUpOwogCiAgICAgdmlydHVhbCB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCmluZGV4IDgwMjkxMzguLjdiYjE0M2YgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApAQCAtMjAyLDcgKzIwMiw3IEBACiAgICAgVmVjdG9yPFN0cmluZzg+IGdldFBsdWdJblBhdGhMaXN0KGNvbnN0IFN0cmluZzgmIHJzRGlyUGF0aCkgewogICAgICAgICBWZWN0b3I8U3RyaW5nOD4gZmlsZUxpc3Q7CiAgICAgICAgIERJUiogcERpciA9IG9wZW5kaXIocnNEaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgc3RydWN0IGRpcmVudCogcEVudHJ5ID0gbmV3IGRpcmVudCgpOworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBwRW50cnk7CiAKICAgICAgICAgd2hpbGUgKE5VTEwgIT0gcERpciAmJiBOVUxMICE9IChwRW50cnkgPSByZWFkZGlyKHBEaXIpKSkgewogICAgICAgICAgICAgaWYgKCFpc1BsdWdJbihwRW50cnkpKSB7CkBAIC0yMTksOCArMjE5LDYgQEAKICAgICAgICAgaWYgKE5VTEwgIT0gcERpcikgewogICAgICAgICAgICAgY2xvc2VkaXIocERpcik7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBFbnRyeTsKLSAgICAgICAgcEVudHJ5ID0gTlVMTDsKIAogICAgICAgICByZXR1cm4gZmlsZUxpc3Q7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggYjYxZTNkMy4uNGE1YWZjZiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC0xNDMsNyArMTQzLDEzIEBACiAgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bwogICAgICAqIHJlY2VpdmUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCiAgICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24uIHVuaXF1ZUlkIGlzIGEgcmFuZG9tCisgICAgICogICAgICAgICAgICAgICAgICAgICBudW1iZXIgZ2VuZXJhdGVkIGluIHRoZSBEUk0gc2VydmljZS4gSWYgdGhlIERybU1hbmFnZXJDbGllbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGlzIGNyZWF0ZWQgaW4gbmF0aXZlIGNvZGUsIHVuaXF1ZUlkIHdpbGwgYmUgYSBudW1iZXIgcmFuZ2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICBmcm9tIDB4MTAwMCB0byAweDFmZmYuIElmIGl0IGNvbWVzIGZyb20gSmF2YSBjb2RlLCB0aGUgdW5pcXVlSWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYSBudW1iZXIgcmFuZ2VkIGZyb20gMHgwMCB0byAweGZmZi4gU28gYml0IDB4MTAwMCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQgY291bGQgYmUgdXNlZCBpbiBEUk0gcGx1Z2lucyB0byBkaWZmZXJlbnRpYXRlIG5hdGl2ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgT25JbmZvTGlzdGVuZXIgYW5kIEphdmEgT25JbmZvTGlzdGVuZXIuCiAgICAgICogQHBhcmFtW2luXSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggZDA1YzI0Zi4uNzc0NjBmNiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yMSw3ICsyMSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRHJtQ29udGVudElkczsKIGNsYXNzIERybUNvbnN0cmFpbnRzOwogY2xhc3MgRHJtTWV0YWRhdGE7CiBjbGFzcyBEcm1SaWdodHM7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCmluZGV4IDM1ZmE3MzQuLmUzNTlkYmQgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCkBAIC01MCw3ICs1MCw3IEBACiAgICAgbGliZndkbG9jay1jb252ZXJ0ZXIgXAogICAgIGxpYmZ3ZGxvY2stZGVjb2RlcgogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICQoSk5JX0hfSU5DTFVERSkgXApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggOTQ1M2EyMC4uZTE4NDU0NSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC00NzIsMTEgKzQ3MiwxNCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOwogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKTsKLSAgICAgICAgICAgIDo6Y2xvc2UoZmlsZURlc2MpOwogICAgICAgICAgICAgZGVsZXRlIGRlY29kZVNlc3Npb247CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCAmJiAtMSA8IGZpbGVEZXNjKSB7CisgICAgICAgIDo6Y2xvc2UoZmlsZURlc2MpOworICAgIH0KKwogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBFeGl0LiByZXN1bHQgPSAlZCIsIHJlc3VsdCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNTI2LDYgKzUyOSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZGVjcnlwdEhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3IuY2xlYXIoKTsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZXh0ZW5kZWREYXRhLmNsZWFyKCk7CisKKyAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7CisgICAgICAgIGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIH0KKwogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rCmluZGV4IDc4NTZkMzcuLmQwZDE0MzkgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rCkBAIC0yNCwxNSArMjQsOSBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJkcm1mcmFtZXdvcmtjb21tb24KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidXRpbHMKKyAgICBsaWJ1dGlscyBcCisgICAgbGliZGwKIAotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotIExPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCi0gTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKLQotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCBmM2M4ZjY0Li4yMzRlMTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaApAQCAtMTgsMTI0ICsxOCwzMiBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9ICiAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYUNsaWVudC5oPgogI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFDbGllbnQuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLyoKLSAqIEEgc2V0IG9mIGJpdCBtYXNrcyBmb3Igc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmVkIHByZXZpZXcgZnJhbWVzIGFyZQotICogaGFuZGxlZCBiZWZvcmUgdGhlIHByZXZpZXdDYWxsYmFjaygpIGNhbGwuCi0gKgotICogVGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZiBhbiAiaW50IiB2YWx1ZSBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOgotICoKLSAqIC4uLi4uIDAgMCAwCi0gKiAgICAgICBeIF4gXgotICogICAgICAgfCB8IHwtLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBlbmFibGVkIG9yIG5vdAotICogICAgICAgfCB8LS0tLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBvbmUtc2hvdCBvciBub3QKLSAqICAgICAgIHwtLS0tLS0tLS0tLS0tPiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUgaXMgY29waWVkIG91dCBvciBub3QKLSAqCi0gKiBXQVJOSU5HOgotICogV2hlbiBhIGZyYW1lIGlzIHNlbnQgZGlyZWN0bHkgd2l0aG91dCBjb3B5aW5nLCBpdCBpcyB0aGUgZnJhbWUgcmVjZWl2ZXIncwotICogcmVzcG9uc2libGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWUgZGF0YSB3b24ndCBnZXQgY29ycnVwdGVkIGJ5Ci0gKiBzdWJzZXF1ZW50IHByZXZpZXcgZnJhbWVzIGZpbGxlZCBieSB0aGUgY2FtZXJhLiBUaGlzIGZsYWcgaXMgcmVjb21tZW5kZWQKLSAqIG9ubHkgd2hlbiBjb3B5aW5nIG91dCBkYXRhIGJyaW5ncyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwcmljZSBhbmQgdGhlCi0gKiBoYW5kbGluZy9wcm9jZXNzaW5nIG9mIHRoZSByZWNlaXZlZCBmcmFtZSBkYXRhIGlzIGFsd2F5cyBmYXN0ZXIgdGhhbgotICogdGhlIHByZXZpZXcgZnJhbWUgcmF0ZSBzbyB0aGF0IGRhdGEgY29ycnVwdGlvbiB3b24ndCBvY2N1ci4KLSAqCi0gKiBGb3IgaW5zdGFuY2UsCi0gKiAxLiAweDAwIGRpc2FibGVzIHRoZSBjYWxsYmFjay4gSW4gdGhpcyBjYXNlLCBjb3B5IG91dCBhbmQgb25lIHNob3QgYml0cwotICogICAgYXJlIGlnbm9yZWQuCi0gKiAyLiAweDAxIGVuYWJsZXMgYSBjYWxsYmFjayB3aXRob3V0IGNvcHlpbmcgb3V0IHRoZSByZWNlaXZlZCBmcmFtZXMuIEEKLSAqICAgIHR5cGljYWwgdXNlIGNhc2UgaXMgdGhlIENhbWNvcmRlciBhcHBsaWNhdGlvbiB0byBhdm9pZCBtYWtpbmcgY29zdGx5Ci0gKiAgICBmcmFtZSBjb3BpZXMuCi0gKiAzLiAweDA1IGlzIGVuYWJsaW5nIGEgY2FsbGJhY2sgd2l0aCBmcmFtZSBjb3BpZWQgb3V0IHJlcGVhdGVkbHkuIEEgdHlwaWNhbAotICogICAgdXNlIGNhc2UgaXMgdGhlIENhbWVyYSBhcHBsaWNhdGlvbi4KLSAqIDQuIDB4MDcgaXMgZW5hYmxpbmcgYSBjYWxsYmFjayB3aXRoIGZyYW1lIGNvcGllZCBvdXQgb25seSBvbmNlLiBBIHR5cGljYWwgdXNlCi0gKiAgICBjYXNlIGlzIHRoZSBCYXJjb2RlIHNjYW5uZXIgYXBwbGljYXRpb24uCi0gKi8KLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyAgICAgICAgICAgIDB4MDQKLQotLy8gVHlwaWNhbCB1c2UgY2FzZXMKLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX0NBTUNPUkRFUiAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ0FNRVJBICAgICAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19CQVJDT0RFX1NDQU5ORVIgICAgICAgICAgMHgwNwotCi0vLyBtc2dUeXBlIGluIG5vdGlmeUNhbGxiYWNrIGFuZCBkYXRhQ2FsbGJhY2sgZnVuY3Rpb25zCi1lbnVtIHsKLSAgICBDQU1FUkFfTVNHX0VSUk9SICAgICAgICAgICAgPSAweDAwMDEsCi0gICAgQ0FNRVJBX01TR19TSFVUVEVSICAgICAgICAgID0gMHgwMDAyLAotICAgIENBTUVSQV9NU0dfRk9DVVMgICAgICAgICAgICA9IDB4MDAwNCwKLSAgICBDQU1FUkFfTVNHX1pPT00gICAgICAgICAgICAgPSAweDAwMDgsCi0gICAgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FICAgID0gMHgwMDEwLAotICAgIENBTUVSQV9NU0dfVklERU9fRlJBTUUgICAgICA9IDB4MDAyMCwKLSAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FICAgPSAweDAwNDAsCi0gICAgQ0FNRVJBX01TR19SQVdfSU1BR0UgICAgICAgID0gMHgwMDgwLAotICAgIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSA9IDB4MDEwMCwKLSAgICBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkgPSAweDAyMDAsCi0gICAgQ0FNRVJBX01TR19BTExfTVNHUyAgICAgICAgID0gMHhGRkZGCi19OwotCi0vLyBjbWRUeXBlIGluIHNlbmRDb21tYW5kIGZ1bmN0aW9ucwotZW51bSB7Ci0gICAgQ0FNRVJBX0NNRF9TVEFSVF9TTU9PVEhfWk9PTSAgICAgPSAxLAotICAgIENBTUVSQV9DTURfU1RPUF9TTU9PVEhfWk9PTSAgICAgID0gMiwKLSAgICAvLyBTZXQgdGhlIGNsb2Nrd2lzZSByb3RhdGlvbiBvZiBwcmV2aWV3IGRpc3BsYXkgKHNldFByZXZpZXdEaXNwbGF5KSBpbgotICAgIC8vIGRlZ3JlZXMuIFRoaXMgYWZmZWN0cyB0aGUgcHJldmlldyBmcmFtZXMgYW5kIHRoZSBwaWN0dXJlIGRpc3BsYXllZCBhZnRlcgotICAgIC8vIHNuYXBzaG90LiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHBvcnRyYWl0IG1vZGUgYXBwbGljYXRpb25zLiBOb3RlIHRoYXQKLSAgICAvLyBwcmV2aWV3IGRpc3BsYXkgb2YgZnJvbnQtZmFjaW5nIGNhbWVyYXMgaXMgZmxpcHBlZCBob3Jpem9udGFsbHkgYmVmb3JlCi0gICAgLy8gdGhlIHJvdGF0aW9uLCB0aGF0IGlzLCB0aGUgaW1hZ2UgaXMgcmVmbGVjdGVkIGFsb25nIHRoZSBjZW50cmFsIHZlcnRpY2FsCi0gICAgLy8gYXhpcyBvZiB0aGUgY2FtZXJhIHNlbnNvci4gU28gdGhlIHVzZXJzIGNhbiBzZWUgdGhlbXNlbHZlcyBhcyBsb29raW5nCi0gICAgLy8gaW50byBhIG1pcnJvci4KLSAgICAvLwotICAgIC8vIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBvcmRlciBvZiBieXRlIGFycmF5IG9mIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwKLSAgICAvLyBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FLCBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FLCBDQU1FUkFfTVNHX1JBV19JTUFHRSwKLSAgICAvLyBvciBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UuIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gYmUgc2V0IGR1cmluZwotICAgIC8vIHByZXZpZXcuCi0gICAgQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTiA9IDMsCi0KLSAgICAvLyBjbWRUeXBlIHRvIGRpc2FibGUvZW5hYmxlIHNodXR0ZXIgc291bmQuCi0gICAgLy8gSW4gc2VuZENvbW1hbmQgcGFzc2luZyBhcmcxID0gMCB3aWxsIGRpc2FibGUsCi0gICAgLy8gd2hpbGUgcGFzc2luZyBhcmcxID0gMSB3aWxsIGVuYWJsZSB0aGUgc2h1dHRlciBzb3VuZC4KLSAgICBDQU1FUkFfQ01EX0VOQUJMRV9TSFVUVEVSX1NPVU5EID0gNCwKLQotICAgIC8vIGNtZFR5cGUgdG8gcGxheSByZWNvcmRpbmcgc291bmQuCi0gICAgQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCA9IDUsCi19OwotCi0vLyBjYW1lcmEgZmF0YWwgZXJyb3JzCi1lbnVtIHsKLSAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiAgPSAxLAotICAgIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCA9IDEwMAotfTsKLQotZW51bSB7Ci0gICAgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMCwgLyogVGhlIGZhY2luZyBvZiB0aGUgY2FtZXJhIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YgdGhlIHNjcmVlbi4gKi8KLSAgICBDQU1FUkFfRkFDSU5HX0ZST05UID0gMSAvKiBUaGUgZmFjaW5nIG9mIHRoZSBjYW1lcmEgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgc2NyZWVuLiAqLwotfTsKLQogc3RydWN0IENhbWVyYUluZm8gewotCiAgICAgLyoqCi0gICAgICogVGhlIGRpcmVjdGlvbiB0aGF0IHRoZSBjYW1lcmEgZmFjZXMgdG8uIEl0IHNob3VsZCBiZQotICAgICAqIENBTUVSQV9GQUNJTkdfQkFDSyBvciBDQU1FUkFfRkFDSU5HX0ZST05ULgorICAgICAqIFRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgY2FtZXJhIGZhY2VzIHRvLiBJdCBzaG91bGQgYmUgQ0FNRVJBX0ZBQ0lOR19CQUNLCisgICAgICogb3IgQ0FNRVJBX0ZBQ0lOR19GUk9OVC4KICAgICAgKi8KICAgICBpbnQgZmFjaW5nOwogCiAgICAgLyoqCiAgICAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBjYW1lcmEgaW1hZ2UuIFRoZSB2YWx1ZSBpcyB0aGUgYW5nbGUgdGhhdCB0aGUKLSAgICAgKiBjYW1lcmEgaW1hZ2UgbmVlZHMgdG8gYmUgcm90YXRlZCBjbG9ja3dpc2Ugc28gaXQgc2hvd3MgY29ycmVjdGx5IG9uCi0gICAgICogdGhlIGRpc3BsYXkgaW4gaXRzIG5hdHVyYWwgb3JpZW50YXRpb24uIEl0IHNob3VsZCBiZSAwLCA5MCwgMTgwLCBvciAyNzAuCisgICAgICogY2FtZXJhIGltYWdlIG5lZWRzIHRvIGJlIHJvdGF0ZWQgY2xvY2t3aXNlIHNvIGl0IHNob3dzIGNvcnJlY3RseSBvbiB0aGUKKyAgICAgKiBkaXNwbGF5IGluIGl0cyBuYXR1cmFsIG9yaWVudGF0aW9uLiBJdCBzaG91bGQgYmUgMCwgOTAsIDE4MCwgb3IgMjcwLgogICAgICAqCiAgICAgICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBkZXZpY2UgaGFzIGEgbmF0dXJhbGx5IHRhbGwgc2NyZWVuLiBUaGUKICAgICAgKiBiYWNrLWZhY2luZyBjYW1lcmEgc2Vuc29yIGlzIG1vdW50ZWQgaW4gbGFuZHNjYXBlLiBZb3UgYXJlIGxvb2tpbmcgYXQKICAgICAgKiB0aGUgc2NyZWVuLiBJZiB0aGUgdG9wIHNpZGUgb2YgdGhlIGNhbWVyYSBzZW5zb3IgaXMgYWxpZ25lZCB3aXRoIHRoZQogICAgICAqIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNjcmVlbiBpbiBuYXR1cmFsIG9yaWVudGF0aW9uLCB0aGUgdmFsdWUgc2hvdWxkIGJlCi0gICAgICogOTAuIElmIHRoZSB0b3Agc2lkZSBvZiBhIGZyb250LWZhY2luZyBjYW1lcmEgc2Vuc29yIGlzIGFsaWduZWQgd2l0aAotICAgICAqIHRoZSByaWdodCBvZiB0aGUgc2NyZWVuLCB0aGUgdmFsdWUgc2hvdWxkIGJlIDI3MC4KKyAgICAgKiA5MC4gSWYgdGhlIHRvcCBzaWRlIG9mIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSBzZW5zb3IgaXMgYWxpZ25lZCB3aXRoIHRoZQorICAgICAqIHJpZ2h0IG9mIHRoZSBzY3JlZW4sIHRoZSB2YWx1ZSBzaG91bGQgYmUgMjcwLgogICAgICAqLwogICAgIGludCBvcmllbnRhdGlvbjsKIH07CkBAIC0xNTEsNyArNTksOCBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBwb3N0RGF0YVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgPSAwOwogfTsKIApAQCAtMTY0LDcgKzczLDcgQEAKICAgICBzdGF0aWMgIHN0YXR1c190ICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgc3RhdGljICBzcDxDYW1lcmE+ICBjb25uZWN0KGludCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB+Q2FtZXJhKCk7CisgICAgICAgICAgICB2aXJ0dWFsICAgICB+Q2FtZXJhKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBpbml0KCk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlY29ubmVjdCgpOwpAQCAtMjE5LDI1ICsxMjgsMzcgQEAKICAgICAgICAgICAgIC8vIHNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOwogCi0gICAgICAgICAgICAvLyByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgdmlkZW8gYnVmZmVycy4KLSAgICAgICAgICAgIGludDMyX3QgICAgIGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaW5kaXZpZHVhbCB2aWRlbyBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICAgICAgICBzcDxJTWVtb3J5PiBnZXRWaWRlb0J1ZmZlcihpbnQzMl90IGluZGV4KSBjb25zdDsKLQogICAgICAgICAgICAgLy8gdGVsbCBjYW1lcmEgaGFsIHRvIHN0b3JlIG1ldGEgZGF0YSBvciByZWFsIFlVViBpbiB2aWRlbyBidWZmZXJzLgogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFJlY29yZGluZ1Byb3h5TGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFncyhpbnQgcHJldmlld19jYWxsYmFja19mbGFnKTsKIAorICAgICAgICAgICAgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiBnZXRSZWNvcmRpbmdQcm94eSgpOworCiAgICAgLy8gSUNhbWVyYUNsaWVudCBpbnRlcmZhY2UKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQsIGludDMyX3QgZXh0Mik7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKTsKIAogICAgIHNwPElDYW1lcmE+ICAgICAgICAgcmVtb3RlKCk7CiAKKyAgICBjbGFzcyBSZWNvcmRpbmdQcm94eSA6IHB1YmxpYyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVjb3JkaW5nUHJveHkoY29uc3Qgc3A8Q2FtZXJhPiYgY2FtZXJhKTsKKworICAgICAgICAvLyBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzdG9wUmVjb3JkaW5nKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxDYW1lcmE+ICAgICAgICAgbUNhbWVyYTsKKyAgICB9OworCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEoY29uc3QgQ2FtZXJhJik7CkBAIC0yNjIsMTIgKzE4MywxMiBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBtU3RhdHVzOwogCiAgICAgICAgICAgICBzcDxDYW1lcmFMaXN0ZW5lcj4gIG1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiAgbVJlY29yZGluZ1Byb3h5TGlzdGVuZXI7CiAKICAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBEZWF0aE5vdGlmaWVyOwogCiAgICAgICAgICAgICBzdGF0aWMgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgICAgICBzdGF0aWMgIHNwPElDYW1lcmFTZXJ2aWNlPiAgbUNhbWVyYVNlcnZpY2U7Ci0KIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiZDg0OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KLSNpbmNsdWRlIDx1aS9hbmRyb2lkX25hdGl2ZV9idWZmZXIuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiAgVGhlIHNpemUgb2YgaW1hZ2UgZm9yIGRpc3BsYXkuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGltYWdlX3JlY3Rfc3RydWN0Ci17Ci0gIHVpbnQzMl90IHdpZHRoOyAgICAgIC8qIEltYWdlIHdpZHRoICovCi0gIHVpbnQzMl90IGhlaWdodDsgICAgIC8qIEltYWdlIGhlaWdodCAqLwotfSBpbWFnZV9yZWN0X3R5cGU7Ci0KLQotdHlwZWRlZiB2b2lkICgqbm90aWZ5X2NhbGxiYWNrKShpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKTsKLQotdHlwZWRlZiB2b2lkICgqZGF0YV9jYWxsYmFjaykoaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKTsKLQotdHlwZWRlZiB2b2lkICgqZGF0YV9jYWxsYmFja190aW1lc3RhbXApKG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKTsKLQotLyoqCi0gKiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUKLSAqIGNhbWVyYSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciwgdXNlZCBmb3Igc2V0dGluZyBhbmQgZ2V0dGluZwotICogcGFyYW1ldGVycywgbGl2ZSBwcmV2aWV3aW5nLCBhbmQgdGFraW5nIHBpY3R1cmVzLgotICoKLSAqIEl0IGlzIGEgcmVmZXJlbmNlZCBjb3VudGVkIGludGVyZmFjZSB3aXRoIFJlZkJhc2UgYXMgaXRzIGJhc2UgY2xhc3MuCi0gKiBDYW1lcmFTZXJ2aWNlIGNhbGxzIG9wZW5DYW1lcmFIYXJkd2FyZSgpIHRvIHJldHJpZXZlIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlCi0gKiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBhbmQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlCi0gKiBmb2xsb3dpbmcgc3RlcHMgZGVzY3JpYmUgYSB0eXBpY2FsIHNlcXVlbmNlOgotICoKLSAqICAgLSMgQWZ0ZXIgQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSwgZ2V0UGFyYW1ldGVycygpIGFuZAotICogICAgICBzZXRQYXJhbWV0ZXJzKCkgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY2FtZXJhIGluc3RhbmNlLgotICogICAgICBDYW1lcmFTZXJ2aWNlIGNhbGxzIGdldFByZXZpZXdIZWFwKCkgdG8gZXN0YWJsaXNoIGFjY2VzcyB0byB0aGUKLSAqICAgICAgcHJldmlldyBoZWFwIHNvIGl0IGNhbiBiZSByZWdpc3RlcmVkIHdpdGggU3VyZmFjZUZsaW5nZXIgZm9yCi0gKiAgICAgIGVmZmljaWVudCBkaXNwbGF5IHVwZGF0aW5nIHdoaWxlIGluIHByZXZpZXcgbW9kZS4KLSAqICAgLSMgc3RhcnRQcmV2aWV3KCkgaXMgY2FsbGVkLiAgVGhlIGNhbWVyYSBpbnN0YW5jZSB0aGVuIHBlcmlvZGljYWxseQotICogICAgICBzZW5kcyB0aGUgbWVzc2FnZSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUgKGlmIGVuYWJsZWQpIGVhY2ggdGltZQotICogICAgICBhIG5ldyBwcmV2aWV3IGZyYW1lIGlzIGF2YWlsYWJsZS4gIElmIGRhdGEgY2FsbGJhY2sgY29kZSBuZWVkcyB0byB1c2UKLSAqICAgICAgdGhpcyBtZW1vcnkgYWZ0ZXIgcmV0dXJuaW5nLCBpdCBtdXN0IGNvcHkgdGhlIGRhdGEuCi0gKgotICogUHJpb3IgdG8gdGFraW5nIGEgcGljdHVyZSwgQ2FtZXJhU2VydmljZSBjYWxscyBhdXRvZm9jdXMoKS4gV2hlbiBhdXRvCi0gKiBmb2N1c2luZyBoYXMgY29tcGxldGVkLCB0aGUgY2FtZXJhIGluc3RhbmNlIHNlbmRzIGEgQ0FNRVJBX01TR19GT0NVUyBub3RpZmljYXRpb24sCi0gKiB3aGljaCBpbmZvcm1zIHRoZSBhcHBsaWNhdGlvbiB3aGV0aGVyIGZvY3VzaW5nIHdhcyBzdWNjZXNzZnVsLiBUaGUgY2FtZXJhIGluc3RhbmNlCi0gKiBvbmx5IHNlbmRzIHRoaXMgbWVzc2FnZSBvbmNlIGFuZCBpdCBpcyB1cCAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIGNhbGwgYXV0b0ZvY3VzKCkKLSAqIGFnYWluIGlmIHJlZm9jdXNpbmcgaXMgZGVzaXJlZC4KLSAqCi0gKiBDYW1lcmFTZXJ2aWNlIGNhbGxzIHRha2VQaWN0dXJlKCkgdG8gcmVxdWVzdCB0aGUgY2FtZXJhIGluc3RhbmNlIHRha2UgYQotICogcGljdHVyZS4gQXQgdGhpcyBwb2ludCwgaWYgYSBzaHV0dGVyLCBwb3N0dmlldywgcmF3LCBhbmQvb3IgY29tcHJlc3NlZCBjYWxsYmFjawotICogaXMgZGVzaXJlZCwgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBtdXN0IGJlIGVuYWJsZWQuIEFzIHdpdGggQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLAotICogYW55IG1lbW9yeSBwcm92aWRlZCBpbiBhIGRhdGEgY2FsbGJhY2sgbXVzdCBiZSBjb3BpZWQgaWYgaXQncyBuZWVkZWQgYWZ0ZXIgcmV0dXJuaW5nLgotICovCi1jbGFzcyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewotcHVibGljOgotICAgIHZpcnR1YWwgfkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCkgeyB9Ci0KLSAgICAvKiogU2V0IHRoZSBBTmF0aXZlV2luZG93IHRvIHdoaWNoIHByZXZpZXcgZnJhbWVzIGFyZSBzZW50ICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpID0gMDsKLQotICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcmF3IGltYWdlIGhlYXAgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFJhd0hlYXAoKSBjb25zdCA9IDA7Ci0KLSAgICAvKiogU2V0IHRoZSBub3RpZmljYXRpb24gYW5kIGRhdGEgY2FsbGJhY2tzICovCi0gICAgdmlydHVhbCB2b2lkIHNldENhbGxiYWNrcyhub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFjayBkYXRhX2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXAgZGF0YV9jYl90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGwgdGFrZSBhIG1zZ3R5cGUsCi0gICAgICogd2hpY2ggaXMgYSBiaXRtYXNrIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluCi0gICAgICogaW5jbHVkZS91aS9DYW1lcmEuaAotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIGEgbWVzc2FnZSwgb3Igc2V0IG9mIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpID0gMDsKLQotICAgIC8qKgotICAgICAqIERpc2FibGUgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIE9uY2UgcmVjZWl2ZWQgYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBjYW1lcmEgaGFsCi0gICAgICogc2hvdWxkIG5vdCByZWx5IG9uIGl0cyBjbGllbnQgdG8gY2FsbCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKSB0byByZWxlYXNlCi0gICAgICogdmlkZW8gcmVjb3JkaW5nIGZyYW1lcyBzZW50IG91dCBieSB0aGUgY2FtZXJhbCBoYWwgYmVmb3JlIGFuZCBhZnRlciB0aGUKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSBjYWxsLiBDYW1lcmEgaGFsIGNsaWVudHMgbXVzdCBub3QKLSAgICAgKiBtb2RpZnkvYWNjZXNzIGFueSB2aWRlbyByZWNvcmRpbmcgZnJhbWUgYWZ0ZXIgY2FsbGluZwotICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZGlzYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyeSB3aGV0aGVyIGEgbWVzc2FnZSwgb3IgYSBzZXQgb2YgbWVzc2FnZXMsIGlzIGVuYWJsZWQuCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgb3BlcmF0ZXMgYXMgYW4gQU5ELCBpZiBhbnkgb2YgdGhlIG1lc3NhZ2VzCi0gICAgICogcXVlcmllZCBhcmUgb2ZmLCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgbXNnVHlwZUVuYWJsZWQoaW50MzJfdCBtc2dUeXBlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwcmV2aWV3IG1vZGUuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydFByZXZpZXcoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wUHJldmlldygpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcmV2aWV3IGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sICAgICAgICBwcmV2aWV3RW5hYmxlZCgpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcnMgZnJvbSBjYW1lcmEgaGFsIGZvciBwYXNzaW5nCi0gICAgICogdmlkZW8gZnJhbWUgZGF0YSBpbiBhIHJlY29yZGluZyBzZXNzaW9uLiBNdXN0IGJlIGNhbGxlZCBhZ2FpbiBpZiBhIG5ldwotICAgICAqIHJlY29yZGluZyBzZXNzaW9uIGlzIHN0YXJ0ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN0YXJ0UmVjb3JkaW5nKCksIHNpbmNlCi0gICAgICogdGhlIHNvbWUgY2FtZXJhIGhhbCBtYXkgY2hvb3NlIHRvIGFsbG9jYXRlIHRoZSB2aWRlbyBidWZmZXJzIG9ubHkgYWZ0ZXIKLSAgICAgKiByZWNvcmRpbmcgaXMgc3RhcnRlZC4KLSAgICAgKgotICAgICAqIFNvbWUgY2FtZXJhIGhhbCBtYXkgbm90IGltcGxlbWVudCB0aGlzIG1ldGhvZCwgYW5kIDAgY2FuIGJlIHJldHVybmVkIHRvCi0gICAgICogaW5kaWNhdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB2aWRlbyBidWZmZXJzIHRoYXQgY2FtZXJhIGhhbCBtYWtlcyBhdmFpbGFibGUuCi0gICAgICogICAgICBaZXJvICgwKSBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IGNhbWVyYSBoYWwgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqICAgICAgdGhpcyBmZWF0dXJlLgotICAgICAqLwotICAgIHZpcnR1YWwgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgdmlkZW8gYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGluZGV4IGluIGEKLSAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbi4gTXVzdCBiZSBjYWxsZWQgYWdhaW4gaWYgYSBuZXcgcmVjb3JkaW5nIHNlc3Npb24KLSAgICAgKiBpcyBzdGFydGVkLgotICAgICAqCi0gICAgICogSXQgYWxsb3dzIGEgY2xpZW50IHRvIHJldHJpZXZlIGFsbCB2aWRlbyBidWZmZXJzIHRoYXQgY2FtZXJhIGhhbCBtYWtlcwotICAgICAqIGF2YWlsYWJsZSB0byBwYXNzaW5nIHZpZGVvIGZyYW1lIGRhdGEgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGFsbAotICAgICAqIHZhbGlkIGluZGV4IHZhbHVlcy4gVGhlIHZhbGlkIGluZGV4IHZhbHVlIHJhbmdlcyBmcm9tIDAgdG8gbiwgd2hlcmUKLSAgICAgKiBuID0gZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSAtIDEuIFdpdGggYW4gaW5kZXggb3V0c2lkZSBvZiB0aGUgdmFsaWQKLSAgICAgKiByYW5nZSwgMCBtdXN0IGJlIHJldHVybmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCi0gICAgICogc3RhcnRSZWNvcmRpbmcoKS4KLSAgICAgKgotICAgICAqIFRoZSB2aWRlbyBidWZmZXJzIHNob3VsZCBOT1QgYmUgbW9kaWZpZWQvcmVsZWFzZWQgYnkgY2FtZXJhIGhhbAotICAgICAqIHVudGlsIHN0b3BSZWNvcmRpbmcoKSBpcyBjYWxsZWQgYW5kIGFsbCBvdXRzdGFuZGluZyB2aWRlbyBidWZmZXJzCi0gICAgICogcHJldmlvdXNseSBzZW50IG91dCB2aWEgQ0FNRVJBX01TR19WSURFT19GUkFNRSBoYXZlIGJlZW4gcmVsZWFzZWQKLSAgICAgKiB2aWEgcmVsZWFzZVZpZGVvQnVmZmVyKCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXggdG8gcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgdmlkZW8gYnVmZmVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmlkZW8gYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGluZGV4LgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSBtZXRhIGRhdGEgb3IgcmVhbCBZVVYgZGF0YSBpbgotICAgICAqIHRoZSB2aWRlbyBidWZmZXJzIHNlbmQgb3V0IHZpYSBDQU1FUkFfTVNHX1ZJREVPX0ZSUkFNRSBmb3IgYQotICAgICAqIHJlY29yZGluZyBzZXNzaW9uLiBJZiBpdCBpcyBub3QgY2FsbGVkLCB0aGUgZGVmYXVsdCBjYW1lcmEKLSAgICAgKiBoYWwgYmVoYXZpb3IgaXMgdG8gc3RvcmUgcmVhbCBZVVYgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nKCkgaW4gb3JkZXIKLSAgICAgKiB0byBiZSBlZmZlY3RpdmUuCi0gICAgICoKLSAgICAgKiBJZiBtZXRhIGRhdGEgaXMgc3RvcmVkIGluIHRoZSB2aWRlbyBidWZmZXJzLCBpdCBpcyB1cCB0byB0aGUKLSAgICAgKiByZWNlaXZlciBvZiB0aGUgdmlkZW8gYnVmZmVycyB0byBpbnRlcnByZXQgdGhlIGNvbnRlbnRzIGFuZAotICAgICAqIHRvIGZpbmQgdGhlIGFjdHVhbCBmcmFtZSBkYXRhIHdpdGggdGhlIGhlbHAgb2YgdGhlIG1ldGEgZGF0YQotICAgICAqIGluIHRoZSBidWZmZXIuIEhvdyB0aGlzIGlzIGRvbmUgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIFNvbWUgY2FtZXJhIGhhbCBtYXkgbm90IHN1cHBvcnQgc3RvcmluZyBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvCi0gICAgICogYnVmZmVycywgYnV0IGFsbCBjYW1lcmEgaGFsIHNob3VsZCBzdXBwb3J0IHN0b3JpbmcgcmVhbCBZVVYgZGF0YQotICAgICAqIGluIHRoZSB2aWRlbyBidWZmZXJzLiBJZiB0aGUgY2FtZXJhIGhhbCBkb2VzIG5vdCBzdXBwb3J0IHN0b3JpbmcKLSAgICAgKiB0aGUgbWV0YSBkYXRhIGluIHRoZSB2aWRlbyBidWZmZXJzIHdoZW4gaXQgaXMgcmVxdWVzdGVkIHRvIGRvCi0gICAgICogZG8sIElOVkFMSURfT1BFUkFUSU9OIG11c3QgYmUgcmV0dXJuZWQuIEl0IGlzIHZlcnkgdXNlZnVsIGZvcgotICAgICAqIHRoZSBjYW1lcmEgaGFsIHRvIHBhc3MgbWV0YSBkYXRhIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgZnJhbWUKLSAgICAgKiBkYXRhIGRpcmVjdGx5IHRvIHRoZSB2aWRlbyBlbmNvZGVyLCBzaW5jZSB0aGUgYW1vdW50IG9mIHRoZQotICAgICAqIHVuY29tcHJlc3NlZCBmcmFtZSBkYXRhIGNhbiBiZSB2ZXJ5IGxhcmdlIGlmIHZpZGVvIHNpemUgaXMgbGFyZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlIGlmIHRydWUgdG8gaW5zdHJ1Y3QgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUKLSAgICAgKiAgICAgIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVyczsgZmFsc2UgdG8gaW5zdHJ1Y3QKLSAgICAgKiAgICAgIHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvCi0gICAgICogICAgICBidWZmZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiBPSyBvbiBzdWNjZXNzLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGU/IElOVkFMSURfT1BFUkFUSU9OOiBPSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHJlY29yZCBtb2RlLiBXaGVuIGEgcmVjb3JkIGltYWdlIGlzIGF2YWlsYWJsZSBhIENBTUVSQV9NU0dfVklERU9fRlJBTUUKLSAgICAgKiBtZXNzYWdlIGlzIHNlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmcmFtZS4gRXZlcnkgcmVjb3JkIGZyYW1lIG11c3QgYmUgcmVsZWFzZWQKLSAgICAgKiBieSBhIGNhbWVyYWwgaGFsIGNsaWVudCB2aWEgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgYmVmb3JlIHRoZSBjbGllbnQgY2FsbHMKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgdGhlIGNsaWVudCBjYWxscwotICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MgcmVzcG9uc2liaWxpdHkKLSAgICAgKiB0byBtYW5hZ2UgdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHZpZGVvIHJlY29yZGluZyBmcmFtZXMsIGFuZCB0aGUgY2xpZW50IG11c3QKLSAgICAgKiBub3QgbW9kaWZ5L2FjY2VzcyBhbnkgdmlkZW8gcmVjb3JkaW5nIGZyYW1lcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0UmVjb3JkaW5nKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCByZWNvcmRpbmcuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wUmVjb3JkaW5nKCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHJlY29yZGluZyBpcyBlbmFibGVkLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgcmVjb3JkaW5nRW5hYmxlZCgpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgYSByZWNvcmQgZnJhbWUgcHJldmlvdXNseSByZXR1cm5lZCBieSBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FLgotICAgICAqCi0gICAgICogSXQgaXMgY2FtZXJhIGhhbCBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byByZWxlYXNlIHZpZGVvIHJlY29yZGluZwotICAgICAqIGZyYW1lcyBzZW50IG91dCBieSB0aGUgY2FtZXJhIGhhbCBiZWZvcmUgdGhlIGNhbWVyYSBoYWwgcmVjZWl2ZXMKLSAgICAgKiBhIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuIEFmdGVyIGl0IHJlY2VpdmVzCi0gICAgICogdGhlIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSksIGl0IGlzIGNhbWVyYSBoYWwncwotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIG1hbmFnaW5nIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB2aWRlbyByZWNvcmRpbmcKLSAgICAgKiBmcmFtZXMuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RhcnQgYXV0byBmb2N1cywgdGhlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayByb3V0aW5lIGlzIGNhbGxlZAotICAgICAqIHdpdGggQ0FNRVJBX01TR19GT0NVUyBvbmNlIHdoZW4gZm9jdXNpbmcgaXMgY29tcGxldGUuIGF1dG9Gb2N1cygpCi0gICAgICogd2lsbCBiZSBjYWxsZWQgYWdhaW4gaWYgYW5vdGhlciBhdXRvIGZvY3VzIGlzIG5lZWRlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF1dG9Gb2N1cygpID0gMDsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYXV0by1mb2N1cyBmdW5jdGlvbi4gSWYgdGhlIGF1dG8tZm9jdXMgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsCi0gICAgICogdGhpcyBmdW5jdGlvbiB3aWxsIGNhbmNlbCBpdC4gV2hldGhlciB0aGUgYXV0by1mb2N1cyBpcyBpbiBwcm9ncmVzcwotICAgICAqIG9yIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgZm9jdXMgcG9zaXRpb24gdG8gdGhlIGRlZmF1bHQuCi0gICAgICogSWYgdGhlIGNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IGF1dG8tZm9jdXMsIHRoaXMgaXMgYSBuby1vcC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNhbmNlbEF1dG9Gb2N1cygpID0gMDsKLQotICAgIC8qKgotICAgICAqIFRha2UgYSBwaWN0dXJlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgdGFrZVBpY3R1cmUoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWwgYSBwaWN0dXJlIHRoYXQgd2FzIHN0YXJ0ZWQgd2l0aCB0YWtlUGljdHVyZS4gIENhbGxpbmcgdGhpcwotICAgICAqIG1ldGhvZCB3aGVuIG5vIHBpY3R1cmUgaXMgYmVpbmcgdGFrZW4gaXMgYSBuby1vcC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNhbmNlbFBpY3R1cmUoKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiBUaGlzIHJldHVybnMgQkFEX1ZBTFVFIGlmIGFueSBwYXJhbWV0ZXIgaXMKLSAgICAgKiBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykgPSAwOwotCi0gICAgLyoqIFJldHVybiB0aGUgY2FtZXJhIHBhcmFtZXRlcnMuICovCi0gICAgdmlydHVhbCBDYW1lcmFQYXJhbWV0ZXJzICBnZXRQYXJhbWV0ZXJzKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2VuZCBjb21tYW5kIHRvIGNhbWVyYSBkcml2ZXIuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIGhhcmR3YXJlIHJlc291cmNlcyBvd25lZCBieSB0aGlzIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICAgICogKm5vdCogZG9uZSBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKLQotICAgIC8qKgotICAgICAqIER1bXAgc3RhdGUgb2YgdGhlIGNhbWVyYSBoYXJkd2FyZQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0ID0gMDsKLX07Ci0KLS8qKgotICogVGhlIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBjYW1lcmEgSEFMLgotICoKLSAqIElmIGdldE51bWJlck9mQ2FtZXJhcygpIHJldHVybnMgTiwgdGhlIHZhbGlkIGNhbWVyYUlkIGZvciBnZXRDYW1lcmFJbmZvKCkKLSAqIGFuZCBvcGVuQ2FtZXJhSGFyZHdhcmUoKSBpcyAwIHRvIE4tMS4KLSAqLwotZXh0ZXJuICJDIiBpbnQgSEFMX2dldE51bWJlck9mQ2FtZXJhcygpOwotZXh0ZXJuICJDIiB2b2lkIEhBTF9nZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOwotLyogSEFMIHNob3VsZCByZXR1cm4gTlVMTCBpZiBpdCBmYWlscyB0byBvcGVuIGNhbWVyYSBoYXJkd2FyZS4gKi8KLWV4dGVybiAiQyIgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IEhBTF9vcGVuQ2FtZXJhSGFyZHdhcmUoaW50IGNhbWVyYUlkKTsKLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGRhMmYwNDkuLmI2NjE0OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTI0Nyw2ICsyNDcsNDUgQEAKICAgICAvLyBTdXBwb3J0ZWQgZm9jdXMgbW9kZXMuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImF1dG8sbWFjcm8sZml4ZWQiLiBSZWFkIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9GT0NVU19NT0RFU1tdOworICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmb2N1cyBhcmVhcyBzdXBwb3J0ZWQuIFRoaXMgaXMgdGhlIG1heGltdW0gbGVuZ3RoCisgICAgLy8gb2YgS0VZX0ZPQ1VTX0FSRUFTLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIwIiBvciAiMiIuIFJlYWQgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUFYX05VTV9GT0NVU19BUkVBU1tdOworICAgIC8vIEN1cnJlbnQgZm9jdXMgYXJlYXMuCisgICAgLy8KKyAgICAvLyBCZWZvcmUgYWNjZXNzaW5nIHRoaXMgcGFyYW1ldGVyLCBhcHBzIHNob3VsZCBjaGVjaworICAgIC8vIEtFWV9NQVhfTlVNX0ZPQ1VTX0FSRUFTIGZpcnN0IHRvIGtub3cgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvY3VzIGFyZWFzCisgICAgLy8gZmlyc3QuIElmIHRoZSB2YWx1ZSBpcyAwLCBmb2N1cyBhcmVhIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8KKyAgICAvLyBFYWNoIGZvY3VzIGFyZWEgaXMgYSBmaXZlLWVsZW1lbnQgaW50IGFycmF5LiBUaGUgZmlyc3QgZm91ciBlbGVtZW50cyBhcmUKKyAgICAvLyB0aGUgcmVjdGFuZ2xlIG9mIHRoZSBhcmVhIChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pLiBUaGUgZGlyZWN0aW9uIGlzCisgICAgLy8gcmVsYXRpdmUgdG8gdGhlIHNlbnNvciBvcmllbnRhdGlvbiwgdGhhdCBpcywgd2hhdCB0aGUgc2Vuc29yIHNlZXMuIFRoZQorICAgIC8vIGRpcmVjdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHJvdGF0aW9uIG9yIG1pcnJvcmluZyBvZgorICAgIC8vIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04uIENvb3JkaW5hdGVzIHJhbmdlIGZyb20gLTEwMDAgdG8gMTAwMC4KKyAgICAvLyAoLTEwMDAsLTEwMDApIGlzIHRoZSB1cHBlciBsZWZ0IHBvaW50LiAoMTAwMCwgMTAwMCkgaXMgdGhlIGxvd2VyIHJpZ2h0CisgICAgLy8gcG9pbnQuIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGZvY3VzIGFyZWFzIGNhbm5vdCBiZSAwIG9yIG5lZ2F0aXZlLgorICAgIC8vCisgICAgLy8gVGhlIGZpZnRoIGVsZW1lbnQgaXMgdGhlIHdlaWdodC4gVmFsdWVzIGZvciB3ZWlnaHQgbXVzdCByYW5nZSBmcm9tIDEgdG8KKyAgICAvLyAxMDAwLiAgVGhlIHdlaWdodCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwZXItcGl4ZWwgd2VpZ2h0IC0gYWxsCisgICAgLy8gcGl4ZWxzIGluIHRoZSBhcmVhIGhhdmUgdGhlIHNwZWNpZmllZCB3ZWlnaHQuIFRoaXMgbWVhbnMgYSBzbWFsbCBhcmVhCisgICAgLy8gd2l0aCB0aGUgc2FtZSB3ZWlnaHQgYXMgYSBsYXJnZXIgYXJlYSB3aWxsIGhhdmUgbGVzcyBpbmZsdWVuY2Ugb24gdGhlCisgICAgLy8gZm9jdXNpbmcgdGhhbiB0aGUgbGFyZ2VyIGFyZWEuIEZvY3VzIGFyZWFzIGNhbiBwYXJ0aWFsbHkgb3ZlcmxhcCBhbmQgdGhlCisgICAgLy8gZHJpdmVyIHdpbGwgYWRkIHRoZSB3ZWlnaHRzIGluIHRoZSBvdmVybGFwIHJlZ2lvbi4KKyAgICAvLworICAgIC8vIEEgc3BlY2lhbCBjYXNlIG9mIHNpbmdsZSBmb2N1cyBhcmVhICgwLDAsMCwwLDApIG1lYW5zIGRyaXZlciB0byBkZWNpZGUKKyAgICAvLyB0aGUgZm9jdXMgYXJlYS4gRm9yIGV4YW1wbGUsIHRoZSBkcml2ZXIgbWF5IHVzZSBtb3JlIHNpZ25hbHMgdG8gZGVjaWRlCisgICAgLy8gZm9jdXMgYXJlYXMgYW5kIGNoYW5nZSB0aGVtIGR5bmFtaWNhbGx5LiBBcHBzIGNhbiBzZXQgKDAsMCwwLDAsMCkgaWYgdGhleQorICAgIC8vIHdhbnQgdGhlIGRyaXZlciB0byBkZWNpZGUgZm9jdXMgYXJlYXMuCisgICAgLy8KKyAgICAvLyBGb2N1cyBhcmVhcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmllbGQgb2YgdmlldyAoS0VZX1pPT00pLiBObworICAgIC8vIG1hdHRlciB3aGF0IHRoZSB6b29tIGxldmVsIGlzLCAoLTEwMDAsLTEwMDApIHJlcHJlc2VudHMgdGhlIHRvcCBvZiB0aGUKKyAgICAvLyBjdXJyZW50bHkgdmlzaWJsZSBjYW1lcmEgZnJhbWUuIFRoZSBmb2N1cyBhcmVhIGNhbm5vdCBiZSBzZXQgdG8gYmUKKyAgICAvLyBvdXRzaWRlIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcsIGV2ZW4gd2hlbiB1c2luZyB6b29tLgorICAgIC8vCisgICAgLy8gRm9jdXMgYXJlYSBvbmx5IGhhcyBlZmZlY3QgaWYgdGhlIGN1cnJlbnQgZm9jdXMgbW9kZSBpcyBGT0NVU19NT0RFX0FVVE8sCisgICAgLy8gRk9DVVNfTU9ERV9NQUNSTywgb3IgRk9DVVNfTU9ERV9DT05USU5PVVNfVklERU8uCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIigtMTAsLTEwLDAsMCwzMDApLCgwLDAsMTAsMTAsNzAwKSIuIFJlYWQvd3JpdGUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0ZPQ1VTX0FSRUFTW107CiAgICAgLy8gRm9jYWwgbGVuZ3RoIGluIG1pbGxpbWV0ZXIuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjQuMzEiLiBSZWFkIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0ZPQ0FMX0xFTkdUSFtdOwpAQCAtMjcwLDYgKzMwOSw5NCBAQAogICAgIC8vIDAuMzMzMywgRVYgaXMgLTIuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjAuMzMzMzMzMzMzIiBvciAiMC41Ii4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9FWFBPU1VSRV9DT01QRU5TQVRJT05fU1RFUFtdOworICAgIC8vIFRoZSBzdGF0ZSBvZiB0aGUgYXV0by1leHBvc3VyZSBsb2NrLiAidHJ1ZSIgbWVhbnMgdGhhdAorICAgIC8vIGF1dG8tZXhwb3N1cmUgaXMgbG9ja2VkIHRvIGl0cyBjdXJyZW50IHZhbHVlIGFuZCB3aWxsIG5vdAorICAgIC8vIGNoYW5nZS4gImZhbHNlIiBtZWFucyB0aGUgYXV0by1leHBvc3VyZSByb3V0aW5lIGlzIGZyZWUgdG8KKyAgICAvLyBjaGFuZ2UgZXhwb3N1cmUgdmFsdWVzLiBJZiBhdXRvLWV4cG9zdXJlIGlzIGFscmVhZHkgbG9ja2VkLAorICAgIC8vIHNldHRpbmcgdGhpcyB0byB0cnVlIGFnYWluIGhhcyBubyBlZmZlY3QgKHRoZSBkcml2ZXIgd2lsbCBub3QKKyAgICAvLyByZWNhbGN1bGF0ZSBleHBvc3VyZSB2YWx1ZXMpLiBDaGFuZ2luZyBleHBvc3VyZSBjb21wZW5zYXRpb24KKyAgICAvLyBzZXR0aW5ncyB3aWxsIHN0aWxsIGFmZmVjdCB0aGUgZXhwb3N1cmUgc2V0dGluZ3Mgd2hpbGUKKyAgICAvLyBhdXRvLWV4cG9zdXJlIGlzIGxvY2tlZC4gU3RvcHBpbmcgcHJldmlldyBvciB0YWtpbmcgYSBzdGlsbAorICAgIC8vIGltYWdlIHdpbGwgcmVsZWFzZSB0aGUgbG9jay4gSG93ZXZlciwgdGhlIGxvY2sgY2FuIGJlCisgICAgLy8gcmUtZW5hYmxlZCBwcmlvciB0byBwcmV2aWV3IGJlaW5nIHJlLXN0YXJ0ZWQsIHRvIGtlZXAgdGhlCisgICAgLy8gZXhwb3N1cmUgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGxvY2suIEluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAvLyBleHBvc3VyZSBjb21wZW5zYXRpb24sIHRoaXMgYWxsb3dzIGZvciBjYXB0dXJpbmcgbXVsdGktZXhwb3N1cmUKKyAgICAvLyBicmFja2V0cyB3aXRoIGtub3duIHJlbGF0aXZlIGV4cG9zdXJlIHZhbHVlcy4gTG9ja2luZworICAgIC8vIGF1dG8tZXhwb3N1cmUgYWZ0ZXIgb3BlbiBidXQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvCisgICAgLy8gc3RhcnRQcmV2aWV3IG1heSByZXN1bHQgaW4gc2V2ZXJlbHkgb3Zlci0gb3IgdW5kZXItZXhwb3NlZAorICAgIC8vIGltYWdlcy4gIFRoZSBkcml2ZXIgbWF5IGluZGVwZW5kZW50bHkgZW5hYmxlIHRoZSBBRSBsb2NrIGFmdGVyCisgICAgLy8gYXV0by1mb2N1cyBjb21wbGV0ZXMuIElmIGl0IGRvZXMgc28sIHRoaXMga2V5IG11c3QgaGF2ZSBpdHMKKyAgICAvLyB2YWx1ZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGxvY2sncyBleGlzdGVuY2UuIEFwcGxpY2F0aW9ucyBhcmUKKyAgICAvLyBmcmVlIHRvIHJlbGVhc2Ugc3VjaCBhIGxvY2ssIHRvIHJlLWVuYWJsZSBBRSB3aXRob3V0IHJlc3RhcnRpbmcKKyAgICAvLyBwcmV2aWV3LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9BVVRPX0VYUE9TVVJFX0xPQ0tbXTsKKyAgICAvLyBXaGV0aGVyIGxvY2tpbmcgdGhlIGF1dG8tZXhwb3N1cmUgaXMgc3VwcG9ydGVkLiAidHJ1ZSIgbWVhbnMgaXQgaXMsIGFuZAorICAgIC8vICJmYWxzZSIgb3IgdGhpcyBrZXkgbm90IGV4aXN0aW5nIG1lYW5zIGl0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0FVVE9fRVhQT1NVUkVfTE9DS19TVVBQT1JURURbXTsKKyAgICAvLyBUaGUgc3RhdGUgb2YgdGhlIGF1dG8td2hpdGUgYmFsYW5jZSBsb2NrLiAidHJ1ZSIgbWVhbnMgdGhhdAorICAgIC8vIGF1dG8td2hpdGUgYmFsYW5jZSBpcyBsb2NrZWQgdG8gaXRzIGN1cnJlbnQgdmFsdWUgYW5kIHdpbGwgbm90CisgICAgLy8gY2hhbmdlLiAiZmFsc2UiIG1lYW5zIHRoZSBhdXRvLXdoaXRlIGJhbGFuY2Ugcm91dGluZSBpcyBmcmVlIHRvCisgICAgLy8gY2hhbmdlIHdoaXRlIGJhbGFuY2UgdmFsdWVzLiBJZiBhdXRvLXdoaXRlIGJhbGFuY2UgaXMgYWxyZWFkeQorICAgIC8vIGxvY2tlZCwgc2V0dGluZyB0aGlzIHRvIHRydWUgYWdhaW4gaGFzIG5vIGVmZmVjdCAodGhlIGRyaXZlcgorICAgIC8vIHdpbGwgbm90IHJlY2FsY3VsYXRlIHdoaXRlIGJhbGFuY2UgdmFsdWVzKS4gU3RvcHBpbmcgcHJldmlldyBvcgorICAgIC8vIHRha2luZyBhIHN0aWxsIGltYWdlIHdpbGwgcmVsZWFzZSB0aGUgbG9jay4gSG93ZXZlciwgdGhlIGxvY2sKKyAgICAvLyBjYW4gYmUgcmUtZW5hYmxlZCBwcmlvciB0byBwcmV2aWV3IGJlaW5nIHJlLXN0YXJ0ZWQsIHRvIGtlZXAKKyAgICAvLyB0aGUgd2hpdGUgYmFsYW5jZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgbG9jay4gSW4gY29uanVuY3Rpb24KKyAgICAvLyB3aXRoIGV4cG9zdXJlIGNvbXBlbnNhdGlvbiwgdGhpcyBhbGxvd3MgZm9yIGNhcHR1cmluZworICAgIC8vIG11bHRpLWV4cG9zdXJlIGJyYWNrZXRzIHdpdGggZml4ZWQgd2hpdGUgYmFsYW5jZS4gTG9ja2luZworICAgIC8vIGF1dG8td2hpdGUgYmFsYW5jZSBhZnRlciBvcGVuIGJ1dCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8KKyAgICAvLyBzdGFydFByZXZpZXcgbWF5IHJlc3VsdCBpbiBzZXZlcmVseSBpbmNvcnJlY3QgY29sb3IuICBUaGUKKyAgICAvLyBkcml2ZXIgbWF5IGluZGVwZW5kZW50bHkgZW5hYmxlIHRoZSBBV0IgbG9jayBhZnRlciBhdXRvLWZvY3VzCisgICAgLy8gY29tcGxldGVzLiBJZiBpdCBkb2VzIHNvLCB0aGlzIGtleSBtdXN0IGhhdmUgaXRzIHZhbHVlIHVwZGF0ZWQKKyAgICAvLyB0byByZWZsZWN0IHRoZSBsb2NrJ3MgZXhpc3RlbmNlLiBBcHBsaWNhdGlvbnMgYXJlIGZyZWUgdG8KKyAgICAvLyByZWxlYXNlIHN1Y2ggYSBsb2NrLCB0byByZS1lbmFibGUgQVdCIHdpdGhvdXQgcmVzdGFydGluZworICAgIC8vIHByZXZpZXcuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0tbXTsKKyAgICAvLyBXaGV0aGVyIGxvY2tpbmcgdGhlIGF1dG8td2hpdGUgYmFsYW5jZSBpcyBzdXBwb3J0ZWQuICJ0cnVlIgorICAgIC8vIG1lYW5zIGl0IGlzLCBhbmQgImZhbHNlIiBvciB0aGlzIGtleSBub3QgZXhpc3RpbmcgbWVhbnMgaXQgaXMKKyAgICAvLyBub3Qgc3VwcG9ydGVkLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9BVVRPX1dISVRFQkFMQU5DRV9MT0NLX1NVUFBPUlRFRFtdOworCisgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1ldGVyaW5nIGFyZWFzIHN1cHBvcnRlZC4gVGhpcyBpcyB0aGUgbWF4aW11bQorICAgIC8vIGxlbmd0aCBvZiBLRVlfTUVURVJJTkdfQVJFQVMuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjAiIG9yICIyIi4gUmVhZCBvbmx5LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTW107CisgICAgLy8gQ3VycmVudCBtZXRlcmluZyBhcmVhcy4gQ2FtZXJhIGRyaXZlciB1c2VzIHRoZXNlIGFyZWFzIHRvIGRlY2lkZQorICAgIC8vIGV4cG9zdXJlLgorICAgIC8vCisgICAgLy8gQmVmb3JlIGFjY2Vzc2luZyB0aGlzIHBhcmFtZXRlciwgYXBwcyBzaG91bGQgY2hlY2sKKyAgICAvLyBLRVlfTUFYX05VTV9NRVRFUklOR19BUkVBUyBmaXJzdCB0byBrbm93IHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXRlcmluZworICAgIC8vIGFyZWFzIGZpcnN0LiBJZiB0aGUgdmFsdWUgaXMgMCwgbWV0ZXJpbmcgYXJlYSBpcyBub3Qgc3VwcG9ydGVkLgorICAgIC8vCisgICAgLy8gRWFjaCBtZXRlcmluZyBhcmVhIGlzIGEgcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIHdlaWdodC4gVGhlIGRpcmVjdGlvbiBpcworICAgIC8vIHJlbGF0aXZlIHRvIHRoZSBzZW5zb3Igb3JpZW50YXRpb24sIHRoYXQgaXMsIHdoYXQgdGhlIHNlbnNvciBzZWVzLiBUaGUKKyAgICAvLyBkaXJlY3Rpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSByb3RhdGlvbiBvciBtaXJyb3Jpbmcgb2YKKyAgICAvLyBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OLiBDb29yZGluYXRlcyBvZiB0aGUgcmVjdGFuZ2xlIHJhbmdlCisgICAgLy8gZnJvbSAtMTAwMCB0byAxMDAwLiAoLTEwMDAsIC0xMDAwKSBpcyB0aGUgdXBwZXIgbGVmdCBwb2ludC4gKDEwMDAsIDEwMDApCisgICAgLy8gaXMgdGhlIGxvd2VyIHJpZ2h0IHBvaW50LiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBtZXRlcmluZyBhcmVhcyBjYW5ub3QKKyAgICAvLyBiZSAwIG9yIG5lZ2F0aXZlLgorICAgIC8vCisgICAgLy8gVGhlIGZpZnRoIGVsZW1lbnQgaXMgdGhlIHdlaWdodC4gVmFsdWVzIGZvciB3ZWlnaHQgbXVzdCByYW5nZSBmcm9tIDEgdG8KKyAgICAvLyAxMDAwLiAgVGhlIHdlaWdodCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwZXItcGl4ZWwgd2VpZ2h0IC0gYWxsCisgICAgLy8gcGl4ZWxzIGluIHRoZSBhcmVhIGhhdmUgdGhlIHNwZWNpZmllZCB3ZWlnaHQuIFRoaXMgbWVhbnMgYSBzbWFsbCBhcmVhCisgICAgLy8gd2l0aCB0aGUgc2FtZSB3ZWlnaHQgYXMgYSBsYXJnZXIgYXJlYSB3aWxsIGhhdmUgbGVzcyBpbmZsdWVuY2Ugb24gdGhlCisgICAgLy8gbWV0ZXJpbmcgdGhhbiB0aGUgbGFyZ2VyIGFyZWEuIE1ldGVyaW5nIGFyZWFzIGNhbiBwYXJ0aWFsbHkgb3ZlcmxhcCBhbmQKKyAgICAvLyB0aGUgZHJpdmVyIHdpbGwgYWRkIHRoZSB3ZWlnaHRzIGluIHRoZSBvdmVybGFwIHJlZ2lvbi4KKyAgICAvLworICAgIC8vIEEgc3BlY2lhbCBjYXNlIG9mIGFsbC16ZXJvIHNpbmdsZSBtZXRlcmluZyBhcmVhIG1lYW5zIGRyaXZlciB0byBkZWNpZGUKKyAgICAvLyB0aGUgbWV0ZXJpbmcgYXJlYS4gRm9yIGV4YW1wbGUsIHRoZSBkcml2ZXIgbWF5IHVzZSBtb3JlIHNpZ25hbHMgdG8gZGVjaWRlCisgICAgLy8gbWV0ZXJpbmcgYXJlYXMgYW5kIGNoYW5nZSB0aGVtIGR5bmFtaWNhbGx5LiBBcHBzIGNhbiBzZXQgYWxsLXplcm8gaWYgdGhleQorICAgIC8vIHdhbnQgdGhlIGRyaXZlciB0byBkZWNpZGUgbWV0ZXJpbmcgYXJlYXMuCisgICAgLy8KKyAgICAvLyBNZXRlcmluZyBhcmVhcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmllbGQgb2YgdmlldyAoS0VZX1pPT00pLgorICAgIC8vIE5vIG1hdHRlciB3aGF0IHRoZSB6b29tIGxldmVsIGlzLCAoLTEwMDAsLTEwMDApIHJlcHJlc2VudHMgdGhlIHRvcCBvZiB0aGUKKyAgICAvLyBjdXJyZW50bHkgdmlzaWJsZSBjYW1lcmEgZnJhbWUuIFRoZSBtZXRlcmluZyBhcmVhIGNhbm5vdCBiZSBzZXQgdG8gYmUKKyAgICAvLyBvdXRzaWRlIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcsIGV2ZW4gd2hlbiB1c2luZyB6b29tLgorICAgIC8vCisgICAgLy8gTm8gbWF0dGVyIHdoYXQgbWV0ZXJpbmcgYXJlYXMgYXJlLCB0aGUgZmluYWwgZXhwb3N1cmUgYXJlIGNvbXBlbnNhdGVkCisgICAgLy8gYnkgS0VZX0VYUE9TVVJFX0NPTVBFTlNBVElPTi4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiKC0xMCwtMTAsMCwwLDMwMCksKDAsMCwxMCwxMCw3MDApIi4gUmVhZC93cml0ZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUVURVJJTkdfQVJFQVNbXTsKICAgICAvLyBDdXJyZW50IHpvb20gdmFsdWUuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjAiIG9yICI2Ii4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfWk9PTVtdOwpAQCAtMzI4LDYgKzQ1NSwxNiBAQAogICAgIC8vIEV4YW1wbGU6ICIxNzZ4MTQ0LDEyODB4NzIwIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfVklERU9fU0laRVNbXTsKIAorICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZXRlY3RlZCBmYWNlcyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgZmFjZQorICAgIC8vIGRldGVjdGlvbi4gSWYgdGhlIHZhbHVlIGlzIDAsIGhhcmR3YXJlIGZhY2UgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8gRXhhbXBsZTogIjUiLiBSZWFkIG9ubHkKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19IV1tdOworCisgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRldGVjdGVkIGZhY2VzIHN1cHBvcnRlZCBieSBzb2Z0d2FyZSBmYWNlCisgICAgLy8gZGV0ZWN0aW9uLiBJZiB0aGUgdmFsdWUgaXMgMCwgc29mdHdhcmUgZmFjZSBkZXRlY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAvLyBFeGFtcGxlOiAiNSIuIFJlYWQgb25seQorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9NQVhfTlVNX0RFVEVDVEVEX0ZBQ0VTX1NXW107CisKICAgICAvLyBQcmVmZXJyZWQgcHJldmlldyBmcmFtZSBzaXplIGluIHBpeGVscyBmb3IgdmlkZW8gcmVjb3JkaW5nLgogICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgb25lIG9mIHRoZSBzdXBwb3J0ZWQgc2l6ZXMgcmV0cmlldmVkCiAgICAgLy8gdmlhIEtFWV9TVVBQT1JURURfUFJFVklFV19TSVpFUy4gVGhpcyBrZXkgY2FuIGJlIHVzZWQgb25seSB3aGVuCkBAIC0zNDcsOCArNDg0LDIwIEBACiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9WSURFT19GUkFNRV9GT1JNQVRbXTsKIAorICAgIC8vIFNldHMgdGhlIGhpbnQgb2YgdGhlIHJlY29yZGluZyBtb2RlLiBJZiB0aGlzIGlzIHRydWUsIE1lZGlhUmVjb3JkZXIuc3RhcnQKKyAgICAvLyBtYXkgYmUgZmFzdGVyIG9yIGhhcyBsZXNzIGdsaXRjaGVzLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nCisgICAgLy8gdGhlIHByZXZpZXcgZm9yIHRoZSBiZXN0IHJlc3VsdC4gQnV0IGl0IGlzIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBoaW50CisgICAgLy8gd2hpbGUgdGhlIHByZXZpZXcgaXMgYWN0aXZlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAvLworICAgIC8vIFRoZSBhcHBzIGNhbiBzdGlsbCBjYWxsIENhbWVyYS50YWtlUGljdHVyZSB3aGVuIHRoZSBoaW50IGlzIHRydWUuIFRoZQorICAgIC8vIGFwcHMgY2FuIGNhbGwgTWVkaWFSZWNvcmRlci5zdGFydCB3aGVuIHRoZSBoaW50IGlzIGZhbHNlLiBCdXQgdGhlCisgICAgLy8gcGVyZm9ybWFuY2UgbWF5IGJlIHdvcnNlLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICJ0cnVlIiBvciAiZmFsc2UiLiBSZWFkL3dyaXRlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9SRUNPUkRJTkdfSElOVFtdOworCiAgICAgLy8gVmFsdWUgZm9yIEtFWV9aT09NX1NVUFBPUlRFRCBvciBLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVELgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFRSVUVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGQUxTRVtdOwogCiAgICAgLy8gVmFsdWUgZm9yIEtFWV9GT0NVU19ESVNUQU5DRVMuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgRk9DVVNfRElTVEFOQ0VfSU5GSU5JVFlbXTsKQEAgLTQyMiw3ICs1NzEsMTEgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIySVtdOyAvLyBZVVkyCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMFBbXTsgLy8gWVYxMgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9SR0I1NjVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfUkdCQTg4ODhbXTsKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfSlBFR1tdOworICAgIC8vIFJhdyBiYXllciBmb3JtYXQgdXNlZCBmb3IgaW1hZ2VzLCB3aGljaCBpcyAxMCBiaXQgcHJlY2lzaW9uIHNhbXBsZXMKKyAgICAvLyBzdG9yZWQgaW4gMTYgYml0IHdvcmRzLiBUaGUgZmlsdGVyIHBhdHRlcm4gaXMgUkdHQi4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfQkFZRVJfUkdHQltdOwogCiAgICAgLy8gVmFsdWVzIGZvciBmb2N1cyBtb2RlIHNldHRpbmdzLgogICAgIC8vIEF1dG8tZm9jdXMgbW9kZS4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggMjM0NGIzZi4uNDAwZDdmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMTAyLDEyICsxMDIsNiBAQAogICAgIC8vIHNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSA9IDA7CiAKLSAgICAvLyByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgdmlkZW8gYnVmZmVycwotICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3QgID0gMDsKLQotICAgIC8vIHJldHVybiB0aGUgaW5kaXZpZHVhbCB2aWRlbyBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZ2V0VmlkZW9CdWZmZXIoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOwotCiAgICAgLy8gdGVsbCB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSBtZXRhIGRhdGEgb3IgcmVhbCBZVVYgZGF0YSBpbiB2aWRlbyBidWZmZXJzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoYm9vbCBlbmFibGVkKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYUNsaWVudC5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYUNsaWVudC5oCmluZGV4IDIzNmQwZjYuLmIzMGFhN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFDbGllbnQuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsNyArMzIsOCBAQAogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhQ2xpZW50KTsKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGEpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhYzI4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFfUkVDT1JESU5HX1BST1hZX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JQ0FNRVJBX1JFQ09SRElOR19QUk9YWV9ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjsKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBQYXJjZWw7CisKKy8qCisgKiBUaGUgcHVycG9zZSBvZiBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgYW5kIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyIGlzIHRvCisgKiBhbGxvdyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGNhbWVyYSBkdXJpbmcgcmVjb3JkaW5nLgorICoKKyAqIENhbWVyYSBzZXJ2aWNlIGFsbG93cyBvbmx5IG9uZSBjbGllbnQgYXQgYSB0aW1lLiBTaW5jZSBjYW1jb3JkZXIgYXBwbGljYXRpb24KKyAqIG5lZWRzIHRvIG93biB0aGUgY2FtZXJhIHRvIGRvIHRoaW5ncyBsaWtlIHpvb20sIHRoZSBtZWRpYSByZWNvcmRlciBjYW5ub3QKKyAqIGFjY2VzcyB0aGUgY2FtZXJhIGRpcmVjdGx5IGR1cmluZyByZWNvcmRpbmcuIFNvIElDYW1lcmFSZWNvcmRpbmdQcm94eSBpcyBhCisgKiBwcm94eSBvZiBJQ2FtZXJhLCB3aGljaCBhbGxvd3MgdGhlIG1lZGlhIHJlY29yZGVyIHRvIHN0YXJ0L3N0b3AgdGhlIHJlY29yZGluZworICogYW5kIHJlbGVhc2UgcmVjb3JkaW5nIGZyYW1lcy4gSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgaXMgYW4gaW50ZXJmYWNlCisgKiB0aGF0IGFsbG93cyB0aGUgcmVjb3JkZXIgdG8gcmVjZWl2ZSB2aWRlbyBmcmFtZXMgZHVyaW5nIHJlY29yZGluZy4KKyAqCisgKiBJQ2FtZXJhUmVjb3JkaW5nUHJveHkKKyAqICAgc3RhcnRSZWNvcmRpbmcoKQorICogICBzdG9wUmVjb3JkaW5nKCkKKyAqICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkKKyAqCisgKiBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcgorICogICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorCisgKiBUaGUgY2FtY29yZGVyIGFwcCBvcGVucyB0aGUgY2FtZXJhIGFuZCBzdGFydHMgdGhlIHByZXZpZXcuIFRoZSBhcHAgcGFzc2VzCisgKiBJQ2FtZXJhIGFuZCBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgdG8gdGhlIG1lZGlhIHJlY29yZGVyIGJ5CisgKiBNZWRpYVJlY29yZGVyOjpzZXRDYW1lcmEoKS4gVGhlIHJlY29yZGVyIHVzZXMgSUNhbWVyYSB0byBzZXR1cCB0aGUgY2FtZXJhIGluCisgKiBNZWRpYVJlY29yZGVyOjpzdGFydCgpLiBBZnRlciBzZXR1cCwgdGhlIHJlY29yZGVyIGRpc2Nvbm5lY3RzIGZyb20gY2FtZXJhCisgKiBzZXJ2aWNlLiBUaGUgcmVjb3JkZXIgY2FsbHMgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZygpIGFuZAorICogcGFzc2VzIGEgSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgdG8gdGhlIGFwcC4gVGhlIGFwcCBjb25uZWN0cyBiYWNrIHRvCisgKiBjYW1lcmEgc2VydmljZSBhbmQgc3RhcnRzIHRoZSByZWNvcmRpbmcuIFRoZSBhcHAgb3ducyB0aGUgY2FtZXJhIGFuZCBjYW4gZG8KKyAqIHRoaW5ncyBsaWtlIHpvb20uIFRoZSBtZWRpYSByZWNvcmRlciByZWNlaXZlcyB0aGUgdmlkZW8gZnJhbWVzIGZyb20gdGhlCisgKiBsaXN0ZW5lciBhbmQgcmVsZWFzZXMgdGhlbSBieSBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZS4KKyAqIFRoZSByZWNvcmRlciBjYWxscyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0b3BSZWNvcmRpbmcoKSB0byBzdG9wIHRoZQorICogcmVjb3JkaW5nLgorICoKKyAqIFRoZSBjYWxsIHNlcXVlbmNlcyBhcmUgYXMgZm9sbG93czoKKyAqIDEuIFRoZSBhcHA6IENhbWVyYS51bmxvY2soKS4KKyAqIDIuIFRoZSBhcHA6IE1lZGlhUmVjb3JkZXIuc2V0Q2FtZXJhKCkuCisgKiAzLiBTdGFydCByZWNvcmRpbmcKKyAqICAgICgxKSBUaGUgYXBwOiBNZWRpYVJlY29yZGVyLnN0YXJ0KCkuCisgKiAgICAoMikgVGhlIHJlY29yZGVyOiBJQ2FtZXJhLnVubG9jaygpIGFuZCBJQ2FtZXJhLmRpc2Nvbm5lY3QoKS4KKyAqICAgICgzKSBUaGUgcmVjb3JkZXI6IElDYW1lcmFSZWNvcmRpbmdQcm94eS5zdGFydFJlY29yZGluZygpLgorICogICAgKDQpIFRoZSBhcHA6IElDYW1lcmEucmVjb25uZWN0KCkuCisgKiAgICAoNSkgVGhlIGFwcDogSUNhbWVyYS5zdGFydFJlY29yZGluZygpLgorICogNC4gRHVyaW5nIHJlY29yZGluZworICogICAgKDEpIFRoZSByZWNvcmRlcjogcmVjZWl2ZSBmcmFtZXMgZnJvbSBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorICogICAgKDIpIFRoZSByZWNvcmRlcjogcmVsZWFzZSBmcmFtZXMgYnkgSUNhbWVyYVJlY29yZGluZ1Byb3h5LnJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpLgorICogNS4gU3RvcCByZWNvcmRpbmcKKyAqICAgICgxKSBUaGUgYXBwOiBNZWRpYVJlY29yZGVyLnN0b3AoKQorICogICAgKDIpIFRoZSByZWNvcmRlcjogSUNhbWVyYVJlY29yZGluZ1Byb3h5LnN0b3BSZWNvcmRpbmcoKS4KKyAqICAgICgzKSBUaGUgYXBwOiBJQ2FtZXJhLnN0b3BSZWNvcmRpbmcoKS4KKyAqLworCitjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFSZWNvcmRpbmdQcm94eSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFJlY29yZGluZygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5OiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNhbWVyYVJlY29yZGluZ1Byb3h5PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmMwNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lDQU1FUkFfUkVDT1JESU5HX1BST1hZX0xJU1RFTkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JQ0FNRVJBX1JFQ09SRElOR19QUk9YWV9MSVNURU5FUl9ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXJjZWw7CitjbGFzcyBJTWVtb3J5OworCitjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIpOworCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGEpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUluZm9FdmVudC5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKaW5kZXggYWRkMzNkMy4uZGZjYTIyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgICAgKiBAcGFyYW1baW5dIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KICAgICAgKiBAcGFyYW1baW5dIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmlwdGlvbgogICAgICAqLwotICAgIERybUluZm9FdmVudChpbnQgdW5pcXVlSWQsIGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWVzc2FnZSk7CisgICAgRHJtSW5mb0V2ZW50KGludCB1bmlxdWVJZCwgaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4IG1lc3NhZ2UpOwogCiAgICAgLyoqCiAgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mb0V2ZW50CkBAIC0xMDQsMTIgKzEwNCwxMiBAQAogICAgICAqCiAgICAgICogQHJldHVybiBNZXNzYWdlIGRlc2NyaXB0aW9uCiAgICAgICovCi0gICAgY29uc3QgU3RyaW5nOCYgZ2V0TWVzc2FnZSgpIGNvbnN0OworICAgIGNvbnN0IFN0cmluZzggZ2V0TWVzc2FnZSgpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIGludCBtVW5pcXVlSWQ7CiAgICAgaW50IG1JbmZvVHlwZTsKLSAgICBjb25zdCBTdHJpbmc4JiBtTWVzc2FnZTsKKyAgICBjb25zdCBTdHJpbmc4IG1NZXNzYWdlOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAppbmRleCA3YTBiZjRmLi5iOGZlNDZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KICAgICAgKi8KLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAKICAgICAvKioKICAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgogICAgICAqLwotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihjb25zdCBjaGFyKiB1cmkpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihjb25zdCBjaGFyKiB1cmkpOwogCiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZQpAQCAtODcsNyArODcsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlKTsKIAogICAgIC8qKgogICAgICAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUuCiAgICAgICogICAgIEluIGNhc2UgbGljZW5zZSBoYXMgYmVlbiBleHBpcmVkLCBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVEIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICovCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICAvKioKICAgICAgKiBJbmZvcm1zIHRoZSBEUk0gZW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgpAQCAtMTEzLDcgKzExMyw4IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtMTI1LDcgKzEyNiw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCiAgICAgLyoqCiAgICAgICogRGVjcnlwdCB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgYnVmZmVycyBmb3IgdGhlIGdpdmVuIHVuaXQKQEAgLTE0NCw3ICsxNDUsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KICAgICBzdGF0dXNfdCBkZWNyeXB0KAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWID0gTlVMTCk7CiAKICAgICAvKioKQEAgLTE1NSw3ICsxNTYsOCBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC0xNjcsNyArMTY5LDggQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgc3NpemVfdCBwcmVhZChEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzc2l6ZV90IHByZWFkKHNwPERlY3J5cHRIYW5kbGU+ICZkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaCBiL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKaW5kZXggOTA1N2Y5OC4uMjYzMmNiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKQEAgLTI1NSw3ICsyNTYsNyBAQAogLyoqCiAgKiBEZWZpbmVzIGRlY3J5cHRpb24gaGFuZGxlCiAgKi8KLWNsYXNzIERlY3J5cHRIYW5kbGUgeworY2xhc3MgRGVjcnlwdEhhbmRsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICAvKioKICAgICAgKiBEZWNyeXB0aW9uIHNlc3Npb24gSGFuZGxlCkBAIC0zMTEsMTAgKzMxMiwxNSBAQAogICAgICAgICAgICAgZGVjcnlwdElkKElOVkFMSURfVkFMVUUpLAogICAgICAgICAgICAgbWltZVR5cGUoIiIpLAogICAgICAgICAgICAgZGVjcnlwdEFwaVR5cGUoSU5WQUxJRF9WQUxVRSksCi0gICAgICAgICAgICBzdGF0dXMoSU5WQUxJRF9WQUxVRSkgeworICAgICAgICAgICAgc3RhdHVzKElOVkFMSURfVkFMVUUpLAorICAgICAgICAgICAgZGVjcnlwdEluZm8oTlVMTCkgewogCiAgICAgfQogCisgICAgfkRlY3J5cHRIYW5kbGUoKSB7CisgICAgICAgIGRlbGV0ZSBkZWNyeXB0SW5mbzsgZGVjcnlwdEluZm8gPSBOVUxMOworICAgIH0KKwogICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlY3J5cHRIYW5kbGUmIGhhbmRsZSkgY29uc3QgewogICAgICAgICByZXR1cm4gKGRlY3J5cHRJZCA8IGhhbmRsZS5kZWNyeXB0SWQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBjZGEyYmUwLi4xNDE3NDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0yMSw5ICsyMSwxMCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC00NCw1MCArNDUsNiBAQAogcHVibGljOgogCiAgICAgLyoKLSAgICAgKiAgU3RhdGljIG1ldGhvZHMgZm9yIGVmZmVjdCBsaWJyYXJpZXMgbWFuYWdlbWVudC4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogICBMb2FkcyB0aGUgZWZmZWN0IGxpYnJhcnkgd2hpY2ggcGF0aCBpcyBnaXZlbiBhcyBmaXJzdCBhcmd1bWVudC4KLSAgICAgKiAgIFRoaXMgbXVzdCBiZSB0aGUgZnVsbCBwYXRoIG9mIGEgZHluYW1pYyBsaWJyYXJ5ICguc28pIGltcGxlbWVudGluZyBvbmUgb3IKLSAgICAgKiAgIG1vcmUgZWZmZWN0IGVuZ2luZXMgYW5kIGV4cG9zaW5nIHRoZSBlZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluCi0gICAgICogICBFZmZlY3RBcGkuaC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBoYW5kbGUgb24gdGhlIGxpYnJhcnkgZm9yIHVzZSBieQotICAgICAqICAgZnVydGhlciBjYWxsIHRvIHVubG9hZEVmZmVjdExpYnJhcnkoKSB0byB1bmxvYWQgdGhlIGxpYnJhcnkuCi0gICAgICoKLSAgICAgKiAgIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgbGliUGF0aDogICAgZnVsbCBwYXRoIG9mIHRoZSBkeW5hbWljIGxpYnJhcnkgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gICAgICogICAgICAgICAgaGFuZGxlOiAgICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGxpYnJhcnkgaGFuZGxlCi0gICAgICoKLSAgICAgKiAgIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgotICAgICAqICAgICAgICAgIE5PX0VSUk9SICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotICAgICAqICAgICAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZSBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBjb25maWd1cmUgYXVkaW8KLSAgICAgKiAgICAgICAgICBOT19JTklUICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbnMKLSAgICAgKiAgICAgICAgICBCQURfVkFMVUUgICBpbnZhbGlkIGxpYlBhdGggc3RyaW5nIG9yIGhhbmRsZQotICAgICAqCi0gICAgICogICBSZXR1cm5lZCB2YWx1ZToKLSAgICAgKiAgICAgICAgICAqaGFuZGxlIHVwZGF0ZWQgd2l0aCBsaWJyYXJ5IGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSk7Ci0KLSAgICAvKgotICAgICAqICAgVW5sb2FkcyB0aGUgZWZmZWN0IGxpYnJhcnkgd2hpY2ggaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogICBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIGhhbmRsZTogbGlicmFyeSBoYW5kbGUKLSAgICAgKgotICAgICAqICAgUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgICogICAgICAgICAgTk9fRVJST1IgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNvbmZpZ3VyZSBhdWRpbwotICAgICAqICAgICAgICAgIE5PX0lOSVQgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIEJBRF9WQUxVRSAgIGludmFsaWQgaGFuZGxlCi0gICAgICovCi0gICAgc3RhdGljIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSk7Ci0KLSAgICAvKgogICAgICAqICBTdGF0aWMgbWV0aG9kcyBmb3IgZWZmZWN0cyBlbnVtZXJhdGlvbi4KICAgICAgKi8KIApAQCAtMTU1LDYgKzExMiwzNiBAQAogCiAKICAgICAvKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRlc2NyaXB0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZSBwcm9jZXNzaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgKiBvbiBhbiBBdWRpb1JlY29yZCB3aXRoIHRoZSBzdXBwbGllZCBhdWRpbyBzZXNzaW9uIElELgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGF1ZGlvU2Vzc2lvbjogIGF1ZGlvIHNlc3Npb24gSUQuCisgICAgICogICAgICBkZXNjcmlwdG9yczogYWRkcmVzcyB3aGVyZSB0aGUgZWZmZWN0IGRlc2NyaXB0b3JzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKiAgICAgIGNvdW50OiBhcyBpbnB1dCwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRlc2NyaXB0b3IgdGhhbiBzaG91bGQgYmUgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgICBhcyBvdXRwdXQsIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciByZXR1cm5lZCBpZiBzdGF0dXMgaXMgTk9fRVJST1Igb3IgdGhlIGFjdHVhbAorICAgICAqICAgICAgICAgICAgIG51bWJlciBvZiBlbmFibGVkIHByZSBwcm9jZXNzaW5ncyBpZiBzdGF0dXMgaXMgTk9fTUVNT1JZCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIE5PX01FTU9SWSAgICAgICB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3IgdG8gcmV0dXJuIGlzIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgY291bnQuCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgYXVkaW8gc2Vzc2lvbiBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmRlc2NyaXB0b3IgdXBkYXRlZCB3aXRoIGRlc2NyaXB0b3JzIG9mIHByZSBwcm9jZXNzaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgKiAgICpjb3VudCAgICAgIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZXR1cm5lZCBpZiByZXR1cm5lZCBzdGF0dXMgaXMgTl9FUlJPUi4KKyAgICAgKiAgICAgICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBwcmUgcHJvY2Vzc2luZyBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgcmV0dXJuZWQgc3RhdHVzIGlzCisgICAgICogICAgICAgICAgICAgICBOT19NRU1PUlkuIFRoaXMgaGFwcGVucyBpZiB0aGUgY291bnQgcGFzc2VkIGFzIGlucHV0IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyCisgICAgICogICAgICAgICAgICAgICBvZiBkZXNjcmlwdG9ycyB0byByZXR1cm4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisKKyAgICAvKgogICAgICAqIEV2ZW50cyB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uIChlZmZlY3RfY2FsbGJhY2tfdCkuCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKQEAgLTIzMiw3ICsyMTksNyBAQAogICAgICAqIHNlc3Npb25JRDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uIElmIDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KICAgICAgKiAgICAgIHRoZSBvdXRwdXQgbWl4LiBJZiBub3QgMCwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KLSAgICAgKiBvdXRwdXQ6ICBIQUwgYXVkaW8gb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGVmZmVjdCBtdXN0IGJlIGF0dGFjaGVkLiBMZWF2ZSBhdCAwIGZvcgorICAgICAqIGlvOiAgSEFMIGF1ZGlvIG91dHB1dCBvciBpbnB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBlZmZlY3QgbXVzdCBiZSBhdHRhY2hlZC4gTGVhdmUgYXQgMCBmb3IKICAgICAgKiAgICAgIGF1dG9tYXRpYyBvdXRwdXQgc2VsZWN0aW9uIGJ5IEF1ZGlvRmxpbmdlci4KICAgICAgKi8KIApAQCAtMjQyLDcgKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSAwLAogICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCiAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDAKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAogICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMjU0LDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IDAsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IDAKICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTI3Niw3ICsyNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKQEAgLTI5OCw3ICsyODUsNyBAQAogICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCAgICAgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KIAotICAgIC8qIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgZWZmZWN0IChzZWUgZWZmZWN0X2Rlc2NyaXB0b3JfdCBpbiBFZmZlY3RBcGkuaCkuCisgICAgLyogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlZmZlY3QgKHNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGluIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKi8KICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcigpIGNvbnN0OwogCkBAIC0zMjQsNyArMzExLDcgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCkBAIC0zNDAsNyArMzI3LDcgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIGF1ZGlvX2VmZmVjdC5oKS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KQEAgLTM2OCw3ICszNTUsNyBAQAogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKiAgICAgICAgICBhbmQgdGhlIHJldHVybmVkIHZhbHVlIChTZWUgYXVkaW9fZWZmZWN0LmgpLgogICAgICAqCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgpAQCAtMzc5LDcgKzM2Niw3IEBACiAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICBnZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKIAogICAgICAvKiBTZW5kcyBhIGNvbW1hbmQgYW5kIHJlY2VpdmVzIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgICAgKiAgICAgU2VlIEVmZmVjdEFwaS5oIGZvciBkZXRhaWxzIG9uIGVmZmVjdCBjb21tYW5kKCkgZnVuY3Rpb24sIHZhbGlkIGNvbW1hbmQgY29kZXMKKyAgICAgICogICAgIFNlZSBhdWRpb19lZmZlY3QuaCBmb3IgZGV0YWlscyBvbiBlZmZlY3QgY29tbWFuZCgpIGZ1bmN0aW9uLCB2YWxpZCBjb21tYW5kIGNvZGVzCiAgICAgICAqICAgICBhbmQgZm9ybWF0cy4KICAgICAgICovCiAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUEFSQU1FVEVSX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9QQVJBTUVURVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUGFyYW1ldGVyIHsKKworcHVibGljOgorICAgIEF1ZGlvUGFyYW1ldGVyKCkge30KKyAgICBBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BhcmFtZXRlcigpOworCisgICAgLy8gcmVzZXJ2ZWQgcGFyYW1ldGVyIGtleXMgZm9yIGNoYW5naW5nIHN0YW5kYXJkIHBhcmFtZXRlcnMgd2l0aCBzZXRQYXJhbWV0ZXJzKCkgZnVuY3Rpb24uCisgICAgLy8gVXNpbmcgdGhlc2Uga2V5cyBpcyBtYW5kYXRvcnkgZm9yIEF1ZGlvRmxpbmdlciB0byBwcm9wZXJseSBtb25pdG9yIGF1ZGlvIG91dHB1dC9pbnB1dAorICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIC8vICBrZXlSb3V0aW5nOiB0byBjaGFuZ2UgYXVkaW8gcm91dGluZywgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAorICAgIC8vICBrZXlTYW1wbGluZ1JhdGU6IHRvIGNoYW5nZSBzYW1wbGluZyByYXRlIHJvdXRpbmcsIHZhbHVlIGlzIGFuIGludAorICAgIC8vICBrZXlGb3JtYXQ6IHRvIGNoYW5nZSBhdWRpbyBmb3JtYXQsIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19mb3JtYXRfdAorICAgIC8vICBrZXlDaGFubmVsczogdG8gY2hhbmdlIGF1ZGlvIGNoYW5uZWwgY29uZmlndXJhdGlvbiwgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2NoYW5uZWxzX3QKKyAgICAvLyAga2V5RnJhbWVDb3VudDogdG8gY2hhbmdlIGF1ZGlvIG91dHB1dCBmcmFtZSBjb3VudCwgdmFsdWUgaXMgYW4gaW50CisgICAgLy8gIGtleUlucHV0U291cmNlOiB0byBjaGFuZ2UgYXVkaW8gaW5wdXQgc291cmNlLCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fc291cmNlX3QKKyAgICAvLyAgICAgKGRlZmluZWQgaW4gbWVkaWEvbWVkaWFyZWNvcmRlci5oKQorICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlSb3V0aW5nOworICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlTYW1wbGluZ1JhdGU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZvcm1hdDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa2V5Q2hhbm5lbHM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUZyYW1lQ291bnQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUlucHV0U291cmNlOworCisgICAgU3RyaW5nOCB0b1N0cmluZygpOworCisgICAgc3RhdHVzX3QgYWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworICAgIHN0YXR1c190IGFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSk7CisgICAgc3RhdHVzX3QgYWRkRmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBmbG9hdCB2YWx1ZSk7CisKKyAgICBzdGF0dXNfdCByZW1vdmUoY29uc3QgU3RyaW5nOCYga2V5KTsKKworICAgIHN0YXR1c190IGdldChjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKKyAgICBzdGF0dXNfdCBnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKTsKKyAgICBzdGF0dXNfdCBnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSk7CisgICAgc3RhdHVzX3QgZ2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKTsKKworICAgIHNpemVfdCBzaXplKCkgeyByZXR1cm4gbVBhcmFtZXRlcnMuc2l6ZSgpOyB9CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKKyAgICBLZXllZFZlY3RvciA8U3RyaW5nOCwgU3RyaW5nOD4gbVBhcmFtZXRlcnM7Cit9OworCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvKkFORFJPSURfQVVESU9QQVJBTUVURVJfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDI5Mzc2NGQuLjYwNTY4MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEyNyw5ICsxMjgsOSBAQAogICAgICAqCiAgICAgICogaW5wdXRTb3VyY2U6ICAgICAgICBTZWxlY3QgdGhlIGF1ZGlvIGlucHV0IHRvIHJlY29yZCB0byAoZS5nLiBBVURJT19TT1VSQ0VfREVGQVVMVCkuCiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6LgotICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQgZm9yIHNpZ25lZAorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsczogICAgICAgICAgIENoYW5uZWwgbWFzazogc2VlIEF1ZGlvU3lzdGVtOjphdWRpb19jaGFubmVscy4KKyAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBUb3RhbCBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4KICAgICAgKiBmbGFnczogICAgICAgICAgICAgIEEgYml0bWFzayBvZiBhY291c3RpYyB2YWx1ZXMgZnJvbSBlbnVtIHJlY29yZF9mbGFncy4gIEl0IGVuYWJsZXMKQEAgLTE0MiwxNSArMTQzLDE1IEBACiAgICAgICovCiAKICAgICAgZW51bSByZWNvcmRfZmxhZ3MgewotICAgICAgICAgUkVDT1JEX0FHQ19FTkFCTEUgPSBBdWRpb1N5c3RlbTo6QUdDX0VOQUJMRSwKLSAgICAgICAgIFJFQ09SRF9OU19FTkFCTEUgID0gQXVkaW9TeXN0ZW06Ok5TX0VOQUJMRSwKLSAgICAgICAgIFJFQ09SRF9JSVJfRU5BQkxFID0gQXVkaW9TeXN0ZW06OlRYX0lJUl9FTkFCTEUKKyAgICAgICAgIFJFQ09SRF9BR0NfRU5BQkxFID0gQVVESU9fSU5fQUNPVVNUSUNTX0FHQ19FTkFCTEUsCisgICAgICAgICBSRUNPUkRfTlNfRU5BQkxFICA9IEFVRElPX0lOX0FDT1VTVElDU19OU19FTkFCTEUsCisgICAgICAgICBSRUNPUkRfSUlSX0VOQUJMRSA9IEFVRElPX0lOX0FDT1VTVElDU19UWF9JSVJfRU5BQkxFLAogICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSAwLApAQCAtMTc2LDcgKzE3Nyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IGlucHV0U291cmNlICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKQEAgLTM0Nyw4ICszNDgsOCBAQAogCiAgICAgICAgICAgICBib29sIHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxDbGllbnRSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwpAQCAtMzYzLDEwICszNjQsMTAgQEAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVJlc2VydmVkWzJdOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKQEAgLTM4MSw3ICszODIsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCAyZGM0YmViLi5mMjBlMjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMSwxMCArMjEsMTUgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorCisvKiBYWFg6IFNob3VsZCBiZSBpbmNsdWRlIGJ5IGFsbCB0aGUgdXNlcnMgaW5zdGVhZCAqLworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7Ci10eXBlZGVmIGludCBhdWRpb19pb19oYW5kbGVfdDsKIAogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZTsKIGNsYXNzIFN0cmluZzg7CkBAIC0zMywxNTEgKzM4LDYgQEAKIHsKIHB1YmxpYzoKIAotICAgIGVudW0gc3RyZWFtX3R5cGUgewotICAgICAgICBERUZBVUxUICAgICAgICAgID0tMSwKLSAgICAgICAgVk9JQ0VfQ0FMTCAgICAgICA9IDAsCi0gICAgICAgIFNZU1RFTSAgICAgICAgICAgPSAxLAotICAgICAgICBSSU5HICAgICAgICAgICAgID0gMiwKLSAgICAgICAgTVVTSUMgICAgICAgICAgICA9IDMsCi0gICAgICAgIEFMQVJNICAgICAgICAgICAgPSA0LAotICAgICAgICBOT1RJRklDQVRJT04gICAgID0gNSwKLSAgICAgICAgQkxVRVRPT1RIX1NDTyAgICA9IDYsCi0gICAgICAgIEVORk9SQ0VEX0FVRElCTEUgPSA3LCAvLyBTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdCBiZSByb3V0ZWQgdG8gc3BlYWtlcgotICAgICAgICBEVE1GICAgICAgICAgICAgID0gOCwKLSAgICAgICAgVFRTICAgICAgICAgICAgICA9IDksCi0gICAgICAgIE5VTV9TVFJFQU1fVFlQRVMKLSAgICB9OwotCi0gICAgLy8gQXVkaW8gc3ViIGZvcm1hdHMgKHNlZSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0KS4KLSAgICBlbnVtIHBjbV9zdWJfZm9ybWF0IHsKLSAgICAgICAgUENNX1NVQl8xNl9CSVQgICAgICAgICAgPSAweDEsIC8vIG11c3QgYmUgMSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBQQ01fU1VCXzhfQklUICAgICAgICAgICA9IDB4MiwgLy8gbXVzdCBiZSAyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgfTsKLQotICAgIC8vIE1QMyBzdWIgZm9ybWF0IGZpZWxkIGRlZmluaXRpb24gOiBjYW4gdXNlIDExIExTQnMgaW4gdGhlIHNhbWUgd2F5IGFzIE1QMyBmcmFtZSBoZWFkZXIgdG8gc3BlY2lmeQotICAgIC8vIGJpdCByYXRlLCBzdGVyZW8gbW9kZSwgdmVyc2lvbi4uLgotICAgIGVudW0gbXAzX3N1Yl9mb3JtYXQgewotICAgICAgICAvL1RPRE8KLSAgICB9OwotCi0gICAgLy8gQU1SIE5CL1dCIHN1YiBmb3JtYXQgZmllbGQgZGVmaW5pdGlvbjogc3BlY2lmeSBmcmFtZSBibG9jayBpbnRlcmxlYXZpbmcsIGJhbmR3aWR0aCBlZmZpY2llbnQgb3Igb2N0ZXQgYWxpZ25lZCwKLSAgICAvLyBlbmNvZGluZyBtb2RlIGZvciByZWNvcmRpbmcuLi4KLSAgICBlbnVtIGFtcl9zdWJfZm9ybWF0IHsKLSAgICAgICAgLy9UT0RPCi0gICAgfTsKLQotICAgIC8vIEFBQyBzdWIgZm9ybWF0IGZpZWxkIGRlZmluaXRpb246IHNwZWNpZnkgcHJvZmlsZSBvciBiaXRyYXRlIGZvciByZWNvcmRpbmcuLi4KLSAgICBlbnVtIGFhY19zdWJfZm9ybWF0IHsKLSAgICAgICAgLy9UT0RPCi0gICAgfTsKLQotICAgIC8vIFZPUkJJUyBzdWIgZm9ybWF0IGZpZWxkIGRlZmluaXRpb246IHNwZWNpZnkgcXVhbGl0eSBmb3IgcmVjb3JkaW5nLi4uCi0gICAgZW51bSB2b3JiaXNfc3ViX2Zvcm1hdCB7Ci0gICAgICAgIC8vVE9ETwotICAgIH07Ci0KLSAgICAvLyBBdWRpbyBmb3JtYXQgY29uc2lzdHMgaW4gYSBtYWluIGZvcm1hdCBmaWVsZCAodXBwZXIgOCBiaXRzKSBhbmQgYSBzdWIgZm9ybWF0IGZpZWxkIChsb3dlciAyNCBiaXRzKS4KLSAgICAvLyBUaGUgbWFpbiBmb3JtYXQgaW5kaWNhdGVzIHRoZSBtYWluIGNvZGVjIHR5cGUuIFRoZSBzdWIgZm9ybWF0IGZpZWxkIGluZGljYXRlcyBvcHRpb25zIGFuZCBwYXJhbWV0ZXJzCi0gICAgLy8gZm9yIGVhY2ggZm9ybWF0LiBUaGUgc3ViIGZvcm1hdCBpcyBtYWlubHkgdXNlZCBmb3IgcmVjb3JkIHRvIGluZGljYXRlIGZvciBpbnN0YW5jZSB0aGUgcmVxdWVzdGVkIGJpdHJhdGUKLSAgICAvLyBvciBwcm9maWxlLiBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBjZXJ0YWluIGZvcm1hdHMgdG8gZ2l2ZSBpbmZvcm1hdGlvbnMgbm90IHByZXNlbnQgaW4gdGhlIGVuY29kZWQKLSAgICAvLyBhdWRpbyBzdHJlYW0gKGUuZy4gb2N0ZXQgYWxpZ25lbWVudCBmb3IgQU1SKS4KLSAgICBlbnVtIGF1ZGlvX2Zvcm1hdCB7Ci0gICAgICAgIElOVkFMSURfRk9STUFUICAgICAgPSAtMSwKLSAgICAgICAgRk9STUFUX0RFRkFVTFQgICAgICA9IDAsCi0gICAgICAgIFBDTSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAvLyBtdXN0IGJlIDAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgTVAzICAgICAgICAgICAgICAgICA9IDB4MDEwMDAwMDAsCi0gICAgICAgIEFNUl9OQiAgICAgICAgICAgICAgPSAweDAyMDAwMDAwLAotICAgICAgICBBTVJfV0IgICAgICAgICAgICAgID0gMHgwMzAwMDAwMCwKLSAgICAgICAgQUFDICAgICAgICAgICAgICAgICA9IDB4MDQwMDAwMDAsCi0gICAgICAgIEhFX0FBQ19WMSAgICAgICAgICAgPSAweDA1MDAwMDAwLAotICAgICAgICBIRV9BQUNfVjIgICAgICAgICAgID0gMHgwNjAwMDAwMCwKLSAgICAgICAgVk9SQklTICAgICAgICAgICAgICA9IDB4MDcwMDAwMDAsCi0gICAgICAgIE1BSU5fRk9STUFUX01BU0sgICAgPSAweEZGMDAwMDAwLAotICAgICAgICBTVUJfRk9STUFUX01BU0sgICAgID0gMHgwMEZGRkZGRiwKLSAgICAgICAgLy8gQWxpYXNlcwotICAgICAgICBQQ01fMTZfQklUICAgICAgICAgID0gKFBDTXxQQ01fU1VCXzE2X0JJVCksCi0gICAgICAgIFBDTV84X0JJVCAgICAgICAgICA9IChQQ018UENNX1NVQl84X0JJVCkKLSAgICB9OwotCi0KLSAgICAvLyBDaGFubmVsIG1hc2sgZGVmaW5pdGlvbnMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBKQVZBIHZhbHVlcyBpbiAvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEKLSAgICBlbnVtIGF1ZGlvX2NoYW5uZWxzIHsKLSAgICAgICAgLy8gb3V0cHV0IGNoYW5uZWxzCi0gICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0xFRlQgPSAweDQsCi0gICAgICAgIENIQU5ORUxfT1VUX0ZST05UX1JJR0hUID0gMHg4LAotICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgPSAweDEwLAotICAgICAgICBDSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZID0gMHgyMCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfQkFDS19MRUZUID0gMHg0MCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCA9IDB4ODAsCi0gICAgICAgIENIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSID0gMHgxMDAsCi0gICAgICAgIENIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4MjAwLAotICAgICAgICBDSEFOTkVMX09VVF9CQUNLX0NFTlRFUiA9IDB4NDAwLAotICAgICAgICBDSEFOTkVMX09VVF9NT05PID0gQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCwKLSAgICAgICAgQ0hBTk5FTF9PVVRfU1RFUkVPID0gKENIQU5ORUxfT1VUX0ZST05UX0xFRlQgfCBDSEFOTkVMX09VVF9GUk9OVF9SSUdIVCksCi0gICAgICAgIENIQU5ORUxfT1VUX1FVQUQgPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9CQUNLX0xFRlQgfCBDSEFOTkVMX09VVF9CQUNLX1JJR0hUKSwKLSAgICAgICAgQ0hBTk5FTF9PVVRfU1VSUk9VTkQgPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX09VVF9CQUNLX0NFTlRFUiksCi0gICAgICAgIENIQU5ORUxfT1VUXzVQT0lOVDEgPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9PVVRfQkFDS19MRUZUIHwgQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCksCi0gICAgICAgIENIQU5ORUxfT1VUXzdQT0lOVDEgPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9PVVRfQkFDS19MRUZUIHwgQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCB8Ci0gICAgICAgICAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBDSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpLAotICAgICAgICBDSEFOTkVMX09VVF9BTEwgPSAoQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IENIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICBDSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQ0hBTk5FTF9PVVRfQkFDS19MRUZUIHwgQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCB8Ci0gICAgICAgICAgICAgICAgQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBDSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgfCBDSEFOTkVMX09VVF9CQUNLX0NFTlRFUiksCi0KLSAgICAgICAgLy8gaW5wdXQgY2hhbm5lbHMKLSAgICAgICAgQ0hBTk5FTF9JTl9MRUZUID0gMHg0LAotICAgICAgICBDSEFOTkVMX0lOX1JJR0hUID0gMHg4LAotICAgICAgICBDSEFOTkVMX0lOX0ZST05UID0gMHgxMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9CQUNLID0gMHgyMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCA9IDB4NDAsCi0gICAgICAgIENIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEID0gMHg4MCwKLSAgICAgICAgQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQgPSAweDEwMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCA9IDB4MjAwLAotICAgICAgICBDSEFOTkVMX0lOX1BSRVNTVVJFID0gMHg0MDAsCi0gICAgICAgIENIQU5ORUxfSU5fWF9BWElTID0gMHg4MDAsCi0gICAgICAgIENIQU5ORUxfSU5fWV9BWElTID0gMHgxMDAwLAotICAgICAgICBDSEFOTkVMX0lOX1pfQVhJUyA9IDB4MjAwMCwKLSAgICAgICAgQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgPSAweDQwMDAsCi0gICAgICAgIENIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LID0gMHg4MDAwLAotICAgICAgICBDSEFOTkVMX0lOX01PTk8gPSBDSEFOTkVMX0lOX0ZST05ULAotICAgICAgICBDSEFOTkVMX0lOX1NURVJFTyA9IChDSEFOTkVMX0lOX0xFRlQgfCBDSEFOTkVMX0lOX1JJR0hUKSwKLSAgICAgICAgQ0hBTk5FTF9JTl9BTEwgPSAoQ0hBTk5FTF9JTl9MRUZUIHwgQ0hBTk5FTF9JTl9SSUdIVCB8IENIQU5ORUxfSU5fRlJPTlQgfCBDSEFOTkVMX0lOX0JBQ0t8Ci0gICAgICAgICAgICAgICAgQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCB8IENIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEIHwgQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQgfCBDSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEfAotICAgICAgICAgICAgICAgIENIQU5ORUxfSU5fUFJFU1NVUkUgfCBDSEFOTkVMX0lOX1hfQVhJUyB8IENIQU5ORUxfSU5fWV9BWElTIHwgQ0hBTk5FTF9JTl9aX0FYSVMgfAotICAgICAgICAgICAgICAgIENIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspCi0gICAgfTsKLQotICAgIGVudW0gYXVkaW9fbW9kZSB7Ci0gICAgICAgIE1PREVfSU5WQUxJRCA9IC0yLAotICAgICAgICBNT0RFX0NVUlJFTlQgPSAtMSwKLSAgICAgICAgTU9ERV9OT1JNQUwgPSAwLAotICAgICAgICBNT0RFX1JJTkdUT05FLAotICAgICAgICBNT0RFX0lOX0NBTEwsCi0gICAgICAgIE1PREVfSU5fQ09NTVVOSUNBVElPTiwKLSAgICAgICAgTlVNX01PREVTICAvLyBub3QgYSB2YWxpZCBlbnRyeSwgZGVub3RlcyBlbmQtb2YtbGlzdAotICAgIH07Ci0KLSAgICBlbnVtIGF1ZGlvX2luX2Fjb3VzdGljcyB7Ci0gICAgICAgIEFHQ19FTkFCTEUgICAgPSAweDAwMDEsCi0gICAgICAgIEFHQ19ESVNBQkxFICAgPSAwLAotICAgICAgICBOU19FTkFCTEUgICAgID0gMHgwMDAyLAotICAgICAgICBOU19ESVNBQkxFICAgID0gMCwKLSAgICAgICAgVFhfSUlSX0VOQUJMRSA9IDB4MDAwNCwKLSAgICAgICAgVFhfRElTQUJMRSAgICA9IDAKLSAgICB9OwotCi0gICAgLy8gc3BlY2lhbCBhdWRpbyBzZXNzaW9uIHZhbHVlcwotICAgIGVudW0gYXVkaW9fc2Vzc2lvbnMgewotICAgICAgICBTRVNTSU9OX09VVFBVVF9TVEFHRSA9IC0xLCAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhciBvdXRwdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAwKQotICAgICAgICBTRVNTSU9OX09VVFBVVF9NSVggPSAwLCAgICAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGFwcGxpZWQgdG8gb3V0cHV0IG1peC4gVGhlc2UgZWZmZWN0cyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW92ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIDApCi0gICAgfTsKLQogICAgIC8qIFRoZXNlIGFyZSBzdGF0aWMgbWV0aG9kcyB0byBjb250cm9sIHRoZSBzeXN0ZW0td2lkZSBBdWRpb0ZsaW5nZXIKICAgICAgKiBvbmx5IHByaXZpbGVnZWQgcHJvY2Vzc2VzIGNhbiBoYXZlIGFjY2VzcyB0byB0aGVtCiAgICAgICovCkBAIC0xODksNiArNDksNyBAQAogICAgIC8vIHNldC9nZXQgbWFzdGVyIHZvbHVtZQogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQqIHZvbHVtZSk7CisKICAgICAvLyBtdXRlL3VubXV0ZSBhdWRpbyBvdXRwdXRzCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBtdXRlKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sKiBtdXRlKTsKQEAgLTIwMSw3ICs2Miw3IEBACiAgICAgc3RhdGljIHN0YXR1c190IHNldFN0cmVhbU11dGUoaW50IHN0cmVhbSwgYm9vbCBtdXRlKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0U3RyZWFtTXV0ZShpbnQgc3RyZWFtLCBib29sKiBtdXRlKTsKIAotICAgIC8vIHNldCBhdWRpbyBtb2RlIGluIGF1ZGlvIGhhcmR3YXJlIChzZWUgQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUpCisgICAgLy8gc2V0IGF1ZGlvIG1vZGUgaW4gYXVkaW8gaGFyZHdhcmUgKHNlZSBhdWRpb19tb2RlX3QpCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1vZGUoaW50IG1vZGUpOwogCiAgICAgLy8gcmV0dXJucyB0cnVlIGluICpzdGF0ZSBpZiB0cmFja3MgYXJlIGFjdGl2ZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvciBoYXMgYmVlbiBhY3RpdmUKQEAgLTIyMiw5ICs4Myw5IEBACiAgICAgc3RhdGljIGZsb2F0IGxpbmVhclRvTG9nKGludCB2b2x1bWUpOwogICAgIHN0YXRpYyBpbnQgbG9nVG9MaW5lYXIoZmxvYXQgdm9sdW1lKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGUoaW50KiBzYW1wbGluZ1JhdGUsIGludCBzdHJlYW0gPSBERUZBVUxUKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChpbnQqIGZyYW1lQ291bnQsIGludCBzdHJlYW0gPSBERUZBVUxUKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0TGF0ZW5jeSh1aW50MzJfdCogbGF0ZW5jeSwgaW50IHN0cmVhbSA9IERFRkFVTFQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGUoaW50KiBzYW1wbGluZ1JhdGUsIGludCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dEZyYW1lQ291bnQoaW50KiBmcmFtZUNvdW50LCBpbnQgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LCBpbnQgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOwogCiAgICAgc3RhdGljIGJvb2wgcm91dGVkVG9BMmRwT3V0cHV0KGludCBzdHJlYW1UeXBlKTsKIApAQCAtMjM0LDcgKzk1LDcgQEAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IEF1ZGlvRmxpbmdlciB0byBhdWRpbyBIQUwgYW5kCi0gICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgb3V0cHV0IG9uIHdoaWNoIHRoZSBzcGVjaWZpY2VkIHN0cmVhbSBpcyBwbGF5aW5nCisgICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgb3V0cHV0IG9uIHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGlzIHBsYXlpbmcKICAgICAvLyBoYXMgZXhpdGVkIHN0YW5kYnkuCiAgICAgLy8gcmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgLy8gLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24sIGhhbEZyYW1lcyBhbmQgZHNwRnJhbWVzIHBvaW50IHRvIHZhbGlkIGRhdGEKQEAgLTI0Miw5MyArMTAzLDExIEBACiAgICAgLy8gLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyCiAgICAgLy8gTk9URTogdGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIGhhcmR3YXJlIHBsYXRmb3JtcyBhbmQgaXQgaXMKICAgICAvLyBuZWNlc3NhcnkgdG8gY2hlY2sgcmV0dXJuZWQgc3RhdHVzIGJlZm9yZSB1c2luZyB0aGUgcmV0dXJuZWQgdmFsdWVzLgotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLCBpbnQgc3RyZWFtID0gREVGQVVMVCk7CisgICAgc3RhdGljIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsIGludCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CiAKICAgICBzdGF0aWMgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogCiAgICAgc3RhdGljIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOwotICAgIC8vCi0gICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZQotICAgIC8vCi0KLSAgICBlbnVtIGF1ZGlvX2RldmljZXMgewotICAgICAgICAvLyBvdXRwdXQgZGV2aWNlcwotICAgICAgICBERVZJQ0VfT1VUX0VBUlBJRUNFID0gMHgxLAotICAgICAgICBERVZJQ0VfT1VUX1NQRUFLRVIgPSAweDIsCi0gICAgICAgIERFVklDRV9PVVRfV0lSRURfSEVBRFNFVCA9IDB4NCwKLSAgICAgICAgREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgPSAweDgsCi0gICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyA9IDB4MTAsCi0gICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUID0gMHgyMCwKLSAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCA9IDB4NDAsCi0gICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwLAotICAgICAgICBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMCwKLSAgICAgICAgREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSID0gMHgyMDAsCi0gICAgICAgIERFVklDRV9PVVRfQVVYX0RJR0lUQUwgPSAweDQwMCwKLSAgICAgICAgREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCA9IDB4ODAwLAotICAgICAgICBERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUID0gMHgxMDAwLAotICAgICAgICBERVZJQ0VfT1VUX0RFRkFVTFQgPSAweDgwMDAsCi0gICAgICAgIERFVklDRV9PVVRfQUxMID0gKERFVklDRV9PVVRfRUFSUElFQ0UgfCBERVZJQ0VfT1VUX1NQRUFLRVIgfCBERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgICAgIERFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwgREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfAotICAgICAgICAgICAgICAgIERFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfCBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwgREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKLSAgICAgICAgICAgICAgICBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgfCBERVZJQ0VfT1VUX0FVWF9ESUdJVEFMIHwKLSAgICAgICAgICAgICAgICBERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUIHwgREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCB8Ci0gICAgICAgICAgICAgICAgREVWSUNFX09VVF9ERUZBVUxUKSwKLSAgICAgICAgREVWSUNFX09VVF9BTExfQTJEUCA9IChERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwgREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKLSAgICAgICAgICAgICAgICBERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAotCi0gICAgICAgIC8vIGlucHV0IGRldmljZXMKLSAgICAgICAgREVWSUNFX0lOX0NPTU1VTklDQVRJT04gPSAweDEwMDAwLAotICAgICAgICBERVZJQ0VfSU5fQU1CSUVOVCA9IDB4MjAwMDAsCi0gICAgICAgIERFVklDRV9JTl9CVUlMVElOX01JQyA9IDB4NDAwMDAsCi0gICAgICAgIERFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQgPSAweDgwMDAwLAotICAgICAgICBERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCA9IDB4MTAwMDAwLAotICAgICAgICBERVZJQ0VfSU5fQVVYX0RJR0lUQUwgPSAweDIwMDAwMCwKLSAgICAgICAgREVWSUNFX0lOX1ZPSUNFX0NBTEwgPSAweDQwMDAwMCwKLSAgICAgICAgREVWSUNFX0lOX0JBQ0tfTUlDID0gMHg4MDAwMDAsCi0gICAgICAgIERFVklDRV9JTl9ERUZBVUxUID0gMHg4MDAwMDAwMCwKLQotICAgICAgICBERVZJQ0VfSU5fQUxMID0gKERFVklDRV9JTl9DT01NVU5JQ0FUSU9OIHwgREVWSUNFX0lOX0FNQklFTlQgfCBERVZJQ0VfSU5fQlVJTFRJTl9NSUMgfAotICAgICAgICAgICAgICAgIERFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfCBERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCB8IERFVklDRV9JTl9BVVhfRElHSVRBTCB8Ci0gICAgICAgICAgICAgICAgREVWSUNFX0lOX1ZPSUNFX0NBTEwgfCBERVZJQ0VfSU5fQkFDS19NSUMgfCBERVZJQ0VfSU5fREVGQVVMVCkKLSAgICB9OwotCi0gICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGVzIHVzZWQgZm9yIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCi0gICAgZW51bSBkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSB7Ci0gICAgICAgIERFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgTlVNX0RFVklDRV9TVEFURVMKLSAgICB9OwotCi0gICAgLy8gcmVxdWVzdCB0byBvcGVuIGEgZGlyZWN0IG91dHB1dCB3aXRoIGdldE91dHB1dCgpIChieSBvcHBvc2l0aW9uIHRvIHNoYXJpbmcgYW4gb3V0cHV0IHdpdGggb3RoZXIgQXVkaW9UcmFja3MpCi0gICAgZW51bSBvdXRwdXRfZmxhZ3MgewotICAgICAgICBPVVRQVVRfRkxBR19JTkRJUkVDVCA9IDB4MCwKLSAgICAgICAgT1VUUFVUX0ZMQUdfRElSRUNUID0gMHgxCi0gICAgfTsKLQotICAgIC8vIGRldmljZSBjYXRlZ29yaWVzIHVzZWQgZm9yIHNldEZvcmNlVXNlKCkKLSAgICBlbnVtIGZvcmNlZF9jb25maWcgewotICAgICAgICBGT1JDRV9OT05FLAotICAgICAgICBGT1JDRV9TUEVBS0VSLAotICAgICAgICBGT1JDRV9IRUFEUEhPTkVTLAotICAgICAgICBGT1JDRV9CVF9TQ08sCi0gICAgICAgIEZPUkNFX0JUX0EyRFAsCi0gICAgICAgIEZPUkNFX1dJUkVEX0FDQ0VTU09SWSwKLSAgICAgICAgRk9SQ0VfQlRfQ0FSX0RPQ0ssCi0gICAgICAgIEZPUkNFX0JUX0RFU0tfRE9DSywKLSAgICAgICAgRk9SQ0VfQU5BTE9HX0RPQ0ssCi0gICAgICAgIEZPUkNFX0RJR0lUQUxfRE9DSywKLSAgICAgICAgTlVNX0ZPUkNFX0NPTkZJRywKLSAgICAgICAgRk9SQ0VfREVGQVVMVCA9IEZPUkNFX05PTkUKLSAgICB9OwotCi0gICAgLy8gdXNhZ2VzIHVzZWQgZm9yIHNldEZvcmNlVXNlKCkKLSAgICBlbnVtIGZvcmNlX3VzZSB7Ci0gICAgICAgIEZPUl9DT01NVU5JQ0FUSU9OLAotICAgICAgICBGT1JfTUVESUEsCi0gICAgICAgIEZPUl9SRUNPUkQsCi0gICAgICAgIEZPUl9ET0NLLAotICAgICAgICBOVU1fRk9SQ0VfVVNFCi0gICAgfTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMzU5LDQ0ICsxMzgsNDUgQEAKICAgICAvLwogICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCiAgICAgLy8KLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXMgZGV2aWNlLCBkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSwgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHN0YXRpYyBkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlcyBkZXZpY2UsIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShpbnQgc3RhdGUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRSaW5nZXJNb2RlKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IG1hc2spOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRGb3JjZVVzZShmb3JjZV91c2UgdXNhZ2UsIGZvcmNlZF9jb25maWcgY29uZmlnKTsKLSAgICBzdGF0aWMgZm9yY2VkX2NvbmZpZyBnZXRGb3JjZVVzZShmb3JjZV91c2UgdXNhZ2UpOwotICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoc3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBGT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IENIQU5ORUxfT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBPVVRQVVRfRkxBR19JTkRJUkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fUE9MSUNZX09VVFBVVF9GTEFHX0lORElSRUNUKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoaW50IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBDSEFOTkVMX0lOX01PTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0gKGF1ZGlvX2luX2Fjb3VzdGljcykwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgPSAoYXVkaW9faW5fYWNvdXN0aWNzX3QpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCAqaW5kZXgpOwogCi0gICAgc3RhdGljIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbV90eXBlIHN0cmVhbSk7Ci0gICAgc3RhdGljIHVpbnQzMl90IGdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyB1aW50MzJfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIAogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyk7CiAgICAgc3RhdGljIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwpAQCAtNDA2LDE3ICsxODYsNiBAQAogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgc3RhdGljIHVpbnQzMl90IHBvcENvdW50KHVpbnQzMl90IHUpOwotICAgIHN0YXRpYyBib29sIGlzT3V0cHV0RGV2aWNlKGF1ZGlvX2RldmljZXMgZGV2aWNlKTsKLSAgICBzdGF0aWMgYm9vbCBpc0lucHV0RGV2aWNlKGF1ZGlvX2RldmljZXMgZGV2aWNlKTsKLSAgICBzdGF0aWMgYm9vbCBpc0EyZHBEZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpOwotICAgIHN0YXRpYyBib29sIGlzQmx1ZXRvb3RoU2NvRGV2aWNlKGF1ZGlvX2RldmljZXMgZGV2aWNlKTsKLSAgICBzdGF0aWMgYm9vbCBpc0xvd1Zpc2liaWxpdHkoc3RyZWFtX3R5cGUgc3RyZWFtKTsKLSAgICBzdGF0aWMgYm9vbCBpc091dHB1dENoYW5uZWwodWludDMyX3QgY2hhbm5lbCk7Ci0gICAgc3RhdGljIGJvb2wgaXNJbnB1dENoYW5uZWwodWludDMyX3QgY2hhbm5lbCk7Ci0gICAgc3RhdGljIGJvb2wgaXNWYWxpZEZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotICAgIHN0YXRpYyBib29sIGlzTGluZWFyUENNKHVpbnQzMl90IGZvcm1hdCk7Ci0KIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC00NjgsNTAgKzIzNyw2IEBACiAgICAgc3RhdGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgT3V0cHV0RGVzY3JpcHRvciAqPiBnT3V0cHV0czsKIH07CiAKLWNsYXNzIEF1ZGlvUGFyYW1ldGVyIHsKLQotcHVibGljOgotICAgIEF1ZGlvUGFyYW1ldGVyKCkge30KLSAgICBBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1BhcmFtZXRlcigpOwotCi0gICAgLy8gcmVzZXJ2ZWQgcGFyYW1ldGVyIGtleXMgZm9yIGNoYW5naW5nIHN0YW5kYXJkIHBhcmFtZXRlcnMgd2l0aCBzZXRQYXJhbWV0ZXJzKCkgZnVuY3Rpb24uCi0gICAgLy8gVXNpbmcgdGhlc2Uga2V5cyBpcyBtYW5kYXRvcnkgZm9yIEF1ZGlvRmxpbmdlciB0byBwcm9wZXJseSBtb25pdG9yIGF1ZGlvIG91dHB1dC9pbnB1dAotICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgYWN0IGFjY29yZGluZ2x5LgotICAgIC8vICBrZXlSb3V0aW5nOiB0byBjaGFuZ2UgYXVkaW8gcm91dGluZywgdmFsdWUgaXMgYW4gaW50IGluIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzCi0gICAgLy8gIGtleVNhbXBsaW5nUmF0ZTogdG8gY2hhbmdlIHNhbXBsaW5nIHJhdGUgcm91dGluZywgdmFsdWUgaXMgYW4gaW50Ci0gICAgLy8gIGtleUZvcm1hdDogdG8gY2hhbmdlIGF1ZGlvIGZvcm1hdCwgdmFsdWUgaXMgYW4gaW50IGluIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQKLSAgICAvLyAga2V5Q2hhbm5lbHM6IHRvIGNoYW5nZSBhdWRpbyBjaGFubmVsIGNvbmZpZ3VyYXRpb24sIHZhbHVlIGlzIGFuIGludCBpbiBBdWRpb1N5c3RlbTo6YXVkaW9fY2hhbm5lbHMKLSAgICAvLyAga2V5RnJhbWVDb3VudDogdG8gY2hhbmdlIGF1ZGlvIG91dHB1dCBmcmFtZSBjb3VudCwgdmFsdWUgaXMgYW4gaW50Ci0gICAgLy8gIGtleUlucHV0U291cmNlOiB0byBjaGFuZ2UgYXVkaW8gaW5wdXQgc291cmNlLCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fc291cmNlCi0gICAgLy8gICAgIChkZWZpbmVkIGluIG1lZGlhL21lZGlhcmVjb3JkZXIuaCkKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqa2V5Um91dGluZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqa2V5U2FtcGxpbmdSYXRlOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlGb3JtYXQ7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmtleUNoYW5uZWxzOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlGcmFtZUNvdW50OwotICAgIHN0YXRpYyBjb25zdCBjaGFyICprZXlJbnB1dFNvdXJjZTsKLQotICAgIFN0cmluZzggdG9TdHJpbmcoKTsKLQotICAgIHN0YXR1c190IGFkZChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKLSAgICBzdGF0dXNfdCBhZGRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBpbnQgdmFsdWUpOwotICAgIHN0YXR1c190IGFkZEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgZmxvYXQgdmFsdWUpOwotCi0gICAgc3RhdHVzX3QgcmVtb3ZlKGNvbnN0IFN0cmluZzgmIGtleSk7Ci0KLSAgICBzdGF0dXNfdCBnZXQoY29uc3QgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSk7Ci0gICAgc3RhdHVzX3QgZ2V0SW50KGNvbnN0IFN0cmluZzgmIGtleSwgaW50JiB2YWx1ZSk7Ci0gICAgc3RhdHVzX3QgZ2V0RmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBmbG9hdCYgdmFsdWUpOwotICAgIHN0YXR1c190IGdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSk7Ci0KLSAgICBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIG1QYXJhbWV0ZXJzLnNpemUoKTsgfQotCi1wcml2YXRlOgotICAgIFN0cmluZzggbUtleVZhbHVlUGFpcnM7Ci0gICAgS2V5ZWRWZWN0b3IgPFN0cmluZzgsIFN0cmluZzg+IG1QYXJhbWV0ZXJzOwotfTsKLQogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLypBTkRST0lEX0FVRElPU1lTVEVNX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggM2UzNDZkYi4uZGYzMGU4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcwLDggKzY5LDggQEAKICAgICAgICAgICAgIE1VVEUgICAgPSAweDAwMDAwMDAxCiAgICAgICAgIH07CiAgICAgICAgIHVpbnQzMl90ICAgIGZsYWdzOwotICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQ7CiAgICAgICAgIGludCAgICAgICAgIGZvcm1hdDsKKyAgICAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50OyAvLyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgZG8gbm90IHVzZQogICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50OwogICAgICAgICBzaXplX3QgICAgICBzaXplOwogICAgICAgICB1bmlvbiB7CkBAIC0xMjYsMTEgKzEyNSwxMSBAQAogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQXVkaW9TeXN0ZW06Ok1VU0lDKS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIChlLmcuIEFVRElPX1NUUkVBTV9NVVNJQykuCiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6LgotICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQgZm9yIHNpZ25lZAorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsczogICAgICAgICAgIENoYW5uZWwgbWFzazogc2VlIEF1ZGlvU3lzdGVtOjphdWRpb19jaGFubmVscy4KKyAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBUb3RhbCBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4KICAgICAgKiBmbGFnczogICAgICAgICAgICAgIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgpAQCAtMTQ0LDcgKzE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKCBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyAgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsTWFzayAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgID0gMCwKQEAgLTE2NCw3ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2sgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gMCwKQEAgLTE4OCw3ICsxODcsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGludCBzdHJlYW1UeXBlICAgICAgPS0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsTWFzayAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSAwLApAQCAtNDM5LDggKzQzOCw4IEBACiAgICAgICAgICAgICBib29sIHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNDYwLDExICs0NTksMTIgQEAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1NdXRlZDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVJlc2VydmVkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzazsKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RBcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NjYwYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUZGRUNUQVBJX0hfCi0jZGVmaW5lIEFORFJPSURfRUZGRUNUQVBJX0hfCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFRoZSBlZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBlYWNoIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24uIEl0IGNvbnNpc3RzIG9mCi0vLyBhIHNldCBvZiBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbmZpZ3VyYXRpb24sIGFjdGl2YXRpb24gYW5kIHByb2Nlc3Mgb2YgdGhlIGVuZ2luZS4KLS8vIFRoZSBmdW5jdGlvbnMgYXJlIGdyb3VwZWQgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBlZmZlY3RfaW50ZXJmYWNlX3M6Ci0vLyAgICBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHsKLS8vICAgICAgICBlZmZlY3RfcHJvY2Vzc190IHByb2Nlc3M7Ci0vLyAgICAgICAgZWZmZWN0X2NvbW1hbmRfdCBjb21tYW5kOwotLy8gICAgfTsKLQotCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3Q6IEVmZmVjdCBjb250cm9sIGludGVyZmFjZSBoYW5kbGUuCi0vLyBUaGUgZWZmZWN0X2ludGVyZmFjZV90IHNlcnZlcyB0d28gcHVycG9zZXMgcmVnYXJkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWZmZWN0IGVuZ2luZToKLS8vIC0gMSBpdCBpcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gYW4gZWZmZWN0X2ludGVyZmFjZV9zIHN0cnVjdHVyZSB3aGVyZSB0aGUgZnVuY3Rpb25zCi0vLyBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGZvciBhIHBhcnRpY3VsYXIgZWZmZWN0IGFyZSBsb2NhdGVkLgotLy8gLSAyIGl0IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBlZmZlY3QgaW5zdGFuY2UuCi0vLyBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gaW4gdGhlIGVmZmVjdCBsaWJyYXJ5IHdvdWxkIGRlZmluZSBhIHN0cnVjdHVyZSBhcyBmb2xsb3dzOgotLy8gc3RydWN0IGVmZmVjdF9tb2R1bGVfcyB7Ci0vLyAgICAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLS8vICAgICAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOwotLy8gICAgICAgIGVmZmVjdF9jb250ZXh0X3QgY29udGV4dDsKLS8vIH0KLS8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFZmZlY3RDcmVhdGUoKSBmdW5jdGlvbiB3b3VsZCB0aGVuIGFsbG9jYXRlIGEgc3RydWN0dXJlIG9mIHRoaXMKLS8vIHR5cGUgYW5kIHJldHVybiBpdHMgYWRkcmVzcyBhcyBlZmZlY3RfaW50ZXJmYWNlX3QKLXR5cGVkZWYgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKmVmZmVjdF9pbnRlcmZhY2VfdDsKLQotCi0vLyBFZmZlY3QgQVBJIHZlcnNpb24gMS4wCi0jZGVmaW5lIEVGRkVDVF9BUElfVkVSU0lPTiAweDAxMDAgLy8gRm9ybWF0IDB4TU1tbSBNTTogTWFqb3IgdmVyc2lvbiwgbW06IG1pbm9yIHZlcnNpb24KLQotLy8gTWF4aW11bSBsZW5ndGggb2YgY2hhcmFjdGVyIHN0cmluZ3MgaW4gc3RydWN0dXJlcyBkZWZpbmVzIGJ5IHRoaXMgQVBJLgotI2RlZmluZSBFRkZFQ1RfU1RSSU5HX0xFTl9NQVggNjQKLQotLy8KLS8vLS0tIEVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBlZmZlY3RfZGVzY3JpcHRvcl90Ci0vLwotCi0vLyBVbmlxdWUgZWZmZWN0IElEIChjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgotLy8gIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbCkKLS8vIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIGJvdGggInR5cGUiIGFuZCAidXVpZCIgZmllbGRzIG9mIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0vLyAtIFdoZW4gdXNlZCBmb3IgZWZmZWN0IHR5cGUgYW5kIHRoZSBlbmdpbmUgaXMgaW1wbGVtZW50aW5nIGFuZCBlZmZlY3QgY29ycmVzcG9uZGluZyB0byBhIHN0YW5kYXJkCi0vLyBPcGVuU0wgRVMgaW50ZXJmYWNlLCB0aGlzIElEIG11c3QgYmUgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5TTEVTX0lJRC5oIGZvciB0aGF0IGludGVyZmFjZS4KLS8vIC0gV2hlbiB1c2VkIGFzIHV1aWQsIGl0IHNob3VsZCBiZSBhIHVuaXF1ZSBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfdXVpZF9zIHsKLSAgICB1aW50MzJfdCB0aW1lTG93OwotICAgIHVpbnQxNl90IHRpbWVNaWQ7Ci0gICAgdWludDE2X3QgdGltZUhpQW5kVmVyc2lvbjsKLSAgICB1aW50MTZfdCBjbG9ja1NlcTsKLSAgICB1aW50OF90IG5vZGVbNl07Ci19IGVmZmVjdF91dWlkX3Q7Ci0KLS8vIE5VTEwgVVVJRCBkZWZpbml0aW9uIChtYXRjaGVzIFNMX0lJRF9OVUxMXykKLSNkZWZpbmUgRUZGRUNUX1VVSURfSU5JVElBTElaRVIgeyAweGVjNzE3OGVjLCAweGU1ZTEsIDB4NDQzMiwgMHhhM2Y0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDQ2LCAweDU3LCAweGU2LCAweDc5LCAweDUyLCAweDEwIH0gfQotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgRUZGRUNUX1VVSURfTlVMTF8gPSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUjsKLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBFRkZFQ1RfVVVJRF9OVUxMID0gJkVGRkVDVF9VVUlEX05VTExfOwotY29uc3QgY2hhciAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTExfU1RSID0gImVjNzE3OGVjLWU1ZTEtNDQzMi1hM2Y0LTQ2NTdlNjc5NTIxMCI7Ci0KLS8vIFRoZSBlZmZlY3QgZGVzY3JpcHRvciBjb250YWlucyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZmFjaWxpdGF0ZSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGVmZmVjdAotLy8gZW5naW5lcyBwcmVzZW50IGluIGEgbGlicmFyeS4KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF9kZXNjcmlwdG9yX3MgewotICAgIGVmZmVjdF91dWlkX3QgdHlwZTsgICAgIC8vIFVVSUQgb2YgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7ICAgICAvLyBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24KLSAgICB1aW50MTZfdCBhcGlWZXJzaW9uOyAgICAvLyBWZXJzaW9uIG9mIHRoZSBlZmZlY3QgQVBJIGltcGxlbWVudGVkOiBtYXRjaGVzIEVGRkVDVF9BUElfVkVSU0lPTgotICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgIC8vIGVmZmVjdCBlbmdpbmUgY2FwYWJpbGl0aWVzL3JlcXVpcmVtZW50cyBmbGFncyAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IGNwdUxvYWQ7ICAgICAgIC8vIENQVSBsb2FkIGluZGljYXRpb24gKHNlZSBiZWxvdykKLSAgICB1aW50MTZfdCBtZW1vcnlVc2FnZTsgICAvLyBEYXRhIE1lbW9yeSB1c2FnZSAoc2VlIGJlbG93KQotICAgIGNoYXIgICAgbmFtZVtFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lCi0gICAgY2hhciAgICBpbXBsZW1lbnRvcltFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgICAvLyBodW1hbiByZWFkYWJsZSBlZmZlY3QgaW1wbGVtZW50b3IgbmFtZQotfSBlZmZlY3RfZGVzY3JpcHRvcl90OwotCi0vLyBDUFUgbG9hZCBhbmQgbWVtb3J5IHVzYWdlIGluZGljYXRpb246IGVhY2ggZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhbiBpbmRpY2F0aW9uIG9mCi0vLyBpdHMgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgZm9yIHRoZSBhdWRpbyBlZmZlY3QgZnJhbWV3b3JrIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZWZmZWN0cwotLy8gaW5zdGFudGlhdGVkIGF0IGEgZ2l2ZW4gdGltZSBvbiBhIGdpdmVuIHBsYXRmb3JtLgotLy8gVGhlIENQVSBsb2FkIGlzIGV4cHJlc3NlZCBpbiAwLjEgTUlQUyB1bml0cyBhcyBlc3RpbWF0ZWQgb24gYW4gQVJNOUUgY29yZSAoQVJNdjVURSkgd2l0aCAwIFdTLgotLy8gVGhlIG1lbW9yeSB1c2FnZSBpcyBleHByZXNzZWQgaW4gS0IgYW5kIGluY2x1ZGVzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeQotCi0vLyBEZWZpbml0aW9ucyBmb3IgZmxhZ3MgZmllbGQgb2YgZWZmZWN0IGRlc2NyaXB0b3IuCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICB8IGJpdHMgICAgICB8IHZhbHVlcwotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IGNvbm5lY3Rpb24gbW9kZSAgICAgICAgICAgfCAwLi4xICAgICAgfCAwIGluc2VydDogYWZ0ZXIgdHJhY2sgcHJvY2VzcwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgYXV4aWxpYXJ5OiBjb25uZWN0IHRvIHRyYWNrIGF1eGlsaWFyeQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICBvdXRwdXQgYW5kIHVzZSBzZW5kIGxldmVsCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiByZXBsYWNlOiByZXBsYWNlcyB0cmFjayBwcm9jZXNzIGZ1bmN0aW9uOwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgbXVzdCBpbXBsZW1lbnQgU1JDLCB2b2x1bWUgYW5kIG1vbm8gdG8gc3RlcmVvLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBpbnNlcnRpb24gcHJlZmVyZW5jZSAgICAgIHwgMi4uNCAgICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBmaXJzdCBvZiB0aGUgY2hhaW4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIGxhc3Qgb2YgdGhlIGNoYWluCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBleGNsdXNpdmUgKG9ubHkgZWZmZWN0IGluIHRoZSBpbnNlcnQgY2hhaW4pCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNC4uNyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFZvbHVtZSBtYW5hZ2VtZW50ICAgICAgICAgfCA1Li42ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcXVpcmVzIHZvbHVtZSBpbmRpY2F0aW9uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IERldmljZSBpbmRpY2F0aW9uICAgICAgICAgfCA3Li44ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGRldmljZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFNhbXBsZSBpbnB1dCBtb2RlICAgICAgICAgfCA5Li4xMCAgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3QgaW5wdXQuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBpbnB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFNhbXBsZSBvdXRwdXQgbW9kZSAgICAgICAgfCAxMS4uMTIgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3Qgb3V0cHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBvdXRwdXQgbW9kZXMgYXJlIHN1cHBvcnRlZAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBIYXJkd2FyZSBhY2NlbGVyYXRpb24gICAgIHwgMTMuLjE1ICAgIHwgMCBObyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIG5vbiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHJlYWRzIHRoZSBzYW1wbGVzLCBzZW5kIHRoZW0gdG8gSFcgYWNjZWxlcmF0ZWQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGVmZmVjdCBwcm9jZXNzb3IsIHJlYWRzIGJhY2sgdGhlIHByb2Nlc3NlZCBzYW1wbGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBhbmQgcmV0dXJucyB0aGVtIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgdHVubmVsZWQgaHcgYWNjZWxlcmF0aW9uOiB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIGlzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0cmFuc3BhcmVudC4gVGhlIGVmZmVjdCBpbnRlcmZhY2UgaXMgb25seSB1c2VkIHRvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb250cm9sIHRoZSBlZmZlY3QgZW5naW5lLiBUaGlzIG1vZGUgaXMgcmVsZXZhbnQgZm9yCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBnbG9iYWwgZWZmZWN0cyBhY3R1YWxseSBhcHBsaWVkIGJ5IHRoZSBhdWRpbwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgaGFyZHdhcmUgb24gdGhlIG91dHB1dCBzdHJlYW0uCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgQXVkaW8gTW9kZSBpbmRpY2F0aW9uICAgICB8IDE2Li4xNyAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gbW9kZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gSW5zZXJ0IG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFICAgICAgICAweDAwMDAwMDAyCi0KLS8vIEluc2VydCBwcmVmZXJlbmNlCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFICAgIDB4MDAwMDAwMEMKLQotCi0vLyBWb2x1bWUgY29udHJvbAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSyAgICAgICAgIDB4MDAwMDAwNjAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKLQotLy8gRGV2aWNlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0sgICAgICAgICAweDAwMDAwMTgwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKLQotLy8gU2FtcGxlIGlucHV0IG1vZGVzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX01BU0sgICAgICAgICAgMHgwMDAwMDYwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1QgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVIgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEggICAgICAgICAgMHgwMDAwMDQwMAotCi0vLyBTYW1wbGUgb3V0cHV0IG1vZGVzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLICAgICAgICAgIDB4MDAwMDE4MDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVIgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9CT1RIICAgICAgICAgIDB4MDAwMDEwMDAKLQotLy8gSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0sgICAgICAgICAgMHgwMDAwNjAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0lNUExFICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgICAgICAgIDB4MDAwMDQwMDAKLQotLy8gQXVkaW8gbW9kZSBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSyAgICAgIDB4MDAwMTgwMDAKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX05PTkUgICAgICAweDAwMDAwMDAwCi0KLS8vIEZvcndhcmQgZGVmaW5pdGlvbiBvZiB0eXBlIGF1ZGlvX2J1ZmZlcl90Ci10eXBlZGVmIHN0cnVjdCBhdWRpb19idWZmZXJfcyBhdWRpb19idWZmZXJfdDsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgcHJvY2VzcwotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4gVGFrZXMgaW5wdXQgc2FtcGxlcyBhcyBzcGVjaWZpZWQKLS8vICAgICAgICAgIChjb3VudCBhbmQgbG9jYXRpb24pIGluIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBvdXRwdXQgcHJvY2Vzc2VkCi0vLyAgICAgICAgICBzYW1wbGVzIGFzIHNwZWNpZmllZCBpbiBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IuIElmIHRoZSBidWZmZXIgZGVzY3JpcHRvcgotLy8gICAgICAgICAgaXMgbm90IHNwZWNpZmllZCB0aGUgZnVuY3Rpb24gbXVzdCB1c2UgZWl0aGVyIHRoZSBidWZmZXIgb3IgdGhlCi0vLyAgICAgICAgICBidWZmZXIgcHJvdmlkZXIgZnVuY3Rpb24gaW5zdGFsbGVkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotLy8gICAgICAgICAgVGhlIGVmZmVjdCBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYWZ0ZXIgdGhlIEVGRkVDVF9DTURfRU5BQkxFCi0vLyAgICAgICAgICBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCB1bnRpbCB0aGUgRUZGRUNUX0NNRF9ESVNBQkxFIGlzIHJlY2VpdmVkLiBXaGVuIHRoZSBlbmdpbmUKLS8vICAgICAgICAgIHJlY2VpdmVzIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgY29tbWFuZCBpdCBzaG91bGQgdHVybiBvZmYgdGhlIGVmZmVjdCBncmFjZWZ1bGx5Ci0vLyAgICAgICAgICBhbmQgd2hlbiBkb25lIGluZGljYXRlIHRoYXQgaXQgaXMgT0sgdG8gc3RvcCBjYWxsaW5nIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYnkKLS8vICAgICAgICAgIHJldHVybmluZyB0aGUgLUVOT0RBVEEgc3RhdHVzLgotLy8KLS8vICAgIE5PVEU6IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlICJyZWFsLXRpbWUgc2FmZSIgdGhhdCBpcwotLy8gICAgICBpdCBzaG91bGQgbm90IHBlcmZvcm0gYmxvY2tpbmcgY2FsbHM6IG1hbGxvYy9mcmVlLCBzbGVlcCwgcmVhZC93cml0ZS9vcGVuL2Nsb3NlLAotLy8gICAgICBwdGhyZWFkX2NvbmRfd2FpdC9wdGhyZWFkX211dGV4X2xvY2suLi4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KLS8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCi0vLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHJlYWQgc2FtcGxlcyB0byBwcm9jZXNzLgotLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KLS8vCi0vLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHdyaXRlIHByb2Nlc3NlZCBzYW1wbGVzLgotLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREFUQSB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCB0aGUgZGlzYWJsZSBwaGFzZSBhbmQgdGhlIGZyYW1ld29yawotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHN0b3AgY2FsbGluZyBwcm9jZXNzKCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBpbnB1dC9vdXRwdXQgYnVmZmVyIGRlc2NyaXB0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X3Byb2Nlc3NfdCkoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgY29tbWFuZAotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KLS8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCi0vLyAgICAgICAgICBjbWRDb2RlOiAgICBjb21tYW5kIGNvZGU6IHRoZSBjb21tYW5kIGNhbiBiZSBhIHN0YW5kYXJkaXplZCBjb21tYW5kIGRlZmluZWQgaW4KLS8vICAgICAgICAgICAgICBlZmZlY3RfY29tbWFuZF9lIChzZWUgYmVsb3cpIG9yIGEgcHJvcHJpZXRhcnkgY29tbWFuZC4KLS8vICAgICAgICAgIGNtZFNpemU6ICAgIHNpemUgb2YgY29tbWFuZCBpbiBieXRlcwotLy8gICAgICAgICAgcENtZERhdGE6ICAgcG9pbnRlciB0byBjb21tYW5kIGRhdGEKLS8vICAgICAgICAgIHBSZXBseURhdGE6IHBvaW50ZXIgdG8gcmVwbHkgZGF0YQotLy8KLS8vICAgIElucHV0L091dHB1dDoKLS8vICAgICAgICAgIHJlcGx5U2l6ZTogbWF4aW11bSBzaXplIG9mIHJlcGx5IGRhdGEgYXMgaW5wdXQKLS8vICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBzaXplIG9mIHJlcGx5IGRhdGEgYXMgb3V0cHV0Ci0vLwotLy8gICAgT3V0cHV0OgotLy8gICAgICAgICAgcmV0dXJuZWQgdmFsdWU6IDAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBjb21tYW5kL3JlcGx5IHNpemUgb3IgZm9ybWF0IGFjY29yZGluZyB0byBjb21tYW5kIGNvZGUKLS8vICAgICAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gaW5kaWNhdGUgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgdGhpcwotLy8gICAgICAgICAgICAgIEFQSSBzcGVjaWZpY2F0aW9uLiBTdGF0dXMgcmVsYXRlZCB0byB0aGUgZXhlY3V0aW9uIG9mIGEgcGFydGljdWxhciBjb21tYW5kIHNob3VsZCBiZQotLy8gICAgICAgICAgICAgIGluZGljYXRlZCBhcyBwYXJ0IG9mIHRoZSByZXBseSBmaWVsZC4KLS8vCi0vLyAgICAgICAgICAqcFJlcGx5RGF0YSB1cGRhdGVkIHdpdGggY29tbWFuZCByZXNwb25zZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfY29tbWFuZF90KShlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLQotLy8gRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KLXN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgewotICAgIGVmZmVjdF9wcm9jZXNzX3QgcHJvY2VzczsKLSAgICBlZmZlY3RfY29tbWFuZF90IGNvbW1hbmQ7Ci19OwotCi0KLS8vCi0vLy0tLSBTdGFuZGFyZGl6ZWQgY29tbWFuZCBjb2RlcyBmb3IgY29tbWFuZCgpIGZ1bmN0aW9uCi0vLwotZW51bSBlZmZlY3RfY29tbWFuZF9lIHsKLSAgIEVGRkVDVF9DTURfSU5JVCwgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZWZmZWN0IGVuZ2luZQotICAgRUZGRUNUX0NNRF9DT05GSUdVUkUsICAgICAgICAgICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgKHNlZSBlZmZlY3RfY29uZmlnX3QpCi0gICBFRkZFQ1RfQ01EX1JFU0VULCAgICAgICAgICAgICAgICAvLyByZXNldCBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX0VOQUJMRSwgICAgICAgICAgICAgICAvLyBlbmFibGUgZWZmZWN0IHByb2Nlc3MKLSAgIEVGRkVDVF9DTURfRElTQUJMRSwgICAgICAgICAgICAgIC8vIGRpc2FibGUgZWZmZWN0IHByb2Nlc3MKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNLCAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXIgaW1tZWRpYXRlbHkgKHNlZSBlZmZlY3RfcGFyYW1fdCkKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVELCAgIC8vIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgICAgIC8vIGNvbW1pdCBwcmV2aW91cyBzZXQgcGFyYW1ldGVyIGRlZmVycmVkCi0gICBFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVyCi0gICBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UsICAgICAgICAgICAvLyBzZXQgYXVkaW8gZGV2aWNlIChzZWUgYXVkaW9fZGV2aWNlX2UpCi0gICBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUsICAgICAgICAgICAvLyBzZXQgdm9sdW1lCi0gICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLCAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG1vZGUgKG5vcm1hbCwgcmluZywgLi4uKQotICAgRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSA9IDB4MTAwMDAgLy8gZmlyc3QgcHJvcHJpZXRhcnkgY29tbWFuZCBjb2RlCi19OwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0lOSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEluaXRpYWxpemUgZWZmZWN0IGVuZ2luZTogQWxsIGNvbmZpZ3VyYXRpb25zIHJldHVybiB0byBkZWZhdWx0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfQ09ORklHVVJFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBBcHBseSBuZXcgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQotLy8gIGRhdGE6IGVmZmVjdF9jb25maWdfdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1JFU0VUCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBSZXNldCB0aGUgZWZmZWN0IGVuZ2luZS4gS2VlcCBjb25maWd1cmF0aW9uIGJ1dCByZXNldHMgc3RhdGUgYW5kIGJ1ZmZlciBjb250ZW50Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9FTkFCTEUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEVuYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIHByb2Nlc3MoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0RJU0FCTEUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIERpc2FibGUgdGhlIHByb2Nlc3MuIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIGFmdGVyIHRoZSBsYXN0IGNhbGwgdG8gcHJvY2VzcygpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYSBwYXJhbWV0ZXIgYW5kIGFwcGx5IGl0IGltbWVkaWF0ZWx5Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCBhIHBhcmFtZXRlciBidXQgYXBwbHkgaXQgb25seSB3aGVuIHJlY2VpdmluZyBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQgY29tbWFuZAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBBcHBseSBhbGwgcHJldmlvdXNseSByZWNlaXZlZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRCBjb21tYW5kcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgR2V0IGEgcGFyYW1ldGVyIHZhbHVlCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0RFVklDRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IHRoZSByZW5kZXJpbmcgZGV2aWNlIHRoZSBhdWRpbyBvdXRwdXQgcGF0aCBpcyBjb25uZWN0ZWQgdG8uIFNlZSBhdWRpb19kZXZpY2VfZSBmb3IgZGV2aWNlCi0vLyAgdmFsdWVzLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcwotLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiBhdWRpb19kZXZpY2VfZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1ZPTFVNRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGFuZCBnZXQgdm9sdW1lLiBVc2VkIGJ5IGF1ZGlvIGZyYW1ld29yayB0byBkZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgZW5naW5lLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCBvciBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGluCi0vLyAgaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzIGNvbW1hbmQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcHJvY2VzcygpIGZ1bmN0aW9uCi0vLyAgSWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgZmxhZyBpcyBzZXQgaW4gdGhlIGVmZmVjdCBkZXNjcmlwdG9yLCB0aGUgZWZmZWN0IGVuZ2luZSBtdXN0IHJldHVybgotLy8gIHRoZSB2b2x1bWUgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdGhlIGVmZmVjdCBpcyBwcm9jZXNzZWQuIFRoZSBvdmVyYWxsIHZvbHVtZSAodGhlIHZvbHVtZQotLy8gIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUgbXVsdGlwbGllZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUpIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUKLS8vICBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1hbmQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBuICogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgotLy8gICAgICA4LjI0IGZpeGVkIHBvaW50IGZvcm1hdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpIC8gMAotLy8gIGRhdGE6IC0gaWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgaXMgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgotLy8gICAgICAgICAgICAgIHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgotLy8gICAgICAgICAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLyAgICAgICAgLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBub3Qgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgotLy8gICAgICAgICAgICAgIE4vQQotLy8gIEl0IGlzIGxlZ2FsIHRvIHJlY2VpdmUgYSBudWxsIHBvaW50ZXIgYXMgcFJlcGx5RGF0YSBpbiB3aGljaCBjYXNlIHRoZSBlZmZlY3QgZnJhbWV3b3JrIGhhcwotLy8gIGRlbGVnYXRlZCB2b2x1bWUgY29udHJvbCB0byBhbm90aGVyIGVmZmVjdAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IHRoZSBhdWRpbyBtb2RlLiBUaGUgZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EIGZsYWcgaW4gaXRzCi0vLyAgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogYXVkaW9fbW9kZV9lCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQWxsIHByb3ByaWV0YXJ5IGVmZmVjdCBjb21tYW5kcyBtdXN0IHVzZSBjb21tYW5kIGNvZGVzIGFib3ZlIHRoaXMgdmFsdWUuIFRoZSBzaXplIGFuZCBmb3JtYXQgb2YKLS8vICBjb21tYW5kIGFuZCByZXNwb25zZSBmaWVsZHMgaXMgZnJlZSBpbiB0aGlzIGNhc2UKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vLyBBdWRpbyBidWZmZXIgZGVzY3JpcHRvciB1c2VkIGJ5IHByb2Nlc3MoKSwgYnVmZmVyUHJvdmlkZXIoKSBmdW5jdGlvbnMgYW5kIGJ1ZmZlcl9jb25maWdfdAotLy8gc3RydWN0dXJlLiBNdWx0aS1jaGFubmVsIGF1ZGlvIGlzIGFsd2F5cyBpbnRlcmxlYXZlZC4gVGhlIGNoYW5uZWwgb3JkZXIgaXMgZnJvbSBMU0IgdG8gTVNCIHdpdGgKLS8vIHJlZ2FyZCB0byB0aGUgY2hhbm5lbCBtYXNrIGRlZmluaXRpb24gaW4gYXVkaW9fY2hhbm5lbHNfZSBlLmcgOgotLy8gU3RlcmVvOiBsZWZ0LCByaWdodAotLy8gNSBwb2ludCAxOiBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgZnJvbnQgY2VudGVyLCBsb3cgZnJlcXVlbmN5LCBiYWNrIGxlZnQsIGJhY2sgcmlnaHQKLS8vIFRoZSBidWZmZXIgc2l6ZSBpcyBleHByZXNzZWQgaW4gZnJhbWUgY291bnQsIGEgZnJhbWUgYmVpbmcgY29tcG9zZWQgb2Ygc2FtcGxlcyBmb3IgYWxsCi0vLyBjaGFubmVscyBhdCBhIGdpdmVuIHRpbWUuIEZyYW1lIHNpemUgZm9yIHVuc3BlY2lmaWVkIGZvcm1hdCAoQVVESU9fRk9STUFUX09USEVSKSBpcyA4IGJpdCBieQotLy8gZGVmaW5pdGlvbgotc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIHsKLSAgICBzaXplX3QgICBmcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBidWZmZXIKLSAgICB1bmlvbiB7Ci0gICAgICAgIHZvaWQqICAgICAgIHJhdzsgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQzMl90KiAgICBzMzI7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAzMiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgaW50MTZfdCogICAgczE2OyAgICAgICAgLy8gcG9pbnRlciB0byBzaWduZWQgMTYgYml0IGRhdGEgYXQgc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIHVpbnQ4X3QqICAgIHU4OyAgICAgICAgIC8vIHBvaW50ZXIgdG8gdW5zaWduZWQgOCBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICB9OwotfTsKLQotLy8gVGhlIGJ1ZmZlcl9wcm92aWRlcl9zIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZAotLy8gYnkgdGhlIGVmZmVjdCBlbmdpbmUgcHJvY2VzcygpIGZ1bmN0aW9uIHRvIHF1ZXJ5IGFuZCByZWxlYXNlIGlucHV0Ci0vLyBvciBvdXRwdXQgYXVkaW8gYnVmZmVyLgotLy8gVGhlIGdldEJ1ZmZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSBhIGJ1ZmZlciB3aGVyZSBkYXRhCi0vLyBzaG91bGQgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYnkgcHJvY2VzcygpIGZ1bmN0aW9uLgotLy8gVGhlIHJlbGVhc2VCdWZmZXIoKSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcmV0cmlldmVkCi0vLyB3aXRoIGdldEJ1ZmZlcigpIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLS8vIFRoZSBwcm9jZXNzIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlIGJ1ZmZlciBwcm92aWRlciBtZWNoYW5pc20gdG8gcmV0cmlldmUKLS8vIGlucHV0IG9yIG91dHB1dCBidWZmZXIgaWYgdGhlIGluQnVmZmVyIG9yIG91dEJ1ZmZlciBwYXNzZWQgYXMgYXJndW1lbnQgaXMgTlVMTAotLy8gYW5kIHRoZSBidWZmZXIgY29uZmlndXJhdGlvbiAoYnVmZmVyX2NvbmZpZ190KSBnaXZlbiBieSB0aGUgRUZGRUNUX0NNRF9DT05GSUdVUkUKLS8vIGNvbW1hbmQgZGlkIG5vdCBzcGVjaWZ5IGFuIGF1ZGlvIGJ1ZmZlci4KLQotdHlwZWRlZiBpbnQzMl90ICgqIGJ1ZmZlcl9mdW5jdGlvbl90KSh2b2lkICpjb29raWUsIGF1ZGlvX2J1ZmZlcl90ICpidWZmZXIpOwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfcHJvdmlkZXJfcyB7Ci0gICAgYnVmZmVyX2Z1bmN0aW9uX3QgZ2V0QnVmZmVyOyAgICAgICAvLyByZXRyaWV2ZSBuZXh0IGJ1ZmZlcgotICAgIGJ1ZmZlcl9mdW5jdGlvbl90IHJlbGVhc2VCdWZmZXI7ICAgLy8gcmVsZWFzZSB1c2VkIGJ1ZmZlcgotICAgIHZvaWQgICAgICAgKmNvb2tpZTsgICAgICAgICAgICAgICAgLy8gZm9yIHVzZSBieSBjbGllbnQgb2YgYnVmZmVyIHByb3ZpZGVyIGZ1bmN0aW9ucwotfSBidWZmZXJfcHJvdmlkZXJfdDsKLQotCi0vLyBUaGUgYnVmZmVyX2NvbmZpZ19zIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIGlucHV0IG9yIG91dHB1dCBhdWRpbyBmb3JtYXQKLS8vIHRvIGJlIHVzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuIEl0IGlzIHBhcnQgb2YgdGhlIGVmZmVjdF9jb25maWdfdAotLy8gc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb25zIGFuZCBpcwotLy8gcGFzc2VkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgotdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyX2NvbmZpZ19zIHsKLSAgICBhdWRpb19idWZmZXJfdCAgYnVmZmVyOyAgICAgLy8gYnVmZmVyIGZvciB1c2UgYnkgcHJvY2VzcygpIGZ1bmN0aW9uIGlmIG5vdCBwYXNzZWQgZXhwbGljaXRseQotICAgIHVpbnQzMl90ICAgc2FtcGxpbmdSYXRlOyAgICAvLyBzYW1wbGluZyByYXRlCi0gICAgdWludDMyX3QgICBjaGFubmVsczsgICAgICAgIC8vIGNoYW5uZWwgbWFzayAoc2VlIGF1ZGlvX2NoYW5uZWxzX2UpCi0gICAgYnVmZmVyX3Byb3ZpZGVyX3QgYnVmZmVyUHJvdmlkZXI7ICAgLy8gYnVmZmVyIHByb3ZpZGVyCi0gICAgdWludDhfdCAgICBmb3JtYXQ7ICAgICAgICAgIC8vIEF1ZGlvIGZvcm1hdCAgKHNlZSBhdWRpb19mb3JtYXRfZSkKLSAgICB1aW50OF90ICAgIGFjY2Vzc01vZGU7ICAgICAgLy8gcmVhZC93cml0ZSBvciBhY2N1bXVsYXRlIGluIGJ1ZmZlciAoZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSkKLSAgICB1aW50MTZfdCAgIG1hc2s7ICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBhYm92ZSBmaWVsZHMgaXMgdmFsaWQKLX0gYnVmZmVyX2NvbmZpZ190OwotCi0vLyBTYW1wbGUgZm9ybWF0Ci1lbnVtIGF1ZGlvX2Zvcm1hdF9lIHsKLSAgICBTQU1QTEVfRk9STUFUX1BDTV9TMTUsICAgLy8gUENNIHNpZ25lZCAxNiBiaXRzCi0gICAgU0FNUExFX0ZPUk1BVF9QQ01fVTgsICAgIC8vIFBDTSB1bnNpZ25lZCA4IGJpdHMKLSAgICBTQU1QTEVfRk9STUFUX1BDTV9TN18yNCwgLy8gUENNIHNpZ25lZCA3LjI0IGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uCi0gICAgU0FNUExFX0ZPUk1BVF9PVEhFUiAgICAgIC8vIG90aGVyIGZvcm1hdCAoZS5nLiBjb21wcmVzc2VkKQotfTsKLQotLy8gQ2hhbm5lbCBtYXNrCi1lbnVtIGF1ZGlvX2NoYW5uZWxzX2UgewotICAgIENIQU5ORUxfRlJPTlRfTEVGVCA9IDB4MSwgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgbGVmdCBjaGFubmVsCi0gICAgQ0hBTk5FTF9GUk9OVF9SSUdIVCA9IDB4MiwgICAgICAgICAgICAgICAgICAvLyBmcm9udCByaWdodCBjaGFubmVsCi0gICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgPSAweDQsICAgICAgICAgICAgICAgIC8vIGZyb250IGNlbnRlciBjaGFubmVsCi0gICAgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZID0gMHg4LCAgICAgICAgICAgICAgIC8vIGxvdyBmcmVxdWVuY3kgY2hhbm5lbAotICAgIENIQU5ORUxfQkFDS19MRUZUID0gMHgxMCwgICAgICAgICAgICAgICAgICAgLy8gYmFjayBsZWZ0IGNoYW5uZWwKLSAgICBDSEFOTkVMX0JBQ0tfUklHSFQgPSAweDIwLCAgICAgICAgICAgICAgICAgIC8vIGJhY2sgcmlnaHQgY2hhbm5lbAotICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgPSAweDQwLCAgICAgICAvLyBmcm9udCBsZWZ0IG9mIGNlbnRlciBjaGFubmVsCi0gICAgQ0hBTk5FTF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwLCAgICAgIC8vIGZyb250IHJpZ2h0IG9mIGNlbnRlciBjaGFubmVsCi0gICAgQ0hBTk5FTF9CQUNLX0NFTlRFUiA9IDB4MTAwLCAgICAgICAgICAgICAgICAvLyBiYWNrIGNlbnRlciBjaGFubmVsCi0gICAgQ0hBTk5FTF9NT05PID0gQ0hBTk5FTF9GUk9OVF9MRUZULAotICAgIENIQU5ORUxfU1RFUkVPID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQpLAotICAgIENIQU5ORUxfUVVBRCA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKLSAgICBDSEFOTkVMX1NVUlJPVU5EID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX0JBQ0tfQ0VOVEVSKSwKLSAgICBDSEFOTkVMXzVQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKLSAgICBDSEFOTkVMXzdQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUIHwKLSAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBDSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiksCi19OwotCi0vLyBSZW5kZXIgZGV2aWNlCi1lbnVtIGF1ZGlvX2RldmljZV9lIHsKLSAgICBERVZJQ0VfRUFSUElFQ0UgPSAweDEsICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcnBpZWNlCi0gICAgREVWSUNFX1NQRUFLRVIgPSAweDIsICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVha2VyCi0gICAgREVWSUNFX1dJUkVEX0hFQURTRVQgPSAweDQsICAgICAgICAgICAgICAgICAvLyB3aXJlZCBoZWFkc2V0LCB3aXRoIG1pY3JvcGhvbmUKLSAgICBERVZJQ0VfV0lSRURfSEVBRFBIT05FID0gMHg4LCAgICAgICAgICAgICAgIC8vIHdpcmVkIGhlYWRwaG9uZSwgd2l0aG91dCBtaWNyb3Bob25lCi0gICAgREVWSUNFX0JMVUVUT09USF9TQ08gPSAweDEwLCAgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBTQ08KLSAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VUID0gMHgyMCwgICAgICAgIC8vIGJsdWV0b290aCBTQ08gaGVhZHNldAotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCA9IDB4NDAsICAgICAgICAgLy8gYmx1ZXRvb3RoIFNDTyBjYXIga2l0Ci0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQID0gMHg4MCwgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBBMkRQCi0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMCwgICAvLyBibHVldG9vdGggQTJEUCBoZWFkcGhvbmVzCi0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMCwgICAgICAvLyBibHVldG9vdGggQTJEUCBzcGVha2VycwotICAgIERFVklDRV9BVVhfRElHSVRBTCA9IDB4NDAwLCAgICAgICAgICAgICAgICAgLy8gZGlnaXRhbCBvdXRwdXQKLSAgICBERVZJQ0VfRVhURVJOQUxfU1BFQUtFUiA9IDB4ODAwICAgICAgICAgICAgIC8vIGV4dGVybmFsIHNwZWFrZXIgKHN0ZXJlbyBhbmQgSGlnaCBxdWFsaXR5KQotfTsKLQotLy8gQXVkaW8gbW9kZQotZW51bSBhdWRpb19tb2RlX2UgewotICAgIEFVRElPX0VGRkVDVF9NT0RFX05PUk1BTCwgICAvLyBkZXZpY2UgaWRsZQotICAgIEFVRElPX0VGRkVDVF9NT0RFX1JJTkdUT05FLCAvLyBkZXZpY2UgcmluZ2luZwotICAgIEFVRElPX0VGRkVDVF9NT0RFX0lOX0NBTEwgICAvLyBhdWRpbyBjYWxsIGNvbm5lY3RlZCAoVm9JUCBvciB0ZWxlcGhvbnkpCi19OwotCi0vLyBWYWx1ZXMgZm9yICJhY2Nlc3NNb2RlIiBmaWVsZCBvZiBidWZmZXJfY29uZmlnX3Q6Ci0vLyAgIG92ZXJ3cml0ZSwgcmVhZCBvbmx5LCBhY2N1bXVsYXRlIChyZWFkL21vZGlmeS93cml0ZSkKLWVudW0gZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSB7Ci0gICAgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUsCi0gICAgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRCwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFCi0KLX07Ci0KLS8vIFZhbHVlcyBmb3IgYml0IGZpZWxkICJtYXNrIiBpbiBidWZmZXJfY29uZmlnX3QuIElmIGEgYml0IGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQKLS8vIGluIGJ1ZmZlcl9jb25maWdfdCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGV4ZWN1dGluZyB0aGUgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0JVRkZFUiAgICAweDAwMDEgIC8vIGJ1ZmZlciBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFICAweDAwMDIgIC8vIHNhbXBsaW5nUmF0ZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTICAweDAwMDQgIC8vIGNoYW5uZWxzIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfRk9STUFUICAgIDB4MDAwOCAgLy8gZm9ybWF0IGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUNDX01PREUgIDB4MDAxMCAgLy8gYWNjZXNzTW9kZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1BST1ZJREVSICAweDAwMjAgIC8vIGJ1ZmZlclByb3ZpZGVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUxMIChFRkZFQ1RfQ09ORklHX0JVRkZFUiB8IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFIHwgRUZGRUNUX0NPTkZJR19QUk9WSURFUikKLQotCi0vLyBlZmZlY3RfY29uZmlnX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX0NPTkZJR1VSRQotLy8gY29tbWFuZCB0byBjb25maWd1cmUgYXVkaW8gcGFyYW1ldGVycyBhbmQgYnVmZmVycyBmb3IgZWZmZWN0IGVuZ2luZSBpbnB1dCBhbmQgb3V0cHV0LgotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2NvbmZpZ19zIHsKLSAgICBidWZmZXJfY29uZmlnX3QgICBpbnB1dENmZzsKLSAgICBidWZmZXJfY29uZmlnX3QgICBvdXRwdXRDZmc7OwotfSBlZmZlY3RfY29uZmlnX3Q7Ci0KLQotLy8gZWZmZWN0X3BhcmFtX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX1NFVF9QQVJBTQotLy8gY29tbWFuZCBhbmQgcENtZERhdGEgYW5kIHBSZXBseURhdGEgb2YgRUZGRUNUX0NNRF9HRVRfUEFSQU0gY29tbWFuZC4KLS8vIHBzaXplIGFuZCB2c2l6ZSByZXByZXNlbnQgdGhlIGFjdHVhbCBzaXplIG9mIHBhcmFtZXRlciBhbmQgdmFsdWUuCi0vLwotLy8gTk9URTogdGhlIHN0YXJ0IG9mIHZhbHVlIGZpZWxkIGluc2lkZSB0aGUgZGF0YSBmaWVsZCBpcyBhbHdheXMgb24gYSAzMiBiaXQgYm91bmRhcnk6Ci0vLwotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHN0YXR1cyAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgcHNpemUgICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCB2c2l6ZSAgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAotLy8gIH4gcGFyYW1ldGVyIH4gICA+IHBzaXplICAgICB8Ci0vLyAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgID4gICgocHNpemUgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgfAotLy8gIHwgcGFkZGluZyAgIHwgICAgICAgICAgICAgICB8Ci0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgICAgICAgICAgIHwgICB8Ci0vLyAgfiB2YWx1ZSAgICAgfiAgID4gdnNpemUKLS8vICB8ICAgICAgICAgICB8ICAgfAotLy8gICstLS0tLS0tLS0tLSsKLQotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X3BhcmFtX3MgewotICAgIGludDMyX3QgICAgIHN0YXR1czsgICAgIC8vIFRyYW5zYWN0aW9uIHN0YXR1cyAodW51c2VkIGZvciBjb21tYW5kLCB1c2VkIGZvciByZXBseSkKLSAgICB1aW50MzJfdCAgICBwc2l6ZTsgICAgICAvLyBQYXJhbWV0ZXIgc2l6ZQotICAgIHVpbnQzMl90ICAgIHZzaXplOyAgICAgIC8vIFZhbHVlIHNpemUKLSAgICBjaGFyICAgICAgICBkYXRhW107ICAgICAvLyBTdGFydCBvZiBQYXJhbWV0ZXIgKyBWYWx1ZSBkYXRhCi19IGVmZmVjdF9wYXJhbV90OwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgRWZmZWN0IGxpYnJhcnkgaW50ZXJmYWNlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIEFuIGVmZmVjdCBsaWJyYXJ5IGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBhbmQgZXhwb3NlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zCi0vLyB0byBlbmFibGUgZWZmZWN0IGVudW1lcmF0aW9uIGFuZCBpbnN0YW50aWF0aW9uLiBUaGUgbmFtZSBvZiB0aGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBhcwotLy8gc3BlY2lmaWVkIGhlcmUgYXMgdGhlIGVmZmVjdCBmcmFtZXdvcmsgd2lsbCBnZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3Mgd2l0aCBkbHN5bSgpOgotLy8KLS8vIC0gZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0czsKLS8vIC0gZWZmZWN0X1F1ZXJ5RWZmZWN0X3QgRWZmZWN0UXVlcnlFZmZlY3Q7Ci0vLyAtIGVmZmVjdF9DcmVhdGVFZmZlY3RfdCBFZmZlY3RDcmVhdGU7Ci0vLyAtIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgRWZmZWN0UmVsZWFzZTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMKLS8vCi0vLyAgICBEZXNjcmlwdGlvbjogICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGV4cG9zZWQgYnkgdGhlCi0vLyAgICAgICAgICBsaWJyYXJ5LiBFYWNoIGVmZmVjdCBtdXN0IGhhdmUgYSB1bmlxdWUgZWZmZWN0IHV1aWQgKHNlZQotLy8gICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCkuIFRoaXMgZnVuY3Rpb24gdG9nZXRoZXIgd2l0aCBFZmZlY3RRdWVyeUVmZmVjdCgpCi0vLyAgICAgICAgICBpcyB1c2VkIHRvIGVudW1lcmF0ZSBhbGwgZWZmZWN0cyBwcmVzZW50IGluIHRoZSBsaWJyYXJ5LgotLy8KLS8vICAgIElucHV0L091dHB1dDoKLS8vICAgICAgICAgIHBOdW1FZmZlY3RzOiAgICBhZGRyZXNzIHdoZXJlIHRoZSBudW1iZXIgb2YgZWZmZWN0cyBzaG91bGQgYmUgcmV0dXJuZWQuCi0vLwotLy8gICAgT3V0cHV0OgotLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBOdW1FZmZlY3RzCi0vLyAgICAgICAgKnBOdW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGluIGxpYnJhcnkKLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190KSh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RRdWVyeUVmZmVjdAotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBlZmZlY3QgZW5naW5lIHdoaWNoIGluZGV4IGlzCi0vLyAgICAgICAgICBnaXZlbiBhcyBmaXJzdCBhcmd1bWVudC4KLS8vICAgICAgICAgIFNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGZvciBkZXRhaWxzIG9uIGVmZmVjdCBkZXNjcmlwdG9ycy4KLS8vICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdG9nZXRoZXIgd2l0aCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBpcyB1c2VkIHRvIGVudW1lcmF0ZSBhbGwKLS8vICAgICAgICAgIGVmZmVjdHMgcHJlc2VudCBpbiB0aGUgbGlicmFyeS4gVGhlIGVudW1lcmF0aW9uIHNlcXVlbmNlIGlzOgotLy8gICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtX2VmZmVjdHMpOwotLy8gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZWZmZWN0czsgaSsrKQotLy8gICAgICAgICAgICAgICAgICBFZmZlY3RRdWVyeUVmZmVjdChpLC4uLik7Ci0vLwotLy8gICAgSW5wdXQvT3V0cHV0OgotLy8gICAgICAgICAgaW5kZXg6ICAgICAgICAgIGluZGV4IG9mIHRoZSBlZmZlY3QKLS8vICAgICAgICAgIHBEZXNjcmlwdG9yOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0vLwotLy8gICAgT3V0cHV0OgotLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBEZXNjcmlwdG9yIG9yIGluZGV4Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT1NZUyAgICAgZWZmZWN0IGxpc3QgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCBleGVjdXRpb24gb2YKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIG1vcmUgZWZmZWN0IGF2YWlsYWJsZQotLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXR5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9RdWVyeUVmZmVjdF90KSh1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdENyZWF0ZQotLy8KLS8vICAgIERlc2NyaXB0aW9uOiAgICBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCByZXR1cm5zIGFuCi0vLyAgICAgICAgICBlZmZlY3QgY29udHJvbCBpbnRlcmZhY2Ugb24gdGhpcyBlbmdpbmUuIFRoZSBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZQotLy8gICAgICAgICAgcmVzb3VyY2VzIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIGVmZmVjdCBlbmdpbmUgYW5kIHJldHVybgotLy8gICAgICAgICAgYSBoYW5kbGUgb24gdGhlIGVmZmVjdCBjb250cm9sIGludGVyZmFjZS4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIHV1aWQ6ICAgIHBvaW50ZXIgdG8gdGhlIGVmZmVjdCB1dWlkLgotLy8gICAgICAgICAgc2Vzc2lvbklkOiAgYXVkaW8gc2Vzc2lvbiB0byB3aGljaCB0aGlzIGVmZmVjdCBpbnN0YW5jZSB3aWxsIGJlIGF0dGFjaGVkLiBBbGwgZWZmZWN0cwotLy8gICAgICAgICAgICAgIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGFyZSBjb25uZWN0ZWQgaW4gc2VyaWVzIGFuZCBwcm9jZXNzIHRoZSBzYW1lIHNpZ25hbAotLy8gICAgICAgICAgICAgIHN0cmVhbS4gS25vd2luZyB0aGF0IHR3byBlZmZlY3RzIGFyZSBwYXJ0IG9mIHRoZSBzYW1lIGVmZmVjdCBjaGFpbiBjYW4gaGVscCB0aGUKLS8vICAgICAgICAgICAgICBsaWJyYXJ5IGltcGxlbWVudCBzb21lIGtpbmQgb2Ygb3B0aW1pemF0aW9ucy4KLS8vICAgICAgICAgIGlvSWQ6ICAgaWRlbnRpZmllcyB0aGUgb3V0cHV0IG9yIGlucHV0IHN0cmVhbSB0aGlzIGVmZmVjdCBpcyBkaXJlY3RlZCB0byBhdCBhdWRpbyBIQUwuCi0vLyAgICAgICAgICAgICAgRm9yIGZ1dHVyZSB1c2UgZXNwZWNpYWxseSB3aXRoIHR1bm5lbGVkIEhXIGFjY2VsZXJhdGVkIGVmZmVjdHMKLS8vCi0vLyAgICBJbnB1dC9PdXRwdXQ6Ci0vLyAgICAgICAgICBwSW50ZXJmYWNlOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGludGVyZmFjZS4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcEludGVyZmFjZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAotLy8gICAgICAgICpwSW50ZXJmYWNlOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgaW50ZXJmYWNlIGhhbmRsZS4KLS8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X0NyZWF0ZUVmZmVjdF90KShlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RSZWxlYXNlCi0vLwotLy8gICAgRGVzY3JpcHRpb246ICAgIFJlbGVhc2VzIHRoZSBlZmZlY3QgZW5naW5lIHdob3NlIGhhbmRsZSBpcyBnaXZlbiBhcyBhcmd1bWVudC4KLS8vICAgICAgICAgIEFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSBvZiB0aGUgZWZmZWN0IGFyZQotLy8gICAgICAgICAgcmVsZWFzZWQuCi0vLwotLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgICBpbnRlcmZhY2U6ICAgIGhhbmRsZSBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KLS8vCi0vLyAgICBPdXRwdXQ6Ci0vLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi10eXBlZGVmIGludDMyX3QgKCplZmZlY3RfUmVsZWFzZUVmZmVjdF90KShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKLQotCi0jaWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0KLSNlbmRpZiAvKkFORFJPSURfRUZGRUNUQVBJX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdEJhc3NCb29zdEFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY4ZDc4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0VGRkVDVEJBU1NCT09TVEFQSV9IXwotI2RlZmluZSBBTkRST0lEX0VGRkVDVEJBU1NCT09TVEFQSV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBPUEVOU0xfRVNfSF8KLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9CQVNTQk9PU1RfID0geyAweDA2MzRmMjIwLCAweGRkZDQsIDB4MTFkYiwgMHhhMGZjLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9CQVNTQk9PU1QgPSAmU0xfSUlEX0JBU1NCT09TVF87Ci0jZW5kaWYgLy9PUEVOU0xfRVNfSF8KLQotLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIEJhc3NCb29zdCBlZmZlY3QgKi8KLXR5cGVkZWYgZW51bQotewotICAgIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCi0gICAgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RICi19IHRfYmFzc2Jvb3N0X3BhcmFtczsKLQotI2lmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotCi0jZW5kaWYgLypBTkRST0lEX0VGRkVDVEJBU1NCT09TVEFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0RW52aXJvbm1lbnRhbFJldmVyYkFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFjY2Q4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0RW52aXJvbm1lbnRhbFJldmVyYkFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCi0jZGVmaW5lIEFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBPUEVOU0xfRVNfSF8KLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXyA9IHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDYsIDB4ODMsIDB4OWUgfSB9OwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCID0gJlNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXwotCi0vKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgZW52aXJvbm1lbnRhbCByZXZlcmIgZWZmZWN0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvLyBQYXJhbWV0ZXJzIGJlbG93IGFyZSBhcyBkZWZpbmVkIGluIE9wZW5TTCBFUyBzcGVjaWZpY2F0aW9uIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBpbnRlcmZhY2UKLSAgICBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCwgICAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKLSAgICBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC00MDAwIHRvIDAKLSAgICBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSwgICAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDEwMCB0byAyMDAwMAotICAgIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMTAwIHRvIDEwMDAKLSAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKLSAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVksICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKLSAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMLCAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKLSAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKLSAgICBSRVZFUkJfUEFSQU1fRElGRlVTSU9OLCAgICAgICAgICAgICAvLyBpbiBwZXJtaWxsZXMsICAgIHJhbmdlIDAgdG8gMTAwMAotICAgIFJFVkVSQl9QQVJBTV9ERU5TSVRZLCAgICAgICAgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMCB0byAxMDAwCi0gICAgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMsCi0gICAgUkVWRVJCX1BBUkFNX0JZUEFTUwotfSB0X2Vudl9yZXZlcmJfcGFyYW1zOwotCi0vL3RfcmV2ZXJiX3NldHRpbmdzIGlzIGVxdWFsIHRvIFNMRW52aXJvbm1lbnRhbFJldmVyYlNldHRpbmdzIGRlZmluZWQgaW4gT3BlblNMIEVTIHNwZWNpZmljYXRpb24uCi10eXBlZGVmIHN0cnVjdCBzX3JldmVyYl9zZXR0aW5ncyB7Ci0gICAgaW50MTZfdCAgICAgcm9vbUxldmVsOwotICAgIGludDE2X3QgICAgIHJvb21IRkxldmVsOwotICAgIHVpbnQzMl90ICAgIGRlY2F5VGltZTsKLSAgICBpbnQxNl90ICAgICBkZWNheUhGUmF0aW87Ci0gICAgaW50MTZfdCAgICAgcmVmbGVjdGlvbnNMZXZlbDsKLSAgICB1aW50MzJfdCAgICByZWZsZWN0aW9uc0RlbGF5OwotICAgIGludDE2X3QgICAgIHJldmVyYkxldmVsOwotICAgIHVpbnQzMl90ICAgIHJldmVyYkRlbGF5OwotICAgIGludDE2X3QgICAgIGRpZmZ1c2lvbjsKLSAgICBpbnQxNl90ICAgICBkZW5zaXR5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB0X3JldmVyYl9zZXR0aW5nczsKLQotCi0jaWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0KLSNlbmRpZiAvKkFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MmVhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KLSNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgotCi0jaWZuZGVmIE9QRU5TTF9FU19IXwotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX0VRVUFMSVpFUl8gPSB7IDB4MGJlZDQzMDAsIDB4ZGRkNiwgMHgxMWRiLCAweDhmMzQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Ci1jb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX0VRVUFMSVpFUiA9ICZTTF9JSURfRVFVQUxJWkVSXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXwotCi0jaWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIGVudW1lcmF0ZWQgcGFyYW1ldGVycyBmb3IgRXF1YWxpemVyIGVmZmVjdCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgRVFfUEFSQU1fTlVNX0JBTkRTLCAgICAgICAgICAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmRzIHRoYXQgdGhlIGVxdWFsaXplciBzdXBwb3J0cy4KLSAgICBFUV9QQVJBTV9MRVZFTF9SQU5HRSwgICAgICAgICAgIC8vIFJldHVybnMgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYmFuZCBsZXZlbHMgc3VwcG9ydGVkLgotICAgIEVRX1BBUkFNX0JBTkRfTEVWRUwsICAgICAgICAgICAgLy8gR2V0cy9TZXRzIHRoZSBnYWluIHNldCBmb3IgdGhlIGdpdmVuIGVxdWFsaXplciBiYW5kLgotICAgIEVRX1BBUkFNX0NFTlRFUl9GUkVRLCAgICAgICAgICAgLy8gR2V0cyB0aGUgY2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgZ2l2ZW4gYmFuZC4KLSAgICBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UsICAgICAgIC8vIEdldHMgdGhlIGZyZXF1ZW5jeSByYW5nZSBvZiB0aGUgZ2l2ZW4gZnJlcXVlbmN5IGJhbmQuCi0gICAgRVFfUEFSQU1fR0VUX0JBTkQsICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBiYW5kIHRoYXQgaGFzIHRoZSBtb3N0IGVmZmVjdCBvbiB0aGUgZ2l2ZW4gZnJlcXVlbmN5LgotICAgIEVRX1BBUkFNX0NVUl9QUkVTRVQsICAgICAgICAgICAgLy8gR2V0cy9TZXRzIHRoZSBjdXJyZW50IHByZXNldC4KLSAgICBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMsICAgIC8vIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwcmVzZXRzIHRoZSBlcXVhbGl6ZXIgc3VwcG9ydHMuCi0gICAgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FLCAgICAgICAvLyBHZXRzIHRoZSBwcmVzZXQgbmFtZSBiYXNlZCBvbiB0aGUgaW5kZXguCi0gICAgRVFfUEFSQU1fUFJPUEVSVElFUyAgICAgICAgICAgICAvLyBHZXRzL1NldHMgYWxsIHBhcmFtZXRlcnMgYXQgYSB0aW1lLgotfSB0X2VxdWFsaXplcl9wYXJhbXM7Ci0KLS8vdF9lcXVhbGl6ZXJfc2V0dGluZ3MgZ3JvdXBzIGFsbCBjdXJyZW50IGVxdWFsaXplciBzZXR0aW5nIGZvciBiYWNrdXAgYW5kIHJlc3RvcmUuCi10eXBlZGVmIHN0cnVjdCBzX2VxdWFsaXplcl9zZXR0aW5ncyB7Ci0gICAgdWludDE2X3QgY3VyUHJlc2V0OwotICAgIHVpbnQxNl90IG51bUJhbmRzOwotICAgIHVpbnQxNl90IGJhbmRMZXZlbHNbXTsKLX0gdF9lcXVhbGl6ZXJfc2V0dGluZ3M7Ci0KLSNpZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLQotI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RFUVVBTElaRVJBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjA5NGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCi0jZGVmaW5lIEFORFJPSURfRUZGRUNUUFJFU0VUUkVWRVJCQVBJX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KLQotI2lmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIE9QRU5TTF9FU19IXwotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1BSRVNFVFJFVkVSQl8gPSB7IDB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Ci1jb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1BSRVNFVFJFVkVSQiA9ICZTTF9JSURfUFJFU0VUUkVWRVJCXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXwotCi0vKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgcHJlc2V0IHJldmVyYiBlZmZlY3QgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFJFVkVSQl9QQVJBTV9QUkVTRVQKLX0gdF9wcmVzZXRfcmV2ZXJiX3BhcmFtczsKLQotCi10eXBlZGVmIGVudW0KLXsKLSAgICBSRVZFUkJfUFJFU0VUX05PTkUsCi0gICAgUkVWRVJCX1BSRVNFVF9TTUFMTFJPT00sCi0gICAgUkVWRVJCX1BSRVNFVF9NRURJVU1ST09NLAotICAgIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NLAotICAgIFJFVkVSQl9QUkVTRVRfTUVESVVNSEFMTCwKLSAgICBSRVZFUkJfUFJFU0VUX0xBUkdFSEFMTCwKLSAgICBSRVZFUkJfUFJFU0VUX1BMQVRFLAotICAgIFJFVkVSQl9QUkVTRVRfTEFTVCA9IFJFVkVSQl9QUkVTRVRfUExBVEUKLX0gdF9yZXZlcmJfcHJlc2V0czsKLQotI2lmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotCi0jZW5kaWYgLypBTkRST0lEX0VGRkVDVFBSRVNFVFJFVkVSQkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDUxMzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXwotI2RlZmluZSBBTkRST0lEX0VGRkVDVFZJUlRVQUxJWkVSQVBJX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KLQotI2lmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIE9QRU5TTF9FU19IXwotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJUlRVQUxJWkVSXyA9IHsgMHgzN2NjMmMwMCwgMHhkZGRkLCAweDExZGIsIDB4ODU3NywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfVklSVFVBTElaRVIgPSAmU0xfSUlEX1ZJUlRVQUxJWkVSXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXwotCi0vKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgdmlydHVhbGl6ZXIgZWZmZWN0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCi0gICAgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEgKLX0gdF92aXJ0dWFsaXplcl9wYXJhbXM7Ci0KLSNpZiBfX2NwbHVzcGx1cwotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLQotI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYxYTRmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfCi0jZGVmaW5lIEFORFJPSURfRUZGRUNUVklTVUFMSVpFUkFQSV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+Ci0KLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBPUEVOU0xfRVNfSF8KLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9WSVNVQUxJWkFUSU9OXyA9Ci0gICAgeyAweGU0NmIyNmEwLCAweGRkZGQsIDB4MTFkYiwgMHg4YWZkLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9WSVNVQUxJWkFUSU9OID0gJlNMX0lJRF9WSVNVQUxJWkFUSU9OXzsKLSNlbmRpZiAvL09QRU5TTF9FU19IXwotCi0jZGVmaW5lIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCAxMDI0ICAvLyBtYXhpbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCi0jZGVmaW5lIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTiAxMjggICAvLyBtaW5pbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCi0KLS8qIGVudW1lcmF0ZWQgcGFyYW1ldGVycyBmb3IgVmlzdWFsaXplciBlZmZlY3QgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFLCAgICAgICAgLy8gU2V0cyB0aGUgbnVtYmVyIFBDTSBzYW1wbGVzIGluIHRoZSBjYXB0dXJlLgotfSB0X3Zpc3VhbGl6ZXJfcGFyYW1zOwotCi0vKiBjb21tYW5kcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgVklTVV9DTURfQ0FQVFVSRSA9IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlksIC8vIEdldHMgdGhlIGxhdGVzdCBQQ00gY2FwdHVyZS4KLX10X3Zpc3VhbGl6ZXJfY21kczsKLQotLy8gVklTVV9DTURfQ0FQVFVSRSByZXRyaWV2ZXMgdGhlIGxhdGVzdCBQQ00gc25hcHNob3QgY2FwdHVyZWQgYnkgdGhlIHZpc3VhbGl6ZXIgZW5naW5lLgotLy8gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgc3BlY2lmaWVkIGJ5IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFCi0vLyBpbiA4IGJpdCB1bnNpZ25lZCBmb3JtYXQgKDAgPSAweDgwKQotCi0jaWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0KLSNlbmRpZiAvKkFORFJPSURfRUZGRUNUVklTVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKaW5kZXggMGVkMWExNC4uOGFlMTNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC05OSwxNyArOTksMTcgQEAKIC8vICAgICAgICAgICAgICB1c2UgZXNwZWNpYWxseSB3aXRoIHR1bm5lbGVkIEhXIGFjY2VsZXJhdGVkIGVmZmVjdHMKIC8vCiAvLyAgICBJbnB1dC9PdXRwdXQ6Ci0vLyAgICAgICAgICBwSW50ZXJmYWNlOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGludGVyZmFjZS4KKy8vICAgICAgICAgIHBIYW5kbGU6ICAgICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGhhbmRsZS4KIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcEludGVyZmFjZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcEhhbmRsZQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAotLy8gICAgICAgICpwSW50ZXJmYWNlOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgorLy8gICAgICAgICpwSGFuZGxlOiAgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGhhbmRsZS4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKTsKK2ludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSk7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpAQCAtMTIwLDcgKzEyMCw3IEBACiAvLyAgICAgICAgICByZWxlYXNlZC4KIC8vCiAvLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KKy8vICAgICAgICAgIGhhbmRsZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCkBAIC0xMjgsNTEgKzEyOCw3IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlcgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0TG9hZExpYnJhcnkKLS8vCi0vLyAgICBEZXNjcmlwdGlvbjogICAgTG9hZHMgdGhlIGVmZmVjdCBsaWJyYXJ5IHdoaWNoIHBhdGggaXMgZ2l2ZW4gYXMgZmlyc3QgYXJndW1lbnQuCi0vLyAgICAgICAgICBUaGlzIG11c3QgYmUgdGhlIGZ1bGwgcGF0aCBvZiBhIGR5bmFtaWMgbGlicmFyeSAoLnNvKSBpbXBsZW1lbnRpbmcgb25lIG9yCi0vLyAgICAgICAgICBtb3JlIGVmZmVjdCBlbmdpbmVzIGFuZCBleHBvc2luZyB0aGUgZWZmZWN0IGxpYnJhcnkgaW50ZXJmYWNlIGRlc2NyaWJlZCBpbgotLy8gICAgICAgICAgRWZmZWN0QXBpLmguIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlIG9uIHRoZSBsaWJyYXJ5IGZvciB1c2VkIGJ5Ci0vLyAgICAgICAgICBmdXJ0aGVyIGNhbGwgdG8gRWZmZWN0VW5sb2FkTGlicmFyeSgpIHRvIHVubG9hZCB0aGUgbGlicmFyeS4KLS8vCi0vLyAgICBJbnB1dDoKLS8vICAgICAgICAgIGxpYlBhdGg6ICAgIGZ1bGwgcGF0aCBvZiB0aGUgZHluYW1pYyBsaWJyYXJ5IGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtLgotLy8KLS8vICAgICAgICAgIGhhbmRsZTogICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBsaWJyYXJ5IGhhbmRsZQotLy8KLS8vICAgIE91dHB1dDoKLS8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQgb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbnMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIGxpYlBhdGggc3RyaW5nIG9yIGhhbmRsZQotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1pbnQgRWZmZWN0TG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RVbmxvYWRMaWJyYXJ5Ci0vLwotLy8gICAgRGVzY3JpcHRpb246ICBVbmxvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCi0vLwotLy8gICAgSW5wdXQ6Ci0vLyAgICAgICAgICBoYW5kbGU6IGxpYnJhcnkgaGFuZGxlCi0vLwotLy8gICAgT3V0cHV0OgotLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIGludmFsaWQgaGFuZGxlCi0vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWludCBFZmZlY3RVbmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpOwotCi0KK2ludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggNTg5ZjdjZC4uNDAzN2M0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQ4LDggKzQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtNjEsOCArNjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTczLDcgKzczLDcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoaW50IG91dHB1dCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKIApAQCAtMTM5LDEwICsxMzksNiBAQAogCiAgICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkgPSAwOwotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDcyMGE1NjIuLmVkMjY1ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM5LDUwICs0MCw1NCBAQAogICAgIC8vCiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAorICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShpbnQgc3RhdGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzaykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKSA9IDA7Ci0gICAgdmlydHVhbCBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBnZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlKSA9IDA7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfSU5ESVJFQ1QpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0gKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpMCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzID0gKGF1ZGlvX2luX2Fjb3VzdGljc190KTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gMCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50ICppbmRleCkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNTdHJlYW1BY3RpdmUoaW50IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA4ZTNjZGJiLi4xYzFjMjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0xOCwxMCArMTgsMTEgQEAKICNpZm5kZWYgQU5EUk9JRF9JTUVESUFNRVRBREFUQVJFVFJJRVZFUl9ICiAjZGVmaW5lIEFORFJPSURfSU1FRElBTUVUQURBVEFSRVRSSUVWRVJfSAogCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzAsNyArMzEsMTEgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBzcmNVcmwpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGV4dHJhY3RBbGJ1bUFydCgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IDcwNTE5ZWYuLmQ1NTJiMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtMjQsNyArMjQsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBQYXJjZWw7Ci1jbGFzcyBJU3VyZmFjZTsKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJU3VyZmFjZVRleHR1cmU7CiAKQEAgLTUyLDYgKzUxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KSA9IDA7CiAKICAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCiAgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oCmluZGV4IGVlZTZjOTcuLmRhZWMxYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaApAQCAtMjgsNyArMjgsNyBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFQbGF5ZXJDbGllbnQpOwogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAppbmRleCAyOGJlN2MxLi5lYzg0ZTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCkBAIC0yNCwzNSArMjQsMzggQEAKIAogY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElDYW1lcmE7CitjbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk7CiBjbGFzcyBJTWVkaWFSZWNvcmRlckNsaWVudDsKK2NsYXNzIElTdXJmYWNlVGV4dHVyZTsKIAogY2xhc3MgSU1lZGlhUmVjb3JkZXI6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyKTsKIAotICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb1NvdXJjZShpbnQgdnMpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb1NvdXJjZShpbnQgYXMpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRPdXRwdXRGb3JtYXQoaW50IG9mKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9FbmNvZGVyKGludCB2ZSkgPSAwOwotICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldEF1ZGlvRW5jb2RlcihpbnQgYWUpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJcHJlcGFyZSgpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlnZXRNYXhBbXBsaXR1ZGUoaW50KiBtYXgpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzdG9wKCkgPSAwOwotICAgIHZpcnR1YWwJc3RhdHVzX3QJCXJlc2V0KCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGluaXQoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2xvc2UoKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJcmVsZWFzZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1NvdXJjZShpbnQgYXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRW5jb2RlcihpbnQgdmUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heEFtcGxpdHVkZShpbnQqIG1heCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlKCkgPSAwOworICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggMTZhOTM0Mi4uMDJhZDcwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTMzLDcgKzMzLDYgQEAKIGNsYXNzIElNZW1vcnk7CiBjbGFzcyBJT01YT2JzZXJ2ZXI7CiBjbGFzcyBJT01YUmVuZGVyZXI7Ci1jbGFzcyBJU3VyZmFjZTsKIGNsYXNzIFN1cmZhY2U7CiAKIGNsYXNzIElPTVggOiBwdWJsaWMgSUludGVyZmFjZSB7CkBAIC0xODUsNiArMTg0LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogfTsKIAorc3RydWN0IENvZGVjUHJvZmlsZUxldmVsIHsKKyAgICBPTVhfVTMyIG1Qcm9maWxlOworICAgIE9NWF9VMzIgbUxldmVsOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0lPTVhfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKaW5kZXggZDMxMGNlZS4uY2M2MzM1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKQEAgLTUxLDYgKzUxLDE3IEBACiAgICAgLy8gd2lsbCBiZSBzdXBwcmVzc2VkIHVudGlsIG1lZGlhIHRpbWUgcmVhY2hlcyB0aGlzIHRpbWVzdGFtcC4KICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleVJlc3VtZUF0UFRTOwogCisgICAgLy8gV2hlbiBzaWduYWxsaW5nIGEgZGlzY29udGludWl0eSB5b3UgY2FuIG9wdGlvbmFsbHkKKyAgICAvLyBzaWduYWwgdGhhdCB0aGlzIGlzIGEgImhhcmQiIGRpc2NvbnRpbnVpdHksIGkuZS4gdGhlIGZvcm1hdAorICAgIC8vIG9yIGNvbmZpZ3VyYXRpb24gb2Ygc3Vic2VxdWVudCBzdHJlYW0gZGF0YSBkaWZmZXJzIGZyb20gdGhhdAorICAgIC8vIGN1cnJlbnRseSBhY3RpdmUuIFRvIGRvIHNvLCBpbmNsdWRlIGEgbm9uLXplcm8gaW50MzJfdCB2YWx1ZQorICAgIC8vIHVuZGVyIHRoZSBrZXkgImtLZXlGb3JtYXRDaGFuZ2UiIHdoZW4gaXNzdWluZyB0aGUgRElTQ09OVElOVUlUWQorICAgIC8vIGNvbW1hbmQuCisgICAgLy8gVGhlIG5ldyBsb2dpY2FsIHN0cmVhbSBtdXN0IHN0YXJ0IHdpdGggcHJvcGVyIGNvZGVjIGluaXRpYWxpemF0aW9uCisgICAgLy8gaW5mb3JtYXRpb24gZm9yIHBsYXliYWNrIHRvIGNvbnRpbnVlLCBpLmUuIFNQUyBhbmQgUFBTIGluIHRoZSBjYXNlCisgICAgLy8gb2YgQVZDIHZpZGVvIGV0Yy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleUZvcm1hdENoYW5nZTsKKwogICAgIHZpcnR1YWwgdm9pZCBpc3N1ZUNvbW1hbmQoCiAgICAgICAgICAgICBDb21tYW5kIGNtZCwgYm9vbCBzeW5jaHJvbm91cywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cgPSBOVUxMKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCAwNDQ5MTIyLi4yN2I3ZTRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtMzAsNyArMzAsMTEgQEAKIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlKCkge30KICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSgpIHt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKICAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0KiBleHRyYWN0QWxidW1BcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggMTE3ZDdlYi4uNDMyOGQzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMzIsNyArMzIsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBQYXJjZWw7Ci1jbGFzcyBJU3VyZmFjZTsKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJU3VyZmFjZVRleHR1cmU7CiAKQEAgLTU2LDcgKzU1LDggQEAKIAogCiAvLyBjYWxsYmFjayBtZWNoYW5pc20gZm9yIHBhc3NpbmcgbWVzc2FnZXMgdG8gTWVkaWFQbGF5ZXIgb2JqZWN0Ci10eXBlZGVmIHZvaWQgKCpub3RpZnlfY2FsbGJhY2tfZikodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwordHlwZWRlZiB2b2lkICgqbm90aWZ5X2NhbGxiYWNrX2YpKHZvaWQqIGNvb2tpZSwKKyAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAKIC8vIGFic3RyYWN0IGJhc2UgY2xhc3MgLSB1c2UgTWVkaWFQbGF5ZXJJbnRlcmZhY2UKIGNsYXNzIE1lZGlhUGxheWVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlCkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgIC8vIGF1ZGlvIGRhdGEuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb3BlbigKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgIGludCBmb3JtYXQ9QXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgaW50IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCkgPSAwOwpAQCAtMTAzLDYgKzEwMywxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaGFyZHdhcmVPdXRwdXQoKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFVJRCh1aWRfdCB1aWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwpAQCAtMTMyLDYgKzEzNiw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZXNldCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldExvb3BpbmcoaW50IGxvb3ApID0gMDsKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOwogCiAgICAgLy8gSW52b2tlIGEgZ2VuZXJpYyBtZXRob2Qgb24gdGhlIHBsYXllciBieSB1c2luZyBvcGFxdWUgcGFyY2VscwogICAgIC8vIGZvciB0aGUgcmVxdWVzdCBhbmQgcmVwbHkuCkBAIC0xNjAsOSArMTY2LDE0IEBACiAgICAgICAgIG1Db29raWUgPSBjb29raWU7IG1Ob3RpZnkgPSBub3RpZnlGdW5jOwogICAgIH0KIAotICAgIHZvaWQgICAgICAgIHNlbmRFdmVudChpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wKSB7CisgICAgdm9pZCAgICAgICAgc2VuZEV2ZW50KGludCBtc2csIGludCBleHQxPTAsIGludCBleHQyPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqb2JqPU5VTEwpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Ob3RpZnlMb2NrKTsKLSAgICAgICAgaWYgKG1Ob3RpZnkpIG1Ob3RpZnkobUNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgaWYgKG1Ob3RpZnkpIG1Ob3RpZnkobUNvb2tpZSwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggZjIxMDdlYy4uNjlkNTAwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTQ1LDYgKzQ1LDE4IEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDYsCiB9OwogCisvKioKKyAqU2V0IENJRiBhcyBkZWZhdWx0IG1heGltdW0gaW1wb3J0IGFuZCBleHBvcnQgcmVzb2x1dGlvbiBvZiB2aWRlbyBlZGl0b3IuCisgKlRoZSBtYXhpbXVtIGltcG9ydCBhbmQgZXhwb3J0IHJlc29sdXRpb25zIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYywKKyAqd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQgaW4gbWVkaWFfcHJvZmlsZXMueG1sLgorICovCitlbnVtIHZpZGVvZWRpdG9yX2NhcGFiaWxpdHkgeworICAgIFZJREVPRURJVE9SX0RFRkFVTFRfTUFYX0lOUFVUX0ZSQU1FX1dJRFRIID0gMzUyLAorICAgIFZJREVPRURJVE9SX0RFRlVBTFRfTUFYX0lOUFVUX0ZSQU1FX0hFSUdIVCA9IDI4OCwKKyAgICBWSURFT0VESVRPUl9ERUZBVUxUX01BWF9PVVRQVVRfRlJBTUVfV0lEVEggPSAzNTIsCisgICAgVklERU9FRElUT1JfREVGVUFMVF9NQVhfT1VUUFVUX0ZSQU1FX0hFSUdIVCA9IDI4OCwKK307CisKIGVudW0gdmlkZW9fZGVjb2RlciB7CiAgICAgVklERU9fREVDT0RFUl9XTVYsCiB9OwpAQCAtMTE3LDYgKzEyOSwxNyBAQAogICAgIGludCBnZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLCB2aWRlb19lbmNvZGVyIGNvZGVjKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBmb3IgdGhlIHZpZGVvIGVkaXRvciBjYXAKKyAgICAgKiBwYXJhbSBvciAtMSBpZiBlcnJvci4KKyAgICAgKiBTdXBwb3J0ZWQgcGFyYW0gbmFtZSBhcmU6CisgICAgICogdmlkZW9lZGl0b3IuaW5wdXQud2lkdGgubWF4IC0gbWF4IGlucHV0IHZpZGVvIGZyYW1lIHdpZHRoCisgICAgICogdmlkZW9lZGl0b3IuaW5wdXQuaGVpZ2h0Lm1heCAtIG1heCBpbnB1dCB2aWRlbyBmcmFtZSBoZWlnaHQKKyAgICAgKiB2aWRlb2VkaXRvci5vdXRwdXQud2lkdGgubWF4IC0gbWF4IG91dHB1dCB2aWRlbyBmcmFtZSB3aWR0aAorICAgICAqIHZpZGVvZWRpdG9yLm91dHB1dC5oZWlnaHQubWF4IC0gbWF4IG91dHB1dCB2aWRlbyBmcmFtZSBoZWlnaHQKKyAgICAgKi8KKyAgICBpbnQgZ2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGF1ZGlvIGVuY29kZXJzIHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBWZWN0b3I8YXVkaW9fZW5jb2Rlcj4gZ2V0QXVkaW9FbmNvZGVycygpIGNvbnN0OwpAQCAtMTUwLDYgKzE3MywxMiBAQAogICAgICAqLwogICAgIFZlY3RvcjxpbnQ+IGdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCB0aW1lIG9mZnNldCAoaW4gbXMpIGZvciB0aGUgZ2l2ZW4gY2FtZXJhIElkLgorICAgICAqIElmIHRoZSBnaXZlbiBjYW1lcmEgSWQgZG9lcyBub3QgZXhpc3QsIC0xIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgaW50IGdldFN0YXJ0VGltZU9mZnNldE1zKGludCBjYW1lcmFJZCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIC8vIENhbWNvcmRlciBwcm9maWxlcyAoaGlnaC9sb3cpIGFuZCB0aW1lbGFwc2UgcHJvZmlsZXMgKGhpZ2gvbG93KQpAQCAtMTU4LDcgKzE4Nyw3IEBACiAKICAgICBNZWRpYVByb2ZpbGVzJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFQcm9maWxlcyYpOyAgLy8gRG9uJ3QgY2FsbCBtZQogICAgIE1lZGlhUHJvZmlsZXMoY29uc3QgTWVkaWFQcm9maWxlcyYpOyAgICAgICAgICAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgTWVkaWFQcm9maWxlcygpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIER1bW15IGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICBNZWRpYVByb2ZpbGVzKCkgeyBtVmlkZW9FZGl0b3JDYXAgPSBOVUxMOyB9ICAgICAgICAvLyBEdW1teSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgfk1lZGlhUHJvZmlsZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRlbGV0ZSBtZQogCiAgICAgc3RydWN0IFZpZGVvQ29kZWMgewpAQCAtMzA0LDYgKzMzMywyMiBAQAogICAgICAgICBWZWN0b3I8aW50PiBtTGV2ZWxzOwogICAgIH07CiAKKyAgICBzdHJ1Y3QgVmlkZW9FZGl0b3JDYXAgeworICAgICAgICBWaWRlb0VkaXRvckNhcChpbnQgaW5GcmFtZVdpZHRoLCBpbnQgaW5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGludCBvdXRGcmFtZVdpZHRoLCBpbnQgb3V0RnJhbWVIZWlnaHQpCisgICAgICAgICAgICA6IG1NYXhJbnB1dEZyYW1lV2lkdGgoaW5GcmFtZVdpZHRoKSwKKyAgICAgICAgICAgICAgbU1heElucHV0RnJhbWVIZWlnaHQoaW5GcmFtZUhlaWdodCksCisgICAgICAgICAgICAgIG1NYXhPdXRwdXRGcmFtZVdpZHRoKG91dEZyYW1lV2lkdGgpLAorICAgICAgICAgICAgICBtTWF4T3V0cHV0RnJhbWVIZWlnaHQob3V0RnJhbWVIZWlnaHQpIHt9CisKKyAgICAgICAgflZpZGVvRWRpdG9yQ2FwKCkge30KKworICAgICAgICBpbnQgbU1heElucHV0RnJhbWVXaWR0aDsKKyAgICAgICAgaW50IG1NYXhJbnB1dEZyYW1lSGVpZ2h0OworICAgICAgICBpbnQgbU1heE91dHB1dEZyYW1lV2lkdGg7CisgICAgICAgIGludCBtTWF4T3V0cHV0RnJhbWVIZWlnaHQ7CisgICAgfTsKKwogICAgIGludCBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoaW50IGNhbWVyYUlkLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKICAgICB2b2lkIGluaXRSZXF1aXJlZFByb2ZpbGVSZWZzKGNvbnN0IFZlY3RvcjxpbnQ+JiBjYW1lcmFJZHMpOwogICAgIGludCBnZXRSZXF1aXJlZFByb2ZpbGVSZWZJbmRleChpbnQgY2FtZXJhSWQpOwpAQCAtMzE1LDYgKzM2MCw3IEBACiAgICAgc3RhdGljIHZvaWQgbG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IEF1ZGlvRW5jb2RlckNhcCYgY2FwKTsKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0RlY29kZXJDYXAoY29uc3QgVmlkZW9EZWNvZGVyQ2FwJiBjYXApOwogICAgIHN0YXRpYyB2b2lkIGxvZ0F1ZGlvRGVjb2RlckNhcChjb25zdCBBdWRpb0RlY29kZXJDYXAmIGNhcCk7CisgICAgc3RhdGljIHZvaWQgbG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgVmlkZW9FZGl0b3JDYXAmIGNhcCk7CiAKICAgICAvLyBJZiB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIGV4aXN0LCB1c2UgdGhlIHNldHRpbmdzCiAgICAgLy8gZnJvbSB0aGUgeG1sCkBAIC0zMjYsMTIgKzM3MiwxNiBAQAogICAgIHN0YXRpYyBWaWRlb0RlY29kZXJDYXAqIGNyZWF0ZVZpZGVvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7CiAgICAgc3RhdGljIFZpZGVvRW5jb2RlckNhcCogY3JlYXRlVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKICAgICBzdGF0aWMgQXVkaW9FbmNvZGVyQ2FwKiBjcmVhdGVBdWRpb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBWaWRlb0VkaXRvckNhcCogY3JlYXRlVmlkZW9FZGl0b3JDYXAoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKIAogICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlKiBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMsIFZlY3RvcjxpbnQ+JiBjYW1lcmFJZHMpOwogCiAgICAgc3RhdGljIGludCBnZXRDYW1lcmFJZChjb25zdCBjaGFyICoqYXR0cyk7CiAKKyAgICB2b2lkIGFkZFN0YXJ0VGltZU9mZnNldChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzKTsKKwogICAgIEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKiBmaW5kSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdDsKICAgICB2b2lkIGFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cyk7CiAKQEAgLTM2Nyw2ICs0MTcsNyBAQAogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRWaWRlb0VkaXRvckNhcChNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIFZpZGVvRW5jb2RlckNhcCogY3JlYXRlRGVmYXVsdEgyNjNWaWRlb0VuY29kZXJDYXAoKTsKICAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVEZWZhdWx0TTR2VmlkZW9FbmNvZGVyQ2FwKCk7CiAgICAgc3RhdGljIEF1ZGlvRW5jb2RlckNhcCogY3JlYXRlRGVmYXVsdEFtck5CRW5jb2RlckNhcCgpOwpAQCAtNDA4LDYgKzQ1OSw3IEBACiAgICAgVmVjdG9yPFZpZGVvRGVjb2RlckNhcCo+ICBtVmlkZW9EZWNvZGVyczsKICAgICBWZWN0b3I8b3V0cHV0X2Zvcm1hdD4gICAgIG1FbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHM7CiAgICAgVmVjdG9yPEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzICo+ICBtSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHM7CisgICAgS2V5ZWRWZWN0b3I8aW50LCBpbnQ+IG1TdGFydFRpbWVPZmZzZXRzOwogCiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBib29sIG1IYXNSZWZQcm9maWxlOyAgICAgIC8vIFJlZmVycyB0byBhbiBleGlzdGluZyBwcm9maWxlCkBAIC00MjIsNiArNDc0LDcgQEAKIAogICAgIFJlcXVpcmVkUHJvZmlsZXMgKm1SZXF1aXJlZFByb2ZpbGVSZWZzOwogICAgIFZlY3RvcjxpbnQ+ICAgICAgICAgICAgICBtQ2FtZXJhSWRzOworICAgIFZpZGVvRWRpdG9yQ2FwKiBtVmlkZW9FZGl0b3JDYXA7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IGM0MjM0NmUuLmVmNzk5ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTIwLDIzICsyMCwyOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwogY2xhc3MgU3VyZmFjZTsKK2NsYXNzIElTdXJmYWNlVGV4dHVyZTsKIAogc3RydWN0IE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBNZWRpYVJlY29yZGVyQmFzZSgpIHt9CiAgICAgdmlydHVhbCB+TWVkaWFSZWNvcmRlckJhc2UoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlIGFzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBhcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9Tb3VyY2UodmlkZW9fc291cmNlIHZzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGb3JtYXQob3V0cHV0X2Zvcm1hdCBvZikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9FbmNvZGVyKGF1ZGlvX2VuY29kZXIgYWUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRW5jb2Rlcih2aWRlb19lbmNvZGVyIHZlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwpAQCAtNTAsNiArNTUsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhBbXBsaXR1ZGUoaW50ICptYXgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzcDxJU3VyZmFjZVRleHR1cmU+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkgY29uc3QgPSAwOwogCiBwcml2YXRlOgogICAgIE1lZGlhUmVjb3JkZXJCYXNlKGNvbnN0IE1lZGlhUmVjb3JkZXJCYXNlICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmggYi9pbmNsdWRlL21lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBiNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKQEAgLTAsMCArMSwyOCBAQAorCisvKgorICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBNRU1PUllfTEVBS19UUkFDS19VVElMX0gKKyNkZWZpbmUgTUVNT1JZX0xFQUtfVFJBQ0tfVVRJTF9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8qCisgKiBEdW1wIHRoZSBtZW1vcnkgYWRkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byB0aGUgZ2l2ZW4gZmQuCisgKi8KK2V4dGVybiB2b2lkIGR1bXBNZW1vcnlBZGRyZXNzZXMoaW50IGZkKTsKKworfTsKKworI2VuZGlmICAvLyBNRU1PUllfTEVBS19UUkFDS19VVElMX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWV0YWRhdGEuaCBiL2luY2x1ZGUvbWVkaWEvTWV0YWRhdGEuaAppbmRleCA5YzkxNWNlLi4wNzU2N2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01ldGFkYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZXRhZGF0YS5oCkBAIC01MSw0NyArNTEsNDYgQEAKIAogICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBbnkgPSAwOwogCi0gICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggYW5kcm9pZC9tZWRpYS9NZXRhZGF0YS5qYXZhCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga1RpdGxlID0gMTsgICAgICAgICAgIC8vIFN0cmluZwotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtDb21tZW50ID0gMjsgICAgICAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrQ29weXJpZ2h0ID0gMzsgICAgICAgLy8gU3RyaW5nCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga0FsYnVtID0gNDsgICAgICAgICAgIC8vIFN0cmluZwotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBcnRpc3QgPSA1OyAgICAgICAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrQXV0aG9yID0gNjsgICAgICAgICAgLy8gU3RyaW5nCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga0NvbXBvc2VyID0gNzsgICAgICAgIC8vIFN0cmluZwotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtHZW5yZSA9IDg7ICAgICAgICAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrRGF0ZSA9IDk7ICAgICAgICAgICAgLy8gRGF0ZQotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtEdXJhdGlvbiA9IDEwOyAgICAgICAvLyBJbnRlZ2VyKG1pbGxpc2VjKQotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtDZFRyYWNrTnVtID0gMTE7ICAgICAvLyBJbnRlZ2VyIDEtYmFzZWQKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrQ2RUcmFja01heCA9IDEyOyAgICAgLy8gSW50ZWdlcgotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtSYXRpbmcgPSAxMzsgICAgICAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrQWxidW1BcnQgPSAxNDsgICAgICAgLy8gYnl0ZVtdCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga1ZpZGVvRnJhbWUgPSAxNTsgICAgIC8vIEJpdG1hcAotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtDYXB0aW9uID0gMTY7ICAgICAgICAvLyBUaW1lZFRleHQKKyAgICAvLyBQbGF5YmFjayBjYXBhYmlsaXRpZXMuCisgICAgc3RhdGljIGNvbnN0IFR5cGUga1BhdXNlQXZhaWxhYmxlICAgICAgICA9IDE7IC8vIEJvb2xlYW4KKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0JhY2t3YXJkQXZhaWxhYmxlID0gMjsgLy8gQm9vbGVhbgorICAgIHN0YXRpYyBjb25zdCBUeXBlIGtTZWVrRm9yd2FyZEF2YWlsYWJsZSAgPSAzOyAvLyBCb29sZWFuCisgICAgc3RhdGljIGNvbnN0IFR5cGUga1NlZWtBdmFpbGFibGUgICAgICAgICA9IDQ7IC8vIEJvb2xlYW4KIAotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtCaXRSYXRlID0gMTc7ICAgICAgIC8vIEludGVnZXIsIEFnZ3JlZ2F0ZSByYXRlIG9mCisgICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggYW5kcm9pZC9tZWRpYS9NZXRhZGF0YS5qYXZhCisgICAgc3RhdGljIGNvbnN0IFR5cGUga1RpdGxlICAgICAgICAgICAgICAgICA9IDU7IC8vIFN0cmluZworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtDb21tZW50ICAgICAgICAgICAgICAgPSA2OyAvLyBTdHJpbmcKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrQ29weXJpZ2h0ICAgICAgICAgICAgID0gNzsgLy8gU3RyaW5nCisgICAgc3RhdGljIGNvbnN0IFR5cGUga0FsYnVtICAgICAgICAgICAgICAgICA9IDg7IC8vIFN0cmluZworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBcnRpc3QgICAgICAgICAgICAgICAgPSA5OyAvLyBTdHJpbmcKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrQXV0aG9yICAgICAgICAgICAgICAgID0gMTA7IC8vIFN0cmluZworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtDb21wb3NlciAgICAgICAgICAgICAgPSAxMTsgLy8gU3RyaW5nCisgICAgc3RhdGljIGNvbnN0IFR5cGUga0dlbnJlICAgICAgICAgICAgICAgICA9IDEyOyAvLyBTdHJpbmcKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrRGF0ZSAgICAgICAgICAgICAgICAgID0gMTM7IC8vIERhdGUKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrRHVyYXRpb24gICAgICAgICAgICAgID0gMTQ7IC8vIEludGVnZXIobWlsbGlzZWMpCisgICAgc3RhdGljIGNvbnN0IFR5cGUga0NkVHJhY2tOdW0gICAgICAgICAgICA9IDE1OyAvLyBJbnRlZ2VyIDEtYmFzZWQKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrQ2RUcmFja01heCAgICAgICAgICAgID0gMTY7IC8vIEludGVnZXIKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrUmF0aW5nICAgICAgICAgICAgICAgID0gMTc7IC8vIFN0cmluZworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBbGJ1bUFydCAgICAgICAgICAgICAgPSAxODsgLy8gYnl0ZVtdCisgICAgc3RhdGljIGNvbnN0IFR5cGUga1ZpZGVvRnJhbWUgICAgICAgICAgICA9IDE5OyAvLyBCaXRtYXAKKworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtCaXRSYXRlICAgICAgICAgICAgICAgPSAyMDsgLy8gSW50ZWdlciwgQWdncmVnYXRlIHJhdGUgb2YKICAgICAvLyBhbGwgdGhlIHN0cmVhbXMgaW4gYnBzLgogCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga0F1ZGlvQml0UmF0ZSA9IDE4OyAvLyBJbnRlZ2VyLCBicHMKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9CaXRSYXRlID0gMTk7IC8vIEludGVnZXIsIGJwcwotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBdWRpb1NhbXBsZVJhdGUgPSAyMDsgLy8gSW50ZWdlciwgSHoKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9mcmFtZVJhdGUgPSAyMTsgIC8vIEludGVnZXIsIEh6CisgICAgc3RhdGljIGNvbnN0IFR5cGUga0F1ZGlvQml0UmF0ZSAgICAgICAgICA9IDIxOyAvLyBJbnRlZ2VyLCBicHMKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9CaXRSYXRlICAgICAgICAgID0gMjI7IC8vIEludGVnZXIsIGJwcworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBdWRpb1NhbXBsZVJhdGUgICAgICAgPSAyMzsgLy8gSW50ZWdlciwgSHoKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9mcmFtZVJhdGUgICAgICAgID0gMjQ7IC8vIEludGVnZXIsIEh6CiAKICAgICAvLyBTZWUgUkZDMjA0NiBhbmQgUkZDNDI4MS4KLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrTWltZVR5cGUgPSAyMjsgICAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrQXVkaW9Db2RlYyA9IDIzOyAgICAvLyBTdHJpbmcKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9Db2RlYyA9IDI0OyAgICAvLyBTdHJpbmcKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrTWltZVR5cGUgICAgICAgICAgICAgID0gMjU7IC8vIFN0cmluZworICAgIHN0YXRpYyBjb25zdCBUeXBlIGtBdWRpb0NvZGVjICAgICAgICAgICAgPSAyNjsgLy8gU3RyaW5nCisgICAgc3RhdGljIGNvbnN0IFR5cGUga1ZpZGVvQ29kZWMgICAgICAgICAgICA9IDI3OyAvLyBTdHJpbmcKIAotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtWaWRlb0hlaWdodCA9IDI1OyAgIC8vIEludGVnZXIKLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9XaWR0aCA9IDI2OyAgICAvLyBJbnRlZ2VyCi0gICAgc3RhdGljIGNvbnN0IFR5cGUga051bVRyYWNrcyA9IDI3OyAgICAgLy8gSW50ZWdlcgotICAgIHN0YXRpYyBjb25zdCBUeXBlIGtEcm1DcmlwcGxlZCA9IDI4OyAgIC8vIEJvb2xlYW4KLQotICAgIC8vIFBsYXliYWNrIGNhcGFiaWxpdGllcy4KLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrUGF1c2VBdmFpbGFibGUgPSAyOTsgICAgICAgIC8vIEJvb2xlYW4KLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0JhY2t3YXJkQXZhaWxhYmxlID0gMzA7IC8vIEJvb2xlYW4KLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0ZvcndhcmRBdmFpbGFibGUgPSAzMTsgIC8vIEJvb2xlYW4KLSAgICBzdGF0aWMgY29uc3QgVHlwZSBrU2Vla0F2YWlsYWJsZSA9IDMyOyAgICAgICAgIC8vIEJvb2xlYW4KKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9IZWlnaHQgICAgICAgICAgID0gMjg7IC8vIEludGVnZXIKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrVmlkZW9XaWR0aCAgICAgICAgICAgID0gMjk7IC8vIEludGVnZXIKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrTnVtVHJhY2tzICAgICAgICAgICAgID0gMzA7IC8vIEludGVnZXIKKyAgICBzdGF0aWMgY29uc3QgVHlwZSBrRHJtQ3JpcHBsZWQgICAgICAgICAgID0gMzE7IC8vIEJvb2xlYW4KIAogICAgIC8vIEBwYXJhbSBwW2lub3V0XSBUaGUgcGFyY2VsIHRvIGFwcGVuZCB0aGUgbWV0YWRhdGEgcmVjb3JkcwogICAgIC8vIHRvLiBUaGUgZ2xvYmFsIG1ldGFkYXRhIGhlYWRlciBzaG91bGQgaGF2ZSBiZWVuIHNldCBhbHJlYWR5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmggYi9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaAppbmRleCBiODc0NmMyLi41ZDJjODc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggZTkwNTAwNi4uOWFhNjcwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTQ3LDYgKzQ3LDE0IEBACiAgICAgTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNUICAgICA9IDEzLAogICAgIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiAgICAgPSAxNCwKICAgICBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04gICAgID0gMTUsCisgICAgTUVUQURBVEFfS0VZX0hBU19BVURJTyAgICAgICA9IDE2LAorICAgIE1FVEFEQVRBX0tFWV9IQVNfVklERU8gICAgICAgPSAxNywKKyAgICBNRVRBREFUQV9LRVlfVklERU9fV0lEVEggICAgID0gMTgsCisgICAgTUVUQURBVEFfS0VZX1ZJREVPX0hFSUdIVCAgICA9IDE5LAorICAgIE1FVEFEQVRBX0tFWV9CSVRSQVRFICAgICAgICAgPSAyMCwKKyAgICBNRVRBREFUQV9LRVlfVElNRURfVEVYVF9MQU5HVUFHRVMgICAgICA9IDIxLAorICAgIE1FVEFEQVRBX0tFWV9JU19EUk0gICAgICAgICAgPSAyMiwKKwogICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KIH07CiAKQEAgLTU2LDcgKzY0LDExIEBACiAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwogICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7CiAgICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBkYXRhU291cmNlVXJsKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhU291cmNlVXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKKwogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0QWxidW1BcnQoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA1MjhlZWI5Li4xYTY3NjcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKK2NsYXNzIEFOYXRpdmVXaW5kb3c7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgU3VyZmFjZTsKQEAgLTM3LDYgKzM5LDcgQEAKICAgICBNRURJQV9CVUZGRVJJTkdfVVBEQVRFICA9IDMsCiAgICAgTUVESUFfU0VFS19DT01QTEVURSAgICAgPSA0LAogICAgIE1FRElBX1NFVF9WSURFT19TSVpFICAgID0gNSwKKyAgICBNRURJQV9USU1FRF9URVhUICAgICAgICA9IDk5LAogICAgIE1FRElBX0VSUk9SICAgICAgICAgICAgID0gMTAwLAogICAgIE1FRElBX0lORk8gICAgICAgICAgICAgID0gMjAwLAogfTsKQEAgLTk5LDYgKzEwMiw5IEBACiAgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQgPSA3MDEsCiAgICAgLy8gTWVkaWFQbGF5ZXIgaXMgcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgZmlsbGluZyBidWZmZXJzLgogICAgIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCA9IDcwMiwKKyAgICAvLyBCYW5kd2lkdGggaW4gcmVjZW50IHBhc3QKKyAgICBNRURJQV9JTkZPX05FVFdPUktfQkFORFdJRFRIID0gNzAzLAorCiAgICAgLy8gOHh4CiAgICAgLy8gQmFkIGludGVybGVhdmluZyBtZWFucyB0aGF0IGEgbWVkaWEgaGFzIGJlZW4gaW1wcm9wZXJseSBpbnRlcmxlYXZlZCBvciBub3QKICAgICAvLyBpbnRlcmxlYXZlZCBhdCBhbGwsIGUuZyBoYXMgYWxsIHRoZSB2aWRlbyBzYW1wbGVzIGZpcnN0IHRoZW4gYWxsIHRoZSBhdWRpbwpAQCAtMTI0LDEyICsxMzAsMjggQEAKICAgICBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA3CiB9OwogCisvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIuamF2YS4KKy8vIFRoZSBzYW1lIGVudW0gc3BhY2UgaXMgdXNlZCBmb3IgYm90aCBzZXQgYW5kIGdldCwgaW4gY2FzZSB0aGVyZSBhcmUgZnV0dXJlIGtleXMgdGhhdAorLy8gY2FuIGJlIGJvdGggc2V0IGFuZCBnZXQuICBCdXQgYXMgb2Ygbm93LCBhbGwgcGFyYW1ldGVycyBhcmUgZWl0aGVyIHNldCBvbmx5IG9yIGdldCBvbmx5LgorZW51bSBtZWRpYV9wYXJhbWV0ZXJfa2V5cyB7CisgICAgS0VZX1BBUkFNRVRFUl9USU1FRF9URVhUX1RSQUNLX0lOREVYID0gMTAwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKyAgICBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfQUREX09VVF9PRl9CQU5EX1NPVVJDRSA9IDEwMDEsICAgICAvLyBzZXQgb25seQorCisgICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCisgICAgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUyA9IDExMDAsICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFJldHVybiBhIFBhcmNlbCBjb250YWluaW5nIGEgc2luZ2xlIGludCwgd2hpY2ggaXMgdGhlIGNoYW5uZWwgY291bnQgb2YgdGhlCisgICAgLy8gYXVkaW8gdHJhY2ssIG9yIHplcm8gZm9yIGVycm9yIChlLmcuIG5vIGF1ZGlvIHRyYWNrKSBvciB1bmtub3duLgorICAgIEtFWV9QQVJBTUVURVJfQVVESU9fQ0hBTk5FTF9DT1VOVCA9IDEyMDAsICAgICAgICAgICAgICAgICAgIC8vIGdldCBvbmx5CisKK307CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCiBjbGFzcyBNZWRpYVBsYXllckxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyIDogcHVibGljIEJuTWVkaWFQbGF5ZXJDbGllbnQsCkBAIC0xNjYsNyArMTg4LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7CiAgICAgc3RhdGljICBzcDxJTWVtb3J5PiAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KTsKICAgICBzdGF0aWMgIHNwPElNZW1vcnk+ICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CkBAIC0xNzYsMTIgKzE5OCwxNyBAQAogICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdldEF1ZGlvU2Vzc2lvbklkKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsKiByZXBseSk7CisKIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJfbCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNlZWtUb19sKGludCBtc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmNfbCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uX2woaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlc2V0X2woKTsKIAogICAgIHNwPElNZWRpYVBsYXllcj4gICAgICAgICAgICBtUGxheWVyOwogICAgIHRocmVhZF9pZF90ICAgICAgICAgICAgICAgICBtTG9ja1RocmVhZElkOwpAQCAtMjA0LDYgKzIzMSw4IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOworICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93OworICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggYTcxMDU0Ni4uMzBkYjY0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTMwLDI5ICszMCwxNiBAQAogY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwogY2xhc3MgSUNhbWVyYTsKK2NsYXNzIElDYW1lcmFSZWNvcmRpbmdQcm94eTsKK2NsYXNzIElTdXJmYWNlVGV4dHVyZTsKK2NsYXNzIFN1cmZhY2VUZXh0dXJlQ2xpZW50OwogCiB0eXBlZGVmIHZvaWQgKCptZWRpYV9jb21wbGV0aW9uX2YpKHN0YXR1c190IHN0YXR1cywgdm9pZCAqY29va2llKTsKIAotLyogRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydHMKLSAqIGluIG1lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEhCi0gKi8KLWVudW0gYXVkaW9fc291cmNlIHsKLSAgICBBVURJT19TT1VSQ0VfREVGQVVMVCA9IDAsCi0gICAgQVVESU9fU09VUkNFX01JQyA9IDEsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyA9IDIsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LID0gMywKLSAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCA9IDQsCi0gICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiA9IDUsCi0gICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OID0gNiwKLSAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDcsCi0gICAgQVVESU9fU09VUkNFX01BWCA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAotCi0gICAgQVVESU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCi19OwotCiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLAorICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiA9IDIsCiAKICAgICBWSURFT19TT1VSQ0VfTElTVF9FTkQgIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgYXVkaW8gc291cmNlIHR5cGUKIH07CkBAIC0xMDQsMzUgKzkxLDYyIEBACiB9OwogCiAvKgotICogVGhlIHN0YXRlIG1hY2hpbmUgb2YgdGhlIG1lZGlhX3JlY29yZGVyIHVzZXMgYSBzZXQgb2YgZGlmZmVyZW50IHN0YXRlIG5hbWVzLgotICogVGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgbWVkaWFfcmVjb3JkZXIgYW5kIHRoZSBwdmF1dGhvcmVuZ2luZSBpcyBzaG93biBiZWxvdzoKLSAqCi0gKiAgICBtZWRpYXJlY29yZGVyICAgICAgICAgICAgICAgICAgICAgICAgcHZhdXRob3JlbmdpbmUKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgIE1FRElBX1JFQ09SREVSX0VSUk9SICAgICAgICAgICAgICAgICBFUlJPUgotICogICAgTUVESUFfUkVDT1JERVJfSURMRSAgICAgICAgICAgICAgICAgIElETEUKLSAqICAgIE1FRElBX1JFQ09SREVSX0lOSVRJQUxJWkVEICAgICAgICAgICBPUEVORUQKLSAqICAgIE1FRElBX1JFQ09SREVSX0RBVEFTT1VSQ0VfQ09ORklHVVJFRAotICogICAgTUVESUFfUkVDT1JERVJfUFJFUEFSRUQgICAgICAgICAgICAgIElOSVRJQUxJWkVECi0gKiAgICBNRURJQV9SRUNPUkRFUl9SRUNPUkRJTkcgICAgICAgICAgICAgUkVDT1JESU5HCisgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKKyAgICAvLyBFcnJvciBzdGF0ZS4KICAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCisKKyAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKKworICAgIC8vIFJlY29yZGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgogICAgIE1FRElBX1JFQ09SREVSX0lOSVRJQUxJWkVEICAgICAgICAgICA9IDEgPDwgMSwKKworICAgIC8vIENvbmZpZ3VyYXRpb24gb2YgdGhlIHJlY29yZGVyIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICBNRURJQV9SRUNPUkRFUl9EQVRBU09VUkNFX0NPTkZJR1VSRUQgPSAxIDw8IDIsCisKKyAgICAvLyBSZWNvcmRlciBpcyByZWFkeSB0byBzdGFydC4KICAgICBNRURJQV9SRUNPUkRFUl9QUkVQQVJFRCAgICAgICAgICAgICAgPSAxIDw8IDMsCisKKyAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCiBlbnVtIG1lZGlhX3JlY29yZGVyX2V2ZW50X3R5cGUgeworICAgIE1FRElBX1JFQ09SREVSX0VWRU5UX0xJU1RfU1RBUlQgICAgICAgICAgICAgICA9IDEsCiAgICAgTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IgICAgICAgICAgICAgICAgICAgID0gMSwKLSAgICBNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPICAgICAgICAgICAgICAgICAgICAgPSAyCisgICAgTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTyAgICAgICAgICAgICAgICAgICAgID0gMiwKKyAgICBNRURJQV9SRUNPUkRFUl9FVkVOVF9MSVNUX0VORCAgICAgICAgICAgICAgICAgPSA5OSwKKworICAgIC8vIFRyYWNrIHJlbGF0ZWQgZXZlbnQgdHlwZXMKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9MSVNUX1NUQVJUICAgICAgICAgPSAxMDAsCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfRVJST1IgICAgICAgICAgICAgID0gMTAwLAorICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8gICAgICAgICAgICAgICA9IDEwMSwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9MSVNUX0VORCAgICAgICAgICAgPSAxMDAwLAogfTsKIAorLyoKKyAqIFRoZSAocGFydCBvZikgIndoYXQiIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCisgKiBXaGVuIHRoZSBlcnJvciBvciBpbmZvIHR5cGUgaXMgdHJhY2sgc3BlY2lmaWMsIHRoZSB3aGF0IGhhcworICogdGhlIGZvbGxvd2luZyBsYXlvdXQ6CisgKiB0aGUgbGVmdC1tb3N0IDE2LWJpdCBpcyBtZWFudCBmb3IgZXJyb3Igb3IgaW5mbyB0eXBlLgorICogdGhlIHJpZ2h0LW1vc3QgNC1iaXQgaXMgbWVhbnQgZm9yIHRyYWNrIGlkLgorICogdGhlIHJlc3QgaXMgcmVzZXJ2ZWQuCisgKgorICogfCB0cmFjayBpZCB8IHJlc2VydmVkIHwgICAgIGVycm9yIG9yIGluZm8gdHlwZSAgICAgfAorICogMzEgICAgICAgICAyOCAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICoKKyAqLwogZW51bSBtZWRpYV9yZWNvcmRlcl9lcnJvcl90eXBlIHsKLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUl9VTktOT1dOICAgICAgICAgICAgICAgICAgPSAxCisgICAgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvLyBUcmFjayByZWxhdGVkIGVycm9yIHR5cGUKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FUlJPUl9MSVNUX1NUQVJUICAgICAgICAgID0gMTAwLAorICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0VSUk9SX0dFTkVSQUwgICAgICAgICAgICAgPSAxMDAsCisgICAgTUVESUFfUkVDT1JERVJfRVJST1JfVklERU9fTk9fU1lOQ19GUkFNRSAgICAgICA9IDIwMCwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FUlJPUl9MSVNUX0VORCAgICAgICAgICAgID0gMTAwMCwKIH07CiAKIC8vIFRoZSBjb2RlcyBhcmUgZGlzdHJpYnV0ZWQgYXMgZm9sbG93OgpAQCAtMTQxLDExICsxNTUsMzggQEAKIC8vCiBlbnVtIG1lZGlhX3JlY29yZGVyX2luZm9fdHlwZSB7CiAgICAgTUVESUFfUkVDT1JERVJfSU5GT19VTktOT1dOICAgICAgICAgICAgICAgICAgID0gMSwKKwogICAgIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQgICAgICA9IDgwMCwKICAgICBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVEICAgICAgPSA4MDEsCi0gICAgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUyAgICAgICAgID0gODAyLAotICAgIE1FRElBX1JFQ09SREVSX0lORk9fUFJPR1JFU1NfRlJBTUVfU1RBVFVTICAgICA9IDgwMywKLSAgICBNRURJQV9SRUNPUkRFUl9JTkZPX1BST0dSRVNTX1RJTUVfU1RBVFVTICAgICAgPSA4MDQsCisKKyAgICAvLyBBbGwgdHJhY2sgcmVsYXRlZCBpbmZvcm10aW9uYWwgZXZlbnRzIHN0YXJ0IGhlcmUKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0xJU1RfU1RBUlQgICAgICAgICAgID0gMTAwMCwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0NPTVBMRVRJT05fU1RBVFVTICAgID0gMTAwMCwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX1BST0dSRVNTX0lOX1RJTUUgICAgID0gMTAwMSwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX1RZUEUgICAgICAgICAgICAgICAgID0gMTAwMiwKKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0RVUkFUSU9OX01TICAgICAgICAgID0gMTAwMywKKworICAgIC8vIFRoZSB0aW1lIHRvIG1lYXN1cmUgdGhlIG1heCBjaHVuayBkdXJhdGlvbgorICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fTUFYX0NIVU5LX0RVUl9NUyAgICAgPSAxMDA0LAorCisgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19FTkNPREVEX0ZSQU1FUyAgICAgICA9IDEwMDUsCisKKyAgICAvLyBUaGUgdGltZSB0byBtZWFzdXJlIGhvdyB3ZWxsIHRoZSBhdWRpbyBhbmQgdmlkZW8KKyAgICAvLyB0cmFjayBkYXRhIGlzIGludGVybGVhdmVkLgorICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0lOVEVSX0NIVU5LX1RJTUVfTVMgICAgICAgPSAxMDA2LAorCisgICAgLy8gVGhlIHRpbWUgdG8gbWVhc3VyZSBzeXN0ZW0gcmVzcG9uc2UuIE5vdGUgdGhhdAorICAgIC8vIHRoZSBkZWxheSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBpbnRlbnRpb25hbCBkZWxheQorICAgIC8vIHdlIHVzZSB0byBlbGltaW5hdGUgdGhlIHJlY29yZGluZyBzb3VuZC4KKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0lOSVRJQUxfREVMQVlfTVMgICAgID0gMTAwNywKKworICAgIC8vIFRoZSB0aW1lIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBBL1Ygc3luYy4KKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX1NUQVJUX09GRlNFVF9NUyAgICAgID0gMTAwOCwKKworICAgIC8vIFRvdGFsIG51bWJlciBvZiBieXRlcyBvZiB0aGUgbWVkaWEgZGF0YS4KKyAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0RBVEFfS0JZVEVTICAgICAgICAgID0gMTAwOSwKKworICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fTElTVF9FTkQgICAgICAgICAgICAgPSAyMDAwLAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY1LDcgKzIwNiw3IEBACiAKICAgICB2b2lkICAgICAgICBkaWVkKCk7CiAgICAgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOworICAgIHN0YXR1c190ICAgIHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSk7CiAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvU291cmNlKGludCB2cyk7CiAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKQEAgLTE3NCw3ICsyMTUsNiBAQAogICAgIHN0YXR1c190ICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHN0YXR1c190ICAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtMTg4LDYgKzIyOCw3IEBACiAgICAgc3RhdHVzX3QgICAgY2xvc2UoKTsKICAgICBzdGF0dXNfdCAgICByZWxlYXNlKCk7CiAgICAgdm9pZCAgICAgICAgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7CisgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiAgICAgcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKQEAgLTE5NSwxMyArMjM2LDE4IEBACiAKICAgICBzcDxJTWVkaWFSZWNvcmRlcj4gICAgICAgICAgbU1lZGlhUmVjb3JkZXI7CiAgICAgc3A8TWVkaWFSZWNvcmRlckxpc3RlbmVyPiAgIG1MaXN0ZW5lcjsKKworICAgIC8vIFJlZmVyZW5jZSB0b0lTdXJmYWNlVGV4dHVyZQorICAgIC8vIGZvciBlbmNvZGluZyBHTCBGcmFtZXMuIFRoYXQgaXMgdXNlZnVsIG9ubHkgd2hlbiB0aGUKKyAgICAvLyB2aWRlbyBzb3VyY2UgaXMgc2V0IHRvIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUgorICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gICAgICAgICBtU3VyZmFjZU1lZGlhU291cmNlOworCiAgICAgbWVkaWFfcmVjb3JkZXJfc3RhdGVzICAgICAgIG1DdXJyZW50U3RhdGU7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvU291cmNlU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlb1NvdXJjZVNldDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlb0VuY29kZXJTZXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc091dHB1dEZpbGVTZXQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQ7CiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCA3NjVjMDM5Li44MDNiZmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTIzLDIzICsyMywzMyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAorc3RydWN0IGRpcmVudDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBNZWRpYVNjYW5uZXJDbGllbnQ7CiBjbGFzcyBTdHJpbmdBcnJheTsKIAorZW51bSBNZWRpYVNjYW5SZXN1bHQgeworICAgIC8vIFRoaXMgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIHNjYW5uZWQgc3VjY2Vzc2Z1bGx5LgorICAgIE1FRElBX1NDQU5fUkVTVUxUX09LLAorICAgIC8vIFRoaXMgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIHNraXBwZWQgYmVjYXVzZSBpdCB3YXMgbm90IGZvdW5kLCBjb3VsZAorICAgIC8vIG5vdCBiZSBvcGVuZWQsIHdhcyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLCBvciB3YXMgbWFsZm9yZWQgaW4gc29tZSB3YXkuCisgICAgTUVESUFfU0NBTl9SRVNVTFRfU0tJUFBFRCwKKyAgICAvLyBUaGUgc2NhbiBzaG91bGQgYmUgYWJvcnRlZCBkdWUgdG8gYSBmYXRhbCBlcnJvciBzdWNoIGFzIG91dCBvZiBtZW1vcnkKKyAgICAvLyBvciBhbiBleGNlcHRpb24uCisgICAgTUVESUFfU0NBTl9SRVNVTFRfRVJST1IsCit9OworCiBzdHJ1Y3QgTWVkaWFTY2FubmVyIHsKICAgICBNZWRpYVNjYW5uZXIoKTsKICAgICB2aXJ0dWFsIH5NZWRpYVNjYW5uZXIoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0ZpbGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKLSAgICAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50KSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVNjYW5SZXN1bHQgcHJvY2Vzc0ZpbGUoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpID0gMDsKIAotICAgIHR5cGVkZWYgYm9vbCAoKkV4Y2VwdGlvbkNoZWNrKSh2b2lkKiBlbnYpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAotICAgICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CisgICAgdmlydHVhbCBNZWRpYVNjYW5SZXN1bHQgcHJvY2Vzc0RpcmVjdG9yeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50KTsKIAogICAgIHZvaWQgc2V0TG9jYWxlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CiAKQEAgLTUzLDkgKzYzLDExIEBACiAgICAgLy8gY3VycmVudCBsb2NhbGUgKGxpa2UgImphX0pQIiksIGNyZWF0ZWQvZGVzdHJveWVkIHdpdGggc3RyZHVwKCkvZnJlZSgpCiAgICAgY2hhciAqbUxvY2FsZTsKIAotICAgIHN0YXR1c190IGRvUHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKLSAgICAgICAgICAgIGJvb2wgbm9NZWRpYSwgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CisgICAgTWVkaWFTY2FuUmVzdWx0IGRvUHJvY2Vzc0RpcmVjdG9yeSgKKyAgICAgICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwgYm9vbCBub01lZGlhKTsKKyAgICBNZWRpYVNjYW5SZXN1bHQgZG9Qcm9jZXNzRGlyZWN0b3J5RW50cnkoCisgICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsIGJvb2wgbm9NZWRpYSwKKyAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5LCBjaGFyKiBmaWxlU3BvdCk7CiAKICAgICBNZWRpYVNjYW5uZXIoY29uc3QgTWVkaWFTY2FubmVyICYpOwogICAgIE1lZGlhU2Nhbm5lciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU2Nhbm5lciAmKTsKQEAgLTY4LDEzICs4MCwxMyBAQAogICAgIHZpcnR1YWwgfk1lZGlhU2Nhbm5lckNsaWVudCgpOwogICAgIHZvaWQgc2V0TG9jYWxlKGNvbnN0IGNoYXIqIGxvY2FsZSk7CiAgICAgdm9pZCBiZWdpbkZpbGUoKTsKLSAgICBib29sIGFkZFN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgc3RhdHVzX3QgYWRkU3RyaW5nVGFnKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKTsKICAgICB2b2lkIGVuZEZpbGUoKTsKIAotICAgIHZpcnR1YWwgYm9vbCBzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBsb25nIGxvbmcgbGFzdE1vZGlmaWVkLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbkZpbGUoY29uc3QgY2hhciogcGF0aCwgbG9uZyBsb25nIGxhc3RNb2RpZmllZCwKICAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxlU2l6ZSwgYm9vbCBpc0RpcmVjdG9yeSwgYm9vbCBub01lZGlhKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZVN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBzZXRNaW1lVHlwZShjb25zdCBjaGFyKiBtaW1lVHlwZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlU3RyaW5nVGFnKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaW1lVHlwZShjb25zdCBjaGFyKiBtaW1lVHlwZSkgPSAwOwogCiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBjb252ZXJ0VmFsdWVzKHVpbnQzMl90IGVuY29kaW5nKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2FiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBQ19XUklURVJfSF8KKyNkZWZpbmUgQUFDX1dSSVRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhU291cmNlOworc3RydWN0IE1ldGFEYXRhOworCitzdHJ1Y3QgQUFDV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBBQUNXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIEFBQ1dyaXRlcihpbnQgZmQpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQUNXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0FkdHNIZWFkZXJMZW5ndGggPSA3LCAgICAgLy8gIyBvZiBieXRlcyBmb3IgdGhlIGFkdHMgaGVhZGVyCisgICAgICAgIGtTYW1wbGVzUGVyRnJhbWUgID0gMTAyNCwgIC8vICMgb2Ygc2FtcGxlcyBpbiBhIGZyYW1lCisgICAgfTsKKworICAgIGludCAgIG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbUVzdGltYXRlZFNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWREdXJhdGlvblVzOworICAgIGludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIGludDMyX3QgbUZyYW1lRHVyYXRpb25VczsKKworICAgIHN0YXRpYyB2b2lkICpUaHJlYWRXcmFwcGVyKHZvaWQgKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHdyaXRlQWR0c0hlYWRlcih1aW50MzJfdCBmcmFtZUxlbmd0aCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQUNXcml0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBQUNfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggZDEyZWU5Yy4uMGI3OTMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMTA4LDYgKzEwOCw4IEBACiAKICAgICB2b2lkIHJlc2V0KCk7CiAKKyAgICB1aW50MzJfdCBnZXROdW1GcmFtZXNQZW5kaW5nUGxheW91dCgpIGNvbnN0OworCiAgICAgQXVkaW9QbGF5ZXIoY29uc3QgQXVkaW9QbGF5ZXIgJik7CiAgICAgQXVkaW9QbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBBdWRpb1BsYXllciAmKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKaW5kZXggOWU2ZjBlMi4uMTliZDMxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaApAQCAtMjQsMTYgKzI0LDE4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBBdWRpb1JlY29yZDsKIAogc3RydWN0IEF1ZGlvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLCBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CiAgICAgLy8gTm90ZSB0aGF0IHRoZSAiY2hhbm5lbHMiIHBhcmFtZXRlciBpcyBfbm90XyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLAotICAgIC8vIGJ1dCBhIGJpdG1hc2sgb2YgQXVkaW9TeXN0ZW06OmF1ZGlvX2NoYW5uZWxzIGNvbnN0YW50cy4KKyAgICAvLyBidXQgYSBiaXRtYXNrIG9mIGF1ZGlvX2NoYW5uZWxzX3QgY29uc3RhbnRzLgogICAgIEF1ZGlvU291cmNlKAogICAgICAgICAgICAgaW50IGlucHV0U291cmNlLCB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05PKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAppbmRleCA0YTM5ZmJmLi44YzFjNTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC02OCw2ICs2OSw3IEBACiAgICAgICogQHJldHVybiBOVUxMIG9uIGVycm9yLgogICAgICAqLwogICAgIHN0YXRpYyBDYW1lcmFTb3VyY2UgKkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gJnByb3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCkBAIC05OSwzNCArMTAxLDYgQEAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlkZW8gYnVmZmVycyBhdmFpbGFibGUgZnJvbQotICAgICAqIHRoaXMgc291cmNlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGlmIHRoZXNlIHZpZGVvIGJ1ZmZlcnMgYXJlIHVzZWQKLSAgICAgKiBmb3IgcGFzc2luZyB2aWRlbyBmcmFtZSBkYXRhIHRvIG90aGVyIG1lZGlhIGNvbXBvbmVudHMsCi0gICAgICogc3VjaCBhcyBPTVggdmlkZW8gZW5jb2RlcnMsIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSB0aGUKLSAgICAgKiBtZW1jcHkgb2YgdGhlIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1ibmVyIG9mIHZpZGVvIGJ1ZmZlcnMuIFJldHVybnMgMCB0bwotICAgICAqICAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNvdXJjZSBkb2VzIG5vdCBtYWtlIHRoZSB2aWRlbwotICAgICAqICAgICAgYnVmZmVyIGluZm9ybWF0aW9uIGF2YWlsYWxibGUuCi0gICAgICovCi0gICAgc2l6ZV90IGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgaW5kaXZpZHVhbCB2aWRlbyBidWZmZXIgYXZhaWxhYmxlIGZyb20KLSAgICAgKiB0aGlzIHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgdmlkZW8gYnVmZmVyLgotICAgICAqICAgICAgVmFsaWQgcmFuZ2Ugb2YgdGhlIGluZGV4IGlzIFswLCBuXSwgd2hlcmUgbiA9Ci0gICAgICogICAgICBnZXROdW1iZXJPZlZpZGVvQnVmZmVycygpIC0gMS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHZpZGVvIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbmRleC4KLSAgICAgKiAgICAgIElmIGluZGV4IGlzIG91dCBvZiByYW5nZSwgMCBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgc3A8SU1lbW9yeT4gZ2V0VmlkZW9CdWZmZXIoc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICAgIC8qKgogICAgICAqIFRlbGwgd2hldGhlciB0aGlzIGNhbWVyYSBzb3VyY2Ugc3RvcmVzIG1ldGEgZGF0YSBvciByZWFsIFlVVgogICAgICAqIGZyYW1lIGRhdGEgaW4gdmlkZW8gYnVmZmVycy4KICAgICAgKgpAQCAtMTM5LDYgKzExMywyMyBAQAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAogcHJvdGVjdGVkOgorICAgIGNsYXNzIFByb3h5TGlzdGVuZXI6IHB1YmxpYyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHJveHlMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBzb3VyY2UpOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IG1Tb3VyY2U7CisgICAgfTsKKworICAgIC8vIGlzQmluZGVyQWxpdmUgbmVlZHMgbGlua1RvRGVhdGggdG8gd29yay4KKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVhdGhOb3RpZmllcigpIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworICAgIH07CisKICAgICBlbnVtIENhbWVyYUZsYWdzIHsKICAgICAgICAgRkxBR1NfU0VUX0NBTUVSQSA9IDFMIDw8IDAsCiAgICAgICAgIEZMQUdTX0hPVF9DQU1FUkEgPSAxTCA8PCAxLApAQCAtMTUxLDYgKzE0Miw4IEBACiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIHNwPENhbWVyYT4gICBtQ2FtZXJhOworICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gICBtQ2FtZXJhUmVjb3JkaW5nUHJveHk7CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7CiAgICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKIApAQCAtMTYwLDcgKzE1Myw4IEBACiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOwogCi0gICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGludDMyX3QgY2FtZXJhSWQsCisgICAgQ2FtZXJhU291cmNlKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAogICAgICAgICAgICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CkBAIC0yMDAsMTAgKzE5NCwxOCBAQAogICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKIAotICAgIHN0YXR1c190IGluaXQoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwgaW50MzJfdCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOwotICAgIHN0YXR1c190IGlzQ2FtZXJhQXZhaWxhYmxlKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGludDMyX3QgY2FtZXJhSWQpOworICAgIHN0YXR1c190IGluaXQoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUsCisgICAgICAgICAgICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CisKKyAgICBzdGF0dXNfdCBpbml0V2l0aENhbWVyYUFjY2VzcygKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwgU2l6ZSB2aWRlb1NpemUsIGludDMyX3QgZnJhbWVSYXRlLAorICAgICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworCisgICAgc3RhdHVzX3QgaXNDYW1lcmFBdmFpbGFibGUoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkKTsKICAgICBzdGF0dXNfdCBpc0NhbWVyYUNvbG9yRm9ybWF0U3VwcG9ydGVkKGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlQ2FtZXJhKENhbWVyYVBhcmFtZXRlcnMqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaAppbmRleCAwZTVkNTM0Li4wZTI2NGM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKQEAgLTMzLDYgKzMzLDcgQEAKIHB1YmxpYzoKICAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGVGcm9tQ2FtZXJhKAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+ICZwcm94eSwKICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKICAgICAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUsCkBAIC01MiwyNyArNTMsMTAgQEAKICAgICB2b2lkIHN0YXJ0UXVpY2tSZWFkUmV0dXJucygpOwogCiBwcml2YXRlOgotICAgIC8vIElmIHRydWUsIHdpbGwgdXNlIHN0aWxsIGNhbWVyYSB0YWtlUGljdHVyZSgpIGZvciB0aW1lIGxhcHNlIGZyYW1lcwotICAgIC8vIElmIGZhbHNlLCB3aWxsIHVzZSB0aGUgdmlkZW9jYW1lcmEgZnJhbWVzIGluc3RlYWQuCi0gICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7Ci0KLSAgICAvLyBTaXplIG9mIHBpY3R1cmUgdGFrZW4gZnJvbSBzdGlsbCBjYW1lcmEuIFRoaXMgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplCi0gICAgLy8gb2YgdGhlIHZpZGVvLCBhcyBzdGlsbCBjYW1lcmEgbWF5IG5vdCBzdXBwb3J0IHRoZSBleGFjdCB2aWRlbyByZXNvbHV0aW9uCi0gICAgLy8gZGVtYW5kZWQuIFNlZSBzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZCgpLgotICAgIGludDMyX3QgbVBpY3R1cmVXaWR0aDsKLSAgICBpbnQzMl90IG1QaWN0dXJlSGVpZ2h0OwotCiAgICAgLy8gc2l6ZSBvZiB0aGUgZW5jb2RlZCB2aWRlby4KICAgICBpbnQzMl90IG1WaWRlb1dpZHRoOwogICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OwogCi0gICAgLy8gVHJ1ZSBpZiB3ZSBuZWVkIHRvIGNyb3AgdGhlIHN0aWxsIGNhbWVyYSBpbWFnZSB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgotICAgIGJvb2wgbU5lZWRDcm9wcGluZzsKLQotICAgIC8vIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBjcm9wcGluZyByZWN0YW5nbGUuCi0gICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFg7Ci0gICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFk7Ci0KICAgICAvLyBUaW1lIGJldHdlZW4gY2FwdHVyZSBvZiB0d28gZnJhbWVzIGR1cmluZyB0aW1lIGxhcHNlIHJlY29yZGluZwogICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRpbWVsYXBzZSBpcyBkaXNhYmxlZC4KICAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOwpAQCAtODMsOSArNjcsNiBAQAogICAgIC8vIFJlYWwgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGVuY29kZWQgdGltZSBsYXBzZSBmcmFtZQogICAgIGludDY0X3QgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVczsKIAotICAgIC8vIFRocmVhZCBpZCBvZiB0aHJlYWQgd2hpY2ggdGFrZXMgc3RpbGwgcGljdHVyZSBhbmQgc2xlZXBzIGluIGEgbG9vcC4KLSAgICBwdGhyZWFkX3QgbVRocmVhZFRpbWVMYXBzZTsKLQogICAgIC8vIFZhcmlhYmxlIHNldCBpbiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSB0byBoZWxwIHNraXBDdXJyZW50RnJhbWUoKQogICAgIC8vIHRvIGtub3cgaWYgY3VycmVudCBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkLgogICAgIGJvb2wgbVNraXBDdXJyZW50RnJhbWU7CkBAIC0xMTAsOSArOTEsNiBAQAogICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBxdWljayBzdG9wIHZhcmlhYmxlcy4KICAgICBNdXRleCBtUXVpY2tTdG9wTG9jazsKIAotICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSB0byB3YWtlIHVwIHN0aWxsIHBpY3R1cmUgdGhyZWFkLgotICAgIENvbmRpdGlvbiBtVGFrZVBpY3R1cmVDb25kaXRpb247Ci0KICAgICAvLyBtUXVpY2tTdG9wIGlzIHNldCB0byB0cnVlIGlmIHdlIHVzZSBxdWljayByZWFkKCkgcmV0dXJucywgb3RoZXJ3aXNlIGl0IGlzIHNldAogICAgIC8vIHRvIGZhbHNlLiBPbmNlIGluIHRoaXMgbW9kZSByZWFkKCkgcmV0dXJuIGEgY29weSBvZiB0aGUgbGFzdCByZWFkIGZyYW1lCiAgICAgLy8gd2l0aCB0aGUgc2FtZSB0aW1lIHN0YW1wLiBTZWUgc3RhcnRRdWlja1JlYWRSZXR1cm5zKCkuCkBAIC0xMzIsNiArMTEwLDcgQEAKIAogICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiAmcHJveHksCiAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLApAQCAtMTQ2LDMyICsxMjUsMTMgQEAKICAgICAvLyBXcmFwcGVyIG92ZXIgQ2FtZXJhU291cmNlOjpyZWFkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCi0gICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIHN0YXJ0cyBhIHRocmVhZCB3aGljaCBjYWxscyBjYW1lcmEncyB0YWtlUGljdHVyZSgpCi0gICAgLy8gaW4gYSBsb29wLiBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RhcnRzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCi0gICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7Ci0KLSAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugam9pbnMgdGhlIHRocmVhZCBjcmVhdGVkIGluIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkuCiAgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlLCBqdXN0IHN0b3BzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCiAgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKIAotICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIG1lbW9yeSBpcyBsb2NhbGx5Ci0gICAgLy8gYWxsb2NhdGVkIHdpdGggcmVmY291bnRpbmcuCi0gICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlIGp1c3QgdGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgdGhlIGZyYW1lLgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKLQogICAgIC8vIG1Ta2lwQ3VycmVudEZyYW1lIGlzIHNldCB0byB0cnVlIGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGlmIHRoZSBjdXJyZW50CiAgICAgLy8gZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZCBhbmQgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMgdGhlIHZhbHVlIG9mIG1Ta2lwQ3VycmVudEZyYW1lLgogICAgIHZpcnR1YWwgYm9vbCBza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpOwogCi0gICAgLy8gSGFuZGxlcyB0aGUgY2FsbGJhY2sgdG8gaGFuZGxlIHJhdyBmcmFtZSBkYXRhIGZyb20gdGhlIHN0aWxsIGNhbWVyYS4KLSAgICAvLyBDcmVhdGVzIGEgY29weSBvZiB0aGUgZnJhbWUgZGF0YSBhcyB0aGUgY2FtZXJhIGNhbiByZXVzZSB0aGUgZnJhbWUgbWVtb3J5Ci0gICAgLy8gb25jZSB0aGlzIGNhbGxiYWNrIHJldHVybnMuIFRoZSBmdW5jdGlvbiBhbHNvIHNldHMgYSBuZXcgdGltc3RhbXAgY29ycmVzcG9uZGluZwotICAgIC8vIHRvIG9uZSBmcmFtZSB0aW1lIGFoZWFkIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLiBJdCB0aGVuCi0gICAgLy8gY2FsbHMgZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgb2YgdGhlIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY29waWVkIGRhdGEgYW5kIHRoZQotICAgIC8vIG1vZGlmaWVkIHRpbWVzdGFtcCwgd2hpY2ggd2lsbCB0aGluayB0aGF0IGl0IHJlY2lldmVkIHRoZSBmcmFtZSBmcm9tIGEgdmlkZW8KLSAgICAvLyBjYW1lcmEgYW5kIHByb2NlZWQgYXMgdXN1YWwuCi0gICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKLQogICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKICAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KICAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKQEAgLTE4NywyNCArMTQ3LDYgQEAKICAgICAvLyBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KICAgICBib29sIHRyeVNldHRpbmdWaWRlb1NpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOwogCi0gICAgLy8gVGhlIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGRlbWFuZGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQuCi0gICAgLy8gV2UgbG9vayBmb3IgdGhlIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzIGZyb20gdGhlIHN0aWxsIGNhbWVyYSBhbmQKLSAgICAvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IG9uZSB3aXRoIGVpdGhlciBkaW1lbnNpb25zIGhpZ2hlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgLy8gdmlkZW8gZGltZW5zaW9ucy4gVGhlIHN0aWxsIHBpY3R1cmUgd2lsbCBiZSBjcm9wcGVkIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCi0gICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIHBpY3R1cmUgc2l6ZXMgZ3JlYXRlciB0aGFuCi0gICAgLy8gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCBpbiB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgIGJvb2wgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOwotCi0gICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVjdGFuZ2xlIGZyb20gd2hlcmUgdG8gc3RhcnQgY3JvcHBpbmcgdGhlCi0gICAgLy8gc3RpbGwgaW1hZ2UgaW50byB0aGUgdmlkZW8gZnJhbWUuIFdlIGNob29zZSB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSB0byBiZQotICAgIC8vIGNyb3BwZWQuIFRoZSBvZmZzZXQgaXMgc3RvcmVkIGluIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkuCi0gICAgYm9vbCBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOwotCi0gICAgLy8gQ3JvcHMgdGhlIHNvdXJjZSBkYXRhIGludG8gYSBzbWFsbGVyIGltYWdlIHN0YXJ0aW5nIGF0Ci0gICAgLy8gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKSBhbmQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lLgotICAgIC8vIFRoZSBkYXRhIGlzIHJldHVybmVkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgSU1lbW9yeS4KLSAgICBzcDxJTWVtb3J5PiBjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKLQogICAgIC8vIFdoZW4gdmlkZW8gY2FtZXJhIGlzIHVzZWQgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSwgcmV0dXJucyB0cnVlCiAgICAgLy8gdW50aWwgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBmb3IgdGhlIG5leHQgdGltZSBsYXBzZSBmcmFtZS4gV2hlbgogICAgIC8vIHRoZSBmcmFtZSBuZWVkcyB0byBiZSBlbmNvZGVkLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBhbHNvIG1vZGlmaWVzCkBAIC0yMTUsMjIgKzE1Nyw2IEBACiAgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpCiAgICAgc3RhdGljIHZvaWQgKlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpOwogCi0gICAgLy8gUnVucyBhIGxvb3Agd2hpY2ggc2xlZXBzIHVudGlsIGEgc3RpbGwgcGljdHVyZSBpcyByZXF1aXJlZAotICAgIC8vIGFuZCB0aGVuIGNhbGxzIG1DYW1lcmEtPnRha2VQaWN0dXJlKCkgdG8gdGFrZSB0aGUgc3RpbGwgcGljdHVyZS4KLSAgICAvLyBVc2VkIG9ubHkgaW4gdGhlIGNhc2UgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gdHJ1ZS4KLSAgICB2b2lkIHRocmVhZFRpbWVMYXBzZUVudHJ5KCk7Ci0KLSAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFN0YXJ0UHJldmlldygpCi0gICAgc3RhdGljIHZvaWQgKlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpOwotCi0gICAgLy8gU3RhcnRzIHRoZSBjYW1lcmEncyBwcmV2aWV3LgotICAgIHZvaWQgdGhyZWFkU3RhcnRQcmV2aWV3KCk7Ci0KLSAgICAvLyBTdGFydHMgdGhyZWFkIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIoKSBmb3IgcmVzdGFydGluZyBwcmV2aWV3LgotICAgIC8vIE5lZWRzIHRvIGJlIGRvbmUgaW4gYSB0aHJlYWQgc28gdGhhdCBkYXRhQ2FsbGJhY2soKSB3aGljaCBjYWxscyB0aGlzIGZ1bmN0aW9uCi0gICAgLy8gY2FuIHJldHVybiwgYW5kIHRoZSBjYW1lcmEgY2FuIGtub3cgdGhhdCB0YWtlUGljdHVyZSgpIGlzIGRvbmUuCi0gICAgdm9pZCByZXN0YXJ0UHJldmlldygpOwotCiAgICAgLy8gQ3JlYXRlcyBhIGNvcHkgb2Ygc291cmNlX2RhdGEgaW50byBhIG5ldyBtZW1vcnkgb2YgZmluYWwgdHlwZSBNZW1vcnlCYXNlLgogICAgIHNwPElNZW1vcnk+IGNyZWF0ZUlNZW1vcnlDb3B5KGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCAyYWU4YTViLi44NWJhOTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC03Niw2ICs3Niw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFRJWVVWNDIwUGFja2VkU2VtaVBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggZjk1ZTU2YS4uNzEzYWY5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KQEAgLTM4LDYgKzM5LDcgQEAKICAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCiAgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAogICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKApAQCAtNjAsNiArNjIsMTAgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgYm9vbCBzbmlmZihTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSk7CkBAIC03NSwxNSArODEsMTcgQEAKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwogCiAgICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogRHJtSW5pdGlhbGl6YXRpb24oKSB7CisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKERlY3J5cHRIYW5kbGUgKipoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHt9OworICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHt9OwogCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDUxYTQzNDMuLjZjZjg2ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0zOCw5ICszOCw5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKCk7CisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpOwogCi0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CisgICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCk7CkBAIC01Miw3ICs1Miw3IEBACiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICAvKmZvciBEUk0qLwotICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwogICAgIGludDY0X3QgbURybUJ1Zk9mZnNldDsKICAgICBpbnQ2NF90IG1Ecm1CdWZTaXplOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCmluZGV4IGQxZWNhYWYuLjMyZWVkM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKQEAgLTg0LDcgKzg0LDcgQEAKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CiAgICAgT01YX1BUUiBwQXBwUHJpdmF0ZTsKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhlYWRlcjsKLSAgICBjb25zdCBzcDxhbmRyb2lkX25hdGl2ZV9idWZmZXJfdD4mIG5hdGl2ZUJ1ZmZlcjsKKyAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93QnVmZmVyPiYgbmF0aXZlQnVmZmVyOwogfTsKIAogLy8gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byBPTVhfR2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgpAQCAtOTksNiArOTksMTMgQEAKICAgICBPTVhfVTMyIG5Vc2FnZTsgICAgICAgICAgICAgLy8gT1VUCiB9OwogCisvLyBBbiBlbnVtIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlIHRvIGluZGljYXRlIGFuIG9wYXF1ZSBjb2xvcmZvcm1hdAorLy8gaXMgZGVjbGFyZWQgaW4gbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAorLy8gVGhpcyB3aWxsIGluZm9ybSB0aGUgZW5jb2RlciB0aGF0IHRoZSBhY3R1YWwKKy8vIGNvbG9yZm9ybWF0IHdpbGwgYmUgcmVsYXllZCBieSB0aGUgR1JhbGxvYyBCdWZmZXJzLgorLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgID0gMHg3RjAwMDAwMSwKKworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBleHRlcm4gYW5kcm9pZDo6T01YUGx1Z2luQmFzZSAqY3JlYXRlT01YUGx1Z2luKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCmluZGV4IGYyYzY1MDUuLmU0YzFjNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCkBAIC0zMSw2ICszMSwxMCBAQAogICAgIE1QRUcyVFNXcml0ZXIoaW50IGZkKTsKICAgICBNUEVHMlRTV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIAorICAgIE1QRUcyVFNXcml0ZXIoCisgICAgICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgICAgICBzc2l6ZV90ICgqd3JpdGUpKHZvaWQgKmNvb2tpZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwpAQCAtNTEsNiArNTUsMTAgQEAKICAgICBzdHJ1Y3QgU291cmNlSW5mbzsKIAogICAgIEZJTEUgKm1GaWxlOworCisgICAgdm9pZCAqbVdyaXRlQ29va2llOworICAgIHNzaXplX3QgKCptV3JpdGVGdW5jKSh2b2lkICpjb29raWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8TVBFRzJUU1dyaXRlcj4gPiBtUmVmbGVjdG9yOwogCkBAIC02OSw2ICs3Nyw4IEBACiAgICAgdm9pZCB3cml0ZVByb2dyYW1NYXAoKTsKICAgICB2b2lkIHdyaXRlQWNjZXNzVW5pdChpbnQzMl90IHNvdXJjZUluZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAorICAgIHNzaXplX3QgaW50ZXJuYWxXcml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTV3JpdGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCA1YzUyMjlkLi43NzE2NmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC01NSw2ICs1NSwxMCBAQAogICAgIHN0YXR1c190IHNldEludGVybGVhdmVEdXJhdGlvbih1aW50MzJfdCBkdXJhdGlvbik7CiAgICAgaW50MzJfdCBnZXRUaW1lU2NhbGUoKSBjb25zdCB7IHJldHVybiBtVGltZVNjYWxlOyB9CiAKKyAgICBzdGF0dXNfdCBzZXRHZW9EYXRhKGludCBsYXRpdHVkZXgxMDAwMCwgaW50IGxvbmdpdHVkZXgxMDAwMCk7CisgICAgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwogCkBAIC02Nyw3ICs3MSw4IEBACiAgICAgYm9vbCBtVXNlMzJCaXRPZmZzZXQ7CiAgICAgYm9vbCBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZDsKICAgICBib29sIG1QYXVzZWQ7Ci0gICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TdGFydGVkOyAgLy8gV3JpdGVyIHRocmVhZCArIHRyYWNrIHRocmVhZHMgc3RhcnRlZCBzdWNjZXNzZnVsbHkKKyAgICBib29sIG1Xcml0ZXJUaHJlYWRTdGFydGVkOyAgLy8gT25seSB3cml0ZXIgdGhyZWFkIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIG9mZl90IG1NZGF0T2Zmc2V0OwogICAgIHVpbnQ4X3QgKm1Nb292Qm94QnVmZmVyOwpAQCAtNzksNiArODQsMTAgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKKyAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKKyAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOworICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOwogCiAgICAgTXV0ZXggbUxvY2s7CiAKQEAgLTEwOCw2ICsxMTcsMTMgQEAKICAgICBzdHJ1Y3QgQ2h1bmtJbmZvIHsKICAgICAgICAgVHJhY2sgICAgICAgICAgICAgICAqbVRyYWNrOyAgICAgICAgLy8gT3duZXIKICAgICAgICAgTGlzdDxDaHVuaz4gICAgICAgICBtQ2h1bmtzOyAgICAgICAgLy8gUmVtYWluaW5nIGNodW5rcyB0byBiZSB3cml0dGVuCisKKyAgICAgICAgLy8gUHJldmlvdXMgY2h1bmsgdGltZXN0YW1wIHRoYXQgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICBpbnQ2NF90IG1QcmV2Q2h1bmtUaW1lc3RhbXBVczsKKworICAgICAgICAvLyBNYXggdGltZSBpbnRlcnZhbCBiZXR3ZWVuIG5laWdoYm9yaW5nIGNodW5rcworICAgICAgICBpbnQ2NF90IG1NYXhJbnRlckNodW5rRHVyVXM7CisKICAgICB9OwogCiAgICAgYm9vbCAgICAgICAgICAgIG1Jc0ZpcnN0Q2h1bms7CkBAIC0xNTcsOCArMTczLDE3IEBACiAgICAgYm9vbCB1c2UzMkJpdEZpbGVPZmZzZXQoKSBjb25zdDsKICAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOwogICAgIGJvb2wgaXNGaWxlU3RyZWFtYWJsZSgpIGNvbnN0OwotICAgIHZvaWQgdHJhY2tQcm9ncmVzc1N0YXR1cyhjb25zdCBUcmFjayogdHJhY2ssIGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CisgICAgdm9pZCB0cmFja1Byb2dyZXNzU3RhdHVzKHNpemVfdCB0cmFja0lkLCBpbnQ2NF90IHRpbWVVcywgc3RhdHVzX3QgZXJyID0gT0spOwogICAgIHZvaWQgd3JpdGVDb21wb3NpdGlvbk1hdHJpeChpbnQzMl90IGRlZ3JlZXMpOworICAgIHZvaWQgd3JpdGVNdmhkQm94KGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCB3cml0ZU1vb3ZCb3goaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIHdyaXRlRnR5cEJveChNZXRhRGF0YSAqcGFyYW0pOworICAgIHZvaWQgd3JpdGVVZHRhQm94KCk7CisgICAgdm9pZCB3cml0ZUdlb0RhdGFCb3goKTsKKyAgICB2b2lkIHdyaXRlTGF0aXR1ZGUoaW50IGRlZ3JlZXgxMDAwMCk7CisgICAgdm9pZCB3cml0ZUxvbmdpdHVkZShpbnQgZGVncmVleDEwMDAwKTsKKyAgICB2b2lkIHNlbmRTZXNzaW9uU3VtbWFyeSgpOworICAgIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgTVBFRzRXcml0ZXIoY29uc3QgTVBFRzRXcml0ZXIgJik7CiAgICAgTVBFRzRXcml0ZXIgJm9wZXJhdG9yPShjb25zdCBNUEVHNFdyaXRlciAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCmluZGV4IDY2ZGZmZjYuLjNlNDg0NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaApAQCAtMjYsNiArMjYsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKQEAgLTQ1LDkgKzQ2LDEyIEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0E7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSTsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XVk07CiAKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFA7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTUVESUFfREVGU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCmluZGV4IGE4MjEwNmUuLmViNDUyMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKQEAgLTU2LDcgKzU2LDEyIEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogCiAgICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgdm9pZCBzZXREcm1GbGFnKGJvb2wgZmxhZykge307CisgICAgdmlydHVhbCB2b2lkIHNldERybUZsYWcoYm9vbCBmbGFnKSB7CisgICAgICAgIG1Jc0RybSA9IGZsYWc7CisgICAgfTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RHJtRmxhZygpIHsKKyAgICAgICAgcmV0dXJuIG1Jc0RybTsKKyAgICB9CiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTY2LDYgKzcxLDggQEAKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpIHt9CiAKIHByaXZhdGU6CisgICAgYm9vbCBtSXNEcm07CisKICAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKICAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaAppbmRleCBhMzEzOTVlLi4zODE4ZTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCkBAIC0yMiwxMyArMjIsMTQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1lZGlhQnVmZmVyOwogY2xhc3MgTWV0YURhdGE7CiAKLXN0cnVjdCBNZWRpYVNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNZWRpYVNvdXJjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIE1lZGlhU291cmNlKCk7CiAKICAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKQEAgLTk5LDYgKzEwMCwxNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCisgICAgLy8gVGhlIGNvbnN1bWVyIG9mIHRoaXMgbWVkaWEgc291cmNlIHJlcXVlc3RzIHRoYXQgdGhlIGdpdmVuIGJ1ZmZlcnMKKyAgICAvLyBhcmUgdG8gYmUgcmV0dXJuZWQgZXhjbHVzaXZlbHkgaW4gcmVzcG9uc2UgdG8gcmVhZCBjYWxscy4KKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCisgICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCisgICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhU291cmNlKCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCBmN2YyMjM1Li41N2Y2NzhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC01NSw2ICs1NSw3IEBACiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKICAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKICAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKICAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKQEAgLTExNCw2ICsxMTUsMTQgQEAKIAogICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KICAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKKyAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQorICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKIH07CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhZGF0YUJ1ZmZlclR5cGUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YWRhdGFCdWZmZXJUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhZjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YWRhdGFCdWZmZXJUeXBlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVUQURBVEFfQlVGRkVSX1RZUEVfSAorI2RlZmluZSBNRVRBREFUQV9CVUZGRVJfVFlQRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CituYW1lc3BhY2UgYW5kcm9pZCB7CisjZW5kaWYKKworLyoKKyAqIE1ldGFkYXRhQnVmZmVyVHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXJzIHRoYXQKKyAqIGNhbiBiZSBwYXNzZWQgdG8gdmlkZW8gZW5jb2RlciBjb21wb25lbnQgZm9yIGVuY29kaW5nLCB2aWEgU3RhZ2VmcmlnaHQKKyAqIG1lZGlhIHJlY29yZGluZyBmcmFtZXdvcmsuIFRvIHNlZSBob3cgdG8gd29yayB3aXRoIHRoZSBtZXRhZGF0YSBidWZmZXJzCisgKiBpbiBtZWRpYSByZWNvcmRpbmcgZnJhbWV3b3JrLCBwbGVhc2UgY29uc3VsdCBIYXJkd2FyZUFQSS5oCisgKgorICogVGhlIGNyZWF0b3Igb2YgbWV0YWRhdGEgYnVmZmVycyBhbmQgdmlkZW8gZW5jb2RlciBzaGFyZSBjb21tb24ga25vd2xlZGdlCisgKiBvbiB3aGF0IGlzIGFjdHVhbGx5IGJlaW5nIHN0b3JlZCBpbiB0aGVzZSBtZXRhZGF0YSBidWZmZXJzLCBhbmQKKyAqIGhvdyB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIgY29tcG9uZW50CisgKiB0byBsb2NhdGUgdGhlIGFjdHVhbCBwaXhlbCBkYXRhIGFzIHRoZSBzb3VyY2UgaW5wdXQgZm9yIHZpZGVvCisgKiBlbmNvZGVyLCBwbHVzIHdoYXRldmVyIG90aGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVjZXNzYXJ5LiBTdGFnZWZyaWdodAorICogbWVkaWEgcmVjb3JkaW5nIGZyYW1ld29yayBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgc3BlY2lmaWMgYWJvdXQgdGhlCisgKiBtZXRhZGF0YSBidWZmZXJzLCBleGNlcHQgZm9yIHJlY2V2aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXRhZGF0YSBidWZmZXIKKyAqIGFzIHRoZSBzb3VyY2UgaW5wdXQsIG1ha2luZyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHBhc3NpbmcgdGhlCisgKiBjb3B5IHZpYSBPcGVuTUFYIEFQSSB0byB0aGUgdmlkZW8gZW5jb2RlciBjb21wb25lbnQuCisgKgorICogVGhlIGNyZWF0b3Igb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlcnMgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QKKyAqIDQgYnl0ZXMgaW4gZXZlcnkgbWV0YWRhdGEgYnVmZmVyIGluZGljYXRlcyBpdHMgYnVmZmVyIHR5cGUsCisgKiBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciBjb250YWlucyB0aGUKKyAqIGFjdHVhbCBtZXRhZGF0YSBpbmZvcm1hdGlvbi4gV2hlbiBhIHZpZGVvIGVuY29kZXIgY29tcG9uZW50IHJlY2VpdmVzCisgKiBhIG1ldGFkYXRhIGJ1ZmZlciwgaXQgdXNlcyB0aGUgZmlyc3QgNCBieXRlcyBpbiB0aGF0IGJ1ZmZlciB0byBmaW5kCisgKiBvdXQgdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHRha2VzIGFjdGlvbiBhcHByb3ByaWF0ZQorICogdG8gdGhhdCB0eXBlIG9mIG1ldGFkYXRhIGJ1ZmZlcnMgKGZvciBpbnN0YW5jZSwgbG9jYXRlIHRoZSBhY3R1YWwKKyAqIHBpeGVsIGRhdGEgaW5wdXQgYW5kIHRoZW4gZW5jb2RpbmcgdGhlIGlucHV0IGRhdGEgdG8gcHJvZHVjZSBhCisgKiBjb21wcmVzc2VkIG91dHB1dCBidWZmZXIpLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGxheW91dCBvZiBhIG1ldGFkYXRhIGJ1ZmZlciwKKyAqIHdoZXJlIGJ1ZmZlciB0eXBlIGlzIGEgNC1ieXRlIGZpZWxkIG9mIE1ldGFkYXRhQnVmZmVyVHlwZSwKKyAqIGFuZCB0aGUgcGF5bG9hZCBpcyB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgIGJ1ZmZlciB0eXBlICB8ICAgICAgICAgIHBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLwordHlwZWRlZiBlbnVtIHsKKworICAgIC8qCisgICAgICoga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKKyAgICAgKiB0aGUgc291cmNlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaXMgdGhlIGNhbWVyYSBjb21wb25lbnQuCisgICAgICovCisgICAga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSAgPSAwLAorCisgICAgLyoKKyAgICAgKiBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKKyAgICAgKiB0aGUgcGF5bG9hZCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICAgKiBhIGJ1ZmZlcl9oYW5kbGVfdC4KKyAgICAgKiBTbyBpbiB0aGlzIGNhc2UsdGhlIG1ldGFkYXRhIHRoYXQgdGhlIGVuY29kZXIgcmVjZWl2ZXMKKyAgICAgKiB3aWxsIGhhdmUgYSBieXRlIHN0cmVhbSB0aGF0IGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKKyAgICAgKiAxLiBGaXJzdCwgdGhlcmUgaXMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSBHUkFsbG9jCisgICAgICogc291cmNlIChrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkKKyAgICAgKiAyLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJfaGFuZGxlX3QgdGhhdCBpcyBhIGhhbmRsZSB0byB0aGUKKyAgICAgKiBHUmFsbG9jIGJ1ZmZlci4gVGhlIGVuY29kZXIgbmVlZHMgdG8gaW50ZXJwcmV0IHRoaXMgR1JhbGxvYyBoYW5kbGUKKyAgICAgKiBhbmQgZW5jb2RlIHRoZSBmcmFtZXMuCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiB8ICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSB8IHNpemVvZihidWZmZXJfaGFuZGxlX3QpIHwKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqLworICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlID0gMSwKKworICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KKworfSBNZXRhZGF0YUJ1ZmZlclR5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIE1FVEFEQVRBX0JVRkZFUl9UWVBFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAppbmRleCA5M2I1ZDI0Li4yOTMyNzQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCkBAIC01Myw2ICs1Myw5IEBACiAKICAgICAgICAgLy8gRW5hYmxlIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIGZvciBvdXRwdXQgYnVmZmVycyBmcm9tIG5hdGl2ZSB3aW5kb3cKICAgICAgICAga0VuYWJsZUdyYWxsb2NVc2FnZVByb3RlY3RlZCA9IDEyOCwKKworICAgICAgICAvLyBTZWN1cmUgZGVjb2RpbmcgbW9kZQorICAgICAgICBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzID0gMjU2LAogICAgIH07CiAgICAgc3RhdGljIHNwPE1lZGlhU291cmNlPiBDcmVhdGUoCiAgICAgICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LApAQCAtNzksNiArODIsMTMgQEAKICAgICAvLyBmcm9tIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKKyAgICAvLyBmb3IgdXNlIGJ5IEFDb2RlYworICAgIHN0YXRpYyB2b2lkIGZpbmRNYXRjaGluZ0NvZGVjcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsCisgICAgICAgICAgICBib29sIGNyZWF0ZUVuY29kZXIsIGNvbnN0IGNoYXIgKm1hdGNoQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICptYXRjaGluZ0NvZGVjcyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5PTVhDb2RlYygpOwogCkBAIC0xNTcsNiArMTY3LDEwIEBACiAgICAgYm9vbCBtT01YTGl2ZXNMb2NhbGx5OwogICAgIElPTVg6Om5vZGVfaWQgbU5vZGU7CiAgICAgdWludDMyX3QgbVF1aXJrczsKKworICAgIC8vIEZsYWdzIHNwZWNpZmllZCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGNvZGVjLgorICAgIHVpbnQzMl90IG1GbGFnczsKKwogICAgIGJvb2wgbUlzRW5jb2RlcjsKICAgICBjaGFyICptTUlNRTsKICAgICBjaGFyICptQ29tcG9uZW50TmFtZTsKQEAgLTE5OCwxMSArMjEyLDEyIEBACiAgICAgTGlzdDxzaXplX3Q+IG1GaWxsZWRCdWZmZXJzOwogICAgIENvbmRpdGlvbiBtQnVmZmVyRmlsbGVkOwogCi0gICAgYm9vbCBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzOwotICAgIGJvb2wgbU9ubHlTdWJtaXRPbmVCdWZmZXJBdE9uZVRpbWU7Ci0gICAgYm9vbCBtRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkOworICAgIC8vIFVzZWQgdG8gcmVjb3JkIHRoZSBkZWNvZGluZyB0aW1lIGZvciBhbiBvdXRwdXQgcGljdHVyZSBmcm9tCisgICAgLy8gYSB2aWRlbyBlbmNvZGVyLgorICAgIExpc3Q8aW50NjRfdD4gbURlY29kaW5nVGltZUxpc3Q7CiAKLSAgICBPTVhDb2RlYyhjb25zdCBzcDxJT01YPiAmb214LCBJT01YOjpub2RlX2lkIG5vZGUsIHVpbnQzMl90IHF1aXJrcywKKyAgICBPTVhDb2RlYyhjb25zdCBzcDxJT01YPiAmb214LCBJT01YOjpub2RlX2lkIG5vZGUsCisgICAgICAgICAgICAgdWludDMyX3QgcXVpcmtzLCB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICBib29sIGlzRW5jb2RlciwgY29uc3QgY2hhciAqbWltZSwgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKICAgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93KTsKQEAgLTIxNCw2ICsyMjksNyBAQAogCiAgICAgdm9pZCBzZXRBTVJGb3JtYXQoYm9vbCBpc1dBTVIsIGludDMyX3QgYml0UmF0ZSk7CiAgICAgdm9pZCBzZXRBQUNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGJpdFJhdGUpOworICAgIHZvaWQgc2V0RzcxMUZvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKQEAgLTI3NSw2ICsyOTEsMTAgQEAKICAgICB2b2lkIGRyYWluSW5wdXRCdWZmZXJzKCk7CiAgICAgdm9pZCBmaWxsT3V0cHV0QnVmZmVycygpOwogCisgICAgYm9vbCBkcmFpbkFueUlucHV0QnVmZmVyKCk7CisgICAgQnVmZmVySW5mbyAqZmluZElucHV0QnVmZmVyQnlEYXRhUG9pbnRlcih2b2lkICpwdHIpOworICAgIEJ1ZmZlckluZm8gKmZpbmRFbXB0eUlucHV0QnVmZmVyKCk7CisKICAgICAvLyBSZXR1cm5zIHRydWUgaWZmIGEgZmx1c2ggd2FzIGluaXRpYXRlZCBhbmQgYSBjb21wbGV0aW9uIGV2ZW50IGlzCiAgICAgLy8gdXBjb21pbmcsIGZhbHNlIG90aGVyd2lzZSAoQSBmbHVzaCB3YXMgbm90IG5lY2Vzc2FyeSBhcyB3ZSBvd24gYWxsCiAgICAgLy8gdGhlIGJ1ZmZlcnMgb24gdGhhdCBwb3J0KS4KQEAgLTMwMSwzMCArMzIxLDIyIEBACiAKICAgICB2b2lkIGR1bXBQb3J0U3RhdHVzKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvZGVjKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgdWludDMyX3QgZmxhZ3MpOworICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvZGVjKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CiAKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0Q29tcG9uZW50UXVpcmtzKAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgYm9vbCBpc0VuY29kZXIpOwogCi0gICAgc3RhdGljIHZvaWQgZmluZE1hdGNoaW5nQ29kZWNzKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwKLSAgICAgICAgICAgIGJvb2wgY3JlYXRlRW5jb2RlciwgY29uc3QgY2hhciAqbWF0Y2hDb21wb25lbnROYW1lLAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKm1hdGNoaW5nQ29kZWNzKTsKLQogICAgIHZvaWQgcmVzdG9yZVBhdGNoZWREYXRhUG9pbnRlcihCdWZmZXJJbmZvICppbmZvKTsKIAogICAgIHN0YXR1c190IGFwcGx5Um90YXRpb24oKTsKKyAgICBzdGF0dXNfdCB3YWl0Rm9yQnVmZmVyRmlsbGVkX2woKTsKKworICAgIGludDY0X3QgcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhib29sIGlzQ29kZWNTcGVjaWZpYyk7CiAKICAgICBPTVhDb2RlYyhjb25zdCBPTVhDb2RlYyAmKTsKICAgICBPTVhDb2RlYyAmb3BlcmF0b3I9KGNvbnN0IE9NWENvZGVjICYpOwogfTsKIAotc3RydWN0IENvZGVjUHJvZmlsZUxldmVsIHsKLSAgICBPTVhfVTMyIG1Qcm9maWxlOwotICAgIE9NWF9VMzIgbUxldmVsOwotfTsKLQogc3RydWN0IENvZGVjQ2FwYWJpbGl0aWVzIHsKICAgICBTdHJpbmc4IG1Db21wb25lbnROYW1lOwogICAgIFZlY3RvcjxDb2RlY1Byb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7CkBAIC0zMzcsNiArMzQ5LDggQEAKIC8vIHRoYXQgZW5jb2RlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHR5cGUuCiAvLyBwcm9maWxlIGFuZCBsZXZlbCBpbmRpY2F0aW9ucyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIGguMjYzLCBtcGVnNCBhbmQgYXZjCiAvLyB2aWRlby4KKy8vIElmIGh3Q29kZWNPbmx5PT10cnVlLCBvbmx5IHJldHVybnMgaGFyZHdhcmUtYmFzZWQgY29tcG9uZW50cywgc29mdHdhcmUgYW5kCisvLyBoYXJkd2FyZSBvdGhlcndpc2UuCiAvLyBUaGUgcHJvZmlsZS9sZXZlbCB2YWx1ZXMgY29ycmVzcG9uZCB0bwogLy8gT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUsCiAvLyBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUsIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFLCBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUKQEAgLTM0NCw2ICszNTgsMTEgQEAKIAogc3RhdHVzX3QgUXVlcnlDb2RlY3MoCiAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBib29sIHF1ZXJ5RGVjb2RlcnMsIGJvb2wgaHdDb2RlY09ubHksCisgICAgICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gKnJlc3VsdHMpOworCitzdGF0dXNfdCBRdWVyeUNvZGVjcygKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsIGJvb2wgcXVlcnlEZWNvZGVycywKICAgICAgICAgVmVjdG9yPENvZGVjQ2FwYWJpbGl0aWVzPiAqcmVzdWx0cyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Nob3V0Y2FzdFNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3MTU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTSE9VVENBU1RfU09VUkNFX0hfCi0KLSNkZWZpbmUgU0hPVVRDQVNUX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEhUVFBTdHJlYW07Ci1jbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotCi1jbGFzcyBTaG91dGNhc3RTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotcHVibGljOgotICAgIC8vIEFzc3VtZXMgb3duZXJzaGlwIG9mICJodHRwIi4KLSAgICBTaG91dGNhc3RTb3VyY2UoSFRUUFN0cmVhbSAqaHR0cCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TaG91dGNhc3RTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBIVFRQU3RyZWFtICptSHR0cDsKLSAgICBzaXplX3QgbU1ldGFEYXRhT2Zmc2V0OwotICAgIHNpemVfdCBtQnl0ZXNVbnRpbE1ldGFEYXRhOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBTaG91dGNhc3RTb3VyY2UoY29uc3QgU2hvdXRjYXN0U291cmNlICYpOwotICAgIFNob3V0Y2FzdFNvdXJjZSAmb3BlcmF0b3I9IChjb25zdCBTaG91dGNhc3RTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNIT1VUQ0FTVF9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oCmluZGV4IDEwOGFjYjQuLjY1MTBhNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmgKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpOwogICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NGaWxlKAorICAgIHZpcnR1YWwgTWVkaWFTY2FuUmVzdWx0IHByb2Nlc3NGaWxlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCk7CiAKQEAgLTM1LDYgKzM1LDEwIEBACiBwcml2YXRlOgogICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKGNvbnN0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyICYpOwogICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyICZvcGVyYXRvcj0oY29uc3QgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIgJik7CisKKyAgICBNZWRpYVNjYW5SZXN1bHQgcHJvY2Vzc0ZpbGVJbnRlcm5hbCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAorICAgICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjI1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0dVSV9TVVJGQUNFTUVESUFTT1VSQ0VfSAorI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFTUVESUFTT1VSQ0VfSAorCisjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlVGV4dHVyZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBJR3JhcGhpY0J1ZmZlckFsbG9jOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIEdyYXBoaWNCdWZmZXI7CisKK2NsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZSA6IHB1YmxpYyBCblN1cmZhY2VUZXh0dXJlLCBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsgTUlOX1VOREVRVUVVRURfQlVGRkVSUyA9IDMgfTsKKyAgICBlbnVtIHsKKyAgICAgICAgTUlOX0FTWU5DX0JVRkZFUl9TTE9UUyA9IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgKyAxLAorICAgICAgICBNSU5fU1lOQ19CVUZGRVJfU0xPVFMgID0gTUlOX1VOREVRVUVVRURfQlVGRkVSUworICAgIH07CisgICAgZW51bSB7IE5VTV9CVUZGRVJfU0xPVFMgPSAzMiB9OworICAgIGVudW0geyBOT19DT05ORUNURURfQVBJID0gMCB9OworCisgICAgc3RydWN0IEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgICAgLy8gb25GcmFtZUF2YWlsYWJsZSgpIGlzIGNhbGxlZCBmcm9tIHF1ZXVlQnVmZmVyKCkgaXMgdGhlIEZJRk8gaXMKKyAgICAgICAgLy8gZW1wdHkuIFlvdSBjYW4gdXNlIFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0UXVldWVkQ291bnQoKSB0bworICAgICAgICAvLyBmaWd1cmUgb3V0IGlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyB3YWl0aW5nLgorICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrIGhlbGQgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkgYnkKKyAgICAgICAgLy8gbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSA9IDA7CisgICAgfTsKKworICAgIFN1cmZhY2VNZWRpYVNvdXJjZSh1aW50MzJfdCBidWZXLCB1aW50MzJfdCBidWZIKTsKKworICAgIHZpcnR1YWwgflN1cmZhY2VNZWRpYVNvdXJjZSgpOworCisKKyAgICAvLyBGb3IgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZSBmb3IgdXNlIGJ5IFN0YWdlRnJpZ2h0UmVjb3JkZXI6CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICAvLyBQYXNzIHRoZSBtZXRhZGF0YSBvdmVyIHRvIHRoZSBidWZmZXIsIGNhbGwgd2hlbiB5b3UgaGF2ZSB0aGUgbG9jaworICAgIHZvaWQgcGFzc01ldGFkYXRhQnVmZmVyTG9ja2VkKE1lZGlhQnVmZmVyICoqYnVmZmVyKTsKKyAgICBib29sIGNoZWNrQnVmZmVyTWF0Y2hlc1Nsb3QoaW50IHNsb3QsIE1lZGlhQnVmZmVyICpidWZmZXIpOworCisgICAgLy8gR2V0IC8gU2V0IHRoZSBmcmFtZSByYXRlIHVzZWQgZm9yIGVuY29kaW5nLiBEZWZhdWx0IGZwcyA9IDMwCisgICAgc3RhdHVzX3Qgc2V0RnJhbWVSYXRlKGludDMyX3QgZnBzKSA7CisgICAgaW50MzJfdCBnZXRGcmFtZVJhdGUoICkgY29uc3Q7CisKKyAgICAvLyBUaGUgY2FsbCBmb3IgdGhlIFN0YWdlRnJpZ2h0UmVjb3JkZXIgdG8gdGVsbCB1cyB0aGF0CisgICAgLy8gaXQgaXMgZG9uZSB1c2luZyB0aGUgTWVkaWFCdWZmZXIgZGF0YSBzbyB0aGF0IGl0cyBzdGF0ZQorICAgIC8vIGNhbiBiZSBzZXQgdG8gRlJFRSBmb3IgZGVxdWV1aW5nCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpOworICAgIC8vIGVuZCBvZiBNZWRpYVNvdXJjZSBpbnRlcmZhY2UKKworICAgIHVpbnQzMl90IGdldEJ1ZmZlckNvdW50KCApIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJDb3VudDt9CisKKworICAgIC8vIHNldEJ1ZmZlckNvdW50IHVwZGF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYnVmZmVyIHNsb3RzLiAgQWZ0ZXIKKyAgICAvLyBjYWxsaW5nIHRoaXMgYWxsIGJ1ZmZlciBzbG90cyBhcmUgYm90aCB1bmFsbG9jYXRlZCBhbmQgb3duZWQgYnkgdGhlCisgICAgLy8gU3VyZmFjZU1lZGlhU291cmNlIG9iamVjdCAoaS5lLiB0aGV5IGFyZSBub3Qgb3duZWQgYnkgdGhlIGNsaWVudCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0QnVmZmVyKGludCBzbG90LCBzcDxHcmFwaGljQnVmZmVyPiogYnVmKTsKKworICAgIC8vIGRlcXVldWVCdWZmZXIgZ2V0cyB0aGUgbmV4dCBidWZmZXIgc2xvdCBpbmRleCBmb3IgdGhlIGNsaWVudCB0byB1c2UuIElmIGEKKyAgICAvLyBidWZmZXIgc2xvdCBpcyBhdmFpbGFibGUgdGhlbiB0aGF0IHNsb3QgaW5kZXggaXMgd3JpdHRlbiB0byB0aGUgbG9jYXRpb24KKyAgICAvLyBwb2ludGVkIHRvIGJ5IHRoZSBidWYgYXJndW1lbnQgYW5kIGEgc3RhdHVzIG9mIE9LIGlzIHJldHVybmVkLiAgSWYgbm8KKyAgICAvLyBzbG90IGlzIGF2YWlsYWJsZSB0aGVuIGEgc3RhdHVzIG9mIC1FQlVTWSBpcyByZXR1cm5lZCBhbmQgYnVmIGlzCisgICAgLy8gdW5tb2RpZmllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpidWYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKKworICAgIC8vIHF1ZXVlQnVmZmVyIHJldHVybnMgYSBmaWxsZWQgYnVmZmVyIHRvIHRoZSBTdXJmYWNlTWVkaWFTb3VyY2UuIEluIGFkZGl0aW9uLCBhCisgICAgLy8gdGltZXN0YW1wIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBidWZmZXIuIFRoZSB0aW1lc3RhbXAgaXMgaW4KKyAgICAvLyBuYW5vc2Vjb25kcywgYW5kIG11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBJdHMgb3RoZXIgc2VtYW50aWNzCisgICAgLy8gKHplcm8gcG9pbnQsIGV0YykgYXJlIGNsaWVudC1kZXBlbmRlbnQgYW5kIHNob3VsZCBiZSBkb2N1bWVudGVkIGJ5IHRoZQorICAgIC8vIGNsaWVudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlQnVmZmVyKGludCBidWYsIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FuY2VsQnVmZmVyKGludCBidWYpOworCisgICAgLy8gb25GcmFtZVJlY2VpdmVkTG9ja2VkIGluZm9ybXMgdGhlIGJ1ZmZlciBjb25zdW1lcnMgKFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gb3IgbGlzdGVuZXJzIHRoYXQgYSBmcmFtZSBoYXMgYmVlbiByZWNlaXZlZAorICAgIC8vIFRoZSBidWZmZXIgaXMgbm90IG1hZGUgYXZhaWxhYmxlIGZvciBkZXF1ZXVlaW5nIGltbWVkaWF0ZWx5LiBXZSBuZWVkIHRvCisgICAgLy8gd2FpdCB0byBoZWFyIGZyb20gU3RhZ2VGcmlnaHRSZWNvcmRlciB0byBzZXQgdGhlIGJ1ZmZlciBGUkVFCisgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG11dGV4IGlzIGxvY2tlZAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25GcmFtZVJlY2VpdmVkTG9ja2VkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFNjYWxpbmdNb2RlKGludCBtb2RlKSB7IH0gLy8gbm8gb3AgZm9yIGVuY29kaW5nCisgICAgdmlydHVhbCBpbnQgcXVlcnkoaW50IHdoYXQsIGludCogdmFsdWUpOworCisgICAgLy8gSnVzdCBjb25maXJtaW5nIHRvIHRoZSBJU3VyZmFjZVRleHR1cmUgaW50ZXJmYWNlIGFzIG9mIG5vdworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q3JvcChjb25zdCBSZWN0JiByZWcpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0odWludDMyX3QgdHJhbnNmb3JtKSB7cmV0dXJuIE9LO30KKworICAgIC8vIHNldFN5bmNocm9ub3VzTW9kZSBzZXQgd2hldGhlciBkZXF1ZXVlQnVmZmVyIGlzIHN5bmNocm9ub3VzIG9yCisgICAgLy8gYXN5bmNocm9ub3VzLiBJbiBzeW5jaHJvbm91cyBtb2RlLCBkZXF1ZXVlQnVmZmVyIGJsb2NrcyB1bnRpbAorICAgIC8vIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSwgdGhlIGN1cnJlbnRseSBib3VuZCBidWZmZXIgY2FuIGJlIGRlcXVldWVkIGFuZAorICAgIC8vIHF1ZXVlZCBidWZmZXJzIHdpbGwgYmUgcmV0aXJlZCBpbiBvcmRlci4KKyAgICAvLyBUaGUgZGVmYXVsdCBtb2RlIGlzIHN5bmNocm9ub3VzLgorICAgIC8vIFRPRE86IENsYXJpZnkgdGhlIG1pbnV0ZSBkaWZmZXJlbmNlcyBiZXQgc3ljbiAvYXN5bmMKKyAgICAvLyBtb2RlcyAoUy5FbmNvZGVyIHZpcy1hLXZpcyBTdXJmYWNlVGV4dHVyZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNocm9ub3VzTW9kZShib29sIGVuYWJsZWQpOworCisgICAgLy8gY29ubmVjdCBhdHRlbXB0cyB0byBjb25uZWN0IGEgY2xpZW50IEFQSSB0byB0aGUgU3VyZmFjZU1lZGlhU291cmNlLiAgVGhpcworICAgIC8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgYXJlIGNhbGxlZCBleGNlcHQKKyAgICAvLyBmb3IgZ2V0QWxsb2NhdG9yLgorICAgIC8vCisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIHRoZSBjb25uZWN0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBvbiB0aGUKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgYW5kIG5vIGNvcnJlc3BvbmRpbmcgZGlzY29ubmVjdCBjYWxsIHdhcyBtYWRlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChpbnQgYXBpKTsKKworICAgIC8vIGRpc2Nvbm5lY3QgYXR0ZW1wdHMgdG8gZGlzY29ubmVjdCBhIGNsaWVudCBBUEkgZnJvbSB0aGUgU3VyZmFjZU1lZGlhU291cmNlLgorICAgIC8vIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSBhbnkgc3Vic2VxdWVudCBjYWxscyB0byBvdGhlcgorICAgIC8vIElTdXJmYWNlVGV4dHVyZSBtZXRob2RzIHRvIGZhaWwgZXhjZXB0IGZvciBnZXRBbGxvY2F0b3IgYW5kIGNvbm5lY3QuCisgICAgLy8gU3VjY2Vzc2Z1bGx5IGNhbGxpbmcgY29ubmVjdCBhZnRlciB0aGlzIHdpbGwgYWxsb3cgdGhlIG90aGVyIG1ldGhvZHMgdG8KKyAgICAvLyBzdWNjZWVkIGFnYWluLgorICAgIC8vCisgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBmYWlsIGlmIHRoZSB0aGUgU3VyZmFjZU1lZGlhU291cmNlIGlzIG5vdCBjdXJyZW50bHkKKyAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBjbGllbnQgQVBJLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdChpbnQgYXBpKTsKKworICAgIC8vIGdldHF1ZXVlZENvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzIHdhaXRpbmcgaW4gdGhlCisgICAgLy8gRklGTy4gSW4gYXN5bmNocm9ub3VzIG1vZGUsIHRoaXMgYWx3YXlzIHJldHVybnMgMCBvciAxIHNpbmNlCisgICAgLy8gZnJhbWVzIGFyZSBub3QgYWNjdW11bGF0aW5nIGluIHRoZSBGSUZPLgorICAgIHNpemVfdCBnZXRRdWV1ZWRDb3VudCgpIGNvbnN0OworCisgICAgLy8gc2V0QnVmZmVyQ291bnRTZXJ2ZXIgc2V0IHRoZSBidWZmZXIgY291bnQuIElmIHRoZSBjbGllbnQgaGFzIHJlcXVlc3RlZAorICAgIC8vIGEgYnVmZmVyIGNvdW50IHVzaW5nIHNldEJ1ZmZlckNvdW50LCB0aGUgc2VydmVyLWJ1ZmZlciBjb3VudCB3aWxsCisgICAgLy8gdGFrZSBlZmZlY3Qgb25jZSB0aGUgY2xpZW50IHNldHMgdGhlIGNvdW50IGJhY2sgdG8gemVyby4KKyAgICBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudFNlcnZlcihpbnQgYnVmZmVyQ291bnQpOworCisgICAgLy8gZ2V0VGltZXN0YW1wIHJldHJpZXZlcyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UKKyAgICAvLyBzZXQgYnkgdGhlIG1vc3QgcmVjZW50IGNhbGwgdG8gcmVhZCgpCisgICAgLy8KKyAgICAvLyBUaGUgdGltZXN0YW1wIGlzIGluIG5hbm9zZWNvbmRzLCBhbmQgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBJdHMKKyAgICAvLyBvdGhlciBzZW1hbnRpY3MgKHplcm8gcG9pbnQsIGV0YykgYXJlIHNvdXJjZS1kZXBlbmRlbnQgYW5kIHNob3VsZCBiZQorICAgIC8vIGRvY3VtZW50ZWQgYnkgdGhlIHNvdXJjZS4KKyAgICBpbnQ2NF90IGdldFRpbWVzdGFtcCgpOworCisgICAgLy8gc2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lciBzZXRzIHRoZSBsaXN0ZW5lciBvYmplY3QgdGhhdCB3aWxsIGJlIG5vdGlmaWVkCisgICAgLy8gd2hlbiBhIG5ldyBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICB2b2lkIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoY29uc3Qgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKworICAgIC8vIGdldEN1cnJlbnRCdWZmZXIgcmV0dXJucyB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBpbWFnZS4KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRDdXJyZW50QnVmZmVyKCkgY29uc3Q7CisKKyAgICAvLyBkdW1wIG91ciBzdGF0ZSBpbiBhIFN0cmluZworICAgIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBTSVpFKSBjb25zdDsKKworICAgIC8vIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyB0ZWxscyB0aGUgZW5jb2RlciB3aGV0aGVyIHdlIHdpbGwKKyAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKKyAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICAvLyBmcmVlQWxsQnVmZmVycyBmcmVlcyB0aGUgcmVzb3VyY2VzIChib3RoIEdyYXBoaWNCdWZmZXIgYW5kIEVHTEltYWdlKSBmb3IKKyAgICAvLyBhbGwgc2xvdHMuCisgICAgdm9pZCBmcmVlQWxsQnVmZmVycygpOworICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKKworcHJpdmF0ZToKKworICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50U2VydmVyTG9ja2VkKGludCBidWZmZXJDb3VudCk7CisKKyAgICBlbnVtIHsgSU5WQUxJRF9CVUZGRVJfU0xPVCA9IC0xIH07CisKKyAgICBzdHJ1Y3QgQnVmZmVyU2xvdCB7CisKKyAgICAgICAgQnVmZmVyU2xvdCgpCisgICAgICAgICAgICA6IG1CdWZmZXJTdGF0ZShCdWZmZXJTbG90OjpGUkVFKSwKKyAgICAgICAgICAgICAgbVJlcXVlc3RCdWZmZXJDYWxsZWQoZmFsc2UpLAorICAgICAgICAgICAgICBtVGltZXN0YW1wKDApIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1HcmFwaGljQnVmZmVyIHBvaW50cyB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdGhpcyBzbG90IG9yIGlzCisgICAgICAgIC8vIE5VTEwgaWYgbm8gYnVmZmVyIGhhcyBiZWVuIGFsbG9jYXRlZC4KKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7CisKKyAgICAgICAgLy8gQnVmZmVyU3RhdGUgcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBpbiB3aGljaCBhIGJ1ZmZlciBzbG90CisgICAgICAgIC8vIGNhbiBiZS4KKyAgICAgICAgZW51bSBCdWZmZXJTdGF0ZSB7CisgICAgICAgICAgICAvLyBGUkVFIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgaXMgbm90IGN1cnJlbnRseSBiZWluZyB1c2VkIGFuZAorICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgdXNlZCBpbiB0aGUgZnV0dXJlIHVudGlsIGl0IGdldHMgZGVxdWV1ZWQgYW5kCisgICAgICAgICAgICAvLyBzdWJzZXFlbnRseSBxdWV1ZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgICAgICAgIEZSRUUgPSAwLAorCisgICAgICAgICAgICAvLyBERVFVRVVFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGRlcXVldWVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY2xpZW50LCBidXQgaGFzIG5vdCB5ZXQgYmVlbiBxdWV1ZWQgb3IgY2FuY2VsZWQuIFRoZSBidWZmZXIgaXMKKyAgICAgICAgICAgIC8vIGNvbnNpZGVyZWQgJ293bmVkJyBieSB0aGUgY2xpZW50LCBhbmQgdGhlIHNlcnZlciBzaG91bGQgbm90IHVzZQorICAgICAgICAgICAgLy8gaXQgZm9yIGFueXRoaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3aGVuIGluIHN5bmNocm9ub3VzLW1vZGUgKG1TeW5jaHJvbm91c01vZGUgPT0gdHJ1ZSksCisgICAgICAgICAgICAvLyB0aGUgYnVmZmVyIHRoYXQncyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhlIHRleHR1cmUgbWF5IGJlCisgICAgICAgICAgICAvLyBkZXF1ZXVlZCBieSB0aGUgY2xpZW50LiAgVGhhdCBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGJ1ZmZlciBjYW4KKyAgICAgICAgICAgIC8vIGJlIGluIGVpdGhlciB0aGUgREVRVUVVRUQgb3IgUVVFVUVEIHN0YXRlLiAgSW4gYXN5bmNocm9ub3VzIG1vZGUsCisgICAgICAgICAgICAvLyBob3dldmVyLCB0aGUgY3VycmVudCBidWZmZXIgaXMgYWx3YXlzIGluIHRoZSBRVUVVRUQgc3RhdGUuCisgICAgICAgICAgICBERVFVRVVFRCA9IDEsCisKKyAgICAgICAgICAgIC8vIFFVRVVFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIHF1ZXVlZCBieSB0aGUgY2xpZW50LAorICAgICAgICAgICAgLy8gYW5kIGhhcyBub3Qgc2luY2UgYmVlbiBtYWRlIGF2YWlsYWJsZSBmb3IgdGhlIGNsaWVudCB0byBkZXF1ZXVlLgorICAgICAgICAgICAgLy8gQXR0YWNoaW5nIHRoZSBidWZmZXIgdG8gdGhlIHRleHR1cmUgZG9lcyBOT1QgdHJhbnNpdGlvbiB0aGUKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBhd2F5IGZyb20gdGhlIFFVRVVFRCBzdGF0ZS4gSG93ZXZlciwgaW4gU3luY2hyb25vdXMgbW9kZQorICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgYnVmZmVyIG1heSBiZSBkZXF1ZXVlZCBieSB0aGUgY2xpZW50IHVuZGVyIHNvbWUKKyAgICAgICAgICAgIC8vIGNpcmN1bXN0YW5jZXMuIFNlZSB0aGUgbm90ZSBhYm91dCB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlCisgICAgICAgICAgICAvLyBkb2N1bWVudGF0aW9uIGZvciBERVFVRVVFRC4KKyAgICAgICAgICAgIFFVRVVFRCA9IDIsCisgICAgICAgIH07CisKKyAgICAgICAgLy8gbUJ1ZmZlclN0YXRlIGlzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgYnVmZmVyIHNsb3QuCisgICAgICAgIEJ1ZmZlclN0YXRlIG1CdWZmZXJTdGF0ZTsKKworICAgICAgICAvLyBtUmVxdWVzdEJ1ZmZlckNhbGxlZCBpcyB1c2VkIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIGNsaWVudCBkaWQKKyAgICAgICAgLy8gY2FsbCByZXF1ZXN0QnVmZmVyKCkgd2hlbiB0b2xkIHRvIGRvIHNvLiBUZWNobmljYWxseSB0aGlzIGlzIG5vdAorICAgICAgICAvLyBuZWVkZWQgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBjYXRjaGluZyBjbGllbnQgYnVncy4KKyAgICAgICAgYm9vbCBtUmVxdWVzdEJ1ZmZlckNhbGxlZDsKKworICAgICAgICAvLyBtVGltZXN0YW1wIGlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcyBnZXRzCisgICAgICAgIC8vIHRvIHNldCBieSBxdWV1ZUJ1ZmZlciBlYWNoIHRpbWUgdGhpcyBzbG90IGlzIHF1ZXVlZC4KKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wOworICAgIH07CisKKyAgICAvLyBtU2xvdHMgaXMgdGhlIGFycmF5IG9mIGJ1ZmZlciBzbG90cyB0aGF0IG11c3QgYmUgbWlycm9yZWQgb24gdGhlIGNsaWVudAorICAgIC8vIHNpZGUuIFRoaXMgYWxsb3dzIGJ1ZmZlciBvd25lcnNoaXAgdG8gYmUgdHJhbnNmZXJyZWQgYmV0d2VlbiB0aGUgY2xpZW50CisgICAgLy8gYW5kIHNlcnZlciB3aXRob3V0IHNlbmRpbmcgYSBHcmFwaGljQnVmZmVyIG92ZXIgYmluZGVyLiBUaGUgZW50aXJlIGFycmF5CisgICAgLy8gaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCBhdCBjb25zdHJ1Y3Rpb24gdGltZSwgYW5kIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZAorICAgIC8vIGZvciBhIHNsb3Qgd2hlbiByZXF1ZXN0QnVmZmVyIGlzIGNhbGxlZCB3aXRoIHRoYXQgc2xvdCdzIGluZGV4LgorICAgIEJ1ZmZlclNsb3QgbVNsb3RzW05VTV9CVUZGRVJfU0xPVFNdOworCisgICAgLy8gbURlZmF1bHRXaWR0aCBob2xkcyB0aGUgZGVmYXVsdCB3aWR0aCBvZiBhbGxvY2F0ZWQgYnVmZmVycy4gSXQgaXMgdXNlZAorICAgIC8vIGluIHJlcXVlc3RCdWZmZXJzKCkgaWYgYSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHplcm8gaXMgc3BlY2lmaWVkLgorICAgIHVpbnQzMl90IG1EZWZhdWx0V2lkdGg7CisKKyAgICAvLyBtRGVmYXVsdEhlaWdodCBob2xkcyB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMuIEl0IGlzIHVzZWQKKyAgICAvLyBpbiByZXF1ZXN0QnVmZmVycygpIGlmIGEgd2lkdGggYW5kIGhlaWdodCBvZiB6ZXJvIGlzIHNwZWNpZmllZC4KKyAgICB1aW50MzJfdCBtRGVmYXVsdEhlaWdodDsKKworICAgIC8vIG1QaXhlbEZvcm1hdCBob2xkcyB0aGUgcGl4ZWwgZm9ybWF0IG9mIGFsbG9jYXRlZCBidWZmZXJzLiBJdCBpcyB1c2VkCisgICAgLy8gaW4gcmVxdWVzdEJ1ZmZlcnMoKSBpZiBhIGZvcm1hdCBvZiB6ZXJvIGlzIHNwZWNpZmllZC4KKyAgICB1aW50MzJfdCBtUGl4ZWxGb3JtYXQ7CisKKyAgICAvLyBtQnVmZmVyQ291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXIgc2xvdHMgdGhhdCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAvLyBtdXN0IG1haW50YWluLiBJdCBkZWZhdWx0cyB0byBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTIGFuZCBjYW4gYmUgY2hhbmdlZAorICAgIC8vIGJ5IGNhbGxpbmcgc2V0QnVmZmVyQ291bnQgb3Igc2V0QnVmZmVyQ291bnRTZXJ2ZXIKKyAgICBpbnQgbUJ1ZmZlckNvdW50OworCisgICAgLy8gbUNsaWVudEJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVyIHNsb3RzIHJlcXVlc3RlZCBieSB0aGUKKyAgICAvLyBjbGllbnQuIFRoZSBkZWZhdWx0IGlzIHplcm8sIHdoaWNoIG1lYW5zIHRoZSBjbGllbnQgZG9lc24ndCBjYXJlIGhvdworICAgIC8vIG1hbnkgYnVmZmVycyB0aGVyZSBhcmUKKyAgICBpbnQgbUNsaWVudEJ1ZmZlckNvdW50OworCisgICAgLy8gbVNlcnZlckJ1ZmZlckNvdW50IGJ1ZmZlciBjb3VudCByZXF1ZXN0ZWQgYnkgdGhlIHNlcnZlci1zaWRlCisgICAgaW50IG1TZXJ2ZXJCdWZmZXJDb3VudDsKKworICAgIC8vIG1DdXJyZW50U2xvdCBpcyB0aGUgYnVmZmVyIHNsb3QgaW5kZXggb2YgdGhlIGJ1ZmZlciB0aGF0IGlzIGN1cnJlbnRseQorICAgIC8vIGJlaW5nIHVzZWQgYnkgYnVmZmVyIGNvbnN1bWVyCisgICAgLy8gKGUuZy4gU3RhZ2VGcmlnaHRSZWNvcmRlciBpbiB0aGUgY2FzZSBvZiBTdXJmYWNlTWVkaWFTb3VyY2Ugb3IgR0xUZXh0dXJlCisgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU3VyZmFjZVRleHR1cmUpLgorICAgIC8vIEl0IGlzIGluaXRpYWxpemVkIHRvIElOVkFMSURfQlVGRkVSX1NMT1QsCisgICAgLy8gaW5kaWNhdGluZyB0aGF0IG5vIGJ1ZmZlciBzbG90IGlzIGN1cnJlbnRseSBib3VuZCB0byB0aGUgdGV4dHVyZS4gTm90ZSwKKyAgICAvLyBob3dldmVyLCB0aGF0IGEgdmFsdWUgb2YgSU5WQUxJRF9CVUZGRVJfU0xPVCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuCisgICAgLy8gdGhhdCBubyBidWZmZXIgaXMgYm91bmQgdG8gdGhlIHRleHR1cmUuIEEgY2FsbCB0byBzZXRCdWZmZXJDb3VudCB3aWxsCisgICAgLy8gcmVzZXQgbUN1cnJlbnRUZXh0dXJlIHRvIElOVkFMSURfQlVGRkVSX1NMT1QuCisgICAgaW50IG1DdXJyZW50U2xvdDsKKworCisgICAgLy8gbUN1cnJlbnRCdWYgaXMgdGhlIGdyYXBoaWMgYnVmZmVyIG9mIHRoZSBjdXJyZW50IHNsb3QgdG8gYmUgdXNlZCBieQorICAgIC8vIGJ1ZmZlciBjb25zdW1lci4gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgYnVmZmVyIGlzIG5vdCBhc3NvY2lhdGVkCisgICAgLy8gd2l0aCBhbnkgYnVmZmVyIHNsb3QsIHNvIHdlIG11c3QgdHJhY2sgaXQgc2VwYXJhdGVseSBpbiBvcmRlciB0bworICAgIC8vIHByb3Blcmx5IHVzZSBJR3JhcGhpY0J1ZmZlckFsbG9jOjpmcmVlQWxsR3JhcGhpY0J1ZmZlcnNFeGNlcHQuCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUN1cnJlbnRCdWY7CisKKworICAgIC8vIG1DdXJyZW50VGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0CisgICAgLy8gZ2V0cyBzZXQgdG8gbUxhc3RRdWV1ZWRUaW1lc3RhbXAgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KKyAgICBpbnQ2NF90IG1DdXJyZW50VGltZXN0YW1wOworCisgICAgLy8gbUdyYXBoaWNCdWZmZXJBbGxvYyBpcyB0aGUgY29ubmVjdGlvbiB0byBTdXJmYWNlRmxpbmdlciB0aGF0IGlzIHVzZWQgdG8KKyAgICAvLyBhbGxvY2F0ZSBuZXcgR3JhcGhpY0J1ZmZlciBvYmplY3RzLgorICAgIHNwPElHcmFwaGljQnVmZmVyQWxsb2M+IG1HcmFwaGljQnVmZmVyQWxsb2M7CisKKyAgICAvLyBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBpcyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhCisgICAgLy8gbmV3IGZyYW1lIGJlY29tZXMgYXZhaWxhYmxlLiBJZiBpdCBpcyBub3QgTlVMTCBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tCisgICAgLy8gcXVldWVCdWZmZXIuCisgICAgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7CisKKyAgICAvLyBtU3luY2hyb25vdXNNb2RlIHdoZXRoZXIgd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSBvciBub3QKKyAgICBib29sIG1TeW5jaHJvbm91c01vZGU7CisKKyAgICAvLyBtQ29ubmVjdGVkQXBpIGluZGljYXRlcyB0aGUgQVBJIHRoYXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGlzCisgICAgLy8gU3VyZmFjZVRleHR1cmUuICBJdCBkZWZhdWx0cyB0byBOT19DT05ORUNURURfQVBJICg9IDApLCBhbmQgZ2V0cyB1cGRhdGVkCisgICAgLy8gYnkgdGhlIGNvbm5lY3QgYW5kIGRpc2Nvbm5lY3QgbWV0aG9kcy4KKyAgICBpbnQgbUNvbm5lY3RlZEFwaTsKKworICAgIC8vIG1EZXF1ZXVlQ29uZGl0aW9uIGNvbmRpdGlvbiB1c2VkIGZvciBkZXF1ZXVlQnVmZmVyIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtRGVxdWV1ZUNvbmRpdGlvbjsKKworCisgICAgLy8gbVF1ZXVlIGlzIGEgRklGTyBvZiBxdWV1ZWQgYnVmZmVycyB1c2VkIGluIHN5bmNocm9ub3VzIG1vZGUKKyAgICB0eXBlZGVmIFZlY3RvcjxpbnQ+IEZpZm87CisgICAgRmlmbyBtUXVldWU7CisKKyAgICAvLyBtTXV0ZXggaXMgdGhlIG11dGV4IHVzZWQgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgbWVtYmVyCisgICAgLy8gdmFyaWFibGVzIG9mIFN1cmZhY2VNZWRpYVNvdXJjZSBvYmplY3RzLiBJdCBtdXN0IGJlIGxvY2tlZCB3aGVuZXZlciB0aGUKKyAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZC4KKyAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZvciBNZWRpYVNvdXJjZQorICAgIC8vIFNldCB0byBhIGRlZmF1bHQgb2YgMzAgZnBzIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBzaWRlCisgICAgaW50MzJfdCBtRnJhbWVSYXRlOworCisgICAgLy8gbVN0YXJ0ZWQgaXMgYSBmbGFnIHRvIGNoZWNrIGlmIHRoZSByZWNvcmRpbmcgaGFzIHN0YXJ0ZWQKKyAgICBib29sIG1TdGFydGVkOworCisgICAgLy8gbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uIGNvbmRpdGlvbiB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlcmUKKyAgICAvLyBpcyBhIGZyYW1lIGF2YWlsYWJsZSBmb3IgZGVxdWV1aW5nCisgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKKyAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CisKKyAgICAvLyBBdm9pZCBjb3B5aW5nIGFuZCBlcXVhdGluZyBhbmQgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhTdXJmYWNlTWVkaWFTb3VyY2UpOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfR1VJX1NVUkZBQ0VNRURJQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKaW5kZXggNGE4YmU3Yi4uOTcxNzBkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaApAQCAtMTYsMjkgKzE2LDI5IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgogICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KICAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCiAgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqLwogCi0vKiogCisvKioKICAqIEBmaWxlIE9NWF9JVkNvbW1vbi5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCiAgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IFZpZGVvIGFuZCBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCiAgKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCkBAIC01Myw3ICs1Myw3IEBACiAvKioKICAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUgaGVhZGVyCiAgKiB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCBmb3IgdGhpcyBoZWFkZXIKLSAqIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKiBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5CiAgKi8KIAogI2luY2x1ZGUgPE9NWF9Db3JlLmg+CkBAIC02NCw4ICs2NCw4IEBACiAgKi8KIAogCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBkZWZpbmluZyBwb3NzaWJsZSB1bmNvbXByZXNzZWQgaW1hZ2UvdmlkZW8gZm9ybWF0cy4gCisvKioKKyAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHBvc3NpYmxlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXRzLgogICoKICAqIEVOVU1TOgogICogIFVudXNlZCAgICAgICAgICAgICAgICAgOiBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSwKICAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYsCiAgICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjYsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2LAogICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCwKICAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODgsCiAgICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QVJHQjE4ODcsCkBAIC0xMzYsNTMgKzEzNiw2MiBAQAogICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQsCiAgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQsCiAgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwyLCAKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDQsIAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMOCwgCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwxNiwgCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwyNCwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEwyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMNCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDgsCisgICAgT01YX0NPTE9SX0Zvcm1hdEwxNiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDI0LAogICAgIE9NWF9DT0xPUl9Gb3JtYXRMMzIsCiAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCiAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIsCiAgICAgT01YX0NPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2LAogICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2LAogICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0NPTE9SX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIC8qKjxSZXNlcnZlZCBhbmRyb2lkIG9wYXF1ZSBjb2xvcmZvcm1hdC4gVGVsbHMgdGhlIGVuY29kZXIgdGhhdAorICAgICAqIHRoZSBhY3R1YWwgY29sb3Jmb3JtYXQgd2lsbCBiZSAgcmVsYXllZCBieSB0aGUKKyAgICAgKiBHcmFsbG9jIEJ1ZmZlcnMuCisgICAgICogRklYTUU6IEluIHRoZSBwcm9jZXNzIG9mIHJlc2VydmluZyBzb21lIGVudW0gdmFsdWVzIGZvcgorICAgICAqIEFuZHJvaWQtc3BlY2lmaWMgT01YIElMIGNvbG9yZm9ybWF0cy4gQ2hhbmdlIHRoaXMgZW51bSB0bworICAgICAqIGFuIGFjY2VwdGFibGUgcmFuZ2Ugb25jZSB0aGF0IGlzIGRvbmUuKi8KKyAgICBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSA9IDB4N0YwMDAwMDEsCisgICAgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgPSAweDdGMDAwMTAwLAorICAgIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwLAogICAgIE9NWF9DT0xPUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9DT0xPUl9GT1JNQVRUWVBFOwogCiAKLS8qKiAKKy8qKgogICogRGVmaW5lcyB0aGUgbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gUkdCIHRvIFlVViBvciB2aWNlIHZlcnNhLgotICogaUNvbG9yTWF0cml4IHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBmaXhlZCBwb2ludCB2YWx1ZXMgCisgKiBpQ29sb3JNYXRyaXggc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGZpeGVkIHBvaW50IHZhbHVlcwogICogdXNlZCBpbiBjb252ZXJ0aW5nIGJldHdlZW4gZm9ybWF0cy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvICovCiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8gKi8KICAgICBPTVhfUzMyIHhDb2xvck1hdHJpeFszXVszXTsgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KICAgICBPTVhfUzMyIHhDb2xvck9mZnNldFs0XTsgICAgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KIH1PTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEU7CiAKIAotLyoqIAotICogU3RydWN0dXJlIGRlZmluaW5nIHBlcmNlbnQgdG8gc2NhbGUgZWFjaCBmcmFtZSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZTogIAorLyoqCisgKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgcGVyY2VudCB0byBzY2FsZSBlYWNoIGZyYW1lIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgogICogVG8gbWFrZSB0aGUgd2lkdGggNTAlIGxhcmdlciwgdXNlIGZXaWR0aCA9IDEuNSBhbmQgdG8gbWFrZSB0aGUgd2lkdGgKICAqIDEvMiB0aGUgb3JpZ2luYWwgc2l6ZSwgdXNlIGZXaWR0aCA9IDAuNQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwogICAgIE9NWF9TMzIgeFdpZHRoOyAgICAgICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCiAgICAgT01YX1MzMiB4SGVpZ2h0OyAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KIH1PTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRTsKIAogCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBpbWFnZSBmaWx0ZXIgdHlwZXMgCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGltYWdlIGZpbHRlciB0eXBlcwogICovCiB0eXBlZGVmIGVudW0gT01YX0lNQUdFRklMVEVSVFlQRSB7CiAgICAgT01YX0ltYWdlRmlsdGVyTm9uZSwKQEAgLTE5MywyMyArMjAyLDIzIEBACiAgICAgT01YX0ltYWdlRmlsdGVyT2lsUGFpbnQsCiAgICAgT01YX0ltYWdlRmlsdGVySGF0Y2gsCiAgICAgT01YX0ltYWdlRmlsdGVyR3BlbiwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJBbnRpYWxpYXMsIAotICAgIE9NWF9JbWFnZUZpbHRlckRlUmluZywgICAgICAgCisgICAgT01YX0ltYWdlRmlsdGVyQW50aWFsaWFzLAorICAgIE9NWF9JbWFnZUZpbHRlckRlUmluZywKICAgICBPTVhfSW1hZ2VGaWx0ZXJTb2xhcml6ZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0ltYWdlRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0ltYWdlRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSW1hZ2VGaWx0ZXJNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9JTUFHRUZJTFRFUlRZUEU7CiAKIAotLyoqIAotICogSW1hZ2UgZmlsdGVyIGNvbmZpZ3VyYXRpb24gCisvKioKKyAqIEltYWdlIGZpbHRlciBjb25maWd1cmF0aW9uCiAgKgogICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgIAorICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKLSAqICBlSW1hZ2VGaWx0ZXIgOiBJbWFnZSBmaWx0ZXIgdHlwZSBlbnVtZXJhdGlvbiAgICAgIAorICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUltYWdlRmlsdGVyIDogSW1hZ2UgZmlsdGVyIHR5cGUgZW51bWVyYXRpb24KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC0yMTksMjIgKzIyOCwyMiBAQAogfSBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRTsKIAogCi0vKiogCi0gKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50IAorLyoqCisgKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50CiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIGJDb2xvckVuaGFuY2VtZW50IDogRW5hYmxlL2Rpc2FibGUgY29sb3IgZW5oYW5jZW1lbnQKLSAqICBuQ3VzdG9taXplZFUgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yIAorICogIG5DdXN0b21pemVkVSAgICAgIDogUHJhY3RpY2FsIHZhbHVlczogMTYtMjQwLCByYW5nZTogMC0yNTUsIHZhbHVlIHNldCBmb3IKICAqICAgICAgICAgICAgICAgICAgICAgIFUgY29tcG9uZW50Ci0gKiAgbkN1c3RvbWl6ZWRWICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvciAKKyAqICBuQ3VzdG9taXplZFYgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yCiAgKiAgICAgICAgICAgICAgICAgICAgICBWIGNvbXBvbmVudAogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsKICAgICBPTVhfQk9PTCBiQ29sb3JFbmhhbmNlbWVudDsKICAgICBPTVhfVTggbkN1c3RvbWl6ZWRVOwpAQCAtMjQyLDEyICsyNTEsMTIgQEAKIH0gT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRTsKIAogCi0vKiogCi0gKiBEZWZpbmUgY29sb3Iga2V5IGFuZCBjb2xvciBrZXkgbWFzayAKKy8qKgorICogRGVmaW5lIGNvbG9yIGtleSBhbmQgY29sb3Iga2V5IG1hc2sKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBuQVJHQkNvbG9yIDogMzJiaXQgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgQ29sb3IKICAqICBuQVJHQk1hc2sgIDogMzJiaXQgTWFzayBmb3IgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgY2hhbm5lbHMKQEAgLTI2MSwxMiArMjcwLDEyIEBACiB9IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFOwogCiAKLS8qKiAKLSAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcgCisvKioKKyAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcKICAqCiAgKiBFTlVNUzoKICAqICBOb25lICAgICAgICAgIDogTm8gY29sb3IgYmxlbmRpbmcgcHJlc2VudAotICogIEFscGhhQ29uc3RhbnQgOiBGdW5jdGlvbiBpcyAoYWxwaGFfY29uc3RhbnQgKiBzcmMpICsgCisgKiAgQWxwaGFDb25zdGFudCA6IEZ1bmN0aW9uIGlzIChhbHBoYV9jb25zdGFudCAqIHNyYykgKwogICogICAgICAgICAgICAgICAgICAoMSAtIGFscGhhX2NvbnN0YW50KSAqIGRzdCkKICAqICBBbHBoYVBlclBpeGVsIDogRnVuY3Rpb24gaXMgKGFscGhhICogc3JjKSArICgxIC0gYWxwaGEpICogZHN0KQogICogIEFsdGVybmF0ZSAgICAgOiBGdW5jdGlvbiBpcyBhbHRlcm5hdGluZyBwaXhlbHMgZnJvbSBzcmMgYW5kIGRzdApAQCAtMjgyLDIxICsyOTEsMjEgQEAKICAgICBPTVhfQ29sb3JCbGVuZEFuZCwKICAgICBPTVhfQ29sb3JCbGVuZE9yLAogICAgIE9NWF9Db2xvckJsZW5kSW52ZXJ0LAotICAgIE9NWF9Db2xvckJsZW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Db2xvckJsZW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0NvbG9yQmxlbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9Db2xvckJsZW5kTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQ09MT1JCTEVORFRZUEU7CiAKIAotLyoqIAotICogQ29sb3IgYmxlbmQgY29uZmlndXJhdGlvbiAKKy8qKgorICogQ29sb3IgYmxlbmQgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgIAotICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgICAgCisgKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgblJHQkFscGhhQ29uc3RhbnQgOiBDb25zdGFudCBnbG9iYWwgYWxwaGEgdmFsdWVzIHdoZW4gZ2xvYmFsIGFscGhhIGlzIHVzZWQKLSAqICBlQ29sb3JCbGVuZCAgICAgICA6IENvbG9yIGJsZW5kIHR5cGUgZW51bWVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgZUNvbG9yQmxlbmQgICAgICAgOiBDb2xvciBibGVuZCB0eXBlIGVudW1lcmF0aW9uCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC0zMDcsMTUgKzMxNiwxNSBAQAogfSBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFOwogCiAKLS8qKiAKKy8qKgogICogSG9sZCBmcmFtZSBkaW1lbnNpb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAKLSAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzICAgICAgICAgICAgICAgICAKLSAqICBuSGVpZ2h0ICAgIDogRnJhbWUgaGVpZ2h0IGluIHBpeGVscyAgICAgICAgICAgICAgICAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzCisgKiAgbkhlaWdodCAgICA6IEZyYW1lIGhlaWdodCBpbiBwaXhlbHMKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0ZSQU1FU0laRVRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC0zMjcsNjkgKzMzNiw2OSBAQAogCiAKIC8qKgotICogUm90YXRpb24gY29uZmlndXJhdGlvbiAKKyAqIFJvdGF0aW9uIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgIAorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKICAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5Sb3RhdGlvbiAgOiArLy0gaW50ZWdlciByb3RhdGlvbiB2YWx1ZSAgICAgICAgICAgICAgIAorICogIG5Sb3RhdGlvbiAgOiArLy0gaW50ZWdlciByb3RhdGlvbiB2YWx1ZQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CiAgICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgblJvdGF0aW9uOyAKKyAgICBPTVhfUzMyIG5Sb3RhdGlvbjsKIH0gT01YX0NPTkZJR19ST1RBVElPTlRZUEU7CiAKIAotLyoqIAotICogUG9zc2libGUgbWlycm9yaW5nIGRpcmVjdGlvbnMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcgCisvKioKKyAqIFBvc3NpYmxlIG1pcnJvcmluZyBkaXJlY3Rpb25zIGZvciBwcmUvcG9zdCBwcm9jZXNzaW5nCiAgKgogICogRU5VTVM6Ci0gKiAgTm9uZSAgICAgICA6IE5vIG1pcnJvcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBWZXJ0aWNhbCAgIDogVmVydGljYWwgbWlycm9yaW5nLCBmbGlwIG9uIFggYXhpcyAgIAotICogIEhvcml6b250YWwgOiBIb3Jpem9udGFsIG1pcnJvcmluZywgZmxpcCBvbiBZIGF4aXMgIAorICogIE5vbmUgICAgICAgOiBObyBtaXJyb3JpbmcKKyAqICBWZXJ0aWNhbCAgIDogVmVydGljYWwgbWlycm9yaW5nLCBmbGlwIG9uIFggYXhpcworICogIEhvcml6b250YWwgOiBIb3Jpem9udGFsIG1pcnJvcmluZywgZmxpcCBvbiBZIGF4aXMKICAqICBCb3RoICAgICAgIDogQm90aCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBtaXJyb3JpbmcKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9NSVJST1JUWVBFIHsKICAgICBPTVhfTWlycm9yTm9uZSA9IDAsCiAgICAgT01YX01pcnJvclZlcnRpY2FsLAogICAgIE9NWF9NaXJyb3JIb3Jpem9udGFsLAotICAgIE9NWF9NaXJyb3JCb3RoLCAKLSAgICBPTVhfTWlycm9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9NaXJyb3JCb3RoLAorICAgIE9NWF9NaXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfTWlycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWlycm9yTWF4ID0gMHg3RkZGRkZGRiAgIAorICAgIE9NWF9NaXJyb3JNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9NSVJST1JUWVBFOwogCiAKLS8qKiAKLSAqIE1pcnJvcmluZyBjb25maWd1cmF0aW9uIAorLyoqCisgKiBNaXJyb3JpbmcgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gIAotICogIGVNaXJyb3IgICAgOiBNaXJyb3IgdHlwZSBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZU1pcnJvciAgICA6IE1pcnJvciB0eXBlIGVudW1lcmF0aW9uCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUlSUk9SVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CiAgICAgT01YX01JUlJPUlRZUEUgIGVNaXJyb3I7CiB9IE9NWF9DT05GSUdfTUlSUk9SVFlQRTsKIAogCi0vKiogCi0gKiBQb3NpdGlvbiBpbmZvcm1hdGlvbiBvbmx5IAorLyoqCisgKiBQb3NpdGlvbiBpbmZvcm1hdGlvbiBvbmx5CiAgKgogICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgIAorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKICAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5YICAgICAgICAgOiBYIGNvb3JkaW5hdGUgZm9yIHRoZSBwb2ludCAgICAgICAgICAgICAgICAgICAgIAotICogIG5ZICAgICAgICAgOiBZIGNvb3JkaW5hdGUgZm9yIHRoZSBwb2ludCAKLSAqLyAgICAgICAgICAgICAgICAgICAgICAKKyAqICBuWCAgICAgICAgIDogWCBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKKyAqICBuWSAgICAgICAgIDogWSBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKKyAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QT0lOVFRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwpAQCAtMzk5LDM3ICs0MDgsMzcgQEAKIH0gT01YX0NPTkZJR19QT0lOVFRZUEU7CiAKIAotLyoqIAotICogRnJhbWUgc2l6ZSBwbHVzIHBvc2l0aW9uIAorLyoqCisgKiBGcmFtZSBzaXplIHBsdXMgcG9zaXRpb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgIAotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBuTGVmdCAgICAgIDogWCBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQogICogIG5Ub3AgICAgICAgOiBZIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCi0gKiAgbldpZHRoICAgICA6IFdpZHRoIG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBuSGVpZ2h0ICAgIDogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIG5XaWR0aCAgICAgOiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlCisgKiAgbkhlaWdodCAgICA6IEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUkVDVFRZUEUgewogICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAKLSAgICBPTVhfUzMyIG5MZWZ0OyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgbkxlZnQ7CiAgICAgT01YX1MzMiBuVG9wOwogICAgIE9NWF9VMzIgbldpZHRoOwogICAgIE9NWF9VMzIgbkhlaWdodDsKIH0gT01YX0NPTkZJR19SRUNUVFlQRTsKIAogCi0vKiogCi0gKiBEZWJsb2NraW5nIHN0YXRlOyBpdCBpcyByZXF1aXJlZCB0byBiZSBzZXQgdXAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb2RlYyAKKy8qKgorICogRGVibG9ja2luZyBzdGF0ZTsgaXQgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHVwIGJlZm9yZSBzdGFydGluZyB0aGUgY29kZWMKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAotICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRGVibG9ja2luZyA6IEVuYWJsZS9kaXNhYmxlIGRlYmxvY2tpbmcgbW9kZSAgICAKKyAqICBiRGVibG9ja2luZyA6IEVuYWJsZS9kaXNhYmxlIGRlYmxvY2tpbmcgbW9kZQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC00MzksMTMgKzQ0OCwxMyBAQAogfSBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEU7CiAKIAotLyoqIAotICogU3RhYmlsaXphdGlvbiBzdGF0ZSAKKy8qKgorICogU3RhYmlsaXphdGlvbiBzdGF0ZQogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gICAgCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgCisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgYlN0YWIgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZyYW1lIHN0YWJpbGl6YXRpb24gc3RhdGUKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFIHsKQEAgLTQ1Niw4ICs0NjUsOCBAQAogfSBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEU7CiAKIAotLyoqIAotICogV2hpdGUgQmFsYW5jZSBjb250cm9sIHR5cGUgCisvKioKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCB0eXBlCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgU3VuTGlnaHQgOiBSZWZlcmVuY2VkIGluIEpTUi0yMzQKQEAgLTQ3NCwyMCArNDgzLDIwIEBACiAgICAgT01YX1doaXRlQmFsQ29udHJvbEluY2FuZGVzY2VudCwKICAgICBPTVhfV2hpdGVCYWxDb250cm9sRmxhc2gsCiAgICAgT01YX1doaXRlQmFsQ29udHJvbEhvcml6b24sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1doaXRlQmFsQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX1doaXRlQmFsQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX1dISVRFQkFMQ09OVFJPTFRZUEU7CiAKIAotLyoqIAotICogV2hpdGUgQmFsYW5jZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisvKioKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uCiAgKgogICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgIAotICogIGVXaGl0ZUJhbENvbnRyb2wgOiBXaGl0ZSBiYWxhbmNlIGVudW1lcmF0aW9uICAgICAgICAgICAgCisgKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZVdoaXRlQmFsQ29udHJvbCA6IFdoaXRlIGJhbGFuY2UgZW51bWVyYXRpb24KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19XSElURUJBTENPTlRST0xUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwpAQCAtNDk3LDggKzUwNiw4IEBACiB9IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRTsKIAogCi0vKiogCi0gKiBFeHBvc3VyZSBjb250cm9sIHR5cGUgCisvKioKKyAqIEV4cG9zdXJlIGNvbnRyb2wgdHlwZQogICovCiB0eXBlZGVmIGVudW0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgewogICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xPZmYgPSAwLApAQCAtNTExLDIwICs1MjAsMjAgQEAKICAgICBPTVhfRXhwb3N1cmVDb250cm9sQmVhY2gsCiAgICAgT01YX0V4cG9zdXJlQ29udHJvbExhcmdlQXBlcnR1cmUsCiAgICAgT01YX0V4cG9zdXJlQ29udHJvbFNtYWxsQXBwZXJ0dXJlLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0V4cG9zdXJlQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFOwogCiAKLS8qKiAKLSAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uIAorLyoqCisgKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgCi0gKiAgZUV4cG9zdXJlQ29udHJvbCA6IEV4cG9zdXJlIGNvbnRyb2wgZW51bWVyYXRpb24gICAgICAgICAKKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRXhwb3N1cmVDb250cm9sIDogRXhwb3N1cmUgY29udHJvbCBlbnVtZXJhdGlvbgogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0VYUE9TVVJFQ09OVFJPTFRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC01MzQsMTYgKzU0MywxNiBAQAogfSBPTVhfQ09ORklHX0VYUE9TVVJFQ09OVFJPTFRZUEU7CiAKIAotLyoqIAotICogRGVmaW5lcyBzZW5zb3Igc3VwcG9ydGVkIG1vZGUuIAorLyoqCisgKiBEZWZpbmVzIHNlbnNvciBzdXBwb3J0ZWQgbW9kZS4KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgbkZyYW1lUmF0ZSA6IFNpbmdsZSBzaG90IG1vZGUgaXMgaW5kaWNhdGVkIGJ5IGEgMCAgICAgCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkZyYW1lUmF0ZSA6IFNpbmdsZSBzaG90IG1vZGUgaXMgaW5kaWNhdGVkIGJ5IGEgMAogICogIGJPbmVTaG90ICAgOiBFbmFibGUgZm9yIHNpbmdsZSBzaG90LCBkaXNhYmxlIGZvciBzdHJlYW1pbmcKLSAqICBzRnJhbWVTaXplIDogRnJhbWVzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgc0ZyYW1lU2l6ZSA6IEZyYW1lc2l6ZQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC01NTUsMTMgKzU2NCwxMyBAQAogfSBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEU7CiAKIAotLyoqIAotICogRGVmaW5lcyBjb250cmFzdCBsZXZlbCAKKy8qKgorICogRGVmaW5lcyBjb250cmFzdCBsZXZlbAogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgIAorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIG5Db250cmFzdCAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgY29udHJhc3QgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFIHsKQEAgLTU3MiwxNCArNTgxLDE0IEBACiB9IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFOwogCiAKLS8qKiAKLSAqIERlZmluZXMgYnJpZ2h0bmVzcyBsZXZlbCAKKy8qKgorICogRGVmaW5lcyBicmlnaHRuZXNzIGxldmVsCiAgKgogICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgCi0gKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgbkJyaWdodG5lc3MgOiAwLTEwMCUgICAgICAgIAorICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5CcmlnaHRuZXNzIDogMC0xMDAlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgewogICAgIE9NWF9VMzIgblNpemU7CkBAIC01ODksMTYgKzU5OCwxNiBAQAogfSBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFOwogCiAKLS8qKiAKLSAqIERlZmluZXMgYmFja2xpZ2h0IGxldmVsIGNvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gc2luaywgZS5nLiBMQ0QgcGFuZWwgCisvKioKKyAqIERlZmluZXMgYmFja2xpZ2h0IGxldmVsIGNvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gc2luaywgZS5nLiBMQ0QgcGFuZWwKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBuQmFja2xpZ2h0IDogVmFsdWVzIGFsbG93ZWQgZm9yIGJhY2tsaWdodCAwLTEwMCUKLSAqICBuVGltZW91dCAgIDogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYmFja2xpZ2h0IGF1dG9tYXRpY2FsbHkgdHVybnMgCi0gKiAgICAgICAgICAgICAgIG9mZi4gIEEgdmFsdWUgb2YgMHgwIGRpc2FibGVzIGJhY2tpZ2h0IHRpbWVvdXQgCisgKiAgblRpbWVvdXQgICA6IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGJhY2tsaWdodCBhdXRvbWF0aWNhbGx5IHR1cm5zCisgKiAgICAgICAgICAgICAgIG9mZi4gIEEgdmFsdWUgb2YgMHgwIGRpc2FibGVzIGJhY2tpZ2h0IHRpbWVvdXQKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CQUNLTElHSFRUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwpAQCAtNjA5LDEyICs2MTgsMTIgQEAKIH0gT01YX0NPTkZJR19CQUNLTElHSFRUWVBFOwogCiAKLS8qKiAKLSAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEgCisvKioKKyAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBuR2FtbWEgICAgIDogVmFsdWVzIGFsbG93ZWQgZm9yIGdhbW1hIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIGNoYW5nZQogICovCkBAIC02MjYsMTQgKzYzNSwxNCBAQAogfSBPTVhfQ09ORklHX0dBTU1BVFlQRTsKIAogCi0vKiogCi0gKiBEZWZpbmUgZm9yIHNldHRpbmcgc2F0dXJhdGlvbiAKLSAqIAorLyoqCisgKiBEZWZpbmUgZm9yIHNldHRpbmcgc2F0dXJhdGlvbgorICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TYXR1cmF0aW9uIDogVmFsdWVzIGFsbG93ZWQgZm9yIHNhdHVyYXRpb24gLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgCisgKiAgblNhdHVyYXRpb24gOiBWYWx1ZXMgYWxsb3dlZCBmb3Igc2F0dXJhdGlvbiAtMTAwIHRvIDEwMCwgemVybyBtZWFucwogICogICAgICAgICAgICAgICAgbm8gY2hhbmdlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgewpAQCAtNjQ0LDE0ICs2NTMsMTQgQEAKIH0gT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRTsKIAogCi0vKiogCi0gKiBEZWZpbmUgZm9yIHNldHRpbmcgTGlnaHRuZXNzIAorLyoqCisgKiBEZWZpbmUgZm9yIHNldHRpbmcgTGlnaHRuZXNzCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gCisgKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8KICAqICAgICAgICAgICAgICAgY2hhbmdlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSB7CkBAIC02NjIsMTcgKzY3MSwxNyBAQAogfSBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEU7CiAKIAotLyoqIAotICogUGxhbmUgYmxlbmQgY29uZmlndXJhdGlvbiAKKy8qKgorICogUGxhbmUgYmxlbmQgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgCisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCA6IEluZGV4IG9mIGlucHV0IHBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbGFuZS4KLSAqICBuRGVwdGggICAgIDogRGVwdGggb2YgdGhlIHBsYW5lIGluIHJlbGF0aW9uIHRvIHRoZSBzY3JlZW4uIEhpZ2hlciAKLSAqICAgICAgICAgICAgICAgbnVtYmVyZWQgZGVwdGhzIGFyZSAiYmVoaW5kIiBsb3dlciBudW1iZXIgZGVwdGhzLiAgCisgKiAgbkRlcHRoICAgICA6IERlcHRoIG9mIHRoZSBwbGFuZSBpbiByZWxhdGlvbiB0byB0aGUgc2NyZWVuLiBIaWdoZXIKKyAqICAgICAgICAgICAgICAgbnVtYmVyZWQgZGVwdGhzIGFyZSAiYmVoaW5kIiBsb3dlciBudW1iZXIgZGVwdGhzLgogICogICAgICAgICAgICAgICBUaGlzIG51bWJlciBkZWZhdWx0cyB0byB0aGUgUG9ydCBJbmRleCBudW1iZXIuCi0gKiAgbkFscGhhICAgICA6IFRyYW5zcGFyZW5jeSBibGVuZGluZyBjb21wb25lbnQgZm9yIHRoZSBlbnRpcmUgcGxhbmUuICAKKyAqICBuQWxwaGEgICAgIDogVHJhbnNwYXJlbmN5IGJsZW5kaW5nIGNvbXBvbmVudCBmb3IgdGhlIGVudGlyZSBwbGFuZS4KICAqICAgICAgICAgICAgICAgU2VlIGJsZW5kaW5nIG1vZGVzIGZvciBtb3JlIGRldGFpbC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRSB7CkBAIC02ODQsMTcgKzY5MywxNyBAQAogfSBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFOwogCiAKLS8qKiAKKy8qKgogICogRGVmaW5lIGludGVybGFjZSB0eXBlCiAgKgogICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIAotICogIG5WZXJzaW9uICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblNpemUgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYkVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSAKKyAqICBiRW5hYmxlICAgICAgICAgICAgICAgOiBFbmFibGUgY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBiZWxvdykKLSAqICBuSW50ZXJsZWF2ZVBvcnRJbmRleCAgOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmxlYXZlZCBwbGFuZS4gCisgKiAgbkludGVybGVhdmVQb3J0SW5kZXggIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBvcnQgYXNzb2NpYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVybGVhdmVkIHBsYW5lLgogICogIHBQbGFuYXJQb3J0SW5kZXhlc1s0XSA6IEluZGV4IG9mIGlucHV0IG9yIG91dHB1dCBwbGFuYXIgcG9ydHMuCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRSB7CkBAIC03MDYsOCArNzE1LDggQEAKIH0gT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFOwogCiAKLS8qKiAKLSAqIERlZmluZXMgdGhlIHBpY3R1cmUgZWZmZWN0IHVzZWQgZm9yIGFuIGlucHV0IHBpY3R1cmUgCisvKioKKyAqIERlZmluZXMgdGhlIHBpY3R1cmUgZWZmZWN0IHVzZWQgZm9yIGFuIGlucHV0IHBpY3R1cmUKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSB7CiAgICAgT01YX0VmZmVjdE5vbmUsCkBAIC03MTcsMTggKzcyNiwxOCBAQAogICAgIE9NWF9FZmZlY3REaXNzb2x2ZSwKICAgICBPTVhfRWZmZWN0V2lwZSwKICAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRNaXhPZlR3b1NjZW5lcywKLSAgICBPTVhfRWZmZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9FZmZlY3RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfRWZmZWN0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfRWZmZWN0TWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEU7CiAKIAotLyoqIAotICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHJhbnNpdGlvbiBlZmZlY3QgCisvKioKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHRyYW5zaXRpb24gZWZmZWN0CiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqIGVFZmZlY3QgICAgOiBFZmZlY3QgdG8gZW5hYmxlCiAgKi8KQEAgLTc0MCw0MyArNzQ5LDQzIEBACiB9IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEU7CiAKIAotLyoqIAotICogRGVmaW5lcyBwb3NzaWJsZSBkYXRhIHVuaXQgdHlwZXMgZm9yIGVuY29kZWQgdmlkZW8gZGF0YS4gVGhlIGRhdGEgdW5pdCAKKy8qKgorICogRGVmaW5lcyBwb3NzaWJsZSBkYXRhIHVuaXQgdHlwZXMgZm9yIGVuY29kZWQgdmlkZW8gZGF0YS4gVGhlIGRhdGEgdW5pdAogICogdHlwZXMgYXJlIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IgcGxheWJhY2sgYXMgd2VsbCBhcwotICogZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuIAorICogZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfREFUQVVOSVRUWVBFIHsKICAgICBPTVhfRGF0YVVuaXRDb2RlZFBpY3R1cmUsCiAgICAgT01YX0RhdGFVbml0VmlkZW9TZWdtZW50LAogICAgIE9NWF9EYXRhVW5pdFNldmVyYWxTZWdtZW50cywKICAgICBPTVhfRGF0YVVuaXRBcmJpdHJhcnlTdHJlYW1TZWN0aW9uLAotICAgIE9NWF9EYXRhVW5pdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRGF0YVVuaXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfRGF0YVVuaXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9EYXRhVW5pdE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0RBVEFVTklUVFlQRTsKIAogCi0vKiogCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGVuY2Fwc3VsYXRpb24gdHlwZXMgZm9yIGNvZGVkIHZpZGVvIGRhdGEgdW5pdC4gVGhlIAotICogZW5jYXBzdWxhdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIAotICogcGxheWJhY2sgYXMgd2VsbCBhcyBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4gCisvKioKKyAqIERlZmluZXMgcG9zc2libGUgZW5jYXBzdWxhdGlvbiB0eXBlcyBmb3IgY29kZWQgdmlkZW8gZGF0YSB1bml0LiBUaGUKKyAqIGVuY2Fwc3VsYXRpb24gaW5mb3JtYXRpb24gaXMgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvcgorICogcGxheWJhY2sgYXMgd2VsbCBhcyBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4KICAqLwogdHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIHsKICAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25FbGVtZW50YXJ5U3RyZWFtLAogICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkdlbmVyaWNQYXlsb2FkLAogICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblJ0cFBheWxvYWQsCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRTsKIAogCi0vKiogCi0gKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHR5cGUgb2YgYmVpbmcgZGVjb2RlZC9lbmNvZGVkIAorLyoqCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHR5cGUgb2YgYmVpbmcgZGVjb2RlZC9lbmNvZGVkCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9EQVRBVU5JVFRZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwogICAgIE9NWF9EQVRBVU5JVFRZUEUgZVVuaXRUeXBlOwogICAgIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIGVFbmNhcHN1bGF0aW9uVHlwZTsKQEAgLTc4NCwyNSArNzkzLDI1IEBACiAKIAogLyoqCi0gKiBEZWZpbmVzIGRpdGhlciB0eXBlcyAKKyAqIERlZmluZXMgZGl0aGVyIHR5cGVzCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfRElUSEVSVFlQRSB7CiAgICAgT01YX0RpdGhlck5vbmUsCiAgICAgT01YX0RpdGhlck9yZGVyZWQsCiAgICAgT01YX0RpdGhlckVycm9yRGlmZnVzaW9uLAogICAgIE9NWF9EaXRoZXJPdGhlciwKLSAgICBPTVhfRGl0aGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EaXRoZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfRGl0aGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfRGl0aGVyTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfRElUSEVSVFlQRTsKIAogCi0vKiogCi0gKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgY3VycmVudCB0eXBlIG9mIGRpdGhlcmluZyAKKy8qKgorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHlwZSBvZiBkaXRoZXJpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ESVRIRVJUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KICAgICBPTVhfRElUSEVSVFlQRSBlRGl0aGVyOyAgIC8qKjwgVHlwZSBvZiBkaXRoZXJpbmcgdG8gdXNlICovCiB9IE9NWF9DT05GSUdfRElUSEVSVFlQRTsKQEAgLTgxMSwyOCArODIwLDI4IEBACiAgICAgT01YX1UzMiBuU2l6ZTsKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJDb250aW51b3VzOyAgIC8qKjwgSWYgdHJ1ZSB0aGVuIGlnbm9yZSBmcmFtZSByYXRlIGFuZCBlbWl0IGNhcHR1cmUgCisgICAgT01YX0JPT0wgYkNvbnRpbnVvdXM7ICAgLyoqPCBJZiB0cnVlIHRoZW4gaWdub3JlIGZyYW1lIHJhdGUgYW5kIGVtaXQgY2FwdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGF0YSBhcyBmYXN0IGFzIHBvc3NpYmxlIChvdGhlcndpc2Ugb2JleSBwb3J0J3MgZnJhbWUgcmF0ZSkuICovCi0gICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMgKG90aGVyd2lzZSB0aGUgcG9ydCBkb2VzIG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSB1bnRpbCBpbnN0cnVjdGVkIHRvIGRvIHNvIGJ5IHRoZSBjbGllbnQpLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IgCisgICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcyAob3RoZXJ3aXNlIHRoZSBwb3J0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgdW50aWwgaW5zdHJ1Y3RlZCB0byBkbyBzbyBieSB0aGUgY2xpZW50KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC4gKi8KICAgICBPTVhfVTMyIG5GcmFtZUxpbWl0OyAgICAgIC8qKjwgTGltaXQgb24gbnVtYmVyIG9mIGZyYW1lcyBlbWl0dGVkIGR1cmluZyBhIGNhcHR1cmUgKG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsaWQgaWYgYkZyYW1lTGltaXRlZCBpcyBzZXQpLiAqLwogfSBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRTsKIAogdHlwZWRlZiBlbnVtIE9NWF9NRVRFUklOR1RZUEUgewotIAorCiAgICAgT01YX01ldGVyaW5nTW9kZUF2ZXJhZ2UsICAgICAvKio8IENlbnRlci13ZWlnaHRlZCBhdmVyYWdlIG1ldGVyaW5nLiAqLwogICAgIE9NWF9NZXRlcmluZ01vZGVTcG90LCAgCSAgICAgIC8qKjwgU3BvdCAocGFydGlhbCkgbWV0ZXJpbmcuICovCiAgICAgT01YX01ldGVyaW5nTW9kZU1hdHJpeCwgICAgICAvKio8IE1hdHJpeCBvciBldmFsdWF0aXZlIG1ldGVyaW5nLiAqLwotIAotICAgIE9NWF9NZXRlcmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKworICAgIE9NWF9NZXRlcmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9NZXRlcmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0VWTW9kZU1heCA9IDB4N2ZmZmZmZmYKIH0gT01YX01FVEVSSU5HVFlQRTsKLSAKKwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CkBAIC04NDEsMTQgKzg1MCwxNCBAQAogICAgIE9NWF9TMzIgeEVWQ29tcGVuc2F0aW9uOyAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLwogICAgIE9NWF9VMzIgbkFwZXJ0dXJlRk51bWJlcjsgICAgIC8qKjwgZS5nLiBuQXBlcnR1cmVGTnVtYmVyID0gMiBpbXBsaWVzICJmLzIiIC0gUTE2IGZvcm1hdCAqLwogICAgIE9NWF9CT09MIGJBdXRvQXBlcnR1cmU7CQkvKio8IFdoZXRoZXIgYXBlcnR1cmUgbnVtYmVyIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLwotICAgIE9NWF9VMzIgblNodXR0ZXJTcGVlZE1zZWM7ICAgIC8qKjwgU2h1dHRlcnNwZWVkIGluIG1pbGxpc2Vjb25kcyAqLyAKLSAgICBPTVhfQk9PTCBiQXV0b1NodXR0ZXJTcGVlZDsJLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovIAorICAgIE9NWF9VMzIgblNodXR0ZXJTcGVlZE1zZWM7ICAgIC8qKjwgU2h1dHRlcnNwZWVkIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CT09MIGJBdXRvU2h1dHRlclNwZWVkOwkvKio8IFdoZXRoZXIgc2h1dHRlciBzcGVlZCBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KICAgICBPTVhfVTMyIG5TZW5zaXRpdml0eTsgICAgICAgICAvKio8IGUuZy4gblNlbnNpdGl2aXR5ID0gMTAwIGltcGxpZXMgIklTTyAxMDAiICovCiAgICAgT01YX0JPT0wgYkF1dG9TZW5zaXRpdml0eTsJLyoqPCBXaGV0aGVyIHNlbnNpdGl2aXR5IGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLwogfSBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFOwogCi0vKiogCi0gKiBGb2N1cyByZWdpb24gY29uZmlndXJhdGlvbiAKKy8qKgorICogRm9jdXMgcmVnaW9uIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKQEAgLTg3OSw4ICs4ODgsOCBAQAogICAgIE9NWF9CT09MIGJCb3R0b21SaWdodDsKIH0gT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEU7CiAKLS8qKiAKLSAqIEZvY3VzIFN0YXR1cyB0eXBlIAorLyoqCisgKiBGb2N1cyBTdGF0dXMgdHlwZQogICovCiB0eXBlZGVmIGVudW0gT01YX0ZPQ1VTU1RBVFVTVFlQRSB7CiAgICAgT01YX0ZvY3VzU3RhdHVzT2ZmID0gMCwKQEAgLTg4OCwxMyArODk3LDEzIEBACiAgICAgT01YX0ZvY3VzU3RhdHVzUmVhY2hlZCwKICAgICBPTVhfRm9jdXNTdGF0dXNVbmFibGVUb1JlYWNoLAogICAgIE9NWF9Gb2N1c1N0YXR1c0xvc3QsCi0gICAgT01YX0ZvY3VzU3RhdHVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Gb2N1c1N0YXR1c0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9Gb2N1c1N0YXR1c1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0ZvY3VzU3RhdHVzTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfRk9DVVNTVEFUVVNUWVBFOwogCi0vKiogCi0gKiBGb2N1cyBzdGF0dXMgY29uZmlndXJhdGlvbiAKKy8qKgorICogRm9jdXMgc3RhdHVzIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1ZpZGVvLmgKaW5kZXggMjczOGJkYy4uNGY4NDg1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaApAQCAtODUsNiArODUsNyBAQAogICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCiAgICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCiAgICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nVlBYLCAgICAgICAgLyoqPCBHb29nbGUgVlBYLCBmb3JtZXJseSBrbm93biBhcyBPbjIgVlA4ICovCiAgICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKICAgICBPTVhfVklERU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmggYi9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaAppbmRleCBmZGYzMjdlLi5hOGRkNjRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaApAQCAtMjEsMTI2ICsyMSwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLQogLyogb2J0YWluIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBmcm9tIHRoZSBrZXJuZWwgaGVhZGVyICovCiAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5kZXIuaD4KIAotI2Vsc2UKLQotLyogU29tZSBwYXJ0cyBvZiB0aGUgc2ltdWxhdG9yIG5lZWQgZmFrZSB2ZXJzaW9ucyBvZiB0aGlzIAotICogc3R1ZmYgaW4gb3JkZXIgdG8gY29tcGlsZS4gIFJlYWxseSB0aGlzIHNob3VsZCBnbyBhd2F5Ci0gKiBlbnRpcmVseS4uLgotICovCi0KLSNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3Ci0KLSNkZWZpbmUgQklOREVSX1RZUEVfQklOREVSIDEKLSNkZWZpbmUgQklOREVSX1RZUEVfV0VBS19CSU5ERVIgMgotI2RlZmluZSBCSU5ERVJfVFlQRV9IQU5ETEUgMwotI2RlZmluZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRSA0Ci0jZGVmaW5lIEJJTkRFUl9UWVBFX0ZEIDUKLQotc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7Ci0gICAgdW5zaWduZWQgbG9uZyB0eXBlOwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgdW5pb24gewotICAgICAgICB2b2lkICpiaW5kZXI7Ci0gICAgICAgIHNpZ25lZCBsb25nIGhhbmRsZTsKLSAgICB9OwotICAgIHZvaWQgKmNvb2tpZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7Ci0gICAgc2lnbmVkIGxvbmcgd3JpdGVfc2l6ZTsKLSAgICBzaWduZWQgbG9uZyB3cml0ZV9jb25zdW1lZDsKLSAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2J1ZmZlcjsKLSAgICBzaWduZWQgbG9uZyByZWFkX3NpemU7Ci0gICAgc2lnbmVkIGxvbmcgcmVhZF9jb25zdW1lZDsKLSAgICB1bnNpZ25lZCBsb25nIHJlYWRfYnVmZmVyOwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHNpemVfdCBoYW5kbGU7Ci0gICAgICAgIHZvaWQgKnB0cjsKLSAgICB9IHRhcmdldDsKLSAgICB2b2lkICpjb29raWU7Ci0gICAgdW5zaWduZWQgaW50IGNvZGU7Ci0gICAgCi0gICAgdW5zaWduZWQgaW50IGZsYWdzOwotICAgIHBpZF90IHNlbmRlcl9waWQ7Ci0gICAgdWlkX3Qgc2VuZGVyX2V1aWQ7Ci0gICAgc2l6ZV90IGRhdGFfc2l6ZTsKLSAgICBzaXplX3Qgb2Zmc2V0c19zaXplOwotICAgIAotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlcjsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKm9mZnNldHM7Ci0gICAgICAgIH0gcHRyOwotICAgICAgICB1aW50OF90IGJ1Zls4XTsKLSAgICB9IGRhdGE7Ci19OwotCi1lbnVtIHRyYW5zYWN0aW9uX2ZsYWdzIHsKLSAgICBURl9PTkVfV0FZID0gMHgwMSwKLSAgICBURl9ST09UX09CSkVDVCA9IDB4MDQsCi0gICAgVEZfU1RBVFVTX0NPREUgPSAweDA4LAotICAgIFRGX0FDQ0VQVF9GRFMgPSAweDEwLAotfTsKLQotCi1lbnVtIHsKLSAgICBGTEFUX0JJTkRFUl9GTEFHX1BSSU9SSVRZX01BU0sgPSAweGZmLAotICAgIEZMQVRfQklOREVSX0ZMQUdfQUNDRVBUU19GRFMgPSAweDEwMCwKLX07Ci0KLWVudW0gQmluZGVyRHJpdmVyUmV0dXJuUHJvdG9jb2wgewotICAgIEJSX0VSUk9SLAotICAgIEJSX09LLAotICAgIEJSX1RSQU5TQUNUSU9OLAotICAgIEJSX1JFUExZLAotICAgIEJSX0FDUVVJUkVfUkVTVUxULAotICAgIEJSX0RFQURfUkVQTFksCi0gICAgQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUsCi0gICAgQlJfSU5DUkVGUywKLSAgICBCUl9BQ1FVSVJFLAotICAgIEJSX1JFTEVBU0UsCi0gICAgQlJfREVDUkVGUywKLSAgICBCUl9BVFRFTVBUX0FDUVVJUkUsCi0gICAgQlJfTk9PUCwKLSAgICBCUl9TUEFXTl9MT09QRVIsCi0gICAgQlJfRklOSVNIRUQsCi0gICAgQlJfREVBRF9CSU5ERVIsCi0gICAgQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUsCi0gICAgQlJfRkFJTEVEX1JFUExZLAotfTsKLQotZW51bSBCaW5kZXJEcml2ZXJDb21tYW5kUHJvdG9jb2wgewotICAgIEJDX1RSQU5TQUNUSU9OLAotICAgIEJDX1JFUExZLAotICAgIEJDX0FDUVVJUkVfUkVTVUxULAotICAgIEJDX0ZSRUVfQlVGRkVSLAotICAgIEJDX0lOQ1JFRlMsCi0gICAgQkNfQUNRVUlSRSwKLSAgICBCQ19SRUxFQVNFLAotICAgIEJDX0RFQ1JFRlMsCi0gICAgQkNfSU5DUkVGU19ET05FLAotICAgIEJDX0FDUVVJUkVfRE9ORSwKLSAgICBCQ19BVFRFTVBUX0FDUVVJUkUsCi0gICAgQkNfUkVHSVNURVJfTE9PUEVSLAotICAgIEJDX0VOVEVSX0xPT1BFUiwKLSAgICBCQ19FWElUX0xPT1BFUiwKLSAgICBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiwKLSAgICBCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04sCi0gICAgQkNfREVBRF9CSU5ERVJfRE9ORSwKLX07Ci0KLSNlbmRpZgotCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCA0NjEwMTM1Li4yMGFiZDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jZGVmaW5lIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQgKEFORFJPSURfUFJJT1JJVFlfQVVESU8pCiAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIgdGhyZWFkCiAjZGVmaW5lIE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMgIDMwMDAgICAgLy8gTG9uZ2VyIHRpbWVvdXQgcGVyaW9kIGF0IHN0YXJ0dXAgdG8gY29wZSB3aXRoIEEyRFAgaW5pdCB0aW1lCiAjZGVmaW5lIE1BWF9SVU5fVElNRU9VVF9NUyAgICAgIDEwMDAKQEAgLTgyLDE1ICs4MSwxNSBAQAogICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlcgogCiAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgZnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBmbGFnczsKLQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIHBhZDE7CiAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgYnVmZmVyVGltZW91dE1zOyAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IGJlZm9yZSByZXN0YXJ0aW5nIGF1ZGlvZmxpbmdlcgotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHdhaXRUaW1lTXM7ICAgICAgLy8gQ3VtdWxhdGVkIHdhaXQgdGltZQogCisgICAgICAgICAgICAgICAgdWludDE2X3QgICAgd2FpdFRpbWVNczsgICAgICAvLyBDdW11bGF0ZWQgd2FpdCB0aW1lCiAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgc2VuZExldmVsOwotICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHJlc2VydmVkOworICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgIGZsYWdzOworCiAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeSAoMzIgYnl0ZXMpCisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QoKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzdGVwVXNlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGVwU2VydmVyKHVpbnQzMl90IGZyYW1lQ291bnQpOwpAQCAtOTgsNiArOTcsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lc0F2YWlsYWJsZV9sKCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgZnJhbWVzUmVhZHkoKTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICB0cnlMb2NrKCk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmggYi9pbmNsdWRlL3ByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oCmluZGV4IGM3ZGI5YTYuLjZiMWZhNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaApAQCAtMjYsMTQgKzI2LDExIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY29weWJpdC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CiAKLXN0cnVjdCBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdDsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAKQEAgLTYwNCwxNCArNjAxLDYgQEAKICAgICB2b2lkICgqcmVuZGVyVHJpYW5nbGUpKEdMLCB2ZXJ0ZXhfdCosIHZlcnRleF90KiwgdmVydGV4X3QqKTsKIH07CiAKLXN0cnVjdCBjb3B5Yml0c19jb250ZXh0X3QgewotICAgIC8vIEEgaGFuZGxlIHRvIHRoZSBibGl0IGVuZ2luZSwgaWYgaXQgZXhpc3RzLCBlbHNlIE5VTEwuCi0gICAgY29weWJpdF9kZXZpY2VfdCogICAgICAgYmxpdEVuZ2luZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtaW5TY2FsZTsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtYXhTY2FsZTsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogZHJhd1N1cmZhY2VCdWZmZXI7Ci19OwotCiBzdHJ1Y3Qgb2dsZXNfY29udGV4dF90IHsKICAgICBjb250ZXh0X3QgICAgICAgICAgICAgICByYXN0ZXJpemVyOwogICAgIGFycmF5X21hY2hpbmVfdCAgICAgICAgIGFycmF5cyAgICAgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CkBAIC02MzYsMTMgKzYyNSw2IEBACiAgICAgRUdMU3VyZmFjZU1hbmFnZXIqICAgICAgc3VyZmFjZU1hbmFnZXI7CiAgICAgRUdMQnVmZmVyT2JqZWN0TWFuYWdlciogYnVmZmVyT2JqZWN0TWFuYWdlcjsKIAotICAgIC8vIGNvcHliaXRzIGlzIG9ubHkgdXNlZCBpZiBMSUJBR0xfVVNFX0dSQUxMT0NfQ09QWUJJVFMgaXMKLSAgICAvLyBkZWZpbmVkLCBidXQgaXQgaXMgYWx3YXlzIHByZXNlbnQgYmVjYXVzZSBvZ2xlc19jb250ZXh0X3QgaXMgYSBwdWJsaWMKLSAgICAvLyBzdHJ1Y3QgdGhhdCBpcyB1c2VkIGJ5IGNsaWVudHMgb2YgbGliYWdsLiBXZSB3YW50IHRoZSBzaXplIGFuZCBvZmZzZXRzCi0gICAgLy8gdG8gc3RheSB0aGUgc2FtZSwgd2hldGhlciBvciBub3QgTElCQUdMX1VTRV9HUkFMTE9DX0NPUFlCSVRTIGlzIGRlZmluZWQuCi0KLSAgICBjb3B5Yml0c19jb250ZXh0X3QgICAgICBjb3B5Yml0czsKLQogICAgIEdMZW51bSAgICAgICAgICAgICAgICAgIGVycm9yOwogCiAgICAgc3RhdGljIGlubGluZSBvZ2xlc19jb250ZXh0X3QqIGdldCgpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9MYXllclN0YXRlLmggYi9pbmNsdWRlL3ByaXZhdGUvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTdGF0ZS5oCmluZGV4IGQ3ZmU1NzIuLmQyZmVkNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9MYXllclN0YXRlLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL0xheWVyU3RhdGUuaApAQCAtMjksNiArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBQYXJjZWw7CitjbGFzcyBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogCiBzdHJ1Y3QgbGF5ZXJfc3RhdGVfdCB7CiAKQEAgLTY4LDYgKzY5LDEzIEBACiAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgdHJhbnNwYXJlbnRSZWdpb247CiB9OwogCitzdHJ1Y3QgQ29tcG9zZXJTdGF0ZSB7CisgICAgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gY2xpZW50OworICAgIGxheWVyX3N0YXRlX3Qgc3RhdGU7CisgICAgc3RhdHVzX3QgICAgd3JpdGUoUGFyY2VsJiBvdXRwdXQpIGNvbnN0OworICAgIHN0YXR1c190ICAgIHJlYWQoY29uc3QgUGFyY2VsJiBpbnB1dCk7Cit9OworCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9TRl9MQVlFUl9TVEFURV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaCBiL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oCmluZGV4IDcxN2Y4MzcuLjBkYTAzZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oCkBAIC0yMCwzNTUgKzIwLDEyIEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLQogI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHVpL1JlY3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8qCi0gKiBUaGVzZSBjbGFzc2VzIG1hbmFnZSBhIHN0YWNrIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4KLSAqIAotICogU2hhcmVkQ2xpZW50OiByZXByZXNlbnRzIGEgY2xpZW50IHdpdGggc2V2ZXJhbCBzdGFja3MKLSAqIFNoYXJlZEJ1ZmZlclN0YWNrOiByZXByZXNlbnRzIGEgc3RhY2sgb2YgYnVmZmVycwotICogU2hhcmVkQnVmZmVyQ2xpZW50OiBtYW5pcHVsYXRlcyB0aGUgU2hhcmVkQnVmZmVyU3RhY2sgZnJvbSB0aGUgY2xpZW50IHNpZGUgCi0gKiBTaGFyZWRCdWZmZXJTZXJ2ZXI6IG1hbmlwdWxhdGVzIHRoZSBTaGFyZWRCdWZmZXJTdGFjayBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSAKLSAqCi0gKiBCdWZmZXJzIGNhbiBiZSBkZXF1ZXVlZCB1bnRpbCB0aGVyZSBhcmUgbm9uZSBhdmFpbGFibGUsIHRoZXkgY2FuIGJlIGxvY2tlZAotICogdW5sZXNzIHRoZXkgYXJlIGluIHVzZSBieSB0aGUgc2VydmVyLCB3aGljaCBpcyBvbmx5IHRoZSBjYXNlIGZvciB0aGUgbGFzdCAKLSAqIGRlcXVldWUtYWJsZSBidWZmZXIuIFdoZW4gdGhlc2UgdmFyaW91cyBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgY2FsbGVyCi0gKiB3YWl0cyB1bnRpbCB0aGUgY29uZGl0aW9uIGlzIG1ldC4KLSAqIAotICovCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVnaW9uOwotY2xhc3MgU2hhcmVkQnVmZmVyU3RhY2s7Ci1jbGFzcyBTaGFyZWRDbGllbnQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2hhcmVkQnVmZmVyU3RhY2sKLXsKLSAgICBmcmllbmQgY2xhc3MgU2hhcmVkQ2xpZW50OwotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlcjsKLQotcHVibGljOgotICAgIC8vIFdoZW4gY2hhbmdpbmcgdGhlc2UgdmFsdWVzLCB0aGUgQ09NUElMRV9USU1FX0FTU0VSVCBhdCB0aGUgZW5kIG9mIHRoaXMKLSAgICAvLyBmaWxlIG5lZWQgdG8gYmUgdXBkYXRlZC4KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9MQVlFUlNfTUFYICA9IDMxOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0JVRkZFUl9NQVggID0gMzI7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fQlVGRkVSX01JTiAgPSAyOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0RJU1BMQVlfTUFYID0gNDsKLQotICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsgLy8gNCBsb25ncwotICAgICAgICB0eXBlZGVmIGludDMyX3QgdXNlY3NfdDsKLSAgICAgICAgdXNlY3NfdCAgdG90YWxUaW1lOwotICAgICAgICB1c2Vjc190ICByZXNlcnZlZFszXTsKLSAgICB9OwotCi0gICAgc3RydWN0IFNtYWxsUmVjdCB7Ci0gICAgICAgIHVpbnQxNl90IGwsIHQsIHIsIGI7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBGbGF0UmVnaW9uIHsgLy8gNTIgYnl0ZXMgPSA0ICogKDEgKyAyKk4pCi0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX1JFQ1RfTUFYID0gNTsKLSAgICAgICAgdWludDMyX3QgICAgY291bnQ7Ci0gICAgICAgIFNtYWxsUmVjdCAgIHJlY3RzW05VTV9SRUNUX01BWF07Ci0gICAgfTsKLSAgICAKLSAgICBzdHJ1Y3QgQnVmZmVyRGF0YSB7Ci0gICAgICAgIEZsYXRSZWdpb24gZGlydHlSZWdpb247Ci0gICAgICAgIFNtYWxsUmVjdCAgY3JvcDsKLSAgICAgICAgdWludDhfdCB0cmFuc2Zvcm07Ci0gICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107Ci0gICAgfTsKLSAgICAKLSAgICBTaGFyZWRCdWZmZXJTdGFjaygpOwotICAgIHZvaWQgaW5pdChpbnQzMl90IGlkZW50aXR5KTsKLSAgICBzdGF0dXNfdCBzZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyLCBjb25zdCBSZWdpb24mIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q3JvcChpbnQgYnVmZmVyLCBjb25zdCBSZWN0JiByZWcpOwotICAgIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgYnVmZmVyLCB1aW50OF90IHRyYW5zZm9ybSk7Ci0gICAgUmVnaW9uIGdldERpcnR5UmVnaW9uKGludCBidWZmZXIpIGNvbnN0OwotICAgIFJlY3QgZ2V0Q3JvcChpbnQgYnVmZmVyKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRUcmFuc2Zvcm0oaW50IGJ1ZmZlcikgY29uc3Q7Ci0KLSAgICAvLyB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBwYXJ0IG9mIHRoZSBjb25kaXRpb25zL3VwZGF0ZXMKLSAgICB2b2xhdGlsZSBpbnQzMl90IGhlYWQ7ICAgICAgLy8gc2VydmVyJ3MgY3VycmVudCBmcm9udCBidWZmZXIKLSAgICB2b2xhdGlsZSBpbnQzMl90IGF2YWlsYWJsZTsgLy8gbnVtYmVyIG9mIGRlcXVldWUtYWJsZSBidWZmZXJzCi0gICAgdm9sYXRpbGUgaW50MzJfdCBxdWV1ZWQ7ICAgIC8vIG51bWJlciBvZiBidWZmZXJzIHdhaXRpbmcgZm9yIHBvc3QKLSAgICB2b2xhdGlsZSBpbnQzMl90IHJlc2VydmVkMTsKLSAgICB2b2xhdGlsZSBzdGF0dXNfdCBzdGF0dXM7ICAgLy8gc3VyZmFjZSdzIHN0YXR1cyBjb2RlCi0KLSAgICAvLyBub3QgcGFydCBvZiB0aGUgY29uZGl0aW9ucwotICAgIHZvbGF0aWxlIGludDMyX3QgcmVhbGxvY01hc2s7Ci0gICAgdm9sYXRpbGUgaW50OF90IGluZGV4W05VTV9CVUZGRVJfTUFYXTsKLQotICAgIGludDMyX3QgICAgIGlkZW50aXR5OyAgICAgICAvLyBzdXJmYWNlJ3MgaWRlbnRpdHkgKGNvbnN0KQotICAgIGludDMyX3QgICAgIHRva2VuOyAgICAgICAgICAvLyBzdXJmYWNlJ3MgdG9rZW4gKGZvciBkZWJ1Z2dpbmcpCi0gICAgU3RhdGlzdGljcyAgc3RhdHM7Ci0gICAgaW50OF90ICAgICAgaGVhZEJ1ZjsgICAgICAgIC8vIGxhc3QgcmV0aXJlZCBidWZmZXIKLSAgICB1aW50OF90ICAgICByZXNlcnZlZEJ5dGVzWzNdOwotICAgIGludDMyX3QgICAgIHJlc2VydmVkOwotICAgIEJ1ZmZlckRhdGEgIGJ1ZmZlcnNbTlVNX0JVRkZFUl9NQVhdOyAgICAgLy8gMTAyNCBieXRlcwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyA2NCBLQiBtYXgKLWNsYXNzIFNoYXJlZENsaWVudAotewotcHVibGljOgotICAgIFNoYXJlZENsaWVudCgpOwotICAgIH5TaGFyZWRDbGllbnQoKTsKLSAgICBzdGF0dXNfdCB2YWxpZGF0ZShzaXplX3QgdG9rZW4pIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlOwotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlcjsKLQotICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIGxvY2stbGVzcyBwcmltaXRpdmUKLSAgICBNdXRleCBsb2NrOwotICAgIENvbmRpdGlvbiBjdjsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayBzdXJmYWNlc1sgU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9MQVlFUlNfTUFYIF07Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNsYXNzIFNoYXJlZEJ1ZmZlckJhc2UKLXsKLXB1YmxpYzoKLSAgICBTaGFyZWRCdWZmZXJCYXNlKFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LCBpbnQgc3VyZmFjZSwKLSAgICAgICAgICAgIGludDMyX3QgaWRlbnRpdHkpOwotICAgIH5TaGFyZWRCdWZmZXJCYXNlKCk7Ci0gICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBnZXRJZGVudGl0eSgpIGNvbnN0OwotICAgIFN0cmluZzggZHVtcChjaGFyIGNvbnN0KiBwcmVmaXgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgU2hhcmVkQ2xpZW50KiBjb25zdCBtU2hhcmVkQ2xpZW50OwotICAgIFNoYXJlZEJ1ZmZlclN0YWNrKiBjb25zdCBtU2hhcmVkU3RhY2s7Ci0gICAgY29uc3QgaW50IG1JZGVudGl0eTsKLQotICAgIGZyaWVuZCBzdHJ1Y3QgVXBkYXRlOwotICAgIGZyaWVuZCBzdHJ1Y3QgUXVldWVVcGRhdGU7Ci0KLSAgICBzdHJ1Y3QgQ29uZGl0aW9uQmFzZSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjazsKLSAgICAgICAgaW5saW5lIENvbmRpdGlvbkJhc2UoU2hhcmVkQnVmZmVyQmFzZSogc2JjKSAKLSAgICAgICAgICAgIDogc3RhY2soKnNiYy0+bVNoYXJlZFN0YWNrKSB7IH0KLSAgICAgICAgdmlydHVhbCB+Q29uZGl0aW9uQmFzZSgpIHsgfTsKLSAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yKCkoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0ID0gMDsKLSAgICB9OwotICAgIHN0YXR1c190IHdhaXRGb3JDb25kaXRpb24oY29uc3QgQ29uZGl0aW9uQmFzZSYgY29uZGl0aW9uKTsKLQotICAgIHN0cnVjdCBVcGRhdGVCYXNlIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrOwotICAgICAgICBpbmxpbmUgVXBkYXRlQmFzZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpIAotICAgICAgICAgICAgOiBzdGFjaygqc2JiLT5tU2hhcmVkU3RhY2spIHsgfQotICAgIH07Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgdXBkYXRlQ29uZGl0aW9uKFQgdXBkYXRlKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdHVzX3QgU2hhcmVkQnVmZmVyQmFzZTo6dXBkYXRlQ29uZGl0aW9uKFQgdXBkYXRlKSB7Ci0gICAgU2hhcmVkQ2xpZW50JiBjbGllbnQoICptU2hhcmVkQ2xpZW50ICk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGNsaWVudC5sb2NrKTsKLSAgICBzc2l6ZV90IHJlc3VsdCA9IHVwZGF0ZSgpOwotICAgIGNsaWVudC5jdi5icm9hZGNhc3QoKTsgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQgOiBwdWJsaWMgU2hhcmVkQnVmZmVyQmFzZQotewotcHVibGljOgotICAgIFNoYXJlZEJ1ZmZlckNsaWVudChTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsIGludCBudW0sCi0gICAgICAgICAgICBpbnQzMl90IGlkZW50aXR5KTsKLQotICAgIHNzaXplX3QgZGVxdWV1ZSgpOwotICAgIHN0YXR1c190IHVuZG9EZXF1ZXVlKGludCBidWYpOwotICAgIAotICAgIHN0YXR1c190IGxvY2soaW50IGJ1Zik7Ci0gICAgc3RhdHVzX3QgY2FuY2VsKGludCBidWYpOwotICAgIHN0YXR1c190IHF1ZXVlKGludCBidWYpOwotICAgIGJvb2wgbmVlZE5ld0J1ZmZlcihpbnQgYnVmZmVyKSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyLCBjb25zdCBSZWdpb24mIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q3JvcChpbnQgYnVmZmVyLCBjb25zdCBSZWN0JiByZWcpOwotICAgIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgYnVmZmVyLCB1aW50MzJfdCB0cmFuc2Zvcm0pOwotCi0gICAgY2xhc3MgU2V0QnVmZmVyQ291bnRDYWxsYmFjayB7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQ7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlcmF0b3IoKShpbnQgYnVmZmVyQ291bnQpIGNvbnN0ID0gMDsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflNldEJ1ZmZlckNvdW50Q2FsbGJhY2soKSB7IH0KLSAgICB9OwotICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCwgY29uc3QgU2V0QnVmZmVyQ291bnRDYWxsYmFjayYgaXBjKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IENvbmRpdGlvbjsKLSAgICBmcmllbmQgc3RydWN0IERlcXVldWVDb25kaXRpb247Ci0gICAgZnJpZW5kIHN0cnVjdCBMb2NrQ29uZGl0aW9uOwotCi0gICAgc3RydWN0IFF1ZXVlVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewotICAgICAgICBpbmxpbmUgUXVldWVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiKTsKLSAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRGVxdWV1ZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKLSAgICAgICAgaW5saW5lIERlcXVldWVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiKTsKLSAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQ2FuY2VsVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewotICAgICAgICBpbnQgdGFpbCwgYnVmOwotICAgICAgICBpbmxpbmUgQ2FuY2VsVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgaW50IHRhaWwsIGludCBidWYpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIC8vIC0tCi0KLSAgICBzdHJ1Y3QgRGVxdWV1ZUNvbmRpdGlvbiA6IHB1YmxpYyBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgaW5saW5lIERlcXVldWVDb25kaXRpb24oU2hhcmVkQnVmZmVyQ2xpZW50KiBzYmMpOwotICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKCkgY29uc3Q7Ci0gICAgICAgIGlubGluZSBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gIkRlcXVldWVDb25kaXRpb24iOyB9Ci0gICAgfTsKLQotICAgIHN0cnVjdCBMb2NrQ29uZGl0aW9uIDogcHVibGljIENvbmRpdGlvbkJhc2UgewotICAgICAgICBpbnQgYnVmOwotICAgICAgICBpbmxpbmUgTG9ja0NvbmRpdGlvbihTaGFyZWRCdWZmZXJDbGllbnQqIHNiYywgaW50IGJ1Zik7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiTG9ja0NvbmRpdGlvbiI7IH0KLSAgICB9OwotCi0gICAgaW50MzJfdCBjb21wdXRlVGFpbCgpIGNvbnN0OwotCi0gICAgbXV0YWJsZSBSV0xvY2sgbUxvY2s7Ci0gICAgaW50IG1OdW1CdWZmZXJzOwotCi0gICAgaW50MzJfdCB0YWlsOwotICAgIGludDMyX3QgcXVldWVkX2hlYWQ7Ci0gICAgLy8gc3RhdGlzdGljcy4uLgotICAgIG5zZWNzX3QgbURlcXVldWVUaW1lW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWF07Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlcgotICAgIDogcHVibGljIFNoYXJlZEJ1ZmZlckJhc2UsCi0gICAgICBwdWJsaWMgTGlnaHRSZWZCYXNlPFNoYXJlZEJ1ZmZlclNlcnZlcj4KLXsKLXB1YmxpYzoKLSAgICBTaGFyZWRCdWZmZXJTZXJ2ZXIoU2hhcmVkQ2xpZW50KiBzaGFyZWRDbGllbnQsIGludCBzdXJmYWNlLCBpbnQgbnVtLAotICAgICAgICAgICAgaW50MzJfdCBpZGVudGl0eSk7Ci0KLSAgICBzc2l6ZV90IHJldGlyZUFuZExvY2soKTsKLSAgICB2b2lkIHNldFN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpOwotICAgIHN0YXR1c190IHJlYWxsb2NhdGVBbGwoKTsKLSAgICBzdGF0dXNfdCByZWFsbG9jYXRlQWxsRXhjZXB0KGludCBidWZmZXIpOwotICAgIGludDMyX3QgZ2V0UXVldWVkQ291bnQoKSBjb25zdDsKLSAgICBSZWdpb24gZ2V0RGlydHlSZWdpb24oaW50IGJ1ZmZlcikgY29uc3Q7Ci0gICAgUmVjdCBnZXRDcm9wKGludCBidWZmZXIpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldFRyYW5zZm9ybShpbnQgYnVmZmVyKSBjb25zdDsKLQotICAgIHN0YXR1c190IHJlc2l6ZShpbnQgbmV3TnVtQnVmZmVycyk7Ci0gICAgc3RhdHVzX3QgZ3JvdyhpbnQgbmV3TnVtQnVmZmVycyk7Ci0gICAgc3RhdHVzX3Qgc2hyaW5rKGludCBuZXdOdW1CdWZmZXJzKTsKLQotICAgIFNoYXJlZEJ1ZmZlclN0YWNrOjpTdGF0aXN0aWNzIGdldFN0YXRzKCkgY29uc3Q7Ci0gICAgCi0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxTaGFyZWRCdWZmZXJTZXJ2ZXI+OwotICAgIH5TaGFyZWRCdWZmZXJTZXJ2ZXIoKTsKLQotICAgIC8qCi0gICAgICogQnVmZmVyTGlzdCBpcyBiYXNpY2FsbHkgYSBmaXhlZC1jYXBhY2l0eSBzb3J0ZWQtdmVjdG9yIG9mCi0gICAgICogdW5zaWduZWQgNS1iaXRzIGludHMgdXNpbmcgYSAzMi1iaXRzIGludCBhcyBzdG9yYWdlLgotICAgICAqIGl0IGhhcyBlZmZpY2llbnQgaXRlcmF0b3JzIHRvIGZpbmQgaXRlbXMgaW4gdGhlIGxpc3QgYW5kIG5vdCBpbiB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBjbGFzcyBCdWZmZXJMaXN0IHsKLSAgICAgICAgc2l6ZV90IG1DYXBhY2l0eTsKLSAgICAgICAgdWludDMyX3QgbUxpc3Q7Ci0gICAgcHVibGljOgotICAgICAgICBCdWZmZXJMaXN0KHNpemVfdCBjID0gU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYKQotICAgICAgICAgICAgOiBtQ2FwYWNpdHkoYyksIG1MaXN0KDApIHsgfQotICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHZhbHVlKTsKLSAgICAgICAgc3RhdHVzX3QgcmVtb3ZlKGludCB2YWx1ZSk7Ci0gICAgICAgIHVpbnQzMl90IGdldE1hc2soKSBjb25zdCB7IHJldHVybiBtTGlzdDsgfQotCi0gICAgICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIHsKLSAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJMaXN0OwotICAgICAgICAgICAgdWludDMyX3QgbWFzaywgY3VycjsKLSAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKHVpbnQzMl90IG1hc2spIDoKLSAgICAgICAgICAgICAgICBtYXNrKG1hc2spLCBjdXJyKF9fYnVpbHRpbl9jbHoobWFzaykpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFzayA9PSByaHMubWFzazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBjb25zdF9pdGVyYXRvciYgcmhzKSBjb25zdCB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1hc2sgIT0gcmhzLm1hc2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmxpbmUgaW50IG9wZXJhdG9yICooKSBjb25zdCB7IHJldHVybiBjdXJyOyB9Ci0gICAgICAgICAgICBpbmxpbmUgY29uc3QgY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yICsrKCkgewotICAgICAgICAgICAgICAgIG1hc2sgJj0gfigxPDwoMzEtY3VycikpOwotICAgICAgICAgICAgICAgIGN1cnIgPSBfX2J1aWx0aW5fY2x6KG1hc2spOwotICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigwKTsKLSAgICAgICAgfQotICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZnJlZV9iZWdpbigpIGNvbnN0IHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAoMSA8PCAoMzItbUNhcGFjaXR5KSkgLSAxOwotICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCB+KG1MaXN0IHwgbWFzaykgKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyB0aGlzIHByb3RlY3RzIG1OdW1CdWZmZXJzIGFuZCBtQnVmZmVyTGlzdAotICAgIG11dGFibGUgUldMb2NrIG1Mb2NrOwotICAgIGludCBtTnVtQnVmZmVyczsKLSAgICBCdWZmZXJMaXN0IG1CdWZmZXJMaXN0OwotCi0gICAgc3RydWN0IEJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24gOiBwdWJsaWMgQ29uZGl0aW9uQmFzZSB7Ci0gICAgICAgIGludCBtTnVtQnVmZmVyczsKLSAgICAgICAgaW5saW5lIEJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24oU2hhcmVkQnVmZmVyU2VydmVyKiBzYnMsCi0gICAgICAgICAgICAgICAgaW50IG51bUJ1ZmZlcnMpOwotICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKCkgY29uc3Q7Ci0gICAgICAgIGlubGluZSBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeyByZXR1cm4gIkJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24iOyB9Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSZXRpcmVVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGNvbnN0IGludCBudW1CdWZmZXJzOwotICAgICAgICBpbmxpbmUgUmV0aXJlVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgaW50IG51bUJ1ZmZlcnMpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTdGF0dXNVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaW5saW5lIFN0YXR1c1VwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIsIHN0YXR1c190IHN0YXR1cyk7Ci0gICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKLSAgICB9OwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIE5VTV9ESVNQTEFZX01BWCA0CiAKIHN0cnVjdCBkaXNwbGF5X2NibGtfdAogewpAQCAtMzg5LDEyICs0NiwxMSBAQAogICAgIHVpbnQ4X3QgICAgICAgICBjb25uZWN0ZWQ7CiAgICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkWzNdOwogICAgIHVpbnQzMl90ICAgICAgICBwYWRbN107Ci0gICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fRElTUExBWV9NQVhdOworICAgIGRpc3BsYXlfY2Jsa190ICBkaXNwbGF5c1tOVU1fRElTUExBWV9NQVhdOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKFNoYXJlZENsaWVudCkgPD0gNjU1MzYpCiBDT01QSUxFX1RJTUVfQVNTRVJUKHNpemVvZihzdXJmYWNlX2ZsaW5nZXJfY2Jsa190KSA8PSA0MDk2KQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmE0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCkBAIC0wLDAgKzEsMTI2IEBACisjIExpc3Qgb2YgZWZmZWN0IGxpYnJhcmllcyB0byBsb2FkLiBFYWNoIGxpYnJhcnkgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSAicGF0aCIgZWxlbWVudAorIyBnaXZpbmcgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgbGlicmFyeSAuc28gZmlsZS4KKyMgICAgbGlicmFyaWVzIHsKKyMgICAgICAgIDxsaWIgbmFtZT4geworIyAgICAgICAgICBwYXRoIDxsaWIgcGF0aD4KKyMgICAgICAgIH0KKyMgICAgfQorbGlicmFyaWVzIHsKKyAgYnVuZGxlIHsKKyAgICBwYXRoIC9zeXN0ZW0vbGliL3NvdW5kZngvbGliYnVuZGxld3JhcHBlci5zbworICB9CisgIHJldmVyYiB7CisgICAgcGF0aCAvc3lzdGVtL2xpYi9zb3VuZGZ4L2xpYnJldmVyYndyYXBwZXIuc28KKyAgfQorICB2aXN1YWxpemVyIHsKKyAgICBwYXRoIC9zeXN0ZW0vbGliL3NvdW5kZngvbGlidmlzdWFsaXplci5zbworICB9CisgIHByZV9wcm9jZXNzaW5nIHsKKyAgICBwYXRoIC9zeXN0ZW0vbGliL3NvdW5kZngvbGliYXVkaW9wcmVwcm9jZXNzaW5nLnNvCisgIH0KK30KKworIyBsaXN0IG9mIGVmZmVjdHMgdG8gbG9hZC4gRWFjaCBlZmZlY3QgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSAibGlicmFyeSIgYW5kIGEgInV1aWQiIGVsZW1lbnQuCisjIFRoZSB2YWx1ZSBvZiB0aGUgImxpYnJhcnkiIGVsZW1lbnQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBuYW1lIG9mIG9uZSBsaWJyYXJ5IGVsZW1lbnQgaW4gdGhlCisjICJsaWJyYXJpZXMiIGVsZW1lbnQuCisjIFRoZSBuYW1lIG9mIHRoZSBlZmZlY3QgZWxlbWVudCBpcyBpbmRpY2F0aXZlLCBvbmx5IHRoZSB2YWx1ZSBvZiB0aGUgInV1aWQiIGVsZW1lbnQKKyMgZGVzaWduYXRlcyB0aGUgZWZmZWN0LgorIyBUaGUgdXVpZCBpcyB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgVVVJRCBhcyBzcGVjaWZpZWQgYnkgdGhlIGVmZmVjdCB2ZW5kb3IuIFRoaXMgaXMgbm90IHRoZQorIyBnZW5lcmljIGVmZmVjdCB0eXBlIFVVSUQuCisjICAgIGVmZmVjdHMgeworIyAgICAgICAgPGZ4IG5hbWU+IHsKKyMgICAgICAgICAgICBsaWJyYXJ5IDxsaWIgbmFtZT4KKyMgICAgICAgICAgICB1dWlkIDxlZmZlY3QgdXVpZD4KKyMgICAgICAgIH0KKyMgICAgICAgIC4uLgorIyAgICB9CisKK2VmZmVjdHMgeworICBiYXNzYm9vc3QgeworICAgIGxpYnJhcnkgYnVuZGxlCisgICAgdXVpZCA4NjMxZjMwMC03MmUyLTExZGYtYjU3ZS0wMDAyYTVkNWM1MWIKKyAgfQorICB2aXJ0dWFsaXplciB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIDFkNDAzM2MwLTg1NTctMTFkZi05ZjJkLTAwMDJhNWQ1YzUxYgorICB9CisgIGVxdWFsaXplciB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIGNlNzcyZjIwLTg0N2QtMTFkZi1iYjE3LTAwMDJhNWQ1YzUxYgorICB9CisgIHZvbHVtZSB7CisgICAgbGlicmFyeSBidW5kbGUKKyAgICB1dWlkIDExOTM0MWEwLTg0NjktMTFkZi04MWY5LSAwMDAyYTVkNWM1MWIKKyAgfQorICByZXZlcmJfZW52X2F1eCB7CisgICAgbGlicmFyeSByZXZlcmIKKyAgICB1dWlkIDRhMzg3ZmMwLThhYjMtMTFkZi04YmFkLSAwMDAyYTVkNWM1MWIKKyAgfQorICByZXZlcmJfZW52X2lucyB7CisgICAgbGlicmFyeSByZXZlcmIKKyAgICB1dWlkIGM3YTUxMWEwLWEzYmItMTFkZi04NjBlLTAwMDJhNWQ1YzUxYgorICB9CisgIHJldmVyYl9wcmVfYXV4IHsKKyAgICBsaWJyYXJ5IHJldmVyYgorICAgIHV1aWQgZjI5YTE0MDAtYTNiYi0xMWRmLThkZGMtMDAwMmE1ZDVjNTFiCisgIH0KKyAgcmV2ZXJiX3ByZV9pbnMgeworICAgIGxpYnJhcnkgcmV2ZXJiCisgICAgdXVpZCAxNzJjZGYwMC1hM2JjLTExZGYtYTcyZi0wMDAyYTVkNWM1MWIKKyAgfQorICB2aXN1YWxpemVyIHsKKyAgICBsaWJyYXJ5IHZpc3VhbGl6ZXIKKyAgICB1dWlkIGQwNjlkOWUwLTgzMjktMTFkZi05MTY4LTAwMDJhNWQ1YzUxYgorICB9CisgIGFnYyB7CisgICAgbGlicmFyeSBwcmVfcHJvY2Vzc2luZworICAgIHV1aWQgYWE4MTMwZTAtNjZmYy0xMWUwLWJhZDAtMDAwMmE1ZDVjNTFiCisgIH0KKyAgYWVjIHsKKyAgICBsaWJyYXJ5IHByZV9wcm9jZXNzaW5nCisgICAgdXVpZCBiYjM5MmVjMC04ZDRkLTExZTAtYTg5Ni0wMDAyYTVkNWM1MWIKKyAgfQorICBucyB7CisgICAgbGlicmFyeSBwcmVfcHJvY2Vzc2luZworICAgIHV1aWQgYzA2Yzg0MDAtOGUwNi0xMWUwLTljYjYtMDAwMmE1ZDVjNTFiCisgIH0KK30KKyMgQXVkaW8gcHJlcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb25zLgorIyBUaGUgcHJlIHByb2Nlc3NvciBjb25maWd1cmF0aW9uIGNvbnNpc3RzIGluIGEgbGlzdCBvZiBlbGVtZW50cyBlYWNoIGRlc2NyaWJpbmcKKyMgcHJlIHByb2Nlc3NvciBzZXR0aW5ncyBmb3IgYSBnaXZlbiBpbnB1dCBzb3VyY2UuIFZhbGlkIGlucHV0IHNvdXJjZSBuYW1lcyBhcmU6CisjICJtaWMiLCAiY2FtY29yZGVyIiwgInZvaWNlX3JlY29nbml0aW9uIiwgInZvaWNlX2NvbW11bmljYXRpb24iCisjIEVhY2ggaW5wdXQgc291cmNlIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIGVmZmVjdHMgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZSBlZmZlY3QKKyMgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZWZmZWN0cyBpbiB0aGUgImVmZmVjdHMiIGxpc3Qgb2YgdGhlIGZpbGUuCisjIEVhY2ggZWZmZWN0IGVsZW1lbnQgbWF5IG9wdGlvbmFsbHkgY29udGFpbiBhIGxpc3Qgb2YgcGFyYW1ldGVycyBhbmQgdGhlaXIKKyMgZGVmYXVsdCB2YWx1ZSB0byBhcHBseSB3aGVuIHRoZSBwcmUgcHJvY2Vzc29yIGVmZmVjdCBpcyBjcmVhdGVkLgorIyBBIHBhcmFtZXRlciBpcyBkZWZpbmVkIGJ5IGEgInBhcmFtIiBlbGVtZW50IGFuZCBhICJ2YWx1ZSIgZWxlbWVudC4gRWFjaCBvZiB0aGVzZSBlbGVtZW50cworIyBjb25zaXN0cyBpbiBvbmUgb3IgbW9yZSBlbGVtZW50cyBzcGVjaWZ5aW5nIGEgdHlwZSBmb2xsb3dlZCBieSBhIHZhbHVlLgorIyBUaGUgdHlwZXMgZGVmaW5lZCBhcmU6ICJpbnQiLCAic2hvcnQiLCAiZmxvYXQiLCAiYm9vbCIgYW5kICJzdHJpbmciCisjIFdoZW4gYm90aCAicGFyYW0iIGFuZCAidmFsdWUiIGFyZSBhIHNpbmdsZSBpbnQsIGEgc2ltcGxlIGZvcm0gaXMgYWxsb3dlZCB3aGVyZSBqdXN0CisjIHRoZSBwYXJhbSBhbmQgdmFsdWUgcGFpciBpcyBwcmVzZW50IGluIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyMgICAgcHJlX3Byb2Nlc3NpbmcgeworIyAgICAgICAgPGlucHV0IHNvdXJjZSBuYW1lPiB7CisjICAgICAgICAgICAgPGZ4IG5hbWU+IHsKKyMgICAgICAgICAgICAgICAgPHBhcmFtIDEgbmFtZT4geworIyAgICAgICAgICAgICAgICAgICAgcGFyYW0geworIyAgICAgICAgICAgICAgICAgICAgICAgIGludHxzaG9ydHxmbG9hdHxib29sfHN0cmluZyA8dmFsdWU+CisjICAgICAgICAgICAgICAgICAgICAgICAgWyBpbnR8c2hvcnR8ZmxvYXR8Ym9vbHxzdHJpbmcgPHZhbHVlPiBdCisjICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisjICAgICAgICAgICAgICAgICAgICB9CisjICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7CisjICAgICAgICAgICAgICAgICAgICAgICAgaW50fHNob3J0fGZsb2F0fGJvb2x8c3RyaW5nIDx2YWx1ZT4KKyMgICAgICAgICAgICAgICAgICAgICAgICBbIGludHxzaG9ydHxmbG9hdHxib29sfHN0cmluZyA8dmFsdWU+IF0KKyMgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyMgICAgICAgICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICAgICA8cGFyYW0gMiBuYW1lID4gezxwYXJhbT4gPHZhbHVlPn0KKyMgICAgICAgICAgICAgICAgLi4uCisjICAgICAgICAgICAgfQorIyAgICAgICAgICAgIC4uLgorIyAgICAgICAgfQorIyAgICAgICAgLi4uCisjICAgIH0KKworIworIyBUT0RPOiBhZGQgZGVmYXVsdCBhdWRpbyBwcmUgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb25zIGFmdGVyIGRlYnVnIGFuZCB0dW5pbmcgcGhhc2UKKyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsKaW5kZXggMjBmNThlNS4uMmYyYjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsKQEAgLTEyLDE0ICsxMiw5IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykKIExPQ0FMX01PRFVMRTo9IGxpYmVmZmVjdHMKIAotaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbmRpZgotCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IGMxOWE1MDUuLmQzMzM1MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yMiw2ICsyMiw5IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0VmZmVjdExpc3Q7IC8vIGxpc3Qgb2YgZWZmZWN0X2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgY3JlYXRlZCBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCkBAIC0zMCwzMCArMzMsMzkgQEAKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0N1ckxpYjsgICAgLy8gY3VycmVudCBsaWJyYXJ5IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0N1ckVmZmVjdDsgLy8gY3VycmVudCBlZmZlY3QgaW4gZW51bWVyYXRpb24gcHJvY2Vzcwogc3RhdGljIHVpbnQzMl90IGdDdXJFZmZlY3RJZHg7ICAgICAgIC8vIGN1cnJlbnQgZWZmZWN0IGluZGV4IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCiAKLWNvbnN0IGNoYXIgKiBjb25zdCBnRWZmZWN0TGliUGF0aCA9ICIvc3lzdGVtL2xpYi9zb3VuZGZ4IjsgLy8gcGF0aCB0byBidWlsdC1pbiBlZmZlY3QgbGlicmFyaWVzCiBzdGF0aWMgaW50IGdJbml0RG9uZTsgLy8gdHJ1ZSBpcyBnbG9iYWwgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gcHJlZm9ybWVkCi1zdGF0aWMgaW50IGdOZXh0TGliSWQ7IC8vIHVzZWQgYnkgbG9hZExpYnJhcnkoKSB0byBhbGxvY2F0ZSB1bmlxdWUgbGlicmFyeSBoYW5kbGVzCiBzdGF0aWMgaW50IGdDYW5RdWVyeUVmZmVjdDsgLy8gaW5kaWNhdGVzIHRoYXQgY2FsbCB0byBFZmZlY3RRdWVyeUVmZmVjdCgpIGlzIHZhbGlkLCBpLmUuIHRoYXQgdGhlIGxpc3Qgb2YgZWZmZWN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgbm90IG1vZGlmaWVkIHNpbmNlIGxhc3QgY2FsbCB0byBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKQogCisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIGludCBpbml0KCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKLXN0YXRpYyBpbnQgdW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7CitzdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CiBzdGF0aWMgdm9pZCByZXNldEVmZmVjdEVudW1lcmF0aW9uKCk7CiBzdGF0aWMgdWludDMyX3QgdXBkYXRlTnVtRWZmZWN0cygpOwotc3RhdGljIGludCBmaW5kRWZmZWN0KGVmZmVjdF91dWlkX3QgKnV1aWQsIGxpYl9lbnRyeV90ICoqbGliLCBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7CitzdGF0aWMgaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKIHN0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOworc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLWludCBFZmZlY3RfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQoraW50IEVmZmVjdF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7CiAgICAgaW50IHJldCA9IGluaXQoKTsKICAgICBpZiAocmV0IDwgMCkgewpAQCAtNzMsNyArODUsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBFZmZlY3RfQ29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKK2ludCBFZmZlY3RfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCiAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCkBAIC05OCw5ICsxMTAsNjQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitpbnQgRWZmZWN0X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICBpbnQgcmV0ID0gaW5pdCgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGVmZmVjdF9lbnRyeV90ICpmeCA9IChlZmZlY3RfZW50cnlfdCAqKXNlbGY7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgaWYgKGZ4LT5saWIgPT0gTlVMTCkgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgICAgICByZXR1cm4gLUVQSVBFOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmZ4LT5saWItPmxvY2spOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisKKyAgICByZXQgPSAoKmZ4LT5zdWJJdGZlKS0+Z2V0X2Rlc2NyaXB0b3IoZngtPnN1Ykl0ZmUsIGRlc2MpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0X1Byb2Nlc3NSZXZlcnNlKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCit7CisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlZmZlY3RfZW50cnlfdCAqZnggPSAoZWZmZWN0X2VudHJ5X3QgKilzZWxmOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FUElQRTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworCisgICAgaWYgKCgqZngtPnN1Ykl0ZmUpLT5wcm9jZXNzX3JldmVyc2UgIT0gTlVMTCkgeworICAgICAgICByZXQgPSAoKmZ4LT5zdWJJdGZlKS0+cHJvY2Vzc19yZXZlcnNlKGZ4LT5zdWJJdGZlLCBpbkJ1ZmZlciwgb3V0QnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAtRU5PU1lTOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworCiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdJbnRlcmZhY2UgPSB7CiAgICAgICAgIEVmZmVjdF9Qcm9jZXNzLAotICAgICAgICBFZmZlY3RfQ29tbWFuZAorICAgICAgICBFZmZlY3RfQ29tbWFuZCwKKyAgICAgICAgRWZmZWN0X0dldERlc2NyaXB0b3IsCisgICAgICAgIE5VTEwKK307CisKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0ludGVyZmFjZVdpdGhSZXZlcnNlID0geworICAgICAgICBFZmZlY3RfUHJvY2VzcywKKyAgICAgICAgRWZmZWN0X0NvbW1hbmQsCisgICAgICAgIEVmZmVjdF9HZXREZXNjcmlwdG9yLAorICAgICAgICBFZmZlY3RfUHJvY2Vzc1JldmVyc2UKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTE4Miw3ICsyNDksNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7Ci0gICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIHJldCA9IGZpbmRFZmZlY3QoTlVMTCwgdXVpZCwgJmwsICZkKTsKICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBkLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgIH0KQEAgLTE5MCwxNyArMjU3LDE3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpCitpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkKIHsKICAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKICAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgZWZmZWN0X2ludGVyZmFjZV90IGl0ZmU7CisgICAgZWZmZWN0X2hhbmRsZV90IGl0ZmU7CiAgICAgZWZmZWN0X2VudHJ5X3QgKmZ4OwogICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IHJldDsKIAotICAgIGlmICh1dWlkID09IE5VTEwgfHwgcEludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCBwSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0yMTgsMjIgKzI4NSwyOCBAQAogCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CiAKLSAgICByZXQgPSBmaW5kRWZmZWN0KHV1aWQsICZsLCAmZCk7CisgICAgcmV0ID0gZmluZEVmZmVjdChOVUxMLCB1dWlkLCAmbCwgJmQpOwogICAgIGlmIChyZXQgPCAwKXsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgIC8vIGNyZWF0ZSBlZmZlY3QgaW4gbGlicmFyeQotICAgIHJldCA9IGwtPmNyZWF0ZUZ4KHV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJml0ZmUpOworICAgIHJldCA9IGwtPmRlc2MtPmNyZWF0ZV9lZmZlY3QodXVpZCwgc2Vzc2lvbklkLCBpb0lkLCAmaXRmZSk7CiAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIExPR1coIkVmZmVjdENyZWF0ZSgpIGxpYnJhcnkgJXM6IGNvdWxkIG5vdCBjcmVhdGUgZnggJXMsIGVycm9yICVkIiwgbC0+cGF0aCwgZC0+bmFtZSwgcmV0KTsKKyAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgbGlicmFyeSAlczogY291bGQgbm90IGNyZWF0ZSBmeCAlcywgZXJyb3IgJWQiLCBsLT5uYW1lLCBkLT5uYW1lLCByZXQpOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCiAgICAgLy8gYWRkIGVudHJ5IHRvIGVmZmVjdCBsaXN0CiAgICAgZnggPSAoZWZmZWN0X2VudHJ5X3QgKiltYWxsb2Moc2l6ZW9mKGVmZmVjdF9lbnRyeV90KSk7CiAgICAgZngtPnN1Ykl0ZmUgPSBpdGZlOwotICAgIGZ4LT5pdGZlID0gKHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKikmZ0ludGVyZmFjZTsKKyAgICBpZiAoKCppdGZlKS0+cHJvY2Vzc19yZXZlcnNlICE9IE5VTEwpIHsKKyAgICAgICAgZngtPml0ZmUgPSAoc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKSZnSW50ZXJmYWNlV2l0aFJldmVyc2U7CisgICAgICAgIExPR1YoIkVmZmVjdENyZWF0ZSgpIGdJbnRlcmZhY2VXaXRoUmV2ZXJzZSIpOworICAgIH0gICBlbHNlIHsKKyAgICAgICAgZngtPml0ZmUgPSAoc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKSZnSW50ZXJmYWNlOworICAgICAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBnSW50ZXJmYWNlIik7CisgICAgfQogICAgIGZ4LT5saWIgPSBsOwogCiAgICAgZSA9IChsaXN0X2VsZW1fdCAqKW1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKQEAgLTI0MSwxNiArMzE0LDE2IEBACiAgICAgZS0+bmV4dCA9IGdFZmZlY3RMaXN0OwogICAgIGdFZmZlY3RMaXN0ID0gZTsKIAotICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClmeDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpZng7CiAKLSAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBjcmVhdGVkIGVudHJ5ICVwIHdpdGggc3ViIGl0ZmUgJXAgaW4gbGlicmFyeSAlcyIsICpwSW50ZXJmYWNlLCBpdGZlLCBsLT5wYXRoKTsKKyAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBjcmVhdGVkIGVudHJ5ICVwIHdpdGggc3ViIGl0ZmUgJXAgaW4gbGlicmFyeSAlcyIsICpwSGFuZGxlLCBpdGZlLCBsLT5uYW1lKTsKIAogZXhpdDoKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKICAgICBsaXN0X2VsZW1fdCAqZTE7CkBAIC0yNjYsNyArMzM5LDcgQEAKICAgICBlMSA9IGdFZmZlY3RMaXN0OwogICAgIGUyID0gTlVMTDsKICAgICB3aGlsZSAoZTEpIHsKLSAgICAgICAgaWYgKGUxLT5vYmplY3QgPT0gaW50ZXJmYWNlKSB7CisgICAgICAgIGlmIChlMS0+b2JqZWN0ID09IGhhbmRsZSkgewogICAgICAgICAgICAgaWYgKGUyKSB7CiAgICAgICAgICAgICAgICAgZTItPm5leHQgPSBlMS0+bmV4dDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yODYsMTAgKzM1OSwxMCBAQAogCiAgICAgLy8gcmVsZWFzZSBlZmZlY3QgaW4gbGlicmFyeQogICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiRWZmZWN0UmVsZWFzZSgpIGZ4ICVwIGxpYnJhcnkgYWxyZWFkeSB1bmxvYWRlZCIsIGludGVyZmFjZSk7CisgICAgICAgIExPR1coIkVmZmVjdFJlbGVhc2UoKSBmeCAlcCBsaWJyYXJ5IGFscmVhZHkgdW5sb2FkZWQiLCBoYW5kbGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZngtPmxpYi0+bG9jayk7Ci0gICAgICAgIGZ4LT5saWItPnJlbGVhc2VGeChmeC0+c3ViSXRmZSk7CisgICAgICAgIGZ4LT5saWItPmRlc2MtPnJlbGVhc2VfZWZmZWN0KGZ4LT5zdWJJdGZlKTsKICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZ4LT5saWItPmxvY2spOwogICAgIH0KICAgICBmcmVlKGZ4KTsKQEAgLTI5OSwzMyArMzcyLDYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgRWZmZWN0TG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpCi17Ci0gICAgaW50IHJldCA9IGluaXQoKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAobGliUGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHJldCA9IGxvYWRMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Ci0gICAgdXBkYXRlTnVtRWZmZWN0cygpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBFZmZlY3RVbmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCi17Ci0gICAgaW50IHJldCA9IGluaXQoKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHJldCA9IHVubG9hZExpYnJhcnkoaGFuZGxlKTsKLSAgICB1cGRhdGVOdW1FZmZlY3RzKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogaW50IEVmZmVjdElzTnVsbFV1aWQoZWZmZWN0X3V1aWRfdCAqdXVpZCkKIHsKICAgICBpZiAobWVtY21wKHV1aWQsIEVGRkVDVF9VVUlEX05VTEwsIHNpemVvZihlZmZlY3RfdXVpZF90KSkpIHsKQEAgLTMzOSw5ICszODUsNiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBpbnQgaW5pdCgpIHsKLSAgICBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0gICAgRElSICpkaXIgPSBOVUxMOwotICAgIGNoYXIgbGlicGF0aFtQQVRIX01BWF07CiAgICAgaW50IGhkbDsKIAogICAgIGlmIChnSW5pdERvbmUpIHsKQEAgLTM1MCwyMTQgKzM5MywyMTAgQEAKIAogICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ0xpYkxvY2ssIE5VTEwpOwogCi0gICAgLy8gbG9hZCBidWlsdC1pbiBsaWJyYXJpZXMKLSAgICBkaXIgPSBvcGVuZGlyKGdFZmZlY3RMaWJQYXRoKTsKLSAgICBpZiAoZGlyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKICAgICB9Ci0gICAgd2hpbGUgKChlbnQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKLSAgICAgICAgTE9HVigiaW5pdCgpIHJlYWRpbmcgZmlsZSAlcyIsIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgaWYgKChzdHJsZW4oZW50LT5kX25hbWUpIDwgMykgfHwKLSAgICAgICAgICAgIHN0cm5jbXAoZW50LT5kX25hbWUsICJsaWIiLCAzKSAhPSAwIHx8Ci0gICAgICAgICAgICBzdHJuY21wKGVudC0+ZF9uYW1lICsgc3RybGVuKGVudC0+ZF9uYW1lKSAtIDMsICIuc28iLCAzKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzdHJjcHkobGlicGF0aCwgZ0VmZmVjdExpYlBhdGgpOwotICAgICAgICBzdHJjYXQobGlicGF0aCwgIi8iKTsKLSAgICAgICAgc3RyY2F0KGxpYnBhdGgsIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgaWYgKGxvYWRMaWJyYXJ5KGxpYnBhdGgsICZoZGwpIDwgMCkgewotICAgICAgICAgICAgTE9HVygiaW5pdCgpIGZhaWxlZCB0byBsb2FkIGxpYnJhcnkgJXMiLGxpYnBhdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGNsb3NlZGlyKGRpcik7CisKICAgICB1cGRhdGVOdW1FZmZlY3RzKCk7CiAgICAgZ0luaXREb25lID0gMTsKICAgICBMT0dWKCJpbml0KCkgZG9uZSIpOwogICAgIHJldHVybiAwOwogfQogCi0KLWludCBsb2FkTGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKK2ludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKQogeworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworICAgIGxvYWRMaWJyYXJpZXMocm9vdCk7CisgICAgbG9hZEVmZmVjdHMocm9vdCk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsb2FkTGlicmFyaWVzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIExJQlJBUklFU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBsb2FkTGlicmFyeShub2RlLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY25vZGUgKm5vZGU7CiAgICAgdm9pZCAqaGRsOwotICAgIGVmZmVjdF9RdWVyeU51bWJlckVmZmVjdHNfdCBxdWVyeU51bUZ4OwotICAgIGVmZmVjdF9RdWVyeUVmZmVjdF90IHF1ZXJ5Rng7Ci0gICAgZWZmZWN0X0NyZWF0ZUVmZmVjdF90IGNyZWF0ZUZ4OwotICAgIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgcmVsZWFzZUZ4OwotICAgIHVpbnQzMl90IG51bUZ4OwotICAgIHVpbnQzMl90IGZ4OwotICAgIGludCByZXQ7Ci0gICAgbGlzdF9lbGVtX3QgKmUsICpkZXNjSGVhZCA9IE5VTEw7CisgICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKKyAgICBsaXN0X2VsZW1fdCAqZTsKICAgICBsaWJfZW50cnlfdCAqbDsKIAotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAqaGFuZGxlID0gMDsKLQotICAgIGhkbCA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyk7Ci0gICAgaWYgKGhkbCA9PSAwKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG9wZW4gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZ1bmN0aW9ucyBhdmFpbGFiaWxpdHkKLSAgICBxdWVyeU51bUZ4ID0gKGVmZmVjdF9RdWVyeU51bWJlckVmZmVjdHNfdClkbHN5bShoZGwsICJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiKTsKLSAgICBpZiAocXVlcnlOdW1GeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHF1ZXJ5RnggPSAoZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0UXVlcnlFZmZlY3QiKTsKLSAgICBpZiAocXVlcnlGeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0UXVlcnlFZmZlY3QgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKLSAgICAgICAgcmV0ID0gLUVOT0RFVjsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgY3JlYXRlRnggPSAoZWZmZWN0X0NyZWF0ZUVmZmVjdF90KWRsc3ltKGhkbCwgIkVmZmVjdENyZWF0ZSIpOwotICAgIGlmIChjcmVhdGVGeCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1coImNvdWxkIG5vdCBnZXQgRWZmZWN0Q3JlYXRlIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJlbGVhc2VGeCA9IChlZmZlY3RfUmVsZWFzZUVmZmVjdF90KWRsc3ltKGhkbCwgIkVmZmVjdFJlbGVhc2UiKTsKLSAgICBpZiAocmVsZWFzZUZ4ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RSZWxlYXNlIGZyb20gbGliICVzIiwgbGliUGF0aCk7Ci0gICAgICAgIHJldCA9IC1FTk9ERVY7CisgICAgaGRsID0gZGxvcGVuKG5vZGUtPnZhbHVlLCBSVExEX05PVyk7CisgICAgaWYgKGhkbCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBub2RlLT52YWx1ZSk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgLy8gbG9hZCBlZmZlY3QgZGVzY3JpcHRvcnMKLSAgICByZXQgPSBxdWVyeU51bUZ4KCZudW1GeCk7Ci0gICAgaWYgKHJldCkgeworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRMaWJyYXJ5KCkgY291bGQgbm90IGZpbmQgc3ltYm9sICVzIiwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBmb3IgKGZ4ID0gMDsgZnggPCBudW1GeDsgZngrKykgewotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIGlmIChkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldCA9IC1FTk9NRU07Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IHF1ZXJ5RngoZngsIGQpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICAgICAgICAgIGNoYXIgc1syNTZdOwotICAgICAgICAgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgMjU2KTsKLSAgICAgICAgICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGQtPmFwaVZlcnNpb24gIT0gRUZGRUNUX0FQSV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygiQmFkIEFQSSB2ZXJzaW9uICUwNHggb24gbGliICVzIiwgZC0+YXBpVmVyc2lvbiwgbGliUGF0aCk7Ci0gICAgICAgICAgICAgICAgZnJlZShkKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShkKTsKLSAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlLT5vYmplY3QgPSBkOwotICAgICAgICAgICAgZS0+bmV4dCA9IGRlc2NIZWFkOwotICAgICAgICAgICAgZGVzY0hlYWQgPSBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICMgJWQgb24gbGliICVzIiwgZngsIGxpYlBhdGgpOwotICAgICAgICB9CisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgTE9HVygiZ2V0TGlicmFyeSgpIGJhZCB0YWcgJTA4eCBpbiBsaWIgaW5mbyBzdHJ1Y3QiLCBkZXNjLT50YWcpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZGVzYy0+dmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKICAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPmlkID0gKytnTmV4dExpYklkOworICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKKyAgICBsLT5wYXRoID0gc3RybmR1cChub2RlLT52YWx1ZSwgUEFUSF9NQVgpOwogICAgIGwtPmhhbmRsZSA9IGhkbDsKLSAgICBzdHJuY3B5KGwtPnBhdGgsIGxpYlBhdGgsIFBBVEhfTUFYKTsKLSAgICBsLT5jcmVhdGVGeCA9IGNyZWF0ZUZ4OwotICAgIGwtPnJlbGVhc2VGeCA9IHJlbGVhc2VGeDsKLSAgICBsLT5lZmZlY3RzID0gZGVzY0hlYWQ7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKIAogICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKICAgICBlLT5vYmplY3QgPSBsOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7CiAgICAgZ0xpYnJhcnlMaXN0ID0gZTsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwotICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAiLCBsKTsKLQotICAgICpoYW5kbGUgPSBsLT5pZDsKKyAgICBMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBub2RlLT52YWx1ZSk7CiAKICAgICByZXR1cm4gMDsKIAogZXJyb3I6Ci0gICAgTE9HVygibG9hZExpYnJhcnkoKSBlcnJvcjogJWQgb24gbGliOiAlcyIsIHJldCwgbGliUGF0aCk7Ci0gICAgd2hpbGUgKGRlc2NIZWFkKSB7Ci0gICAgICAgIGZyZWUoZGVzY0hlYWQtPm9iamVjdCk7Ci0gICAgICAgIGUgPSBkZXNjSGVhZC0+bmV4dDsKLSAgICAgICAgZnJlZShkZXNjSGVhZCk7Ci0gICAgICAgIGRlc2NIZWFkID0gZTs7CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKICAgICB9Ci0gICAgZGxjbG9zZShoZGwpOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCitpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpCiB7Ci0gICAgdm9pZCAqaGRsOwotICAgIGludCByZXQ7Ci0gICAgbGlzdF9lbGVtX3QgKmVsMSwgKmVsMjsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBlZmZlY3RfZW50cnlfdCAqZng7CisgICAgY25vZGUgKm5vZGU7CiAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKLSAgICBlbDEgPSBnTGlicmFyeUxpc3Q7Ci0gICAgZWwyID0gTlVMTDsKLSAgICB3aGlsZSAoZWwxKSB7Ci0gICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillbDEtPm9iamVjdDsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBsLT5pZCkgewotICAgICAgICAgICAgaWYgKGVsMikgewotICAgICAgICAgICAgICAgIGVsMi0+bmV4dCA9IGVsMS0+bmV4dDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ0xpYnJhcnlMaXN0ID0gZWwxLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShlbDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWwyID0gZWwxOwotICAgICAgICBlbDEgPSBlbDEtPm5leHQ7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgaWYgKGVsMSA9PSBOVUxMKSB7CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KLQotICAgIC8vIGNsZWFyIGVmZmVjdCBkZXNjcmlwdG9yIGxpc3QKLSAgICBlbDEgPSBsLT5lZmZlY3RzOwotICAgIHdoaWxlIChlbDEpIHsKLSAgICAgICAgZnJlZShlbDEtPm9iamVjdCk7Ci0gICAgICAgIGVsMiA9IGVsMS0+bmV4dDsKLSAgICAgICAgZnJlZShlbDEpOwotICAgICAgICBlbDEgPSBlbDI7CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwogICAgIH0KLQotICAgIC8vIGRpc2FibGUgYWxsIGVmZmVjdHMgZnJvbSB0aGlzIGxpYnJhcnkKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmwtPmxvY2spOwotCi0gICAgZWwxID0gZ0VmZmVjdExpc3Q7Ci0gICAgd2hpbGUgKGVsMSkgewotICAgICAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKWVsMS0+b2JqZWN0OwotICAgICAgICBpZiAoZngtPmxpYiA9PSBsKSB7Ci0gICAgICAgICAgICBmeC0+bGliID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbDEgPSBlbDEtPm5leHQ7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsLT5sb2NrKTsKLQotICAgIGRsY2xvc2UobC0+aGFuZGxlKTsKLSAgICBmcmVlKGwpOwogICAgIHJldHVybiAwOwogfQogCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGdldCBsaWJyYXJ5ICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7CisgICAgICAgIExPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIExPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1syNTZdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIExPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgIGwtPmVmZmVjdHMgPSBlOworCisgICAgcmV0dXJuIDA7Cit9CisKK2xpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbGlzdF9lbGVtX3QgKmU7CisKKyAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKKyAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKKyAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OworICAgIH0KKworICAgIGUgPSBnTGlicmFyeUxpc3Q7CisgICAgd2hpbGUgKGUpIHsKKyAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC01ODksNyArNjI4LDEwIEBACiAgICAgcmV0dXJuIGNudDsKIH0KIAotaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdXVpZCwgbGliX2VudHJ5X3QgKipsaWIsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQoraW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQogewogICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OwogICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKQEAgLTYwMiw3ICs2NDQsMTEgQEAKICAgICAgICAgbGlzdF9lbGVtX3QgKmVmeCA9IGwtPmVmZmVjdHM7CiAgICAgICAgIHdoaWxlIChlZngpIHsKICAgICAgICAgICAgIGQgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKWVmeC0+b2JqZWN0OwotICAgICAgICAgICAgaWYgKG1lbWNtcCgmZC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTYxNCw5ICs2NjAsMTEgQEAKICAgICAgICAgTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKICAgICAgICAgcmV0ID0gLUVOT0VOVDsKICAgICB9IGVsc2UgewotICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZm91bmQgZWZmZWN0OiAlcyBpbiBsaWIgJXMiLCBkLT5uYW1lLCBsLT5wYXRoKTsKKyAgICAgICAgTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CiAgICAgICAgICpsaWIgPSBsOwotICAgICAgICAqZGVzYyA9IGQ7CisgICAgICAgIGlmIChkZXNjKSB7CisgICAgICAgICAgICAqZGVzYyA9IGQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtNjI2LDE3ICs2NzQsMTIgQEAKICAgICBjaGFyIHNbMjU2XTsKIAogICAgIHNucHJpbnRmKHN0ciwgbGVuLCAiXG5FZmZlY3QgRGVzY3JpcHRvciAlcDpcbiIsIGRlc2MpOwotICAgIHNwcmludGYocywgIi0gVVVJRDogJTA4WC0lMDRYLSUwNFgtJTA0WC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCi0gICAgICAgICAgICBkZXNjLT51dWlkLnRpbWVMb3csIGRlc2MtPnV1aWQudGltZU1pZCwgZGVzYy0+dXVpZC50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgZGVzYy0+dXVpZC5jbG9ja1NlcSwgZGVzYy0+dXVpZC5ub2RlWzBdLCBkZXNjLT51dWlkLm5vZGVbMV0sZGVzYy0+dXVpZC5ub2RlWzJdLAotICAgICAgICAgICAgZGVzYy0+dXVpZC5ub2RlWzNdLGRlc2MtPnV1aWQubm9kZVs0XSxkZXNjLT51dWlkLm5vZGVbNV0pOwotICAgIHN0cm5jYXQoc3RyLCBzLCBsZW4pOwotICAgIHNwcmludGYocywgIi0gVFlQRTogJTA4WC0lMDRYLSUwNFgtJTA0WC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCi0gICAgICAgICAgICAgICAgZGVzYy0+dHlwZS50aW1lTG93LCBkZXNjLT50eXBlLnRpbWVNaWQsIGRlc2MtPnR5cGUudGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgICAgICBkZXNjLT50eXBlLmNsb2NrU2VxLCBkZXNjLT50eXBlLm5vZGVbMF0sIGRlc2MtPnR5cGUubm9kZVsxXSxkZXNjLT50eXBlLm5vZGVbMl0sCi0gICAgICAgICAgICAgICAgZGVzYy0+dHlwZS5ub2RlWzNdLGRlc2MtPnR5cGUubm9kZVs0XSxkZXNjLT50eXBlLm5vZGVbNV0pOwotICAgIHN0cm5jYXQoc3RyLCBzLCBsZW4pOwotICAgIHNwcmludGYocywgIi0gYXBpVmVyc2lvbjogJTA0WFxuLSBmbGFnczogJTA4WFxuIiwKKyAgICBzdHJuY2F0KHN0ciwgIi0gVFlQRTogIiwgbGVuKTsKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIDI1Nik7CisgICAgc25wcmludGYoc3RyLCBsZW4sICItIFVVSUQ6ICVzXG4iLCBzKTsKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIDI1Nik7CisgICAgc25wcmludGYoc3RyLCBsZW4sICItIFRZUEU6ICVzXG4iLCBzKTsKKyAgICBzcHJpbnRmKHMsICItIGFwaVZlcnNpb246ICUwOFhcbi0gZmxhZ3M6ICUwOFhcbiIsCiAgICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBkZXNjLT5mbGFncyk7CiAgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CiAgICAgc3ByaW50ZihzLCAiLSBuYW1lOiAlc1xuIiwgZGVzYy0+bmFtZSk7CkBAIC02NDUsMyArNjg4LDQzIEBACiAgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CiB9CiAKK2ludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKworICAgIHNucHJpbnRmKHN0ciwgbWF4TGVuLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdXVpZC0+dGltZUxvdywKKyAgICAgICAgICAgIHV1aWQtPnRpbWVNaWQsCisgICAgICAgICAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uLAorICAgICAgICAgICAgdXVpZC0+Y2xvY2tTZXEsCisgICAgICAgICAgICB1dWlkLT5ub2RlWzBdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsxXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMl0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzNdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs0XSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKaW5kZXggOGY1NDNjYS4uYzFkNDMxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTIyLDI5ICsyMiwyOCBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAKLQogI2lmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCisKIHR5cGVkZWYgc3RydWN0IGxpc3RfZWxlbV9zIHsKICAgICB2b2lkICpvYmplY3Q7CiAgICAgc3RydWN0IGxpc3RfZWxlbV9zICpuZXh0OwogfSBsaXN0X2VsZW1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgbGliX2VudHJ5X3MgewotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisgICAgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqZGVzYzsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGg7CiAgICAgdm9pZCAqaGFuZGxlOwotICAgIGludCBpZDsKLSAgICBlZmZlY3RfQ3JlYXRlRWZmZWN0X3QgY3JlYXRlRng7Ci0gICAgZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCByZWxlYXNlRng7CiAgICAgbGlzdF9lbGVtX3QgKmVmZmVjdHM7IC8vbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvcl90CiAgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CiB9IGxpYl9lbnRyeV90OwogCiB0eXBlZGVmIHN0cnVjdCBlZmZlY3RfZW50cnlfcyB7CiAgICAgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICBlZmZlY3RfaW50ZXJmYWNlX3Qgc3ViSXRmZTsKKyAgICBlZmZlY3RfaGFuZGxlX3Qgc3ViSXRmZTsKICAgICBsaWJfZW50cnlfdCAqbGliOwogfSBlZmZlY3RfZW50cnlfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawppbmRleCBmZjM0NzA3Li5mNDkyNjdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYm11c2ljYnVuZGxlCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChMT0NBTF9QQVRIKS9FcS9saWIgXApAQCAtMTY4LDcgKzE2OCw3IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYnJldmVyYgogCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiL2xpYiBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggMmU5YjliNC4uZjA5N2RkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTMsMjQgKzEzLDIwIEBACiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9zb3VuZGZ4CiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJtdXNpY2J1bmRsZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgbGliY3V0aWxzIFwKLQotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotTE9DQUxfTERMSUJTICs9IC1sZGwKLWVsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCisgICAgIGxpYmRsCiAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChMT0NBTF9QQVRIKS9CdW5kbGUgXAogCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKLQkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLworCSQoTE9DQUxfUEFUSCkvLi4vbGliL0J1bmRsZS9saWIvIFwKKwlzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCiAKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpAQCAtNDcsMjMgKzQzLDE4IEBACiAKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9zb3VuZGZ4CiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJyZXZlcmIKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgIGxpYmN1dGlscyBcCi0KLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgorICAgICBsaWJkbAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAkKExPQ0FMX1BBVEgpL1JldmVyYiBcCiAgICAgJChMT0NBTF9QQVRIKS8uLi9saWIvQ29tbW9uL2xpYi8gXAogICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL1JldmVyYi9saWIvIFwKLQorICAgIHN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDBiMDYxZGIuLmVmYTFjNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPEVmZmVjdEJ1bmRsZS5oPgogCiAKLS8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGJhc3MgYm9vc3QKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGJhc3MgYm9vc3QKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnTHZtRWZmZWN0SW50ZXJmYWNlOwogCiAjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCkBAIC03MSw3ICs3MSw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdCYXNzQm9vc3REZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwNjM0ZjIyMCwgMHhkZGQ0LCAweDExZGIsIDB4YTBmYywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAogICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQKICAgICAgICAgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCiAgICAgICAgIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUsCkBAIC04NCw3ICs4NCw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXJ0dWFsaXplckRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDM3Y2MyYzAwLCAweGRkZGQsIDB4MTFkYiwgMHg4NTc3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5ECiAgICAgICAgIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBWSVJUVUFMSVpFUl9DVVBfTE9BRF9BUk05RSwKQEAgLTk3LDcgKzk3LDcgQEAKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCiAgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkIEVxIE5YUAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLApAQCAtMTA5LDcgKzEwOSw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWb2x1bWVEZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAogICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LCAvL3V1aWQgVk9MIE5YUAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgVk9MVU1FX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLApAQCAtMTg3LDcgKzE4Nyw3IEBACiBleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICAqcEludGVyZmFjZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNlc3Npb25ObzsKICAgICBpbnQgaTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAgICAgTE9HVigiXG5cdEVmZmVjdENyZWF0ZSBzdGFydCBzZXNzaW9uICVkIiwgc2Vzc2lvbklkKTsKIAotICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CiAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldCA9IC1FSU5WQUw7CiAgICAgICAgIGdvdG8gZXhpdDsKQEAgLTM1NSwxOSArMzU1LDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgICAgIH0KLSAgICAgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KU5VTEw7CisgICAgICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClOVUxMOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KXBDb250ZXh0OwogICAgIH0KICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmQuLlxuXG4iKTsKICAgICByZXR1cm4gcmV0OwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSl7Ci0gICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBpbnRlcmZhY2UpOwotICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaW50ZXJmYWNlOworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UmVsZWFzZSBzdGFydCAlcCIsIGhhbmRsZSk7CisgICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2Ugc3RhcnQgaW50ZXJmYWNlOiAlcCwgY29udGV4dCAlcCIsIGludGVyZmFjZSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIHN0YXJ0IGhhbmRsZTogJXAsIGNvbnRleHQgJXAiLCBoYW5kbGUsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RSZWxlYXNlIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTQ2MCw2ICs0NjAsMzQgQEAKIAogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEw7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBkZXNjID0gJmdCYXNzQm9vc3REZXNjcmlwdG9yOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVmlydHVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBkZXNjID0gJmdWaXJ0dWFsaXplckRlc2NyaXB0b3I7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBkZXNjID0gJmdFcXVhbGl6ZXJEZXNjcmlwdG9yOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVm9sdW1lRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgZGVzYyA9ICZnVm9sdW1lRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAgLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIEVmZmVjdEdldERlc2NyaXB0b3IgKi8KKwogdm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpewogICAgIExPR1YoIlx0THZtR2xvYmFsQnVuZGxlX2luaXQgc3RhcnQiKTsKICAgICBmb3IoaW50IGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspewpAQCAtNDkzLDE2ICs1MjEsMTYgQEAKICAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHN0YXJ0Iik7CiAKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTkyOCwxMCArOTU2LDEwIEBACiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTyk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKIAogICAgIG1lbWNweSgmcENvbnRleHQtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogCkBAIC0yNTQ1LDggKzI1NzMsOSBAQAogfSAvLyBuYW1lc3BhY2UKIH0gLy8gbmFtZXNwYWNlCiAKK2V4dGVybiAiQyIgewogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCi1leHRlcm4gIkMiIGludCBFZmZlY3RfcHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3QgICAgIHNlbGYsCitpbnQgRWZmZWN0X3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqaW5CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICpvdXRCdWZmZXIpewogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CkBAIC0yNjY2LDcgKzI2OTUsNyBAQAogfSAgIC8qIGVuZCBFZmZlY3RfcHJvY2VzcyAqLwogCiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IENvbW1hbmQgKi8KLWV4dGVybiAiQyIgaW50IEVmZmVjdF9jb21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCAgc2VsZiwKK2ludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaGFuZGxlX3QgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwQ21kRGF0YSwKQEAgLTMwMTYsMTEgKzMwNDUsMTEgQEAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CiAgICAgICAgIHsKICAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0Ugc3RhcnQiKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZV9lIGRldmljZSA9ICooYXVkaW9fZGV2aWNlX2UgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRldmljZSA9ICoodWludDMyX3QgKilwQ21kRGF0YTsKIAogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewotICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gREVWSUNFX1NQRUFLRVIpfHwoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKKyAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUil8fChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAorICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fQkFTU19CT09TVCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgdGVtcG9yYXJ5IGRpc2FibGUgTFZNX0JBU19CT09TVCIpOwpAQCAtMzA1MSw4ICszMDgwLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpewotICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gREVWSUNFX1NQRUFLRVIpfHwoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKKyAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUil8fChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAorICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiIpOwpAQCAtMzE2NCw5ICszMTkzLDU4IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBFZmZlY3RfY29tbWFuZCAqLwogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KK2ludCBFZmZlY3RfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCit7CisgICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBMT0dWKCJFZmZlY3RfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3dpdGNoKHBDb250ZXh0LT5FZmZlY3RUeXBlKSB7CisgICAgICAgIGNhc2UgTFZNX0JBU1NfQk9PU1Q6CisgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdCYXNzQm9vc3REZXNjcmlwdG9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZNX1ZJUlRVQUxJWkVSOgorICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnVmlydHVhbGl6ZXJEZXNjcmlwdG9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZNX0VRVUFMSVpFUjoKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0VxdWFsaXplckRlc2NyaXB0b3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVk1fVk9MVU1FOgorICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnVm9sdW1lRGVzY3JpcHRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIEVmZmVjdF9nZXREZXNjcmlwdG9yICovCisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnTHZtRWZmZWN0SW50ZXJmYWNlID0gewogICAgIEVmZmVjdF9wcm9jZXNzLAotICAgIEVmZmVjdF9jb21tYW5kCisgICAgRWZmZWN0X2NvbW1hbmQsCisgICAgRWZmZWN0X2dldERlc2NyaXB0b3IsCisgICAgTlVMTCwKIH07ICAgIC8qIGVuZCBnTHZtRWZmZWN0SW50ZXJmYWNlICovCiAKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICBuYW1lIDogIkVmZmVjdCBCdW5kbGUgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorICAgIHF1ZXJ5X251bV9lZmZlY3RzIDogYW5kcm9pZDo6RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzLAorICAgIHF1ZXJ5X2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFF1ZXJ5RWZmZWN0LAorICAgIGNyZWF0ZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCisgICAgcmVsZWFzZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAorICAgIGdldF9kZXNjcmlwdG9yIDogYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKK307CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMmI1MTAyOS4uNTYzNGNhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTE3LDkgKzE3LDkgQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCVU5ETEVfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEJhc3NCb29zdEFwaS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYmFzc2Jvb3N0Lmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZXF1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlydHVhbGl6ZXIuaD4KICNpbmNsdWRlIDxMVk0uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggOTA5N2UyMC4uNjYzZjhmZiAxMDA3NTUKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8RWZmZWN0UmV2ZXJiLmg+CiAjaW5jbHVkZSA8TFZSRVYuaD4KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlOwogCiAjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCkBAIC03Nyw3ICs3Nyw3IEBACiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7IDB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsgMHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZSB9IH0sCiAgICAgICAgIHsgMHg0YTM4N2ZjMCwgMHg4YWIzLCAweDExZGYsIDB4OGJhZCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCiAgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCkBAIC04OSw3ICs4OSw3IEBACiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCiAgICAgICAgIHsweGM3YTUxMWEwLCAweGEzYmIsIDB4MTFkZiwgMHg4NjBlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMLAogICAgICAgICBMVlJFVl9DVVBfTE9BRF9BUk05RSwKICAgICAgICAgTFZSRVZfTUVNX1VTQUdFLApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweGYyOWExNDAwLCAweGEzYmIsIDB4MTFkZiwgMHg4ZGRjLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKICAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIExWUkVWX01FTV9VU0FHRSwKQEAgLTExMyw3ICsxMTMsNyBAQAogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHgxNzJjZGYwMCwgMHhhM2JjLCAweDExZGYsIDB4YTcyZiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCwKICAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIExWUkVWX01FTV9VU0FHRSwKQEAgLTE5Miw3ICsxOTIsOCBAQAogICAgIHJldHVybiAwOwogfSAgICAgLyogZW5kIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpeworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcil7CiAgICAgTE9HVigiXG5cdEVmZmVjdFF1ZXJ5RWZmZWN0IHN0YXJ0Iik7CiAgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIGluZGV4ICVkIiwgaW5kZXgpOwogICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKXsKQEAgLTIxMSw3ICsyMTIsNyBAQAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgICAgICAgKnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgKnBJbnRlcmZhY2UpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBIYW5kbGUpewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CiAgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CkBAIC0yMTksNyArMjIwLDcgQEAKIAogICAgIExPR1YoIlx0XG5FZmZlY3RDcmVhdGUgc3RhcnQiKTsKIAotICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CiAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTI3MCw3ICsyNzEsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKICAgICAjaWZkZWYgTFZNX1BDTQogICAgIHBDb250ZXh0LT5QY21JblB0ciA9IE5VTEw7CkBAIC0yOTUsMTAgKzI5NiwxMCBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSl7Ci0gICAgUmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKFJldmVyYkNvbnRleHQgKilpbnRlcmZhY2U7CitleHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpeworICAgIFJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChSZXZlcmJDb250ZXh0ICopaGFuZGxlOwogCi0gICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlICVwIiwgaW50ZXJmYWNlKTsKKyAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgJXAiLCBoYW5kbGUpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RSZWxlYXNlIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTMxNSw2ICszMTYsMjggQEAKICAgICByZXR1cm4gMDsKIH0gLyogZW5kIEVmZmVjdFJlbGVhc2UgKi8KIAorZXh0ZXJuICJDIiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGludCBpOworICAgIGludCBsZW5ndGggPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgZ0Rlc2NyaXB0b3JzW2ldLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBSZXZlcmIgdHlwZSAlZCwgVVVJRCA9ICV4IiwKKyAgICAgICAgICAgICAgICAgaSwgZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLnRpbWVMb3cpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30gLyogZW5kIEVmZmVjdEdldERlc2NyaXB0b3IgKi8KKwogLyogbG9jYWwgZnVuY3Rpb25zICovCiAjZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQxOCw5ICs0NDEsOSBAQAogCiAKICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KLSAgICBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTykgeworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewogICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAyOwotICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBDSEFOTkVMX01PTk8pIHsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgewogICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtNjA4LDEyICs2MzEsMTIgQEAKIAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKLSAgICBDSEVDS19BUkcoKHBDb250ZXh0LT5hdXhpbGlhcnkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9NT05PKSB8fAotICAgICAgICAgICAgICAoKCFwQ29udGV4dC0+YXV4aWxpYXJ5KSAmJiBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTykpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pOworICAgIENIRUNLX0FSRygocENvbnRleHQtPmF1eGlsaWFyeSAmJiBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB8fAorICAgICAgICAgICAgICAoKCFwQ29udGV4dC0+YXV4aWxpYXJ5KSAmJiBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKIAogICAgIGlmKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSA0NDEwMCl7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNzAwLDIwICs3MjMsMjAgQEAKIAogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7Ci0gICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfTU9OTzsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKICAgICB9IGVsc2UgewotICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBDSEFOTkVMX1NURVJFTzsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgIH0KIAotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtODAwLDcgKzgyMyw3IEBACiAgICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT047CiAgICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTXzQ0MTAwOwogCi0gICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8peworICAgIGlmKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyl7CiAgICAgICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWTV9NT05POwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWTV9TVEVSRU87CkBAIC0xODMyLDggKzE4NTUsOSBAQAogfSAvLyBuYW1lc3BhY2UKIH0gLy8gbmFtZXNwYWNlCiAKK2V4dGVybiAiQyIgewogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCi1leHRlcm4gIkMiIGludCBSZXZlcmJfcHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3QgICBzZWxmLAoraW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICppbkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKm91dEJ1ZmZlcil7CiAgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKikgc2VsZjsKQEAgLTE4NjgsNyArMTg5Miw3IEBACiB9ICAgLyogZW5kIFJldmVyYl9wcm9jZXNzICovCiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLwotZXh0ZXJuICJDIiBpbnQgUmV2ZXJiX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90ICBzZWxmLAoraW50IFJldmVyYl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLApAQCAtMjA3NSw5ICsyMDk5LDU1IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBSZXZlcmJfY29tbWFuZCAqLwogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBSZXZlcmIgZWZmZWN0CisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCitpbnQgUmV2ZXJiX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICopc2VsZjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBMT0dWKCJSZXZlcmJfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKKyAgICAgICAgICAgIGRlc2MgPSAmYW5kcm9pZDo6Z0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gJmFuZHJvaWQ6OmdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIFJldmVyYl9nZXREZXNjcmlwdG9yICovCisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFJldmVyYiBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1JldmVyYkludGVyZmFjZSA9IHsKICAgICBSZXZlcmJfcHJvY2VzcywKLSAgICBSZXZlcmJfY29tbWFuZAorICAgIFJldmVyYl9jb21tYW5kLAorICAgIFJldmVyYl9nZXREZXNjcmlwdG9yLAorICAgIE5VTEwsCiB9OyAgICAvKiBlbmQgZ1JldmVyYkludGVyZmFjZSAqLwogCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgbmFtZSA6ICJSZXZlcmIgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorICAgIHF1ZXJ5X251bV9lZmZlY3RzIDogYW5kcm9pZDo6RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzLAorICAgIHF1ZXJ5X2VmZmVjdCA6IGFuZHJvaWQ6OkVmZmVjdFF1ZXJ5RWZmZWN0LAorICAgIGNyZWF0ZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCisgICAgcmVsZWFzZV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAorICAgIGdldF9kZXNjcmlwdG9yIDogYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKK307CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKaW5kZXggMDkzOTkyYi4uN2MxNWIxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKQEAgLTE3LDggKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9lbnZpcm9ubWVudGFscmV2ZXJiLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfcHJlc2V0cmV2ZXJiLmg+CiAKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc3ZDQwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBhdWRpbyBwcmVwcm9jZXNzaW5nIHdyYXBwZXIKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3ByZXByb2Nlc3NpbmcKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgUHJlUHJvY2Vzc2luZy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgZXh0ZXJuYWwvd2VicnRjL3NyYyBcCisgICAgZXh0ZXJuYWwvd2VicnRjL3NyYy9tb2R1bGVzL2ludGVyZmFjZSBcCisgICAgZXh0ZXJuYWwvd2VicnRjL3NyYy9tb2R1bGVzL2F1ZGlvX3Byb2Nlc3NpbmcvbWFpbi9pbnRlcmZhY2UgXAorICAgIHN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgc3BlZXgpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIFwKKyAgICBsaWJzcGVleHJlc2FtcGxlciBcCisgICAgbGlidXRpbHMKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTI4NmExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC0wLDAgKzEsMTYwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgTE9HX1RBRyAiUHJlUHJvY2Vzc2luZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgorI2luY2x1ZGUgIm1vZHVsZXMvaW50ZXJmYWNlL21vZHVsZV9jb21tb25fdHlwZXMuaCIKKyNpbmNsdWRlICJtb2R1bGVzL2F1ZGlvX3Byb2Nlc3NpbmcvbWFpbi9pbnRlcmZhY2UvYXVkaW9fcHJvY2Vzc2luZy5oIgorI2luY2x1ZGUgInNwZWV4L3NwZWV4X3Jlc2FtcGxlci5oIgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMKKyNkZWZpbmUgUFJFUFJPQ19OVU1fU0VTU0lPTlMgOAorCisvLyB0eXBlcyBvZiBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCitlbnVtIHByZXByb2NfaWQKK3sKKyAgICBQUkVQUk9DX0FHQywgICAgICAgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wKKyAgICBQUkVQUk9DX0FFQywgICAgICAgIC8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsZXIKKyAgICBQUkVQUk9DX05TLCAgICAgICAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgICBQUkVQUk9DX05VTV9FRkZFQ1RTCit9OworCisvLyBTZXNzaW9uIHN0YXRlCitlbnVtIHByZXByb2Nfc2Vzc2lvbl9zdGF0ZSB7CisgICAgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0lOSVQsICAgICAgICAvLyBpbml0aWFsaXplZAorICAgIFBSRVBST0NfU0VTU0lPTl9TVEFURV9DT05GSUcgICAgICAgLy8gY29uZmlndXJhdGlvbiByZWNlaXZlZAorfTsKKworLy8gRWZmZWN0L1ByZXByb2Nlc3NvciBzdGF0ZQorZW51bSBwcmVwcm9jX2VmZmVjdF9zdGF0ZSB7CisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVCwgICAgICAgICAvLyBpbml0aWFsaXplZAorICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQsICAgICAgLy8gd2ViUlRDIGVuZ2luZSBjcmVhdGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHLCAgICAgICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkL2Rpc2FibGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFICAgICAgICAvLyBhY3RpdmUvZW5hYmxlZAorfTsKKworLy8gaGFuZGxlIG9uIHdlYlJUQyBlbmdpbmUKK3R5cGVkZWYgdm9pZCogcHJlcHJvY19meF9oYW5kbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcHJlcHJvY19zZXNzaW9uX3MgcHJlcHJvY19zZXNzaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIHByZXByb2NfZWZmZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBwcmVwcm9jX29wc19zIHByZXByb2Nfb3BzX3Q7CisKKy8vIEVmZmVjdCBvcGVyYXRpb24gdGFibGUuIEZ1bmN0aW9ucyBmb3IgYWxsIHByZSBwcm9jZXNzb3JzIGFyZSBkZWNsYXJlZCBpbiBzUHJlUHJvY09wc1tdIHRhYmxlLgorLy8gRnVuY3Rpb24gcG9pbnRlciBjYW4gYmUgbnVsbCBpZiBubyBhY3Rpb24gcmVxdWlyZWQuCitzdHJ1Y3QgcHJlcHJvY19vcHNfcyB7CisgICAgaW50ICgqIGNyZWF0ZSkocHJlcHJvY19lZmZlY3RfdCAqZngpOworICAgIGludCAoKiBpbml0KShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CisgICAgaW50ICgqIHJlc2V0KShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CisgICAgdm9pZCAoKiBlbmFibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKKyAgICB2b2lkICgqIGRpc2FibGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKKyAgICBpbnQgKCogc2V0X3BhcmFtZXRlcikocHJlcHJvY19lZmZlY3RfdCAqZngsIHZvaWQgKnBhcmFtLCB2b2lkICp2YWx1ZSk7CisgICAgaW50ICgqIGdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgc2l6ZV90ICpzaXplLCB2b2lkICp2YWx1ZSk7CisgICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOworfTsKKworLy8gRWZmZWN0IGNvbnRleHQKK3N0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIHVpbnQzMl90IHByb2NJZDsgICAgICAgICAgICAgICAgLy8gdHlwZSBvZiBwcmUgcHJvY2Vzc29yIChlbnVtIHByZXByb2NfaWQpCisgICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHN0YXRlIChlbnVtIHByZXByb2NfZWZmZWN0X3N0YXRlKQorICAgIHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uOyAgICAgLy8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCisgICAgY29uc3QgcHJlcHJvY19vcHNfdCAqb3BzOyAgICAgICAvLyBlZmZlY3Qgb3BzIHRhYmxlCisgICAgcHJlcHJvY19meF9oYW5kbGVfdCBlbmdpbmU7ICAgICAvLyBoYW5kbGUgb24gd2ViUlRDIGVuZ2luZQorfTsKKworLy8gU2Vzc2lvbiBjb250ZXh0CitzdHJ1Y3QgcHJlcHJvY19zZXNzaW9uX3MgeworICAgIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIGVmZmVjdHNbUFJFUFJPQ19OVU1fRUZGRUNUU107IC8vIGVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uCisgICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUpCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGludCBpbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBvZiBpbnB1dCBzdHJlYW0gdGhpcyBzZXNzaW9uIGlzIG9uCisgICAgd2VicnRjOjpBdWRpb1Byb2Nlc3NpbmcqIGFwbTsgICAgICAgLy8gaGFuZGxlIG9uIHdlYlJUQyBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZSAoQVBNKQorICAgIHNpemVfdCBhcG1GcmFtZUNvdW50OyAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGZvciB3ZWJSVEMgcHJvY2VzcyAoMTAgbXMpCisgICAgdWludDMyX3QgYXBtU2FtcGxpbmdSYXRlOyAgICAgICAgICAgLy8gd2ViUlRDIEFQTSBzYW1wbGluZyByYXRlICg4LzE2IG9yIDMyIGtIeikKKyAgICBzaXplX3QgZnJhbWVDb3VudDsgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBiZWZvcmUgaW5wdXQgcmVzYW1wbGVyICggPD0+IGFwbUZyYW1lQ291bnQpCisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOyAgICAgICAgICAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhdCBlZmZlY3QgcHJvY2VzcyBpbnRlcmZhY2UKKyAgICB1aW50MzJfdCBpbkNoYW5uZWxDb3VudDsgICAgICAgICAgICAvLyBpbnB1dCBjaGFubmVsIGNvdW50CisgICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50OyAgICAgICAgICAgLy8gb3V0cHV0IGNoYW5uZWwgY291bnQKKyAgICB1aW50MzJfdCBjcmVhdGVkTXNrOyAgICAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgY3Jlc3RlZCBwcmUgcHJvY2Vzc29ycworICAgIHVpbnQzMl90IGVuYWJsZWRNc2s7ICAgICAgICAgICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCisgICAgdWludDMyX3QgcHJvY2Vzc2VkTXNrOyAgICAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAorICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcHJvY0ZyYW1lOyAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIFByb2Nlc3NTdHJlYW0oKQorICAgIGludDE2X3QgKmluQnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciB1c2VkIHdoZW4gcmVzYW1wbGluZworICAgIHNpemVfdCBpbkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplIGluIGZyYW1lcworICAgIHNpemVfdCBmcmFtZXNJbjsgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgaW4gaW5wdXQgYnVmZmVyCisgICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqaW5SZXNhbXBsZXI7ICAgLy8gaGFuZGxlIG9uIGlucHV0IHNwZWV4IHJlc2FtcGxlcgorICAgIGludDE2X3QgKm91dEJ1ZjsgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgdXNlZCB3aGVuIHJlc2FtcGxpbmcKKyAgICBzaXplX3Qgb3V0QnVmU2l6ZTsgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUgaW4gZnJhbWVzCisgICAgc2l6ZV90IGZyYW1lc091dDsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBvdXRwdXQgYnVmZmVyCisgICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqb3V0UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIG91dHB1dCBzcGVleCByZXNhbXBsZXIKKyAgICB1aW50MzJfdCByZXZDaGFubmVsQ291bnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMgb24gcmV2ZXJzZSBzdHJlYW0KKyAgICB1aW50MzJfdCByZXZFbmFibGVkTXNrOyAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgZW5hYmxlZCBwcmUgcHJvY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggcmV2ZXJzZSBjaGFubmVsCisgICAgdWludDMyX3QgcmV2UHJvY2Vzc2VkTXNrOyAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIHdpdGggcmV2ZXJzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgYWxyZWFkeSBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAorICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcmV2RnJhbWU7ICAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIEFuYWx5emVSZXZlcnNlU3RyZWFtKCkKKyAgICBpbnQxNl90ICpyZXZCdWY7ICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCisgICAgc2l6ZV90IHJldkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBjaGFubmVsIGlucHV0IGJ1ZmZlciBzaXplCisgICAgc2l6ZV90IGZyYW1lc1JldjsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCisgICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqcmV2UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBzcGVleCByZXNhbXBsZXIKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZmZlY3QgZGVzY3JpcHRvcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFVVSURzIGZvciBlZmZlY3QgdHlwZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbAorLy8gYXMgdGhlIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgYXJlIG5vdCBkZWZpbmVkIGJ5IE9wZW5TTCBFUworCisvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzQWdjRGVzY3JpcHRvciA9IHsKKyAgICAgICAgeyAweDBhOGFiZmUwLCAweDY1NGMsIDB4MTFlMCwgMHhiYTI2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB0eXBlCisgICAgICAgIHsgMHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0N8RUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKKyAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgIkF1dG9tYXRpYyBHYWluIENvbnRyb2wiLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKK307CisKKy8vIEFjb3VzdGljIEVjaG8gQ2FuY2VsbGF0aW9uCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzQWVjRGVzY3JpcHRvciA9IHsKKyAgICAgICAgeyAweDdiNDkxNDYwLCAweDhkNGQsIDB4MTFlMCwgMHhiZDYxLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB0eXBlCisgICAgICAgIHsgMHhiYjM5MmVjMCwgMHg4ZDRkLCAweDExZTAsIDB4YTg5NiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0N8RUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKKyAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgIkFjb3VzdGljIEVjaG8gQ2FuY2VsZXIiLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKK307CisKKy8vIE5vaXNlIHN1cHByZXNzaW9uCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzTnNEZXNjcmlwdG9yID0geworICAgICAgICB7IDB4NThiNGIyNjAsIDB4OGUwNiwgMHgxMWUwLCAweGFhOGUsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHR5cGUKKyAgICAgICAgeyAweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQ3xFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKKyAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQorICAgICAgICAiTm9pc2UgU3VwcHJlc3Npb24iLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKK307CisKKworc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKnNEZXNjcmlwdG9yc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKKyAgICAgICAgJnNBZ2NEZXNjcmlwdG9yLAorICAgICAgICAmc0FlY0Rlc2NyaXB0b3IsCisgICAgICAgICZzTnNEZXNjcmlwdG9yCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IHNVdWlkVG9QcmVQcm9jVGFibGVbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7CisgICAgICAgIEZYX0lJRF9BR0MsCisgICAgICAgIEZYX0lJRF9BRUMsCisgICAgICAgIEZYX0lJRF9OUworfTsKKworCitjb25zdCBlZmZlY3RfdXVpZF90ICogUHJvY0lkVG9VdWlkKGludCBwcm9jSWQpCit7CisgICAgaWYgKHByb2NJZCA+PSBQUkVQUk9DX05VTV9FRkZFQ1RTKSB7CisgICAgICAgIHJldHVybiBFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKyAgICByZXR1cm4gc1V1aWRUb1ByZVByb2NUYWJsZVtwcm9jSWRdOworfQorCit1aW50MzJfdCBVdWlkVG9Qcm9jSWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqIHV1aWQpCit7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKHV1aWQsIHNVdWlkVG9QcmVQcm9jVGFibGVbaV0sIHNpemVvZigqdXVpZCkpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpOworfQorCitib29sIEhhc1JldmVyc2VTdHJlYW0odWludDMyX3QgcHJvY0lkKQoreworICAgIGlmIChwcm9jSWQgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAoQUdDKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGludCBrQWdjRGVmYXVsdFRhcmdldExldmVsID0gMDsKK3N0YXRpYyBjb25zdCBpbnQga0FnY0RlZmF1bHRDb21wR2FpbiA9IDkwOworc3RhdGljIGNvbnN0IGJvb2wga0FnY0RlZmF1bHRMaW1pdGVyID0gdHJ1ZTsKKworaW50ICBBZ2NJbml0IChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCit7CisgICAgTE9HVigiQWdjSW5pdCIpOworICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIGFnYy0+c2V0X21vZGUod2VicnRjOjpHYWluQ29udHJvbDo6a0ZpeGVkRGlnaXRhbCk7CisgICAgYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoa0FnY0RlZmF1bHRUYXJnZXRMZXZlbCk7CisgICAgYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYihrQWdjRGVmYXVsdENvbXBHYWluKTsKKyAgICBhZ2MtPmVuYWJsZV9saW1pdGVyKGtBZ2NEZWZhdWx0TGltaXRlcik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCAgQWdjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKK3sKKyAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+Z2Fpbl9jb250cm9sKCk7CisgICAgTE9HVigiQWdjQ3JlYXRlIGdvdCBhZ2MgJXAiLCBhZ2MpOworICAgIGlmIChhZ2MgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJBZ2NDcmVhdGUgRXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorICAgIGVmZmVjdC0+ZW5naW5lID0gc3RhdGljX2Nhc3Q8cHJlcHJvY19meF9oYW5kbGVfdD4oYWdjKTsKKyAgICBBZ2NJbml0KGVmZmVjdCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFZhbHVlKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKKyAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7CisgICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGJvb2wpKSB7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFHQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodF9hZ2Nfc2V0dGluZ3MpKSB7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCIsIHBhcmFtKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKKyAgICAgICAgKihpbnQxNl90ICopIHBWYWx1ZSA9IChpbnQxNl90KShhZ2MtPnRhcmdldF9sZXZlbF9kYmZzKCkgKiAtMTAwKTsKKyAgICAgICAgTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVkIG1pbGxpQmVscyIsICooaW50MTZfdCAqKSBwVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICooaW50MTZfdCAqKSBwVmFsdWUgPSAoaW50MTZfdCkoYWdjLT5jb21wcmVzc2lvbl9nYWluX2RiKCkgKiAxMDApOworICAgICAgICBMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopIHBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgorICAgICAgICAqKGJvb2wgKikgcFZhbHVlID0gKGJvb2wpYWdjLT5pc19saW1pdGVyX2VuYWJsZWQoKTsKKyAgICAgICAgTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwKKyAgICAgICAgICAgICAoKihpbnQxNl90ICopIHBWYWx1ZSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFHQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICBwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgPSAoaW50MTZfdCkoYWdjLT50YXJnZXRfbGV2ZWxfZGJmcygpICogLTEwMCk7CisgICAgICAgIHBQcm9wZXJ0aWVzLT5jb21wR2FpbiA9IChpbnQxNl90KShhZ2MtPmNvbXByZXNzaW9uX2dhaW5fZGIoKSAqIDEwMCk7CisgICAgICAgIHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCA9IChib29sKWFnYy0+aXNfbGltaXRlcl9lbmFibGVkKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitpbnQgQWdjU2V0UGFyYW1ldGVyIChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKKyAgICB0X2FnY19zZXR0aW5ncyAqcFByb3BlcnRpZXMgPSAodF9hZ2Nfc2V0dGluZ3MgKilwVmFsdWU7CisgICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICBMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLSgqKGludDE2X3QgKilwVmFsdWUgLyAxMDApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgorICAgICAgICBMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfY29tcHJlc3Npb25fZ2Fpbl9kYigqKGludDE2X3QgKilwVmFsdWUgLyAxMDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKKyAgICAgICAgTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwgKihib29sICopcFZhbHVlID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIHN0YXR1cyA9IGFnYy0+ZW5hYmxlX2xpbWl0ZXIoKihib29sICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBR0NfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBsZXZlbCAlZCwgZ2FpbiAlZCBsaW1pdGVyICVkIiwKKyAgICAgICAgICAgICBwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwsCisgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmNvbXBHYWluLAorICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCk7CisgICAgICAgIHN0YXR1cyA9IGFnYy0+c2V0X3RhcmdldF9sZXZlbF9kYmZzKC0ocFByb3BlcnRpZXMtPnRhcmdldExldmVsIC8gMTAwKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgYnJlYWs7CisgICAgICAgIHN0YXR1cyA9IGFnYy0+c2V0X2NvbXByZXNzaW9uX2dhaW5fZGIocFByb3BlcnRpZXMtPmNvbXBHYWluIC8gMTAwKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSBicmVhazsKKyAgICAgICAgc3RhdHVzID0gYWdjLT5lbmFibGVfbGltaXRlcihwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJBZ2NTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgZG9uZSBzdGF0dXMgJWQiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBZ2NFbmFibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoreworICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIExPR1YoIkFnY0VuYWJsZSBhZ2MgJXAiLCBhZ2MpOworICAgIGFnYy0+RW5hYmxlKHRydWUpOworfQorCit2b2lkIEFnY0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoreworICAgIExPR1YoIkFnY0Rpc2FibGUiKTsKKyAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sICo+KGVmZmVjdC0+ZW5naW5lKTsKKyAgICBhZ2MtPkVuYWJsZShmYWxzZSk7Cit9CisKKworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FnY09wcyA9IHsKKyAgICAgICAgQWdjQ3JlYXRlLAorICAgICAgICBBZ2NJbml0LAorICAgICAgICBOVUxMLAorICAgICAgICBBZ2NFbmFibGUsCisgICAgICAgIEFnY0Rpc2FibGUsCisgICAgICAgIEFnY1NldFBhcmFtZXRlciwKKyAgICAgICAgQWdjR2V0UGFyYW1ldGVyLAorICAgICAgICBOVUxMCit9OworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyIChBRUMpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY29uc3Qgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUga0FlY0RlZmF1bHRNb2RlID0KKyAgICAgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOworc3RhdGljIGNvbnN0IGJvb2wga0FlY0RlZmF1bHRDb21mb3J0Tm9pc2UgPSB0cnVlOworCitpbnQgIEFlY0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKK3sKKyAgICBMT0dWKCJBZWNJbml0Iik7CisgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgYWVjLT5zZXRfcm91dGluZ19tb2RlKGtBZWNEZWZhdWx0TW9kZSk7CisgICAgYWVjLT5lbmFibGVfY29tZm9ydF9ub2lzZShrQWVjRGVmYXVsdENvbWZvcnROb2lzZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCAgQWVjQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKK3sKKyAgICB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlICphZWMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+ZWNob19jb250cm9sX21vYmlsZSgpOworICAgIExPR1YoIkFlY0NyZWF0ZSBnb3QgYWVjICVwIiwgYWVjKTsKKyAgICBpZiAoYWVjID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiQWdjQ3JlYXRlIEVycm9yIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICBlZmZlY3QtPmVuZ2luZSA9IHN0YXRpY19jYXN0PHByZXByb2NfZnhfaGFuZGxlX3Q+KGFlYyk7CisgICAgQWVjSW5pdCAoZWZmZWN0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFlY0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90ICAgICAqZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QgKilwUGFyYW07CisKKyAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBBRUNfUEFSQU1fRUNIT19ERUxBWToKKyAgICBjYXNlIEFFQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMTAwMCAqIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zdHJlYW1fZGVsYXlfbXMoKTsKKyAgICAgICAgTE9HVigiQWVjR2V0UGFyYW1ldGVyKCkgZWNobyBkZWxheSAlZCB1cyIsICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJBZWNHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBBZWNTZXRQYXJhbWV0ZXIgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90ICopcFBhcmFtOworICAgIHVpbnQzMl90IHZhbHVlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgorICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgIHN0YXR1cyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zZXRfc3RyZWFtX2RlbGF5X21zKHZhbHVlLzEwMDApOworICAgICAgICBMT0dWKCJBZWNTZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzLCBzdGF0dXMgJWQiLCB2YWx1ZSwgc3RhdHVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiQWVjU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEFlY0VuYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCit7CisgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgTE9HVigiQWVjRW5hYmxlIGFlYyAlcCIsIGFlYyk7CisgICAgYWVjLT5FbmFibGUodHJ1ZSk7Cit9CisKK3ZvaWQgQWVjRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCit7CisgICAgTE9HVigiQWVjRGlzYWJsZSIpOworICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIGFlYy0+RW5hYmxlKGZhbHNlKTsKK30KKworaW50IEFlY1NldERldmljZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHVpbnQzMl90IGRldmljZSkKK3sKKyAgICBMT0dWKCJBZWNTZXREZXZpY2UgJTA4eCIsIGRldmljZSk7CisgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6Um91dGluZ01vZGUgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtRdWlldEVhcnBpZWNlT3JIZWFkc2V0OworCisgICAgc3dpdGNoKGRldmljZSkgeworICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKKyAgICAgICAgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtFYXJwaWVjZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIG1vZGUgPSB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlOjprU3BlYWtlcnBob25lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBhZWMtPnNldF9yb3V0aW5nX21vZGUobW9kZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNBZWNPcHMgPSB7CisgICAgICAgIEFlY0NyZWF0ZSwKKyAgICAgICAgQWVjSW5pdCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgQWVjRW5hYmxlLAorICAgICAgICBBZWNEaXNhYmxlLAorICAgICAgICBBZWNTZXRQYXJhbWV0ZXIsCisgICAgICAgIEFlY0dldFBhcmFtZXRlciwKKyAgICAgICAgQWVjU2V0RGV2aWNlCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9pc2UgU3VwcHJlc3Npb24gKE5TKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbjo6TGV2ZWwga05zRGVmYXVsdExldmVsID0gd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uOjprTW9kZXJhdGU7CisKK2ludCAgTnNJbml0IChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCit7CisgICAgTE9HVigiTnNJbml0Iik7CisgICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqPihlZmZlY3QtPmVuZ2luZSk7CisgICAgbnMtPnNldF9sZXZlbChrTnNEZWZhdWx0TGV2ZWwpOworICAgIHJldHVybiAwOworfQorCitpbnQgIE5zQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKK3sKKyAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKm5zID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPm5vaXNlX3N1cHByZXNzaW9uKCk7CisgICAgTE9HVigiTnNDcmVhdGUgZ290IG5zICVwIiwgbnMpOworICAgIGlmIChucyA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIkFnY0NyZWF0ZSBFcnJvciIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgZWZmZWN0LT5lbmdpbmUgPSBzdGF0aWNfY2FzdDxwcmVwcm9jX2Z4X2hhbmRsZV90Pihucyk7CisgICAgTnNJbml0IChlZmZlY3QpOworICAgIHJldHVybiAwOworfQorCitpbnQgTnNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAgICAgKmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IE5zU2V0UGFyYW1ldGVyIChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgTnNFbmFibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoreworICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIExPR1YoIk5zRW5hYmxlIG5zICVwIiwgbnMpOworICAgIG5zLT5FbmFibGUodHJ1ZSk7Cit9CisKK3ZvaWQgTnNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKK3sKKyAgICBMT0dWKCJOc0Rpc2FibGUiKTsKKyAgICB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKm5zID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICo+KGVmZmVjdC0+ZW5naW5lKTsKKyAgICBucy0+RW5hYmxlKGZhbHNlKTsKK30KKworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc05zT3BzID0geworICAgICAgICBOc0NyZWF0ZSwKKyAgICAgICAgTnNJbml0LAorICAgICAgICBOVUxMLAorICAgICAgICBOc0VuYWJsZSwKKyAgICAgICAgTnNEaXNhYmxlLAorICAgICAgICBOc1NldFBhcmFtZXRlciwKKyAgICAgICAgTnNHZXRQYXJhbWV0ZXIsCisgICAgICAgIE5VTEwKK307CisKKworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3QgKnNQcmVQcm9jT3BzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0geworICAgICAgICAmc0FnY09wcywKKyAgICAgICAgJnNBZWNPcHMsCisgICAgICAgICZzTnNPcHMKK307CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpOworCitleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3Mgc0VmZmVjdEludGVyZmFjZTsKK2V4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZTsKKworI2RlZmluZSBCQURfU1RBVEVfQUJPUlQoZnJvbSwgdG8pIFwKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQmFkIHN0YXRlIHRyYW5zaXRpb24gZnJvbSAlZCB0byAlZCIsIGZyb20sIHRvKTsKKworaW50IEVmZmVjdF9TZXRTdGF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHVpbnQzMl90IHN0YXRlKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIExPR1YoIkVmZmVjdF9TZXRTdGF0ZSBwcm9jICVkLCBuZXcgJWQgb2xkICVkIiwgZWZmZWN0LT5wcm9jSWQsIHN0YXRlLCBlZmZlY3QtPnN0YXRlKTsKKyAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgIHN3aXRjaChlZmZlY3QtPnN0YXRlKSB7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmRpc2FibGUoZWZmZWN0KTsKKyAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgZmFsc2UpOworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBzdGF0dXMgPSBlZmZlY3QtPm9wcy0+Y3JlYXRlKGVmZmVjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICBMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7CisgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgeworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7CisgICAgICAgICAgICBzdGF0dXMgPSAtRU5PU1lTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmRpc2FibGUoZWZmZWN0KTsKKyAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgIHN3aXRjaChlZmZlY3QtPnN0YXRlKSB7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIExPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9TWVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CisgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZW5hYmxlKGVmZmVjdCk7CisgICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBlZmZlY3QtPnN0YXRlID0gc3RhdGU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBFZmZlY3RfSW5pdChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHVpbnQzMl90IHByb2NJZCkKK3sKKyAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CisgICAgICAgIGVmZmVjdC0+aXRmZSA9ICZzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBlZmZlY3QtPml0ZmUgPSAmc0VmZmVjdEludGVyZmFjZTsKKyAgICB9CisgICAgZWZmZWN0LT5vcHMgPSBzUHJlUHJvY09wc1twcm9jSWRdOworICAgIGVmZmVjdC0+cHJvY0lkID0gcHJvY0lkOworICAgIGVmZmVjdC0+c3RhdGUgPSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOworICAgIHJldHVybiAwOworfQorCitpbnQgRWZmZWN0X0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsCisgICAgICAgICAgICAgICBwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKmludGVyZmFjZSkKK3sKKyAgICBlZmZlY3QtPnNlc3Npb24gPSBzZXNzaW9uOworICAgICppbnRlcmZhY2UgPSAoZWZmZWN0X2hhbmRsZV90KSZlZmZlY3QtPml0ZmU7CisgICAgcmV0dXJuIEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQpOworfQorCitpbnQgRWZmZWN0X1JlbGVhc2UocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoreworICAgIHJldHVybiBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUKTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2Vzc2lvbiBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgUkVTQU1QTEVSX1FVQUxJVFkgU1BFRVhfUkVTQU1QTEVSX1FVQUxJVFlfVk9JUAorCitzdGF0aWMgY29uc3QgaW50IGtQcmVwcm9jRGVmYXVsdFNyID0gMTYwMDA7CitzdGF0aWMgY29uc3QgaW50IGtQcmVQcm9jRGVmYXVsdENubCA9IDE7CisKK2ludCBTZXNzaW9uX0luaXQocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24pCit7CisgICAgc2l6ZV90IGk7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBzZXNzaW9uLT5zdGF0ZSA9IFBSRVBST0NfU0VTU0lPTl9TVEFURV9JTklUOworICAgIHNlc3Npb24tPmlkID0gMDsKKyAgICBzZXNzaW9uLT5pbyA9IDA7CisgICAgc2Vzc2lvbi0+Y3JlYXRlZE1zayA9IDA7CisgICAgc2Vzc2lvbi0+YXBtID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUyAmJiBzdGF0dXMgPT0gMDsgaSsrKSB7CisgICAgICAgIHN0YXR1cyA9IEVmZmVjdF9Jbml0KCZzZXNzaW9uLT5lZmZlY3RzW2ldLCBpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitleHRlcm4gIkMiIGludCBTZXNzaW9uX0NyZWF0ZUVmZmVjdChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqaW50ZXJmYWNlKQoreworICAgIGludCBzdGF0dXMgPSAtRU5PTUVNOworCisgICAgTE9HVigiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgcHJvY0lkICVkLCBjcmVhdGVkTXNrICUwOHgiLCBwcm9jSWQsIHNlc3Npb24tPmNyZWF0ZWRNc2spOworCisgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgeworICAgICAgICBzZXNzaW9uLT5hcG0gPSB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q3JlYXRlKHNlc3Npb24tPmlvKTsKKyAgICAgICAgaWYgKHNlc3Npb24tPmFwbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dXKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBjb3VsZCBub3QgZ2V0IGFwbSBlbmdpbmUiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+YXBtLT5zZXRfc2FtcGxlX3JhdGVfaHooa1ByZXByb2NEZWZhdWx0U3IpOworICAgICAgICBzZXNzaW9uLT5hcG0tPnNldF9udW1fY2hhbm5lbHMoa1ByZVByb2NEZWZhdWx0Q25sLCBrUHJlUHJvY0RlZmF1bHRDbmwpOworICAgICAgICBzZXNzaW9uLT5hcG0tPnNldF9udW1fcmV2ZXJzZV9jaGFubmVscyhrUHJlUHJvY0RlZmF1bHRDbmwpOworICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUgPSBuZXcgd2VicnRjOjpBdWRpb0ZyYW1lKCk7CisgICAgICAgIGlmIChzZXNzaW9uLT5wcm9jRnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVygiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgY291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGZyYW1lIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHNlc3Npb24tPnJldkZyYW1lID0gbmV3IHdlYnJ0Yzo6QXVkaW9GcmFtZSgpOworICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2RnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVygiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgY291bGQgbm90IGFsbG9jYXRlIHJldmVyc2UgYXVkaW8gZnJhbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlID0ga1ByZXByb2NEZWZhdWx0U3I7CisgICAgICAgIHNlc3Npb24tPmFwbUZyYW1lQ291bnQgPSAoa1ByZXByb2NEZWZhdWx0U3IpIC8gMTAwOworICAgICAgICBzZXNzaW9uLT5mcmFtZUNvdW50ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKKyAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlID0ga1ByZXByb2NEZWZhdWx0U3I7CisgICAgICAgIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID0ga1ByZVByb2NEZWZhdWx0Q25sOworICAgICAgICBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgPSBrUHJlUHJvY0RlZmF1bHRDbmw7CisgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+X2ZyZXF1ZW5jeUluSHogPSBrUHJlcHJvY0RlZmF1bHRTcjsKKyAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fYXVkaW9DaGFubmVsID0ga1ByZVByb2NEZWZhdWx0Q25sOworICAgICAgICBzZXNzaW9uLT5yZXZDaGFubmVsQ291bnQgPSBrUHJlUHJvY0RlZmF1bHRDbmw7CisgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5fZnJlcXVlbmN5SW5IeiA9IGtQcmVwcm9jRGVmYXVsdFNyOworICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+X2F1ZGlvQ2hhbm5lbCA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyAgICAgICAgc2Vzc2lvbi0+ZW5hYmxlZE1zayA9IDA7CisgICAgICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayA9IDA7CisgICAgICAgIHNlc3Npb24tPnJldkVuYWJsZWRNc2sgPSAwOworICAgICAgICBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgPSAwOworICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIHNlc3Npb24tPmluQnVmID0gTlVMTDsKKyAgICAgICAgc2Vzc2lvbi0+aW5CdWZTaXplID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID0gTlVMTDsKKyAgICAgICAgc2Vzc2lvbi0+b3V0QnVmID0gTlVMTDsKKyAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSA9IDA7CisgICAgICAgIHNlc3Npb24tPnJldlJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IE5VTEw7CisgICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgPSAwOworICAgIH0KKyAgICBzdGF0dXMgPSBFZmZlY3RfQ3JlYXRlKCZzZXNzaW9uLT5lZmZlY3RzW3Byb2NJZF0sIHNlc3Npb24sIGludGVyZmFjZSk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgTE9HVigiU2Vzc2lvbl9DcmVhdGVFZmZlY3QgT0siKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrIHw9ICgxPDxwcm9jSWQpOworICAgIHJldHVybiBzdGF0dXM7CisKK2Vycm9yOgorICAgIGlmIChzZXNzaW9uLT5jcmVhdGVkTXNrID09IDApIHsKKyAgICAgICAgZGVsZXRlIHNlc3Npb24tPnJldkZyYW1lOworICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZSA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5wcm9jRnJhbWU7CisgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IE5VTEw7CisgICAgICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpEZXN0cm95KHNlc3Npb24tPmFwbSk7CisgICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBTZXNzaW9uX1JlbGVhc2VFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4KQoreworICAgIExPR1dfSUYoRWZmZWN0X1JlbGVhc2UoZngpICE9IDAsICIgRWZmZWN0X1JlbGVhc2UoKSBmYWlsZWQgZm9yIHByb2MgSUQgJWQiLCBmeC0+cHJvY0lkKTsKKyAgICBzZXNzaW9uLT5jcmVhdGVkTXNrICY9IH4oMTw8ZngtPnByb2NJZCk7CisgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgeworICAgICAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6RGVzdHJveShzZXNzaW9uLT5hcG0pOworICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOworICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cHJvY0ZyYW1lOworICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUgPSBOVUxMOworICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cmV2RnJhbWU7CisgICAgICAgIHNlc3Npb24tPnJldkZyYW1lID0gTlVMTDsKKyAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPmluUmVzYW1wbGVyKTsKKyAgICAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7CisgICAgICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+cmV2UmVzYW1wbGVyKTsKKyAgICAgICAgICAgIHNlc3Npb24tPnJldlJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHNlc3Npb24tPmluQnVmOworICAgICAgICBzZXNzaW9uLT5pbkJ1ZiA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5vdXRCdWY7CisgICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5yZXZCdWY7CisgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IE5VTEw7CisKKyAgICAgICAgc2Vzc2lvbi0+aW8gPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBTZXNzaW9uX1NldENvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCit7CisgICAgdWludDMyX3Qgc3I7CisgICAgdWludDMyX3QgaW5DbmwgPSBwb3Bjb3VudChjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBvdXRDbmwgPSBwb3Bjb3VudChjb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CisKKyAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlIHx8CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBMT0dWKCJTZXNzaW9uX1NldENvbmZpZyBzciAlZCBjbmwgJTA4eCIsCisgICAgICAgICBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisgICAgaW50IHN0YXR1czsKKworICAgIC8vIEFFQyBpbXBsZW1lbnRhdGlvbiBpcyBsaW1pdGVkIHRvIDE2a0h6CisgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID49IDMyMDAwICYmICEoc2Vzc2lvbi0+Y3JlYXRlZE1zayAmICgxIDw8IFBSRVBST0NfQUVDKSkpIHsKKyAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlID0gMzIwMDA7CisgICAgfSBlbHNlCisgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID49IDE2MDAwKSB7CisgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IDE2MDAwOworICAgIH0gZWxzZSBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPj0gODAwMCkgeworICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgPSA4MDAwOworICAgIH0KKyAgICBzdGF0dXMgPSBzZXNzaW9uLT5hcG0tPnNldF9zYW1wbGVfcmF0ZV9oeihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzdGF0dXMgPSBzZXNzaW9uLT5hcG0tPnNldF9udW1fY2hhbm5lbHMoaW5DbmwsIG91dENubCk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN0YXR1cyA9IHNlc3Npb24tPmFwbS0+c2V0X251bV9yZXZlcnNlX2NoYW5uZWxzKGluQ25sKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPSBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKyAgICBzZXNzaW9uLT5hcG1GcmFtZUNvdW50ID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlIC8gMTAwOworICAgIGlmIChzZXNzaW9uLT5zYW1wbGluZ1JhdGUgPT0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSB7CisgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSAoc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCAqIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSkgLworICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSAgKyAxOworICAgIH0KKyAgICBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9IGluQ25sOworICAgIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCA9IG91dENubDsKKyAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPl9hdWRpb0NoYW5uZWwgPSBpbkNubDsKKyAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPl9mcmVxdWVuY3lJbkh6ID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlOworCisgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0gaW5Dbmw7CisgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPl9hdWRpb0NoYW5uZWwgPSBpbkNubDsKKyAgICBzZXNzaW9uLT5yZXZGcmFtZS0+X2ZyZXF1ZW5jeUluSHogPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGU7CisKKyAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5pblJlc2FtcGxlcik7CisgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNlc3Npb24tPm91dFJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7CisgICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5yZXZSZXNhbXBsZXIpOworICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAoc2Vzc2lvbi0+c2FtcGxpbmdSYXRlICE9IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSkgeworICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVygiU2Vzc2lvbl9TZXRDb25maWcgQ2Fubm90IGNyZWF0ZSBzcGVleCByZXNhbXBsZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3N0cmVycm9yKGVycm9yKSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBzcGVleF9yZXNhbXBsZXJfaW5pdChzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR1coIlNlc3Npb25fU2V0Q29uZmlnIENhbm5vdCBjcmVhdGUgc3BlZXggcmVzYW1wbGVyOiAlcyIsCisgICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOworICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOworICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR1coIlNlc3Npb25fU2V0Q29uZmlnIENhbm5vdCBjcmVhdGUgc3BlZXggcmVzYW1wbGVyOiAlcyIsCisgICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOworICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOworICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOworICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKKyAgICAgICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNlc3Npb24tPnN0YXRlID0gUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0NPTkZJRzsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCit7CisgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0IHx8CisgICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBMT0dWKCJTZXNzaW9uX1NldFJldmVyc2VDb25maWcgc3IgJWQgY25sICUwOHgiLAorICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOworCisgICAgaWYgKHNlc3Npb24tPnN0YXRlIDwgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0NPTkZJRykgeworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHNlc3Npb24tPnNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHVpbnQzMl90IGluQ25sID0gcG9wY291bnQoY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisgICAgaW50IHN0YXR1cyA9IHNlc3Npb24tPmFwbS0+c2V0X251bV9yZXZlcnNlX2NoYW5uZWxzKGluQ25sKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0gaW5Dbmw7CisgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPl9hdWRpb0NoYW5uZWwgPSBpbkNubDsKKyAgICBzZXNzaW9uLT5yZXZGcmFtZS0+X2ZyZXF1ZW5jeUluSHogPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgaWYoc2Vzc2lvbi0+ZW5hYmxlZE1zayA9PSAwKSB7CisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ID0gMDsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5lbmFibGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CisgICAgICAgIGlmIChIYXNSZXZlcnNlU3RyZWFtKHByb2NJZCkpIHsKKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiA9IDA7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcmVzZXRfbWVtKHNlc3Npb24tPnJldlJlc2FtcGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uLT5lbmFibGVkTXNrICY9IH4oMSA8PCBwcm9jSWQpOworICAgICAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CisgICAgICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrICY9IH4oMSA8PCBwcm9jSWQpOworICAgICAgICB9CisgICAgfQorICAgIExPR1YoIlNlc3Npb25fU2V0UHJvY0VuYWJsZWQgcHJvYyAlZCwgZW5hYmxlZCAlZCBlbmFibGVkTXNrICUwOHggcmV2RW5hYmxlZE1zayAlMDh4IiwKKyAgICAgICAgIHByb2NJZCwgZW5hYmxlZCwgc2Vzc2lvbi0+ZW5hYmxlZE1zaywgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zayk7CisgICAgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrID0gMDsKKyAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CisgICAgICAgIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayA9IDA7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVuZGxlIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBzSW5pdFN0YXR1cyA9IDE7CitzdGF0aWMgcHJlcHJvY19zZXNzaW9uX3Qgc1Nlc3Npb25zW1BSRVBST0NfTlVNX1NFU1NJT05TXTsKKworcHJlcHJvY19zZXNzaW9uX3QgKlByZVByb2NfR2V0U2Vzc2lvbihpbnQzMl90IHByb2NJZCwgaW50MzJfdCAgc2Vzc2lvbklkLCBpbnQzMl90ICBpb0lkKQoreworICAgIHNpemVfdCBpOworICAgIGludCBmcmVlID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX1NFU1NJT05TOyBpKyspIHsKKyAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pbyA9PSBpb0lkKSB7CisgICAgICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmNyZWF0ZWRNc2sgJiAoMSA8PCBwcm9jSWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gJnNTZXNzaW9uc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fU0VTU0lPTlM7IGkrKykgeworICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlvID09IDApIHsKKyAgICAgICAgICAgIHNTZXNzaW9uc1tpXS5pZCA9IHNlc3Npb25JZDsKKyAgICAgICAgICAgIHNTZXNzaW9uc1tpXS5pbyA9IGlvSWQ7CisgICAgICAgICAgICByZXR1cm4gJnNTZXNzaW9uc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQgUHJlUHJvY19Jbml0KCkgeworICAgIHNpemVfdCBpOworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgaWYgKHNJbml0U3RhdHVzIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fU0VTU0lPTlMgJiYgc3RhdHVzID09IDA7IGkrKykgeworICAgICAgICBzdGF0dXMgPSBTZXNzaW9uX0luaXQoJnNTZXNzaW9uc1tpXSk7CisgICAgfQorICAgIHNJbml0U3RhdHVzID0gc3RhdHVzOworICAgIHJldHVybiBzSW5pdFN0YXR1czsKK30KKworY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqUHJlUHJvY19HZXREZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKCZzRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNEZXNjcmlwdG9yc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitleHRlcm4gIkMiIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKm91dEJ1ZmZlcikKK3sKKyAgICBwcmVwcm9jX2VmZmVjdF90ICogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QgKilzZWxmOworICAgIGludCAgICBzdGF0dXMgPSAwOworCisgICAgaWYgKGVmZmVjdCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MoKSBFUlJPUiBlZmZlY3QgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcHJlcHJvY19zZXNzaW9uX3QgKiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90ICopZWZmZWN0LT5zZXNzaW9uOworCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKKyAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwpeworICAgICAgICBMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcygpIEVSUk9SIGJhZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayB8PSAoMTw8ZWZmZWN0LT5wcm9jSWQpOworCisvLyAgICBMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcyBJbiAlZCBmcmFtZXMgZW5hYmxlZE1zayAlMDh4IHByb2Nlc3NlZE1zayAlMDh4IiwKKy8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnByb2Nlc3NlZE1zayk7CisKKyAgICBpZiAoKHNlc3Npb24tPnByb2Nlc3NlZE1zayAmIHNlc3Npb24tPmVuYWJsZWRNc2spID09IHNlc3Npb24tPmVuYWJsZWRNc2spIHsKKyAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOworICAgICAgICBzaXplX3QgZnJhbWVzUnEgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIHNpemVfdCBmcmFtZXNXciA9IDA7CisgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNPdXQpIHsKKyAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lc091dDsKKyAgICAgICAgICAgIGlmIChvdXRCdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgICAgIGZyID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmLAorICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKKyAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgKHNlc3Npb24tPmZyYW1lc091dCAtIGZyKSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgLT0gZnI7CisgICAgICAgICAgICBmcmFtZXNXciArPSBmcjsKKyAgICAgICAgfQorICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNXcjsKKyAgICAgICAgaWYgKGZyYW1lc1dyID09IGZyYW1lc1JxKSB7CisgICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uLT5pblJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzSW47CisgICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5CdWZTaXplIDwgc2Vzc2lvbi0+ZnJhbWVzSW4gKyBmcikgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmU2l6ZSA9IHNlc3Npb24tPmZyYW1lc0luICsgZnI7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+aW5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZlNpemUgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+aW5CdWYgKyBzZXNzaW9uLT5mcmFtZXNJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luICs9IGZyOworICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcjsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzSW47CisgICAgICAgICAgICBzaXplX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+aW5SZXNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fcGF5bG9hZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPl9wYXlsb2FkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5pbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZiArIGZySW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzSW4gLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luIC09IGZySW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzSW47CisgICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fcGF5bG9hZERhdGEgKyBzZXNzaW9uLT5mcmFtZXNJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiArPSBmcjsKKyAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzSW4gPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fcGF5bG9hZERhdGFMZW5ndGhJblNhbXBsZXMgPQorICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbUZyYW1lQ291bnQgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudDsKKworICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+UHJvY2Vzc1N0cmVhbShzZXNzaW9uLT5wcm9jRnJhbWUpOworCisgICAgICAgIGlmIChzZXNzaW9uLT5vdXRCdWZTaXplIDwgc2Vzc2lvbi0+ZnJhbWVzT3V0ICsgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSA9IHNlc3Npb24tPmZyYW1lc091dCArIHNlc3Npb24tPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+b3V0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5vdXRSZXNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fcGF5bG9hZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIHNlc3Npb24tPmZyYW1lc091dCAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2ludChzZXNzaW9uLT5vdXRSZXNhbXBsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPl9wYXlsb2FkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCArPSBmck91dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYgKyBzZXNzaW9uLT5mcmFtZXNPdXQgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5fcGF5bG9hZERhdGEsCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVDb3VudCAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgKz0gc2Vzc2lvbi0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZXNPdXQ7CisgICAgICAgIGlmIChmcmFtZXNScSAtIGZyYW1lc1dyIDwgZnIpIHsKKyAgICAgICAgICAgIGZyID0gZnJhbWVzUnEgLSBmcmFtZXNXcjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5zMTYgKyBmcmFtZXNXciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmLAorICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYsCisgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0IC09IGZyOworICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKz0gZnI7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KK30KKworaW50IFByZVByb2Nlc3NpbmdGeF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKQoreworICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoZWZmZWN0ID09IE5VTEwpeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvL0xPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworCisgICAgc3dpdGNoIChjbWRDb2RlKXsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5pbml0KSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmluaXQoZWZmZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgID09IE5VTEx8fAorICAgICAgICAgICAgICAgIGNtZFNpemUgICAgICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpfHwKKyAgICAgICAgICAgICAgICBwUmVwbHlEYXRhICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplICAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBTZXNzaW9uX1NldENvbmZpZyhlZmZlY3QtPnNlc3Npb24sIChlZmZlY3RfY29uZmlnX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICBpZiAoKihpbnQgKilwUmVwbHlEYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFX1JFVkVSU0U6CisgICAgICAgICAgICBpZiAocENtZERhdGEgICAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCl8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgID09IE5VTEx8fAorICAgICAgICAgICAgICAgICpyZXBseVNpemUgICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0NPTkZJR1VSRV9SRVZFUlNFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopcENtZERhdGEpOworICAgICAgICAgICAgaWYgKCooaW50ICopcFJlcGx5RGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgICAgICBpZiAoZWZmZWN0LT5vcHMtPnJlc2V0KSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPnJlc2V0KGVmZmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoaW50KXNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KXNpemVvZihlZmZlY3RfcGFyYW1fdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKworICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gZWZmZWN0LT5vcHMtPmdldF9wYXJhbWV0ZXIoZWZmZWN0LCBwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOnsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gZWZmZWN0LT5vcHMtPnNldF9wYXJhbWV0ZXIoZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhICA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZWZmZWN0LT5vcHMtPnNldF9kZXZpY2UpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+c2V0X2RldmljZShlZmZlY3QsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBwcmVwcm9jX2VmZmVjdF90ICogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QgKikgc2VsZjsKKworICAgIGlmIChlZmZlY3QgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1lbWNweShwRGVzY3JpcHRvciwgc0Rlc2NyaXB0b3JzW2VmZmVjdC0+cHJvY0lkXSwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqb3V0QnVmZmVyKQoreworICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKXNlbGY7CisgICAgaW50ICAgIHN0YXR1cyA9IDA7CisKKyAgICBpZiAoZWZmZWN0ID09IE5VTEwpeworICAgICAgICBMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UoKSBFUlJPUiBlZmZlY3QgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcHJlcHJvY19zZXNzaW9uX3QgKiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90ICopZWZmZWN0LT5zZXNzaW9uOworCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCl7CisgICAgICAgIExPR1coIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZSgpIEVSUk9SIGJhZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayB8PSAoMTw8ZWZmZWN0LT5wcm9jSWQpOworCisvLyAgICBMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UgSW4gJWQgZnJhbWVzIHJldkVuYWJsZWRNc2sgJTA4eCByZXZQcm9jZXNzZWRNc2sgJTA4eCIsCisvLyAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2spOworCisKKyAgICBpZiAoKHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayAmIHNlc3Npb24tPnJldkVuYWJsZWRNc2spID09IHNlc3Npb24tPnJldkVuYWJsZWRNc2spIHsKKyAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgPSAwOworICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNSZXY7CisgICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgeworICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2QnVmU2l6ZSA8IHNlc3Npb24tPmZyYW1lc1JldiArIGZyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmU2l6ZSA9IHNlc3Npb24tPmZyYW1lc1JldiArIGZyOworICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IChpbnQxNl90ICopcmVhbGxvYyhzZXNzaW9uLT5yZXZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmU2l6ZSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYgKyBzZXNzaW9uLT5mcmFtZXNSZXYgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgKz0gZnI7CisgICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyOworICAgICAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc1JldiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzUmV2OworICAgICAgICAgICAgc2l6ZV90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPnJldlJlc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPl9wYXlsb2FkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWRfaW50KHNlc3Npb24tPnJldlJlc2FtcGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPl9wYXlsb2FkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYsCisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiAtPSBmckluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc1JldjsKKyAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7CisgICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZGcmFtZS0+X3BheWxvYWREYXRhICsgc2Vzc2lvbi0+ZnJhbWVzUmV2ICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnMxNiwKKyAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiArPSBmcjsKKyAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzUmV2IDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+X3BheWxvYWREYXRhTGVuZ3RoSW5TYW1wbGVzID0KKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5hcG1GcmFtZUNvdW50ICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQ7CisgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BbmFseXplUmV2ZXJzZVN0cmVhbShzZXNzaW9uLT5yZXZGcmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9Cit9CisKKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHNFZmZlY3RJbnRlcmZhY2UgPSB7CisgICAgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3MsCisgICAgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQsCisgICAgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IsCisgICAgTlVMTAorfTsKKworY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZSA9IHsKKyAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcywKKyAgICBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCwKKyAgICBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvciwKKyAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBQcmVQcm9jZXNzaW5nTGliX1F1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpCit7CisgICAgaWYgKFByZVByb2NfSW5pdCgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOworICAgIH0KKyAgICBpZiAocE51bUVmZmVjdHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgKnBOdW1FZmZlY3RzID0gUFJFUFJPQ19OVU1fRUZGRUNUUzsKKyAgICByZXR1cm4gc0luaXRTdGF0dXM7Cit9CisKK2ludCBQcmVQcm9jZXNzaW5nTGliX1F1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBpZiAoUHJlUHJvY19Jbml0KCkgIT0gMCkgeworICAgICAgICByZXR1cm4gc0luaXRTdGF0dXM7CisgICAgfQorICAgIGlmIChpbmRleCA+PSBQUkVQUk9DX05VTV9FRkZFQ1RTKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIHNEZXNjcmlwdG9yc1tpbmRleF0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZShlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSW50ZXJmYWNlKQoreworICAgIExPR1YoIkVmZmVjdENyZWF0ZTogdXVpZDogJTA4eCBzZXNzaW9uICVkIElPOiAlZCIsIHV1aWQtPnRpbWVMb3csIHNlc3Npb25JZCwgaW9JZCk7CisKKyAgICBpbnQgc3RhdHVzOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisgICAgcHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb247CisgICAgdWludDMyX3QgcHJvY0lkOworCisgICAgaWYgKFByZVByb2NfSW5pdCgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOworICAgIH0KKyAgICBkZXNjID0gIFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIkVmZmVjdENyZWF0ZTogZnggbm90IGZvdW5kIHV1aWQ6ICUwOHgiLCB1dWlkLT50aW1lTG93KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHByb2NJZCA9IFV1aWRUb1Byb2NJZCgmZGVzYy0+dHlwZSk7CisKKyAgICBzZXNzaW9uID0gUHJlUHJvY19HZXRTZXNzaW9uKHByb2NJZCwgc2Vzc2lvbklkLCBpb0lkKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIkVmZmVjdENyZWF0ZTogbm8gbW9yZSBzZXNzaW9uIGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBTZXNzaW9uX0NyZWF0ZUVmZmVjdChzZXNzaW9uLCBwcm9jSWQsIHBJbnRlcmZhY2UpOworCisgICAgaWYgKHN0YXR1cyA8IDAgJiYgc2Vzc2lvbi0+Y3JlYXRlZE1zayA9PSAwKSB7CisgICAgICAgIHNlc3Npb24tPmlvID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlKQoreworICAgIGludCBzdGF0dXM7CisgICAgTE9HVigiRWZmZWN0UmVsZWFzZSBzdGFydCAlcCIsIGludGVyZmFjZSk7CisgICAgaWYgKFByZVByb2NfSW5pdCgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOworICAgIH0KKworICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4ID0gKHByZXByb2NfZWZmZWN0X3QgKilpbnRlcmZhY2U7CisKKyAgICBpZiAoZngtPnNlc3Npb24tPmlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiBTZXNzaW9uX1JlbGVhc2VFZmZlY3QoZngtPnNlc3Npb24sIGZ4KTsKK30KKworaW50IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIlByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcigpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gIC1FSU5WQUw7CisgICAgfQorCisgICAgTE9HVigiUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yKCkgZ290IGZ4ICVzIiwgZGVzYy0+bmFtZSk7CisKKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgdGFnIDogQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIHZlcnNpb24gOiBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICBuYW1lIDogIkF1ZGlvIFByZXByb2Nlc3NpbmcgTGlicmFyeSIsCisgICAgaW1wbGVtZW50b3IgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgcXVlcnlfbnVtX2VmZmVjdHMgOiBQcmVQcm9jZXNzaW5nTGliX1F1ZXJ5TnVtYmVyRWZmZWN0cywKKyAgICBxdWVyeV9lZmZlY3QgOiBQcmVQcm9jZXNzaW5nTGliX1F1ZXJ5RWZmZWN0LAorICAgIGNyZWF0ZV9lZmZlY3QgOiBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZSwKKyAgICByZWxlYXNlX2VmZmVjdCA6IFByZVByb2Nlc3NpbmdMaWJfUmVsZWFzZSwKKyAgICBnZXRfZGVzY3JpcHRvciA6IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcgorfTsKKworfTsgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQW5kcm9pZC5ta18KaW5kZXggOWJhNzFlZC4uMjQ5ZWJmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfCkBAIC0yMyw5ICsyMywxMCBAQAogZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApAQCAtNTgsOSArNTksMTAgQEAKIGVuZGlmCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAorCXN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Gb3JtYXRBZGFwdGVyLmgKaW5kZXggZDkzZWJlOS4uNDFmMTgxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRm9ybWF0QWRhcHRlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaWZuZGVmIEFVRElPRk9STUFUQURBUFRFUl9IXwogI2RlZmluZSBBVURJT0ZPUk1BVEFEQVBURVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogCiAKICNkZWZpbmUgbWluKHgseSkgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICB3aGlsZSAobnVtU2FtcGxlcyA+IDApIHsKICAgICAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXNJdGVyID0gbWluKG51bVNhbXBsZXMsIG1NYXhTYW1wbGVzUGVyQ2FsbCk7CiAgICAgICAgICAgICB1aW50MzJfdCBuU2FtcGxlc0NoYW5uZWxzID0gbnVtU2FtcGxlc0l0ZXIgKiBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TN18yNCkgeworICAgICAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCkgewogICAgICAgICAgICAgICAgIGlmIChtQmVoYXZpb3IgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpIHsKICAgICAgICAgICAgICAgICAgICAgbXBQcm9jZXNzb3ItPnByb2Nlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGF1ZGlvX3NhbXBsZV90ICo+IChwSW4pLApAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgLy8gICAgICAgICAgICAgIHNhbXBsZS4KICAgICAvLyBudW1TYW1wbGVzICAgVGhlIG51bWJlciBvZiBzaW5nbGUtY2hhbm5lbCBzYW1wbGVzIHRvIHByb2Nlc3MuCiAgICAgdm9pZCBDb252ZXJ0SW5wdXQoY29uc3Qgdm9pZCAqJiBwSW4sIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogcEluMTYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2X3QgKj4ocEluKTsKICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogcE91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICB3aGlsZSAobnVtU2FtcGxlcy0tID4gMCkgewpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgLy8gICAgICAgICAgICAgIFdoZW4gZnVuY3Rpb24gZXhpc3Qgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBvdXRwdXQgc2FtcGxlLgogICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KICAgICB2b2lkIENvbnZlcnRPdXRwdXQodm9pZCAqJiBwT3V0LCB1aW50MzJfdCBudW1TYW1wbGVzKSB7Ci0gICAgICAgIGlmIChtUGNtRm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSkgeworICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICAgICAgY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBwSW4gPSBtQnVmZmVyOwogICAgICAgICAgICAgaW50MTZfdCAqIHBPdXQxNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihwT3V0KTsKICAgICAgICAgICAgIGlmIChtQmVoYXZpb3IgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcAppbmRleCBmOGU0MzU3Li5iMjJlYmVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCkBAIC0yNiw5ICsyNiwxMCBAQAogI2luY2x1ZGUgIkF1ZGlvRXF1YWxpemVyLmgiCiAjaW5jbHVkZSAiQXVkaW9CaXF1YWRGaWx0ZXIuaCIKICNpbmNsdWRlICJBdWRpb0Zvcm1hdEFkYXB0ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9lcXVhbGl6ZXIuaD4KIAotLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZXF1YWxpemVyIGVmZmVjdAorCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlcXVhbGl6ZXIgZWZmZWN0CiBleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0VxdWFsaXplckludGVyZmFjZTsKIAogZW51bSBlcXVhbGl6ZXJfc3RhdGVfZSB7CkBAIC00NCwxMiArNDUsMTIgQEAKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCiAgICAgICAgIHsweGUyNWFhODQwLCAweDU0M2IsIDB4MTFkZiwgMHg5OGE1LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAxLAogICAgICAgICAiR3JhcGhpYyBFcXVhbGl6ZXIiLAotICAgICAgICAiR29vZ2xlIEluYy4iLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCiB9OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vIEJFR0lOIEVRIFBSRVNFVFMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTI3LDcgKzEyOCw4IEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CiAgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTM5LDE1ICsxNDEsMTUgQEAKIH0gLyogZW5kIEVmZmVjdFF1ZXJ5TmV4dCAqLwogCiBleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgIGludDMyX3QgaW9JZCwKLSAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CiAKICAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKIAotICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0xNjgsMTkgKzE3MCwyMCBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0gICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0ICVwLCBzaXplICVkIiwgcENvbnRleHQsIEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoa051bUJhbmRzKStzaXplb2YoRXF1YWxpemVyQ29udGV4dCkpOworICAgIExPR1YoIkVmZmVjdExpYkNyZWF0ZUVmZmVjdCAlcCwgc2l6ZSAlZCIsCisgICAgICAgICBwQ29udGV4dCwgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSk7CiAKICAgICByZXR1cm4gMDsKIAogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkgewotICAgIEVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChFcXVhbGl6ZXJDb250ZXh0ICopaW50ZXJmYWNlOworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgRXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKEVxdWFsaXplckNvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaW50ZXJmYWNlKTsKKyAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaGFuZGxlKTsKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0xOTIsNiArMTk1LDIyIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RSZWxlYXNlICovCiAKK2V4dGVybiAiQyIgaW50IEVmZmVjdEdldERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0VxdWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gIC1FSU5WQUw7Cit9IC8qIGVuZCBFZmZlY3RHZXREZXNjcmlwdG9yICovCisKIAogLy8KIC8vLS0tIGxvY2FsIGZ1bmN0aW9ucwpAQCAtMjI4LDE0ICsyNDcsMTUgQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7Ci0gICAgQ0hFQ0tfQVJHKChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8pIHx8IChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTykpOworICAgIENIRUNLX0FSRygocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKKyAgICAgICAgICAgICAgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1M3XzI0Ci0gICAgICAgICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVAorICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwogCiAgICAgaW50IGNoYW5uZWxDb3VudDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9NT05PKSB7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHsKICAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICBjaGFubmVsQ291bnQgPSAyOwpAQCAtMjgxLDE2ICszMDEsMTYgQEAKICAgICB9CiAKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTQwMiw3ICs0MjIsOCBAQAogICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CiAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IC05NjAwOwogICAgICAgICAqKChpbnQxNl90ICopcFZhbHVlICsgMSkgPSA0ODAwOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLCAqKGludDMyX3QgKilwVmFsdWUsICooKGludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsCisgICAgICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKQEAgLTQxMiw3ICs0MzMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gKGludDE2X3QpcEVxdWFsaXplci0+Z2V0R2FpbihwYXJhbTIpOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROgpAQCAtNDIyLDcgKzQ0NCw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBwRXF1YWxpemVyLT5nZXRGcmVxdWVuY3kocGFyYW0yKTsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsCisgICAgICAgICAgICAgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOgpAQCAtNDMyLDEzICs0NTUsMTUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHBFcXVhbGl6ZXItPmdldEJhbmRSYW5nZShwYXJhbTIsICoodWludDMyX3QgKilwVmFsdWUsICooKHVpbnQzMl90ICopcFZhbHVlICsgMSkpOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUsICooKGludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgYmFuZCAlZCwgbWluICVkLCBtYXggJWQiLAorICAgICAgICAgICAgIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6CiAgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CiAgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpcEVxdWFsaXplci0+Z2V0TW9zdFJlbGV2YW50QmFuZChwYXJhbTIpOwotICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX0JBTkQgZnJlcXVlbmN5ICVkLCBiYW5kICVkIiwgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX0JBTkQgZnJlcXVlbmN5ICVkLCBiYW5kICVkIiwKKyAgICAgICAgICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgpAQCAtNDYxLDcgKzQ4Niw4IEBACiAgICAgICAgIHN0cm5jcHkobmFtZSwgcEVxdWFsaXplci0+Z2V0UHJlc2V0TmFtZShwYXJhbTIpLCAqcFZhbHVlU2l6ZSAtIDEpOwogICAgICAgICBuYW1lWypwVmFsdWVTaXplIC0gMV0gPSAwOwogICAgICAgICAqcFZhbHVlU2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7Ci0gICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkLCBuYW1lICVzIGxlbiAlZCIsIHBhcmFtMiwgZ0VxdWFsaXplclByZXNldHNbcGFyYW0yXS5uYW1lLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkLCBuYW1lICVzIGxlbiAlZCIsCisgICAgICAgICAgICAgcGFyYW0yLCBnRXF1YWxpemVyUHJlc2V0c1twYXJhbTJdLm5hbWUsICpwVmFsdWVTaXplKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKQEAgLTU3MSw3ICs1OTcsNyBAQAogLy8tLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1leHRlcm4gIkMiIGludCBFcXVhbGl6ZXJfcHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQorZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKIHsKICAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOwogCkBAIC01OTYsNyArNjIyLDcgQEAKICAgICByZXR1cm4gMDsKIH0gICAvLyBlbmQgRXF1YWxpemVyX3Byb2Nlc3MKIAotZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCitleHRlcm4gIkMiIGludCBFcXVhbGl6ZXJfY29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKIAogICAgIGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICopIHNlbGY7CkBAIC02NDcsNyArNjczLDggQEAKIAogICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKLSAgICAgICAgTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gY21kU2l6ZSAlZCBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlZCwgcFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gY21kU2l6ZSAlZCBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlZCwgcFJlcGx5RGF0YSAlcCIsCisgICAgICAgICAgICAgY21kU2l6ZSwgcENtZERhdGEsICpyZXBseVNpemUsIHBSZXBseURhdGEpOwogICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC02OTAsMTAgKzcxNywzOCBAQAogICAgIHJldHVybiAwOwogfQogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlcXVhbGl6ZXIgZWZmZWN0CitleHRlcm4gIkMiIGludCBFcXVhbGl6ZXJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCit7CisgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldERlc2NyaXB0b3IoKSBpbnZhbGlkIHBhcmFtIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmFuZHJvaWQ6OmdFcXVhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVxdWFsaXplciBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0VxdWFsaXplckludGVyZmFjZSA9IHsKICAgICAgICAgRXF1YWxpemVyX3Byb2Nlc3MsCi0gICAgICAgIEVxdWFsaXplcl9jb21tYW5kCisgICAgICAgIEVxdWFsaXplcl9jb21tYW5kLAorICAgICAgICBFcXVhbGl6ZXJfZ2V0RGVzY3JpcHRvciwKKyAgICAgICAgTlVMTAogfTsKIAogCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgbmFtZSA6ICJUZXN0IEVxdWFsaXplciBMaWJyYXJ5IiwKKyAgICBpbXBsZW1lbnRvciA6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICBxdWVyeV9udW1fZWZmZWN0cyA6IGFuZHJvaWQ6OkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cywKKyAgICBxdWVyeV9lZmZlY3QgOiBhbmRyb2lkOjpFZmZlY3RRdWVyeUVmZmVjdCwKKyAgICBjcmVhdGVfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAorICAgIHJlbGVhc2VfZWZmZWN0IDogYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICBnZXRfZGVzY3JpcHRvciA6IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKaW5kZXggM2ViOGIyYy4uNDA1ZjkwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCkBAIC0yMyw1OSArMjMsNjEgQEAKICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKICNpbmNsdWRlICJFZmZlY3RzTWF0aC5oIgogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIgZWZmZWN0CisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIgZWZmZWN0CiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2UgPSB7CiAgICAgICAgIFJldmVyYl9Qcm9jZXNzLAotICAgICAgICBSZXZlcmJfQ29tbWFuZAorICAgICAgICBSZXZlcmJfQ29tbWFuZCwKKyAgICAgICAgUmV2ZXJiX0dldERlc2NyaXB0b3IsCisgICAgICAgIE5VTEwKIH07CiAKIC8vIEdvb2dsZSBhdXhpbGlhcnkgZW52aXJvbm1lbnRhbCByZXZlcmIgVVVJRDogMWYwYWUyZTAtNGVmNy0xMWRmLWJjMDktMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCiAgICAgICAgIHsweDFmMGFlMmUwLCAweDRlZjcsIDB4MTFkZiwgMHhiYzA5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAvLyBmbGFncyBvdGhlciB0aGFuIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIHNldCBmb3IgdGVzdCBwdXJwb3NlCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCB8IEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5ELAogICAgICAgICAwLCAvLyBUT0RPCiAgICAgICAgIDMzLAogICAgICAgICAiQXV4IEVudmlyb25tZW50YWwgUmV2ZXJiIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIgorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKIH07CiAKIC8vIEdvb2dsZSBpbnNlcnQgZW52aXJvbm1lbnRhbCByZXZlcmIgVVVJRDogYWE0NzYwNDAtNjM0Mi0xMWRmLTkxYTQtMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCiAgICAgICAgIHsweGFhNDc2MDQwLCAweDYzNDIsIDB4MTFkZiwgMHg5MWE0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkluc2VydCBFbnZpcm9ubWVudGFsIHJldmVyYiIsCi0gICAgICAgICJHb29nbGUgSW5jLiIKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiCiB9OwogCiAvLyBHb29nbGUgYXV4aWxpYXJ5IHByZXNldCByZXZlcmIgVVVJRDogNjM5MDkzMjAtNTNhNi0xMWRmLWJkYmQtMDAwMmE1ZDVjNTFiCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4NDczODJkNjAsIDB4ZGRkOCwgMHgxMWRiLCAweGJmM2EsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCiAgICAgICAgIHsweDYzOTA5MzIwLCAweDUzYTYsIDB4MTFkZiwgMHhiZGJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAotICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAzMywKICAgICAgICAgIkF1eCBQcmVzZXQgUmV2ZXJiIiwKLSAgICAgICAgIkdvb2dsZSBJbmMuIgorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKIH07CiAKIC8vIEdvb2dsZSBpbnNlcnQgcHJlc2V0IHJldmVyYiBVVUlEOiBkOTNkYzZhMC02MzQyLTExZGYtYjEyOC0wMDAyYTVkNWM1MWIKIHN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0gewogICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgezB4ZDkzZGM2YTAsIDB4NjM0MiwgMHgxMWRmLCAweGIxMjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCi0gICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNULAogICAgICAgICAwLCAvLyBUT0RPCiAgICAgICAgIDMzLAogICAgICAgICAiSW5zZXJ0IFByZXNldCBSZXZlcmIiLAotICAgICAgICAiR29vZ2xlIEluYy4iCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgogfTsKIAogLy8gZ0Rlc2NyaXB0b3JzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbCBkZWZpbmVkIGVmZmVjdCBkZXNjcmlwdG9yIGluIHRoaXMgbGlicmFyeQpAQCAtMTEyLDcgKzExNCw3IEBACiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwogICAgIHJldmVyYl9tb2R1bGVfdCAqbW9kdWxlOwpAQCAtMTIyLDcgKzEyNCw3IEBACiAKICAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKIAotICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0xNTcsNyArMTU5LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpIG1vZHVsZTsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpIG1vZHVsZTsKIAogICAgIG1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CiAKQEAgLTE2NiwxMSArMTY4LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpIHsKLSAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopaW50ZXJmYWNlOworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaW50ZXJmYWNlKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaGFuZGxlKTsKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0xODAsMTAgKzE4MiwzMSBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuZ3RoID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmdEZXNjcmlwdG9yc1tpXS0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpXSwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgIExPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IgLSBVVUlEIG1hdGNoZWQgUmV2ZXJiIHR5cGUgJWQsIFVVSUQgPSAleCIsCisgICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC1FSU5WQUw7Cit9IC8qIGVuZCBFZmZlY3RHZXREZXNjcmlwdG9yICovCiAKIC8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCi1zdGF0aWMgaW50IFJldmVyYl9Qcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKK3N0YXRpYyBpbnQgUmV2ZXJiX1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgewogICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKICAgICBpbnQxNl90ICpwU3JjLCAqcERzdDsKICAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopc2VsZjsKQEAgLTI3MCw3ICsyOTMsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgUmV2ZXJiX0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCitzdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewogICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKikgc2VsZjsKICAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CkBAIC0zODMsNiArNDA2LDM4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBSZXZlcmJfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCit7CisgICAgcmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlID0gKHJldmVyYl9tb2R1bGVfdCAqKSBzZWxmOworICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjOworCisgICAgaWYgKHBSdmJNb2R1bGUgPT0gTlVMTCB8fAorICAgICAgICAgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcFJldmVyYiA9IChyZXZlcmJfb2JqZWN0X3QqKSAmcFJ2Yk1vZHVsZS0+Y29udGV4dDsKKworICAgIGlmIChwUmV2ZXJiLT5tX0F1eCkgeworICAgICAgICBpZiAocFJldmVyYi0+bV9QcmVzZXQpIHsKKyAgICAgICAgICAgIGRlc2MgPSAmZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CisgICAgICAgICAgICBkZXNjID0gJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzYyA9ICZnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbWNweShwRGVzY3JpcHRvciwgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBSZXZlcmJfZ2V0RGVzY3JpcHRvciAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFJldmVyYiBpbnRlcm5hbCBmdW5jdGlvbnMKQEAgLTQxOCwxOSArNDczLDE5IEBACiAKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgaWYgKGF1eCkgewotICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX01PTk87CisgICAgICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9Ci0gICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOwotICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CkBAIC00NzQsMTMgKzUyOSwxMyBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUKICAgICAgICAgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gT1VUUFVUX0NIQU5ORUxTCi0gICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBTQU1QTEVfRk9STUFUX1BDTV9TMTUKLSAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKICAgICAgICAgTE9HVigiUmV2ZXJiX0NvbmZpZ3VyZSBpbnZhbGlkIGNvbmZpZyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgaWYgKChwUmV2ZXJiLT5tX0F1eCAmJiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9NT05PKSkgfHwKLSAgICAgICAgKCFwUmV2ZXJiLT5tX0F1eCAmJiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9TVEVSRU8pKSkgeworICAgIGlmICgocFJldmVyYi0+bV9BdXggJiYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pKSB8fAorICAgICAgICAoIXBSZXZlcmItPm1fQXV4ICYmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSkgewogICAgICAgICBMT0dWKCJSZXZlcmJfQ29uZmlndXJlIGludmFsaWQgY29uZmlnIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTIxMzMsMyArMjE4OCwxNSBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisKK2F1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgIC5uYW1lID0gIlRlc3QgRXF1YWxpemVyIExpYnJhcnkiLAorICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAucXVlcnlfbnVtX2VmZmVjdHMgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMsCisgICAgLnF1ZXJ5X2VmZmVjdCA9IEVmZmVjdFF1ZXJ5RWZmZWN0LAorICAgIC5jcmVhdGVfZWZmZWN0ID0gRWZmZWN0Q3JlYXRlLAorICAgIC5yZWxlYXNlX2VmZmVjdCA9IEVmZmVjdFJlbGVhc2UsCisgICAgLmdldF9kZXNjcmlwdG9yID0gRWZmZWN0R2V0RGVzY3JpcHRvciwKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAppbmRleCBkYmNkMTkyLi44ZTJjYzMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTE3LDggKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RSRVZFUkJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9lbnZpcm9ubWVudGFscmV2ZXJiLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfcHJlc2V0cmV2ZXJiLmg+CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogCiAjZGVmaW5lIE5VTV9PVVRQVVRfQ0hBTk5FTFMgMgotI2RlZmluZSBPVVRQVVRfQ0hBTk5FTFMgQ0hBTk5FTF9TVEVSRU8KKyNkZWZpbmUgT1VUUFVUX0NIQU5ORUxTIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwogCiAjZGVmaW5lIFJFVkVSQl9CVUZGRVJfU0laRV9JTl9TQU1QTEVTX01BWCAgIDE2Mzg0CiAKQEAgLTMwNiwxOSArMzA2LDIyIEBACiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKmVmZmVjdFVJRCwKICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKTsKLWludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpOworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSk7CitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCi1zdGF0aWMgaW50IFJldmVyYl9Qcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorc3RhdGljIGludCBSZXZlcmJfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKLXN0YXRpYyBpbnQgUmV2ZXJiX0NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCitzdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KK3N0YXRpYyBpbnQgUmV2ZXJiX0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogaW50ZXJuYWwgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IGU2ZmY2NTQuLjIxNjAxNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC05LDIyICs5LDE1IEBACiBMT0NBTF9DRkxBR1MrPSAtTzIKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzCisJbGliY3V0aWxzIFwKKwlsaWJkbAogCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCi1pZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQotTE9DQUxfTERMSUJTICs9IC1sZGwKLWVuZGlmCi0KLWlmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgotCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKKwlzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCBjOTU3ZGJhLi4zYzNhZjhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0yMSwyMyArMjEsMjQgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAotZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdWaXN1YWxpemVySW50ZXJmYWNlOworZXh0ZXJuICJDIiB7CisKKy8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CitleHRlcm4gY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZTsKIAogLy8gR29vZ2xlIFZpc3VhbGl6ZXIgVVVJRDogZDA2OWQ5ZTAtODMyOS0xMWRmLTkxNjgtMDAwMmE1ZDVjNTFiCiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXN1YWxpemVyRGVzY3JpcHRvciA9IHsKICAgICAgICAgezB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHR5cGUKICAgICAgICAgezB4ZDA2OWQ5ZTAsIDB4ODMyOSwgMHgxMWRmLCAweDkxNjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKLSAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSwKICAgICAgICAgMCwgLy8gVE9ETwogICAgICAgICAxLAogICAgICAgICAiVmlzdWFsaXplciIsCi0gICAgICAgICJHb29nbGUgSW5jLiIsCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKIH07CiAKIGVudW0gdmlzdWFsaXplcl9zdGF0ZV9lIHsKQEAgLTkwLDEwICs5MSwxMCBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgbWVtY3B5KCZwQ29udGV4dC0+bUNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOwogCkBAIC0xMTgsMTYgKzExOSwxNiBAQAogaW50IFZpc3VhbGl6ZXJfaW5pdChWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQpCiB7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0xNDUsMTIgKzE0NiwxMyBAQAogLy8tLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CitpbnQgVmlzdWFsaXplckxpYl9RdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CiAgICAgKnBOdW1FZmZlY3RzID0gMTsKICAgICByZXR1cm4gMDsKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CitpbnQgVmlzdWFsaXplckxpYl9RdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CiAgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTYxLDE0ICsxNjMsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAotICAgICAgICBpbnQzMl90IGlvSWQsCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CiAKLSAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMTgzLDI1ICsxODUsMjUgQEAKIAogICAgIHJldCA9IFZpc3VhbGl6ZXJfaW5pdChwQ29udGV4dCk7CiAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgTE9HVygiVmlzdWFsaXplckxpYl9DcmVhdGUoKSBpbml0IGZhaWxlZCIpOwogICAgICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClwQ29udGV4dDsKIAogICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0gICAgTE9HVigiRWZmZWN0Q3JlYXRlICVwIiwgcENvbnRleHQpOworICAgIExPR1YoIlZpc3VhbGl6ZXJMaWJfQ3JlYXRlICVwIiwgcENvbnRleHQpOwogCiAgICAgcmV0dXJuIDA7CiAKIH0KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7Ci0gICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKWludGVyZmFjZTsKK2ludCBWaXN1YWxpemVyTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKiloYW5kbGU7CiAKLSAgICBMT0dWKCJFZmZlY3RSZWxlYXNlICVwIiwgaW50ZXJmYWNlKTsKKyAgICBMT0dWKCJWaXN1YWxpemVyTGliX1JlbGVhc2UgJXAiLCBoYW5kbGUpOwogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTIxMSw2ICsyMTMsMjIgQEAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IFZpc3VhbGl6ZXJMaWJfR2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworCisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiVmlzdWFsaXplckxpYl9HZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdWaXN1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gIC1FSU5WQUw7Cit9IC8qIGVuZCBWaXN1YWxpemVyTGliX0dldERlc2NyaXB0b3IgKi8KKwogLy8KIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KQEAgLTIyMiwxMCArMjQwLDEwIEBACiAgICAgcmV0dXJuIHNhbXBsZTsKIH0KIAotZXh0ZXJuICJDIiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAotICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCitpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAorICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCiB7Ci0gICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTI0NCw3ICsyNjIsNyBAQAogICAgIC8vIHRoaXMgZ2l2ZXMgbW9yZSBpbnRlcmVzdGluZyBjYXB0dXJlcyBmb3IgZGlzcGxheS4KICAgICBpbnQzMl90IHNoaWZ0ID0gMzI7CiAgICAgaW50IGxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogMjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbaV07CiAgICAgICAgIGlmIChzbXAgPCAwKSBzbXAgPSAtc21wIC0gMTsgLy8gdGFrZSBjYXJlIHRvIGtlZXAgdGhlIG1heCBuZWdhdGl2ZSBpbiByYW5nZQogICAgICAgICBpbnQzMl90IGNseiA9IF9fYnVpbHRpbl9jbHooc21wKTsKQEAgLTI5MywxMCArMzExLDEwIEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLy8gZW5kIFZpc3VhbGl6ZXJfcHJvY2VzcwogCi1leHRlcm4gIkMiIGludCBWaXN1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCitpbnQgVmlzdWFsaXplcl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewogCi0gICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CiAgICAgaW50IHJldHNpemU7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+bVN0YXRlID09IFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCkgewpAQCAtMzU3LDcgKzM3NSw3IEBACiAgICAgICAgIHAtPnN0YXR1cyA9IDA7CiAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKLSAgICAgICAgICAgICoodWludDMyX3QgKilwLT5kYXRhICE9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFKSB7CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSAhPSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRSkgewogICAgICAgICAgICAgcC0+c3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNzYsNyArMzk0LDcgQEAKICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKICAgICAgICAgICAgIHAtPnZzaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKLSAgICAgICAgICAgICoodWludDMyX3QgKilwLT5kYXRhICE9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFKSB7CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSAhPSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRSkgewogICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazs7CiAgICAgICAgIH0KQEAgLTM4OSw5ICs0MDcsOSBAQAogICAgICAgICBicmVhazsKIAogCi0gICAgY2FzZSBWSVNVX0NNRF9DQVBUVVJFOgorICAgIGNhc2UgVklTVUFMSVpFUl9DTURfQ0FQVFVSRToKICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpIHsKLSAgICAgICAgICAgIExPR1YoIlZJU1VfQ01EX0NBUFRVUkUoKSBlcnJvciAqcmVwbHlTaXplICVkIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgJWQiLAorICAgICAgICAgICAgTE9HVigiVklTVUFMSVpFUl9DTURfQ0FQVFVSRSgpIGVycm9yICpyZXBseVNpemUgJWQgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KQEAgLTQxMiwxMSArNDMwLDQxIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHZpc3VhbGl6ZXIgZWZmZWN0CisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCitpbnQgVmlzdWFsaXplcl9nZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR1YoIlZpc3VhbGl6ZXJfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIFZpc3VhbGl6ZXJfZ2V0RGVzY3JpcHRvciAqLworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciB2aXN1YWxpemVyIGVmZmVjdAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZSA9IHsKICAgICAgICAgVmlzdWFsaXplcl9wcm9jZXNzLAotICAgICAgICBWaXN1YWxpemVyX2NvbW1hbmQKKyAgICAgICAgVmlzdWFsaXplcl9jb21tYW5kLAorICAgICAgICBWaXN1YWxpemVyX2dldERlc2NyaXB0b3IsCisgICAgICAgIE5VTEwsCiB9OwogCi19IC8vIG5hbWVzcGFjZQogCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIHRhZyA6IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICB2ZXJzaW9uIDogRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgbmFtZSA6ICJWaXN1YWxpemVyIExpYnJhcnkiLAorICAgIGltcGxlbWVudG9yIDogIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAorICAgIHF1ZXJ5X251bV9lZmZlY3RzIDogVmlzdWFsaXplckxpYl9RdWVyeU51bWJlckVmZmVjdHMsCisgICAgcXVlcnlfZWZmZWN0IDogVmlzdWFsaXplckxpYl9RdWVyeUVmZmVjdCwKKyAgICBjcmVhdGVfZWZmZWN0IDogVmlzdWFsaXplckxpYl9DcmVhdGUsCisgICAgcmVsZWFzZV9lZmZlY3QgOiBWaXN1YWxpemVyTGliX1JlbGVhc2UsCisgICAgZ2V0X2Rlc2NyaXB0b3IgOiBWaXN1YWxpemVyTGliX0dldERlc2NyaXB0b3IsCit9OworCit9OyAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCBmZDRjNmM2Li43YWY0YTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTEsNCArMSwxNCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9QYXJhbWV0ZXIuY3BwCitMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKQEAgLTMzLDI4ICs0MywyNCBAQAogICAgIElFZmZlY3RDbGllbnQuY3BwIFwKICAgICBBdWRpb0VmZmVjdC5jcHAgXAogICAgIFZpc3VhbGl6ZXIuY3BwIFwKKyAgICBNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCBcCiAgICAgZml4ZWRmZnQuY3BwLmFybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1aSBsaWJjdXRpbHMgbGlidXRpbHMgbGliYmluZGVyIGxpYnNvbml2b3ggbGliaWN1dWMgbGliZXhwYXQgXAotICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgbGliY2FtZXJhX2NsaWVudCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliZ3VpCisgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgICAgIGxpYmd1aSBsaWJkbAorCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSWSA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAotaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsIC1scHRocmVhZAotZW5kaWYKLQotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAgICAgZXh0ZXJuYWwvaWN1NGMvY29tbW9uIFwKLSAgICBleHRlcm5hbC9leHBhdC9saWIKKyAgICBleHRlcm5hbC9leHBhdC9saWIgXAorICAgIHN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCmluZGV4IGFhZGViYTUuLjA2MzM3NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKQEAgLTQ3LDExICs0NywxMSBAQAogICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8KICAgICAgICAgICAgICAgICApCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIG91dHB1dCk7CisgICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvKTsKIH0KIAogQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAogICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbwogICAgICAgICAgICAgICAgICkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCkKIHsKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1TdGF0dXMgPSBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIG91dHB1dCk7CisgICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8pOwogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCkBAIC05MiwxMyArOTIsMTMgQEAKICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbykKIHsKICAgICBzcDxJRWZmZWN0PiBpRWZmZWN0OwogICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgaW50IGVuYWJsZWQ7CiAKLSAgICBMT0dWKCJzZXQgJXAgbVVzZXJEYXRhOiAlcCIsIHRoaXMsIHVzZXIpOworICAgIExPR1YoInNldCAlcCBtVXNlckRhdGE6ICVwIHV1aWQ6ICVwIHRpbWVMb3cgJTA4eCIsIHRoaXMsIHVzZXIsIHR5cGUsIHR5cGUgPyB0eXBlLT50aW1lTG93IDogMCk7CiAKICAgICBpZiAobUlFZmZlY3QgIT0gMCkgewogICAgICAgICBMT0dXKCJFZmZlY3QgYWxyZWFkeSBpbiB1c2UiKTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgIG1JRWZmZWN0Q2xpZW50ID0gbmV3IEVmZmVjdENsaWVudCh0aGlzKTsKIAogICAgIGlFZmZlY3QgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdChnZXRwaWQoKSwgKGVmZmVjdF9kZXNjcmlwdG9yX3QgKikmbURlc2NyaXB0b3IsCi0gICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgbVNlc3Npb25JZCwgJm1TdGF0dXMsICZtSWQsICZlbmFibGVkKTsKKyAgICAgICAgICAgIG1JRWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgaW8sIG1TZXNzaW9uSWQsICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CiAKICAgICBpZiAoaUVmZmVjdCA9PSAwIHx8IChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7CiAgICAgICAgIExPR0UoInNldCgpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSBlZmZlY3QsIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKQEAgLTE3MCw3ICsxNzAsNiBAQAogICAgIExPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKIAogICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SIHx8IG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgIGlmIChtSUVmZmVjdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtSUVmZmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgbUlFZmZlY3QtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwpAQCAtMzk5LDIwICszOTgsNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXR1c190IEF1ZGlvRWZmZWN0Ojpsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkKLXsKLSAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+bG9hZEVmZmVjdExpYnJhcnkobGliUGF0aCwgaGFuZGxlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKLXsKLSAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+dW5sb2FkRWZmZWN0TGlicmFyeShoYW5kbGUpOwotfQotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQogewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtNDM0LDYgKzQxOSwxNSBAQAogICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCBkZXNjcmlwdG9yKTsKIH0KIAorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5xdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKmd1aWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljY2ZkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BhcmFtZXRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyA9ICJyb3V0aW5nIjsKK2NvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUgPSAic2FtcGxpbmdfcmF0ZSI7Citjb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0ID0gImZvcm1hdCI7Citjb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMgPSAiY2hhbm5lbHMiOworY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQgPSAiZnJhbWVfY291bnQiOworY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlID0gImlucHV0X3NvdXJjZSI7CisKK0F1ZGlvUGFyYW1ldGVyOjpBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQoreworICAgIGNoYXIgKnN0ciA9IG5ldyBjaGFyW2tleVZhbHVlUGFpcnMubGVuZ3RoKCkrMV07CisgICAgbUtleVZhbHVlUGFpcnMgPSBrZXlWYWx1ZVBhaXJzOworCisgICAgc3RyY3B5KHN0ciwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgY2hhciAqcGFpciA9IHN0cnRvayhzdHIsICI7Iik7CisgICAgd2hpbGUgKHBhaXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKHBhaXIpICE9IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBlcUlkeCA9IHN0cmNzcG4ocGFpciwgIj0iKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChwYWlyLCBlcUlkeCk7CisgICAgICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICAgICAgaWYgKGVxSWR4ID09IHN0cmxlbihwYWlyKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nOChwYWlyICsgZXFJZHggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPCAwKSB7CisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuYWRkKGtleSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5yZXBsYWNlVmFsdWVGb3Ioa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJBdWRpb1BhcmFtZXRlcigpIGNzdG9yIGVtcHR5IGtleSB2YWx1ZSBwYWlyIik7CisgICAgICAgIH0KKyAgICAgICAgcGFpciA9IHN0cnRvayhOVUxMLCAiOyIpOworICAgIH0KKworICAgIGRlbGV0ZVtdIHN0cjsKK30KKworQXVkaW9QYXJhbWV0ZXI6On5BdWRpb1BhcmFtZXRlcigpCit7CisgICAgbVBhcmFtZXRlcnMuY2xlYXIoKTsKK30KKworU3RyaW5nOCBBdWRpb1BhcmFtZXRlcjo6dG9TdHJpbmcoKQoreworICAgIFN0cmluZzggc3RyID0gU3RyaW5nOCgiIik7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1QYXJhbWV0ZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzdHIgKz0gbVBhcmFtZXRlcnMua2V5QXQoaSk7CisgICAgICAgIHN0ciArPSAiPSI7CisgICAgICAgIHN0ciArPSBtUGFyYW1ldGVycy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoaSA8IChzaXplIC0gMSkpIHN0ciArPSAiOyI7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkKK3sKKyAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpIDwgMCkgeworICAgICAgICBtUGFyYW1ldGVycy5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGFyYW1ldGVycy5yZXBsYWNlVmFsdWVGb3Ioa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgY2hhciBzdHJbMTJdOworICAgIGlmIChzbnByaW50ZihzdHIsIDEyLCAiJWQiLCB2YWx1ZSkgPiAwKSB7CisgICAgICAgIFN0cmluZzggc3RyOCA9IFN0cmluZzgoc3RyKTsKKyAgICAgICAgcmV0dXJuIGFkZChrZXksIHN0cjgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkRmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBjaGFyIHN0clsyM107CisgICAgaWYgKHNucHJpbnRmKHN0ciwgMjMsICIlLjEwZiIsIHZhbHVlKSA+IDApIHsKKyAgICAgICAgU3RyaW5nOCBzdHI4ID0gU3RyaW5nOChzdHIpOworICAgICAgICByZXR1cm4gYWRkKGtleSwgc3RyOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpyZW1vdmUoY29uc3QgU3RyaW5nOCYga2V5KQoreworICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPj0gMCkgeworICAgICAgICBtUGFyYW1ldGVycy5yZW1vdmVJdGVtKGtleSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldChjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKQoreworICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPj0gMCkgeworICAgICAgICB2YWx1ZSA9IG1QYXJhbWV0ZXJzLnZhbHVlRm9yKGtleSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEludChjb25zdCBTdHJpbmc4JiBrZXksIGludCYgdmFsdWUpCit7CisgICAgU3RyaW5nOCBzdHI4OworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldChrZXksIHN0cjgpOworICAgIHZhbHVlID0gMDsKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGludCB2YWw7CisgICAgICAgIGlmIChzc2NhbmYoc3RyOC5zdHJpbmcoKSwgIiVkIiwgJnZhbCkgPT0gMSkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0RmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBmbG9hdCYgdmFsdWUpCit7CisgICAgU3RyaW5nOCBzdHI4OworICAgIHN0YXR1c190IHJlc3VsdCA9IGdldChrZXksIHN0cjgpOworICAgIHZhbHVlID0gMDsKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgaWYgKHNzY2FuZihzdHI4LnN0cmluZygpLCAiJWYiLCAmdmFsKSA9PSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRBdChzaXplX3QgaW5kZXgsIFN0cmluZzgmIGtleSwgU3RyaW5nOCYgdmFsdWUpCit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLnNpemUoKSA+IGluZGV4KSB7CisgICAgICAgIGtleSA9IG1QYXJhbWV0ZXJzLmtleUF0KGluZGV4KTsKKyAgICAgICAgdmFsdWUgPSBtUGFyYW1ldGVycy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCit9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAppbmRleCBhMThiZWRiLi4xNjU1NGMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCkBAIC0zNSw2ICszNSwxMCBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQpAQCAtNjUsOCArNjksOCBAQAogICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KICAgICBzaXplIDw8PSAxOwogCi0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShmb3JtYXQpKSB7Ci0gICAgICAgIHNpemUgLz0gY2hhbm5lbENvdW50ICogKGZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCA/IDIgOiAxKTsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIHNpemUgLz0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwogICAgIH0KIAogICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKQEAgLTg0LDcgKzg4LDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Myw3ICs5Nyw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7Ci0gICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKKyAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzZXNzaW9uSWQpOwogfQogCkBAIC0xMTcsNyArMTIxLDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMjcsNyArMTMxLDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKIHsKIAotICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVscyAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbHMsIGZyYW1lQ291bnQpOworICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVsTWFzayAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0xNDQsMjIgKzE0OCwzMyBAQAogICAgIH0KICAgICAvLyB0aGVzZSBiZWxvdyBzaG91bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZSBhdWRpb0ZsaW5nZXIgdG9vLi4uCiAgICAgaWYgKGZvcm1hdCA9PSAwKSB7Ci0gICAgICAgIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9CiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzVmFsaWRGb3JtYXQoZm9ybWF0KSkgeworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0lucHV0Q2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50IGNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjaGFubmVscyk7CisgICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKKworICAgIGlmIChzZXNzaW9uSWQgPT0gMCApIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQorICAgIExPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dChpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIChBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzKWZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgaWYgKGlucHV0ID09IDApIHsKICAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBpbnB1dCBmb3IgcmVjb3JkIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE4MywxMCArMTk4LDggQEAKICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudC8yOwogICAgIH0KIAotICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0KICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwKKyAgICBzdGF0dXMgPSBvcGVuUmVjb3JkX2woc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBpbnB1dCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjA1LDcgKzIxOCw3IEBACiAgICAgLy8gVXBkYXRlIGJ1ZmZlciBzaXplIGluIGNhc2UgaXQgaGFzIGJlZW4gbGltaXRlZCBieSBBdWRpb0ZsaW5nZXIgZHVyaW5nIHRyYWNrIGNyZWF0aW9uCiAgICAgbUZyYW1lQ291bnQgPSBtQ2Jsay0+ZnJhbWVDb3VudDsKICAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OwotICAgIG1DaGFubmVscyA9IGNoYW5uZWxzOworICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgIG1BY3RpdmUgPSAwOwogICAgIG1DYmYgPSBjYmY7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTI1Myw4ICsyNjYsOCBAQAogCiBpbnQgQXVkaW9SZWNvcmQ6OmZyYW1lU2l6ZSgpIGNvbnN0CiB7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgewotICAgICAgICByZXR1cm4gY2hhbm5lbENvdW50KCkqKChmb3JtYXQoKSA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSA/IHNpemVvZih1aW50OF90KSA6IHNpemVvZihpbnQxNl90KSk7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGNoYW5uZWxDb3VudCgpKmF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHNpemVvZih1aW50OF90KTsKICAgICB9CkBAIC0yOTksNyArMzEyLDcgQEAKICAgICAgICAgICAgIHJldCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgaWYgKHJldCA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spIHsKQEAgLTMxMSw5ICszMjQsOSBAQAogICAgICAgICAgICAgY2Jsay0+YnVmZmVyVGltZW91dE1zID0gTUFYX1JVTl9USU1FT1VUX01TOwogICAgICAgICAgICAgY2Jsay0+d2FpdFRpbWVNcyA9IDA7CiAgICAgICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICB0LT5ydW4oIkNsaWVudFJlY29yZFRocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICAgICAgdC0+cnVuKCJDbGllbnRSZWNvcmRUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBUSFJFQURfUFJJT1JJVFlfQVVESU9fQ0xJRU5UKTsKKyAgICAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFjdGl2ZSA9IDA7CkBAIC00MzMsOCArNDQ2LDggQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9wZW5SZWNvcmRfbCgKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ0Nyw3ICs0NjAsNyBAQAogCiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoZ2V0cGlkKCksIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZsYWdzKSA8PCAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKQEAgLTQ2Nyw3ICs0ODAsNyBAQAogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgbUNibGstPmJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRElSRUNUSU9OX01TSzsKKyAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElSRUNUSU9OX01TSywgJm1DYmxrLT5mbGFncyk7CiAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKICAgICBtQ2Jsay0+d2FpdFRpbWVNcyA9IDA7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNDc3LDcgKzQ5MCw3IEBACiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGludCBhY3RpdmU7Ci0gICAgc3RhdHVzX3QgcmVzdWx0OworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIHVpbnQzMl90IGZyYW1lc1JlcSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHVpbnQzMl90IHdhaXRUaW1lTXMgPSAod2FpdENvdW50IDwgMCkgPyBjYmxrLT5idWZmZXJUaW1lb3V0TXMgOiBXQUlUX1BFUklPRF9NUzsKQEAgLTUyMiw3ICs1MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IERFQURfT0JKRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX0lOVkFMSURfTVNLOworICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogY3JlYXRlX25ld19yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBdWRpb1JlY29yZDo6cmVzdG9yZVJlY29yZF9sKGNibGspOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NzcsNyArNTkwLDcgQEAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRJbnB1dF9sKCk7CisgICAgcmV0dXJuIG1JbnB1dDsKIH0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCkBAIC01ODUsOCArNTk4LDEwIEBACiB7CiAgICAgbUlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpbUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpbUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICByZXR1cm4gbUlucHV0OwogfQogCkBAIC03MjIsOSArNzM3LDggQEAKICAgICAvLyBNYW5hZ2Ugb3ZlcnJ1biBjYWxsYmFjawogICAgIGlmIChtQWN0aXZlICYmIChjYmxrLT5mcmFtZXNBdmFpbGFibGUoKSA9PSAwKSkgewogICAgICAgICBMT0dWKCJPdmVycnVuIHVzZXI6ICV4LCBzZXJ2ZXI6ICV4LCBmbGFncyAlMDR4IiwgY2Jsay0+dXNlciwgY2Jsay0+c2VydmVyLCBjYmxrLT5mbGFncyk7Ci0gICAgICAgIGlmICgoY2Jsay0+ZmxhZ3MgJiBDQkxLX1VOREVSUlVOX01TSykgPT0gQ0JMS19VTkRFUlJVTl9PRkYpIHsKKyAgICAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19VTkRFUlJVTl9PTiwgJmNibGstPmZsYWdzKSAmIENCTEtfVU5ERVJSVU5fTVNLKSkgewogICAgICAgICAgICAgbUNiZihFVkVOVF9PVkVSUlVOLCBtVXNlckRhdGEsIDApOwotICAgICAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzQzLDEwICs3NTcsOCBAQAogewogICAgIHN0YXR1c190IHJlc3VsdDsKIAotICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19SRVNUT1JJTkdfTVNLKSkgeworICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfUkVTVE9SSU5HX09OLCAmY2Jsay0+ZmxhZ3MpICYgQ0JMS19SRVNUT1JJTkdfTVNLKSkgewogICAgICAgICBMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIik7Ci0KLSAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19SRVNUT1JJTkdfT047CiAgICAgICAgIC8vIHNpZ25hbCBvbGQgY2JsayBjb25kaXRpb24gc28gdGhhdCBvdGhlciB0aHJlYWRzIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBidWZmZXJzIHN0b3AKICAgICAgICAgLy8gd2FpdGluZyBub3cKICAgICAgICAgY2Jsay0+Y3YuYnJvYWRjYXN0KCk7CkBAIC03NTUsNyArNzY3LDcgQEAKICAgICAgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCiAgICAgICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KICAgICAgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvUmVjb3JkIGFuZCBJTWVtb3J5Ci0gICAgICAgIHJlc3VsdCA9IG9wZW5SZWNvcmRfbChjYmxrLT5zYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbENvdW50LAorICAgICAgICByZXN1bHQgPSBvcGVuUmVjb3JkX2woY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtRmxhZ3MsIGdldElucHV0X2woKSk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsKQEAgLTc2NSwxMCArNzc3LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHNpZ25hbCBvbGQgY2JsayBjb25kaXRpb24gZm9yIG90aGVyIHRocmVhZHMgd2FpdGluZyBmb3IgcmVzdG9yZSBjb21wbGV0aW9uCi0gICAgICAgIGNibGstPmxvY2subG9jaygpOwotICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX1JFU1RPUkVEX01TSzsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19SRVNUT1JFRF9PTiwgJmNibGstPmZsYWdzKTsKICAgICAgICAgY2Jsay0+Y3YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIGNibGstPmxvY2sudW5sb2NrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCEoY2Jsay0+ZmxhZ3MgJiBDQkxLX1JFU1RPUkVEX01TSykpIHsKICAgICAgICAgICAgIExPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCB3YWl0aW5nIGZvciBhIG5ldyBvbmUgdG8gYmUgY3JlYXRlZCIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDJmNjk0YmEuLjUwMDk5NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTIzLDEyICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCi0KLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ1LDcgKzQwLDcgQEAKIAogLy8gQ2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIHF1ZXJpZXMKIHVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnUHJldkluU2FtcGxpbmdSYXRlID0gMTYwMDA7Ci1pbnQgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKK2ludCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogaW50IEF1ZGlvU3lzdGVtOjpnUHJldkluQ2hhbm5lbENvdW50ID0gMTsKIHNpemVfdCBBdWRpb1N5c3RlbTo6Z0luQnVmZlNpemUgPSAwOwogCkBAIC0xMjcsNyArMTIyLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShpbnQgc3RyZWFtLCBmbG9hdCB2YWx1ZSwgaW50IG91dHB1dCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBOVU1fU1RSRUFNX1RZUEVTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBhZi0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdmFsdWUsIG91dHB1dCk7CkBAIC0xMzYsNyArMTMxLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN0cmVhbU11dGUoaW50IHN0cmVhbSwgYm9vbCBtdXRlKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IE5VTV9TVFJFQU1fVFlQRVMpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGFmLT5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgbXV0ZSk7CkBAIC0xNDUsNyArMTQwLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZShpbnQgc3RyZWFtLCBmbG9hdCogdm9sdW1lLCBpbnQgb3V0cHV0KQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IE5VTV9TVFJFQU1fVFlQRVMpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICp2b2x1bWUgPSBhZi0+c3RyZWFtVm9sdW1lKHN0cmVhbSwgb3V0cHV0KTsKQEAgLTE1NCw3ICsxNDksNyBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtTXV0ZShpbnQgc3RyZWFtLCBib29sKiBtdXRlKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IE5VTV9TVFJFQU1fVFlQRVMpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICptdXRlID0gYWYtPnN0cmVhbU11dGUoc3RyZWFtKTsKQEAgLTE2Myw3ICsxNTgsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TW9kZShpbnQgbW9kZSkKIHsKLSAgICBpZiAobW9kZSA+PSBOVU1fTU9ERVMpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKG1vZGUgPj0gQVVESU9fTU9ERV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldE1vZGUobW9kZSk7CkBAIC0yMTMsMTEgKzIwOCwxMSBAQAogICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2M7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OwogCi0gICAgaWYgKHN0cmVhbVR5cGUgPT0gREVGQVVMVCkgewotICAgICAgICBzdHJlYW1UeXBlID0gTVVTSUM7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICB9CiAKLSAgICBvdXRwdXQgPSBnZXRPdXRwdXQoKHN0cmVhbV90eXBlKXN0cmVhbVR5cGUpOworICAgIG91dHB1dCA9IGdldE91dHB1dCgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW1UeXBlKTsKICAgICBpZiAob3V0cHV0ID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTI0NiwxMSArMjQxLDExIEBACiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQ7CiAKLSAgICBpZiAoc3RyZWFtVHlwZSA9PSBERUZBVUxUKSB7Ci0gICAgICAgIHN0cmVhbVR5cGUgPSBNVVNJQzsKKyAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIG91dHB1dCA9IGdldE91dHB1dCgoc3RyZWFtX3R5cGUpc3RyZWFtVHlwZSk7CisgICAgb3V0cHV0ID0gZ2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbVR5cGUpOwogICAgIGlmIChvdXRwdXQgPT0gMCkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMjc3LDExICsyNzIsMTEgQEAKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKIAotICAgIGlmIChzdHJlYW1UeXBlID09IERFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtVHlwZSA9IE1VU0lDOworICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQogCi0gICAgb3V0cHV0ID0gZ2V0T3V0cHV0KChzdHJlYW1fdHlwZSlzdHJlYW1UeXBlKTsKKyAgICBvdXRwdXQgPSBnZXRPdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtVHlwZSk7CiAgICAgaWYgKG91dHB1dCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0zMzgsMTEgKzMzMywxMSBAQAogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICBpZiAoc3RyZWFtID09IERFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtID0gTVVTSUM7CisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICBzdHJlYW0gPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQogCi0gICAgcmV0dXJuIGFmLT5nZXRSZW5kZXJQb3NpdGlvbihoYWxGcmFtZXMsIGRzcEZyYW1lcywgZ2V0T3V0cHV0KChzdHJlYW1fdHlwZSlzdHJlYW0pKTsKKyAgICByZXR1cm4gYWYtPmdldFJlbmRlclBvc2l0aW9uKGhhbEZyYW1lcywgZHNwRnJhbWVzLCBnZXRPdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSk7CiB9CiAKIHVuc2lnbmVkIGludCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7CkBAIC00NTUsMTAgKzQ1MCwxMCBAQAogCiBib29sIEF1ZGlvU3lzdGVtOjpyb3V0ZWRUb0EyZHBPdXRwdXQoaW50IHN0cmVhbVR5cGUpIHsKICAgICBzd2l0Y2goc3RyZWFtVHlwZSkgewotICAgIGNhc2UgTVVTSUM6Ci0gICAgY2FzZSBWT0lDRV9DQUxMOgotICAgIGNhc2UgQkxVRVRPT1RIX1NDTzoKLSAgICBjYXNlIFNZU1RFTToKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00OTcsOSArNDkyLDkgQEAKICAgICByZXR1cm4gZ0F1ZGlvUG9saWN5U2VydmljZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC01MDcsMTEgKzUwMiwxMSBAQAogICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7CiB9CiAKLUF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXMgZGV2aWNlLAorYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiBERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKIAogICAgIHJldHVybiBhcHMtPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIGRldmljZV9hZGRyZXNzKTsKIH0KQEAgLTUzMSwyNiArNTI2LDI2IEBACiAgICAgcmV0dXJuIGFwcy0+c2V0UmluZ2VyTW9kZShtb2RlLCBtYXNrKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEZvcmNlVXNlKGZvcmNlX3VzZSB1c2FnZSwgZm9yY2VkX2NvbmZpZyBjb25maWcpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhcHMtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwogfQogCi1BdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBBdWRpb1N5c3RlbTo6Z2V0Rm9yY2VVc2UoZm9yY2VfdXNlIHVzYWdlKQorYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1N5c3RlbTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gRk9SQ0VfTk9ORTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXRGb3JjZVVzZSh1c2FnZSk7CiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dChzdHJlYW1fdHlwZSBzdHJlYW0sCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmxhZ3MgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKICAgICAvLyBEbyBub3QgdXNlIHN0cmVhbSB0byBvdXRwdXQgbWFwIGNhY2hlIGlmIHRoZSBkaXJlY3Qgb3V0cHV0CkBAIC01NjEsOSArNTU2LDkgQEAKICAgICAvLyBiZSByZXdvcmtlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiB3aXRoIGRpcmVjdCBvdXRwdXRzLiBUaGlzIGNvZGUgaXMgdG9vIHNwZWNpZmljCiAgICAgLy8gdG8gdGhlIGZpcnN0IHVzZSBjYXNlIHdlIHdhbnQgdG8gY292ZXIgKFZvaWNlIFJlY29nbml0aW9uIGFuZCBWb2ljZSBEaWFsZXIgb3ZlcgogICAgIC8vIEJsdWV0b290aCBTQ08KLSAgICBpZiAoKGZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCAmJgotICAgICAgICAoKHN0cmVhbSAhPSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCAmJiBzdHJlYW0gIT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHx8Ci0gICAgICAgICBjaGFubmVscyAhPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTyB8fAorICAgIGlmICgoZmxhZ3MgJiBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwICYmCisgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmIHN0cmVhbSAhPSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgfHwKKyAgICAgICAgIGNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gfHwKICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gODAwMCAmJiBzYW1wbGluZ1JhdGUgIT0gMTYwMDApKSkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgICAgICBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z1N0cmVhbU91dHB1dE1hcC52YWx1ZUZvcihzdHJlYW0pOwpAQCAtNTczLDcgKzU2OCw3IEBACiAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CiAgICAgICAgIG91dHB1dCA9IGFwcy0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncyk7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdTdHJlYW1PdXRwdXRNYXAuYWRkKHN0cmVhbSwgb3V0cHV0KTsKICAgICAgICAgfQpAQCAtNTgyLDcgKzU3Nyw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtNTkxLDcgKzU4Niw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CkBAIC02MTAsMTEgKzYwNSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgYWNvdXN0aWNzKTsKKyAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBhY291c3RpY3MsIHNlc3Npb25JZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQpAQCAtNjM4LDcgKzYzNCw3IEBACiAgICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShzdHJlYW1fdHlwZSBzdHJlYW0sCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKIHsKQEAgLTY0NywyOCArNjQzLDI4IEBACiAgICAgcmV0dXJuIGFwcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFwcy0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCAqaW5kZXgpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4KTsKIH0KIAotdWludDMyX3QgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiAwOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CkBAIC02ODMsMTQgKzY3OSwxNCBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5yZWdpc3RlckVmZmVjdChkZXNjLCBvdXRwdXQsIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIGFwcy0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKQEAgLTcwMCw5ICs2OTYsMTEgQEAKICAgICByZXR1cm4gYXBzLT51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzU3RyZWFtQWN0aXZlKGludCBzdHJlYW0sIGJvb2wqIHN0YXRlLCB1aW50MzJfdCBpblBhc3RNcykgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzU3RyZWFtQWN0aXZlKGludCBzdHJlYW0sIGJvb2wqIHN0YXRlLCB1aW50MzJfdCBpblBhc3RNcykKK3sKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgICpzdGF0ZSA9IGFwcy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzE3LDI3NiArNzE1LDUgQEAKICAgICBMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIHVzZSBlbXVsYXRlZCBwb3Bjb3VudCBvcHRpbWl6YXRpb24KLS8vIGh0dHA6Ly93d3cuZGYubHRoLnNlL35qb2huX2UvZ2Vtcy9nZW0wMDJkLmh0bWwKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpwb3BDb3VudCh1aW50MzJfdCB1KQotewotICAgIHUgPSAoKHUmMHg1NTU1NTU1NSkgKyAoKHU+PjEpJjB4NTU1NTU1NTUpKTsKLSAgICB1ID0gKCh1JjB4MzMzMzMzMzMpICsgKCh1Pj4yKSYweDMzMzMzMzMzKSk7Ci0gICAgdSA9ICgodSYweDBmMGYwZjBmKSArICgodT4+NCkmMHgwZjBmMGYwZikpOwotICAgIHUgPSAoKHUmMHgwMGZmMDBmZikgKyAoKHU+PjgpJjB4MDBmZjAwZmYpKTsKLSAgICB1ID0gKCB1JjB4MDAwMGZmZmYpICsgKHU+PjE2KTsKLSAgICByZXR1cm4gdTsKLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpCi17Ci0gICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgotICAgICAgICAoKGRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTEwpID09IDApKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlcyBkZXZpY2UpCi17Ci0gICAgaWYgKChwb3BDb3VudChkZXZpY2UpID09IDEgKSAmJgotICAgICAgICAoKGRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX0lOX0FMTCkgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKGF1ZGlvX2RldmljZXMgZGV2aWNlKQotewotICAgIGlmICgocG9wQ291bnQoZGV2aWNlKSA9PSAxICkgJiYKLSAgICAgICAgKGRldmljZSAmIChBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9TeXN0ZW06OmlzQmx1ZXRvb3RoU2NvRGV2aWNlKGF1ZGlvX2RldmljZXMgZGV2aWNlKQotewotICAgIGlmICgocG9wQ291bnQoZGV2aWNlKSA9PSAxICkgJiYKLSAgICAgICAgKGRldmljZSAmIChBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfAotICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJvb2wgQXVkaW9TeXN0ZW06OmlzTG93VmlzaWJpbGl0eShzdHJlYW1fdHlwZSBzdHJlYW0pCi17Ci0gICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6U1lTVEVNIHx8Ci0gICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Tk9USUZJQ0FUSU9OIHx8Ci0gICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6UklORykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc0lucHV0Q2hhbm5lbCh1aW50MzJfdCBjaGFubmVsKQotewotICAgIGlmICgoY2hhbm5lbCAmIH5BdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9BTEwpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNPdXRwdXRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWwpCi17Ci0gICAgaWYgKChjaGFubmVsICYgfkF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9BTEwpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1N5c3RlbTo6aXNWYWxpZEZvcm1hdCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQgJiBNQUlOX0ZPUk1BVF9NQVNLKSB7Ci0gICAgY2FzZSAgICAgICAgIFBDTToKLSAgICBjYXNlICAgICAgICAgTVAzOgotICAgIGNhc2UgICAgICAgICBBTVJfTkI6Ci0gICAgY2FzZSAgICAgICAgIEFNUl9XQjoKLSAgICBjYXNlICAgICAgICAgQUFDOgotICAgIGNhc2UgICAgICAgICBIRV9BQUNfVjE6Ci0gICAgY2FzZSAgICAgICAgIEhFX0FBQ19WMjoKLSAgICBjYXNlICAgICAgICAgVk9SQklTOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTSh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlICAgICAgICAgUENNXzE2X0JJVDoKLSAgICBjYXNlICAgICAgICAgUENNXzhfQklUOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXVkaW9QYXJhbWV0ZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nID0gInJvdXRpbmciOwotY29uc3QgY2hhciAqQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSA9ICJzYW1wbGluZ19yYXRlIjsKLWNvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQgPSAiZm9ybWF0IjsKLWNvbnN0IGNoYXIgKkF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyA9ICJjaGFubmVscyI7Ci1jb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCA9ICJmcmFtZV9jb3VudCI7Ci1jb25zdCBjaGFyICpBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UgPSAiaW5wdXRfc291cmNlIjsKLQotQXVkaW9QYXJhbWV0ZXI6OkF1ZGlvUGFyYW1ldGVyKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgY2hhciAqc3RyID0gbmV3IGNoYXJba2V5VmFsdWVQYWlycy5sZW5ndGgoKSsxXTsKLSAgICBtS2V5VmFsdWVQYWlycyA9IGtleVZhbHVlUGFpcnM7Ci0KLSAgICBzdHJjcHkoc3RyLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLSAgICBjaGFyICpwYWlyID0gc3RydG9rKHN0ciwgIjsiKTsKLSAgICB3aGlsZSAocGFpciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4ocGFpcikgIT0gMCkgewotICAgICAgICAgICAgc2l6ZV90IGVxSWR4ID0gc3RyY3NwbihwYWlyLCAiPSIpOwotICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBTdHJpbmc4KHBhaXIsIGVxSWR4KTsKLSAgICAgICAgICAgIFN0cmluZzggdmFsdWU7Ci0gICAgICAgICAgICBpZiAoZXFJZHggPT0gc3RybGVuKHBhaXIpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KHBhaXIgKyBlcUlkeCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA8IDApIHsKLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnJlcGxhY2VWYWx1ZUZvcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR1YoIkF1ZGlvUGFyYW1ldGVyKCkgY3N0b3IgZW1wdHkga2V5IHZhbHVlIHBhaXIiKTsKLSAgICAgICAgfQotICAgICAgICBwYWlyID0gc3RydG9rKE5VTEwsICI7Iik7Ci0gICAgfQotCi0gICAgZGVsZXRlW10gc3RyOwotfQotCi1BdWRpb1BhcmFtZXRlcjo6fkF1ZGlvUGFyYW1ldGVyKCkKLXsKLSAgICBtUGFyYW1ldGVycy5jbGVhcigpOwotfQotCi1TdHJpbmc4IEF1ZGlvUGFyYW1ldGVyOjp0b1N0cmluZygpCi17Ci0gICAgU3RyaW5nOCBzdHIgPSBTdHJpbmc4KCIiKTsKLQotICAgIHNpemVfdCBzaXplID0gbVBhcmFtZXRlcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHN0ciArPSBtUGFyYW1ldGVycy5rZXlBdChpKTsKLSAgICAgICAgc3RyICs9ICI9IjsKLSAgICAgICAgc3RyICs9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChpIDwgKHNpemUgLSAxKSkgc3RyICs9ICI7IjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKQotewotICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPCAwKSB7Ci0gICAgICAgIG1QYXJhbWV0ZXJzLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1QYXJhbWV0ZXJzLnJlcGxhY2VWYWx1ZUZvcihrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSkKLXsKLSAgICBjaGFyIHN0clsxMl07Ci0gICAgaWYgKHNucHJpbnRmKHN0ciwgMTIsICIlZCIsIHZhbHVlKSA+IDApIHsKLSAgICAgICAgU3RyaW5nOCBzdHI4ID0gU3RyaW5nOChzdHIpOwotICAgICAgICByZXR1cm4gYWRkKGtleSwgc3RyOCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGZsb2F0IHZhbHVlKQotewotICAgIGNoYXIgc3RyWzIzXTsKLSAgICBpZiAoc25wcmludGYoc3RyLCAyMywgIiUuMTBmIiwgdmFsdWUpID4gMCkgewotICAgICAgICBTdHJpbmc4IHN0cjggPSBTdHJpbmc4KHN0cik7Ci0gICAgICAgIHJldHVybiBhZGQoa2V5LCBzdHI4KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OnJlbW92ZShjb25zdCBTdHJpbmc4JiBrZXkpCi17Ci0gICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7Ci0gICAgICAgIG1QYXJhbWV0ZXJzLnJlbW92ZUl0ZW0oa2V5KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0KGNvbnN0IFN0cmluZzgmIGtleSwgU3RyaW5nOCYgdmFsdWUpCi17Ci0gICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7Ci0gICAgICAgIHZhbHVlID0gbVBhcmFtZXRlcnMudmFsdWVGb3Ioa2V5KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0SW50KGNvbnN0IFN0cmluZzgmIGtleSwgaW50JiB2YWx1ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjg7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7Ci0gICAgdmFsdWUgPSAwOwotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaW50IHZhbDsKLSAgICAgICAgaWYgKHNzY2FuZihzdHI4LnN0cmluZygpLCAiJWQiLCAmdmFsKSA9PSAxKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IHZhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjg7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7Ci0gICAgdmFsdWUgPSAwOwotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgZmxvYXQgdmFsOwotICAgICAgICBpZiAoc3NjYW5mKHN0cjguc3RyaW5nKCksICIlZiIsICZ2YWwpID09IDEpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuc2l6ZSgpID4gaW5kZXgpIHsKLSAgICAgICAga2V5ID0gbVBhcmFtZXRlcnMua2V5QXQoaW5kZXgpOwotICAgICAgICB2YWx1ZSA9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19CiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IDhkOGY2N2IuLjMxZWI5N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC0zNSw2ICszNSwxMiBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQpAQCAtODEsNyArODcsNyBAQAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05MCw3ICs5Niw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAsIGZhbHNlLCBzZXNzaW9uSWQpOwogfQpAQCAtOTksNyArMTA1LDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMDgsNyArMTE0LDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCkKIHsKLSAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbHMsCisgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgMCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSwgc2Vzc2lvbklkKTsKIH0KQEAgLTEzNSw3ICsxNDEsNyBAQAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xNjQsMzkgKzE3MCw0MSBAQAogICAgIH0KIAogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KLSAgICBpZiAoc3RyZWFtVHlwZSA9PSBBdWRpb1N5c3RlbTo6REVGQVVMVCkgewotICAgICAgICBzdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06Ok1VU0lDOworICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQogICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgc2FtcGxlUmF0ZSA9IGFmU2FtcGxlUmF0ZTsKICAgICB9CiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgogICAgIGlmIChmb3JtYXQgPT0gMCkgewotICAgICAgICBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGlmIChjaGFubmVscyA9PSAwKSB7Ci0gICAgICAgIGNoYW5uZWxzID0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgeworICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCi0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNWYWxpZEZvcm1hdChmb3JtYXQpKSB7CisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIGZvcm1hdCBpcyBub3QgbGluZWFyIFBDTQotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKLSAgICAgICAgZmxhZ3MgfD0gQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBmbGFncyB8PSBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUOwogICAgIH0KIAotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzT3V0cHV0Q2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW1UeXBlLAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgKEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MpZmxhZ3MpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdClmbGFncyk7CiAKICAgICBpZiAob3V0cHV0ID09IDApIHsKICAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CkBAIC0yMTQsOCArMjIyLDggQEAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1RyYWNrCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlVHJhY2tfbChzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKQEAgLTIzNyw4ICsyNDUsOCBAQAogICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1DaGFubmVscyA9IGNoYW5uZWxzOworICAgIG1Gb3JtYXQgPSAodWludDMyX3QpZm9ybWF0OworICAgIG1DaGFubmVsTWFzayA9ICh1aW50MzJfdCljaGFubmVsTWFzazsKICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwogICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbU11dGVkID0gZmFsc2U7CkBAIC0yODksOCArMjk3LDggQEAKIAogaW50IEF1ZGlvVHJhY2s6OmZyYW1lU2l6ZSgpIGNvbnN0CiB7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgewotICAgICAgICByZXR1cm4gY2hhbm5lbENvdW50KCkqKChmb3JtYXQoKSA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSA/IHNpemVvZih1aW50OF90KSA6IHNpemVvZihpbnQxNl90KSk7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGNoYW5uZWxDb3VudCgpKmF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHNpemVvZih1aW50OF90KTsKICAgICB9CkBAIC0zMDYsNyArMzE0LDcgQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RhcnQoKQogewogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBMT0dWKCJzdGFydCAlcCIsIHRoaXMpOwogICAgIGlmICh0ICE9IDApIHsKQEAgLTMyOSwyMyArMzM3LDIzIEBACiAgICAgaWYgKG1BY3RpdmUgPT0gMCkgewogICAgICAgICBtQWN0aXZlID0gMTsKICAgICAgICAgbU5ld1Bvc2l0aW9uID0gY2Jsay0+c2VydmVyICsgbVVwZGF0ZVBlcmlvZDsKKyAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgIGNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVM7CiAgICAgICAgIGNibGstPndhaXRUaW1lTXMgPSAwOwotICAgICAgICBjYmxrLT5mbGFncyAmPSB+Q0JMS19ESVNBQkxFRF9PTjsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9CiAKICAgICAgICAgTE9HVigic3RhcnQgJXAgYmVmb3JlIGxvY2sgY2JsayAlcCIsIHRoaXMsIG1DYmxrKTsKLSAgICAgICAgY2Jsay0+bG9jay5sb2NrKCk7CiAgICAgICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKICAgICAgICAgICAgIGNibGstPmxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewotICAgICAgICAgICAgICAgIGNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9NU0s7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spIHsKQEAgLTU0NiwxMiArNTU0LDEzIEBACiAgICAgfQogCiAgICAgaWYgKGxvb3BTdGFydCA+PSBsb29wRW5kIHx8Ci0gICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPiBjYmxrLT5mcmFtZUNvdW50KSB7CisgICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPiBjYmxrLT5mcmFtZUNvdW50IHx8CisgICAgICAgIGNibGstPnNlcnZlciA+IGxvb3BTdGFydCkgewogICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3BTdGFydCAlZCwgbG9vcEVuZCAlZCwgbG9vcENvdW50ICVkLCBmcmFtZWNvdW50ICVkLCB1c2VyICVkIiwgbG9vcFN0YXJ0LCBsb29wRW5kLCBsb29wQ291bnQsIGNibGstPmZyYW1lQ291bnQsIGNibGstPnVzZXIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICgobVNoYXJlZEJ1ZmZlciAhPSAwKSAmJiAobG9vcEVuZCAgID4gY2Jsay0+ZnJhbWVDb3VudCkpIHsKKyAgICBpZiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgJiYgKGxvb3BFbmQgPiBjYmxrLT5mcmFtZUNvdW50KSkgewogICAgICAgICBMT0dFKCJzZXRMb29wIGludmFsaWQgdmFsdWU6IGxvb3AgbWFya2VycyBiZXlvbmQgZGF0YTogbG9vcFN0YXJ0ICVkLCBsb29wRW5kICVkLCBmcmFtZWNvdW50ICVkIiwKICAgICAgICAgICAgIGxvb3BTdGFydCwgbG9vcEVuZCwgY2Jsay0+ZnJhbWVDb3VudCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC02MzUsNyArNjQ0LDcgQEAKICAgICBpZiAocG9zaXRpb24gPiBtQ2Jsay0+dXNlcikgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIG1DYmxrLT5zZXJ2ZXIgPSBwb3NpdGlvbjsKLSAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19GT1JDRVJFQURZX09OOworICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRk9SQ0VSRUFEWV9PTiwgJm1DYmxrLT5mbGFncyk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02NzEsOCArNjgwLDggQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQogewotICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxzLCAoQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyltRmxhZ3MpOworICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOwogfQogCiBpbnQgQXVkaW9UcmFjazo6Z2V0U2Vzc2lvbklkKCkKQEAgLTY5Niw4ICs3MDUsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTcyNSw3ICs3MzQsNyBAQAogICAgIH0KIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfQpAQCAtNzU4LDYgKzc2Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbGNvdW50CisgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKCgodWludDMyX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoY2hhbm5lbENvdW50IHwgMSkpICE9IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbmVtZW50OiBhZGRyZXNzICVwLCBjaGFubmVsQ291bnQgJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgY2hhbm5lbENvdW50KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNzcwLDcgKzc4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLApAQCAtNzkyLDcgKzgwMiw3IEBACiAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICBtQ2Jsa01lbW9yeSA9IGNibGs7CiAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwotICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX0RJUkVDVElPTl9PVVQ7CisgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19ESVJFQ1RJT05fT1VULCAmbUNibGstPmZsYWdzKTsKICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbUNibGstPmJ1ZmZlcnMgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewpAQCAtODE1LDcgKzgyNSw3IEBACiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGludCBhY3RpdmU7Ci0gICAgc3RhdHVzX3QgcmVzdWx0OworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIHVpbnQzMl90IGZyYW1lc1JlcSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHVpbnQzMl90IHdhaXRUaW1lTXMgPSAod2FpdENvdW50IDwgMCkgPyBjYmxrLT5idWZmZXJUaW1lb3V0TXMgOiBXQUlUX1BFUklPRF9NUzsKQEAgLTgyNSw2ICs4MzUsMTIgQEAKIAogICAgIHVpbnQzMl90IGZyYW1lc0F2YWlsID0gY2Jsay0+ZnJhbWVzQXZhaWxhYmxlKCk7CiAKKyAgICBjYmxrLT5sb2NrLmxvY2soKTsKKyAgICBpZiAoY2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSB7CisgICAgICAgIGdvdG8gY3JlYXRlX25ld190cmFjazsKKyAgICB9CisgICAgY2Jsay0+bG9jay51bmxvY2soKTsKKwogICAgIGlmIChmcmFtZXNBdmFpbCA9PSAwKSB7CiAgICAgICAgIGNibGstPmxvY2subG9jaygpOwogICAgICAgICBnb3RvIHN0YXJ0X2xvb3BfaGVyZTsKQEAgLTg2Niw3ICs4ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5sb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gREVBRF9PQkpFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5mbGFncyB8PSBDQkxLX0lOVkFMSURfTVNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRF9PTiwgJmNibGstPmZsYWdzKTsKIGNyZWF0ZV9uZXdfdHJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdG9yZVRyYWNrX2woY2JsaywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODkzLDcgKzkwOSw3IEBACiAKICAgICAvLyByZXN0YXJ0IHRyYWNrIGlmIGl0IHdhcyBkaXNhYmxlZCBieSBhdWRpb2ZsaW5nZXIgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuCiAgICAgaWYgKG1BY3RpdmUgJiYgKGNibGstPmZsYWdzICYgQ0JMS19ESVNBQkxFRF9NU0spKSB7Ci0gICAgICAgIGNibGstPmZsYWdzICY9IH5DQkxLX0RJU0FCTEVEX09OOworICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRURfT04sICZjYmxrLT5mbGFncyk7CiAgICAgICAgIExPR1coIm9idGFpbkJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkLCByZXN0YXJ0aW5nIiwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgIH0KQEAgLTkxNSw4ICs5MzEsOCBAQAogICAgIGF1ZGlvQnVmZmVyLT5jaGFubmVsQ291bnQgPSBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gZnJhbWVzUmVxOwogICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gZnJhbWVzUmVxICogY2Jsay0+ZnJhbWVTaXplOwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00obUZvcm1hdCkpIHsKLSAgICAgICAgYXVkaW9CdWZmZXItPmZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIGF1ZGlvQnVmZmVyLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9IGVsc2UgewogICAgICAgICBhdWRpb0J1ZmZlci0+Zm9ybWF0ID0gbUZvcm1hdDsKICAgICB9CkBAIC05NTcsOSArOTczLDEwIEBACiAgICAgc3NpemVfdCB3cml0dGVuID0gMDsKICAgICBjb25zdCBpbnQ4X3QgKnNyYyA9IChjb25zdCBpbnQ4X3QgKilidWZmZXI7CiAgICAgQnVmZmVyIGF1ZGlvQnVmZmVyOworICAgIHNpemVfdCBmcmFtZVN6ID0gKHNpemVfdClmcmFtZVNpemUoKTsKIAogICAgIGRvIHsKLSAgICAgICAgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IHVzZXJTaXplL2ZyYW1lU2l6ZSgpOworICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUvZnJhbWVTejsKIAogICAgICAgICAvLyBDYWxsaW5nIG9idGFpbkJ1ZmZlcigpIHdpdGggYSBuZWdhdGl2ZSB3YWl0IGNvdW50IGNhdXNlcwogICAgICAgICAvLyBhbiAoYWxtb3N0KSBpbmZpbml0ZSB3YWl0IHRpbWUuCkBAIC05NzMsNyArOTkwLDcgQEAKIAogICAgICAgICBzaXplX3QgdG9Xcml0ZTsKIAotICAgICAgICBpZiAobUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUICYmICEobUZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCAmJiAhKG1GbGFncyAmIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1QpKSB7CiAgICAgICAgICAgICAvLyBEaXZpZGUgY2FwYWNpdHkgYnkgMiB0byB0YWtlIGV4cGFuc2lvbiBpbnRvIGFjY291bnQKICAgICAgICAgICAgIHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplPj4xOwogICAgICAgICAgICAgLy8gOCB0byAxNiBiaXQgY29udmVyc2lvbgpAQCAtOTkxLDcgKzEwMDgsNyBAQAogICAgICAgICB3cml0dGVuICs9IHRvV3JpdGU7CiAKICAgICAgICAgcmVsZWFzZUJ1ZmZlcigmYXVkaW9CdWZmZXIpOwotICAgIH0gd2hpbGUgKHVzZXJTaXplKTsKKyAgICB9IHdoaWxlICh1c2VyU2l6ZSA+PSBmcmFtZVN6KTsKIAogICAgIHJldHVybiB3cml0dGVuOwogfQpAQCAtMTAxMywxNCArMTAzMCwxMyBAQAogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgLy8gTWFuYWdlIHVuZGVycnVuIGNhbGxiYWNrCi0gICAgaWYgKG1BY3RpdmUgJiYgKGNibGstPmZyYW1lc1JlYWR5KCkgPT0gMCkpIHsKKyAgICBpZiAobUFjdGl2ZSAmJiAoY2Jsay0+ZnJhbWVzQXZhaWxhYmxlKCkgPT0gY2Jsay0+ZnJhbWVDb3VudCkpIHsKICAgICAgICAgTE9HVigiVW5kZXJydW4gdXNlcjogJXgsIHNlcnZlcjogJXgsIGZsYWdzICUwNHgiLCBjYmxrLT51c2VyLCBjYmxrLT5zZXJ2ZXIsIGNibGstPmZsYWdzKTsKLSAgICAgICAgaWYgKChjYmxrLT5mbGFncyAmIENCTEtfVU5ERVJSVU5fTVNLKSA9PSBDQkxLX1VOREVSUlVOX09GRikgeworICAgICAgICBpZiAoIShhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOX09OLCAmY2Jsay0+ZmxhZ3MpICYgQ0JMS19VTkRFUlJVTl9NU0spKSB7CiAgICAgICAgICAgICBtQ2JmKEVWRU5UX1VOREVSUlVOLCBtVXNlckRhdGEsIDApOwogICAgICAgICAgICAgaWYgKGNibGstPnNlcnZlciA9PSBjYmxrLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgbUNiZihFVkVOVF9CVUZGRVJfRU5ELCBtVXNlckRhdGEsIDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICAgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNzcsNyArMTA5Myw3IEBACiAgICAgICAgIC8vIERpdmlkZSBidWZmZXIgc2l6ZSBieSAyIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBleHBhbnNpb24KICAgICAgICAgLy8gZHVlIHRvIDggdG8gMTYgYml0IGNvbnZlcnNpb246IHRoZSBjYWxsYmFjayBtdXN0IGZpbGwgb25seSBoYWxmCiAgICAgICAgIC8vIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCAmJiAhKG1GbGFncyAmIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpKSB7CisgICAgICAgIGlmIChtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgIShtRmxhZ3MgJiBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUKSkgewogICAgICAgICAgICAgYXVkaW9CdWZmZXIuc2l6ZSA+Pj0gMTsKICAgICAgICAgfQogCkBAIC0xMDk2LDcgKzExMTIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmICh3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHdyaXR0ZW5TaXplID0gcmVxU2l6ZTsKIAotICAgICAgICBpZiAobUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUICYmICEobUZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCAmJiAhKG1GbGFncyAmIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19ESVJFQ1QpKSB7CiAgICAgICAgICAgICAvLyA4IHRvIDE2IGJpdCBjb252ZXJzaW9uCiAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKnNyYyA9IGF1ZGlvQnVmZmVyLmk4ICsgd3JpdHRlblNpemUtMTsKICAgICAgICAgICAgIGludCBjb3VudCA9IHdyaXR0ZW5TaXplOwpAQCAtMTEzNCwxMSArMTE1MCwxMCBAQAogewogICAgIHN0YXR1c190IHJlc3VsdDsKIAotICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19SRVNUT1JJTkdfTVNLKSkgeworICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfUkVTVE9SSU5HX09OLCAmY2Jsay0+ZmxhZ3MpICYgQ0JMS19SRVNUT1JJTkdfTVNLKSkgewogICAgICAgICBMT0dXKCJkZWFkIElBdWRpb1RyYWNrLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcyIsCiAgICAgICAgICAgICAgZnJvbVN0YXJ0ID8gInN0YXJ0KCkiIDogIm9idGFpbkJ1ZmZlcigpIik7CiAKLSAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19SRVNUT1JJTkdfT047CiAgICAgICAgIC8vIHNpZ25hbCBvbGQgY2JsayBjb25kaXRpb24gc28gdGhhdCBvdGhlciB0aHJlYWRzIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBidWZmZXJzIHN0b3AKICAgICAgICAgLy8gd2FpdGluZyBub3cKICAgICAgICAgY2Jsay0+Y3YuYnJvYWRjYXN0KCk7CkBAIC0xMTUwLDcgKzExNjUsNyBAQAogICAgICAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlciwKQEAgLTExNTgsMTAgKzExNzMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gcmVzdG9yZSB3cml0ZSBpbmRleCBhbmQgc2V0IG90aGVyIGluZGV4ZXMgdG8gcmVmbGVjdCBlbXB0eSBidWZmZXIgc3RhdHVzCisgICAgICAgICAgICBtQ2Jsay0+dXNlciA9IGNibGstPnVzZXI7CisgICAgICAgICAgICBtQ2Jsay0+c2VydmVyID0gY2Jsay0+dXNlcjsKKyAgICAgICAgICAgIG1DYmxrLT51c2VyQmFzZSA9IGNibGstPnVzZXI7CisgICAgICAgICAgICBtQ2Jsay0+c2VydmVyQmFzZSA9IGNibGstPnVzZXI7CisgICAgICAgICAgICAvLyByZXN0b3JlIGxvb3A6IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBpZiBuZXcgZnJhbWUgY291bnQgaXMgbm90CisgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggbG9vcCBsZW5ndGgKKyAgICAgICAgICAgIHNldExvb3BfbChjYmxrLT5sb29wU3RhcnQsIGNibGstPmxvb3BFbmQsIGNibGstPmxvb3BDb3VudCk7CiAgICAgICAgICAgICBpZiAoIWZyb21TdGFydCkgewogICAgICAgICAgICAgICAgIG1DYmxrLT5idWZmZXJUaW1lb3V0TXMgPSBNQVhfUlVOX1RJTUVPVVRfTVM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZnJvbVN0YXJ0ICYmIHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbiA9IG1DYmxrLT5zZXJ2ZXIgKyBtVXBkYXRlUGVyaW9kOwogICAgICAgICAgICAgfQpAQCAtMTE3MSwxMCArMTE5Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBzaWduYWwgb2xkIGNibGsgY29uZGl0aW9uIGZvciBvdGhlciB0aHJlYWRzIHdhaXRpbmcgZm9yIHJlc3RvcmUgY29tcGxldGlvbgotICAgICAgICBjYmxrLT5sb2NrLmxvY2soKTsKLSAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19SRVNUT1JFRF9NU0s7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfUkVTVE9SRURfT04sICZjYmxrLT5mbGFncyk7CiAgICAgICAgIGNibGstPmN2LmJyb2FkY2FzdCgpOwotICAgICAgICBjYmxrLT5sb2NrLnVubG9jaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGNibGstPmZsYWdzICYgQ0JMS19SRVNUT1JFRF9NU0spKSB7CiAgICAgICAgICAgICBMT0dXKCJkZWFkIElBdWRpb1RyYWNrLCB3YWl0aW5nIGZvciBhIG5ldyBvbmUiKTsKQEAgLTEyNDgsMTEgKzEyNzEsMTIgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisKIGF1ZGlvX3RyYWNrX2NibGtfdDo6YXVkaW9fdHJhY2tfY2Jsa190KCkKICAgICA6IGxvY2soTXV0ZXg6OlNIQVJFRCksIGN2KENvbmRpdGlvbjo6U0hBUkVEKSwgdXNlcigwKSwgc2VydmVyKDApLAogICAgIHVzZXJCYXNlKDApLCBzZXJ2ZXJCYXNlKDApLCBidWZmZXJzKDApLCBmcmFtZUNvdW50KDApLAogICAgIGxvb3BTdGFydChVSU5UX01BWCksIGxvb3BFbmQoVUlOVF9NQVgpLCBsb29wQ291bnQoMCksIHZvbHVtZUxSKDApLAotICAgIGZsYWdzKDApLCBzZW5kTGV2ZWwoMCkKKyAgICBzZW5kTGV2ZWwoMCksIGZsYWdzKDApCiB7CiB9CiAKQEAgLTEyNzksMjUgKzEzMDMsMTcgQEAKICAgICB0aGlzLT51c2VyID0gdTsKIAogICAgIC8vIENsZWFyIGZsb3cgY29udHJvbCBlcnJvciBjb25kaXRpb24gYXMgbmV3IGRhdGEgaGFzIGJlZW4gd3JpdHRlbi9yZWFkIHRvL2Zyb20gYnVmZmVyLgotICAgIGZsYWdzICY9IH5DQkxLX1VOREVSUlVOX01TSzsKKyAgICBpZiAoZmxhZ3MgJiBDQkxLX1VOREVSUlVOX01TSykgeworICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfVU5ERVJSVU5fTVNLLCAmZmxhZ3MpOworICAgIH0KIAogICAgIHJldHVybiB1OwogfQogCiBib29sIGF1ZGlvX3RyYWNrX2NibGtfdDo6c3RlcFNlcnZlcih1aW50MzJfdCBmcmFtZUNvdW50KQogewotICAgIC8vIHRoZSBjb2RlIGJlbG93IHNpbXVsYXRlcyBsb2NrLXdpdGgtdGltZW91dAotICAgIC8vIHdlIE1VU1QgZG8gdGhpcyB0byBwcm90ZWN0IHRoZSBBdWRpb0ZsaW5nZXIgc2VydmVyCi0gICAgLy8gYXMgdGhpcyBsb2NrIGlzIHNoYXJlZCB3aXRoIHRoZSBjbGllbnQuCi0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgZXJyID0gbG9jay50cnlMb2NrKCk7Ci0gICAgaWYgKGVyciA9PSAtRUJVU1kpIHsgLy8ganVzdCB3YWl0IGEgYml0Ci0gICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICAgICAgZXJyID0gbG9jay50cnlMb2NrKCk7Ci0gICAgfQotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gcHJvYmFibHksIHRoZSBjbGllbnQganVzdCBkaWVkLgorICAgIGlmICghdHJ5TG9jaygpKSB7CisgICAgICAgIExPR1coInN0ZXBTZXJ2ZXIoKSBjb3VsZCBub3QgbG9jayBjYmxrIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTEzNzQsMTggKzEzOTAsNDIgQEAKICAgICAgICAgaWYgKHUgPCBsb29wRW5kKSB7CiAgICAgICAgICAgICByZXR1cm4gdSAtIHM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgICAgICAgICBpZiAobG9vcENvdW50ID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxvb3BFbmQgLSBsb29wU3RhcnQpKmxvb3BDb3VudCArIHUgLSBzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVUlOVF9NQVg7CisgICAgICAgICAgICAvLyBkbyBub3QgYmxvY2sgb24gbXV0ZXggc2hhcmVkIHdpdGggY2xpZW50IG9uIEF1ZGlvRmxpbmdlciBzaWRlCisgICAgICAgICAgICBpZiAoIXRyeUxvY2soKSkgeworICAgICAgICAgICAgICAgIExPR1coImZyYW1lc1JlYWR5KCkgY291bGQgbm90IGxvY2sgY2JsayIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZnJhbWVzID0gVUlOVF9NQVg7CisgICAgICAgICAgICBpZiAobG9vcENvdW50ID49IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZXMgPSAobG9vcEVuZCAtIGxvb3BTdGFydCkqbG9vcENvdW50ICsgdSAtIHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGZyYW1lczsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBzIC0gdTsKICAgICB9CiB9CiAKK2Jvb2wgYXVkaW9fdHJhY2tfY2Jsa190Ojp0cnlMb2NrKCkKK3sKKyAgICAvLyB0aGUgY29kZSBiZWxvdyBzaW11bGF0ZXMgbG9jay13aXRoLXRpbWVvdXQKKyAgICAvLyB3ZSBNVVNUIGRvIHRoaXMgdG8gcHJvdGVjdCB0aGUgQXVkaW9GbGluZ2VyIHNlcnZlcgorICAgIC8vIGFzIHRoaXMgbG9jayBpcyBzaGFyZWQgd2l0aCB0aGUgY2xpZW50LgorICAgIHN0YXR1c190IGVycjsKKworICAgIGVyciA9IGxvY2sudHJ5TG9jaygpOworICAgIGlmIChlcnIgPT0gLUVCVVNZKSB7IC8vIGp1c3Qgd2FpdCBhIGJpdAorICAgICAgICB1c2xlZXAoMTAwMCk7CisgICAgICAgIGVyciA9IGxvY2sudHJ5TG9jaygpOworICAgIH0KKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHByb2JhYmx5LCB0aGUgY2xpZW50IGp1c3QgZGllZC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCBlZWM0N2MwLi40YTEyOTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcApAQCAtNjMsOCArNjMsNiBAQAogICAgIEdFVF9SRU5ERVJfUE9TSVRJT04sCiAgICAgR0VUX0lOUFVUX0ZSQU1FU19MT1NULAogICAgIE5FV19BVURJT19TRVNTSU9OX0lELAotICAgIExPQURfRUZGRUNUX0xJQlJBUlksCi0gICAgVU5MT0FEX0VGRkVDVF9MSUJSQVJZLAogICAgIFFVRVJZX05VTV9FRkZFQ1RTLAogICAgIFFVRVJZX0VGRkVDVCwKICAgICBHRVRfRUZGRUNUX0RFU0NSSVBUT1IsCkBAIC04NCw4ICs4Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTEwMCw3ICs5OCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1UeXBlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOwpAQCAtMTMxLDggKzEyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtMTQ1LDcgKzE0Myw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsQ291bnQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKQEAgLTE4OCw3ICsxODYsNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0CisgICAgdmlydHVhbCB1aW50MzJfdCBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC01MjgsMzcgKzUyNiw2IEBACiAgICAgICAgIHJldHVybiBpZDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQotICAgIHsKLSAgICAgICAgaWYgKGxpYlBhdGggPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gMDsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobGliUGF0aCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMT0FEX0VGRkVDVF9MSUJSQVJZLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5MT0FEX0VGRkVDVF9MSUJSQVJZLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtOTUyLDIxICs5MTksNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9TZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTE9BRF9FRkZFQ1RfTElCUkFSWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBoYW5kbGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsb2FkRWZmZWN0TGlicmFyeShkYXRhLnJlYWRDU3RyaW5nKCksICZoYW5kbGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVU5MT0FEX0VGRkVDVF9MSUJSQVJZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodW5sb2FkRWZmZWN0TGlicmFyeShkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KICAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGI4OWEyNzguLjE1ZjRiZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNSw2ICsyNSw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKQEAgLTUxLDYgKzUzLDcgQEAKICAgICBVTlJFR0lTVEVSX0VGRkVDVCwKICAgICBJU19TVFJFQU1fQUNUSVZFLAogICAgIEdFVF9ERVZJQ0VTX0ZPUl9TVFJFQU0sCisgICAgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORwogfTsKIAogY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZT4KQEAgLTYyLDggKzY1LDggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTc1LDggKzc4LDggQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtODQsNyArODcsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZT4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4ocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShpbnQgc3RhdGUpCkBAIC0xMDYsNyArMTA5LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTE2LDIxICsxMTksMjEgQEAKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHVzYWdlKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRk9SQ0VfVVNFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnPiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTE0NCw3ICsxNDcsNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xNTcsNyArMTYwLDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xODIsNyArMTg1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTE5MSw2ICsxOTUsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oYWNvdXN0aWNzKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTIyMSw3ICsyMjYsNyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCiAgICAgewpAQCAtMjM0LDcgKzIzOSw3IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgaW5kZXgpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTI0NCw3ICsyNDksNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgKmluZGV4KQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTI1NSw3ICsyNjAsNyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTI2NCw3ICsyNjksNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTI4Myw3ICsyODgsNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQpAQCAtMjkxLDcgKzI5Niw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJhdGVneSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKQEAgLTMxNyw2ICszMjIsMzEgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElTX1NUUkVBTV9BQ1RJVkUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKKyAgICB7CisgICAgICAgIGlmIChkZXNjcmlwdG9ycyA9PSBOVUxMIHx8IGNvdW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqY291bnQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHVpbnQzMl90IHJldENvdW50ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXRDb3VudCAhPSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBudW1EZXNjID0gKHJldENvdW50IDwgKmNvdW50KSA/IHJldENvdW50IDogKmNvdW50OworICAgICAgICAgICAgcmVwbHkucmVhZChkZXNjcmlwdG9ycywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpICogbnVtRGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgKmNvdW50ID0gcmV0Q291bnQ7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZSwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZSIpOwpAQCAtMzMwLDEwICszNjAsMTAgQEAKICAgICBzd2l0Y2goY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcz4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKQEAgLTM0Myw4ICszNzMsOCBAQAogCiAgICAgICAgIGNhc2UgR0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXM+IChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+IChkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpKSk7CkBAIC0zNjcsMjkgKzM5NywyOSBAQAogCiAgICAgICAgIGNhc2UgU0VUX0ZPUkNFX1VTRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmZvcmNlX3VzZT4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWc+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZykpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEdFVF9GT1JDRV9VU0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpmb3JjZV91c2U+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGdldEZvcmNlVXNlKHVzYWdlKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgR0VUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3M+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fcG9saWN5X291dHB1dF9mbGFnc190IGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLApAQCAtNDA2LDcgKzQzNiw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00MTcsNyArNDQ3LDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNDM1LDEzICs0NjUsMTUgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9faW5fYWNvdXN0aWNzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGdldElucHV0KGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjb3VzdGljcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjb3VzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KGlucHV0KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00NjksOCArNTAxLDggQEAKIAogICAgICAgICBjYXNlIElOSVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IGluZGV4TWluID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBpbmRleE1heCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbixpbmRleE1heCkpKTsKQEAgLTQ3OSw4ICs1MTEsOCBAQAogCiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC00ODgsOCArNTIwLDggQEAKIAogICAgICAgICBjYXNlIEdFVF9TVFJFQU1fVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgaW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sICZpbmRleCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CkBAIC00OTksMTYgKzUzMSwxNiBAQAogCiAgICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgR0VUX0RFVklDRVNfRk9SX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4oZ2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MjYsMTIgKzU1OCwxMiBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKICAgICAgICAgICAgIGRhdGEucmVhZCgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgaWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlZ2lzdGVyRWZmZWN0KCZkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKSkpOwpAQCAtNTUzLDYgKzU4NSwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgY291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgcmV0Q291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9kZXNjcmlwdG9yX3QgKiluZXcgY2hhcltjb3VudCAqIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KV07CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsICZyZXRDb3VudCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gTk9fTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgcmV0Q291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0Q291bnQpOworICAgICAgICAgICAgaWYgKHJldENvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHJldENvdW50IDwgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSByZXRDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGRlc2NyaXB0b3JzLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkgKiBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBkZXNjcmlwdG9yczsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZDUyOThjOS4uMDcxNTJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxTa0JpdG1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAvLyBUaGUgYmluZGVyIGlzIHN1cHBvc2VkIHRvIHByb3BhZ2F0ZSB0aGUgc2NoZWR1bGVyIGdyb3VwIGFjcm9zcwogLy8gdGhlIGJpbmRlciBpbnRlcmZhY2Ugc28gdGhhdCByZW1vdGUgY2FsbHMgYXJlIGV4ZWN1dGVkIHdpdGgKQEAgLTI5LDI2ICszMCw2IEBACiAvLyBmb3JlZ3JvdW5kIHRocmVhZC4KICNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQotc3RhdGljIGludCBteVRpZCgpIHsKLSNpZmRlZiBIQVZFX0dFVFRJRAotICAgIHJldHVybiBnZXR0aWQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIGdldHBpZCgpOwotI2VuZGlmCi19Ci0KICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIklNZWRpYU1ldGFkYXRhUmV0cmlldmVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNTksMTggKzQwLDE4IEBACiBzdGF0aWMgdm9pZCBzZW5kU2NoZWRQb2xpY3koUGFyY2VsJiBkYXRhKQogewogICAgIFNjaGVkUG9saWN5IHBvbGljeTsKLSAgICBnZXRfc2NoZWRfcG9saWN5KG15VGlkKCksICZwb2xpY3kpOworICAgIGdldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksICZwb2xpY3kpOwogICAgIGRhdGEud3JpdGVJbnQzMihwb2xpY3kpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRTY2hlZFBvbGljeShjb25zdCBQYXJjZWwmIGRhdGEpCiB7CiAgICAgU2NoZWRQb2xpY3kgcG9saWN5ID0gKFNjaGVkUG9saWN5KSBkYXRhLnJlYWRJbnQzMigpOwotICAgIHNldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgcG9saWN5KTsKKyAgICBzZXRfc2NoZWRfcG9saWN5KGdldHRpZCgpLCBwb2xpY3kpOwogfQogc3RhdGljIHZvaWQgcmVzdG9yZVNjaGVkUG9saWN5KCkKIHsKLSAgICBzZXRfc2NoZWRfcG9saWN5KG15VGlkKCksIFNQX0ZPUkVHUk9VTkQpOworICAgIHNldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksIFNQX0ZPUkVHUk9VTkQpOwogfQogfTsgLy8gZW5kIG5hbWVzcGFjZSBhbmRyb2lkCiAjZW5kaWYKQEAgLTEwMiwxMSArODMsMjQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBzcmNVcmwpCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoc3JjVXJsKTsKKworICAgICAgICBpZiAoaGVhZGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGhlYWRlcnMKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihoZWFkZXJzLT5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGhlYWRlcnMtPmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfVVJMLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTg4LDcgKzE4MiwxOCBAQAogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgY29uc3QgY2hhciogc3JjVXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShzcmNVcmwpKTsKKworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICAgICAgICAgIGludDMyX3QgbnVtSGVhZGVycyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAgICAgIFN0cmluZzgga2V5ID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKAorICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKHNyY1VybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9GRDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMjM5OTIxNi4uNTI4ODVkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC00OCw2ICs0OCw4IEBACiAgICAgU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwKICAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKICAgICBTRVRfVklERU9fU1VSRkFDRVRFWFRVUkUsCisgICAgU0VUX1BBUkFNRVRFUiwKKyAgICBHRVRfUEFSQU1FVEVSLAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllcj4KQEAgLTE5Miw4ICsxOTQsOSBAQAogICAgIH0KIAogICAgIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpCi0gICAgeyAvLyBBdm9pZCBkb2luZyBhbnkgZXh0cmEgY29weS4gVGhlIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZAotICAgICAgLy8gaGF2ZSBiZWVuIHNldCBieSBNZWRpYVBsYXllci5qYXZhLgorICAgIHsKKyAgICAgICAgLy8gQXZvaWQgZG9pbmcgYW55IGV4dHJhIGNvcHkuIFRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQKKyAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBieSBNZWRpYVBsYXllci5qYXZhLgogICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KElOVk9LRSwgcmVxdWVzdCwgcmVwbHkpOwogICAgIH0KIApAQCAtMjM1LDYgKzIzOCwyNiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGtleSk7CisgICAgICAgIGlmIChyZXF1ZXN0LmRhdGFTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBkYXRhLmFwcGVuZEZyb20oY29uc3RfY2FzdDxQYXJjZWwgKj4oJnJlcXVlc3QpLCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICB9CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUEFSQU1FVEVSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGtleSk7CisgICAgICAgIHJldHVybiByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BBUkFNRVRFUiwgZGF0YSwgcmVwbHkpOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFQbGF5ZXIiKTsKQEAgLTMyOSwxMyArMzUyLDE1IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0Vm9sdW1lKGRhdGEucmVhZEZsb2F0KCksIGRhdGEucmVhZEZsb2F0KCkpKTsKKyAgICAgICAgICAgIGZsb2F0IGxlZnRWb2x1bWUgPSBkYXRhLnJlYWRGbG9hdCgpOworICAgICAgICAgICAgZmxvYXQgcmlnaHRWb2x1bWUgPSBkYXRhLnJlYWRGbG9hdCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgSU5WT0tFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnZva2UoZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaW52b2tlKGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX01FVEFEQVRBX0ZJTFRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwpAQCAtMzQ0LDcgKzM2OSw5IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX01FVEFEQVRBOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBjb25zdCBzdGF0dXNfdCByZXRjb2RlID0gZ2V0TWV0YWRhdGEoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCB1cGRhdGVfb25seSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBhcHBseV9maWx0ZXIgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IHJldGNvZGUgPSBnZXRNZXRhZGF0YSh1cGRhdGVfb25seSwgYXBwbHlfZmlsdGVyLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmV0Y29kZSk7CiAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKDApOwpAQCAtMzYwLDYgKzM4NywyMyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYXR0YWNoQXV4RWZmZWN0KGRhdGEucmVhZEludDMyKCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQga2V5ID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgUGFyY2VsIHJlcXVlc3Q7CisgICAgICAgICAgICBpZiAoZGF0YS5kYXRhQXZhaWwoKSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZEZyb20oCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFBhcmNlbCAqPigmZGF0YSksIGRhdGEuZGF0YVBvc2l0aW9uKCksIGRhdGEuZGF0YUF2YWlsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX1BBUkFNRVRFUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcihkYXRhLnJlYWRJbnQzMigpLCByZXBseSk7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwCmluZGV4IGJmNTE4MjkuLjFmMTM1YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcApAQCAtMzUsMTMgKzM1LDE2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQorICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihleHQxKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV4dDIpOworICAgICAgICBpZiAob2JqICYmIG9iai0+ZGF0YVNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kRnJvbShjb25zdF9jYXN0PFBhcmNlbCAqPihvYmopLCAwLCBvYmotPmRhdGFTaXplKCkpOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRlksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC01OSw3ICs2MiwxMiBAQAogICAgICAgICAgICAgaW50IG1zZyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgZXh0MSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgZXh0MiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBub3RpZnkobXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgICAgIFBhcmNlbCBvYmo7CisgICAgICAgICAgICBpZiAoZGF0YS5kYXRhQXZhaWwoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBvYmouYXBwZW5kRnJvbShjb25zdF9jYXN0PFBhcmNlbCAqPigmZGF0YSksIGRhdGEuZGF0YVBvc2l0aW9uKCksIGRhdGEuZGF0YUF2YWlsKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnkobXNnLCBleHQxLCBleHQyLCAmb2JqKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA1OWNkMWI3Li4zOGUxMTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0yMywxNCArMjMsMTcgQEAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBSRUxFQVNFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBJTklULAogICAgIENMT1NFLAorICAgIFFVRVJZX1NVUkZBQ0VfTUVESUFTT1VSQ0UsCiAgICAgUkVTRVQsCiAgICAgU1RPUCwKICAgICBTVEFSVCwKQEAgLTQzLDcgKzQ2LDYgQEAKICAgICBTRVRfQVVESU9fRU5DT0RFUiwKICAgICBTRVRfT1VUUFVUX0ZJTEVfUEFUSCwKICAgICBTRVRfT1VUUFVUX0ZJTEVfRkQsCi0gICAgU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRCwKICAgICBTRVRfVklERU9fU0laRSwKICAgICBTRVRfVklERU9fRlJBTUVSQVRFLAogICAgIFNFVF9QQVJBTUVURVJTLApAQCAtNjAsMTYgKzYyLDMwIEBACiAgICAgewogICAgIH0KIAotICAgIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKQorICAgIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSkKICAgICB7Ci0gICAgICAgIExPR1YoInNldENhbWVyYSglcCkiLCBjYW1lcmEuZ2V0KCkpOworICAgICAgICBMT0dWKCJzZXRDYW1lcmEoJXAsJXApIiwgY2FtZXJhLmdldCgpLCBwcm94eS5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocHJveHktPmFzQmluZGVyKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NBTUVSQSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKQorICAgIHsKKyAgICAgICAgTE9HVigiUXVlcnkgU3VyZmFjZU1lZGlhU291cmNlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfU1VSRkFDRV9NRURJQVNPVVJDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaW50IHJldHVybmVkTnVsbCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmV0dXJuZWROdWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VUZXh0dXJlPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIH0KKwogICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UoJXApIiwgc3VyZmFjZS5nZXQoKSk7CkBAIC0xNjAsMTUgKzE3Niw2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgewotICAgICAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKICAgICB7CiAgICAgICAgIExPR1YoInNldFZpZGVvU2l6ZSglZHglZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTM4NywxMyArMzk0LDYgQEAKICAgICAgICAgICAgIDo6Y2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQ6IHsKLSAgICAgICAgICAgIExPR1YoIlNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGZkID0gZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WSURFT19TSVpFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfVklERU9fU0laRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CkBAIC00MzQsNyArNDM0LDIzIEBACiAgICAgICAgICAgICBMT0dWKCJTRVRfQ0FNRVJBIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmE+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldENhbWVyYShjYW1lcmEpKTsKKyAgICAgICAgICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gcHJveHkgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElDYW1lcmFSZWNvcmRpbmdQcm94eT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0Q2FtZXJhKGNhbWVyYSwgcHJveHkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBRVUVSWV9TVVJGQUNFX01FRElBU09VUkNFOiB7CisgICAgICAgICAgICBMT0dWKCJRVUVSWV9TVVJGQUNFX01FRElBU09VUkNFIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIC8vIGNhbGwgdGhlIG1lZGlhc2VydmVyIHNpZGUgdG8gY3JlYXRlCisgICAgICAgICAgICAvLyBhIHN1cmZhY2VtZWRpYXNvdXJjZQorICAgICAgICAgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlTWVkaWFTb3VyY2UgPSBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpOworICAgICAgICAgICAgLy8gVGhlIG1lZGlhc2VydmVyIG1pZ2h0IGhhdmUgZmFpbGVkIHRvIGNyZWF0ZSBhIHNvdXJjZQorICAgICAgICAgICAgaW50IHJldHVybmVkTnVsbD0gKHN1cmZhY2VNZWRpYVNvdXJjZSA9PSBOVUxMKSA/IDEgOiAwIDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJldHVybmVkTnVsbCk7CisgICAgICAgICAgICBpZiAoIXJldHVybmVkTnVsbCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlTWVkaWFTb3VyY2UtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAppbmRleCBjMTRlZTgyLi5iMzExZjM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcApAQCAtMjksNiArMjksOSBAQAogLy8gc3RhdGljCiBjb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZXN1bWVBdFBUUyA9ICJyZXN1bWUtYXQtUFRTIjsKIAorLy8gc3RhdGljCitjb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlGb3JtYXRDaGFuZ2UgPSAiZm9ybWF0LWNoYW5nZSI7CisKIGVudW0gewogICAgIC8vIElTdHJlYW1Tb3VyY2UKICAgICBTRVRfTElTVEVORVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggZWU5ZTFkOC4uOGI5NTNlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0pldFBsYXllci5oPgogCiAKLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIApAQCAtOTYsMTAgKzg5LDEwIEBACiAKICAgICAvLyBjcmVhdGUgdGhlIG91dHB1dCBBdWRpb1RyYWNrCiAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwotICAgIG1BdWRpb1RyYWNrLT5zZXQoQXVkaW9TeXN0ZW06Ok1VU0lDLCAgLy9UT0RPIHBhcmFtZXRyaXplIHRoaXMKKyAgICBtQXVkaW9UcmFjay0+c2V0KEFVRElPX1NUUkVBTV9NVVNJQywgIC8vVE9ETyBwYXJhbWV0cml6ZSB0aGlzCiAgICAgICAgICAgICBwTGliQ29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgMSwgLy8gZm9ybWF0ID0gUENNIDE2Yml0cyBwZXIgc2FtcGxlLAotICAgICAgICAgICAgKHBMaWJDb25maWctPm51bUNoYW5uZWxzID09IDIpID8gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyA6IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05PLAorICAgICAgICAgICAgKHBMaWJDb25maWctPm51bUNoYW5uZWxzID09IDIpID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKICAgICAgICAgICAgIG1UcmFja0J1ZmZlclNpemUsCiAgICAgICAgICAgICAwKTsKIApAQCAtMTg4LDcgKzE4MSw3IEBACiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IG15VGlkKCk7CisgICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKICAgICAgICAgTE9HVigiSmV0UGxheWVyOjpyZW5kZXIoKTogcmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7CiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBlNmYzYTMzLi5mMGYwN2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtMTMyLDYgKzEzMiwxNiBAQAogICAgIExPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAorLypzdGF0aWMqLyB2b2lkCitNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VkaXRvckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCYgY2FwKQoreworICAgIExPR1YoInZpZGVvZWRpdG9yIGNhcDoiKTsKKyAgICBMT0dWKCJtTWF4SW5wdXRGcmFtZVdpZHRoID0gJWQiLCBjYXAubU1heElucHV0RnJhbWVXaWR0aCk7CisgICAgTE9HVigibU1heElucHV0RnJhbWVIZWlnaHQgPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZUhlaWdodCk7CisgICAgTE9HVigibU1heE91dHB1dEZyYW1lV2lkdGggPSAlZCIsIGNhcC5tTWF4T3V0cHV0RnJhbWVXaWR0aCk7CisgICAgTE9HVigibU1heE91dHB1dEZyYW1lSGVpZ2h0ID0gJWQiLCBjYXAubU1heE91dHB1dEZyYW1lSGVpZ2h0KTsKK30KKwogLypzdGF0aWMqLyBpbnQKIE1lZGlhUHJvZmlsZXM6OmZpbmRUYWdGb3JOYW1lKGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCAqbWFwLCBzaXplX3Qgbk1hcHBpbmdzLCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMzU2LDYgKzM2NiwzNiBAQAogICAgIHJldHVybiBhdG9pKGF0dHNbMV0pOwogfQogCit2b2lkIE1lZGlhUHJvZmlsZXM6OmFkZFN0YXJ0VGltZU9mZnNldChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzKQoreworICAgIGludCBvZmZzZXRUaW1lTXMgPSA3MDA7CisgICAgaWYgKGF0dHNbMl0pIHsKKyAgICAgICAgQ0hFQ0soIXN0cmNtcCgic3RhcnRPZmZzZXRNcyIsIGF0dHNbMl0pKTsKKyAgICAgICAgb2Zmc2V0VGltZU1zID0gYXRvaShhdHRzWzNdKTsKKyAgICB9CisKKyAgICBMT0dWKCIlczogY2FtZXJhSWQ9JWQsIG9mZnNldD0lZCBtcyIsIF9fZnVuY19fLCBjYW1lcmFJZCwgb2Zmc2V0VGltZU1zKTsKKyAgICBtU3RhcnRUaW1lT2Zmc2V0cy5yZXBsYWNlVmFsdWVGb3IoY2FtZXJhSWQsIG9mZnNldFRpbWVNcyk7Cit9CisKKy8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAqCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0VkaXRvckNhcChjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCit7CisgICAgQ0hFQ0soIXN0cmNtcCgibWF4SW5wdXRGcmFtZVdpZHRoIiwgYXR0c1swXSkgJiYKKyAgICAgICAgICAhc3RyY21wKCJtYXhJbnB1dEZyYW1lSGVpZ2h0IiwgYXR0c1syXSkgICYmCisgICAgICAgICAgIXN0cmNtcCgibWF4T3V0cHV0RnJhbWVXaWR0aCIsIGF0dHNbNF0pICYmCisgICAgICAgICAgIXN0cmNtcCgibWF4T3V0cHV0RnJhbWVIZWlnaHQiLCBhdHRzWzZdKSk7CisKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCAqcFZpZGVvRWRpdG9yQ2FwID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvRWRpdG9yQ2FwKGF0b2koYXR0c1sxXSksIGF0b2koYXR0c1szXSksCisgICAgICAgICAgICAgICAgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSk7CisKKyAgICBsb2dWaWRlb0VkaXRvckNhcCgqcFZpZGVvRWRpdG9yQ2FwKTsKKyAgICBwcm9maWxlcy0+bVZpZGVvRWRpdG9yQ2FwID0gcFZpZGVvRWRpdG9yQ2FwOworCisgICAgcmV0dXJuIHBWaWRlb0VkaXRvckNhcDsKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpzdGFydEVsZW1lbnRIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cykKIHsKQEAgLTM4MCwxMSArNDIwLDE0IEBACiAgICAgICAgIHByb2ZpbGVzLT5tRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzLmFkZChjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChhdHRzKSk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkNhbWNvcmRlclByb2ZpbGVzIiwgbmFtZSkgPT0gMCkgewogICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCA9IGdldENhbWVyYUlkKGF0dHMpOworICAgICAgICBwcm9maWxlcy0+YWRkU3RhcnRUaW1lT2Zmc2V0KHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiRW5jb2RlclByb2ZpbGUiLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKAogICAgICAgICAgICAgY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgcHJvZmlsZXMtPm1DYW1lcmFJZHMpKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiSW1hZ2VFbmNvZGluZyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKCJWaWRlb0VkaXRvckNhcCIsIG5hbWUpID09IDApIHsKKyAgICAgICAgY3JlYXRlVmlkZW9FZGl0b3JDYXAoYXR0cywgcHJvZmlsZXMpOwogICAgIH0KIH0KIApAQCAtNzc3LDYgKzgyMCwxNyBAQAogICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKGxldmVscyk7CiB9CiAKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdFZpZGVvRWRpdG9yQ2FwKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKQoreworICAgIHByb2ZpbGVzLT5tVmlkZW9FZGl0b3JDYXAgPQorICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAoCisgICAgICAgICAgICAgICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfSU5QVVRfRlJBTUVfV0lEVEgsCisgICAgICAgICAgICAgICAgVklERU9FRElUT1JfREVGVUFMVF9NQVhfSU5QVVRfRlJBTUVfSEVJR0hULAorICAgICAgICAgICAgICAgIFZJREVPRURJVE9SX0RFRkFVTFRfTUFYX09VVFBVVF9GUkFNRV9XSURUSCwKKyAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9ERUZVQUxUX01BWF9PVVRQVVRfRlJBTUVfSEVJR0hUKTsKK30KKwogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzKgogTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdEluc3RhbmNlKCkKIHsKQEAgLTc4OCw2ICs4NDIsNyBAQAogICAgIGNyZWF0ZURlZmF1bHRBdWRpb0RlY29kZXJzKHByb2ZpbGVzKTsKICAgICBjcmVhdGVEZWZhdWx0RW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzKHByb2ZpbGVzKTsKICAgICBjcmVhdGVEZWZhdWx0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMocHJvZmlsZXMpOworICAgIGNyZWF0ZURlZmF1bHRWaWRlb0VkaXRvckNhcChwcm9maWxlcyk7CiAgICAgcmV0dXJuIHByb2ZpbGVzOwogfQogCkBAIC04ODYsNiArOTQxLDI4IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitpbnQgTWVkaWFQcm9maWxlczo6Z2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAoreworICAgIExPR1YoImdldFZpZGVvRWRpdG9yQ2FwUGFyYW1CeU5hbWU6ICVzIiwgbmFtZSk7CisKKyAgICBpZiAobVZpZGVvRWRpdG9yQ2FwID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVGhlIG1WaWRlb0VkaXRvckNhcCBpcyBub3QgY3JlYXRlZCwgdGhlbiBjcmVhdGUgZGVmYXVsdCBjYXAuIik7CisgICAgICAgIGNyZWF0ZURlZmF1bHRWaWRlb0VkaXRvckNhcChzSW5zdGFuY2UpOworICAgIH0KKworICAgIGlmICghc3RyY21wKCJ2aWRlb2VkaXRvci5pbnB1dC53aWR0aC5tYXgiLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIG1WaWRlb0VkaXRvckNhcC0+bU1heElucHV0RnJhbWVXaWR0aDsKKyAgICBpZiAoIXN0cmNtcCgidmlkZW9lZGl0b3IuaW5wdXQuaGVpZ2h0Lm1heCIsIG5hbWUpKQorICAgICAgICByZXR1cm4gbVZpZGVvRWRpdG9yQ2FwLT5tTWF4SW5wdXRGcmFtZUhlaWdodDsKKyAgICBpZiAoIXN0cmNtcCgidmlkZW9lZGl0b3Iub3V0cHV0LndpZHRoLm1heCIsIG5hbWUpKQorICAgICAgICByZXR1cm4gbVZpZGVvRWRpdG9yQ2FwLT5tTWF4T3V0cHV0RnJhbWVXaWR0aDsKKyAgICBpZiAoIXN0cmNtcCgidmlkZW9lZGl0b3Iub3V0cHV0LmhlaWdodC5tYXgiLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIG1WaWRlb0VkaXRvckNhcC0+bU1heE91dHB1dEZyYW1lSGVpZ2h0OworCisgICAgTE9HRSgiVGhlIGdpdmVuIHZpZGVvIGVkaXRvciBwYXJhbSBuYW1lICVzIGlzIG5vdCBmb3VuZCIsIG5hbWUpOworICAgIHJldHVybiAtMTsKK30KKwogVmVjdG9yPGF1ZGlvX2VuY29kZXI+IE1lZGlhUHJvZmlsZXM6OmdldEF1ZGlvRW5jb2RlcnMoKSBjb25zdAogewogICAgIFZlY3RvcjxhdWRpb19lbmNvZGVyPiBlbmNvZGVyczsKQEAgLTk5Nyw2ICsxMDc0LDE2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAoraW50IE1lZGlhUHJvZmlsZXM6OmdldFN0YXJ0VGltZU9mZnNldE1zKGludCBjYW1lcmFJZCkgY29uc3QgeworICAgIGludCBvZmZzZXRUaW1lTXMgPSAtMTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVN0YXJ0VGltZU9mZnNldHMuaW5kZXhPZktleShjYW1lcmFJZCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgb2Zmc2V0VGltZU1zID0gbVN0YXJ0VGltZU9mZnNldHMudmFsdWVGb3IoY2FtZXJhSWQpOworICAgIH0KKyAgICBMT0dWKCIlczogb2Zmc2V0VGltZT0lZCBtcyBhbmQgY2FtZXJhSWQ9JWQiLCBvZmZzZXRUaW1lTXMsIGNhbWVyYUlkKTsKKyAgICByZXR1cm4gb2Zmc2V0VGltZU1zOworfQorCiBNZWRpYVByb2ZpbGVzOjp+TWVkaWFQcm9maWxlcygpCiB7CiAgICAgQ0hFQ0soImRlc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIgPT0gMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAppbmRleCA0NWJkZmY0Li40MWY4NTkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKQEAgLTQ3LDE2ICs0NywxNSBAQAogICAgIHJldHVybiBtTG9jYWxlOwogfQogCi1zdGF0dXNfdCBNZWRpYVNjYW5uZXI6OnByb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAotICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CitNZWRpYVNjYW5SZXN1bHQgTWVkaWFTY2FubmVyOjpwcm9jZXNzRGlyZWN0b3J5KAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCkgewogICAgIGludCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOwogICAgIGlmIChwYXRoTGVuZ3RoID49IFBBVEhfTUFYKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfU0tJUFBFRDsKICAgICB9CiAgICAgY2hhciogcGF0aEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKFBBVEhfTUFYICsgMSk7CiAgICAgaWYgKCFwYXRoQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfRVJST1I7CiAgICAgfQogCiAgICAgaW50IHBhdGhSZW1haW5pbmcgPSBQQVRIX01BWCAtIHBhdGhMZW5ndGg7CkBAIC02OSwyMSArNjgsMTggQEAKIAogICAgIGNsaWVudC5zZXRMb2NhbGUobG9jYWxlKCkpOwogCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0KLSAgICAgICAgZG9Qcm9jZXNzRGlyZWN0b3J5KHBhdGhCdWZmZXIsIHBhdGhSZW1haW5pbmcsIGNsaWVudCwgZmFsc2UsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOworICAgIE1lZGlhU2NhblJlc3VsdCByZXN1bHQgPSBkb1Byb2Nlc3NEaXJlY3RvcnkocGF0aEJ1ZmZlciwgcGF0aFJlbWFpbmluZywgY2xpZW50LCBmYWxzZSk7CiAKICAgICBmcmVlKHBhdGhCdWZmZXIpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgTWVkaWFTY2FubmVyOjpkb1Byb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKLSAgICAgICAgYm9vbCBub01lZGlhLCBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CitNZWRpYVNjYW5SZXN1bHQgTWVkaWFTY2FubmVyOjpkb1Byb2Nlc3NEaXJlY3RvcnkoCisgICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwgYm9vbCBub01lZGlhKSB7CiAgICAgLy8gcGxhY2UgdG8gY29weSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lCiAgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoICsgc3RybGVuKHBhdGgpOwogICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAKICAgICAvLyBUcmVhdCBhbGwgZmlsZXMgYXMgbm9uLW1lZGlhIGluIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBhICAiLm5vbWVkaWEiIGZpbGUKICAgICBpZiAocGF0aFJlbWFpbmluZyA+PSA4IC8qIHN0cmxlbigiLm5vbWVkaWEiKSAqLyApIHsKQEAgLTk5LDc2ICs5NSw4OCBAQAogCiAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOwogICAgIGlmICghZGlyKSB7Ci0gICAgICAgIExPR0QoIm9wZW5kaXIgJXMgZmFpbGVkLCBlcnJubzogJWQiLCBwYXRoLCBlcnJubyk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICBMT0dXKCJFcnJvciBvcGVuaW5nIGRpcmVjdG9yeSAnJXMnLCBza2lwcGluZzogJXMuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX1NLSVBQRUQ7CiAgICAgfQogCisgICAgTWVkaWFTY2FuUmVzdWx0IHJlc3VsdCA9IE1FRElBX1NDQU5fUkVTVUxUX09LOwogICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOwotCi0gICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGRvUHJvY2Vzc0RpcmVjdG9yeUVudHJ5KHBhdGgsIHBhdGhSZW1haW5pbmcsIGNsaWVudCwgbm9NZWRpYSwgZW50cnksIGZpbGVTcG90KQorICAgICAgICAgICAgICAgID09IE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SKSB7CisgICAgICAgICAgICByZXN1bHQgPSBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgfQorICAgIGNsb3NlZGlyKGRpcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAotICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgewotICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKLSAgICAgICAgICAgIGNvbnRpbnVlOworTWVkaWFTY2FuUmVzdWx0IE1lZGlhU2Nhbm5lcjo6ZG9Qcm9jZXNzRGlyZWN0b3J5RW50cnkoCisgICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwgYm9vbCBub01lZGlhLAorICAgICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeSwgY2hhciogZmlsZVNwb3QpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOworCisgICAgLy8gaWdub3JlICIuIiBhbmQgIi4uIgorICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfU0tJUFBFRDsKKyAgICB9CisKKyAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICBpZiAobmFtZUxlbmd0aCArIDEgPiBwYXRoUmVtYWluaW5nKSB7CisgICAgICAgIC8vIHBhdGggdG9vIGxvbmchCisgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9TS0lQUEVEOworICAgIH0KKyAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOworCisgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOworICAgIGlmICh0eXBlID09IERUX1VOS05PV04pIHsKKyAgICAgICAgLy8gSWYgdGhlIHR5cGUgaXMgdW5rbm93biwgc3RhdCgpIHRoZSBmaWxlIGluc3RlYWQuCisgICAgICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIGFjY2Vzc2luZyBORlMgbW91bnRlZCBmaWxlc3lzdGVtcywgYnV0CisgICAgICAgIC8vIGNvdWxkIGJlIG5lZWRlZCBpbiBvdGhlciBjYXNlcyB3ZWxsLgorICAgICAgICBpZiAoc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBEVF9SRUc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBEVF9ESVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJzdGF0KCkgZmFpbGVkIGZvciAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykgKTsKICAgICAgICAgfQotICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOworICAgIH0KKyAgICBpZiAodHlwZSA9PSBEVF9ESVIpIHsKKyAgICAgICAgYm9vbCBjaGlsZE5vTWVkaWEgPSBub01lZGlhOworICAgICAgICAvLyBzZXQgbm9NZWRpYSBmbGFnIG9uIGRpcmVjdG9yaWVzIHdpdGggYSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJy4nCisgICAgICAgIC8vIGZvciBleGFtcGxlLCB0aGUgTWFjICIuVHJhc2hlcyIgZGlyZWN0b3J5CisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykKKyAgICAgICAgICAgIGNoaWxkTm9NZWRpYSA9IHRydWU7CiAKLSAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwotICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIGFjY2Vzc2luZyBORlMgbW91bnRlZCBmaWxlc3lzdGVtcywgYnV0Ci0gICAgICAgICAgICAvLyBjb3VsZCBiZSBuZWVkZWQgaW4gb3RoZXIgY2FzZXMgd2VsbC4KLSAgICAgICAgICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gRFRfUkVHOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEVF9ESVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dEKCJzdGF0KCkgZmFpbGVkIGZvciAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykgKTsKKyAgICAgICAgLy8gcmVwb3J0IHRoZSBkaXJlY3RvcnkgdG8gdGhlIGNsaWVudAorICAgICAgICBpZiAoc3RhdChwYXRoLCAmc3RhdGJ1ZikgPT0gMCkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LnNjYW5GaWxlKHBhdGgsIHN0YXRidWYuc3RfbXRpbWUsIDAsCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyppc0RpcmVjdG9yeSovLCBjaGlsZE5vTWVkaWEpOworICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBEVF9SRUcgfHwgdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIGlmICh0eXBlID09IERUX0RJUikgewotICAgICAgICAgICAgICAgIGJvb2wgY2hpbGROb01lZGlhID0gbm9NZWRpYTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbm9NZWRpYSBmbGFnIG9uIGRpcmVjdG9yaWVzIHdpdGggYSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJy4nCi0gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBNYWMgIi5UcmFzaGVzIiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9NZWRpYSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAvLyByZXBvcnQgdGhlIGRpcmVjdG9yeSB0byB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXQocGF0aCwgJnN0YXRidWYpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNjYW5GaWxlKHBhdGgsIHN0YXRidWYuc3RfbXRpbWUsIDAsIHRydWUsIGNoaWxkTm9NZWRpYSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYW5kIG5vdyBwcm9jZXNzIGl0cyBjb250ZW50cwotICAgICAgICAgICAgICAgIHN0cmNhdChmaWxlU3BvdCwgIi8iKTsKLSAgICAgICAgICAgICAgICBpbnQgZXJyID0gZG9Qcm9jZXNzRGlyZWN0b3J5KHBhdGgsIHBhdGhSZW1haW5pbmcgLSBuYW1lTGVuZ3RoIC0gMSwgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROb01lZGlhLCBleGNlcHRpb25DaGVjaywgZXhjZXB0aW9uRW52KTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgZXhjZXB0aW9ucyB1cCAtIGlnbm9yZSBvdGhlciBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkNoZWNrICYmIGV4Y2VwdGlvbkNoZWNrKGV4Y2VwdGlvbkVudikpIGdvdG8gZmFpbHVyZTsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgcHJvY2Vzc2luZyAnJXMnIC0gc2tpcHBpbmdcbiIsIHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXQocGF0aCwgJnN0YXRidWYpOwotICAgICAgICAgICAgICAgIGNsaWVudC5zY2FuRmlsZShwYXRoLCBzdGF0YnVmLnN0X210aW1lLCBzdGF0YnVmLnN0X3NpemUsIGZhbHNlLCBub01lZGlhKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uQ2hlY2sgJiYgZXhjZXB0aW9uQ2hlY2soZXhjZXB0aW9uRW52KSkgZ290byBmYWlsdXJlOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBhbmQgbm93IHByb2Nlc3MgaXRzIGNvbnRlbnRzCisgICAgICAgIHN0cmNhdChmaWxlU3BvdCwgIi8iKTsKKyAgICAgICAgTWVkaWFTY2FuUmVzdWx0IHJlc3VsdCA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsCisgICAgICAgICAgICAgICAgY2xpZW50LCBjaGlsZE5vTWVkaWEpOworICAgICAgICBpZiAocmVzdWx0ID09IE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRFRfUkVHKSB7CisgICAgICAgIHN0YXQocGF0aCwgJnN0YXRidWYpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQuc2NhbkZpbGUocGF0aCwgc3RhdGJ1Zi5zdF9tdGltZSwgc3RhdGJ1Zi5zdF9zaXplLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qaXNEaXJlY3RvcnkqLywgbm9NZWRpYSk7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsb3NlZGlyKGRpcik7Ci0gICAgcmV0dXJuIE9LOwotZmFpbHVyZToKLSAgICBjbG9zZWRpcihkaXIpOwotICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAppbmRleCBiZDM1OTZlLi43YTdhZWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICBtVmFsdWVzID0gbmV3IFN0cmluZ0FycmF5OwogfQogCi1ib29sIE1lZGlhU2Nhbm5lckNsaWVudDo6YWRkU3RyaW5nVGFnKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKQorc3RhdHVzX3QgTWVkaWFTY2FubmVyQ2xpZW50OjphZGRTdHJpbmdUYWcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpCiB7CiAgICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7CiAgICAgICAgIC8vIGRvbid0IGJvdGhlciBjYWNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgYWxsIEFTQ0lJLgpAQCAtMjEyLDggKzIxMiwxMCBAQAogCiAgICAgICAgIC8vIGZpbmFsbHksIHB1c2ggYWxsIG5hbWUvdmFsdWUgcGFpcnMgdG8gdGhlIGNsaWVudAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaGFuZGxlU3RyaW5nVGFnKG1OYW1lcy0+Z2V0RW50cnkoaSksIG1WYWx1ZXMtPmdldEVudHJ5KGkpKSkKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZVN0cmluZ1RhZyhtTmFtZXMtPmdldEVudHJ5KGkpLCBtVmFsdWVzLT5nZXRFbnRyeShpKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gZWxzZSBhZGRTdHJpbmdUYWcoKSBoYXMgZG9uZSBhbGwgdGhlIHdvcmsgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTA4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBUaGUgY29kZSBoZXJlIG9yaWdpbmFsbHkgcmVzaWRlZCBpbiBNZWRpYVBsYXllclNlcnZpY2UuY3BwIGFuZCB3YXMKKyAqIHNoYW1lbGVzc2x5IGNvcGllZCBvdmVyIHRvIHN1cHBvcnQgbWVtb3J5IGxlYWsgdHJhY2tpbmcgZnJvbQorICogbXVsdGlwbGUgcGxhY2VzLgorICovCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisKK2V4dGVybiAiQyIgdm9pZCBnZXRfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiogaW5mbywgc2l6ZV90KiBvdmVyYWxsU2l6ZSwKKyAgICAgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKKworZXh0ZXJuICJDIiB2b2lkIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiBpbmZvKTsKKworLy8gVXNlIHRoZSBTdHJpbmctY2xhc3MgYmVsb3cgaW5zdGVhZCBvZiBTdHJpbmc4IHRvIGFsbG9jYXRlIGFsbCBtZW1vcnkKKy8vIGJlZm9yZWhhbmQgYW5kIG5vdCByZWVudGVyIHRoZSBoZWFwIHdoaWxlIHdlIGFyZSBleGFtaW5pbmcgaXQuLi4KK3N0cnVjdCBNeVN0cmluZzggeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1NJWkUgPSAyNTYgKiAxMDI0OworCisgICAgTXlTdHJpbmc4KCkKKyAgICAgICAgOiBtUHRyKChjaGFyICopbWFsbG9jKE1BWF9TSVpFKSkgeworICAgICAgICAqbVB0ciA9ICdcMCc7CisgICAgfQorCisgICAgfk15U3RyaW5nOCgpIHsKKyAgICAgICAgZnJlZShtUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZChjb25zdCBjaGFyICpzKSB7CisgICAgICAgIHN0cmNhdChtUHRyLCBzKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHJpbmcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHRyOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RybGVuKG1QdHIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjaGFyICptUHRyOworCisgICAgTXlTdHJpbmc4KGNvbnN0IE15U3RyaW5nOCAmKTsKKyAgICBNeVN0cmluZzggJm9wZXJhdG9yPShjb25zdCBNeVN0cmluZzggJik7Cit9OworCit2b2lkIGR1bXBNZW1vcnlBZGRyZXNzZXMoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIE15U3RyaW5nOCByZXN1bHQ7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBzaXplX3QgZHVwczsKKyAgICAgICAgaW50cHRyX3QgKiBiYWNrdHJhY2U7CisgICAgfSBBbGxvY0VudHJ5OworCisgICAgdWludDhfdCAqaW5mbyA9IE5VTEw7CisgICAgc2l6ZV90IG92ZXJhbGxTaXplID0gMDsKKyAgICBzaXplX3QgaW5mb1NpemUgPSAwOworICAgIHNpemVfdCB0b3RhbE1lbW9yeSA9IDA7CisgICAgc2l6ZV90IGJhY2t0cmFjZVNpemUgPSAwOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbykgeworICAgICAgICB1aW50OF90ICpwdHIgPSBpbmZvOworICAgICAgICBzaXplX3QgY291bnQgPSBvdmVyYWxsU2l6ZSAvIGluZm9TaXplOworCisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBbGxvY2F0aW9uIGNvdW50ICVpXG4iLCBjb3VudCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRvdGFsIG1lbW9yeSAlaVxuIiwgdG90YWxNZW1vcnkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgQWxsb2NFbnRyeSAqIGVudHJpZXMgPSBuZXcgQWxsb2NFbnRyeVtjb3VudF07CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAvLyBFYWNoIGVudHJ5IHNob3VsZCBiZSBzaXplX3QsIHNpemVfdCwgaW50cHRyX3RbYmFja3RyYWNlU2l6ZV0KKyAgICAgICAgICAgIEFsbG9jRW50cnkgKmUgPSAmZW50cmllc1tpXTsKKworICAgICAgICAgICAgZS0+c2l6ZSA9ICpyZWludGVycHJldF9jYXN0PHNpemVfdCAqPihwdHIpOworICAgICAgICAgICAgcHRyICs9IHNpemVvZihzaXplX3QpOworCisgICAgICAgICAgICBlLT5kdXBzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90ICo+KHB0cik7CisgICAgICAgICAgICBwdHIgKz0gc2l6ZW9mKHNpemVfdCk7CisKKyAgICAgICAgICAgIGUtPmJhY2t0cmFjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3QgKj4ocHRyKTsKKyAgICAgICAgICAgIHB0ciArPSBzaXplb2YoaW50cHRyX3QpICogYmFja3RyYWNlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHNvcnQgdGhlIGVudHJpZXMuICBUaGV5IGNvbWUgc29ydGVkIGJ5IHNpemUgYnV0CisgICAgICAgIC8vIG5vdCBieSBzdGFjayB0cmFjZSB3aGljaCBjYXVzZXMgcHJvYmxlbXMgdXNpbmcgZGlmZi4KKyAgICAgICAgYm9vbCBtb3ZlZDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKGNvdW50IC0gMSk7IGkrKykgeworICAgICAgICAgICAgICAgIEFsbG9jRW50cnkgKmUxID0gJmVudHJpZXNbaV07CisgICAgICAgICAgICAgICAgQWxsb2NFbnRyeSAqZTIgPSAmZW50cmllc1tpKzFdOworCisgICAgICAgICAgICAgICAgYm9vbCBzd2FwID0gZTEtPnNpemUgPCBlMi0+c2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoZTEtPnNpemUgPT0gZTItPnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGJhY2t0cmFjZVNpemU7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUxLT5iYWNrdHJhY2Vbal0gPT0gZTItPmJhY2t0cmFjZVtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCA9IGUxLT5iYWNrdHJhY2Vbal0gPCBlMi0+YmFja3RyYWNlW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN3YXApIHsKKyAgICAgICAgICAgICAgICAgICAgQWxsb2NFbnRyeSB0ID0gZW50cmllc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc1tpXSA9IGVudHJpZXNbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc1tpKzFdID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAobW92ZWQpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgQWxsb2NFbnRyeSAqZSA9ICZlbnRyaWVzW2ldOworCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzaXplICU4aSwgZHVwICU0aSwgIiwgZS0+c2l6ZSwgZS0+ZHVwcyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBjdCA9IDA7IChjdCA8IGJhY2t0cmFjZVNpemUpICYmIGUtPmJhY2t0cmFjZVtjdF07IGN0KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDh4IiwgZS0+YmFja3RyYWNlW2N0XSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZVtdIGVudHJpZXM7CisgICAgICAgIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyhpbmZvKTsKKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworI2Vsc2UKKy8vIERvZXMgbm90aGluZwordm9pZCBkdW1wTWVtb3J5QWRkcmVzc2VzKGludCBmZCkge30KKworI2VuZGlmCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWV0YWRhdGEuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWV0YWRhdGEuY3BwCmluZGV4IGFlYzk2ZjEuLjhlZWViYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01ldGFkYXRhLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZXRhZGF0YS5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKIC8vIEFsbCB0aGVzZSBjb25zdGFudHMgYmVsb3cgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBNZXRhZGF0YS5qYXZhLgogZW51bSBNZXRhZGF0YUlkIHsKICAgICBGSVJTVF9TWVNURU1fSUQgPSAxLAotICAgIExBU1RfU1lTVEVNX0lEID0gMzIsCisgICAgTEFTVF9TWVNURU1fSUQgPSAzMSwKICAgICBGSVJTVF9DVVNUT01fSUQgPSA4MTkyCiB9OwogCkBAIC00Myw3ICs0Myw2IEBACiAgICAgQk9PTEVBTl9WQUwsCiAgICAgTE9OR19WQUwsCiAgICAgRE9VQkxFX1ZBTCwKLSAgICBUSU1FRF9URVhUX1ZBTCwKICAgICBEQVRFX1ZBTCwKICAgICBCWVRFX0FSUkFZX1ZBTCwKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDgyZmUyZDQuLjdjMjIwMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC0xMDI2LDggKzEwMjUsOCBAQAogCiAgICAgbXBBdWRpb1RyYWNrLT5zZXQobVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NhbGxiYWNrLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcAppbmRleCA0MzU3MWNmLi5iZjQwNDgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvVmlzdWFsaXplci5oPgogCiBleHRlcm4gdm9pZCBmaXhlZF9mZnRfcmVhbChpbnQgbiwgaW50MzJfdCAqdik7CkBAIC0xMjcsNyArMTI5LDcgQEAKIHsKICAgICBpZiAoc2l6ZSA+IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCB8fAogICAgICAgICBzaXplIDwgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOIHx8Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpwb3BDb3VudChzaXplKSAhPSAxKSB7CisgICAgICAgIHBvcGNvdW50KHNpemUpICE9IDEpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE0MSw3ICsxNDMsNyBAQAogCiAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVV9QQVJBTV9DQVBUVVJFX1NJWkU7CisgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VBTElaRVJfUEFSQU1fQ0FQVFVSRV9TSVpFOwogICAgICooKGludDMyX3QgKilwLT5kYXRhICsgMSk9IHNpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UGFyYW1ldGVyKHApOwogCkBAIC0xNjksNyArMTcxLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAobUVuYWJsZWQpIHsKICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gbUNhcHR1cmVTaXplOwotICAgICAgICBzdGF0dXMgPSBjb21tYW5kKFZJU1VfQ01EX0NBUFRVUkUsIDAsIE5VTEwsICZyZXBseVNpemUsIHdhdmVmb3JtKTsKKyAgICAgICAgc3RhdHVzID0gY29tbWFuZChWSVNVQUxJWkVSX0NNRF9DQVBUVVJFLCAwLCBOVUxMLCAmcmVwbHlTaXplLCB3YXZlZm9ybSk7CiAgICAgICAgIExPR1YoImdldFdhdmVGb3JtKCkgY29tbWFuZCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CiAgICAgICAgIGlmIChyZXBseVNpemUgPT0gMCkgewogICAgICAgICAgICAgc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwpAQCAtMjc0LDcgKzI3Niw3IEBACiAKICAgICBwLT5wc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICooaW50MzJfdCAqKXAtPmRhdGEgPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRTsKKyAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UGFyYW1ldGVyKHApOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAppbmRleCA4ZGZjYjNiLi5jZWUwNmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcApAQCAtOTIsNyArOTIsOCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiBzcmNVcmwpCitzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIExPR1YoInNldERhdGFTb3VyY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTA1LDcgKzEwNiw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBMT0dWKCJkYXRhIHNvdXJjZSAoJXMpIiwgc3JjVXJsKTsKLSAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShzcmNVcmwpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHNyY1VybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMGVlMDI0OS4uM2RkOTI0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KIAorI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAKQEAgLTM3LDYgKzM5LDkgQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYVBsYXllcjo6TWVkaWFQbGF5ZXIoKQpAQCAtNDUsNyArNTAsNyBAQAogICAgIG1MaXN0ZW5lciA9IE5VTEw7CiAgICAgbUNvb2tpZSA9IE5VTEw7CiAgICAgbUR1cmF0aW9uID0gLTE7Ci0gICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6TVVTSUM7CisgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwogICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX0lETEU7CkBAIC03OSw2ICs4NCw4IEBACiAgICAgaWYgKHAgIT0gMCkgewogICAgICAgICBwLT5kaXNjb25uZWN0KCk7CiAgICAgfQorCisgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOwogfQogCiAvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZApAQCAtMTkyLDEzICsxOTksNjMgQEAKICAgICByZXR1cm4gbVBsYXllci0+Z2V0TWV0YWRhdGEodXBkYXRlX29ubHksIGFwcGx5X2ZpbHRlciwgbWV0YWRhdGEpOwogfQogCit2b2lkIE1lZGlhUGxheWVyOjpkaXNjb25uZWN0TmF0aXZlV2luZG93KCkgeworICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtQ29ubmVjdGVkV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0dXKCJuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNvbm5lY3RlZFdpbmRvdy5jbGVhcigpOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpOworICAgIHNwPElCaW5kZXI+IGJpbmRlcihzdXJmYWNlID09IE5VTEwgPyBOVUxMIDogc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgaWYgKG1Db25uZWN0ZWRXaW5kb3dCaW5kZXIgPT0gYmluZGVyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoc3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3Qoc3VyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HRSgic2V0VmlkZW9TdXJmYWNlIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG11c3QgZG8gdGhlIHJlc2V0IGJlZm9yZSBkaXNjb25uZWN0aW5nIGZyb20gdGhlIEFOVy4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBxdWV1ZS9kZXF1ZXVlIGNhbGxzIGNvdWxkIGJlIG1hZGUgb24gdGhlIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgLy8gQU5XLCB3aGljaCBtYXkgcmVzdWx0IGluIGVycm9ycy4KKyAgICAgICAgICAgIHJlc2V0X2woKTsKKworICAgICAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoZSBwbGF5ZXIncyBuZXcgc3VyZmFjZSBiZWZvcmUgZGlzY29ubmVjdGluZyB0aGUKKyAgICAvLyBvbGQgb25lLiAgT3RoZXJ3aXNlIHF1ZXVlL2RlcXVldWUgY2FsbHMgY291bGQgYmUgbWFkZSBvbiB0aGUgZGlzY29ubmVjdGVkCisgICAgLy8gQU5XLCB3aGljaCBtYXkgcmVzdWx0IGluIGVycm9ycy4KKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSk7CisKKyAgICBkaXNjb25uZWN0TmF0aXZlV2luZG93KCk7CisKKyAgICBtQ29ubmVjdGVkV2luZG93ID0gc3VyZmFjZTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbUNvbm5lY3RlZFdpbmRvd0JpbmRlciA9IGJpbmRlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNjb25uZWN0TmF0aXZlV2luZG93KCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCkBAIC0yMDgsNyArMjY1LDQ3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVBsYXllciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKIAotICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2VUZXh0dXJlKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIoc3VyZmFjZVRleHR1cmUgPT0gTlVMTCA/IE5VTEwgOgorICAgICAgICAgICAgc3VyZmFjZVRleHR1cmUtPmFzQmluZGVyKCkpOworICAgIGlmIChtQ29ubmVjdGVkV2luZG93QmluZGVyID09IGJpbmRlcikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53OworICAgIGlmIChzdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7CisgICAgICAgIGFudyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChzdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYW53LmdldCgpLAorICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG11c3QgZG8gdGhlIHJlc2V0IGJlZm9yZSBkaXNjb25uZWN0aW5nIGZyb20gdGhlIEFOVy4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBxdWV1ZS9kZXF1ZXVlIGNhbGxzIGNvdWxkIGJlIG1hZGUgb24gdGhlIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgLy8gQU5XLCB3aGljaCBtYXkgcmVzdWx0IGluIGVycm9ycy4KKyAgICAgICAgICAgIHJlc2V0X2woKTsKKworICAgICAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoZSBwbGF5ZXIncyBuZXcgU3VyZmFjZVRleHR1cmUgYmVmb3JlCisgICAgLy8gZGlzY29ubmVjdGluZyB0aGUgb2xkIG9uZS4gIE90aGVyd2lzZSBxdWV1ZS9kZXF1ZXVlIGNhbGxzIGNvdWxkIGJlIG1hZGUKKyAgICAvLyBvbiB0aGUgZGlzY29ubmVjdGVkIEFOVywgd2hpY2ggbWF5IHJlc3VsdCBpbiBlcnJvcnMuCisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShzdXJmYWNlVGV4dHVyZSk7CisKKyAgICBkaXNjb25uZWN0TmF0aXZlV2luZG93KCk7CisKKyAgICBtQ29ubmVjdGVkV2luZG93ID0gYW53OworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyID0gYmluZGVyOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3coKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiAvLyBtdXN0IGNhbGwgd2l0aCBsb2NrIGhlbGQKQEAgLTQzMiwxMCArNTI5LDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjo6cmVzZXQoKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnJlc2V0X2woKQogewotICAgIExPR1YoInJlc2V0Iik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtTG9vcCA9IGZhbHNlOwogICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUl9JRExFKSByZXR1cm4gTk9fRVJST1I7CiAgICAgbVByZXBhcmVTeW5jID0gZmFsc2U7CkBAIC00NTYsNiArNTUxLDEzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6cmVzZXQoKQoreworICAgIExPR1YoInJlc2V0Iik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gcmVzZXRfbCgpOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0QXVkaW9TdHJlYW1UeXBlKGludCB0eXBlKQogewogICAgIExPR1YoIk1lZGlhUGxheWVyOjpzZXRBdWRpb1N0cmVhbVR5cGUiKTsKQEAgLTU1MSw3ICs2NTMsMjkgQEAKICAgICByZXR1cm4gbVBsYXllci0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKIH0KIAotdm9pZCBNZWRpYVBsYXllcjo6bm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQoreworICAgIExPR1YoIk1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICB9CisgICAgTE9HVigic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpCit7CisgICAgTE9HVigiTWVkaWFQbGF5ZXI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAgcmV0dXJuICBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CisgICAgfQorICAgIExPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBNZWRpYVBsYXllcjo6bm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopCiB7CiAgICAgTE9HVigibWVzc2FnZSByZWNlaXZlZCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgIGJvb2wgc2VuZCA9IHRydWU7CkBAIC02NDEsNiArNzY1LDkgQEAKICAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOwogICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RJTUVEX1RFWFQ6CisgICAgICAgIExPR1YoIlJlY2VpdmVkIHRpbWVkIHRleHQgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBMT0dWKCJ1bnJlY29nbml6ZWQgbWVzc2FnZTogKCVkLCAlZCwgJWQpIiwgbXNnLCBleHQxLCBleHQyKTsKICAgICAgICAgYnJlYWs7CkBAIC02NTMsNyArNzgwLDcgQEAKICAgICBpZiAoKGxpc3RlbmVyICE9IDApICYmIHNlbmQpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZnlMb2NrKTsKICAgICAgICAgTE9HVigiY2FsbGJhY2sgYXBwbGljYXRpb24iKTsKLSAgICAgICAgbGlzdGVuZXItPm5vdGlmeShtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKICAgICAgICAgTE9HVigiYmFjayBmcm9tIGNhbGxiYWNrIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCAwMTAwYTE3Li4xMWQyODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMjUsMTIgKzI1LDEzIEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4gIC8vIGZvciBNRURJQV9FUlJPUl9TRVJWRVJfRElFRAorI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSkKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSkKIHsKLSAgICBMT0dWKCJzZXRDYW1lcmEoJXApIiwgY2FtZXJhLmdldCgpKTsKKyAgICBMT0dWKCJzZXRDYW1lcmEoJXAsJXApIiwgY2FtZXJhLmdldCgpLCBwcm94eS5nZXQoKSk7CiAgICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQwLDcgKzQxLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0Q2FtZXJhKGNhbWVyYSwgcHJveHkpOwogICAgIGlmIChPSyAhPSByZXQpIHsKICAgICAgICAgTE9HVigic2V0Q2FtZXJhIGZhaWxlZDogJWQiLCByZXQpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7CkBAIC0xMjcsNyArMTI4LDkgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIGZvbGxvd2luZyBjYWxsIGlzIG1hZGUgb3ZlciB0aGUgQmluZGVyIEludGVyZmFjZQogICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRWaWRlb1NvdXJjZSh2cyk7CisKICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgIExPR1YoInNldFZpZGVvU291cmNlIGZhaWxlZDogJWQiLCByZXQpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7CkBAIC0zMTksMzIgKzMyMiw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCi17Ci0gICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7Ci0gICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQpIHsKLSAgICAgICAgTE9HRSgib3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBzZXQiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUkVDT1JERVJfREFUQVNPVVJDRV9DT05GSUdVUkVEKSkgewotICAgICAgICBMT0dFKCJzZXRPdXRwdXRGaWxlIGNhbGxlZCBpbiBhbiBpbnZhbGlkIHN0YXRlKCVkKSIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOwotICAgIGlmIChPSyAhPSByZXQpIHsKLSAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSBmYWlsZWQ6ICVkIiwgcmV0KTsKLSAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gdHJ1ZTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC0zNTcsNyArMzM0LDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAoIW1Jc1ZpZGVvU291cmNlU2V0KSB7Ci0gICAgICAgIExPR0UoInRyeSB0byBzZXQgdmlkZW8gc2l6ZSB3aXRob3V0IHNldHRpbmcgdmlkZW8gc291cmNlIGZpcnN0Iik7CisgICAgICAgIExPR0UoIkNhbm5vdCBzZXQgdmlkZW8gc2l6ZSB3aXRob3V0IHNldHRpbmcgdmlkZW8gc291cmNlIGZpcnN0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTM2Nyw5ICszNDQsMjcgQEAKICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKKy8vIFF1ZXJ5IGEgU3VyZmFjZU1lZGlhU3VyZmFjZSB0aHJvdWdoIHRoZSBNZWRpYXNlcnZlciwgb3ZlciB0aGUKKy8vIGJpbmRlciBpbnRlcmZhY2UuIFRoaXMgaXMgdXNlZCBieSB0aGUgRmlsdGVyIEZyYW1ld29yayAoTWVpZGFFbmNvZGVyKQorLy8gdG8gZ2V0IGFuIDxJU3VyZmFjZVRleHR1cmU+IG9iamVjdCB0byBob29rIHVwIHRvIEFOYXRpdmVXaW5kb3cuCitzcDxJU3VyZmFjZVRleHR1cmU+IE1lZGlhUmVjb3JkZXI6OgorICAgICAgICBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtU3VyZmFjZU1lZGlhU291cmNlID0KKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpOworICAgIGlmIChtU3VyZmFjZU1lZGlhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3VyZmFjZU1lZGlhU291cmNlIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCEiKTsKKyAgICB9CisgICAgcmV0dXJuIG1TdXJmYWNlTWVkaWFTb3VyY2U7Cit9CisKKworCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9GcmFtZVJhdGUoJWQpIiwgZnJhbWVzX3Blcl9zZWNvbmQpOwpAQCAtMzgyLDcgKzM3Nyw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtSXNWaWRlb1NvdXJjZVNldCkgewotICAgICAgICBMT0dFKCJ0cnkgdG8gc2V0IHZpZGVvIGZyYW1lIHJhdGUgd2l0aG91dCBzZXR0aW5nIHZpZGVvIHNvdXJjZSBmaXJzdCIpOworICAgICAgICBMT0dFKCJDYW5ub3Qgc2V0IHZpZGVvIGZyYW1lIHJhdGUgd2l0aG91dCBzZXR0aW5nIHZpZGVvIHNvdXJjZSBmaXJzdCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02MDgsNyArNjAzLDYgQEAKICAgICBtSXNBdWRpb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNWaWRlb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNPdXRwdXRGaWxlU2V0ICAgPSBmYWxzZTsKLSAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gZmFsc2U7CiB9CiAKIC8vIFJlbGVhc2Ugc2hvdWxkIGJlIE9LIGluIGFueSBzdGF0ZQpAQCAtNjIxLDcgKzYxNSw3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1NZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKCkKK01lZGlhUmVjb3JkZXI6Ok1lZGlhUmVjb3JkZXIoKSA6IG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkKIHsKICAgICBMT0dWKCJjb25zdHJ1Y3RvciIpOwogCkBAIC02MzIsNiArNjI2LDggQEAKICAgICBpZiAobU1lZGlhUmVjb3JkZXIgIT0gTlVMTCkgewogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfSURMRTsKICAgICB9CisKKwogICAgIGRvQ2xlYW5VcCgpOwogfQogCkBAIC02NDYsNiArNjQyLDEwIEBACiAgICAgaWYgKG1NZWRpYVJlY29yZGVyICE9IE5VTEwpIHsKICAgICAgICAgbU1lZGlhUmVjb3JkZXIuY2xlYXIoKTsKICAgICB9CisKKyAgICBpZiAobVN1cmZhY2VNZWRpYVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UuY2xlYXIoKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUmVjb3JkZXJMaXN0ZW5lcj4mIGxpc3RlbmVyKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBlNjVmNmQ4Li5lYzdkOGEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTYsMTAgKzE2LDYgQEAKICAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgXAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCiAKLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbCAtbHB0aHJlYWQKLWVuZGlmCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIAkJXAogCWxpYmN1dGlscyAgICAgICAgICAgICAJCQlcCiAJbGlidXRpbHMgICAgICAgICAgICAgIAkJCVwKQEAgLTMxLDE4ICsyNywxNCBAQAogCWxpYmFuZHJvaWRfcnVudGltZSAgICAJCQlcCiAJbGlic3RhZ2VmcmlnaHQgICAgICAgIAkJCVwKIAlsaWJzdGFnZWZyaWdodF9vbXggICAgCQkJXAotCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICAgICAgICAgICAgICBcCi0JbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50ICAgICAgICAgICAgICAgIFwKLQlsaWJndWkKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgICAgIFwKKwlsaWJndWkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlsaWJkbAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIgICAgICAgICAgICAgICAgIFwKIAotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KIExPQ0FMX0NfSU5DTFVERVMgOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSQoSk5JX0hfSU5DTFVERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggMDE1NjYzNC4uMWU3Yzk2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTUxLDYgKzUxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIApAQCAtNjUsMTggKzY4LDYgQEAKIAogI2luY2x1ZGUgPE9NWC5oPgogCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCi0KIG5hbWVzcGFjZSB7CiB1c2luZyBhbmRyb2lkOjptZWRpYTo6TWV0YWRhdGE7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKQEAgLTI1OSw3ICsyNTAsMTEgQEAKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsIGludCBhdWRpb1Nlc3Npb25JZCkKIHsKICAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOwotICAgIHNwPENsaWVudD4gYyA9IG5ldyBDbGllbnQodGhpcywgcGlkLCBjb25uSWQsIGNsaWVudCwgYXVkaW9TZXNzaW9uSWQpOworCisgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCgKKyAgICAgICAgICAgIHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKwogICAgIExPR1YoIkNyZWF0ZSBuZXcgY2xpZW50KCVkKSBmcm9tIHBpZCAlZCwgdXJsPSVzLCBjb25uSWQ9JWQsIGF1ZGlvU2Vzc2lvbklkPSVkIiwKICAgICAgICAgICAgIGNvbm5JZCwgcGlkLCB1cmwsIGNvbm5JZCwgYXVkaW9TZXNzaW9uSWQpOwogICAgIGlmIChOT19FUlJPUiAhPSBjLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycykpCkBAIC0yNzcsNyArMjcyLDExIEBACiAgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgYXVkaW9TZXNzaW9uSWQpCiB7CiAgICAgaW50MzJfdCBjb25uSWQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0Q29ubklkKTsKLSAgICBzcDxDbGllbnQ+IGMgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkKTsKKworICAgIHNwPENsaWVudD4gYyA9IG5ldyBDbGllbnQoCisgICAgICAgICAgICB0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50LCBhdWRpb1Nlc3Npb25JZCwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisKICAgICBMT0dWKCJDcmVhdGUgbmV3IGNsaWVudCglZCkgZnJvbSBwaWQgJWQsIGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQsIGF1ZGlvU2Vzc2lvbklkPSVkIiwKICAgICAgICAgICAgIGNvbm5JZCwgcGlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIGF1ZGlvU2Vzc2lvbklkKTsKICAgICBpZiAoTk9fRVJST1IgIT0gYy0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKSB7CkBAIC0yOTUsNyArMjk0LDEwIEBACiAgICAgICAgIHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiAmY2xpZW50LAogICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLCBpbnQgYXVkaW9TZXNzaW9uSWQpIHsKICAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOwotICAgIHNwPENsaWVudD4gYyA9IG5ldyBDbGllbnQodGhpcywgcGlkLCBjb25uSWQsIGNsaWVudCwgYXVkaW9TZXNzaW9uSWQpOworCisgICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCgKKyAgICAgICAgICAgIHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKIAogICAgIExPR1YoIkNyZWF0ZSBuZXcgY2xpZW50KCVkKSBmcm9tIHBpZCAlZCwgYXVkaW9TZXNzaW9uSWQ9JWQiLAogICAgICAgICAgY29ubklkLCBwaWQsIGF1ZGlvU2Vzc2lvbklkKTsKQEAgLTM3Nyw2ICszNzksOSBAQAogICAgICAgICAgICAgbVBpZCwgbUNvbm5JZCwgbVN0YXR1cywgbUxvb3A/InRydWUiOiAiZmFsc2UiKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBtUGxheWVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb091dHB1dC0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQpAQCAtMzg0LDE0NyArMzg5LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXRpYyBpbnQgbXlUaWQoKSB7Ci0jaWZkZWYgSEFWRV9HRVRUSUQKLSAgICByZXR1cm4gZ2V0dGlkKCk7Ci0jZWxzZQotICAgIHJldHVybiBnZXRwaWQoKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChfX2FybV9fKQotZXh0ZXJuICJDIiB2b2lkIGdldF9tYWxsb2NfbGVha19pbmZvKHVpbnQ4X3QqKiBpbmZvLCBzaXplX3QqIG92ZXJhbGxTaXplLAotICAgICAgICBzaXplX3QqIGluZm9TaXplLCBzaXplX3QqIHRvdGFsTWVtb3J5LCBzaXplX3QqIGJhY2t0cmFjZVNpemUpOwotZXh0ZXJuICJDIiB2b2lkIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiBpbmZvKTsKLQotLy8gVXNlIHRoZSBTdHJpbmctY2xhc3MgYmVsb3cgaW5zdGVhZCBvZiBTdHJpbmc4IHRvIGFsbG9jYXRlIGFsbCBtZW1vcnkKLS8vIGJlZm9yZWhhbmQgYW5kIG5vdCByZWVudGVyIHRoZSBoZWFwIHdoaWxlIHdlIGFyZSBleGFtaW5pbmcgaXQuLi4KLXN0cnVjdCBNeVN0cmluZzggewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1NJWkUgPSAyNTYgKiAxMDI0OwotCi0gICAgTXlTdHJpbmc4KCkKLSAgICAgICAgOiBtUHRyKChjaGFyICopbWFsbG9jKE1BWF9TSVpFKSkgewotICAgICAgICAqbVB0ciA9ICdcMCc7Ci0gICAgfQotCi0gICAgfk15U3RyaW5nOCgpIHsKLSAgICAgICAgZnJlZShtUHRyKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFwcGVuZChjb25zdCBjaGFyICpzKSB7Ci0gICAgICAgIHN0cmNhdChtUHRyLCBzKTsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpzdHJpbmcoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUHRyOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gc3RybGVuKG1QdHIpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBjaGFyICptUHRyOwotCi0gICAgTXlTdHJpbmc4KGNvbnN0IE15U3RyaW5nOCAmKTsKLSAgICBNeVN0cmluZzggJm9wZXJhdG9yPShjb25zdCBNeVN0cmluZzggJik7Ci19OwotCi12b2lkIG1lbVN0YXR1cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgTXlTdHJpbmc4IHJlc3VsdDsKLQotICAgIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNpemVfdCBkdXBzOwotICAgICAgICBpbnRwdHJfdCAqIGJhY2t0cmFjZTsKLSAgICB9IEFsbG9jRW50cnk7Ci0KLSAgICB1aW50OF90ICppbmZvID0gTlVMTDsKLSAgICBzaXplX3Qgb3ZlcmFsbFNpemUgPSAwOwotICAgIHNpemVfdCBpbmZvU2l6ZSA9IDA7Ci0gICAgc2l6ZV90IHRvdGFsTWVtb3J5ID0gMDsKLSAgICBzaXplX3QgYmFja3RyYWNlU2l6ZSA9IDA7Ci0KLSAgICBnZXRfbWFsbG9jX2xlYWtfaW5mbygmaW5mbywgJm92ZXJhbGxTaXplLCAmaW5mb1NpemUsICZ0b3RhbE1lbW9yeSwgJmJhY2t0cmFjZVNpemUpOwotICAgIGlmIChpbmZvKSB7Ci0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IGluZm87Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEFsbG9jYXRpb24gY291bnQgJWlcbiIsIGNvdW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgVG90YWwgbWVtb3J5ICVpXG4iLCB0b3RhbE1lbW9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgICAgICBBbGxvY0VudHJ5ICogZW50cmllcyA9IG5ldyBBbGxvY0VudHJ5W2NvdW50XTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIC8vIEVhY2ggZW50cnkgc2hvdWxkIGJlIHNpemVfdCwgc2l6ZV90LCBpbnRwdHJfdFtiYWNrdHJhY2VTaXplXQotICAgICAgICAgICAgQWxsb2NFbnRyeSAqZSA9ICZlbnRyaWVzW2ldOwotCi0gICAgICAgICAgICBlLT5zaXplID0gKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90ICo+KHB0cik7Ci0gICAgICAgICAgICBwdHIgKz0gc2l6ZW9mKHNpemVfdCk7Ci0KLSAgICAgICAgICAgIGUtPmR1cHMgPSAqcmVpbnRlcnByZXRfY2FzdDxzaXplX3QgKj4ocHRyKTsKLSAgICAgICAgICAgIHB0ciArPSBzaXplb2Yoc2l6ZV90KTsKLQotICAgICAgICAgICAgZS0+YmFja3RyYWNlID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdCAqPihwdHIpOwotICAgICAgICAgICAgcHRyICs9IHNpemVvZihpbnRwdHJfdCkgKiBiYWNrdHJhY2VTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHdlIG5lZWQgdG8gc29ydCB0aGUgZW50cmllcy4gIFRoZXkgY29tZSBzb3J0ZWQgYnkgc2l6ZSBidXQKLSAgICAgICAgLy8gbm90IGJ5IHN0YWNrIHRyYWNlIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyB1c2luZyBkaWZmLgotICAgICAgICBib29sIG1vdmVkOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoY291bnQgLSAxKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQWxsb2NFbnRyeSAqZTEgPSAmZW50cmllc1tpXTsKLSAgICAgICAgICAgICAgICBBbGxvY0VudHJ5ICplMiA9ICZlbnRyaWVzW2krMV07Ci0KLSAgICAgICAgICAgICAgICBib29sIHN3YXAgPSBlMS0+c2l6ZSA8IGUyLT5zaXplOwotICAgICAgICAgICAgICAgIGlmIChlMS0+c2l6ZSA9PSBlMi0+c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgYmFja3RyYWNlU2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZTEtPmJhY2t0cmFjZVtqXSA9PSBlMi0+YmFja3RyYWNlW2pdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2FwID0gZTEtPmJhY2t0cmFjZVtqXSA8IGUyLT5iYWNrdHJhY2Vbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3dhcCkgewotICAgICAgICAgICAgICAgICAgICBBbGxvY0VudHJ5IHQgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2ldID0gZW50cmllc1tpKzFdOwotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2krMV0gPSB0OwotICAgICAgICAgICAgICAgICAgICBtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChtb3ZlZCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBbGxvY0VudHJ5ICplID0gJmVudHJpZXNbaV07Ci0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInNpemUgJThpLCBkdXAgJTRpLCAiLCBlLT5zaXplLCBlLT5kdXBzKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGN0ID0gMDsgKGN0IDwgYmFja3RyYWNlU2l6ZSkgJiYgZS0+YmFja3RyYWNlW2N0XTsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmIChjdCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwOHgiLCBlLT5iYWNrdHJhY2VbY3RdKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsZXRlW10gZW50cmllczsKLSAgICAgICAgZnJlZV9tYWxsb2NfbGVha19pbmZvKGluZm8pOwotICAgIH0KLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotI2VuZGlmCi0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC01NTYsNyArNDIwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgbXlUaWQoKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXR0aWQoKSk7CiAgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CiAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKQEAgLTU3NiwxMyArNDQwLDEzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBteVRpZCgpKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXR0aWQoKSk7CiAgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKICAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIG15VGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXR0aWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTYyMyw3ICs0ODcsNiBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogCi0jaWYgZGVmaW5lZChfX2FybV9fKQogICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgewpAQCAtNjMxLDkgKzQ5NCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGR1bXBNZW0pIHsKLSAgICAgICAgICAgIG1lbVN0YXR1cyhmZCwgYXJncyk7CisgICAgICAgICAgICBkdW1wTWVtb3J5QWRkcmVzc2VzKGZkKTsKICAgICAgICAgfQotI2VuZGlmCiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTY0NSw4ICs1MDcsMTAgQEAKICAgICBtQ2xpZW50cy5yZW1vdmUoY2xpZW50KTsKIH0KIAotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQsCi0gICAgICAgIGludDMyX3QgY29ubklkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCkKK01lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpDbGllbnQoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCwKKyAgICAgICAgaW50MzJfdCBjb25uSWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkLCB1aWRfdCB1aWQpCiB7CiAgICAgTE9HVigiQ2xpZW50KCVkKSBjb25zdHJ1Y3RvciIsIGNvbm5JZCk7CiAgICAgbVBpZCA9IHBpZDsKQEAgLTY1Niw2ICs1MjAsNyBAQAogICAgIG1Mb29wID0gZmFsc2U7CiAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgbUF1ZGlvU2Vzc2lvbklkID0gYXVkaW9TZXNzaW9uSWQ7CisgICAgbVVJRCA9IHVpZDsKIAogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiAgICAgTE9HRCgiY3JlYXRlIEFudGFnb25pemVyIik7CkBAIC04MjAsNiArNjg1LDkgQEAKICAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgIHAgPSBhbmRyb2lkOjpjcmVhdGVQbGF5ZXIocGxheWVyVHlwZSwgdGhpcywgbm90aWZ5KTsKICAgICB9CisKKyAgICBwLT5zZXRVSUQobVVJRCk7CisKICAgICByZXR1cm4gcDsKIH0KIApAQCAtMTE1Niw3ICsxMDI0LDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50Ojpub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIExPR1YoIlslZF0gc2V0UGFyYW1ldGVyKCVkKSIsIG1Db25uSWQsIGtleSk7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBMT0dWKCJbJWRdIGdldFBhcmFtZXRlciglZCkiLCBtQ29ubklkLCBrZXkpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeSgKKyAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKQogewogICAgIENsaWVudCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY29va2llKTsKIApAQCAtMTE3Myw3ICsxMDU2LDcgQEAKICAgICAgICAgY2xpZW50LT5hZGROZXdNZXRhZGF0YVVwZGF0ZShtZXRhZGF0YV90eXBlKTsKICAgICB9CiAgICAgTE9HVigiWyVkXSBub3RpZnkgKCVwLCAlZCwgJWQsICVkKSIsIGNsaWVudC0+bUNvbm5JZCwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOwotICAgIGNsaWVudC0+bUNsaWVudC0+bm90aWZ5KG1zZywgZXh0MSwgZXh0Mik7CisgICAgY2xpZW50LT5tQ2xpZW50LT5ub3RpZnkobXNnLCBleHQxLCBleHQyLCBvYmopOwogfQogCiAKQEAgLTEyODEsNyArMTE2NCw3IEBACiAgICAgbWVtID0gbmV3IE1lbW9yeUJhc2UoY2FjaGUtPmdldEhlYXAoKSwgMCwgY2FjaGUtPnNpemUoKSk7CiAgICAgKnBTYW1wbGVSYXRlID0gY2FjaGUtPnNhbXBsZVJhdGUoKTsKICAgICAqcE51bUNoYW5uZWxzID0gY2FjaGUtPmNoYW5uZWxDb3VudCgpOwotICAgICpwRm9ybWF0ID0gY2FjaGUtPmZvcm1hdCgpOworICAgICpwRm9ybWF0ID0gKGludCljYWNoZS0+Zm9ybWF0KCk7CiAgICAgTE9HVigicmV0dXJuIG1lbW9yeSBAICVwLCBzYW1wbGVSYXRlPSV1LCBjaGFubmVsQ291bnQgPSAlZCwgZm9ybWF0ID0gJWQiLCBtZW0tPnBvaW50ZXIoKSwgKnBTYW1wbGVSYXRlLCAqcE51bUNoYW5uZWxzLCAqcEZvcm1hdCk7CiAKIEV4aXQ6CkBAIC0xMzQyLDcgKzEyMjUsNyBAQAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpIHsKICAgICBMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwogICAgIG1UcmFjayA9IDA7Ci0gICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6TVVTSUM7CisgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgbUxlZnRWb2x1bWUgPSAxLjA7CiAgICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwogICAgIG1MYXRlbmN5ID0gMDsKQEAgLTE0NTIsNyArMTMzNSw3IEBACiAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgKGNoYW5uZWxDb3VudCA9PSAyKSA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8gOiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgICAgICAgICAoY2hhbm5lbENvdW50ID09IDIpID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8sCiAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLApAQCAtMTQ2NCw3ICsxMzQ3LDcgQEAKICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAoY2hhbm5lbENvdW50ID09IDIpID8gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyA6IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05PLAorICAgICAgICAgICAgICAgIChjaGFubmVsQ291bnQgPT0gMikgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9NT05PLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICBOVUxMLApAQCAtMTU4Myw4ICsxNDY2LDE1IEBACiAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAogICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUpOwogCi0gICAgYnVmZmVyLT5zaXplID0gYWN0dWFsU2l6ZTsKKyAgICBpZiAoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDApIHsKKyAgICAgICAgLy8gV2UndmUgcmVhY2hlZCBFT1MgYnV0IHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQsCisgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCisgICAgICAgIG1lbXNldChidWZmZXItPnJhdywgMCwgYnVmZmVyLT5zaXplKTsKKyAgICAgICAgYWN0dWFsU2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKKyAgICB9CisKKyAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwogfQogCiBpbnQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0U2Vzc2lvbklkKCkKQEAgLTE3NTAsNyArMTY0MCw4IEBACiAgICAgcmV0dXJuIG1FcnJvcjsKIH0KIAotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkoCisgICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKIHsKICAgICBMT0dWKCJub3RpZnkoJXAsICVkLCAlZCwgJWQpIiwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOwogICAgIEF1ZGlvQ2FjaGUqIHAgPSBzdGF0aWNfY2FzdDxBdWRpb0NhY2hlKj4oY29va2llKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBmZjZjY2Y1Li5lMzJiOTJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CkBAIC0xMzAsNyArMTMyLDcgQEAKICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lU2l6ZSgpICogbUZyYW1lQ291bnQ7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIChzc2l6ZV90KW1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gc3NpemVfdChtQ2hhbm5lbENvdW50ICogKChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKT9zaXplb2YoaW50MTZfdCk6c2l6ZW9mKHVfaW50OF90KSkpOyB9CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNzaXplX3QobUNoYW5uZWxDb3VudCAqICgobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk/c2l6ZW9mKGludDE2X3QpOnNpemVvZih1X2ludDhfdCkpKTsgfQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKTsKQEAgLTE1Niw3ICsxNTgsOCBAQAogCiAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGdldEhlYXAoKSBjb25zdCB7IHJldHVybiBtSGVhcDsgfQogCi0gICAgICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgIG5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7CisgICAgICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgIG5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToKQEAgLTI3Niw2ICsyNzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwgKnJlcGx5KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CiAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCkBAIC0yODcsNyArMjkyLDggQEAKIAogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCi0gICAgICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgIG5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7CisgICAgICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgIG5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKTsKIAogICAgICAgICAgICAgICAgIHBpZF90ICAgICAgICAgICBwaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKQEAgLTMwMCw3ICszMDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50KCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5DbGllbnQoKTsKIApAQCAtMzMwLDYgKzMzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1Db25uSWQ7CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVUlEOwogCiAgICAgICAgIC8vIE1ldGFkYXRhIGZpbHRlcnMuCiAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggMWExNzgwYy4uNmY4MGIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtMzUsMTAgKzM1LDEzIEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogI2luY2x1ZGUgIk1lZGlhUmVjb3JkZXJDbGllbnQuaCIKICNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKIAogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKKyNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTUsNyArNTgsMjIgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKQorCitzcDxJU3VyZmFjZVRleHR1cmU+IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkKK3sKKyAgICBMT0dWKCJRdWVyeSBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1SZWNvcmRlci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKTsKK30KKworCisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KQogewogICAgIExPR1YoInNldENhbWVyYSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTYzLDcgKzgxLDcgQEAKICAgICAgICAgTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhKTsKKyAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhLCBwcm94eSk7CiB9CiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQpAQCAtMTAyLDcgKzEyMCw3IEBACiAgICAgICAgIExPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UoKGF1ZGlvX3NvdXJjZSlhcyk7CisgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UoKGF1ZGlvX3NvdXJjZV90KWFzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0T3V0cHV0Rm9ybWF0KGludCBvZikKQEAgLTE2MCwxNyArMTc4LDYgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRPdXRwdXRGaWxlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKQotewotICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkoJWQpIiwgZmQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVJlY29yZGVyID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGZkKTsKLX0KLQogc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWR4JWQpIiwgd2lkdGgsIGhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCBmZGVkOThlLi5jOWNjZjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTI0LDQ0ICsyNCw1MSBAQAogCiBjbGFzcyBNZWRpYVJlY29yZGVyQmFzZTsKIGNsYXNzIE1lZGlhUGxheWVyU2VydmljZTsKK2NsYXNzIElDYW1lcmFSZWNvcmRpbmdQcm94eTsKK2NsYXNzIElTdXJmYWNlVGV4dHVyZTsKIAogY2xhc3MgTWVkaWFSZWNvcmRlckNsaWVudCA6IHB1YmxpYyBCbk1lZGlhUmVjb3JkZXIKIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU291cmNlKGludCB2cyk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU291cmNlKGludCBhcyk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZvcm1hdChpbnQgb2YpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0VuY29kZXIoaW50IHZlKTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIGdldE1heEFtcGxpdHVkZShpbnQqIG1heCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgaW5pdCgpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBjbG9zZSgpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlKCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFZpZGVvU291cmNlKGludCB2cyk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRBdWRpb1NvdXJjZShpbnQgYXMpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRWaWRlb0VuY29kZXIoaW50IHZlKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHByZXBhcmUoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldE1heEFtcGxpdHVkZShpbnQqIG1heCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzdGFydCgpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc3RvcCgpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgcmVzZXQoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGluaXQoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGNsb3NlKCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICByZWxlYXNlKCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisgICAgdmlydHVhbCAgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpOwogCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgorICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgICAgICB+TWVkaWFSZWNvcmRlckNsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZWNvcmRlckNsaWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICB+TWVkaWFSZWNvcmRlckNsaWVudCgpOwogCi0gICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgICAgICAqbVJlY29yZGVyOwotICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICBtTWVkaWFQbGF5ZXJTZXJ2aWNlOworICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgKm1SZWNvcmRlcjsKKyAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+IG1NZWRpYVBsYXllclNlcnZpY2U7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNWZjZjJhNy4uZDU3NGVhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC00MCwxOCArMzksNiBAQAogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgogCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZXh0ZXJuIHBsYXllcl90eXBlIGdldFBsYXllclR5cGUoY29uc3QgY2hhciogdXJsKTsKQEAgLTEyMCw3ICsxMDcsOCBAQAogICAgIHJldHVybiBwOwogfQogCi1zdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpCitzdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTMxLDcgKzExOSw3IEBACiAgICAgTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiBwID0gY3JlYXRlUmV0cmlldmVyKHBsYXllclR5cGUpOwogICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UodXJsKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CiAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgbVJldHJpZXZlciA9IHA7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggYjgzNDcxNS4uZjA4ZjkzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTQxLDcgKzQxLDEwIEBACiAgICAgLy8gSW1wbGVtZW50cyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlciBpbnRlcmZhY2UKICAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgaW4gSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwPwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAppbmRleCAxYjBiMDVmLi43ZTA0NTIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKQEAgLTI5LDE1ICsyOSwxMiBAQAogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIk1pZGlGaWxlLmgiCiAKLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTgsNyArNTUsNyBAQAogTWlkaUZpbGU6Ok1pZGlGaWxlKCkgOgogICAgIG1FYXNEYXRhKE5VTEwpLCBtRWFzSGFuZGxlKE5VTEwpLCBtQXVkaW9CdWZmZXIoTlVMTCksCiAgICAgbVBsYXlUaW1lKC0xKSwgbUR1cmF0aW9uKC0xKSwgbVN0YXRlKEVBU19TVEFURV9FUlJPUiksCi0gICAgbVN0cmVhbVR5cGUoQXVkaW9TeXN0ZW06Ok1VU0lDKSwgbUxvb3AoZmFsc2UpLCBtRXhpdChmYWxzZSksCisgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwgbUxvb3AoZmFsc2UpLCBtRXhpdChmYWxzZSksCiAgICAgbVBhdXNlZChmYWxzZSksIG1SZW5kZXIoZmFsc2UpLCBtVGlkKC0xKQogewogICAgIExPR1YoImNvbnN0cnVjdG9yIik7CkBAIC00MjMsNyArNDIwLDcgQEAKIH0KIAogc3RhdHVzX3QgTWlkaUZpbGU6OmNyZWF0ZU91dHB1dFRyYWNrKCkgewotICAgIGlmIChtQXVkaW9TaW5rLT5vcGVuKHBMaWJDb25maWctPnNhbXBsZVJhdGUsIHBMaWJDb25maWctPm51bUNoYW5uZWxzLCBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwgMikgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAobUF1ZGlvU2luay0+b3BlbihwTGliQ29uZmlnLT5zYW1wbGVSYXRlLCBwTGliQ29uZmlnLT5udW1DaGFubmVscywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIDIpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR0UoIm1BdWRpb1Npbmsgb3BlbiBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX09QRU5fRkFJTEVEOwogICAgIH0KQEAgLTQ1Myw3ICs0NTAsNyBAQAogICAgIC8vIHNpZ25hbCBtYWluIHRocmVhZCB0aGF0IHdlIHN0YXJ0ZWQKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1UaWQgPSBteVRpZCgpOworICAgICAgICBtVGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIExPR1YoInJlbmRlciB0aHJlYWQoJWQpIHNpZ25hbCIsIG1UaWQpOwogICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggYTk4MjMxYy4uYjM1Njk2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTU1LDYgKzU1LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAKIHByaXZhdGU6CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVPdXRwdXRUcmFjaygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBhZDk1ZmFjLi5hYWYyZDE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzUsNyArMzUsOCBAQAogICAgIG1NZXRhZGF0YVZhbHVlc1swXVswXSA9ICdcMCc7CiB9CiAKLXN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpCitzdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgTE9HVigic2V0RGF0YVNvdXJjZTogJXMiLCB1cmw/IHVybDogIk5VTEwgcG9pbnRlciIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTQzLDggKzQ0LDcgQEAKICAgICBpZiAobU1pZGlQbGF5ZXIgPT0gMCkgewogICAgICAgICBtTWlkaVBsYXllciA9IG5ldyBNaWRpRmlsZSgpOwogICAgIH0KLSAgICAvLyBUT0RPOiBzdXBwb3J0IGhlYWRlcnMgaW4gTWV0YWRhdGFSZXRyaWV2ZXIgaW50ZXJmYWNlIQotICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIE5VTEwgLyogaGVhZGVycyAqLyk7CisgICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA3M2ZmMzQ3Li40Y2VlNDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMSw3ICszMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pZGlNZXRhZGF0YVJldHJpZXZlcigpIHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5NaWRpTWV0YWRhdGFSZXRyaWV2ZXIoKSB7fQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggYzVjYmQyMy4uNDBlMDU1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC00Nyw2ICs0NywxMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFVJRCh1aWRfdCB1aWQpIHsKKyAgICBtUGxheWVyLT5zZXRVSUQodWlkKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldERhdGFTb3VyY2UoCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOwpAQCAtMTEwLDcgKzExNiw3IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZWVrVG8oaW50IG1zZWMpIHsKLSAgICBMT0dWKCJzZWVrVG8iKTsKKyAgICBMT0dWKCJzZWVrVG8gJS4yZiBzZWNzIiwgbXNlYyAvIDFFMyk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZWVrVG8oKGludDY0X3QpbXNlYyAqIDEwMDApOwogCkBAIC0xNzcsNiArMTgzLDE2IEBACiAgICAgbVBsYXllci0+c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgTE9HVigic2V0UGFyYW1ldGVyIik7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBMT0dWKCJnZXRQYXJhbWV0ZXIiKTsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGFyYW1ldGVyKGtleSwgcmVwbHkpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6Z2V0TWV0YWRhdGEoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKQEAgLTIwNCw0ICsyMjAsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CisgICAgcmV0dXJuIG1QbGF5ZXItPmR1bXAoZmQsIGFyZ3MpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAppbmRleCBlMjc5NmQyLi5jYmM2ZDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaApAQCAtMzEsNiArMzEsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VUlEKHVpZF90IHVpZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNTUsMTAgKzU3LDE0IEBACiAgICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCiAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgQXdlc29tZVBsYXllciAqbVBsYXllcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGUzZGZhYmIuLjZmZGI3MjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI2LDEwICsyNiw5IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CkBAIC0zNywxNSArMzYsMTkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CisKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKICNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYyLDExICs2NSwxMSBAQAogCiAKIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoKQotICAgIDogbVdyaXRlcihOVUxMKSwgbVdyaXRlckF1eChOVUxMKSwKLSAgICAgIG1PdXRwdXRGZCgtMSksIG1PdXRwdXRGZEF1eCgtMSksCi0gICAgICBtQXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0xJU1RfRU5EKSwKKyAgICA6IG1Xcml0ZXIoTlVMTCksCisgICAgICBtT3V0cHV0RmQoLTEpLAorICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpLCBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpIHsKIAogICAgIExPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTgyLDEwICs4NSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlIGFzKSB7CisvLyBUaGUgY2xpZW50IHNpZGUgb2YgbWVkaWFzZXJ2ZXIgYXNrcyBpdCB0byBjcmVhdCBhIFN1cmZhY2VNZWRpYVNvdXJjZQorLy8gYW5kIHJldHVybiBhIGludGVyZmFjZSByZWZlcmVuY2UuIFRoZSBjbGllbnQgc2lkZSB3aWxsIHVzZSB0aGF0CisvLyB3aGlsZSBlbmNvZGluZyBHTCBGcmFtZXMKK3NwPElTdXJmYWNlVGV4dHVyZT4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdCB7CisgICAgTE9HVigiR2V0IFN1cmZhY2VNZWRpYVNvdXJjZSIpOworICAgIHJldHVybiBtU3VyZmFjZU1lZGlhU291cmNlOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBhcykgewogICAgIExPR1YoInNldEF1ZGlvU291cmNlOiAlZCIsIGFzKTsKICAgICBpZiAoYXMgPCBBVURJT19TT1VSQ0VfREVGQVVMVCB8fAotICAgICAgICBhcyA+PSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgYXMgPj0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBhcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTk1LDE0ICsyMDYsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmY2FtZXJhKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+ICZwcm94eSkgewogICAgIExPR1YoInNldENhbWVyYSIpOwogICAgIGlmIChjYW1lcmEgPT0gMCkgewogICAgICAgICBMT0dFKCJjYW1lcmEgaXMgTlVMTCIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBpZiAocHJveHkgPT0gMCkgeworICAgICAgICBMT0dFKCJjYW1lcmEgcHJveHkgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIG1DYW1lcmEgPSBjYW1lcmE7CisgICAgbUNhbWVyYVByb3h5ID0gcHJveHk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNDAsMjQgKzI1Nyw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgewotICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnk6ICVkIiwgZmQpOwotCi0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0dFKCJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogJWQiLCBmZCk7Ci0gICAgICAgIHJldHVybiAtRUJBREY7Ci0gICAgfQotCi0gICAgbUNhcHR1cmVBdXhWaWRlbyA9IHRydWU7Ci0KLSAgICBpZiAobU91dHB1dEZkQXV4ID49IDApIHsKLSAgICAgICAgOjpjbG9zZShtT3V0cHV0RmRBdXgpOwotICAgIH0KLSAgICBtT3V0cHV0RmRBdXggPSBkdXAoZmQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiAvLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGludDY0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsCiAvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogc3RhdGljIGJvb2wgc2FmZV9zdHJ0b2k2NChjb25zdCBjaGFyICpzLCBpbnQ2NF90ICp2YWwpIHsKQEAgLTU1NCwzOSArNTUzLDIzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1eFZpZGVvV2lkdGgoaW50MzJfdCB3aWR0aCkgewotICAgIExPR1YoInNldFBhcmFtQXV4VmlkZW9XaWR0aCA6ICVkIiwgd2lkdGgpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1HZW9EYXRhTG9uZ2l0dWRlKAorICAgIGludDMyX3QgbG9uZ2l0dWRleDEwMDAwKSB7CiAKLSAgICBpZiAod2lkdGggPD0gMCkgewotICAgICAgICBMT0dFKCJXaWR0aCAoJWQpIGlzIG5vdCBwb3NpdGl2ZSIsIHdpZHRoKTsKKyAgICBpZiAobG9uZ2l0dWRleDEwMDAwID4gMTgwMDAwMCB8fCBsb25naXR1ZGV4MTAwMDAgPCAtMTgwMDAwMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIG1BdXhWaWRlb1dpZHRoID0gd2lkdGg7CisgICAgbUxvbmdpdHVkZXgxMDAwMCA9IGxvbmdpdHVkZXgxMDAwMDsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9IZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsKLSAgICBMT0dWKCJzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0IDogJWQiLCBoZWlnaHQpOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1HZW9EYXRhTGF0aXR1ZGUoCisgICAgaW50MzJfdCBsYXRpdHVkZXgxMDAwMCkgewogCi0gICAgaWYgKGhlaWdodCA8PSAwKSB7Ci0gICAgICAgIExPR0UoIkhlaWdodCAoJWQpIGlzIG5vdCBwb3NpdGl2ZSIsIGhlaWdodCk7CisgICAgaWYgKGxhdGl0dWRleDEwMDAwID4gOTAwMDAwIHx8IGxhdGl0dWRleDEwMDAwIDwgLTkwMDAwMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIG1BdXhWaWRlb0hlaWdodCA9IGhlaWdodDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7Ci0gICAgTE9HVigiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKLQotICAgIGlmIChiaXRSYXRlIDw9IDApIHsKLSAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBlbmNvZGluZyBiaXQgcmF0ZTogJWQiLCBiaXRSYXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBtQXV4VmlkZW9CaXRSYXRlID0gYml0UmF0ZTsKKyAgICBtTGF0aXR1ZGV4MTAwMDAgPSBsYXRpdHVkZXgxMDAwMDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTYxOCw2ICs2MDEsMTYgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ1c2U2NEJpdE9mZnNldCkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbTY0Qml0RmlsZU9mZnNldCh1c2U2NEJpdE9mZnNldCAhPSAwKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS1nZW90YWctbG9uZ2l0dWRlIikgeworICAgICAgICBpbnQzMl90IGxvbmdpdHVkZXgxMDAwMDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZsb25naXR1ZGV4MTAwMDApKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1HZW9EYXRhTG9uZ2l0dWRlKGxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicGFyYW0tZ2VvdGFnLWxhdGl0dWRlIikgeworICAgICAgICBpbnQzMl90IGxhdGl0dWRleDEwMDAwOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmxhdGl0dWRleDEwMDAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtR2VvRGF0YUxhdGl0dWRlKGxhdGl0dWRleDEwMDAwKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS10cmFjay10aW1lLXN0YXR1cyIpIHsKICAgICAgICAgaW50NjRfdCB0aW1lRHVyYXRpb25VczsKICAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lRHVyYXRpb25VcykpIHsKQEAgLTY4OSwyMSArNjgyLDYgQEAKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKAogICAgICAgICAgICAgICAgICAgICAxMDAwTEwgKiB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1hdXgtcGFyYW0td2lkdGgiKSB7Ci0gICAgICAgIGludDMyX3QgYXV4V2lkdGg7Ci0gICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmYXV4V2lkdGgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb1dpZHRoKGF1eFdpZHRoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1hdXgtcGFyYW0taGVpZ2h0IikgewotICAgICAgICBpbnQzMl90IGF1eEhlaWdodDsKLSAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhIZWlnaHQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb0hlaWdodChhdXhIZWlnaHQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS1lbmNvZGluZy1iaXRyYXRlIikgewotICAgICAgICBpbnQzMl90IGF1eFZpZGVvQml0UmF0ZTsKLSAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhWaWRlb0JpdFJhdGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZShhdXhWaWRlb0JpdFJhdGUpOwotICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTgwMCw3ICs3NzgsNyBAQAogICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQ29kZWNTdGFydGVkOwotICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CkBAIC04NzAsMTUgKzg0OCwyMSBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFBQ1JlY29yZGluZygpIHsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQUFDX0FESUYgfHwKLSAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMpOworICAgIC8vIEZJWE1FOgorICAgIC8vIEFkZCBzdXBwb3J0IGZvciBPVVRQVVRfRk9STUFUX0FBQ19BRElGCisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKIAogICAgIENIRUNLKG1BdWRpb0VuY29kZXIgPT0gQVVESU9fRU5DT0RFUl9BQUMpOwotICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpOworICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKTsKIAotICAgIENIRUNLKDAgPT0gIkFBQ1dyaXRlciBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisgICAgbVdyaXRlciA9IG5ldyBBQUNXcml0ZXIobU91dHB1dEZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFNUlJlY29yZGluZygpIHsKQEAgLTkwMCw3ICs4ODQsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIobU91dHB1dEZkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCkgeworICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTkxNSw3ICs5MDksNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihtT3V0cHV0RmQpOworICAgIENIRUNLKG1Xcml0ZXIgIT0gMCk7CiAgICAgbVdyaXRlci0+YWRkU291cmNlKGF1ZGlvRW5jb2Rlcik7CiAKICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKQEAgLTkzMyw5ICs5MjcsOSBAQAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKTsKIAotICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORAorICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQKICAgICAgICAgICAgICAgICAmJiBtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKQotICAgICAgICAgICAgfHwgKG1BdWRpb1NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTElTVF9FTkQKKyAgICAgICAgICAgIHx8IChtQXVkaW9Tb3VyY2UgPT0gQVVESU9fU09VUkNFX0NOVAogICAgICAgICAgICAgICAgICYmIG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTElTVF9FTkQpKSB7CiAgICAgICAgIC8vIE11c3QgaGF2ZSBleGFjdGx5IG9uZSBzb3VyY2UuCiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05NDcsMTcgKzk0MSwxNyBAQAogCiAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZTsKIAotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKIAotICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIG1WaWRlb0JpdFJhdGUsICZzb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC05NzUsNyArOTY5LDcgQEAKIAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihtT3V0cHV0RmQpOwogCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgaWYgKG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9BQUMpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQpAQCAtOTg3LDIwICs5ODEsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKLSAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA8IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewogICAgICAgICBpZiAobVZpZGVvRW5jb2RlciAhPSBWSURFT19FTkNPREVSX0gyNjQpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogCi0gICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgmY2FtZXJhU291cmNlKTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1lZGlhU291cmNlKCZtZWRpYVNvdXJjZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEwODEsMTAgKzEwNzQsNjkgQEAKICAgICAgICAgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CiAgICAgICAgIGNsaXBWaWRlb0ZyYW1lV2lkdGgoKTsKICAgICAgICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKKyAgICAgICAgc2V0RGVmYXVsdFByb2ZpbGVJZk5lY2Vzc2FyeSgpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKKy8vIFNldCB0byB1c2UgQVZDIGJhc2VsaW5lIHByb2ZpbGUgaWYgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgbWF0Y2hlcworLy8gQ0FNQ09SREVSX1FVQUxJVFlfTE9XIHByb2ZpbGU7IHRoaXMgaXMgZm9yIHRoZSBzYWtlIG9mIE1NUyBzZXJ2aWNlLgordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXREZWZhdWx0UHJvZmlsZUlmTmVjZXNzYXJ5KCkgeworICAgIExPR1YoInNldERlZmF1bHRQcm9maWxlSWZOZWNlc3NhcnkiKTsKKworICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9MT1c7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgICA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiwgbUNhbWVyYUlkLCBxdWFsaXR5KSAqIDEwMDAwMDBMTDsKKworICAgIGludCBmaWxlRm9ybWF0ICAgICAgID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS5mb3JtYXQiLCBtQ2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IHZpZGVvQ29kZWMgICAgICAgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWQuY29kZWMiLCBtQ2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IHZpZGVvQml0UmF0ZSAgICAgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWQuYnBzIiwgbUNhbWVyYUlkLCBxdWFsaXR5KTsKKworICAgIGludCB2aWRlb0ZyYW1lUmF0ZSAgID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkLmZwcyIsIG1DYW1lcmFJZCwgcXVhbGl0eSk7CisKKyAgICBpbnQgdmlkZW9GcmFtZVdpZHRoICA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZC53aWR0aCIsIG1DYW1lcmFJZCwgcXVhbGl0eSk7CisKKyAgICBpbnQgdmlkZW9GcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZC5oZWlnaHQiLCBtQ2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IGF1ZGlvQ29kZWMgICAgICAgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWQuY29kZWMiLCBtQ2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IGF1ZGlvQml0UmF0ZSAgICAgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWQuYnBzIiwgbUNhbWVyYUlkLCBxdWFsaXR5KTsKKworICAgIGludCBhdWRpb1NhbXBsZVJhdGUgID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkLmh6IiwgbUNhbWVyYUlkLCBxdWFsaXR5KTsKKworICAgIGludCBhdWRpb0NoYW5uZWxzICAgID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkLmNoIiwgbUNhbWVyYUlkLCBxdWFsaXR5KTsKKworICAgIGlmIChkdXJhdGlvblVzID09IG1NYXhGaWxlRHVyYXRpb25VcyAmJgorICAgICAgICBmaWxlRm9ybWF0ID09IG1PdXRwdXRGb3JtYXQgJiYKKyAgICAgICAgdmlkZW9Db2RlYyA9PSBtVmlkZW9FbmNvZGVyICYmCisgICAgICAgIHZpZGVvQml0UmF0ZSA9PSBtVmlkZW9CaXRSYXRlICYmCisgICAgICAgIHZpZGVvRnJhbWVSYXRlID09IG1GcmFtZVJhdGUgJiYKKyAgICAgICAgdmlkZW9GcmFtZVdpZHRoID09IG1WaWRlb1dpZHRoICYmCisgICAgICAgIHZpZGVvRnJhbWVIZWlnaHQgPT0gbVZpZGVvSGVpZ2h0ICYmCisgICAgICAgIGF1ZGlvQ29kZWMgPT0gbUF1ZGlvRW5jb2RlciAmJgorICAgICAgICBhdWRpb0JpdFJhdGUgPT0gbUF1ZGlvQml0UmF0ZSAmJgorICAgICAgICBhdWRpb1NhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUgJiYKKyAgICAgICAgYXVkaW9DaGFubmVscyA9PSBtQXVkaW9DaGFubmVscykgeworICAgICAgICBpZiAodmlkZW9Db2RlYyA9PSBWSURFT19FTkNPREVSX0gyNjQpIHsKKyAgICAgICAgICAgIExPR0koIkZvcmNlIHRvIHVzZSBBVkMgYmFzZWxpbmUgcHJvZmlsZSIpOworICAgICAgICAgICAgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpjaGVja0F1ZGlvRW5jb2RlckNhcGFiaWxpdGllcygpIHsKICAgICBjbGlwQXVkaW9CaXRSYXRlKCk7CiAgICAgY2xpcEF1ZGlvU2FtcGxlUmF0ZSgpOwpAQCAtMTE3NSw2ICsxMjI3LDYwIEBACiAgICAgfQogfQogCisvLyBTZXQgdXAgdGhlIGFwcHJvcHJpYXRlIE1lZGlhU291cmNlIGRlcGVuZGluZyBvbiB0aGUgY2hvc2VuIG9wdGlvbgorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNZWRpYVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKm1lZGlhU291cmNlKSB7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAorICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgICptZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIpIHsKKyAgICAgICAgLy8gSWYgdXNpbmcgR1JBbGxvYyBidWZmZXJzLCBzZXR1cCBzdXJmYWNlbWVkaWFzb3VyY2UuCisgICAgICAgIC8vIExhdGVyIGEgaGFuZGxlIHRvIHRoYXQgd2lsbCBiZSBwYXNzZWQKKyAgICAgICAgLy8gdG8gdGhlIGNsaWVudCBzaWRlIHdoZW4gcXVlcmllZAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgICptZWRpYVNvdXJjZSA9IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHNldHVwU3VyZmFjZU1lZGlhU291cmNlIGNyZWF0ZXMgYSBzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4KKy8vIHdpZHRoIGFuZCBoZWlnaHQgYW5kIGZyYW1lcmF0ZS4KKy8vIFRPRE86IFRoaXMgY291bGQgZ28gaW4gYSBzdGF0aWMgZnVuY3Rpb24gaW5zaWRlIFN1cmZhY2VNZWRpYVNvdXJjZQorLy8gc2ltaWxhciB0byB0aGF0IGluIENhbWVyYVNvdXJjZQorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgbVN1cmZhY2VNZWRpYVNvdXJjZSA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgaWYgKG1TdXJmYWNlTWVkaWFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobUZyYW1lUmF0ZSA9PSAtMSkgeworICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IDA7CisgICAgICAgIENIRUNLIChtU3VyZmFjZU1lZGlhU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlGcmFtZVJhdGUsICZmcmFtZVJhdGUpKTsKKyAgICAgICAgTE9HSSgiRnJhbWUgcmF0ZSBpcyBub3QgZXhwbGljaXRseSBzZXQuIFVzZSB0aGUgY3VycmVudCBmcmFtZSAiCisgICAgICAgICAgICAgInJhdGUgKCVkIGZwcykiLCBmcmFtZVJhdGUpOworICAgICAgICBtRnJhbWVSYXRlID0gZnJhbWVSYXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1TdXJmYWNlTWVkaWFTb3VyY2UtPnNldEZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKKyAgICB9CisgICAgQ0hFQ0sobUZyYW1lUmF0ZSAhPSAtMSk7CisKKyAgICBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0KKyAgICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZS0+aXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCk7CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2UoCiAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgewogICAgIHN0YXR1c190IGVyciA9IE9LOwpAQCAtMTE4NiwxNSArMTI5MiwxNyBAQAogICAgIHZpZGVvU2l6ZS5oZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CiAgICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7CiAgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEoCi0gICAgICAgICAgICAgICAgbUNhbWVyYSwgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgIG1DYW1lcmEsIG1DYW1lcmFQcm94eSwgbUNhbWVyYUlkLAogICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwgbVByZXZpZXdTdXJmYWNlLAogICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKICAgICAgICAgKmNhbWVyYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYSgKLSAgICAgICAgICAgICAgICBtQ2FtZXJhLCBtQ2FtZXJhSWQsIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLCBtQ2FtZXJhUHJveHksIG1DYW1lcmFJZCwgdmlkZW9TaXplLCBtRnJhbWVSYXRlLAogICAgICAgICAgICAgICAgIG1QcmV2aWV3U3VyZmFjZSwgdHJ1ZSAvKnN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyovKTsKICAgICB9CisgICAgbUNhbWVyYS5jbGVhcigpOworICAgIG1DYW1lcmFQcm94eS5jbGVhcigpOwogICAgIGlmICgqY2FtZXJhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTMzOCw3ICsxNDQ2LDYgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgYm9vbCB1c2VTcGxpdENhbWVyYVNvdXJjZSwKICAgICAgICAgaW50IG91dHB1dEZkLAogICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCiAgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLApAQCAtMTM0OSwyOSArMTQ1NiwxNiBAQAogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIob3V0cHV0RmQpOwogCi0gICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAotICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKyAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CiAKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYU1lZGlhU291cmNlOwotICAgICAgICBpZiAodXNlU3BsaXRDYW1lcmFTb3VyY2UpIHsKLSAgICAgICAgICAgIExPR1YoIlVzaW5nIFNwbGl0IGNhbWVyYSBzb3VyY2UiKTsKLSAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0gbUNhbWVyYVNvdXJjZVNwbGl0dGVyLT5jcmVhdGVDbGllbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOwotICAgICAgICAgICAgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7Ci0gICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHZpZGVvV2lkdGggIT0gbVZpZGVvV2lkdGgpIHx8ICh2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpKSB7Ci0gICAgICAgICAgICAvLyBVc2UgZG93bnNhbXBsaW5nIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZS4KLSAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0KLSAgICAgICAgICAgICAgICBuZXcgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjYW1lcmFNZWRpYVNvdXJjZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotICAgICAgICB9CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKyAgICAgICAgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKGNhbWVyYU1lZGlhU291cmNlLCB2aWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIHZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC0xMzgzLDcgKzE0NzcsNyBAQAogICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KICAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSkgewogICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CkBAIC0xMzkzLDYgKzE0ODcsMTAgQEAKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KICAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgIH0KKyAgICBpZiAobUxvbmdpdHVkZXgxMDAwMCA+IC0zNjAwMDAwICYmIG1MYXRpdHVkZXgxMDAwMCA+IC0zNjAwMDAwKSB7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgfQogICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uVXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOwogICAgIH0KQEAgLTE0MDAsNiArMTQ5OCwxMiBAQAogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9CiAKKyAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRTdGFydFRpbWVPZmZzZXRNcyhtQ2FtZXJhSWQpOworICAgIGlmIChtU3RhcnRUaW1lT2Zmc2V0TXMgPiAwKSB7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICBzZXRTdGFydFRpbWVPZmZzZXRNcyhtU3RhcnRUaW1lT2Zmc2V0TXMpOworICAgIH0KKwogICAgIHdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKICAgICAqbWVkaWFXcml0ZXIgPSB3cml0ZXI7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTQyMywyNCArMTUyNyw4IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKLSAgICAgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSkgewotICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IHZpZGVvIGNhbiBiZSBjYXB0dXJlZCBvbmx5IGluIHRpbWUgbGFwc2UgbW9kZSIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiQ3JlYXRpbmcgTWVkaWFTb3VyY2VTcGxpdHRlciIpOwotICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gbmV3IE1lZGlhU291cmNlU3BsaXR0ZXIoY2FtZXJhU291cmNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBOVUxMOwotICAgIH0KLQogICAgIGludDMyX3QgdG90YWxCaXRSYXRlOwotICAgIHN0YXR1c190IGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKAogICAgICAgICAgICAgbU91dHB1dEZkLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSwgJnRvdGFsQml0UmF0ZSwgJm1Xcml0ZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE0NTYsMzMgKzE1NDQsNiBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7Ci0gICAgICAgIENIRUNLKG1PdXRwdXRGZEF1eCA+PSAwKTsKLSAgICAgICAgaWYgKG1Xcml0ZXJBdXggIT0gTlVMTCkgewotICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IEZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobUF1eFZpZGVvV2lkdGggPiBtVmlkZW9XaWR0aCkgfHwgKG1BdXhWaWRlb0hlaWdodCA+IG1WaWRlb0hlaWdodCkgfHwKLSAgICAgICAgICAgICAgICAoKG1BdXhWaWRlb1dpZHRoID09IG1WaWRlb1dpZHRoKSAmJiBtQXV4VmlkZW9IZWlnaHQgPT0gbVZpZGVvSGVpZ2h0KSkgewotICAgICAgICAgICAgTE9HRSgiQXV4aWxpYXJ5IHZpZGVvIHNpemUgKCVkIHggJWQpIHNhbWUgb3IgbGFyZ2VyIHRoYW4gdGhlIG1haW4gdmlkZW8gc2l6ZSAoJWQgeCAlZCkiLAotICAgICAgICAgICAgICAgICAgICBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCB0b3RhbEJpdHJhdGVBdXg7Ci0gICAgICAgIGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKLSAgICAgICAgICAgICAgICBtT3V0cHV0RmRBdXgsIG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAgICAgbUF1eFZpZGVvQml0UmF0ZSwgJnRvdGFsQml0cmF0ZUF1eCwgJm1Xcml0ZXJBdXgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFBdXggPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRyYXRlQXV4LCAmbWV0YUF1eCk7Ci0KLSAgICAgICAgcmV0dXJuIG1Xcml0ZXJBdXgtPnN0YXJ0KG1ldGFBdXguZ2V0KCkpOwotICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTQ5MywxOCArMTU1NCwxMSBAQAogICAgIH0KICAgICBtV3JpdGVyLT5wYXVzZSgpOwogCi0gICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKLSAgICAgICAgaWYgKG1Xcml0ZXJBdXggPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgbVdyaXRlckF1eC0+cGF1c2UoKTsKLSAgICB9Ci0KICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAogICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOwotICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0F1ZGlvOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CkBAIC0xNTI3LDEzICsxNTgxLDYgQEAKICAgICAgICAgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IE5VTEw7CiAgICAgfQogCi0gICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKLSAgICAgICAgaWYgKG1Xcml0ZXJBdXggIT0gTlVMTCkgewotICAgICAgICAgICAgbVdyaXRlckF1eC0+c3RvcCgpOwotICAgICAgICAgICAgbVdyaXRlckF1eC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBlcnIgPSBtV3JpdGVyLT5zdG9wKCk7CiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKQEAgLTE1NDQsMTggKzE1OTEsMTEgQEAKICAgICAgICAgbU91dHB1dEZkID0gLTE7CiAgICAgfQogCi0gICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKLSAgICAgICAgaWYgKG1PdXRwdXRGZEF1eCA+PSAwKSB7Ci0gICAgICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7Ci0gICAgICAgICAgICBtT3V0cHV0RmRBdXggPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCiAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7Ci0gICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKQEAgLTE1ODEsNyArMTYyMSw3IEBACiAgICAgc3RvcCgpOwogCiAgICAgLy8gTm8gYXVkaW8gb3IgdmlkZW8gc291cmNlIGJ5IGRlZmF1bHQKLSAgICBtQXVkaW9Tb3VyY2UgPSBBVURJT19TT1VSQ0VfTElTVF9FTkQ7CisgICAgbUF1ZGlvU291cmNlID0gQVVESU9fU09VUkNFX0NOVDsKICAgICBtVmlkZW9Tb3VyY2UgPSBWSURFT19TT1VSQ0VfTElTVF9FTkQ7CiAKICAgICAvLyBEZWZhdWx0IHBhcmFtZXRlcnMKQEAgLTE1OTAsMTEgKzE2MzAsOCBAQAogICAgIG1WaWRlb0VuY29kZXIgID0gVklERU9fRU5DT0RFUl9IMjYzOwogICAgIG1WaWRlb1dpZHRoICAgID0gMTc2OwogICAgIG1WaWRlb0hlaWdodCAgID0gMTQ0OwotICAgIG1BdXhWaWRlb1dpZHRoICAgID0gMTc2OwotICAgIG1BdXhWaWRlb0hlaWdodCAgID0gMTQ0OwogICAgIG1GcmFtZVJhdGUgICAgID0gLTE7CiAgICAgbVZpZGVvQml0UmF0ZSAgPSAxOTIwMDA7Ci0gICAgbUF1eFZpZGVvQml0UmF0ZSA9IDE5MjAwMDsKICAgICBtU2FtcGxlUmF0ZSAgICA9IDgwMDA7CiAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAxOwogICAgIG1BdWRpb0JpdFJhdGUgID0gMTIyMDA7CkBAIC0xNjA2LDYgKzE2NDMsNyBAQAogICAgIG1BdWRpb1RpbWVTY2FsZSAgPSAtMTsKICAgICBtVmlkZW9UaW1lU2NhbGUgID0gLTE7CiAgICAgbUNhbWVyYUlkICAgICAgICA9IDA7CisgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CiAgICAgbVZpZGVvRW5jb2RlclByb2ZpbGUgPSAtMTsKICAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgICA9IC0xOwogICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CkBAIC0xNjEzLDE1ICsxNjUxLDE0IEBACiAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IDA7CiAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA9IC0xOwotICAgIG1DYXB0dXJlQXV4VmlkZW8gPSBmYWxzZTsKLSAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBOVUxMOwogICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBOVUxMOwogICAgIG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMgPSBmYWxzZTsKICAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKKyAgICBtTGF0aXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKKyAgICBtTG9uZ2l0dWRleDEwMDAwID0gLTM2MDAwMDA7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKLSAgICBtT3V0cHV0RmRBdXggPSAtMTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE2NTgsOCArMTY5NSw2IEBACiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgUmVjb3JkZXI6ICVwXG4iLCB0aGlzKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBPdXRwdXQgZmlsZSAoZmQgJWQpOlxuIiwgbU91dHB1dEZkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgT3V0cHV0IGZpbGUgQXV4aWxpYXJ5IChmZCAlZCk6XG4iLCBtT3V0cHV0RmRBdXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgZm9ybWF0OiAlZFxuIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlbGxkXG4iLCBtTWF4RmlsZVNpemVCeXRlcyk7CkBAIC0xNjkyLDYgKzE3MjcsOCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIENhbWVyYSBJZDogJWRcbiIsIG1DYW1lcmFJZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgU3RhcnQgdGltZSBvZmZzZXQgKG1zKTogJWRcbiIsIG1TdGFydFRpbWVPZmZzZXRNcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlcjogJWRcbiIsIG1WaWRlb0VuY29kZXIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEVuY29kZXIgcHJvZmlsZTogJWRcbiIsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKQEAgLTE3MDIsMTQgKzE3MzksMTAgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGcmFtZSBzaXplIChwaXhlbHMpOiAlZHglZFxuIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQXV4IEZyYW1lIHNpemUgKHBpeGVscyk6ICVkeCVkXG4iLCBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGcmFtZSByYXRlIChmcHMpOiAlZFxuIiwgbUZyYW1lUmF0ZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtVmlkZW9CaXRSYXRlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBBdXggQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtQXV4VmlkZW9CaXRSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCAyYzQ0MGMxLi41YzVmMDVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTIyLDM1ICsyMiwzOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ2FtZXJhOworY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwogY2xhc3MgQ2FtZXJhU291cmNlOwogY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlOwotY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKIGNsYXNzIE1ldGFEYXRhOwogc3RydWN0IEF1ZGlvU291cmNlOwogY2xhc3MgTWVkaWFQcm9maWxlczsKK2NsYXNzIElTdXJmYWNlVGV4dHVyZTsKK2NsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZTsKIAogc3RydWN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgOiBwdWJsaWMgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoKTsKICAgICB2aXJ0dWFsIH5TdGFnZWZyaWdodFJlY29yZGVyKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZSBhcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBhcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NvdXJjZSh2aWRlb19zb3VyY2UgdnMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0Rm9ybWF0KG91dHB1dF9mb3JtYXQgb2YpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9FbmNvZGVyKGF1ZGlvX2VuY29kZXIgYWUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9FbmNvZGVyKHZpZGVvX2VuY29kZXIgdmUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwpAQCAtNjEsMjQgKzY0LDI3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKyAgICAvLyBRdWVyeWluZyBhIFN1cmZhY2VNZWRpYVNvdXJjZXIKKyAgICB2aXJ0dWFsIHNwPElTdXJmYWNlVGV4dHVyZT4gcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzcDxJQ2FtZXJhPiBtQ2FtZXJhOworICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gbUNhbWVyYVByb3h5OwogICAgIHNwPFN1cmZhY2U+IG1QcmV2aWV3U3VyZmFjZTsKICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwotICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyLCBtV3JpdGVyQXV4OworICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOworICAgIGludCBtT3V0cHV0RmQ7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CiAKLSAgICBhdWRpb19zb3VyY2UgbUF1ZGlvU291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IG1BdWRpb1NvdXJjZTsKICAgICB2aWRlb19zb3VyY2UgbVZpZGVvU291cmNlOwogICAgIG91dHB1dF9mb3JtYXQgbU91dHB1dEZvcm1hdDsKICAgICBhdWRpb19lbmNvZGVyIG1BdWRpb0VuY29kZXI7CiAgICAgdmlkZW9fZW5jb2RlciBtVmlkZW9FbmNvZGVyOwogICAgIGJvb2wgbVVzZTY0Qml0RmlsZU9mZnNldDsKICAgICBpbnQzMl90IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7Ci0gICAgaW50MzJfdCBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0OwogICAgIGludDMyX3QgbUZyYW1lUmF0ZTsKLSAgICBpbnQzMl90IG1WaWRlb0JpdFJhdGUsIG1BdXhWaWRlb0JpdFJhdGU7CisgICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOwogICAgIGludDMyX3QgbUF1ZGlvQml0UmF0ZTsKICAgICBpbnQzMl90IG1BdWRpb0NoYW5uZWxzOwogICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CkBAIC05NCwyMyArMTAwLDI4IEBACiAgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsgIC8vIENsb2Nrd2lzZQorICAgIGludDMyX3QgbUxhdGl0dWRleDEwMDAwOworICAgIGludDMyX3QgbUxvbmdpdHVkZXgxMDAwMDsKKyAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKIAogICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CiAgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKLSAgICBib29sIG1DYXB0dXJlQXV4VmlkZW87Ci0gICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gbUNhbWVyYVNvdXJjZVNwbGl0dGVyOwogICAgIHNwPENhbWVyYVNvdXJjZVRpbWVMYXBzZT4gbUNhbWVyYVNvdXJjZVRpbWVMYXBzZTsKIAorCiAgICAgU3RyaW5nOCBtUGFyYW1zOwotICAgIGludCBtT3V0cHV0RmQsIG1PdXRwdXRGZEF1eDsKIAogICAgIGJvb2wgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVyczsKICAgICBNZWRpYVByb2ZpbGVzICptRW5jb2RlclByb2ZpbGVzOwogCiAgICAgYm9vbCBtU3RhcnRlZDsKKyAgICAvLyBOZWVkZWQgd2hlbiBHTEZyYW1lcyBhcmUgZW5jb2RlZC4KKyAgICAvLyBBbiA8SVN1cmZhY2VUZXh0dXJlPiBwb2ludGVyCisgICAgLy8gd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgc2lkZSB1c2luZyB3aGljaCB0aGUKKyAgICAvLyBmcmFtZSBidWZmZXJzIHdpbGwgYmUgcXVldWVkIGFuZCBkZXF1ZXVlZAorICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gbVN1cmZhY2VNZWRpYVNvdXJjZTsKIAogICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgIGJvb2wgdXNlU3BsaXRDYW1lcmFTb3VyY2UsCiAgICAgICAgIGludCBvdXRwdXRGZCwKICAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAogICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKQEAgLTEyMSwxMiArMTMyLDIwIEBACiAgICAgc3RhdHVzX3Qgc3RhcnRNUEVHNFJlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0QU1SUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBQUNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRSVFBSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKICAgICBzdGF0dXNfdCBjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygpOwogICAgIHN0YXR1c190IGNoZWNrQXVkaW9FbmNvZGVyQ2FwYWJpbGl0aWVzKCk7CisgICAgLy8gR2VuZXJpYyBNZWRpYVNvdXJjZSBzZXQtdXAuIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlCisgICAgLy8gc291cmNlIChDYW1lcmFTb3VyY2Ugb3IgU3VyZmFjZU1lZGlhU291cmNlKQorICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdmlkZW9zb3VyY2UgdHlwZQorICAgIHN0YXR1c190IHNldHVwTWVkaWFTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+ICptZWRpYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2Uoc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKTsKKyAgICAvLyBzZXR1cCB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGZvciB0aGUgZW5jb2RlcgorICAgIHN0YXR1c190IHNldHVwU3VyZmFjZU1lZGlhU291cmNlKCk7CisKICAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7CiAgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLApAQCAtMTQxLDkgKzE2MCw2IEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpOwotICAgIHN0YXR1c190IHNldFBhcmFtQXV4VmlkZW9IZWlnaHQoaW50MzJfdCBoZWlnaHQpOwotICAgIHN0YXR1c190IHNldFBhcmFtQXV4VmlkZW9XaWR0aChpbnQzMl90IHdpZHRoKTsKLSAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKQEAgLTE1Nyw2ICsxNzMsOCBAQAogICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZUR1cmF0aW9uVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhpbnQ2NF90IGJ5dGVzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbU1vdmllVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUdlb0RhdGFMb25naXR1ZGUoaW50MzJfdCBsb25naXR1ZGV4MTAwMDApOworICAgIHN0YXR1c190IHNldFBhcmFtR2VvRGF0YUxhdGl0dWRlKGludDMyX3QgbGF0aXR1ZGV4MTAwMDApOwogICAgIHZvaWQgY2xpcFZpZGVvQml0UmF0ZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CiAgICAgdm9pZCBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CkBAIC0xNjQsNiArMTgyLDggQEAKICAgICB2b2lkIGNsaXBBdWRpb0JpdFJhdGUoKTsKICAgICB2b2lkIGNsaXBBdWRpb1NhbXBsZVJhdGUoKTsKICAgICB2b2lkIGNsaXBOdW1iZXJPZkF1ZGlvQ2hhbm5lbHMoKTsKKyAgICB2b2lkIHNldERlZmF1bHRQcm9maWxlSWZOZWNlc3NhcnkoKTsKKwogCiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBTdGFnZWZyaWdodFJlY29yZGVyICYpOwogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIgJm9wZXJhdG9yPShjb25zdCBTdGFnZWZyaWdodFJlY29yZGVyICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCBkOWMzZGIzLi44MDJhMTFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtOTksNiArOTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBhbmRyb2lkOjpQYXJjZWwmIGluLCBhbmRyb2lkOjpQYXJjZWwgKm91dCkgewogICAgICAgICByZXR1cm4gbVBsYXllci0+aW52b2tlKGluLCBvdXQpOwogICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CisgICAgfQogCiAKICAgICAvLyBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgYnVpbGQgaXMgJ2VuZycgb3IgJ3Rlc3QnIGFuZCB0aGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggYzIwZTI3OS4uZTc2MTUwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTgsNyArOCw2IEBACiAgICAgICAgIE51UGxheWVyRHJpdmVyLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllclJlbmRlcmVyLmNwcCAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAgICAgICBcCi0gICAgICAgIERlY29kZXJXcmFwcGVyLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvRGVjb2RlcldyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyZDFmYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvRGVjb2RlcldyYXBwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkRlY29kZXJXcmFwcGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGVjb2RlcldyYXBwZXIuaCIKLQotI2luY2x1ZGUgIkFBQ0RlY29kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgV3JhcHBlclNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi0gICAgdm9pZCBxdWV1ZUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKLSAgICB2b2lkIHF1ZXVlRU9TKHN0YXR1c190IGZpbmFsUmVzdWx0KTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5XcmFwcGVyU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVF1ZXVlOwotICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdyYXBwZXJTb3VyY2UpOwotfTsKLQotRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OldyYXBwZXJTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTWV0YShtZXRhKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1GaW5hbFJlc3VsdChPSykgewotfQotCi1EZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6fldyYXBwZXJTb3VyY2UoKSB7Ci19Ci0KLXN0YXR1c190IERlY29kZXJXcmFwcGVyOjpXcmFwcGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6c3RvcCgpIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtTWV0YTsKLX0KLQotc3RhdHVzX3QgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBib29sIHJlcXVlc3RlZEJ1ZmZlciA9IGZhbHNlOwotCi0gICAgd2hpbGUgKG1RdWV1ZS5lbXB0eSgpICYmIG1GaW5hbFJlc3VsdCA9PSBPSykgewotICAgICAgICBpZiAoIXJlcXVlc3RlZEJ1ZmZlcikgewotICAgICAgICAgICAgbU5vdGlmeS0+ZHVwKCktPnBvc3QoKTsKLSAgICAgICAgICAgIHJlcXVlc3RlZEJ1ZmZlciA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtUXVldWUuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gbUZpbmFsUmVzdWx0OwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IHNyYyA9ICptUXVldWUuYmVnaW4oKTsKLSAgICBtUXVldWUuZXJhc2UobVF1ZXVlLmJlZ2luKCkpOwotCi0gICAgTWVkaWFCdWZmZXIgKmRzdCA9IG5ldyBNZWRpYUJ1ZmZlcihzcmMtPnNpemUoKSk7Ci0gICAgbWVtY3B5KGRzdC0+ZGF0YSgpLCBzcmMtPmRhdGEoKSwgc3JjLT5zaXplKCkpOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soc3JjLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgZHN0LT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAqb3V0ID0gZHN0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyU291cmNlOjpxdWV1ZUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtUXVldWUucHVzaF9iYWNrKGJ1ZmZlcik7Ci0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6cXVldWVFT1Moc3RhdHVzX3QgZmluYWxSZXN1bHQpIHsKLSAgICBDSEVDS19ORShmaW5hbFJlc3VsdCwgKHN0YXR1c190KU9LKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUZpbmFsUmVzdWx0ID0gZmluYWxSZXN1bHQ7Ci0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6V3JhcHBlclNvdXJjZTo6Y2xlYXIoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtUXVldWUuY2xlYXIoKTsKLSAgICBtRmluYWxSZXN1bHQgPSBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RydWN0IERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBXcmFwcGVyUmVhZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZkZWNvZGVyLAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgdm9pZCBzdGFydCgpOwotICAgIHZvaWQgc3RvcCgpOwotICAgIHZvaWQgcmVhZE1vcmUoYm9vbCBmbHVzaCA9IGZhbHNlKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfldyYXBwZXJSZWFkZXIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UmVhZAotICAgIH07Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbURlY29kZXI7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgYm9vbCBtRU9TOwotICAgIGJvb2wgbVNlbnRGb3JtYXQ7Ci0KLSAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdyYXBwZXJSZWFkZXIpOwotfTsKLQotRGVjb2RlcldyYXBwZXI6OldyYXBwZXJSZWFkZXI6OldyYXBwZXJSZWFkZXIoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmZGVjb2RlciwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtRGVjb2RlcihkZWNvZGVyKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1FT1MoZmFsc2UpLAotICAgICAgbVNlbnRGb3JtYXQoZmFsc2UpIHsKLX0KLQotRGVjb2RlcldyYXBwZXI6OldyYXBwZXJSZWFkZXI6On5XcmFwcGVyUmVhZGVyKCkgewotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpzdGFydCgpIHsKLSAgICBDSEVDS19FUShtRGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKLSAgICByZWFkTW9yZSgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpXcmFwcGVyUmVhZGVyOjpzdG9wKCkgewotICAgIENIRUNLX0VRKG1EZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJSZWFkZXI6OnJlYWRNb3JlKGJvb2wgZmx1c2gpIHsKLSAgICBpZiAoIWZsdXNoICYmIG1FT1MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJmbHVzaCIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGZsdXNoKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJSZWFkZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdFJlYWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZmx1c2g7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmx1c2giLCAmZmx1c2gpKTsKLQotICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgICBpZiAoZmx1c2gpIHsKLSAgICAgICAgICAgICAgICAvLyBEdW1teSBzZWVrCi0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oMCk7Ci0gICAgICAgICAgICAgICAgbUVPUyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyghbUVPUyk7Ci0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpzcmM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRGVjb2Rlci0+cmVhZCgmc3JjLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1TZW50Rm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRGb3JtYXRDaGFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlbnRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZWFsTm90aWZ5OwotICAgICAgICAgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZE1lc3NhZ2UoInJlYWwtbm90aWZ5IiwgJnJlYWxOb3RpZnkpKTsKLQotICAgICAgICAgICAgICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBkc3QgPSBuZXcgQUJ1ZmZlcihzcmMtPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLT5kYXRhKCkgKyBzcmMtPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICBzcmMtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgIENIRUNLKHNyYy0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgICAgICAgICAgICAgIHNyYy0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHNyYyA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICBkc3QtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICByZWFsTm90aWZ5LT5zZXRPYmplY3QoImJ1ZmZlciIsIGRzdCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBzZW5kRm9ybWF0Q2hhbmdlKCk7Ci0KLSAgICAgICAgICAgICAgICByZWFkTW9yZShmYWxzZSAvKiBmbHVzaCAqLyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZWFsTm90aWZ5OwotICAgICAgICAgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZE1lc3NhZ2UoInJlYWwtbm90aWZ5IiwgJnJlYWxOb3RpZnkpKTsKLQotICAgICAgICAgICAgICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVPUyk7Ci0gICAgICAgICAgICAgICAgbUVPUyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OldyYXBwZXJSZWFkZXI6OnNlbmRGb3JtYXRDaGFuZ2UoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlYWxOb3RpZnk7Ci0gICAgQ0hFQ0sobm90aWZ5LT5maW5kTWVzc2FnZSgicmVhbC1ub3RpZnkiLCAmcmVhbE5vdGlmeSkpOwotCi0gICAgcmVhbE5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1EZWNvZGVyLT5nZXRGb3JtYXQoKTsKLQotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgcmVhbE5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7Ci0KLSAgICBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewotICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICAgICAgcmVhbE5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBudW1DaGFubmVscyk7Ci0gICAgICAgIHJlYWxOb3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpOwotCi0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgcmVhbE5vdGlmeS0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOwotICAgICAgICByZWFsTm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKLQotICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0gICAgICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKSB7Ci0gICAgICAgICAgICBjcm9wTGVmdCA9IDA7Ci0gICAgICAgICAgICBjcm9wVG9wID0gMDsKLSAgICAgICAgICAgIGNyb3BSaWdodCA9IHdpZHRoIC0gMTsKLSAgICAgICAgICAgIGNyb3BCb3R0b20gPSBoZWlnaHQgLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhbE5vdGlmeS0+c2V0UmVjdCgiY3JvcCIsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgbVNlbnRGb3JtYXQgPSB0cnVlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1EZWNvZGVyV3JhcHBlcjo6RGVjb2RlcldyYXBwZXIoKQotICAgIDogbU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzKDApLAotICAgICAgbU51bU91dHN0YW5kaW5nT3V0cHV0QnVmZmVycygwKSwKLSAgICAgIG1OdW1QZW5kaW5nRGVjb2RlcygwKSwKLSAgICAgIG1GbHVzaGluZyhmYWxzZSkgewotfQotCi1EZWNvZGVyV3JhcHBlcjo6fkRlY29kZXJXcmFwcGVyKCkgewotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgbU5vdGlmeSA9IG1zZzsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6aW5pdGlhdGVTZXR1cChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIG1zZy0+c2V0V2hhdChrV2hhdFNldHVwKTsKLSAgICBtc2ctPnNldFRhcmdldChpZCgpKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6aW5pdGlhdGVTaHV0ZG93bigpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpzaWduYWxGbHVzaCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpKS0+cG9zdCgpOwotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpzaWduYWxSZXN1bWUoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0U2V0dXA6Ci0gICAgICAgICAgICBvblNldHVwKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246Ci0gICAgICAgICAgICBvblNodXRkb3duKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtXaGF0SW5wdXREYXRhUmVxdWVzdGVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBwb3N0RmlsbEJ1ZmZlcigpOwotICAgICAgICAgICAgKyttTnVtT3V0c3RhbmRpbmdJbnB1dEJ1ZmZlcnM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfR1QobU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzLCAwKTsKLSAgICAgICAgICAgIC0tbU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzOwotCi0gICAgICAgICAgICBpZiAobUZsdXNoaW5nKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVFT1MoSU5GT19ESVNDT05USU5VSVRZKTsKLQotICAgICAgICAgICAgICAgIGNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSkgewotICAgICAgICAgICAgICAgIGludDMyX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlRU9TKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PEFCdWZmZXIgKj4ob2JqLmdldCgpKTsKLQotICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVCdWZmZXIoYnVmZmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEZpbGxCdWZmZXJEb25lOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVhbC1ub3RpZnkiLCAmbm90aWZ5KSk7Ci0KLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewotICAgICAgICAgICAgICAgIENIRUNLX0dUKG1OdW1QZW5kaW5nRGVjb2RlcywgMCk7Ci0gICAgICAgICAgICAgICAgLS1tTnVtUGVuZGluZ0RlY29kZXM7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBpZCgpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7Ci0KLSAgICAgICAgICAgICAgICArK21OdW1PdXRzdGFuZGluZ091dHB1dEJ1ZmZlcnM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUykgewotICAgICAgICAgICAgICAgIENIRUNLX0dUKG1OdW1QZW5kaW5nRGVjb2RlcywgMCk7Ci0gICAgICAgICAgICAgICAgLS1tTnVtUGVuZGluZ0RlY29kZXM7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUZsdXNoaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19HVChtTnVtT3V0c3RhbmRpbmdPdXRwdXRCdWZmZXJzLCAwKTsKLSAgICAgICAgICAgIC0tbU51bU91dHN0YW5kaW5nT3V0cHV0QnVmZmVyczsKLQotICAgICAgICAgICAgaWYgKG1GbHVzaGluZykgewotICAgICAgICAgICAgICAgIGNvbXBsZXRlRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICsrbU51bVBlbmRpbmdEZWNvZGVzOwotICAgICAgICAgICAgbVJlYWRlci0+cmVhZE1vcmUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgotICAgICAgICB7Ci0gICAgICAgICAgICBvbkZsdXNoKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZXN1bWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uUmVzdW1lKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIERlY29kZXJXcmFwcGVyOjpvblNldHVwKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgQVN0cmluZyBtaW1lOwotICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0KLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpOwotCi0gICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJlc2RzIiwgJm9iaikpOwotICAgIHNwPEFCdWZmZXI+IGVzZHMgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZS5jX3N0cigpKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMtPmRhdGEoKSwgZXNkcy0+c2l6ZSgpKTsKLQotICAgIG1Tb3VyY2UgPSBuZXcgV3JhcHBlclNvdXJjZSgKLSAgICAgICAgICAgIG1ldGEsIG5ldyBBTWVzc2FnZShrV2hhdElucHV0RGF0YVJlcXVlc3RlZCwgaWQoKSkpOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBuZXcgQUFDRGVjb2RlcihtU291cmNlKTsKLQotICAgIG1SZWFkZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtUmVhZGVyTG9vcGVyLT5zZXROYW1lKCJEZWNvZGVyV3JhcHBlciBsb29wZXIiKTsKLQotICAgIG1SZWFkZXJMb29wZXItPnN0YXJ0KAotICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwotICAgICAgICAgICAgZmFsc2UsIC8qIGNhbkNhbGxKYXZhICovCi0gICAgICAgICAgICBQUklPUklUWV9BVURJTyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RmlsbEJ1ZmZlckRvbmUsIGlkKCkpOwotICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVhbC1ub3RpZnkiLCBtTm90aWZ5KTsKLQotICAgIG1SZWFkZXIgPSBuZXcgV3JhcHBlclJlYWRlcihkZWNvZGVyLCBub3RpZnkpOwotICAgIG1SZWFkZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVhZGVyKTsKLQotICAgIG1SZWFkZXItPnN0YXJ0KCk7Ci0gICAgKyttTnVtUGVuZGluZ0RlY29kZXM7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6Om9uU2h1dGRvd24oKSB7Ci0gICAgbVJlYWRlckxvb3Blci0+c3RvcCgpOwotICAgIG1SZWFkZXJMb29wZXIuY2xlYXIoKTsKLQotICAgIG1SZWFkZXItPnN0b3AoKTsKLSAgICBtUmVhZGVyLmNsZWFyKCk7Ci0KLSAgICBtU291cmNlLmNsZWFyKCk7Ci0KLSAgICBtTnVtT3V0c3RhbmRpbmdJbnB1dEJ1ZmZlcnMgPSAwOwotICAgIG1OdW1PdXRzdGFuZGluZ091dHB1dEJ1ZmZlcnMgPSAwOwotICAgIG1OdW1QZW5kaW5nRGVjb2RlcyA9IDA7Ci0gICAgbUZsdXNoaW5nID0gZmFsc2U7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6OnBvc3RGaWxsQnVmZmVyKCkgewotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwgaWQoKSk7Ci0gICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6b25GbHVzaCgpIHsKLSAgICBDSEVDSyghbUZsdXNoaW5nKTsKLSAgICBtRmx1c2hpbmcgPSB0cnVlOwotCi0gICAgY29tcGxldGVGbHVzaElmUG9zc2libGUoKTsKLX0KLQotdm9pZCBEZWNvZGVyV3JhcHBlcjo6Y29tcGxldGVGbHVzaElmUG9zc2libGUoKSB7Ci0gICAgQ0hFQ0sobUZsdXNoaW5nKTsKLQotICAgIGlmIChtTnVtT3V0c3RhbmRpbmdJbnB1dEJ1ZmZlcnMgPiAwCi0gICAgICAgICAgICB8fCBtTnVtT3V0c3RhbmRpbmdPdXRwdXRCdWZmZXJzID4gMAotICAgICAgICAgICAgfHwgbU51bVBlbmRpbmdEZWNvZGVzID4gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUZsdXNoaW5nID0gZmFsc2U7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgRGVjb2RlcldyYXBwZXI6Om9uUmVzdW1lKCkgewotICAgIENIRUNLKCFtRmx1c2hpbmcpOwotCi0gICAgKyttTnVtUGVuZGluZ0RlY29kZXM7Ci0KLSAgICBtU291cmNlLT5jbGVhcigpOwotICAgIG1SZWFkZXItPnJlYWRNb3JlKHRydWUgLyogZmx1c2ggKi8pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0RlY29kZXJXcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvRGVjb2RlcldyYXBwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliZTEyYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvRGVjb2RlcldyYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERFQ09ERVJfV1JBUFBFUl9IXwotCi0jZGVmaW5lIERFQ09ERVJfV1JBUFBFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLQotc3RydWN0IERlY29kZXJXcmFwcGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBEZWNvZGVyV3JhcHBlcigpOwotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOwotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGVjb2RlcldyYXBwZXIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFdyYXBwZXJTb3VyY2U7Ci0gICAgc3RydWN0IFdyYXBwZXJSZWFkZXI7Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTZXR1cCwKLSAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwKLSAgICAgICAga1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLAotICAgICAgICBrV2hhdFNodXRkb3duLAotICAgICAgICBrV2hhdEZpbGxCdWZmZXJEb25lLAotICAgICAgICBrV2hhdElucHV0RGF0YVJlcXVlc3RlZCwKLSAgICAgICAga1doYXRGbHVzaCwKLSAgICAgICAga1doYXRSZXN1bWUsCi0gICAgfTsKLQotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotCi0gICAgc3A8V3JhcHBlclNvdXJjZT4gbVNvdXJjZTsKLQotICAgIHNwPEFMb29wZXI+IG1SZWFkZXJMb29wZXI7Ci0gICAgc3A8V3JhcHBlclJlYWRlcj4gbVJlYWRlcjsKLQotICAgIGludDMyX3QgbU51bU91dHN0YW5kaW5nSW5wdXRCdWZmZXJzOwotICAgIGludDMyX3QgbU51bU91dHN0YW5kaW5nT3V0cHV0QnVmZmVyczsKLSAgICBpbnQzMl90IG1OdW1QZW5kaW5nRGVjb2RlczsKLSAgICBib29sIG1GbHVzaGluZzsKLQotICAgIHZvaWQgb25TZXR1cChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvblNodXRkb3duKCk7Ci0gICAgdm9pZCBvbkZsdXNoKCk7Ci0gICAgdm9pZCBvblJlc3VtZSgpOwotCi0gICAgdm9pZCBwb3N0RmlsbEJ1ZmZlcigpOwotICAgIHZvaWQgY29tcGxldGVGbHVzaElmUG9zc2libGUoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJXcmFwcGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gREVDT0RFUl9XUkFQUEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IGQwN2VhMWIuLjAyNTFiYWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMzMsMTYgKzMzLDM1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpIVFRQTGl2ZVNvdXJjZShjb25zdCBjaGFyICp1cmwsIHVpbnQzMl90IGZsYWdzKQorTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpIVFRQTGl2ZVNvdXJjZSgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQogICAgIDogbVVSTCh1cmwpLAotICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCisgICAgICBtVUlEKHVpZCksCisgICAgICBtRmxhZ3MoMCksCiAgICAgICBtRU9TKGZhbHNlKSwKICAgICAgIG1PZmZzZXQoMCkgeworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKKworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSW5jb2duaXRvOworCisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQogfQogCiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6On5IVFRQTGl2ZVNvdXJjZSgpIHsKLSAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKLSAgICBtTGl2ZUxvb3Blci0+c3RvcCgpOworICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgeworICAgICAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzdGFydCgpIHsKQEAgLTUxLDE4ICs3MCwyMCBAQAogICAgIG1MaXZlTG9vcGVyLT5zdGFydCgpOwogCiAgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAotICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDApOworICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDAsCisgICAgICAgICAgICBtVUlEVmFsaWQsIG1VSUQpOwogCiAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24pOwogCi0gICAgbUxpdmVTZXNzaW9uLT5jb25uZWN0KG1VUkwuY19zdHIoKSk7CisgICAgbUxpdmVTZXNzaW9uLT5jb25uZWN0KAorICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7CiAKICAgICBtVFNQYXJzZXIgPSBuZXcgQVRTUGFyc2VyOwogfQogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewogICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlID0KLSAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6Ok1QRUcyQURUU19BVURJTyA6IEFUU1BhcnNlcjo6QVZDX1ZJREVPOworICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6QVVESU8gOiBBVFNQYXJzZXI6OlZJREVPOwogCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPihtVFNQYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKSk7CkBAIC0xMTYsNyArMTM3LDcgQEAKIHN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCiAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7CiAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGUgPQotICAgICAgICBhdWRpbyA/IEFUU1BhcnNlcjo6TVBFRzJBRFRTX0FVRElPIDogQVRTUGFyc2VyOjpBVkNfVklERU87CisgICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpBVURJTyA6IEFUU1BhcnNlcjo6VklERU87CiAKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPQogICAgICAgICBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KG1UU1BhcnNlci0+Z2V0U291cmNlKHR5cGUpLmdldCgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKaW5kZXggYThjZTdmNC4uMzZjNjdjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKQEAgLTI3LDExICsyNywxMSBAQAogc3RydWN0IExpdmVTZXNzaW9uOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewotICAgIGVudW0gRmxhZ3MgewotICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCi0gICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKLSAgICB9OwotICAgIEhUVFBMaXZlU291cmNlKGNvbnN0IGNoYXIgKnVybCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICBIVFRQTGl2ZVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLAorICAgICAgICAgICAgdWlkX3QgdWlkID0gMCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKIApAQCAtNDksNyArNDksMTUgQEAKICAgICB2aXJ0dWFsIH5IVFRQTGl2ZVNvdXJjZSgpOwogCiBwcml2YXRlOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCisgICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKKyAgICB9OworCiAgICAgQVN0cmluZyBtVVJMOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgYm9vbCBtRU9TOwogICAgIG9mZjY0X3QgbU9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IGQ0MzlmNmUuLmIwNmYyMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtNDQsNyArNDQsOCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTnVQbGF5ZXI6Ok51UGxheWVyKCkKLSAgICA6IG1BdWRpb0VPUyhmYWxzZSksCisgICAgOiBtVUlEVmFsaWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKICAgICAgIG1WaWRlb0VPUyhmYWxzZSksCiAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc0dlbmVyYXRpb24oMCksCkBAIC01Nyw2ICs1OCwxMSBAQAogTnVQbGF5ZXI6On5OdVBsYXllcigpIHsKIH0KIAordm9pZCBOdVBsYXllcjo6c2V0VUlEKHVpZF90IHVpZCkgeworICAgIG1VSURWYWxpZCA9IHRydWU7CisgICAgbVVJRCA9IHVpZDsKK30KKwogdm9pZCBOdVBsYXllcjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKSB7CiAgICAgbURyaXZlciA9IGRyaXZlcjsKIH0KQEAgLTcyLDE3ICs3OCw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgaWQoKSk7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICBpZiAoaGVhZGVycykgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gaGVhZGVycy0+aW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKLQotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgZmxhZ3MgfD0gSFRUUExpdmVTb3VyY2U6OmtGbGFnSW5jb2duaXRvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBIVFRQTGl2ZVNvdXJjZSh1cmwsIGZsYWdzKSk7CisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBIVFRQTGl2ZVNvdXJjZSh1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCmluZGV4IGZiNWIwMDEuLmNmOTE4NWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCkBAIC0zMyw2ICszMyw4IEBACiBzdHJ1Y3QgTnVQbGF5ZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIE51UGxheWVyKCk7CiAKKyAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOworCiAgICAgdm9pZCBzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXJEcml2ZXI+ICZkcml2ZXIpOwogCiAgICAgdm9pZCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwpAQCAtODQsNiArODYsOCBAQAogICAgIH07CiAKICAgICB3cDxOdVBsYXllckRyaXZlcj4gbURyaXZlcjsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOwogICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCA1MTdhY2M5Li44MWI0MWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCiAKLSNpbmNsdWRlICJEZWNvZGVyV3JhcHBlci5oIgogI2luY2x1ZGUgIkVTRFMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtNDcsNyArNDYsNiBAQAogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpjb25maWd1cmUoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKSB7CiAgICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwotICAgIENIRUNLKG1XcmFwcGVyID09IE5VTEwpOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CkBAIC02MSwxOSArNTksMTEgQEAKICAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBtTmF0aXZlV2luZG93KTsKICAgICB9CiAKLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBtV3JhcHBlciA9IG5ldyBEZWNvZGVyV3JhcHBlcjsKLSAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtV3JhcHBlcik7CisgICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKKyAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7CiAKLSAgICAgICAgbVdyYXBwZXItPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5TXNnKTsKLSAgICAgICAgbVdyYXBwZXItPmluaXRpYXRlU2V0dXAoZm9ybWF0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ29kZWMgPSBuZXcgQUNvZGVjOwotICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7Ci0KLSAgICAgICAgbUNvZGVjLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeU1zZyk7Ci0gICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOwotICAgIH0KKyAgICBtQ29kZWMtPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5TXNnKTsKKyAgICBtQ29kZWMtPmluaXRpYXRlU2V0dXAoZm9ybWF0KTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTIxNCw3ICsyMDQsNiBAQAogCiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJjc2QiLCBidWZmZXIpOwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0jaWYgMAogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKIApAQCAtMjMwLDEyICsyMTksNiBAQAogCiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIG1DU0QucHVzaChidWZmZXIpOwotI2Vsc2UKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgbXNnLT5zZXRPYmplY3QoImVzZHMiLCBidWZmZXIpOwotI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIG1zZzsKQEAgLTI3MCwyNyArMjUzLDE4IEBACiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxGbHVzaCgpIHsKICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKICAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1XcmFwcGVyICE9IE5VTEwpOwotICAgICAgICBtV3JhcHBlci0+c2lnbmFsRmx1c2goKTsKICAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbFJlc3VtZSgpIHsKICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtV3JhcHBlciAhPSBOVUxMKTsKLSAgICAgICAgbVdyYXBwZXItPnNpZ25hbFJlc3VtZSgpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aW5pdGlhdGVTaHV0ZG93bigpIHsKICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZVNodXRkb3duKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobVdyYXBwZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1XcmFwcGVyLT5pbml0aWF0ZVNodXRkb3duKCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKaW5kZXggNzMyZjA5MC4uZmFiYzYwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApAQCAtMjUsNyArMjUsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBEZWNvZGVyV3JhcHBlcjsKIAogc3RydWN0IE51UGxheWVyOjpEZWNvZGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LApAQCAtNTEsNyArNTAsNiBAQAogICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CiAKICAgICBzcDxBQ29kZWM+IG1Db2RlYzsKLSAgICBzcDxEZWNvZGVyV3JhcHBlcj4gbVdyYXBwZXI7CiAKICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEOwogICAgIHNpemVfdCBtQ1NESW5kZXg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCAwZWNhOTU4Li5jNmZjYTJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTU1LDYgKzU1LDEyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VUlEKHVpZF90IHVpZCkgeworICAgIG1QbGF5ZXItPnNldFVJRCh1aWQpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZSgKICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KVVOSU5JVElBTElaRUQpOwpAQCAtMTEyLDkgKzExOCwxNSBAQAogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKIAogICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMobVN0YXJ0dXBTZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXBTZWVrVGltZVVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMobVN0YXJ0dXBTZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtU3RhcnR1cFNlZWtUaW1lVXMgPSAtMTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBQTEFZSU5HOgpAQCAtMjQ2LDYgKzI1OCwxNCBAQAogICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0TWV0YWRhdGEoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggNjdkMGYzZS4uMWJiN2NhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTI4LDYgKzI4LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTUyLDYgKzU0LDggQEAKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggMzY5YTNhOC4uODI4ZTAwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMTk4LDE4ICsxOTgsMjEgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uRHJhaW5BdWRpb1F1ZXVlKCkgewotICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKLSAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwgKHN0YXR1c190KU9LKTsKIAotICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9Ci0gICAgICAgIG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSAtIChtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCk7CisgICAgZm9yICg7OykgeworICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgQ0hFQ0tfR0UobnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSwgMCk7CisgICAgICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSAobU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQpOwogCi0gICAgc2l6ZV90IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA9Ci0gICAgICAgIG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgKiBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKKyAgICAgICAgc2l6ZV90IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA9CisgICAgICAgICAgICBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlICogbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAKLSAgICB3aGlsZSAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID4gMCkgeworICAgICAgICBpZiAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjQsMTAgKzI2NywxMCBAQAogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSBjb3B5OwogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3B5IC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IDIwMTYyODIuLmE2YTNhMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC02Myw4ICs2MywxNyBAQAogICAgICAgICAgICAgbUVPUyA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChuID09IElORk9fRElTQ09OVElOVUlUWSkgewotICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgZXh0cmEpOworICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUs7CisKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0Q2hhbmdlOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleUZvcm1hdENoYW5nZSwgJmZvcm1hdENoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0Q2hhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhKTsKICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewogICAgICAgICAgICAgQ0hFQ0tfRVEobiwgLUVXT1VMREJMT0NLKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODcsNyArOTYsNyBAQAogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9Ci0gICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpNUEVHMkFEVFNfQVVESU8gOiBBVFNQYXJzZXI6OkFWQ19WSURFTzsKKyAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6OkFVRElPIDogQVRTUGFyc2VyOjpWSURFTzsKIAogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4obVRTUGFyc2VyLT5nZXRTb3VyY2UodHlwZSkuZ2V0KCkpOwpAQCAtMTAyLDcgKzExMSw3IEBACiBzdGF0dXNfdCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpkZXF1ZXVlQWNjZXNzVW5pdCgKICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9Ci0gICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpNUEVHMkFEVFNfQVVESU8gOiBBVFNQYXJzZXI6OkFWQ19WSURFTzsKKyAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6OkFVRElPIDogQVRTUGFyc2VyOjpWSURFTzsKIAogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4obVRTUGFyc2VyLT5nZXRTb3VyY2UodHlwZSkuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggNDIwM2I2ZS4uYTVhNmI2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCkBAIC05Miw3ICs5Miw3IEBACiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CiAKICAgICB1aW50OF90IHN5bmN3b3JkWzJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCAmc3luY3dvcmQsIDIpICE9IDIpIHsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmc3luY3dvcmQsIDIpICE9IDIpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmICgoc3luY3dvcmRbMF0gIT0gMHhmZikgfHwgKChzeW5jd29yZFsxXSAmIDB4ZjYpICE9IDB4ZjApKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTMzZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUFDV3JpdGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FBQ1dyaXRlcjo6QUFDV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUZkKC0xKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZXN1bWVkKGZhbHNlKSwKKyAgICAgIG1DaGFubmVsQ291bnQoLTEpLAorICAgICAgbVNhbXBsZVJhdGUoLTEpIHsKKworICAgIExPR1YoIkFBQ1dyaXRlciBDb25zdHJ1Y3RvciIpOworCisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUik7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9Cit9CisKK0FBQ1dyaXRlcjo6QUFDV3JpdGVyKGludCBmZCkKKyAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMD8gTk9fSU5JVDogT0spLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVzdW1lZChmYWxzZSksCisgICAgICBtQ2hhbm5lbENvdW50KC0xKSwKKyAgICAgIG1TYW1wbGVSYXRlKC0xKSB7Cit9CisKK0FBQ1dyaXRlcjo6fkFBQ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGlmIChtRmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBBQUNXcml0ZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RhdGljIGludCB3cml0ZUludDgoaW50IGZkLCB1aW50OF90IHgpIHsKKyAgICByZXR1cm4gOjp3cml0ZShmZCwgJngsIDEpOworfQorCisKK3N0YXR1c190IEFBQ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBMT0dFKCJBQUMgZmlsZXMgb25seSBzdXBwb3J0IGEgc2luZ2xlIHRyYWNrIG9mIGF1ZGlvLiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbUNoYW5uZWxDb3VudCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0sobUNoYW5uZWxDb3VudCA+PSAxICYmIG1DaGFubmVsQ291bnQgPD0gMik7CisKKyAgICBtU291cmNlID0gc291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUFDV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBzdGFydGVkLCBkb2VzIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoa1NhbXBsZXNQZXJGcmFtZSAqIDEwMDAwMDBMTCArIChtU2FtcGxlUmF0ZSA+PiAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOworCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFBQ1dyaXRlcjo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkICpkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKKyAgICAgICAgICAgIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQUFDV3JpdGVyOjpleGNlZWRzRmlsZVNpemVMaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPj0gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBBQUNXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+PSBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKK30KKworLy8gc3RhdGljCit2b2lkICpBQUNXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICByZXR1cm4gKHZvaWQgKikgc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOworfQorCisvKgorKiBSZXR1cm5zIGFuIGluZGV4IGludG8gdGhlIHNhbXBsZSByYXRlIHRhYmxlIGlmIHRoZQorKiBnaXZlbiBzYW1wbGUgcmF0ZSBpcyBmb3VuZDsgb3RoZXJ3aXNlLCByZXR1cm5zIC0xLgorKi8KK3N0YXRpYyBib29sIGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludCBzYW1wbGVSYXRlLCB1aW50OF90KiB0YWJsZUluZGV4KSB7CisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgY29uc3QgaW50IHRhYmxlU2l6ZSA9CisgICAgICAgIHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlKSAvIHNpemVvZihrU2FtcGxlUmF0ZVRhYmxlWzBdKTsKKworICAgICp0YWJsZUluZGV4ID0gMDsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdGFibGVTaXplOyArK2luZGV4KSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID09IGtTYW1wbGVSYXRlVGFibGVbaW5kZXhdKSB7CisgICAgICAgICAgICBMT0dWKCJTYW1wbGUgcmF0ZTogJWQgYW5kIGluZGV4OiAlZCIsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgaW5kZXgpOworICAgICAgICAgICAgKnRhYmxlSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiU2FtcGxpbmcgcmF0ZSAlZCBicHMgaXMgbm90IHN1cHBvcnRlZCIsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEFEVFMgKEF1ZGlvIGRhdGEgdHJhbnNwb3J0IHN0cmVhbSkgaGVhZGVyIHN0cnVjdHVyZS4KKyAqIEl0IGNvbnNpc3RzIG9mIDcgb3IgOSBieXRlcyAod2l0aCBvciB3aXRob3V0IENSQyk6CisgKiAxMiBiaXRzIG9mIHN5bmN3b3JkIDB4RkZGLCBhbGwgYml0cyBtdXN0IGJlIDEKKyAqIDEgYml0IG9mIGZpZWxkIElELiAwIGZvciBNUEVHLTQsIGFuZCAxIGZvciBNUEVHLTIKKyAqIDIgYml0cyBvZiBNUEVHIGxheWVyLiBJZiBpbiBNUEVHLVRTLCBzZXQgdG8gMAorICogMSBiaXQgb2YgcHJvdGVjdGlvbiBhYnNlbnNlLiBTZXQgdG8gMSBpZiBubyBDUkMuCisgKiAyIGJpdHMgb2YgcHJvZmlsZSBjb2RlLiBTZXQgdG8gMSAoVGhlIE1QRUctNCBBdWRpbworICogICBvYmplY3QgdHlwZSBtaW51cyAxLiBXZSBhcmUgdXNpbmcgQUFDLUxDID0gMikKKyAqIDQgYml0cyBvZiBzYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggY29kZSAoMTUgaXMgbm90IGFsbG93ZWQpCisgKiAxIGJpdCBvZiBwcml2YXRlIHN0cmVhbS4gU2V0IHRvIDAuCisgKiAzIGJpdHMgb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGNvZGUuIDAgcmVzZXZlcmVkIGZvciBpbmJhbmQgUENNCisgKiAxIGJpdCBvZiBvcmlnaW5hbGl0eS4gU2V0IHRvIDAuCisgKiAxIGJpdCBvZiBob21lLiBTZXQgdG8gMC4KKyAqIDEgYml0IG9mIGNvcHlyaWdodGVkIHN0ZWFtLiBTZXQgdG8gMC4KKyAqIDEgYml0IG9mIGNvcHlyaWdodCBzdGFydC4gU2V0IHRvIDAuCisgKiAxMyBiaXRzIG9mIGZyYW1lIGxlbmd0aC4gSXQgaW5jbHVkZWQgNyBvdCA5IGJ5dGVzIGhlYWRlciBsZW5ndGguCisgKiAgIGl0IGlzIHNldCB0byAocHJvdGVjdGlvbiBhYnNlbnNlPyA3OiA5KSArIHNpemUoQUFDIGZyYW1lKQorICogMTEgYml0cyBvZiBidWZmZXIgZnVsbG5lc3MuIDB4N0ZGIGZvciBWQlIuCisgKiAyIGJpdHMgb2YgZnJhbWVzIGNvdW50IGluIG9uZSBwYWNrZXQuIFNldCB0byAwLgorICovCitzdGF0dXNfdCBBQUNXcml0ZXI6OndyaXRlQWR0c0hlYWRlcih1aW50MzJfdCBmcmFtZUxlbmd0aCkgeworICAgIHVpbnQ4X3QgZGF0YSA9IDB4RkY7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50OF90IGtGaWVsZElkID0gMDsKKyAgICBjb25zdCB1aW50OF90IGtNcGVnTGF5ZXIgPSAwOworICAgIGNvbnN0IHVpbnQ4X3Qga1Byb3RlY3Rpb25BYnNlbnNlID0gMTsgIC8vIDE6IGtBZHRzSGVhZGVyTGVuZ3RoID0gNworICAgIGRhdGEgPSAweEYwOworICAgIGRhdGEgfD0gKGtGaWVsZElkIDw8IDMpOworICAgIGRhdGEgfD0gKGtNcGVnTGF5ZXIgPDwgMSk7CisgICAgZGF0YSB8PSBrUHJvdGVjdGlvbkFic2Vuc2U7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50OF90IGtQcm9maWxlQ29kZSA9IDE7ICAvLyBBQUMtTEMKKyAgICB1aW50OF90IGtTYW1wbGVGcmVxSW5kZXg7CisgICAgQ0hFQ0soZ2V0U2FtcGxlUmF0ZVRhYmxlSW5kZXgobVNhbXBsZVJhdGUsICZrU2FtcGxlRnJlcUluZGV4KSk7CisgICAgY29uc3QgdWludDhfdCBrUHJpdmF0ZVN0cmVhbSA9IDA7CisgICAgY29uc3QgdWludDhfdCBrQ2hhbm5lbENvbmZpZ0NvZGUgPSBtQ2hhbm5lbENvdW50OworICAgIGRhdGEgPSAoa1Byb2ZpbGVDb2RlIDw8IDYpOworICAgIGRhdGEgfD0gKGtTYW1wbGVGcmVxSW5kZXggPDwgMik7CisgICAgZGF0YSB8PSAoa1ByaXZhdGVTdHJlYW0gPDwgMSk7CisgICAgZGF0YSB8PSAoa0NoYW5uZWxDb25maWdDb2RlID4+IDIpOworICAgIHdyaXRlKG1GZCwgJmRhdGEsIDEpOworCisgICAgLy8gNCBiaXRzIGZyb20gb3JpZ2luYWxpdHkgdG8gY29weXJpZ2h0IHN0YXJ0CisgICAgY29uc3QgdWludDhfdCBrQ29weXJpZ2h0ID0gMDsKKyAgICBjb25zdCB1aW50MzJfdCBrRnJhbWVMZW5ndGggPSBmcmFtZUxlbmd0aDsKKyAgICBkYXRhID0gKChrQ2hhbm5lbENvbmZpZ0NvZGUgJiAzKSA8PCA2KTsKKyAgICBkYXRhIHw9IChrQ29weXJpZ2h0IDw8IDIpOworICAgIGRhdGEgfD0gKChrRnJhbWVMZW5ndGggJiAweDE4MDApID4+IDExKTsKKyAgICB3cml0ZShtRmQsICZkYXRhLCAxKTsKKworICAgIGRhdGEgPSAoKGtGcmFtZUxlbmd0aCAmIDB4MDdGOCkgPj4gMyk7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBrQnVmZmVyRnVsbG5lc3MgPSAweDdGRjsgIC8vIFZCUgorICAgIGRhdGEgPSAoKGtGcmFtZUxlbmd0aCAmIDB4MDcpIDw8IDUpOworICAgIGRhdGEgfD0gKChrQnVmZmVyRnVsbG5lc3MgJiAweDA3QzApID4+IDYpOworICAgIHdyaXRlKG1GZCwgJmRhdGEsIDEpOworCisgICAgY29uc3QgdWludDhfdCBrRnJhbWVDb3VudCA9IDA7CisgICAgZGF0YSA9ICgoa0J1ZmZlckZ1bGxuZXNzICYgMHgwM0YpIDw8IDIpOworICAgIGRhdGEgfD0ga0ZyYW1lQ291bnQ7CisgICAgd3JpdGUobUZkLCAmZGF0YSwgMSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFBQ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWF4VGltZXN0YW1wVXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBQUNXcml0ZXJUaHJlYWQiLCAwLCAwLCAwKTsKKworICAgIHdoaWxlICghbURvbmUgJiYgZXJyID09IE9LKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzICs9IGtBZHRzSGVhZGVyTGVuZ3RoICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpc0NvZGVjU3BlY2lmaWMgPSAwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY1NwZWNpZmljKSAmJiBpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgICAgIExPR1YoIkRyb3AgY29kZWMgc3BlY2lmaWMgaW5mbyBidWZmZXIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSBtRnJhbWVEdXJhdGlvblVzKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICBMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICAgICAgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVhY2ggb3V0cHV0IEFBQyBhdWRpbyBmcmFtZSB0byB0aGUgZmlsZSBjb250YWlucworICAgICAgICAvLyAxLiBhbiBBRFRTIGhlYWRlciwgZm9sbG93ZWQgYnkKKyAgICAgICAgLy8gMi4gdGhlIGNvbXByZXNzZWQgYXVkaW8gZGF0YS4KKyAgICAgICAgc3NpemVfdCBkYXRhTGVuZ3RoID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICBpZiAod3JpdGVBZHRzSGVhZGVyKGtBZHRzSGVhZGVyTGVuZ3RoICsgZGF0YUxlbmd0aCkgIT0gT0sgfHwKKyAgICAgICAgICAgIGRhdGFMZW5ndGggIT0gd3JpdGUobUZkLCBkYXRhLCBkYXRhTGVuZ3RoKSkgeworICAgICAgICAgICAgZXJyID0gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEFBQ1dyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gbVJlYWNoZWRFT1M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5OTI4ZjQ0Li4xNzRlYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaD4KQEAgLTQwMSwxMSArNDAyLDIyIEBACiAgICAgICAgIENIRUNLKG1lbS5nZXQoKSAhPSBOVUxMKTsKIAogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVyOwotI2lmIDAKLSAgICAgICAgZXJyID0gbU9NWC0+YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlcik7Ci0jZWxzZQotICAgICAgICBlcnIgPSBtT01YLT51c2VCdWZmZXIobU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyKTsKLSNlbmRpZgorCisgICAgICAgIGlmICghc3RyY2FzZWNtcCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIk9NWC5USS5EVUNBVEkxLlZJREVPLkRFQ09ERVIiKSkgeworICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBsb2cgdGhpcyB3YXJuaW5nIG9uY2UgcGVyIGFsbG9jYXRpb24gcm91bmQuCisKKyAgICAgICAgICAgICAgICBMT0dXKCJPTVguVEkuRFVDQVRJMS5WSURFTy5ERUNPREVSIHJlcXVpcmVzIHRoZSB1c2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICAgIk9NWF9BbGxvY2F0ZUJ1ZmZlciBpbnN0ZWFkIG9mIHRoZSBwcmVmZXJyZWQgIgorICAgICAgICAgICAgICAgICAgICAgIk9NWF9Vc2VCdWZmZXIuIFZlbmRvciBtdXN0IGZpeCB0aGlzLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCisgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtT01YLT51c2VCdWZmZXIobU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MzMsNiArNDQ1LDEzIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKQEAgLTUwNSw3ICs1MjQsNyBAQAogCiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCiAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICpidWY7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKICAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKQEAgLTU3NCw3ICs1OTMsNyBAQAogfQogCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKmJ1ZjsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgQ0hFQ0tfRVEobU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKSwgMCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyBpLS0gPiAwOykgewpAQCAtODg4LDExICs5MDcsMTAgQEAKICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgQ0hFQ0tfRVEoKGludClmb3JtYXQuZUNvbXByZXNzaW9uRm9ybWF0LCAoaW50KU9NWF9WSURFT19Db2RpbmdVbnVzZWQpOwogCi0gICAgc3RhdGljIGNvbnN0IGludCBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMDsKLQogICAgIENIRUNLKGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgogICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyCiAgICAgICAgICAgIHx8IGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdENiWUNyWQorICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyCiAgICAgICAgICAgIHx8IGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcik7CiAKICAgICByZXR1cm4gbU9NWC0+c2V0UGFyYW1ldGVyKApAQCAtOTA5LDYgKzkyNyw4IEBACiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSDI2MzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCBtaW1lKSkgeworICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHMjsKICAgICB9IGVsc2UgewogICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTExNzcsNiArMTE5NywxNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRhdGExIiwgJmRhdGExKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZGF0YTIiLCAmZGF0YTIpKTsKIAorICAgICAgICAgICAgaWYgKGV2ZW50ID09IE9NWF9FdmVudENtZENvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgICYmIGRhdGExID09IE9NWF9Db21tYW5kRmx1c2gKKyAgICAgICAgICAgICAgICAgICAgJiYgZGF0YTIgPT0gKGludDMyX3QpT01YX0FMTCkgeworICAgICAgICAgICAgICAgIC8vIFVzZSBvZiB0aGlzIG5vdGlmaWNhdGlvbiBpcyBub3QgY29uc2lzdGVudCBhY3Jvc3MKKyAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMuIFdlJ2xsIGRyb3AgdGhpcyBub3RpZmljYXRpb24gYW5kIHJlbHkKKyAgICAgICAgICAgICAgICAvLyBvbiBmbHVzaC1jb21wbGV0ZSBub3RpZmljYXRpb25zIG9uIHRoZSBpbmRpdmlkdWFsIHBvcnQKKyAgICAgICAgICAgICAgICAvLyBpbmRpY2VzIGluc3RlYWQuCisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIG9uT01YRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9FVkVOVFRZUEU+KGV2ZW50KSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX1UzMj4oZGF0YTEpLApAQCAtMTYzOSwyMyArMTY3MCwzMyBAQAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgQVN0cmluZyBjb21wb25lbnROYW1lOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBjb21wb25lbnROYW1lID0gIk9NWC5OdmlkaWEuaDI2NC5kZWNvZGUiOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWUgPSAiT01YLk52aWRpYS5hYWMuZGVjb2RlciI7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWUgPSAiT01YLk52aWRpYS5tcDMuZGVjb2RlciI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9CisgICAgVmVjdG9yPFN0cmluZzg+IG1hdGNoaW5nQ29kZWNzOworICAgIE9NWENvZGVjOjpmaW5kTWF0Y2hpbmdDb2RlY3MoCisgICAgICAgICAgICBtaW1lLmNfc3RyKCksCisgICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlRW5jb2RlcgorICAgICAgICAgICAgTlVMTCwgIC8vIG1hdGNoQ29tcG9uZW50TmFtZQorICAgICAgICAgICAgMCwgICAgIC8vIGZsYWdzCisgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBJT01YOjpub2RlX2lkIG5vZGUgPSBOVUxMOwogCi0gICAgSU9NWDo6bm9kZV9pZCBub2RlOwotICAgIENIRUNLX0VRKG9teC0+YWxsb2NhdGVOb2RlKGNvbXBvbmVudE5hbWUuY19zdHIoKSwgb2JzZXJ2ZXIsICZub2RlKSwKLSAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKKworICAgIGZvciAoc2l6ZV90IG1hdGNoSW5kZXggPSAwOyBtYXRjaEluZGV4IDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOworICAgICAgICAgICAgKyttYXRjaEluZGV4KSB7CisgICAgICAgIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjcy5pdGVtQXQobWF0Y2hJbmRleCkuc3RyaW5nKCk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm5vZGUpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbm9kZSA9IE5VTEw7CisgICAgfQorCisgICAgQ0hFQ0sobm9kZSAhPSBOVUxMKTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlLCBtQ29kZWMtPmlkKCkpOwogICAgIG9ic2VydmVyLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeSk7CkBAIC0xNjcwLDcgKzE3MTEsOCBAQAogICAgIG1Db2RlYy0+Y29uZmlndXJlQ29kZWMobWltZS5jX3N0cigpLCBtc2cpOwogCiAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKSkgeworICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKQorICAgICAgICAgICAgJiYgc3RybmNtcCgiT01YLmdvb2dsZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCksIDExKSkgewogICAgICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBuYXRpdmVXaW5kb3coCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKICAgICAgICAgQ0hFQ0sobmF0aXZlV2luZG93ICE9IE5VTEwpOwpAQCAtMjA5NSw2ICsyMTM3LDcgQEAKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uT01YRXZlbnQoZXZlbnQsIGRhdGExLCBkYXRhMik7CiAgICAgfQogfQorCiB2b2lkIEFDb2RlYzo6RXhlY3V0aW5nVG9JZGxlU3RhdGU6OmNoYW5nZVN0YXRlSWZXZU93bkFsbEJ1ZmZlcnMoKSB7CiAgICAgaWYgKG1Db2RlYy0+YWxsWW91ckJ1ZmZlcnNBcmVCZWxvbmdUb1VzKCkpIHsKICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKQEAgLTIyNTgsNiArMjMwMSwxMSBAQAogICAgICAgICAgICAgaWYgKGRhdGEyID09IGtQb3J0SW5kZXhJbnB1dCB8fCBkYXRhMiA9PSBrUG9ydEluZGV4T3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgQ0hFQ0soIW1GbHVzaENvbXBsZXRlW2RhdGEyXSk7CiAgICAgICAgICAgICAgICAgbUZsdXNoQ29tcGxldGVbZGF0YTJdID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZUlmV2VPd25BbGxCdWZmZXJzKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBDSEVDS19FUShkYXRhMiwgT01YX0FMTCk7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCAwZGIzZDFkLi42NDM2MDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC0zNyw3ICszNiw3IEBACiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1SZXN1bWVkKGZhbHNlKSB7CiAKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSKTsKICAgICBpZiAobUZkID49IDApIHsKICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogICAgIH0KQEAgLTI2OSw3ICsyNjgsNyBAQAogICAgIH0KIAogICAgIGlmIChzdG9wcGVkUHJlbWF0dXJlbHkpIHsKLSAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fQ09NUExFVElPTl9TVEFUVVMsIFVOS05PV05fRVJST1IpOworICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19DT01QTEVUSU9OX1NUQVRVUywgVU5LTk9XTl9FUlJPUik7CiAgICAgfQogCiAgICAgY2xvc2UobUZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FWSUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BVklFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTNjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BVklFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsOTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBVklFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0FWSUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgQVZJU291cmNlKGNvbnN0IHNwPEFWSUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IHRyYWNrSW5kZXgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFWSVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHNwPEFWSUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKKyAgICBzaXplX3QgbVRyYWNrSW5kZXg7CisgICAgY29uc3QgQVZJRXh0cmFjdG9yOjpUcmFjayAmbVRyYWNrOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKKyAgICBzaXplX3QgbVNhbXBsZUluZGV4OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVZJU291cmNlKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpBVklTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFWSUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IHRyYWNrSW5kZXgpCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtVHJhY2tJbmRleCh0cmFja0luZGV4KSwKKyAgICAgIG1UcmFjayhtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KSksCisgICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgeworfQorCitBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6fkFWSVNvdXJjZSgpIHsKKyAgICBpZiAobUJ1ZmZlckdyb3VwKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgQ0hFQ0soIW1CdWZmZXJHcm91cCk7CisKKyAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobVRyYWNrLm1NYXhTYW1wbGVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtVHJhY2subU1heFNhbXBsZVNpemUpKTsKKyAgICBtU2FtcGxlSW5kZXggPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6c3RvcCgpIHsKKyAgICBDSEVDSyhtQnVmZmVyR3JvdXApOworCisgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOworCisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbVRyYWNrLm1NZXRhOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgQ0hFQ0sobUJ1ZmZlckdyb3VwKTsKKworICAgICpidWZmZXIgPSBOVUxMOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgIG1FeHRyYWN0b3ItPmdldFNhbXBsZUluZGV4QXRUaW1lKAorICAgICAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCwgc2Vla1RpbWVVcywgc2Vla01vZGUsICZtU2FtcGxlSW5kZXgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPQorICAgICAgICAobVNhbXBsZUluZGV4ICogMTAwMDAwMGxsICogbVRyYWNrLm1SYXRlKSAvIG1UcmFjay5tU2NhbGU7CisKKyAgICBvZmY2NF90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBib29sIGlzS2V5OworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmdldFNhbXBsZUluZm8oCisgICAgICAgICAgICBtVHJhY2tJbmRleCwgbVNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5KTsKKworICAgICsrbVNhbXBsZUluZGV4OworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlciAqb3V0OworICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dCksIChzdGF0dXNfdClPSyk7CisKKyAgICBzc2l6ZV90IG4gPSBtRXh0cmFjdG9yLT5tRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgb3V0LT5kYXRhKCksIHNpemUpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogKHN0YXR1c190KUVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvdXQtPnNldF9yYW5nZSgwLCBzaXplKTsKKworICAgIG91dC0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgaWYgKGlzS2V5KSB7CisgICAgICAgIG91dC0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgKmJ1ZmZlciA9IG91dDsKKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVZJRXh0cmFjdG9yOjpBVklFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSB7CisgICAgbUluaXRDaGVjayA9IHBhcnNlSGVhZGVycygpOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgbVRyYWNrcy5jbGVhcigpOworICAgIH0KK30KKworQVZJRXh0cmFjdG9yOjp+QVZJRXh0cmFjdG9yKCkgeworfQorCitzaXplX3QgQVZJRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBBVklFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIHJldHVybiBpbmRleCA8IG1UcmFja3Muc2l6ZSgpID8gbmV3IEFWSVNvdXJjZSh0aGlzLCBpbmRleCkgOiBOVUxMOworfQorCitzcDxNZXRhRGF0YT4gQVZJRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIGluZGV4IDwgbVRyYWNrcy5zaXplKCkgPyBtVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhIDogTlVMTDsKK30KKworc3A8TWV0YURhdGE+IEFWSUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSk7CisgICAgfQorCisgICAgcmV0dXJuIG1ldGE7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VIZWFkZXJzKCkgeworICAgIG1UcmFja3MuY2xlYXIoKTsKKyAgICBtTW92aWVPZmZzZXQgPSAwOworICAgIG1Gb3VuZEluZGV4ID0gZmFsc2U7CisgICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA9IGZhbHNlOworCisgICAgc3NpemVfdCByZXMgPSBwYXJzZUNodW5rKDBsbCwgLTFsbCk7CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gKHN0YXR1c190KXJlczsKKyAgICB9CisKKyAgICBpZiAobU1vdmllT2Zmc2V0ID09IDBsbCB8fCAhbUZvdW5kSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgQVZJRXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUsIGludCBkZXB0aCkgeworICAgIGlmIChzaXplID49IDAgJiYgc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IHRtcFsxMl07CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHRtcCwgOCk7CisKKyAgICBpZiAobiA8IDgpIHsKKyAgICAgICAgcmV0dXJuIChuIDwgMCkgPyBuIDogKHNzaXplX3QpRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IGZvdXJjYyA9IFUzMl9BVCh0bXApOworICAgIHVpbnQzMl90IGNodW5rU2l6ZSA9IFUzMkxFX0FUKCZ0bXBbNF0pOworCisgICAgaWYgKHNpemUgPj0gMCAmJiBjaHVua1NpemUgKyA4ID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtQcmVmaXhbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICZrUHJlZml4W3N0cmxlbihrUHJlZml4KSAtIDIgKiBkZXB0aF07CisKKyAgICBpZiAoZm91cmNjID09IEZPVVJDQygnTCcsICdJJywgJ1MnLCAnVCcpCisgICAgICAgICAgICB8fCBmb3VyY2MgPT0gRk9VUkNDKCdSJywgJ0knLCAnRicsICdGJykpIHsKKyAgICAgICAgLy8gSXQncyBhIGxpc3Qgb2YgY2h1bmtzCisKKyAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBzaXplIDwgMTIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQgKyA4LCAmdG1wWzhdLCA0KTsKKworICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiAobiA8IDApID8gbiA6IChzc2l6ZV90KUVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHN1YkZvdXJjYyA9IFUzMl9BVCgmdG1wWzhdKTsKKworICAgICAgICBMT0dWKCIlcyBvZmZzZXQgMHglMDhsbHggTElTVCBvZiAnJWMlYyVjJWMnLCBzaXplICVkIiwKKyAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgIChjaGFyKShzdWJGb3VyY2MgPj4gMjQpLAorICAgICAgICAgICAgIChjaGFyKSgoc3ViRm91cmNjID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgIChjaGFyKSgoc3ViRm91cmNjID4+IDgpICYgMHhmZiksCisgICAgICAgICAgICAgKGNoYXIpKHN1YkZvdXJjYyAmIDB4ZmYpLAorICAgICAgICAgICAgIGNodW5rU2l6ZSAtIDQpOworCisgICAgICAgIGlmIChzdWJGb3VyY2MgPT0gRk9VUkNDKCdtJywgJ28nLCAndicsICdpJykpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byBwYXJzZSB0aGlzLCBidXQgd2lsbCB0YWtlIG5vdGUgb2YgdGhlCisgICAgICAgICAgICAvLyBvZmZzZXQuCisKKyAgICAgICAgICAgIG1Nb3ZpZU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZjY0X3Qgc3ViT2Zmc2V0ID0gb2Zmc2V0ICsgMTI7CisgICAgICAgICAgICBvZmY2NF90IHN1Yk9mZnNldExpbWl0ID0gc3ViT2Zmc2V0ICsgY2h1bmtTaXplIC0gNDsKKyAgICAgICAgICAgIHdoaWxlIChzdWJPZmZzZXQgPCBzdWJPZmZzZXRMaW1pdCkgeworICAgICAgICAgICAgICAgIHNzaXplX3QgcmVzID0KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VDaHVuayhzdWJPZmZzZXQsIHN1Yk9mZnNldExpbWl0IC0gc3ViT2Zmc2V0LCBkZXB0aCArIDEpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdWJPZmZzZXQgKz0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiJXMgb2Zmc2V0IDB4JTA4bGx4IENIVU5LICclYyVjJWMlYyciLAorICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgKGNoYXIpKGZvdXJjYyA+PiAyNCksCisgICAgICAgICAgICAgKGNoYXIpKChmb3VyY2MgPj4gMTYpICYgMHhmZiksCisgICAgICAgICAgICAgKGNoYXIpKChmb3VyY2MgPj4gOCkgJiAweGZmKSwKKyAgICAgICAgICAgICAoY2hhcikoZm91cmNjICYgMHhmZikpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3InLCAnaCcpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlU3RyZWFtSGVhZGVyKG9mZnNldCArIDgsIGNodW5rU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncicsICdmJyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VTdHJlYW1Gb3JtYXQob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICd4JywgJzEnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZUluZGV4KG9mZnNldCArIDgsIGNodW5rU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNodW5rU2l6ZSAmIDEpIHsKKyAgICAgICAgKytjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGNodW5rU2l6ZSArIDg7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpHZXRNSU1FVHlwZUZvckhhbmRsZXIodWludDMyX3QgaGFuZGxlcikgeworICAgIHN3aXRjaCAoaGFuZGxlcikgeworICAgICAgICAvLyBXb3cuLi4gc2hhbWVsZXNzbHkgY29waWVkIGZyb20KKyAgICAgICAgLy8gaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9SVNPX01QRUctNAorCisgICAgICAgIGNhc2UgRk9VUkNDKCczJywgJ0knLCAnVicsICcyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCczJywgJ2knLCAndicsICcyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdCJywgJ0wnLCAnWicsICcwJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnRycsICdJJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnVicsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAndicsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ0knLCAnVicsICdYJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAndicsICd4Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ1gnLCAnNScsICcwJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ3gnLCAnNScsICcwJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdEJywgJ1gnLCAnRycsICdNJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdFJywgJ00nLCAnNCcsICdBJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdFJywgJ1AnLCAnSCcsICdWJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdGJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ20nLCAncCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdGJywgJ1YnLCAnRicsICdXJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJ0QnLCAnWCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAneCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJzQnLCAnQycsICdDJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJzQnLCAnUycsICcyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJzQnLCAncycsICcyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1AnLCAnNCcsICdTJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdzJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1AnLCAnNCcsICdWJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdNJywgJ1YnLCAnWCcsICdNJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdSJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdTJywgJ0UnLCAnRCcsICdHJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdTJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdVJywgJ00nLCAnUCcsICc0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdXJywgJ1YnLCAnMScsICdGJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ1YnLCAnSScsICdEJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ3YnLCAnaScsICdEJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd4JywgJ3YnLCAnaScsICdkJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdYJywgJ1YnLCAnSScsICdYJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZVN0cmVhbUhlYWRlcihvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSAhPSA1NikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDk5KSB7CisgICAgICAgIHJldHVybiAtRVJBTkdFOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKworICAgIHVpbnQzMl90IHR5cGUgPSBVMzJfQVQoZGF0YSk7CisgICAgdWludDMyX3QgaGFuZGxlciA9IFUzMl9BVCgmZGF0YVs0XSk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBVMzJMRV9BVCgmZGF0YVs4XSk7CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKworICAgIHVpbnQzMl90IHJhdGUgPSBVMzJMRV9BVCgmZGF0YVsyMF0pOworICAgIHVpbnQzMl90IHNjYWxlID0gVTMyTEVfQVQoJmRhdGFbMjRdKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMOworICAgIFRyYWNrOjpLaW5kIGtpbmQgPSBUcmFjazo6T1RIRVI7CisKKyAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ3MnKSkgeworICAgICAgICBtaW1lID0gR2V0TUlNRVR5cGVGb3JIYW5kbGVyKGhhbmRsZXIpOworCisgICAgICAgIGlmIChtaW1lICYmIHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGtpbmQgPSBUcmFjazo6VklERU87CisgICAgfSBlbHNlIGlmICh0eXBlID09IEZPVVJDQygnYScsICd1JywgJ2QnLCAncycpKSB7CisgICAgICAgIGlmIChtaW1lICYmIHN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGtpbmQgPSBUcmFjazo6QVVESU87CisgICAgfQorCisgICAgaWYgKCFtaW1lKSB7CisgICAgICAgIG1pbWUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICB9CisKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CisKKyAgICBtVHJhY2tzLnB1c2goKTsKKyAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CisKKyAgICB0cmFjay0+bU1ldGEgPSBtZXRhOworICAgIHRyYWNrLT5tUmF0ZSA9IHJhdGU7CisgICAgdHJhY2stPm1TY2FsZSA9IHNjYWxlOworICAgIHRyYWNrLT5tS2luZCA9IGtpbmQ7CisgICAgdHJhY2stPm1OdW1TeW5jU2FtcGxlcyA9IDA7CisgICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVTaXplID0gMDsKKyAgICB0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ID0gLTE7CisgICAgdHJhY2stPm1NYXhTYW1wbGVTaXplID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZVN0cmVhbUZvcm1hdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobVRyYWNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CisKKyAgICBpZiAodHJhY2stPm1LaW5kID09IFRyYWNrOjpPVEhFUikgeworICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgY29udGVudCwgYnV0IHRoYXQncyBub3QgYSBwYXJzaW5nIGVycm9yLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCBpc1ZpZGVvID0gKHRyYWNrLT5tS2luZCA9PSBUcmFjazo6VklERU8pOworCisgICAgaWYgKChpc1ZpZGVvICYmIHNpemUgPCA0MCkgfHwgKCFpc1ZpZGVvICYmIHNpemUgPCAxOCkpIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgYSBCSVRNQVBJTkZPIG9yIFdBVkVGT1JNQVRFWCBzdHJ1Y3R1cmUsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gbiA8IDAgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisKKyAgICBpZiAoaXNWaWRlbykgeworICAgICAgICB1aW50MzJfdCB3aWR0aCA9IFUzMkxFX0FUKCZkYXRhWzRdKTsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyTEVfQVQoJmRhdGFbOF0pOworCisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBVMTZMRV9BVChkYXRhKTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSAweDU1KSB7CisgICAgICAgICAgICB0cmFjay0+bU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IG51bUNoYW5uZWxzID0gVTE2TEVfQVQoJmRhdGFbMl0pOworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gVTMyTEVfQVQoJmRhdGFbNF0pOworCisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworYm9vbCBBVklFeHRyYWN0b3I6OklzQ29ycmVjdENodW5rVHlwZSgKKyAgICAgICAgc3NpemVfdCB0cmFja0luZGV4LCBUcmFjazo6S2luZCBraW5kLCB1aW50MzJfdCBjaHVua1R5cGUpIHsKKyAgICB1aW50MzJfdCBjaHVua0Jhc2UgPSBjaHVua1R5cGUgJiAweGZmZmY7CisKKyAgICBzd2l0Y2ggKGtpbmQpIHsKKyAgICAgICAgY2FzZSBUcmFjazo6VklERU86CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICdkJywgJ2MnKQorICAgICAgICAgICAgICAgICAgICAmJiBjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICdkJywgJ2InKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBUcmFjazo6QVVESU86CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICd3JywgJ2InKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0cmFja0luZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90IGhpID0gY2h1bmtUeXBlID4+IDI0OworICAgIHVpbnQ4X3QgbG8gPSAoY2h1bmtUeXBlID4+IDE2KSAmIDB4ZmY7CisKKyAgICBpZiAoaGkgPCAnMCcgfHwgaGkgPiAnOScgfHwgbG8gPCAnMCcgfHwgbG8gPiAnOScpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0cmFja0luZGV4ICE9ICgxMCAqIChoaSAtICcwJykgKyAobG8gLSAnMCcpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VJbmRleChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoKHNpemUgJSAxNikgIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSk7CisKKyAgICAgICAgdWludDhfdCBoaSA9IGNodW5rVHlwZSA+PiAyNDsKKyAgICAgICAgdWludDhfdCBsbyA9IChjaHVua1R5cGUgPj4gMTYpICYgMHhmZjsKKworICAgICAgICBpZiAoaGkgPCAnMCcgfHwgaGkgPiAnOScgfHwgbG8gPCAnMCcgfHwgbG8gPiAnOScpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IDEwICogKGhpIC0gJzAnKSArIChsbyAtICcwJyk7CisKKyAgICAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgIGlmICghSXNDb3JyZWN0Q2h1bmtUeXBlKC0xLCB0cmFjay0+bUtpbmQsIGNodW5rVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2stPm1LaW5kID09IFRyYWNrOjpPVEhFUikgeworICAgICAgICAgICAgZGF0YSArPSAxNjsKKyAgICAgICAgICAgIHNpemUgLT0gMTY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gVTMyTEVfQVQoJmRhdGFbNF0pOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBVMzJMRV9BVCgmZGF0YVs4XSk7CisgICAgICAgIHVpbnQzMl90IGNodW5rU2l6ZSA9IFUzMkxFX0FUKCZkYXRhWzEyXSk7CisKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA+IHRyYWNrLT5tTWF4U2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgdHJhY2stPm1NYXhTYW1wbGVTaXplID0gY2h1bmtTaXplOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2stPm1TYW1wbGVzLnB1c2goKTsKKworICAgICAgICBTYW1wbGVJbmZvICppbmZvID0KKyAgICAgICAgICAgICZ0cmFjay0+bVNhbXBsZXMuZWRpdEl0ZW1BdCh0cmFjay0+bVNhbXBsZXMuc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgaW5mby0+bU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgaW5mby0+bUlzS2V5ID0gKGZsYWdzICYgMHgxMCkgIT0gMDsKKworICAgICAgICBpZiAoaW5mby0+bUlzS2V5KSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiA9IDIwOworCisgICAgICAgICAgICBpZiAodHJhY2stPm1OdW1TeW5jU2FtcGxlcyA8IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbikgeworICAgICAgICAgICAgICAgIGlmIChjaHVua1NpemUgPiB0cmFjay0+bVRodW1ibmFpbFNhbXBsZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVTaXplID0gY2h1bmtTaXplOworCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TYW1wbGVzLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK3RyYWNrLT5tTnVtU3luY1NhbXBsZXM7CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IDE2OworICAgICAgICBzaXplIC09IDE2OworICAgIH0KKworICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBib29sIGlzS2V5OworICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGVJbmZvKDAsIDAsICZvZmZzZXQsICZzaXplLCAmaXNLZXkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1PZmZzZXRzQXJlQWJzb2x1dGUgPSAhbU9mZnNldHNBcmVBYnNvbHV0ZTsKKyAgICAgICAgICAgIGVyciA9IGdldFNhbXBsZUluZm8oMCwgMCwgJm9mZnNldCwgJnNpemUsICZpc0tleSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HVigiQ2h1bmsgb2Zmc2V0cyBhcmUgJXMiLAorICAgICAgICAgICAgIG1PZmZzZXRzQXJlQWJzb2x1dGUgPyAiYWJzb2x1dGUiIDogIm1vdmllLWNodW5rIHJlbGF0aXZlIik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRyYWNrICp0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0KKyAgICAgICAgICAgICh0cmFjay0+bVNhbXBsZXMuc2l6ZSgpICogMTAwMDAwMGxsICogdHJhY2stPm1SYXRlKSAvIHRyYWNrLT5tU2NhbGU7CisKKyAgICAgICAgTE9HVigidHJhY2sgJWQgZHVyYXRpb24gPSAlLjJmIHNlY3MiLCBpLCBkdXJhdGlvblVzIC8gMUU2KTsKKworICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgdHJhY2stPm1NYXhTYW1wbGVTaXplKTsKKworICAgICAgICBjb25zdCBjaGFyICp0bXA7CisgICAgICAgIENIRUNLKHRyYWNrLT5tTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdG1wKSk7CisKKyAgICAgICAgQVN0cmluZyBtaW1lID0gdG1wOworCisgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikKKyAgICAgICAgICAgICAgICAmJiB0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0KKyAgICAgICAgICAgICAgICAodHJhY2stPm1UaHVtYm5haWxTYW1wbGVJbmRleCAqIDEwMDAwMDBsbCAqIHRyYWNrLT5tUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgLyB0cmFjay0+bVNjYWxlOworCisgICAgICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCB0aHVtYm5haWxUaW1lVXMpOworCisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBhZGRNUEVHNENvZGVjU3BlY2lmaWNEYXRhKGkpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Gb3VuZEluZGV4ID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBHZXRTaXplV2lkdGgoc2l6ZV90IHgpIHsKKyAgICBzaXplX3QgbiA9IDE7CisgICAgd2hpbGUgKHggPiAxMjcpIHsKKyAgICAgICAgKytuOworICAgICAgICB4ID4+PSA3OworICAgIH0KKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIHVpbnQ4X3QgKkVuY29kZVNpemUodWludDhfdCAqZHN0LCBzaXplX3QgeCkgeworICAgIHdoaWxlICh4ID4gMTI3KSB7CisgICAgICAgICpkc3QrKyA9ICh4ICYgMHg3ZikgfCAweDgwOworICAgICAgICB4ID4+PSA3OworICAgIH0KKyAgICAqZHN0KysgPSB4OworICAgIHJldHVybiBkc3Q7Cit9CisKK3NwPEFCdWZmZXI+IE1ha2VNUEVHNFZpZGVvQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNvbmZpZykgeworICAgIHNpemVfdCBsZW4xID0gY29uZmlnLT5zaXplKCkgKyBHZXRTaXplV2lkdGgoY29uZmlnLT5zaXplKCkpICsgMTsKKyAgICBzaXplX3QgbGVuMiA9IGxlbjEgKyBHZXRTaXplV2lkdGgobGVuMSkgKyAxICsgMTM7CisgICAgc2l6ZV90IGxlbjMgPSBsZW4yICsgR2V0U2l6ZVdpZHRoKGxlbjIpICsgMSArIDM7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihsZW4zKTsKKyAgICB1aW50OF90ICpkc3QgPSBjc2QtPmRhdGEoKTsKKyAgICAqZHN0KysgPSAweDAzOworICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBsZW4yICsgMyk7CisgICAgKmRzdCsrID0gMHgwMDsgIC8vIEVTX0lECisgICAgKmRzdCsrID0gMHgwMDsKKyAgICAqZHN0KysgPSAweDAwOyAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAqZHN0KysgPSAweDA0OworICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBsZW4xICsgMTMpOworICAgICpkc3QrKyA9IDB4MDE7ICAvLyBWaWRlbyBJU08vSUVDIDE0NDk2LTIgU2ltcGxlIFByb2ZpbGUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEyOyArK2kpIHsKKyAgICAgICAgKmRzdCsrID0gMHgwMDsKKyAgICB9CisKKyAgICAqZHN0KysgPSAweDA1OworICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBjb25maWctPnNpemUoKSk7CisgICAgbWVtY3B5KGRzdCwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICBkc3QgKz0gY29uZmlnLT5zaXplKCk7CisKKyAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICByZXR1cm4gY3NkOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OmFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoc2l6ZV90IHRyYWNrSW5kZXgpIHsKKyAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgYm9vbCBpc0tleTsKKyAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGVJbmZvKHRyYWNrSW5kZXgsIDAsICZvZmZzZXQsICZzaXplLCAmaXNLZXkpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgVk9QIHN0YXJ0IGNvZGUgZnJvbSB0aGUgZmlyc3QKKyAgICAvLyBmcmFtZSdzIGVuY29kZWQgZGF0YSBhbmQgdXNlIGl0IHRvIGNvbnN0cnVjdCBhbiBFU0RTIHdpdGggdGhlCisgICAgLy8gY29kZWMgc3BlY2lmaWMgZGF0YS4KKworICAgIHNpemVfdCBpID0gMDsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKGkgKyAzIDwgYnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMVx4YjYiLCAmYnVmZmVyLT5kYXRhKClbaV0sIDQpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBpKTsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VNUEVHNFZpZGVvQ29kZWNTcGVjaWZpY0RhdGEoYnVmZmVyKTsKKyAgICB0cmFjay0+bU1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpnZXRTYW1wbGVJbmZvKAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LAorICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgYm9vbCAqaXNLZXkpIHsKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLUVSQU5HRTsKKyAgICB9CisKKyAgICBjb25zdCBUcmFjayAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKKworICAgIGlmIChzYW1wbGVJbmRleCA+PSB0cmFjay5tU2FtcGxlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIC1FUkFOR0U7CisgICAgfQorCisgICAgY29uc3QgU2FtcGxlSW5mbyAmaW5mbyA9IHRyYWNrLm1TYW1wbGVzLml0ZW1BdChzYW1wbGVJbmRleCk7CisKKyAgICBpZiAoIW1PZmZzZXRzQXJlQWJzb2x1dGUpIHsKKyAgICAgICAgKm9mZnNldCA9IGluZm8ubU9mZnNldCArIG1Nb3ZpZU9mZnNldCArIDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm9mZnNldCA9IGluZm8ubU9mZnNldDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IDA7CisKKyAgICB1aW50OF90IHRtcFs4XTsKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIHRtcCwgOCk7CisKKyAgICBpZiAobiA8IDgpIHsKKyAgICAgICAgcmV0dXJuIG4gPCAwID8gKHN0YXR1c190KW4gOiAoc3RhdHVzX3QpRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IFUzMl9BVCh0bXApOworCisgICAgaWYgKCFJc0NvcnJlY3RDaHVua1R5cGUodHJhY2tJbmRleCwgdHJhY2subUtpbmQsIGNodW5rVHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqb2Zmc2V0ICs9IDg7CisgICAgKnNpemUgPSBVMzJMRV9BVCgmdG1wWzRdKTsKKworICAgICppc0tleSA9IGluZm8ubUlzS2V5OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVklFeHRyYWN0b3I6OmdldFNhbXBsZUluZGV4QXRUaW1lKAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpzYW1wbGVJbmRleCkgY29uc3QgeworICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiAtRVJBTkdFOworICAgIH0KKworICAgIGNvbnN0IFRyYWNrICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgc3NpemVfdCBjbG9zZXN0U2FtcGxlSW5kZXggPQorICAgICAgICB0aW1lVXMgLyB0cmFjay5tUmF0ZSAqIHRyYWNrLm1TY2FsZSAvIDEwMDAwMDBsbDsKKworICAgIHNzaXplX3QgbnVtU2FtcGxlcyA9IHRyYWNrLm1TYW1wbGVzLnNpemUoKTsKKworICAgIGlmIChjbG9zZXN0U2FtcGxlSW5kZXggPCAwKSB7CisgICAgICAgIGNsb3Nlc3RTYW1wbGVJbmRleCA9IDA7CisgICAgfSBlbHNlIGlmIChjbG9zZXN0U2FtcGxlSW5kZXggPj0gbnVtU2FtcGxlcykgeworICAgICAgICBjbG9zZXN0U2FtcGxlSW5kZXggPSBudW1TYW1wbGVzIC0gMTsKKyAgICB9CisKKyAgICBpZiAobW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgeworICAgICAgICAqc2FtcGxlSW5kZXggPSBjbG9zZXN0U2FtcGxlSW5kZXg7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNzaXplX3QgcHJldlN5bmNTYW1wbGVJbmRleCA9IGNsb3Nlc3RTYW1wbGVJbmRleDsKKyAgICB3aGlsZSAocHJldlN5bmNTYW1wbGVJbmRleCA+PSAwKSB7CisgICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJmluZm8gPQorICAgICAgICAgICAgdHJhY2subVNhbXBsZXMuaXRlbUF0KHByZXZTeW5jU2FtcGxlSW5kZXgpOworCisgICAgICAgIGlmIChpbmZvLm1Jc0tleSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAtLXByZXZTeW5jU2FtcGxlSW5kZXg7CisgICAgfQorCisgICAgc3NpemVfdCBuZXh0U3luY1NhbXBsZUluZGV4ID0gY2xvc2VzdFNhbXBsZUluZGV4OworICAgIHdoaWxlIChuZXh0U3luY1NhbXBsZUluZGV4IDwgbnVtU2FtcGxlcykgeworICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZpbmZvID0KKyAgICAgICAgICAgIHRyYWNrLm1TYW1wbGVzLml0ZW1BdChuZXh0U3luY1NhbXBsZUluZGV4KTsKKworICAgICAgICBpZiAoaW5mby5tSXNLZXkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgKytuZXh0U3luY1NhbXBsZUluZGV4OworICAgIH0KKworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICB7CisgICAgICAgICAgICAqc2FtcGxlSW5kZXggPSBwcmV2U3luY1NhbXBsZUluZGV4OworCisgICAgICAgICAgICByZXR1cm4gcHJldlN5bmNTYW1wbGVJbmRleCA+PSAwID8gT0sgOiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICB7CisgICAgICAgICAgICAqc2FtcGxlSW5kZXggPSBuZXh0U3luY1NhbXBsZUluZGV4OworCisgICAgICAgICAgICByZXR1cm4gbmV4dFN5bmNTYW1wbGVJbmRleCA8IG51bVNhbXBsZXMgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmV2U3luY1NhbXBsZUluZGV4IDwgMCAmJiBuZXh0U3luY1NhbXBsZUluZGV4ID49IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByZXZTeW5jU2FtcGxlSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0gbmV4dFN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXh0U3luY1NhbXBsZUluZGV4ID49IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlSW5kZXggPSBwcmV2U3luY1NhbXBsZUluZGV4OworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGRpc3QxID0gY2xvc2VzdFNhbXBsZUluZGV4IC0gcHJldlN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHNpemVfdCBkaXN0MiA9IG5leHRTeW5jU2FtcGxlSW5kZXggLSBjbG9zZXN0U2FtcGxlSW5kZXg7CisKKyAgICAgICAgICAgICpzYW1wbGVJbmRleCA9CisgICAgICAgICAgICAgICAgKGRpc3QxIDwgZGlzdDIpID8gcHJldlN5bmNTYW1wbGVJbmRleCA6IG5leHRTeW5jU2FtcGxlSW5kZXg7CisKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitib29sIFNuaWZmQVZJKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CisgICAgY2hhciB0bXBbMTJdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDEyKSA8IDEyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1lbWNtcCh0bXAsICJSSUZGIiwgNCkgJiYgIW1lbWNtcCgmdG1wWzhdLCAiQVZJICIsIDQpKSB7CisgICAgICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJKTsKKyAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjI7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggODgwNjllOS4uM2Y0ZGFjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC02LDggKzYsMTAgQEAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQUFDRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUFDV3JpdGVyLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQU1SRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQU1SV3JpdGVyLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVZJRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXVkaW9QbGF5ZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXVkaW9Tb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTE5LDcgKzIxLDcgQEAKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRkxBQ0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgSFRUUFN0cmVhbS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSFRUUEJhc2UuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgSlBFR1NvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTVAzRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTVBFRzJUU1dyaXRlci5jcHAgICAgICAgICAgICAgICAgIFwKQEAgLTMzLDE2ICszNSwxNCBAQAogICAgICAgICBNZWRpYVNvdXJjZVNwbGl0dGVyLmNwcCAgICAgICAgICAgXAogICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBOdUNhY2hlZFNvdXJjZTIuY3BwICAgICAgICAgICAgICAgXAotICAgICAgICBOdUhUVFBEYXRhU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBPTVhDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPTVhDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPZ2dFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTYW1wbGVJdGVyYXRvci5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBTYW1wbGVUYWJsZS5jcHAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTaG91dGNhc3RTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAogICAgICAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgICAgICAgXAogICAgICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCAgXAotICAgICAgICBUaHJlYWRlZFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBTdXJmYWNlTWVkaWFTb3VyY2UuY3BwICAgICAgICAgICAgXAogICAgICAgICBUaHJvdHRsZWRTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAogICAgICAgICBUaW1lU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUaW1lZEV2ZW50UXVldWUuY3BwICAgICAgICAgICAgICAgXApAQCAtNjksNTcgKzY5LDg2IEBACiAgICAgICAgIGxpYnVpICAgICAgICAgICAgIFwKICAgICAgICAgbGlic29uaXZveCAgICAgICAgXAogICAgICAgICBsaWJ2b3JiaXNpZGVjICAgICBcCi0gICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3l1diBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgICAgICBsaWJkcm1mcmFtZXdvcmsgIFwKICAgICAgICAgbGliY3J5cHRvICAgICAgICBcCiAgICAgICAgIGxpYnNzbCAgICAgICAgICAgXAotICAgICAgICBsaWJndWkKKyAgICAgICAgbGliZ3VpICAgICAgICAgICBcCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNlbmMgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZvcmJpc2RlYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfdnB4ZGVjIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IFwKICAgICAgICAgbGlidnB4IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2lkMyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMgXAogICAgICAgICBsaWJGTEFDIFwKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgZm9sbG93aW5nIHdhcyBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBleHRlcm5hbC93ZWJraXQvQW5kcm9pZC5tayBhbmQKKyMgY3VycmVudGx5IG11c3QgZm9sbG93IHRoZSBzYW1lIGxvZ2ljIHRvIGRldGVybWluZSBob3cgd2Via2l0IHdhcyBidWlsdCBhbmQKKyMgaWYgaXQncyBzYWZlIHRvIGxpbmsgYWdhaW5zdCBsaWJjaHJvbWl1bS5uZXQKKworIyBWOCBhbHNvIHJlcXVpcmVzIGFuIEFSTXY3IENQVSwgYW5kIHNpbmNlIHdlIG11c3QgdXNlIGpzYywgd2UgY2Fubm90CisjIHVzZSB0aGUgQ2hyb21lIGh0dHAgc3RhY2sgZWl0aGVyLgoraWZuZXEgKCQoc3RyaXAgJChBUkNIX0FSTV9IQVZFX0FSTVY3QSkpLHRydWUpCisgIFVTRV9BTFRfSFRUUCA6PSB0cnVlCitlbmRpZgorCisjIFNlZSBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGEgc3RhY2sgdGhleSB3YW50IHRvIHVzZQorSFRUUF9TVEFDSyA9ICQoSFRUUCkKKyMgV2UgZGVmYXVsdCB0byB0aGUgQ2hyb21lIEhUVFAgc3RhY2suCitERUZBVUxUX0hUVFAgPSBjaHJvbWUKK0FMVF9IVFRQID0gYW5kcm9pZAorCitpZm5lcSAoJChIVFRQX1NUQUNLKSxjaHJvbWUpCisgIGlmbmVxICgkKEhUVFBfU1RBQ0spLGFuZHJvaWQpCisgICAgIyBObyBIVFRQIHN0YWNrIGlzIHNwZWNpZmllZCwgcGlja3VwIHRoZSBvbmUgd2Ugd2FudCBhcyBkZWZhdWx0LgorICAgIGlmZXEgKCQoVVNFX0FMVF9IVFRQKSx0cnVlKQorICAgICAgSFRUUF9TVEFDSyA9ICQoQUxUX0hUVFApCisgICAgZWxzZQorICAgICAgSFRUUF9TVEFDSyA9ICQoREVGQVVMVF9IVFRQKQorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKEhUVFBfU1RBQ0spLGNocm9tZSkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgICAgIGxpYmxvZyAgICAgICAgICAgXAorICAgICAgICBsaWJpY3V1YyAgICAgICAgIFwKKyAgICAgICAgbGliaWN1aTE4biAgICAgICBcCisgICAgICAgIGxpYnogICAgICAgICAgICAgXAorICAgICAgICBsaWJkbCAgICAgICAgICAgIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAgXAorICAgICAgICBsaWJ3ZWJjb3JlICAgICAgICAgICAgICBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydCBsaWJjaHJvbWl1bV9uZXQKK2luY2x1ZGUgZXh0ZXJuYWwvc3RscG9ydC9saWJzdGxwb3J0Lm1rCisKK0xPQ0FMX0NQUEZMQUdTICs9IC1EQ0hST01JVU1fQVZBSUxBQkxFPTEKKworZW5kaWYgICMgaWZlcSAoJChIVFRQX1NUQUNLKSxjaHJvbWUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYXZjX2NvbW1vbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotCi1pZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQotICAgICAgICBMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkIC1sZGwKLSAgICAgICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkdm0KLSAgICAgICAgTE9DQUxfQ1BQRkxBR1MgKz0gLURBTkRST0lEX1NJTVVMQVRPUgotZW5kaWYKLQotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi0gICAgICAgIExPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKLWVuZGlmCisgICAgICAgIGxpYmRsCiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKaW5kZXggYmQwNGEyNi4uZGQ2OWU2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtODQsNyArODQsMTMgQEAKIAogICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKIAotICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlcik7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgaWYgKG1TZWVraW5nKSB7CisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKKyAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBtU291cmNlLT5yZWFkKCZtRmlyc3RCdWZmZXIsICZvcHRpb25zKTsKICAgICBpZiAobUZpcnN0QnVmZmVyUmVzdWx0ID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICAgICAgICAgTE9HVigiSU5GT19GT1JNQVRfQ0hBTkdFRCEhISIpOwogCkBAIC0xMTAsNyArMTE2LDcgQEAKIAogICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBudW1DaGFubmVscywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgJkF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTEzMiwxMCArMTM4LDEwIEBACiAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6TVVTSUMsIG1TYW1wbGVSYXRlLCBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAobnVtQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgPyBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgIDogQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX01PTk8sCisgICAgICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgICAgICAgICAgICAgIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKICAgICAgICAgICAgICAgICAwLCAwLCAmQXVkaW9DYWxsYmFjaywgdGhpcywgMCk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CkBAIC0yODAsMTcgKzI4NiwzOSBAQAogICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKIH0KIAordWludDMyX3QgQXVkaW9QbGF5ZXI6OmdldE51bUZyYW1lc1BlbmRpbmdQbGF5b3V0KCkgY29uc3QgeworICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZE91dDsKKyAgICBzdGF0dXNfdCBlcnI7CisKKyAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWRPdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1BdWRpb1RyYWNrLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkT3V0KTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LIHx8IG1OdW1GcmFtZXNQbGF5ZWQgPCBudW1GcmFtZXNQbGF5ZWRPdXQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gbU51bUZyYW1lc1BsYXllZCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzdWJtaXR0ZWQKKyAgICAvLyB0byB0aGUgYXVkaW8gc2luayBmb3IgcGxheWJhY2ssIGJ1dCBub3QgYWxsIG9mIHRoZW0KKyAgICAvLyBtYXkgaGF2ZSBwbGF5ZWQgb3V0IGJ5IG5vdy4KKyAgICByZXR1cm4gbU51bUZyYW1lc1BsYXllZCAtIG51bUZyYW1lc1BsYXllZE91dDsKK30KKwogc2l6ZV90IEF1ZGlvUGxheWVyOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1OdW1GcmFtZXNQbGF5ZWQgPT0gMCkgewogICAgICAgICBMT0dWKCJBdWRpb0NhbGxiYWNrIik7CiAgICAgfQogCiAgICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIG1lbXNldChkYXRhLCAwLCBzaXplKTsKLQotICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgYm9vbCBwb3N0U2Vla0NvbXBsZXRlID0gZmFsc2U7CisgICAgYm9vbCBwb3N0RU9TID0gZmFsc2U7CisgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisKICAgICBzaXplX3Qgc2l6ZV9kb25lID0gMDsKICAgICBzaXplX3Qgc2l6ZV9yZW1haW5pbmcgPSBzaXplOwogICAgIHdoaWxlIChzaXplX3JlbWFpbmluZyA+IDApIHsKQEAgLTMxNyw3ICszNDUsNyBAQAogCiAgICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RTZWVrQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzQyLDcgKzM3MCwzNSBAQAogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlciAmJiAhbVJlYWNoZWRFT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBwb3N0IEVPUyByaWdodCBhd2F5IGJ1dCBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBmcmFtZXMgaGF2ZSBhY3R1YWxseSBiZWVuIHBsYXllZCBvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBudW1iZXIgb2YgZnJhbWVzIHN1Ym1pdHRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjayB0aGF0IHlvdSBoYXZlbid0IGhlYXJkIHlldC4KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIG51bWJlciBvZiBmcmFtZXMgd2UncmUgZ29pbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gc3VibWl0IHRvIHRoZSBBdWRpb1RyYWNrIGJ5IHJldHVybmluZyBmcm9tIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUFkZGl0aW9uYWxGcmFtZXMgPSBzaXplX2RvbmUgLyBtRnJhbWVTaXplOworCisgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICs9IG51bUFkZGl0aW9uYWxGcmFtZXM7CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVG9Db21wbGV0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKDEwMDAwMDBsbCAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0KSAvIG1TYW1wbGVSYXRlOworCisgICAgICAgICAgICAgICAgICAgIExPR1YoInRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkOiAlbGxkICglbGxkIHVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgKiAobU51bUZyYW1lc1BsYXllZCArIG51bUFkZGl0aW9uYWxGcmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgICAgIExPR1YoIiVkIGZyYW1lcyBsZWZ0IHRvIHBsYXksICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUb0NvbXBsZXRpb25VcywgdGltZVRvQ29tcGxldGlvblVzIC8gMUU2KTsKKworICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSB0aW1lVG9Db21wbGV0aW9uVXMgKyBtTGF0ZW5jeVVzOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKQEAgLTM4Niw4ICs0NDIsMTggQEAKICAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gY29weTsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKKyAgICB9CisKKyAgICBpZiAocG9zdEVPUykgeworICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUyhwb3N0RU9TRGVsYXlVcyk7CisgICAgfQorCisgICAgaWYgKHBvc3RTZWVrQ29tcGxldGUpIHsKKyAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKKyAgICB9CiAKICAgICByZXR1cm4gc2l6ZV9kb25lOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IGJiZGVjMDIuLjk5YzM2ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTYwLDggKzYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkOjpSRUNPUkRfTlNfRU5BQkxFICB8CiAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZDo6UkVDT1JEX0lJUl9FTkFCTEU7CiAgICAgbVJlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKLSAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPiAxPyBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9TVEVSRU86IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIGNoYW5uZWxzID4gMT8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU86IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKICAgICAgICAgICAgICAgICA0ICoga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCksIC8qIEVuYWJsZSBwaW5nLXBvbmcgYnVmZmVycyAqLwogICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggNTk2MjQ1NC4uNjdmNmM3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1dWTUV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSAidGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oIgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTU3LDcgKzU5LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjZGVmaW5lIFVTRV9TVVJGQUNFX0FMTE9DIDEKLSNkZWZpbmUgRlJBTUVfRFJPUF9GUkVRIDAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMjcsNiArMTI4LDkgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtTmF0aXZlV2luZG93LmdldCgpLCB0aW1lVXMgKiAxMDAwKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIoCiAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgYnVmZmVyLT5ncmFwaGljQnVmZmVyKCkuZ2V0KCkpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKQEAgLTE3OSw2ICsxODMsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIEF3ZXNvbWVQbGF5ZXI6OkF3ZXNvbWVQbGF5ZXIoKQogICAgIDogbVF1ZXVlU3RhcnRlZChmYWxzZSksCisgICAgICBtVUlEVmFsaWQoZmFsc2UpLAogICAgICAgbVRpbWVTb3VyY2UoTlVMTCksCiAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyhmYWxzZSksCiAgICAgICBtQXVkaW9QbGF5ZXIoTlVMTCksCkBAIC0xODcsNyArMTkyLDkgQEAKICAgICAgIG1GbGFncygwKSwKICAgICAgIG1FeHRyYWN0b3JGbGFncygwKSwKICAgICAgIG1WaWRlb0J1ZmZlcihOVUxMKSwKLSAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpIHsKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAorICAgICAgbUxhc3RWaWRlb1RpbWVVcygtMSksCisgICAgICBtVGV4dFBsYXllcihOVUxMKSB7CiAgICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CiAKICAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwpAQCAtMjQwLDYgKzI0NywxMyBAQAogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFVJRCh1aWRfdCB1aWQpIHsKKyAgICBMT0dJKCJBd2Vzb21lUGxheWVyIHJ1bm5pbmcgb24gYmVoYWxmIG9mIHVpZCAlZCIsIHVpZCk7CisKKyAgICBtVUlEID0gdWlkOworICAgIG1VSURWYWxpZCA9IHRydWU7Cit9CisKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldERhdGFTb3VyY2UoCiAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMjYyLDcgKzI3Niw3IEBACiAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlci4KICAgICAgICAgICAgIG1VcmlIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCi0gICAgICAgICAgICBtRmxhZ3MgfD0gSU5DT0dOSVRPOworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoSU5DT0dOSVRPLCBTRVQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNzYsNiArMjkwLDEyIEBACiAgICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCiAgICAgLy8gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GZCA9IC0xOworICAgICAgICBtU3RhdHMubVVSSSA9IG1Vcmk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yOTUsNiArMzE1LDEyIEBACiAKICAgICBtRmlsZVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GZCA9IGZkOworICAgICAgICBtU3RhdHMubVVSSSA9IFN0cmluZzgoKTsKKyAgICB9CisKICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGRhdGFTb3VyY2UpOwogfQogCkBAIC0zMTAsNyArMzM2LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbyhtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CiAgICAgICAgIGlmIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CkBAIC0zMzMsNiArMzU5LDEwIEBACiAKICAgICAgICAgaW50MzJfdCBiaXRyYXRlOwogICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgTE9HVygidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggYml0cmF0ZSIsIG1pbWUpOworCiAgICAgICAgICAgICB0b3RhbEJpdFJhdGUgPSAtMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNDQsNiArMzc0LDE0IEBACiAKICAgICBMT0dWKCJtQml0cmF0ZSA9ICVsbGQgYml0cy9zZWMiLCBtQml0cmF0ZSk7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1CaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgIG1TdGF0cy5tVHJhY2tzLmNsZWFyKCk7CisgICAgICAgIG1TdGF0cy5tQXVkaW9UcmFja0luZGV4ID0gLTE7CisgICAgICAgIG1TdGF0cy5tVmlkZW9UcmFja0luZGV4ID0gLTE7CisgICAgfQorCiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKQEAgLTM2NywxMCArNDA1LDI3IEBACiAgICAgICAgICAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9UcmFja0luZGV4ID0gbVN0YXRzLm1UcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVHJhY2tzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBUcmFja1N0YXQgKnN0YXQgPQorICAgICAgICAgICAgICAgICAgICAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubVZpZGVvVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgc3RhdC0+bU1JTUUgPSBtaW1lOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwogCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgICAgIG1TdGF0cy5tQXVkaW9UcmFja0luZGV4ID0gbVN0YXRzLm1UcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVHJhY2tzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBUcmFja1N0YXQgKnN0YXQgPQorICAgICAgICAgICAgICAgICAgICAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgc3RhdC0+bU1JTUUgPSBtaW1lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBmb3Igdm9yYmlzIGF1ZGlvLCBub25lIG9mIHRoZSBvdGhlciBhdWRpbwogICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgZXZlbiBzdXBwb3J0IHRoaXMgcmluZ3RvbmUgc3BlY2lmaWMgaGFjayBhbmQKQEAgLTM4MCwxMyArNDM1LDExIEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCBsb29wOwogICAgICAgICAgICAgICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApICYmIGxvb3AgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVUT19MT09QSU5HOworICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhBVVRPX0xPT1BJTkcsIFNFVCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKKyAgICAgICAgICAgIGFkZFRleHRTb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQwMCw3ICs0NTMsNiBAQAogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnJlc2V0KCkgewotICAgIExPR0koInJlc2V0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXNldF9sKCk7CiB9CkBAIC00MTQsMTAgKzQ2Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVE9QLCAwKTsKICAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKICAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICAgICAgICAgIExPR0koIkRSTSBtYW5hZ2VyIGNsaWVudCBzdG9wcGVkIik7CiAgICAgfQogCi0KICAgICBpZiAobUZsYWdzICYgUExBWUlORykgewogICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0RlY29kZXI7CiAgICAgICAgIGlmICgobUF1ZGlvU291cmNlICE9IE5VTEwpICYmIChtQXVkaW9Tb3VyY2UgIT0gbUF1ZGlvVHJhY2spKSB7CkBAIC00MzAsNyArNDgwLDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoUFJFUEFSRV9DQU5DRUxMRUQsIFNFVCk7CiAgICAgICAgIGlmIChtQ29ubmVjdGluZ0RhdGFTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgTE9HSSgiaW50ZXJydXB0aW5nIHRoZSBjb25uZWN0aW9uIHByb2Nlc3MiKTsKICAgICAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+ZGlzY29ubmVjdCgpOwpAQCAtNDUwLDcgKzUwMCw2IEBACiAgICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CiAKLSAgICBMT0dJKCJjYW5jZWwgcGxheWVyIGV2ZW50cyIpOwogICAgIGNhbmNlbFBsYXllckV2ZW50cygpOwogCiAgICAgbVdWTUV4dHJhY3Rvci5jbGVhcigpOwpAQCAtNDc2LDM1ICs1MjUsMjQgQEAKICAgICBkZWxldGUgbUF1ZGlvUGxheWVyOwogICAgIG1BdWRpb1BsYXllciA9IE5VTEw7CiAKLSAgICBtVmlkZW9SZW5kZXJlci5jbGVhcigpOwotCi0gICAgaWYgKG1WaWRlb0J1ZmZlcikgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKKyAgICBpZiAobVRleHRQbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVRleHRQbGF5ZXI7CisgICAgICAgIG1UZXh0UGxheWVyID0gTlVMTDsKICAgICB9CiAKKyAgICBtVmlkZW9SZW5kZXJlci5jbGVhcigpOworCiAgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CiAgICAgICAgIG1SVFNQQ29udHJvbGxlci0+ZGlzY29ubmVjdCgpOwogICAgICAgICBtUlRTUENvbnRyb2xsZXIuY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvU291cmNlLT5zdG9wKCk7Ci0KLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBoYWNrIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgT01YCi0gICAgICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgICAgIHdwPE1lZGlhU291cmNlPiB0bXAgPSBtVmlkZW9Tb3VyY2U7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBMT0dJKCJ2aWRlbyBkZWNvZGVyIHNodXRkb3duIGNvbXBsZXRlZCIpOworICAgICAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7CiAgICAgfQogCiAgICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOworICAgIG1vZGlmeUZsYWdzKDAsIEFTU0lHTik7CiAgICAgbUV4dHJhY3RvckZsYWdzID0gMDsKICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwogICAgIG1WaWRlb1RpbWVVcyA9IDA7CkBAIC01MTksNiArNTU3LDIzIEBACiAgICAgbUZpbGVTb3VyY2UuY2xlYXIoKTsKIAogICAgIG1CaXRyYXRlID0gLTE7CisgICAgbUxhc3RWaWRlb1RpbWVVcyA9IC0xOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIG1TdGF0cy5tRmQgPSAtMTsKKyAgICAgICAgbVN0YXRzLm1VUkkgPSBTdHJpbmc4KCk7CisgICAgICAgIG1TdGF0cy5tQml0cmF0ZSA9IC0xOworICAgICAgICBtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCA9IC0xOworICAgICAgICBtU3RhdHMubVZpZGVvVHJhY2tJbmRleCA9IC0xOworICAgICAgICBtU3RhdHMubU51bVZpZGVvRnJhbWVzRGVjb2RlZCA9IDA7CisgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEcm9wcGVkID0gMDsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1dpZHRoID0gLTE7CisgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQgPSAtMTsKKyAgICAgICAgbVN0YXRzLm1GbGFncyA9IDA7CisgICAgICAgIG1TdGF0cy5tVHJhY2tzLmNsZWFyKCk7CisgICAgfQorCiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6bm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpIHsKQEAgLTY0MCwxNSArNjk1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJWQpICwgcGF1c2luZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtMb3dXYXRlck1hcmtCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBDQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIFNFVCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdXNlX2woKTsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2FjaGVJc0ZldGNoaW5nX2woKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlb3MgfHwgY2FjaGVkRGF0YVJlbWFpbmluZyA+IGtIaWdoV2F0ZXJNYXJrQnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBoYXMgZmlsbGVkIHVwICg+ICVkKSwgcmVzdW1pbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hpZ2hXYXRlck1hcmtCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlfbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewpAQCAtNjk4LDE1ICs3NTQsMTYgQEAKICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRHVyYXRpb25VcyA8IGtMb3dXYXRlck1hcmtVcykpIHsKICAgICAgICAgICAgIExPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICglLjJmIHNlY3MpICwgcGF1c2luZy4iLAogICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKLSAgICAgICAgICAgIG1GbGFncyB8PSBDQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBTRVQpOwogICAgICAgICAgICAgcGF1c2VfbCgpOwogICAgICAgICAgICAgZW5zdXJlQ2FjaGVJc0ZldGNoaW5nX2woKTsKKyAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX1NUQVJUKTsKICAgICAgICAgfSBlbHNlIGlmIChlb3MgfHwgY2FjaGVkRHVyYXRpb25VcyA+IGhpZ2hXYXRlck1hcmtVcykgewogICAgICAgICAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7CiAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoJS4yZiBzZWNzKSwgcmVzdW1pbmcuIiwKICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgLyAxRTYpOwotICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKICAgICAgICAgICAgICAgICBwbGF5X2woKTsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewpAQCAtNzIwLDYgKzc3NywxOCBAQAogICAgIHBvc3RCdWZmZXJpbmdFdmVudF9sKCk7CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6c2VuZENhY2hlU3RhdHMoKSB7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwgJiYgbUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3Qga2JwcyA9IDA7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KAorICAgICAgICAgICAgICAgIE1FRElBX0lORk8sIE1FRElBX0lORk9fTkVUV09SS19CQU5EV0lEVEgsIGticHMpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om9uU3RyZWFtRG9uZSgpIHsKICAgICAvLyBQb3N0ZWQgd2hlbmV2ZXIgYW55IHN0cmVhbSBmaW5pc2hlcyBwbGF5aW5nLgogCkBAIC03MzcsNyArODA2LDcgQEAKIAogICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKIAotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOworICAgICAgICBtb2RpZnlGbGFncyhBVF9FT1MsIFNFVCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTc2MSwyMCArODMwLDIwIEBACiAKICAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7CiAKLSAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVRfRU9TLCBTRVQpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGxheSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogCiAgICAgcmV0dXJuIHBsYXlfbCgpOwogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwbGF5X2woKSB7Ci0gICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7CisgICAgbW9kaWZ5RmxhZ3MoU0VFS19QUkVWSUVXLCBDTEVBUik7CiAKICAgICBpZiAobUZsYWdzICYgUExBWUlORykgewogICAgICAgICByZXR1cm4gT0s7CkBAIC03ODgsOCArODU3LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1GbGFncyB8PSBQTEFZSU5HOwotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKKyAgICBtb2RpZnlGbGFncyhQTEFZSU5HLCBTRVQpOworICAgIG1vZGlmeUZsYWdzKEZJUlNUX0ZSQU1FLCBTRVQpOwogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKQEAgLTgxNywxMyArODg2LDE3IEBACiAgICAgICAgIENIRUNLKCEobUZsYWdzICYgQVVESU9fUlVOTklORykpOwogCiAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7CisgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHBvc3QgYW4gZXJyb3Igbm90aWZpY2F0aW9uIGF0IHRoaXMgcG9pbnQsCisgICAgICAgICAgICAvLyB0aGUgZXJyb3IgcmV0dXJuZWQgZnJvbSBNZWRpYVBsYXllcjo6c3RhcnQoKSB3aWxsIHN1ZmZpY2UuCisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXJ0QXVkaW9QbGF5ZXJfbCgKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2VuZEVycm9yTm90aWZpY2F0aW9uICovKTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7CiAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKIAotICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoKFBMQVlJTkcgfCBGSVJTVF9GUkFNRSksIENMRUFSKTsKIAogICAgICAgICAgICAgICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cygKQEAgLTg2Nyw3ICs5NDAsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c3RhcnRBdWRpb1BsYXllcl9sKCkgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c3RhcnRBdWRpb1BsYXllcl9sKGJvb2wgc2VuZEVycm9yTm90aWZpY2F0aW9uKSB7CiAgICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7CiAKICAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKQEAgLTg3NSw3ICs5NDgsOSBAQAogICAgIH0KIAogICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOworICAgICAgICBtb2RpZnlGbGFncyhBVURJT1BMQVlFUl9TVEFSVEVELCBTRVQpOworCisgICAgICAgIGJvb2wgd2FzU2Vla2luZyA9IG1BdWRpb1BsYXllci0+aXNTZWVraW5nKCk7CiAKICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKICAgICAgICAgLy8gdGhlIHByZWZldGNoZXIgdG8gcmVhZCBpdHMgZGF0YS4KQEAgLTg4MywxNCArOTU4LDI0IEBACiAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgIGlmIChzZW5kRXJyb3JOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHdhc1NlZWtpbmcpIHsKKyAgICAgICAgICAgIENIRUNLKCFtQXVkaW9QbGF5ZXItPmlzU2Vla2luZygpKTsKKworICAgICAgICAgICAgLy8gV2Ugd2lsbCBoYXZlIGZpbmlzaGVkIHRoZSBzZWVrIHdoaWxlIHN0YXJ0aW5nIHRoZSBhdWRpbyBwbGF5ZXIuCisgICAgICAgICAgICBwb3N0QXVkaW9TZWVrQ29tcGxldGVfbCgpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKKyAgICBtb2RpZnlGbGFncyhBVURJT19SVU5OSU5HLCBTRVQpOwogCiAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwogCkBAIC05MTcsNiArMTAwMiwxNyBAQAogICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwogICAgIH0KIAorICAgIGludDMyX3QgZGlzcGxheVdpZHRoOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpIHsKKyAgICAgICAgTE9HVigiRGlzcGxheSB3aWR0aCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKKyAgICAgICAgbURpc3BsYXlXaWR0aCA9IGRpc3BsYXlXaWR0aDsKKyAgICB9CisgICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgeworICAgICAgICBMT0dWKCJEaXNwbGF5IGhlaWdodCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlIZWlnaHQsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICBtRGlzcGxheUhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgfQorCiAgICAgaW50MzJfdCB1c2FibGVXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKICAgICBpbnQzMl90IHVzYWJsZUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKICAgICBpZiAobURpc3BsYXlXaWR0aCAhPSAwKSB7CkBAIC05MjYsNiArMTAyMiwxMiBAQAogICAgICAgICB1c2FibGVIZWlnaHQgPSBtRGlzcGxheUhlaWdodDsKICAgICB9CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1dpZHRoID0gdXNhYmxlV2lkdGg7CisgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQgPSB1c2FibGVIZWlnaHQ7CisgICAgfQorCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKCFtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CkBAIC05NjgsNyArMTA3MCw5IEBACiAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKLSAgICBpZiAoVVNFX1NVUkZBQ0VfQUxMT0MgJiYgc3RybmNtcChjb21wb25lbnQsICJPTVguIiwgNCkgPT0gMCkgeworICAgIGlmIChVU0VfU1VSRkFDRV9BTExPQworICAgICAgICAgICAgJiYgIXN0cm5jbXAoY29tcG9uZW50LCAiT01YLiIsIDQpCisgICAgICAgICAgICAmJiBzdHJuY21wKGNvbXBvbmVudCwgIk9NWC5nb29nbGUuIiwgMTEpKSB7CiAgICAgICAgIC8vIEhhcmR3YXJlIGRlY29kZXJzIGF2b2lkIHRoZSBDUFUgY29sb3IgY29udmVyc2lvbiBieSBkZWNvZGluZwogICAgICAgICAvLyBkaXJlY3RseSB0byBBTmF0aXZlQnVmZmVycywgc28gd2UgbXVzdCB1c2UgYSByZW5kZXJlciB0aGF0CiAgICAgICAgIC8vIGp1c3QgcHVzaGVzIHRob3NlIGJ1ZmZlcnMgdG8gdGhlIEFOYXRpdmVXaW5kb3cuCkBAIC05ODYsNyArMTA5MCw3IEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwYXVzZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogCiAgICAgcmV0dXJuIHBhdXNlX2woKTsKIH0KQEAgLTEwMDgsMTAgKzExMTIsMTUgQEAKICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKICAgICAgICAgfQogCi0gICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgQ0xFQVIpOwogICAgIH0KIAotICAgIG1GbGFncyAmPSB+UExBWUlORzsKKyAgICBpZiAobUZsYWdzICYgVEVYVFBMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgIG1UZXh0UGxheWVyLT5wYXVzZSgpOworICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKKyAgICB9CisKKyAgICBtb2RpZnlGbGFncyhQTEFZSU5HLCBDTEVBUik7CiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCkBAIC0xMDM5LDcgKzExNDgsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgbU5hdGl2ZVdpbmRvdyA9IHN1cmZhY2U7CisgICAgc2V0TmF0aXZlV2luZG93X2woc3VyZmFjZSk7CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0U3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiAmc3VyZmFjZVRleHR1cmUpIHsKQEAgLTEwNDcsOSArMTE1Niw1OCBAQAogCiAgICAgbVN1cmZhY2UuY2xlYXIoKTsKICAgICBpZiAoc3VyZmFjZVRleHR1cmUgIT0gTlVMTCkgewotICAgICAgICBtTmF0aXZlV2luZG93ID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN1cmZhY2VUZXh0dXJlKTsKKyAgICAgICAgc2V0TmF0aXZlV2luZG93X2wobmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN1cmZhY2VUZXh0dXJlKSk7CisgICAgfQorfQorCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNodXRkb3duVmlkZW9EZWNvZGVyX2woKSB7CisgICAgaWYgKG1WaWRlb0J1ZmZlcikgeworICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKICAgICB9CiAKKyAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAorICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKKyAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KKyAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOworICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOworICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgdXNsZWVwKDEwMDApOworICAgIH0KKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgTE9HSSgidmlkZW8gZGVjb2RlciBzaHV0ZG93biBjb21wbGV0ZWQiKTsKK30KKwordm9pZCBBd2Vzb21lUGxheWVyOjpzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKSB7CisgICAgbU5hdGl2ZVdpbmRvdyA9IG5hdGl2ZTsKKworICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HSSgiYXR0ZW1wdGluZyB0byByZWNvbmZpZ3VyZSB0byB1c2UgbmV3IHN1cmZhY2UiKTsKKworICAgIGJvb2wgd2FzUGxheWluZyA9IChtRmxhZ3MgJiBQTEFZSU5HKSAhPSAwOworCisgICAgcGF1c2VfbCgpOworICAgIG1WaWRlb1JlbmRlcmVyLmNsZWFyKCk7CisKKyAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7CisKKyAgICBDSEVDS19FUShpbml0VmlkZW9EZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisKKyAgICBpZiAobUxhc3RWaWRlb1RpbWVVcyA+PSAwKSB7CisgICAgICAgIG1TZWVraW5nID0gU0VFSzsKKyAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKKyAgICAgICAgbVNlZWtUaW1lVXMgPSBtTGFzdFZpZGVvVGltZVVzOworICAgICAgICBtb2RpZnlGbGFncygoQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKSwgQ0xFQVIpOworICAgIH0KKworICAgIGlmICh3YXNQbGF5aW5nKSB7CisgICAgICAgIHBsYXlfbCgpOworICAgIH0KIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpzZXRBdWRpb1NpbmsoCkBAIC0xMDYyLDEwICsxMjIwLDEwIEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRMb29waW5nKGJvb2wgc2hvdWxkTG9vcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBtRmxhZ3MgPSBtRmxhZ3MgJiB+TE9PUElORzsKKyAgICBtb2RpZnlGbGFncyhMT09QSU5HLCBDTEVBUik7CiAKICAgICBpZiAoc2hvdWxkTG9vcCkgewotICAgICAgICBtRmxhZ3MgfD0gTE9PUElORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoTE9PUElORywgU0VUKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTExLDYgKzEyNjksMzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW50MzJfdCBpbmRleCkgeworICAgIGlmIChtVGV4dFBsYXllciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7IC8vIHRvIHR1cm4gb24gYSB0ZXh0IHRyYWNrCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVGV4dFBsYXllci0+c2V0VGltZWRUZXh0VHJhY2tJbmRleChpbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVF9SVU5OSU5HLCBTRVQpOworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVFBMQVlFUl9TVEFSVEVELCBTRVQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgeyAvLyB0byB0dXJuIG9mZiB0aGUgdGV4dCB0cmFjayBkaXNwbGF5CisgICAgICAgICAgICBpZiAobUZsYWdzICAmIFRFWFRfUlVOTklORykgeworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRfUlVOTklORywgQ0xFQVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1GbGFncyAgJiBURVhUUExBWUVSX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUUExBWUVSX1NUQVJURUQsIENMRUFSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1UZXh0UGxheWVyLT5zZXRUaW1lZFRleHRUcmFja0luZGV4KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKIC8vIHN0YXRpYwogdm9pZCBBd2Vzb21lUGxheWVyOjpPblJUU1BTZWVrRG9uZVdyYXBwZXIodm9pZCAqY29va2llKSB7CiAgICAgc3RhdGljX2Nhc3Q8QXdlc29tZVBsYXllciAqPihjb29raWUpLT5vblJUU1BTZWVrRG9uZSgpOwpAQCAtMTEyOCw3ICsxMzEyLDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKLSAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKICAgICAgICAgcGxheV9sKCk7CiAgICAgfQogCkBAIC0xMTQzLDEwICsxMzI3LDE0IEBACiAgICAgbVNlZWtpbmcgPSBTRUVLOwogICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwogICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7CisgICAgbW9kaWZ5RmxhZ3MoKEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyksIENMRUFSKTsKIAogICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIAorICAgIGlmIChtRmxhZ3MgJiBURVhUUExBWUVSX1NUQVJURUQpIHsKKyAgICAgICAgbVRleHRQbGF5ZXItPnNlZWtUbyhtU2Vla1RpbWVVcyk7CisgICAgfQorCiAgICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKICAgICAgICAgTE9HVigic2Vla2luZyB3aGlsZSBwYXVzZWQsIHNlbmRpbmcgU0VFS19DT01QTEVURSBub3RpZmljYXRpb24iCiAgICAgICAgICAgICAgIiBpbW1lZGlhdGVseS4iKTsKQEAgLTExNTUsNyArMTM0Myw3IEBACiAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CiAKICAgICAgICAgaWYgKChtRmxhZ3MgJiBQUkVQQVJFRCkgJiYgbVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBTRUVLX1BSRVZJRVc7CisgICAgICAgICAgICBtb2RpZnlGbGFncyhTRUVLX1BSRVZJRVcsIFNFVCk7CiAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTY5LDcgKzEzNTcsNiBAQAogCiAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKIAogICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLApAQCAtMTE4Niw2ICsxMzczLDE3IEBACiAgICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6YWRkVGV4dFNvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lZFRleHRMb2NrKTsKKyAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CisKKyAgICBpZiAobVRleHRQbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBtVGV4dFBsYXllciA9IG5ldyBUaW1lZFRleHRQbGF5ZXIodGhpcywgbUxpc3RlbmVyLCAmbVF1ZXVlKTsKKyAgICB9CisKKyAgICBtVGV4dFBsYXllci0+YWRkVGV4dFNvdXJjZShzb3VyY2UpOworfQorCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjppbml0QXVkaW9EZWNvZGVyKCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpOwogCkBAIC0xMjIzLDYgKzE0MjEsMTkgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9ICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tQXVkaW9UcmFja0luZGV4KTsKKworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnQ7CisgICAgICAgIGlmICghbUF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgIC0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjb21wb25lbnQpKSB7CisgICAgICAgICAgICBjb21wb25lbnQgPSAibm9uZSI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0LT5tRGVjb2Rlck5hbWUgPSBjb21wb25lbnQ7CisgICAgfQorCiAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCkBAIC0xMzAyLDYgKzE1MTMsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgIFRyYWNrU3RhdCAqc3RhdCA9ICZtU3RhdHMubVRyYWNrcy5lZGl0SXRlbUF0KG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KTsKKworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnQ7CisgICAgICAgIENIRUNLKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkKKyAgICAgICAgICAgICAgICAtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmY29tcG9uZW50KSk7CisKKyAgICAgICAgc3RhdC0+bURlY29kZXJOYW1lID0gY29tcG9uZW50OworICAgIH0KKwogICAgIHJldHVybiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIApAQCAtMTMyOCwxMSArMTU1MCwxMSBAQAogICAgICAgICAvLyBJZiB3ZSdyZSBwbGF5aW5nIHZpZGVvIG9ubHksIHJlcG9ydCBzZWVrIGNvbXBsZXRlIG5vdywKICAgICAgICAgLy8gb3RoZXJ3aXNlIGF1ZGlvIHBsYXllciB3aWxsIG5vdGlmeSB1cyBsYXRlci4KICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIFNFVCk7CiAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLApAQCAtMTM3MCw3ICsxNTkyLDcgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgQ0xFQVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5wYXVzZSgpOwogICAgICAgICB9CkBAIC0xNDE5LDcgKzE2NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGFydEF1ZGlvUGxheWVyX2woKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFZJREVPX0FUX0VPUywgU0VUKTsKICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNDM1LDExICsxNjU3LDE4IEBACiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgKyttU3RhdHMubU51bVZpZGVvRnJhbWVzRGVjb2RlZDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCisgICAgbUxhc3RWaWRlb1RpbWVVcyA9IHRpbWVVczsKKwogICAgIGlmIChtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkpIHsKICAgICAgICAgaWYgKG1TZWVrVGltZVVzID4gdGltZVVzKSB7CiAgICAgICAgICAgICBMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzIiwKQEAgLTE0NTgsMTYgKzE2ODcsMjAgQEAKICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwgJiYgIShtRmxhZ3MgJiAoQVVESU9fUlVOTklORyB8IFNFRUtfUFJFVklFVykpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0dFKCJTdGFydHVuZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOworICAgICAgICAgICAgTE9HRSgiU3RhcnRpbmcgdGhlIGF1ZGlvIHBsYXllciBmYWlsZWQgdy8gZXJyICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmICgobUZsYWdzICYgVEVYVFBMQVlFUl9TVEFSVEVEKSAmJiAhKG1GbGFncyAmIChURVhUX1JVTk5JTkcgfCBTRUVLX1BSRVZJRVcpKSkgeworICAgICAgICBtVGV4dFBsYXllci0+cmVzdW1lKCk7CisgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRfUlVOTklORywgU0VUKTsKKyAgICB9CisKICAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7CiAKICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKLSAgICAgICAgbUZsYWdzICY9IH5GSVJTVF9GUkFNRTsKLSAgICAgICAgbVNpbmNlTGFzdERyb3BwZWQgPSAwOworICAgICAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgQ0xFQVIpOwogICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOwogICAgIH0KIApAQCAtMTUxNCwxNyArMTc0NywxOCBAQAogCiAgICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0gICAgICAgICAgICBMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLCBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKLSAgICAgICAgICAgIGlmICggbVNpbmNlTGFzdERyb3BwZWQgPiBGUkFNRV9EUk9QX0ZSRVEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nIG9uZSBhZnRlciAlZCBmcmFtZXMiLCBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2LCBtU2luY2VMYXN0RHJvcHBlZCk7Ci0gICAgICAgICAgICAgICAgbVNpbmNlTGFzdERyb3BwZWQgPSAwOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcyksIGRyb3BwaW5nIGZyYW1lIiwKKyAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CisgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgICAgICAgICArK21TdGF0cy5tTnVtVmlkZW9GcmFtZXNEcm9wcGVkOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0xMDAwMCkgewpAQCAtMTU0Miw3ICsxNzc2LDYgQEAKICAgICB9CiAKICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICBtU2luY2VMYXN0RHJvcHBlZCsrOwogICAgICAgICBtVmlkZW9SZW5kZXJlci0+cmVuZGVyKG1WaWRlb0J1ZmZlcik7CiAgICAgfQogCkBAIC0xNTUwLDcgKzE3ODMsNyBAQAogICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAKICAgICBpZiAod2FzU2Vla2luZyAhPSBOT19TRUVLICYmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOworICAgICAgICBtb2RpZnlGbGFncyhTRUVLX1BSRVZJRVcsIENMRUFSKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTU5MiwxMiArMTgyNSwxMiBAQAogICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvTGFnRXZlbnQsIDEwMDAwMDBsbCk7CiB9CiAKLXZvaWQgQXdlc29tZVBsYXllcjo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCkgewordm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7CiAgICAgaWYgKG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZykgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IHRydWU7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudChtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50KTsKKyAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQsIGRlbGF5VXMpOwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om9uQ2hlY2tBdWRpb1N0YXR1cygpIHsKQEAgLTE2MjQsOCArMTg1Nyw4IEBACiAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CiAgICAgaWYgKG1XYXRjaEZvckF1ZGlvRU9TICYmIG1BdWRpb1BsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7CiAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gZmFsc2U7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fQVRfRU9TLCBTRVQpOworICAgICAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgU0VUKTsKICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGZpbmFsU3RhdHVzKTsKICAgICB9CiB9CkBAIC0xNjc5LDcgKzE5MTIsNyBAQAogICAgICAgICBtUXVldWVTdGFydGVkID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOworICAgIG1vZGlmeUZsYWdzKFBSRVBBUklORywgU0VUKTsKICAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBuZXcgQXdlc29tZUV2ZW50KAogICAgICAgICAgICAgdGhpcywgJkF3ZXNvbWVQbGF5ZXI6Om9uUHJlcGFyZUFzeW5jRXZlbnQpOwogCkBAIC0xNzA0LDggKzE5MzcsMTQgQEAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCBtVXJpLnN0cmluZygpLCA4KQogICAgICAgICAgICAgfHwgaXNXaWRldmluZVN0cmVhbWluZykgewotICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgICAobUZsYWdzICYgSU5DT0dOSVRPKSA/IE51SFRUUERhdGFTb3VyY2U6OmtGbGFnSW5jb2duaXRvIDogMCk7CisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IEhUVFBCYXNlOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgKG1GbGFncyAmIElOQ09HTklUTykKKyAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KKyAgICAgICAgICAgICAgICAgICAgOiAwKTsKKworICAgICAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmNvbm5lY3QobVVyaSwgJm1VcmlIZWFkZXJzKTsKQEAgLTE3MzYsMzQgKzE5NzUsNDggQEAKIAogICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UuY2xlYXIoKTsKIAotICAgICAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisKKyAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IGRhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKGNvbnRlbnRUeXBlLnN0cmluZygpLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKKyAgICAgICAgICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKKyAgICAgICAgICAgIC8vIHBsYXlpbmcgYmFjayBmYWlybHkgaW5zdGFudGx5LgorCiAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBwcmVmaWxsIHRoZSBjYWNoZSBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlCiAgICAgICAgICAgICAvLyB0aGUgZXh0cmFjdG9yIGJlbG93LCBhcyB0aGUgbGF0dGVyIGlzIGFuIG9wZXJhdGlvbiB0aGF0IG90aGVyd2lzZQogICAgICAgICAgICAgLy8gY291bGQgYmxvY2sgb24gdGhlIGRhdGFzb3VyY2UgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCiAgICAgICAgICAgICAvLyBEdXJpbmcgdGhhdCB0aW1lIHdlJ2QgYmUgdW5hYmxlIHRvIGFib3J0IHRoZSBwcmVwYXJhdGlvbiBwaGFzZQogICAgICAgICAgICAgLy8gd2l0aG91dCB0aGlzIHByZWZpbGwuCisgICAgICAgICAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gcHJlZmlsbCB0aGUgY2FjaGUgYmVmb3JlIHRyeWluZyB0byBpbnN0YW50aWF0ZQorICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0b3IgYmVsb3csIGFzIHRoZSBsYXR0ZXIgaXMgYW4gb3BlcmF0aW9uIHRoYXQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy8gY291bGQgYmxvY2sgb24gdGhlIGRhdGFzb3VyY2UgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCisgICAgICAgICAgICAgICAgLy8gRHVyaW5nIHRoYXQgdGltZSB3ZSdkIGJlIHVuYWJsZSB0byBhYm9ydCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKKyAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMgcHJlZmlsbC4KIAotICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sgfHwgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBrSGlnaFdhdGVyTWFya0J5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sgfHwgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBrSGlnaFdhdGVyTWFya0J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1c2xlZXAoMjAwMDAwKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB1c2xlZXAoMjAwMDAwKTsKKyAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgewotICAgICAgICAgICAgTE9HSSgiUHJlcGFyZSBjYW5jZWxsZWQgd2hpbGUgd2FpdGluZyBmb3IgaW5pdGlhbCBjYWNoZSBmaWxsLiIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJQcmVwYXJlIGNhbmNlbGxlZCB3aGlsZSB3YWl0aW5nIGZvciBpbml0aWFsIGNhY2hlIGZpbGwuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgicnRzcDovLyIsIG1Vcmkuc3RyaW5nKCksIDcpKSB7CiAgICAgICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKQEAgLTE3NzQsNiArMjAyNywxMCBAQAogICAgICAgICBtUlRTUENvbnRyb2xsZXIgPSBuZXcgQVJUU1BDb250cm9sbGVyKG1Mb29wZXIpOwogICAgICAgICBtQ29ubmVjdGluZ1JUU1BDb250cm9sbGVyID0gbVJUU1BDb250cm9sbGVyOwogCisgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW5nUlRTUENvbnRyb2xsZXItPnNldFVJRChtVUlEKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtUlRTUENvbnRyb2xsZXItPmNvbm5lY3QobVVyaS5zdHJpbmcoKSk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKQEAgLTE4MjIsNyArMjA3OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKCZtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBkYXRhU291cmNlLT5nZXREcm1JbmZvKG1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOworCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOwogICAgICAgICBpZiAoUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgewpAQCAtMTg0OSw3ICsyMTA3LDcgQEAKICAgICB9CiAKICAgICBtUHJlcGFyZVJlc3VsdCA9IGVycjsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7CisgICAgbW9kaWZ5RmxhZ3MoKFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKSwgQ0xFQVIpOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CiAgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwogfQpAQCAtMTg5Nyw3ICsyMTU1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1GbGFncyB8PSBQUkVQQVJJTkdfQ09OTkVDVEVEOworICAgIG1vZGlmeUZsYWdzKFBSRVBBUklOR19DT05ORUNURUQsIFNFVCk7CiAKICAgICBpZiAoaXNTdHJlYW1pbmdIVFRQKCkgfHwgbVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKICAgICAgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKQEAgLTE5MTgsOCArMjE3Niw4IEBACiAgICAgfQogCiAgICAgbVByZXBhcmVSZXN1bHQgPSBPSzsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7Ci0gICAgbUZsYWdzIHw9IFBSRVBBUkVEOworICAgIG1vZGlmeUZsYWdzKChQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCksIENMRUFSKTsKKyAgICBtb2RpZnlGbGFncyhQUkVQQVJFRCwgU0VUKTsKICAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwogICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKIH0KQEAgLTE5MjgsMTYgKzIxODYsMTQ5IEBACiAgICAgcmV0dXJuIG1FeHRyYWN0b3JGbGFnczsKIH0KIAotdm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0QXVkaW9FT1MoKSB7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7Cit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChkZWxheVVzKTsKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0QXVkaW9TZWVrQ29tcGxldGUoKSB7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBwb3N0QXVkaW9TZWVrQ29tcGxldGVfbCgpOworfQorCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RBdWRpb1NlZWtDb21wbGV0ZV9sKCkgeworICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgwIC8qIGRlbGF5VXMgKi8pOworfQorCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgY2FzZSBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVg6CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZWRUZXh0TG9jayk7CisgICAgICAgICAgICByZXR1cm4gc2V0VGltZWRUZXh0VHJhY2tJbmRleChyZXF1ZXN0LnJlYWRJbnQzMigpKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9BRERfT1VUX09GX0JBTkRfU09VUkNFOgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVkVGV4dExvY2spOworICAgICAgICAgICAgaWYgKG1UZXh0UGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtVGV4dFBsYXllciA9IG5ldyBUaW1lZFRleHRQbGF5ZXIodGhpcywgbUxpc3RlbmVyLCAmbVF1ZXVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1UZXh0UGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShyZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBmcmVxTXMgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICBMT0dEKCJSZXF1ZXN0IHRvIGtlZXAgY2FjaGUgc3RhdHMgaW4gdGhlIHBhc3QgJWQgbXMiLAorICAgICAgICAgICAgZnJlcU1zKTsKKyAgICAgICAgcmV0dXJuIG1DYWNoZWRTb3VyY2UtPnNldENhY2hlU3RhdENvbGxlY3RGcmVxKGZyZXFNcyk7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9BVURJT19DSEFOTkVMX0NPVU5UOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjayA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICFtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGJvb2wgQXdlc29tZVBsYXllcjo6aXNTdHJlYW1pbmdIVFRQKCkgY29uc3QgewogICAgIHJldHVybiBtQ2FjaGVkU291cmNlICE9IE5VTEwgfHwgbVdWTUV4dHJhY3RvciAhPSBOVUxMOwogfQogCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKworICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworCisgICAgZnByaW50ZihvdXQsICIgQXdlc29tZVBsYXllclxuIik7CisgICAgaWYgKG1TdGF0cy5tRmQgPCAwKSB7CisgICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoJXMpIiwgbVN0YXRzLm1VUkkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYob3V0LCAiICBmZCglZCkiLCBtU3RhdHMubUZkKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKG91dCwgIiwgZmxhZ3MoMHglMDh4KSIsIG1TdGF0cy5tRmxhZ3MpOworCisgICAgaWYgKG1TdGF0cy5tQml0cmF0ZSA+PSAwKSB7CisgICAgICAgIGZwcmludGYob3V0LCAiLCBiaXRyYXRlKCVsbGQgYnBzKSIsIG1TdGF0cy5tQml0cmF0ZSk7CisgICAgfQorCisgICAgZnByaW50ZihvdXQsICJcbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RhdHMubVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUcmFja1N0YXQgJnN0YXQgPSBtU3RhdHMubVRyYWNrcy5pdGVtQXQoaSk7CisKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFRyYWNrICVkXG4iLCBpICsgMSk7CisgICAgICAgIGZwcmludGYob3V0LCAiICAgTUlNRSglcykiLCBzdGF0Lm1NSU1FLnN0cmluZygpKTsKKworICAgICAgICBpZiAoIXN0YXQubURlY29kZXJOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIsIGRlY29kZXIoJXMpIiwgc3RhdC5tRGVjb2Rlck5hbWUuc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgZnByaW50ZihvdXQsICJcbiIpOworCisgICAgICAgIGlmICgoc3NpemVfdClpID09IG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAgICAgICAgICAgIiAgIHZpZGVvRGltZW5zaW9ucyglZCB4ICVkKSwgIgorICAgICAgICAgICAgICAgICAgICAibnVtVmlkZW9GcmFtZXNEZWNvZGVkKCVsbGQpLCAiCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEcm9wcGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZjbG9zZShvdXQpOworICAgIG91dCA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6bW9kaWZ5RmxhZ3ModW5zaWduZWQgdmFsdWUsIEZsYWdNb2RlIG1vZGUpIHsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBTRVQ6CisgICAgICAgICAgICBtRmxhZ3MgfD0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTEVBUjoKKyAgICAgICAgICAgIG1GbGFncyAmPSB+dmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgICAgICBtRmxhZ3MgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GbGFncyA9IG1GbGFnczsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDhhMjRiYzQuLmVhOGVhYTQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0zNyw3ICszNyw4IEBACiAgICAgQ2FtZXJhU291cmNlTGlzdGVuZXIoY29uc3Qgc3A8Q2FtZXJhU291cmNlPiAmc291cmNlKTsKIAogICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7Ci0gICAgdmlydHVhbCB2b2lkIHBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIpOworICAgIHZpcnR1YWwgdm9pZCBwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwogCiAgICAgdmlydHVhbCB2b2lkIHBvc3REYXRhVGltZXN0YW1wKAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOwpAQCAtNjMsNyArNjQsOCBAQAogICAgIExPR1YoIm5vdGlmeSglZCwgJWQsICVkKSIsIG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwogfQogCi12b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyKSB7Cit2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7CiAgICAgTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolZCkiLAogICAgICAgICAgbXNnVHlwZSwgZGF0YVB0ci0+cG9pbnRlcigpLCBkYXRhUHRyLT5zaXplKCkpOwogCkBAIC0xMDMsNiArMTA1LDEwIEBACiAgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKICAgICB9CiAKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgIk9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIikpIHsKKyAgICAgICByZXR1cm4gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI7CisgICAgfQorCiAgICAgTE9HRSgiVWtub3duIGNvbG9yIGZvcm1hdCAoJXMpLCBwbGVhc2UgYWRkIGl0IHRvICIKICAgICAgICAgICJDYW1lcmFTb3VyY2U6OmdldENvbG9yRm9ybWF0IiwgY29sb3JGb3JtYXQpOwogCkBAIC0xMTUsMTkgKzEyMSwyMCBAQAogICAgIHNpemUuaGVpZ2h0ID0gLTE7CiAKICAgICBzcDxJQ2FtZXJhPiBjYW1lcmE7Ci0gICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2UoY2FtZXJhLCAwLCBzaXplLCAtMSwgTlVMTCwgZmFsc2UpOworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlKGNhbWVyYSwgTlVMTCwgMCwgc2l6ZSwgLTEsIE5VTEwsIGZhbHNlKTsKIH0KIAogLy8gc3RhdGljCiBDYW1lcmFTb3VyY2UgKkNhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYSgKICAgICBjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAogICAgIGludDMyX3QgY2FtZXJhSWQsCiAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgaW50MzJfdCBmcmFtZVJhdGUsCiAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCiAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpIHsKIAotICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gbmV3IENhbWVyYVNvdXJjZShjYW1lcmEsIGNhbWVyYUlkLAorICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gbmV3IENhbWVyYVNvdXJjZShjYW1lcmEsIHByb3h5LCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgdmlkZW9TaXplLCBmcmFtZVJhdGUsIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CiAgICAgcmV0dXJuIHNvdXJjZTsKQEAgLTEzNSw2ICsxNDIsNyBAQAogCiBDYW1lcmFTb3VyY2U6OkNhbWVyYVNvdXJjZSgKICAgICBjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAorICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAogICAgIGludDMyX3QgY2FtZXJhSWQsCiAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgaW50MzJfdCBmcmFtZVJhdGUsCkBAIC0xNTMsMTMgKzE2MSwxMyBAQAogICAgICAgbU51bUdsaXRjaGVzKDApLAogICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMoMjAwMDAwKSwKICAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpIHsKLQogICAgIG1WaWRlb1NpemUud2lkdGggID0gLTE7CiAgICAgbVZpZGVvU2l6ZS5oZWlnaHQgPSAtMTsKIAotICAgIG1Jbml0Q2hlY2sgPSBpbml0KGNhbWVyYSwgY2FtZXJhSWQsCisgICAgbUluaXRDaGVjayA9IGluaXQoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgZnJhbWVSYXRlLAogICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSByZWxlYXNlQ2FtZXJhKCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewpAQCAtMTY3LDI0ICsxNzUsMjkgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjppc0NhbWVyYUF2YWlsYWJsZSgKLSAgICBjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLCBpbnQzMl90IGNhbWVyYUlkKSB7CisgICAgY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCisgICAgaW50MzJfdCBjYW1lcmFJZCkgewogCiAgICAgaWYgKGNhbWVyYSA9PSAwKSB7CiAgICAgICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QoY2FtZXJhSWQpOworICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSByZXR1cm4gLUVCVVNZOwogICAgICAgICBtQ2FtZXJhRmxhZ3MgJj0gfkZMQUdTX0hPVF9DQU1FUkE7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgZ2V0IHRoZSBwcm94eSBmcm9tIENhbWVyYSwgbm90IElDYW1lcmEuIFdlIG5lZWQgdG8gZ2V0IHRoZSBwcm94eQorICAgICAgICAvLyB0byB0aGUgcmVtb3RlIENhbWVyYSBvd25lZCBieSB0aGUgYXBwbGljYXRpb24uIEhlcmUgbUNhbWVyYSBpcyBhCisgICAgICAgIC8vIGxvY2FsIENhbWVyYSBvYmplY3QgY3JlYXRlZCBieSB1cy4gV2UgY2Fubm90IHVzZSB0aGUgcHJveHkgZnJvbQorICAgICAgICAvLyBtQ2FtZXJhIGhlcmUuCiAgICAgICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNyZWF0ZShjYW1lcmEpOworICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSByZXR1cm4gLUVCVVNZOworICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHkgPSBwcm94eTsKICAgICAgICAgbUNhbWVyYUZsYWdzIHw9IEZMQUdTX0hPVF9DQU1FUkE7CisgICAgICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKKyAgICAgICAgLy8gaXNCaW5kZXJBbGl2ZSBuZWVkcyBsaW5rVG9EZWF0aCB0byB3b3JrLgorICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKICAgICB9CiAKLSAgICAvLyBJcyBjYW1lcmEgYXZhaWxhYmxlPwotICAgIGlmIChtQ2FtZXJhID09IDApIHsKLSAgICAgICAgTE9HRSgiQ2FtZXJhIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFibGlzaGVkLiIpOwotICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLSAgICBpZiAoIShtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSkgewotICAgICAgICBtQ2FtZXJhLT5sb2NrKCk7Ci0gICAgfQorICAgIG1DYW1lcmEtPmxvY2soKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjc4LDcgKzI5MSw3IEBACiAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMqIHBhcmFtcywKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKSB7Ci0KKyAgICBMT0dWKCJjb25maWd1cmVDYW1lcmEiKTsKICAgICBWZWN0b3I8U2l6ZT4gc2l6ZXM7CiAgICAgYm9vbCBpc1NldFZpZGVvU2l6ZVN1cHBvcnRlZEJ5Q2FtZXJhID0gdHJ1ZTsKICAgICBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKCpwYXJhbXMsICZpc1NldFZpZGVvU2l6ZVN1cHBvcnRlZEJ5Q2FtZXJhLCBzaXplcyk7CkBAIC0yODYsNyArMjk5LDYgQEAKICAgICBpZiAod2lkdGggIT0gLTEgJiYgaGVpZ2h0ICE9IC0xKSB7CiAgICAgICAgIGlmICghaXNWaWRlb1NpemVTdXBwb3J0ZWQod2lkdGgsIGhlaWdodCwgc2l6ZXMpKSB7CiAgICAgICAgICAgICBMT0dFKCJWaWRlbyBkaW1lbnNpb24gKCVkeCVkKSBpcyB1bnN1cHBvcnRlZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWRCeUNhbWVyYSkgewpAQCAtMzAwLDcgKzMxMiw2IEBACiAgICAgICAgIC8vIElmIG9uZSBhbmQgb25seSBvbmUgb2YgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaXMgLTEKICAgICAgICAgLy8gd2UgcmVqZWN0IHN1Y2ggYSByZXF1ZXN0LgogICAgICAgICBMT0dFKCJSZXF1ZXN0ZWQgdmlkZW8gc2l6ZSAoJWR4JWQpIGlzIG5vdCBzdXBwb3J0ZWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0gZWxzZSB7ICAvLyB3aWR0aCA9PSAtMSAmJiBoZWlnaHQgPT0gLTEKICAgICAgICAgLy8gRG8gbm90IGNvbmZpZ3VyZSB0aGUgY2FtZXJhLgpAQCAtMzE4LDcgKzMyOSw2IEBACiAgICAgICAgIGlmIChzdHJzdHIoc3VwcG9ydGVkRnJhbWVSYXRlcywgYnVmKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBMT0dFKCJSZXF1ZXN0ZWQgZnJhbWUgcmF0ZSAoJWQpIGlzIG5vdCBzdXBwb3J0ZWQ6ICVzIiwKICAgICAgICAgICAgICAgICBmcmFtZVJhdGUsIHN1cHBvcnRlZEZyYW1lUmF0ZXMpOwotICAgICAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC0zNTcsNiArMzY3LDcgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewogCisgICAgTE9HVigiY2hlY2tWaWRlb1NpemUiKTsKICAgICAvLyBUaGUgYWN0dWFsIHZpZGVvIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpZXcgc2l6ZQogICAgIC8vIGlmIHRoZSBjYW1lcmEgaGFsIGRvZXMgbm90IHN1cHBvcnQgc2VwYXJhdGUgdmlkZW8gYW5kCiAgICAgLy8gcHJldmlldyBvdXRwdXQuIEluIHRoaXMgY2FzZSwgd2UgcmV0cmlldmUgdGhlIHZpZGVvCkBAIC00MDgsNiArNDE5LDcgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSkgewogCisgICAgTE9HVigiY2hlY2tGcmFtZVJhdGUiKTsKICAgICBpbnQzMl90IGZyYW1lUmF0ZUFjdHVhbCA9IHBhcmFtcy5nZXRQcmV2aWV3RnJhbWVSYXRlKCk7CiAgICAgaWYgKGZyYW1lUmF0ZUFjdHVhbCA8IDApIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHByZXZpZXcgZnJhbWUgcmF0ZSAoJWQpIiwgZnJhbWVSYXRlQWN0dWFsKTsKQEAgLTQ0NywxNSArNDU5LDM0IEBACiAgKi8KIHN0YXR1c190IENhbWVyYVNvdXJjZTo6aW5pdCgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSwKICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpIHsKIAorICAgIExPR1YoImluaXQiKTsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBlcnIgPSBpbml0V2l0aENhbWVyYUFjY2VzcyhjYW1lcmEsIHByb3h5LCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIGZyYW1lUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBlcnI7Cit9CiAKLSAgICBpZiAoKGVyciAgPSBpc0NhbWVyYUF2YWlsYWJsZShjYW1lcmEsIGNhbWVyYUlkKSkgIT0gT0spIHsKK3N0YXR1c190IENhbWVyYVNvdXJjZTo6aW5pdFdpdGhDYW1lcmFBY2Nlc3MoCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAorICAgICAgICBpbnQzMl90IGNhbWVyYUlkLAorICAgICAgICBTaXplIHZpZGVvU2l6ZSwKKyAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCisgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgTE9HVigiaW5pdFdpdGhDYW1lcmFBY2Nlc3MiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmICgoZXJyID0gaXNDYW1lcmFBdmFpbGFibGUoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICBMT0dFKCJDYW1lcmEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuIik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKSk7CkBAIC00OTQsOCArNTI1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotCiAgICAgaW50NjRfdCBnbGl0Y2hEdXJhdGlvblVzID0gKDEwMDAwMDBMTCAvIG1WaWRlb0ZyYW1lUmF0ZSk7CiAgICAgaWYgKGdsaXRjaER1cmF0aW9uVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgewogICAgICAgICBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcyA9IGdsaXRjaER1cmF0aW9uVXM7CkBAIC01MTcsMTUgKzU0NiwzNCBAQAogQ2FtZXJhU291cmNlOjp+Q2FtZXJhU291cmNlKCkgewogICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICBzdG9wKCk7CisgICAgfSBlbHNlIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIC8vIENhbWVyYSBpcyBpbml0aWFsaXplZCBidXQgYmVjYXVzZSBzdGFydCgpIGlzIG5ldmVyIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIGxvY2sgb24gQ2FtZXJhIGlzIG5ldmVyIHJlbGVhc2VkKCkuIFRoaXMgbWFrZXMgc3VyZQorICAgICAgICAvLyBDYW1lcmEncyBsb2NrIGlzIHJlbGVhc2VkIGluIHRoaXMgY2FzZS4KKyAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgewotICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKLSAgICBDSEVDSyhtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpOworICAgIExPR1YoInN0YXJ0Q2FtZXJhUmVjb3JkaW5nIik7CisgICAgLy8gUmVzZXQgdGhlIGlkZW50aXR5IHRvIHRoZSBjdXJyZW50IHRocmVhZCBiZWNhdXNlIG1lZGlhIHNlcnZlciBvd25zIHRoZQorICAgIC8vIGNhbWVyYSBhbmQgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQgYnkgdGhlIGFwcGxpY2F0aW9ucy4gVGhlIGFwcGxpY2F0aW9ucworICAgIC8vIHdpbGwgY29ubmVjdCB0byB0aGUgY2FtZXJhIGluIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcuCisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaWYgKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpIHsKKyAgICAgICAgbUNhbWVyYS0+dW5sb2NrKCk7CisgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKKyAgICAgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcobmV3IFByb3h5TGlzdGVuZXIodGhpcykpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOworICAgICAgICBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpOworICAgICAgICBDSEVDSyhtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpOworICAgIH0KKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgeworICAgIExPR1YoInN0YXJ0Iik7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICBMT0dFKCJDYW1lcmFTb3VyY2UgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwpAQCAtNTQ0LDMxICs1OTIsNDAgQEAKICAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CiAgICAgfQogCi0gICAgLy8gQ2FsbCBzZXRMaXN0ZW5lciBmaXJzdCBiZWZvcmUgY2FsbGluZyBzdGFydENhbWVyYVJlY29yZGluZygpCi0gICAgLy8gdG8gYXZvaWQgcmVjb3JkaW5nIGZyYW1lcyBiZWluZyBkcm9wcGVkLgotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKG5ldyBDYW1lcmFTb3VyY2VMaXN0ZW5lcih0aGlzKSk7CiAgICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgewotICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwotICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICBMT0dWKCJzdG9wQ2FtZXJhUmVjb3JkaW5nIik7CisgICAgaWYgKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpIHsKKyAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5zdG9wUmVjb3JkaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlQ2FtZXJhKCkgewogICAgIExPR1YoInJlbGVhc2VDYW1lcmEiKTsKLSAgICBpZiAoKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpID09IDApIHsKLSAgICAgICAgTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOwotICAgICAgICBtQ2FtZXJhLT5zdG9wUHJldmlldygpOworICAgIGlmIChtQ2FtZXJhICE9IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIGlmICgobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMCkgeworICAgICAgICAgICAgTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOworICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIG1DYW1lcmEtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKKyAgICAgICAgbUNhbWVyYS5jbGVhcigpOworICAgICAgICBtQ2FtZXJhID0gMDsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQotICAgIG1DYW1lcmEtPnVubG9jaygpOwotICAgIG1DYW1lcmEuY2xlYXIoKTsKLSAgICBtQ2FtZXJhID0gMDsKKyAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKKyAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LmNsZWFyKCk7CisgICAgfQogICAgIG1DYW1lcmFGbGFncyA9IDA7CiB9CiAKQEAgLTU3OCw3ICs2MzUsNiBAQAogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7CiAgICAgICAgIGlmIChOT19FUlJPUiAhPQpAQCAtNTg5LDcgKzY0NSw2IEBACiAgICAgfQogICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKICAgICByZWxlYXNlQ2FtZXJhKCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICBpZiAobUNvbGxlY3RTdGF0cykgewogICAgICAgICBMT0dJKCJGcmFtZXMgcmVjZWl2ZWQvZW5jb2RlZC9kcm9wcGVkOiAlZC8lZC8lZCBpbiAlbGxkIHVzIiwKQEAgLTYwNyw4ICs2NjIsMTMgQEAKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKLSAgICBpZiAobUNhbWVyYSAhPSBOVUxMKSB7CisgICAgTE9HVigicmVsZWFzZVJlY29yZGluZ0ZyYW1lIik7CisgICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSBOVUxMKSB7CisgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQogfQogCkBAIC02MjcsOSArNjg3LDcgQEAKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewpAQCAtNjY5LDcgKzcyNywxMiBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgbUZyYW1lc1JlY2VpdmVkLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPQotICAgICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIDMwMDAwMDAwMDBMTCkpIHsKKyAgICAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLCAxMDAwMDAwMDAwTEwpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPmlzQmluZGVyQWxpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJjYW1lcmEgcmVjb3JkaW5nIHByb3h5IGlzIGdvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbmNvbWluZyBjYW1lcmEgdmlkZW8gZnJhbWVzOiAlbGxkIHVzIiwKICAgICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgIH0KQEAgLTcwMSwxMiArNzY0LDExIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID4gMCAmJgotICAgICAgICB0aW1lc3RhbXBVcyAtIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA+IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKSB7Ci0gICAgICAgIGlmIChtTnVtR2xpdGNoZXMgJSAxMCA9PSAwKSB7ICAvLyBEb24ndCBzcGFtIHRoZSBsb2cKLSAgICAgICAgICAgIExPR1YoIkxvbmcgZGVsYXkgZGV0ZWN0ZWQgaW4gdmlkZW8gcmVjb3JkaW5nIik7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDApIHsKKyAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPiBtTGFzdEZyYW1lVGltZXN0YW1wVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgeworICAgICAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgICAgIH0KLSAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgfQogCiAgICAgLy8gTWF5IG5lZWQgdG8gc2tpcCBmcmFtZSBvciBtb2RpZnkgdGltZXN0YW1wLiBDdXJyZW50bHkgaW1wbGVtZW50ZWQKQEAgLTczMiw2ICs3OTQsNyBAQAogICAgIH0KICAgICArK21OdW1GcmFtZXNSZWNlaXZlZDsKIAorICAgIENIRUNLKGRhdGEgIT0gTlVMTCAmJiBkYXRhLT5zaXplKCkgPiAwKTsKICAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOwogICAgIGludDY0X3QgdGltZVVzID0gbVN0YXJ0VGltZVVzICsgKHRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOwogICAgIG1GcmFtZVRpbWVzLnB1c2hfYmFjayh0aW1lVXMpOwpAQCAtNzQwLDMxICs4MDMsMjIgQEAKICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiB9CiAKLXNpemVfdCBDYW1lcmFTb3VyY2U6OmdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3QgewotICAgIExPR1YoImdldE51bWJlck9mVmlkZW9CdWZmZXJzIik7Ci0gICAgc2l6ZV90IG5CdWZmZXJzID0gMDsKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICBpZiAobUluaXRDaGVjayA9PSBPSyAmJiBtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgbkJ1ZmZlcnMgPSBtQ2FtZXJhLT5nZXROdW1iZXJPZlZpZGVvQnVmZmVycygpOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICByZXR1cm4gbkJ1ZmZlcnM7Ci19Ci0KLXNwPElNZW1vcnk+IENhbWVyYVNvdXJjZTo6Z2V0VmlkZW9CdWZmZXIoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgTE9HVigiZ2V0VmlkZW9CdWZmZXI6ICVkIiwgaW5kZXgpOwotICAgIHNwPElNZW1vcnk+IGJ1ZmZlciA9IDA7Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0sgJiYgbUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgIGJ1ZmZlciA9IG1DYW1lcmEtPmdldFZpZGVvQnVmZmVyKGluZGV4KTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQogYm9vbCBDYW1lcmFTb3VyY2U6OmlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0IHsKICAgICBMT0dWKCJpc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMiKTsKICAgICByZXR1cm4gbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVyczsKIH0KIAorQ2FtZXJhU291cmNlOjpQcm94eUxpc3RlbmVyOjpQcm94eUxpc3RlbmVyKGNvbnN0IHNwPENhbWVyYVNvdXJjZT4mIHNvdXJjZSkgeworICAgIG1Tb3VyY2UgPSBzb3VyY2U7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlOjpQcm94eUxpc3RlbmVyOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKSB7CisgICAgbVNvdXJjZS0+ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcCAvIDEwMDAsIG1zZ1R5cGUsIGRhdGFQdHIpOworfQorCit2b2lkIENhbWVyYVNvdXJjZTo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgTE9HSSgiQ2FtZXJhIHJlY29yZGluZyBwcm94eSBkaWVkIik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAppbmRleCAzNjg5NTU3Li4xYmE3OWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTI0LDIxICsyNCwxNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLSNpbmNsdWRlIDxsaW1pdHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+ICZwcm94eSwKICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKICAgICAgICAgU2l6ZSB2aWRlb1NpemUsCiAgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUsCkBAIC00Niw3ICs0Miw3IEBACiAgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgewogCiAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBuZXcKLSAgICAgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjYW1lcmEsIGNhbWVyYUlkLAorICAgICAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgdmlkZW9GcmFtZVJhdGUsIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CiAKQEAgLTYxLDMxICs1NywyNiBAQAogCiBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKICAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKQotICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSwgY2FtZXJhSWQsIHZpZGVvU2l6ZSwgdmlkZW9GcmFtZVJhdGUsIHN1cmZhY2UsIHRydWUpLAorICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLCB2aWRlb1NpemUsIHZpZGVvRnJhbWVSYXRlLCBzdXJmYWNlLCB0cnVlKSwKICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpLAogICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVcygxRTYvdmlkZW9GcmFtZVJhdGUpLAogICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcygwKSwKICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lKGZhbHNlKSB7CiAKLSAgICBMT0dEKCJzdGFydGluZyB0aW1lIGxhcHNlIG1vZGU6ICVsbGQgdXMiLCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgTE9HRCgic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlOiAlbGxkIHVzIiwKKyAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworCiAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1NpemUud2lkdGg7CiAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9TaXplLmhlaWdodDsKIAotICAgIGlmICh0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKLSAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVE9ETzogQWRkIGEgY2hlY2sgdG8gc2VlIHRoYXQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgaXMgZ3JlYXRlcgotICAgICAgICAvLyB0aGFuIHRoZSBmYXN0ZXN0IHJhdGUgYXQgd2hpY2ggdGhlIHN0aWxsIGNhbWVyYSBjYW4gdGFrZSBwaWN0dXJlcy4KLSAgICAgICAgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlID0gdHJ1ZTsKLSAgICAgICAgQ0hFQ0soc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQodmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0KSk7Ci0gICAgICAgIG1OZWVkQ3JvcHBpbmcgPSBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOwotICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB2aWRlb1NpemUud2lkdGgpOwotICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgdmlkZW9TaXplLmhlaWdodCk7CisgICAgaWYgKCF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgfQogCiAgICAgLy8gSW5pdGlhbGl6ZSBxdWljayBzdG9wIHZhcmlhYmxlcy4KQEAgLTk5LDI0ICs5MCwyMiBAQAogfQogCiB2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RhcnRRdWlja1JlYWRSZXR1cm5zKCkgeworICAgIExPR1YoInN0YXJ0UXVpY2tSZWFkUmV0dXJucyIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7Ci0gICAgTE9HVigiRW5hYmxpbmcgcXVpY2sgcmVhZCByZXR1cm5zIik7CiAKICAgICAvLyBFbmFibGUgcXVpY2sgc3RvcCBtb2RlLgogICAgIG1RdWlja1N0b3AgPSB0cnVlOwogCi0gICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgewotICAgICAgICAvLyB3YWtlIHVwIHRoZSB0aHJlYWQgcmlnaHQgYXdheS4KLSAgICAgICAgbVRha2VQaWN0dXJlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEZvcmNlIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGNvbWluZyBmcm9tIHRoZSB2aWRlbyBjYW1lcmEgdG8gbm90IHNraXAgdGhlCi0gICAgICAgIC8vIG5leHQgZnJhbWUgYXMgd2Ugd2FudCByZWFkKCkgdG8gZ2V0IGEgZ2V0IGEgZnJhbWUgcmlnaHQgYXdheS4KLSAgICAgICAgbUZvcmNlUmVhZCA9IHRydWU7Ci0gICAgfQorICAgIC8vIEZvcmNlIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGNvbWluZyBmcm9tIHRoZSB2aWRlbyBjYW1lcmEgdG8KKyAgICAvLyBub3Qgc2tpcCB0aGUgbmV4dCBmcmFtZSBhcyB3ZSB3YW50IHJlYWQoKSB0byBnZXQgYSBnZXQgYSBmcmFtZQorICAgIC8vIHJpZ2h0IGF3YXkuCisgICAgbUZvcmNlUmVhZCA9IHRydWU7CiB9CiAKLWJvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0cnlTZXR0aW5nVmlkZW9TaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgTE9HVigidHJ5U2V0dGluZ1ZpZGVvU2l6ZTogJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0cnlTZXR0aW5nVmlkZW9TaXplKAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworCisgICAgTE9HVigidHJ5U2V0dGluZ1ZpZGVvU2l6ZSIpOwogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKIApAQCAtMTYwLDUzICsxNDksOCBAQAogICAgIHJldHVybiBpc1N1Y2Nlc3NmdWw7CiB9CiAKLWJvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotICAgIExPR1YoInNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkOiAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLQotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOwotICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRTaXplczsKLSAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKHN1cHBvcnRlZFNpemVzKTsKLQotICAgIGludDMyX3QgbWluUGljdHVyZVNpemUgPSBJTlRfTUFYOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgewotICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOwotICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7Ci0KLSAgICAgICAgaWYgKChwaWN0dXJlV2lkdGggPj0gd2lkdGgpICYmIChwaWN0dXJlSGVpZ2h0ID49IGhlaWdodCkpIHsKLSAgICAgICAgICAgIGludDMyX3QgcGljdHVyZVNpemUgPSBwaWN0dXJlV2lkdGgqcGljdHVyZUhlaWdodDsKLSAgICAgICAgICAgIGlmIChwaWN0dXJlU2l6ZSA8IG1pblBpY3R1cmVTaXplKSB7Ci0gICAgICAgICAgICAgICAgbWluUGljdHVyZVNpemUgPSBwaWN0dXJlU2l6ZTsKLSAgICAgICAgICAgICAgICBtUGljdHVyZVdpZHRoID0gcGljdHVyZVdpZHRoOwotICAgICAgICAgICAgICAgIG1QaWN0dXJlSGVpZ2h0ID0gcGljdHVyZUhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dWKCJQaWN0dXJlIHNpemUgPSAoJWQsICVkKSIsIG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0KTsKLSAgICByZXR1cm4gKG1pblBpY3R1cmVTaXplICE9IElOVF9NQVgpOwotfQotCi1ib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y29tcHV0ZUNyb3BSZWN0YW5nbGVPZmZzZXQoKSB7Ci0gICAgaWYgKChtUGljdHVyZVdpZHRoID09IG1WaWRlb1dpZHRoKSAmJiAobVBpY3R1cmVIZWlnaHQgPT0gbVZpZGVvSGVpZ2h0KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0soKG1QaWN0dXJlV2lkdGggPiBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID4gbVZpZGVvSGVpZ2h0KSk7Ci0KLSAgICBpbnQzMl90IHdpZHRoRGlmZmVyZW5jZSA9IG1QaWN0dXJlV2lkdGggLSBtVmlkZW9XaWR0aDsKLSAgICBpbnQzMl90IGhlaWdodERpZmZlcmVuY2UgPSBtUGljdHVyZUhlaWdodCAtIG1WaWRlb0hlaWdodDsKLQotICAgIG1Dcm9wUmVjdFN0YXJ0WCA9IHdpZHRoRGlmZmVyZW5jZS8yOwotICAgIG1Dcm9wUmVjdFN0YXJ0WSA9IGhlaWdodERpZmZlcmVuY2UvMjsKLQotICAgIExPR1YoInNldHRpbmcgY3JvcCByZWN0YW5nbGUgb2Zmc2V0IHRvICglZCwgJWQpIiwgbUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIHZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKSB7CisgICAgTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOwogICAgIGlmIChtUXVpY2tTdG9wICYmIChidWZmZXIgPT0gbUxhc3RSZWFkQnVmZmVyQ29weSkpIHsKICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKQEAgLTIxNiw3ICsxNjAsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KGNvbnN0IE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIsIGludDY0X3QgZnJhbWVUaW1lLCBNZWRpYUJ1ZmZlciAqKm5ld0J1ZmZlcikgewordm9pZCBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoCisgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIsCisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lLAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm5ld0J1ZmZlcikgeworCisgICAgTE9HVigiY3JlYXRlTWVkaWFCdWZmZXJDb3B5Iik7CiAgICAgc2l6ZV90IHNvdXJjZVNpemUgPSBzb3VyY2VCdWZmZXIuc2l6ZSgpOwogICAgIHZvaWQqIHNvdXJjZVBvaW50ZXIgPSBzb3VyY2VCdWZmZXIuZGF0YSgpOwogCkBAIC0yMjcsNiArMTc2LDcgQEAKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkoTWVkaWFCdWZmZXImIHNvdXJjZUJ1ZmZlcikgeworICAgIExPR1YoImZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkiKTsKICAgICBpbnQ2NF90IGZyYW1lVGltZTsKICAgICBDSEVDSyhzb3VyY2VCdWZmZXIubWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSkpOwogICAgIGNyZWF0ZU1lZGlhQnVmZmVyQ29weShzb3VyY2VCdWZmZXIsIGZyYW1lVGltZSwgJm1MYXN0UmVhZEJ1ZmZlckNvcHkpOwpAQCAtMjM2LDExICsxODYsMTIgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBMT0dWKCJyZWFkIik7CiAgICAgaWYgKG1MYXN0UmVhZEJ1ZmZlckNvcHkgPT0gTlVMTCkgewogICAgICAgICBtTGFzdFJlYWRTdGF0dXMgPSBDYW1lcmFTb3VyY2U6OnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKIAotICAgICAgICAvLyBtUXVpY2tTdG9wIG1heSBoYXZlIHR1cm5lZCB0byB0cnVlIHdoaWxlIHJlYWQgd2FzIGJsb2NrZWQuIE1ha2UgYSBjb3B5IG9mCi0gICAgICAgIC8vIHRoZSBidWZmZXIgaW4gdGhhdCBjYXNlLgorICAgICAgICAvLyBtUXVpY2tTdG9wIG1heSBoYXZlIHR1cm5lZCB0byB0cnVlIHdoaWxlIHJlYWQgd2FzIGJsb2NrZWQuCisgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBidWZmZXIgaW4gdGhhdCBjYXNlLgogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOwogICAgICAgICBpZiAobVF1aWNrU3RvcCAmJiAqYnVmZmVyKSB7CiAgICAgICAgICAgICBmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KCoqYnVmZmVyKTsKQEAgLTI1MywxMDcgKzIwNCwxOSBAQAogICAgIH0KIH0KIAotLy8gc3RhdGljCi12b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpIHsKLSAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7Ci0gICAgc291cmNlLT50aHJlYWRUaW1lTGFwc2VFbnRyeSgpOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dGhyZWFkVGltZUxhcHNlRW50cnkoKSB7Ci0gICAgd2hpbGUgKG1TdGFydGVkKSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOwotICAgICAgICAgICAgaWYgKCFtQ2FtZXJhSWRsZSkgewotICAgICAgICAgICAgICAgIG1DYW1lcmFJZGxlQ29uZGl0aW9uLndhaXQobUNhbWVyYUlkbGVMb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLKG1DYW1lcmFJZGxlKTsKLSAgICAgICAgICAgIG1DYW1lcmFJZGxlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFdmVuIGlmIG1RdWlja1N0b3AgPT0gdHJ1ZSB3ZSBuZWVkIHRvIHRha2Ugb25lIG1vcmUgcGljdHVyZQotICAgICAgICAvLyBhcyBhIHJlYWQoKSBtYXkgYmUgYmxvY2tlZCwgd2FpdGluZyBmb3IgYSBmcmFtZSB0byBnZXQgYXZhaWxhYmxlLgotICAgICAgICAvLyBBZnRlciB0aGlzIHRha2VQaWN0dXJlLCBpZiBtUXVpY2tTdG9wID09IHRydWUsIHdlIGNhbiBzYWZlbHkgZXhpdAotICAgICAgICAvLyB0aGlzIHRocmVhZCBhcyByZWFkKCkgd2lsbCBtYWtlIGEgY29weSBvZiB0aGlzIGxhc3QgZnJhbWUgYW5kIGtlZXAKLSAgICAgICAgLy8gcmV0dXJuaW5nIGl0IGluIHRoZSBxdWljayBzdG9wIG1vZGUuCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7Ci0gICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT50YWtlUGljdHVyZShDQU1FUkFfTVNHX1JBV19JTUFHRSkpOwotICAgICAgICBpZiAobVF1aWNrU3RvcCkgewotICAgICAgICAgICAgTE9HVigidGhyZWFkVGltZUxhcHNlRW50cnk6IEV4aXRpbmcgZHVlIHRvIG1RdWlja1N0b3AgPSB0cnVlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVRha2VQaWN0dXJlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtUXVpY2tTdG9wTG9jaywKLSAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyAqIDEwMDApOwotICAgIH0KLSAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogRXhpdGluZyBkdWUgdG8gbVN0YXJ0ZWQgPSBmYWxzZSIpOwotfQotCi12b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7Ci0gICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgewotICAgICAgICBMT0dWKCJzdGFydCB0aW1lIGxhcHNlIHJlY29yZGluZyB1c2luZyBzdGlsbCBjYW1lcmEiKTsKLQotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOwotCi0gICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOwotICAgICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUobVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOwotICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOwotICAgICAgICBtQ2FtZXJhSWRsZSA9IHRydWU7Ci0gICAgICAgIG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmEgPSBmYWxzZTsKLQotICAgICAgICAvLyBkaXNhYmxlIHNodXR0ZXIgc291bmQgYW5kIHBsYXkgdGhlIHJlY29yZGluZyBzb3VuZC4KLSAgICAgICAgbUNhbWVyYS0+c2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCwgMCwgMCk7Ci0gICAgICAgIG1DYW1lcmEtPnNlbmRDb21tYW5kKENBTUVSQV9DTURfUExBWV9SRUNPUkRJTkdfU09VTkQsIDAsIDApOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSB0aHJlYWQgd2hpY2ggdGFrZXMgcGljdHVyZXMgaW4gYSBsb29wCi0gICAgICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7Ci0gICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKLSAgICAgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0KLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRUaW1lTGFwc2UsICZhdHRyLCBUaHJlYWRUaW1lTGFwc2VXcmFwcGVyLCB0aGlzKTsKLSAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHZpZGVvIGNhbWVyYSIpOwotICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7Ci0gICAgfQotfQotCiB2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKLSAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7Ci0gICAgICAgIHZvaWQgKmR1bW15OwotICAgICAgICBwdGhyZWFkX2pvaW4obVRocmVhZFRpbWVMYXBzZSwgJmR1bW15KTsKLQotICAgICAgICAvLyBMYXN0IHRha2VQaWN0dXJlIG1heSBzdGlsbCBiZSB1bmRlcndheS4gV2FpdCBmb3IgdGhlIGNhbWVyYSB0byBnZXQKLSAgICAgICAgLy8gaWRsZS4KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1DYW1lcmFJZGxlTG9jayk7Ci0gICAgICAgIG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmEgPSB0cnVlOwotICAgICAgICBpZiAoIW1DYW1lcmFJZGxlKSB7Ci0gICAgICAgICAgICBtQ2FtZXJhSWRsZUNvbmRpdGlvbi53YWl0KG1DYW1lcmFJZGxlTG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0hFQ0sobUNhbWVyYUlkbGUpOwotICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihOVUxMKTsKLQotICAgICAgICAvLyBwbGF5IHRoZSByZWNvcmRpbmcgc291bmQuCi0gICAgICAgIG1DYW1lcmEtPnNlbmRDb21tYW5kKENBTUVSQV9DTURfUExBWV9SRUNPUkRJTkdfU09VTkQsIDAsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOwotICAgICAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7Ci0gICAgfQorICAgIExPR1YoInN0b3BDYW1lcmFSZWNvcmRpbmciKTsKKyAgICBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKICAgICBpZiAobUxhc3RSZWFkQnVmZmVyQ29weSkgewogICAgICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5yZWxlYXNlKCk7CiAgICAgICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHkgPSBOVUxMOwogICAgIH0KIH0KIAotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKLSAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSAmJgotICAgICAgICBtQ2FtZXJhICE9IE5VTEwpIHsKLSAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKLSAgICB9Ci19CitzcDxJTWVtb3J5PiBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNyZWF0ZUlNZW1vcnlDb3B5KAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKIAotc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKKyAgICBMT0dWKCJjcmVhdGVJTWVtb3J5Q29weSIpOwogICAgIHNpemVfdCBzb3VyY2Vfc2l6ZSA9IHNvdXJjZV9kYXRhLT5zaXplKCk7CiAgICAgdm9pZCogc291cmNlX3BvaW50ZXIgPSBzb3VyY2VfZGF0YS0+cG9pbnRlcigpOwogCkBAIC0zNjMsMTAyICsyMjYsOCBAQAogICAgIHJldHVybiBuZXdNZW1vcnk7CiB9CiAKLS8vIEFsbG9jYXRlcyBJTWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZSB3aXRoIHRoZSBnaXZlbiBzaXplLgotc3A8SU1lbW9yeT4gYWxsb2NhdGVJTWVtb3J5KHNpemVfdCBzaXplKSB7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IG5ld01lbW9yeUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSk7Ci0gICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc2l6ZSk7Ci0gICAgcmV0dXJuIG5ld01lbW9yeTsKLX0KLQotLy8gc3RhdGljCi12b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIodm9pZCAqbWUpIHsKLSAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7Ci0gICAgc291cmNlLT50aHJlYWRTdGFydFByZXZpZXcoKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFN0YXJ0UHJldmlldygpIHsKLSAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQ2FtZXJhSWRsZUxvY2spOwotICAgIG1DYW1lcmFJZGxlID0gdHJ1ZTsKLSAgICBtQ2FtZXJhSWRsZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlc3RhcnRQcmV2aWV3KCkgewotICAgIC8vIFN0YXJ0IHRoaXMgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLCBzbyB0aGF0IHRoZSBkYXRhQ2FsbGJhY2sgY2FuIHJldHVybgotICAgIExPR1YoInJlc3RhcnRQcmV2aWV3Iik7Ci0gICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0KLSAgICBwdGhyZWFkX3QgdGhyZWFkUHJldmlldzsKLSAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkUHJldmlldywgJmF0dHIsIFRocmVhZFN0YXJ0UHJldmlld1dyYXBwZXIsIHRoaXMpOwotICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKLX0KLQotc3A8SU1lbW9yeT4gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7Ci0gICAgLy8gZmluZCB0aGUgWVVWIGZvcm1hdAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmc3JjRm9ybWF0KSk7Ci0gICAgWVVWSW1hZ2U6OllVVkZvcm1hdCB5dXZGb3JtYXQ7Ci0gICAgaWYgKHNyY0Zvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewotICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwU2VtaVBsYW5hcjsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUShzcmNGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOwotICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOwotICAgIH0KLQotICAgIC8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgY3JvcHBlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMgdXNpbmcgaXQuCi0gICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlTWVtb3J5ID0gYWxsb2NhdGVJTWVtb3J5KAotICAgICAgICAgICAgWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7Ci0gICAgWVVWSW1hZ2UgeXV2SW1hZ2VDcm9wcGVkKHl1dkZvcm1hdCwKLSAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAodWludDhfdCAqKWNyb3BwZWRJbWFnZU1lbW9yeS0+cG9pbnRlcigpKTsKLSAgICBZVVZDYW52YXMgeXV2Q2FudmFzQ3JvcCh5dXZJbWFnZUNyb3BwZWQpOwotCi0gICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAotICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQsCi0gICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZV9kYXRhLT5wb2ludGVyKCkpOwotICAgIHl1dkNhbnZhc0Nyb3AuQ29weUltYWdlUmVjdCgKLSAgICAgICAgICAgIFJlY3QobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFksCi0gICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRYICsgbVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRZICsgbVZpZGVvSGVpZ2h0KSwKLSAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7Ci0KLSAgICByZXR1cm4gY3JvcHBlZEltYWdlTWVtb3J5OwotfQotCi12b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKLSAgICBpZiAobXNnVHlwZSA9PSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpIHsKLSAgICAgICAgLy8gdGFrZVBpY3R1cmUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGlzIGNhbGxiYWNrLCBzbyByZXN0YXJ0IHByZXZpZXcuCi0gICAgICAgIHJlc3RhcnRQcmV2aWV3KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1zZ1R5cGUgIT0gQ0FNRVJBX01TR19SQVdfSU1BR0UpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIExPR1YoImRhdGFDYWxsYmFjayBmb3IgdGltZWxhcHNlIHN0aWxsIGZyYW1lIik7Ci0gICAgQ0hFQ0tfRVEodHJ1ZSwgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKTsKLQotICAgIGludDY0X3QgdGltZXN0YW1wVXM7Ci0gICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7Ci0gICAgICAgIHRpbWVzdGFtcFVzID0gbVN0YXJ0VGltZVVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKLSAgICB9Ci0KLSAgICBpZiAobU5lZWRDcm9wcGluZykgewotICAgICAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VEYXRhID0gY3JvcFlVVkltYWdlKGRhdGEpOwotICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGNyb3BwZWRJbWFnZURhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPElNZW1vcnk+IGRhdGFDb3B5ID0gY3JlYXRlSU1lbW9yeUNvcHkoZGF0YSk7Ci0gICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YUNvcHkpOwotICAgIH0KLX0KLQogYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIExPR1YoInNraXBDdXJyZW50RnJhbWUiKTsKICAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKICAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC00NjgsNzEgKzIzNyw1OCBAQAogfQogCiBib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7Ci0gICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKLSAgICAgICAgaWYgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPT0gMCkgewotICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBsYXBzZSBmcmFtZS4gSW5pdGlhbGl6ZSBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzCi0gICAgICAgICAgICAvLyB0byBjdXJyZW50IHRpbWUgKHRpbWVzdGFtcFVzKSBhbmQgc2F2ZSBmcmFtZSBkYXRhLgotICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogaW5pdGlhbCBmcmFtZSIpOworICAgIExPR1YoInNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCIpOworICAgIGlmIChtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID09IDApIHsKKyAgICAgICAgLy8gRmlyc3QgdGltZSBsYXBzZSBmcmFtZS4gSW5pdGlhbGl6ZSBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzCisgICAgICAgIC8vIHRvIGN1cnJlbnQgdGltZSAodGltZXN0YW1wVXMpIGFuZCBzYXZlIGZyYW1lIGRhdGEuCisgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGluaXRpYWwgZnJhbWUiKTsKIAotICAgICAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKKworICAgICAgICAvLyBtRm9yY2VSZWFkIG1heSBiZSBzZXQgdG8gdHJ1ZSBieSBzdGFydFF1aWNrUmVhZFJldHVybnMoKS4gSW4gdGhhdAorICAgICAgICAvLyBjYXNlIGRvbid0IHNraXAgdGhpcyBmcmFtZS4KKyAgICAgICAgaWYgKG1Gb3JjZVJlYWQpIHsKKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGZvcmNlZCByZWFkIik7CisgICAgICAgICAgICBtRm9yY2VSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAqdGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKKyAgICAvLyBXb3JrYXJvdW5kIHRvIGJ5cGFzcyB0aGUgZmlyc3QgMiBpbnB1dCBmcmFtZXMgZm9yIHNraXBwaW5nLgorICAgIC8vIFRoZSBmaXJzdCAyIG91dHB1dCBmcmFtZXMgZnJvbSB0aGUgZW5jb2RlciBhcmU6IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBhbmQKKyAgICAvLyB0aGUgY29tcHJlc3NlZCB2aWRlbyBmcmFtZSBkYXRhIGZvciB0aGUgZmlyc3QgaW5wdXQgdmlkZW8gZnJhbWUuCisgICAgaWYgKG1OdW1GcmFtZXNFbmNvZGVkID49IDEgJiYgKnRpbWVzdGFtcFVzIDwKKyAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKKyAgICAgICAgLy8gU2tpcCBhbGwgZnJhbWVzIGZyb20gbGFzdCBlbmNvZGVkIGZyYW1lIHVudGlsCisgICAgICAgIC8vIHN1ZmZpY2llbnQgdGltZSAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpIGhhcyBwYXNzZWQuCisgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KKyAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogc2tpcHBpbmcgaW50ZXJtZWRpYXRlIGZyYW1lIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc2lyZWQgZnJhbWUgaGFzIGFycml2ZWQgYWZ0ZXIgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdGltZToKKyAgICAgICAgLy8gLSBSZXNldCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzIHRvIGN1cnJlbnQgdGltZS4KKyAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKKyAgICAgICAgLy8gb2YgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSdzIHRpbWUgc3RhbXAuCisgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGdvdCB0aW1lbGFwc2UgZnJhbWUiKTsKIAotICAgICAgICAgICAgLy8gbUZvcmNlUmVhZCBtYXkgYmUgc2V0IHRvIHRydWUgYnkgc3RhcnRRdWlja1JlYWRSZXR1cm5zKCkuIEluIHRoYXQKLSAgICAgICAgICAgIC8vIGNhc2UgZG9uJ3Qgc2tpcCB0aGlzIGZyYW1lLgotICAgICAgICAgICAgaWYgKG1Gb3JjZVJlYWQpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBmb3JjZWQgcmVhZCIpOwotICAgICAgICAgICAgICAgIG1Gb3JjZVJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXM7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV29ya2Fyb3VuZCB0byBieXBhc3MgdGhlIGZpcnN0IDIgaW5wdXQgZnJhbWVzIGZvciBza2lwcGluZy4KLSAgICAgICAgLy8gVGhlIGZpcnN0IDIgb3V0cHV0IGZyYW1lcyBmcm9tIHRoZSBlbmNvZGVyIGFyZTogZGVjb2RlciBzcGVjaWZpYyBpbmZvIGFuZAotICAgICAgICAvLyB0aGUgY29tcHJlc3NlZCB2aWRlbyBmcmFtZSBkYXRhIGZvciB0aGUgZmlyc3QgaW5wdXQgdmlkZW8gZnJhbWUuCi0gICAgICAgIGlmIChtTnVtRnJhbWVzRW5jb2RlZCA+PSAxICYmICp0aW1lc3RhbXBVcyA8Ci0gICAgICAgICAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKLSAgICAgICAgICAgIC8vIFNraXAgYWxsIGZyYW1lcyBmcm9tIGxhc3QgZW5jb2RlZCBmcmFtZSB1bnRpbAotICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgaGFzIHBhc3NlZC4KLSAgICAgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KLSAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IHNraXBwaW5nIGludGVybWVkaWF0ZSBmcmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBEZXNpcmVkIGZyYW1lIGhhcyBhcnJpdmVkIGFmdGVyIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHRpbWU6Ci0gICAgICAgICAgICAvLyAtIFJlc2V0IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgdG8gY3VycmVudCB0aW1lLgotICAgICAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKLSAgICAgICAgICAgIC8vIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLgotICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZ290IHRpbWVsYXBzZSBmcmFtZSIpOwotCi0gICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOwotICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICAqdGltZXN0YW1wVXMgPSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7Ci0gICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKCZ0aW1lc3RhbXBVcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1DYW1lcmFJZGxlTG9jayk7Ci0gICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyB0aGUgc3RpbGwgY2FtZXJhIGFuZCBzdG9wKCkgaGFzIGJlZW4gY2FsbGVkLCBpdCBtYXkKLSAgICAgICAgLy8gYmUgd2FpdGluZyBmb3IgdGhlIGNhbWVyYSB0byBnZXQgaWRsZS4gSW4gdGhhdCBjYXNlIHJldHVybgotICAgICAgICAvLyBpbW1lZGlhdGVseS4gQ2FsbGluZyBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHdpbGwgbGVhZAotICAgICAgICAvLyB0byBhIGRlYWRsb2NrIHNpbmNlIGl0IHRyaWVzIHRvIGFjY2VzcyBDYW1lcmFTb3VyY2U6Om1Mb2NrIHdoaWNoIGluCi0gICAgICAgIC8vIHRoaXMgY2FzZSBpcyBoZWxkIGJ5IENhbWVyYVNvdXJjZTo6c3RvcCgpIGN1cnJlbnRseSB3YWl0aW5nIGZvciB0aGUKLSAgICAgICAgLy8gY2FtZXJhIHRvIGdldCBpZGxlLiBBbmQgY2FtZXJhIHdpbGwgbm90IGdldCBpZGxlIHVudGlsIHRoaXMgY2FsbAotICAgICAgICAvLyByZXR1cm5zLgotICAgICAgICBpZiAobVN0b3BXYWl0aW5nRm9ySWRsZUNhbWVyYSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQorICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCIpOworICAgIG1Ta2lwQ3VycmVudEZyYW1lID0gc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKCZ0aW1lc3RhbXBVcyk7CiAgICAgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGRhdGEpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcAppbmRleCA2ZGI5MjJlLi4xZjNkNTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EUk1FeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAKQEAgLTQxLDcgKzQxLDcgQEAKIGNsYXNzIERSTVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgRFJNU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmbWVkaWFTb3VyY2UsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlICpkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptYW5hZ2VyQ2xpZW50LAogICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkLCBEcm1CdWZmZXIgKmlwbXBCb3gpOwogCkBAIC01Niw3ICs1Niw3IEBACiAKIHByaXZhdGU6CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1PcmlnaW5hbE1lZGlhU291cmNlOwotICAgIERlY3J5cHRIYW5kbGUqIG1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQqIG1Ecm1NYW5hZ2VyQ2xpZW50OwogICAgIHNpemVfdCBtVHJhY2tJZDsKICAgICBtdXRhYmxlIE11dGV4IG1EUk1Mb2NrOwpAQCAtNzAsNyArNzAsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogRFJNU291cmNlOjpEUk1Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZtZWRpYVNvdXJjZSwKLSAgICAgICAgRGVjcnlwdEhhbmRsZSAqZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4gJmRlY3J5cHRIYW5kbGUsCiAgICAgICAgIERybU1hbmFnZXJDbGllbnQgKm1hbmFnZXJDbGllbnQsCiAgICAgICAgIGludDMyX3QgdHJhY2tJZCwgRHJtQnVmZmVyICppcG1wQm94KQogICAgIDogbU9yaWdpbmFsTWVkaWFTb3VyY2UobWVkaWFTb3VyY2UpLApAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgbU9yaWdpbmFsRXh0cmFjdG9yLT5zZXREcm1GbGFnKHRydWUpOwogICAgIG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKS0+c2V0SW50MzIoa0tleUlzRFJNLCAxKTsKIAotICAgIHNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgc291cmNlLT5nZXREcm1JbmZvKG1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOwogfQogCiBEUk1FeHRyYWN0b3I6On5EUk1FeHRyYWN0b3IoKSB7CkBAIC0yNzcsNyArMjc3LDcgQEAKIGJvb2wgU25pZmZEUk0oCiAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIERlY3J5cHRIYW5kbGUgKmRlY3J5cHRIYW5kbGUgPSBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKCk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gZGVjcnlwdEhhbmRsZSA9IHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24oKTsKIAogICAgIGlmIChkZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID09IERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggM2IzODIwOC4uYzE2YjNiNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTE1LDEzICsxNSwxNCBAQAogICovCiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCIKQEAgLTExMSw2ICsxMTIsNyBAQAogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QRUcyVFMpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QMyk7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmQUFDKTsKKyAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZBVkkpOwogCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoImRybS5zZXJ2aWNlLmVuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKQEAgLTEyNyw3ICsxMjksNyBAQAogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkgKyA3KTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgIHNwPE51SFRUUERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZTsKKyAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKCk7CiAgICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xNDQsNCArMTQ2LDggQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitTdHJpbmc4IERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKaW5kZXggYjdjOGUwYy4uMWY3ZWUyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkVTRFMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtODcsNiArOTEsOCBAQAogICAgIH0KICAgICB3aGlsZSAobW9yZSk7CiAKKyAgICBMT0dWKCJ0YWc9MHglMDJ4IGRhdGFfc2l6ZT0lZCIsICp0YWcsICpkYXRhX3NpemUpOworCiAgICAgaWYgKCpkYXRhX3NpemUgPiBzaXplKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQpAQCAtMTQ2LDggKzE1MiwyMCBAQAogICAgIGlmIChPQ1JzdHJlYW1GbGFnKSB7CiAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgaWYgKChvZmZzZXQgPj0gc2l6ZSB8fCBtRGF0YVtvZmZzZXRdICE9IGtUYWdfRGVjb2RlckNvbmZpZ0Rlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IC0gMiA8IHNpemUKKyAgICAgICAgICAgICAgICAmJiBtRGF0YVtvZmZzZXQgLSAyXSA9PSBrVGFnX0RlY29kZXJDb25maWdEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAvLyBDb250ZW50IGZvdW5kICJpbiB0aGUgd2lsZCIgaGFkIE9DUnN0cmVhbUZsYWcgc2V0IGJ1dCB3YXMKKyAgICAgICAgICAgIC8vIG1pc3NpbmcgT0NSX0VTX0lkLCB0aGUgZGVjb2RlciBjb25maWcgZGVzY3JpcHRvciBpbW1lZGlhdGVseQorICAgICAgICAgICAgLy8gZm9sbG93ZWQgaW5zdGVhZC4KKyAgICAgICAgICAgIG9mZnNldCAtPSAyOworICAgICAgICAgICAgc2l6ZSArPSAyOworCisgICAgICAgICAgICBMT0dXKCJGb3VuZCBtYWxmb3JtZWQgJ2VzZHMnIGF0b20sIGlnbm9yaW5nIG1pc3NpbmcgT0NSX0VTX0lkLiIpOworICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgaWYgKG9mZnNldCA+PSBzaXplKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCAwMmE3OGM5Li5mMmYzNTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1EZWNyeXB0SGFuZGxlKiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKK3NwPERlY3J5cHRIYW5kbGU+IEZpbGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKCkgewogICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CiAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKICAgICB9CkBAIC0xNDcsOCArMTQ3LDggQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLXZvaWQgRmlsZVNvdXJjZTo6Z2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgKmhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwordm9pZCBGaWxlU291cmNlOjpnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKIAogICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ4NTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIVFRQQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKworI2lmIENIUk9NSVVNX0FWQUlMQUJMRQorI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0hUVFBCYXNlOjpIVFRQQmFzZSgpCisgICAgOiBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAorICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCisgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAorICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzKDApLAorICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzKDApLAorICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCksCisgICAgICBtVUlEVmFsaWQoZmFsc2UpIHsKK30KKworLy8gc3RhdGljCitzcDxIVFRQQmFzZT4gSFRUUEJhc2U6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgeworI2lmIENIUk9NSVVNX0FWQUlMQUJMRQorICAgICAgICByZXR1cm4gbmV3IENocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOworI2VuZGlmCisgICAgeworICAgICAgICBUUkVTUEFTUygpOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKwordm9pZCBIVFRQQmFzZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoCisgICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIEJhbmR3aWR0aEVudHJ5IGVudHJ5OworICAgIGVudHJ5Lm1EZWxheVVzID0gZGVsYXlVczsKKyAgICBlbnRyeS5tTnVtQnl0ZXMgPSBudW1CeXRlczsKKyAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyArPSBkZWxheVVzOworICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKz0gbnVtQnl0ZXM7CisKKyAgICBtQmFuZHdpZHRoSGlzdG9yeS5wdXNoX2JhY2soZW50cnkpOworICAgIGlmICgrK21OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPiAxMDApIHsKKyAgICAgICAgQmFuZHdpZHRoRW50cnkgKmVudHJ5ID0gJiptQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpOworICAgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyAtPSBlbnRyeS0+bURlbGF5VXM7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMgLT0gZW50cnktPm1OdW1CeXRlczsKKyAgICAgICAgbUJhbmR3aWR0aEhpc3RvcnkuZXJhc2UobUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKSk7CisgICAgICAgIC0tbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKKworICAgICAgICBpbnQ2NF90IHRpbWVOb3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGlmICh0aW1lTm93VXMgLSBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgPj0KKyAgICAgICAgICAgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyAqIDEwMDBMTCkgeworCisgICAgICAgICAgICBpZiAobVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMgPQorICAgICAgICAgICAgICAgICAgICAobVRvdGFsVHJhbnNmZXJCeXRlcyAqIDhFMyAvIG1Ub3RhbFRyYW5zZmVyVGltZVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyA9IHRpbWVOb3dVczsKKyAgICAgICAgfQorICAgIH0KKworfQorCitib29sIEhUVFBCYXNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEhUVFBCYXNlOjpnZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGludDMyX3QgKmticHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICprYnBzID0gbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSFRUUEJhc2U6OnNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoZnJlcU1zIDwga01pbkJhbmR3aWR0aENvbGxlY3RGcmVxTXMKKyAgICAgICAgICAgIHx8IGZyZXFNcyA+IGtNYXhCYW5kd2lkdGhDb2xsZWN0RnJlcU1zKSB7CisKKyAgICAgICAgTE9HRSgiZnJlcXVlbmN5ICglZCBtcykgaXMgb3V0IG9mIHJhbmdlIFsxMDAwLCA2MDAwMF0iLCBmcmVxTXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIExPR0koImZyZXF1ZW5jeSBzZXQgdG8gJWQgbXMiLCBmcmVxTXMpOworICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zID0gZnJlcU1zOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIVFRQQmFzZTo6c2V0VUlEKHVpZF90IHVpZCkgeworICAgIG1VSURWYWxpZCA9IHRydWU7CisgICAgbVVJRCA9IHVpZDsKK30KKworYm9vbCBIVFRQQmFzZTo6Z2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0IHsKKyAgICBpZiAoIW1VSURWYWxpZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnVpZCA9IG1VSUQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCit2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXIoaW50IHMsIHVpZF90IHVpZCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGFnID0gMHhkZWFkYmVlZjsKKyAgICBzZXRfcXRhZ3VpZChzLCBrVGFnLCB1aWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUFN0cmVhbS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1NmRhNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJIVFRQU3RyZWFtIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQU3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLWNvbnN0IGNoYXIgKkhUVFBTdHJlYW06OmtTdGF0dXNLZXkgPSAiOnN0YXR1czoiOyAgLy8gTVVTVCBiZSBsb3dlcmNhc2UuCi0KLUhUVFBTdHJlYW06OkhUVFBTdHJlYW0oKQotICAgIDogbVN0YXRlKFJFQURZKSwKLSAgICAgIG1Tb2NrZXQoLTEpLAotICAgICAgbVNTTENvbnRleHQoTlVMTCksCi0gICAgICBtU1NMKE5VTEwpIHsKLX0KLQotSFRUUFN0cmVhbTo6fkhUVFBTdHJlYW0oKSB7Ci0gICAgZGlzY29ubmVjdCgpOwotCi0gICAgaWYgKG1TU0xDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgU1NMX0NUWF9mcmVlKChTU0xfQ1RYICopbVNTTENvbnRleHQpOwotICAgICAgICBtU1NMQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbCBNYWtlU29ja2V0QmxvY2tpbmcoaW50IHMsIGJvb2wgYmxvY2tpbmcpIHsKLSAgICAvLyBNYWtlIHNvY2tldCBub24tYmxvY2tpbmcuCi0gICAgaW50IGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCk7Ci0gICAgaWYgKGZsYWdzID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoYmxvY2tpbmcpIHsKLSAgICAgICAgZmxhZ3MgJj0gfk9fTk9OQkxPQ0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmNudGwocywgRl9TRVRGTCwgZmxhZ3MpICE9IC0xOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgTXlDb25uZWN0KAotICAgICAgICBpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikgewotICAgIHN0YXR1c190IHJlc3VsdCA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBNYWtlU29ja2V0QmxvY2tpbmcocywgZmFsc2UpOwotCi0gICAgaWYgKGNvbm5lY3QocywgYWRkciwgYWRkcmxlbikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBPSzsKLSAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVJTlBST0dSRVNTKSB7Ci0gICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBmZF9zZXQgcnMsIHdzOwotICAgICAgICAgICAgRkRfWkVSTygmcnMpOwotICAgICAgICAgICAgRkRfWkVSTygmd3MpOwotICAgICAgICAgICAgRkRfU0VUKHMsICZycyk7Ci0gICAgICAgICAgICBGRF9TRVQocywgJndzKTsKLQotICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgICAgICB0di50dl9zZWMgPSAwOwotICAgICAgICAgICAgdHYudHZfdXNlYyA9IDEwMDAwMGxsOwotCi0gICAgICAgICAgICBpbnQgbmZkcyA9IDo6c2VsZWN0KHMgKyAxLCAmcnMsICZ3cywgTlVMTCwgJnR2KTsKLQotICAgICAgICAgICAgaWYgKG5mZHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZ3cykgJiYgIUZEX0lTU0VUKHMsICZycykpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBPSzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykgfHwgRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGVuZGluZyBlcnJvci4KLSAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSAwOwotICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBlcnJvckxlbiA9IHNpemVvZihlcnJvcik7Ci0gICAgICAgICAgICAgICAgaWYgKGdldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnJvciwgJmVycm9yTGVuKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBnZXQgdGhlIHJlYWwgZXJyb3IsIHNvIHJlcG9ydCB3aHkgbm90LgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtZXJybm87Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLWVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGltZW91dCBleHBpcmVkLiBUcnkgYWdhaW4uCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNYWtlU29ja2V0QmxvY2tpbmcocywgdHJ1ZSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBBcHBhcmVudGx5IHVuZGVyIG91dCBsaW51eCBjbG9zaW5nIGEgc29ja2V0IGRlc2NyaXB0b3IgZnJvbSBvbmUgdGhyZWFkCi0vLyB3aWxsIG5vdCB1bmJsb2NrIGEgcGVuZGluZyBzZW5kL3JlY3Ygb24gdGhhdCBzb2NrZXQgb24gYW5vdGhlciB0aHJlYWQuCi1zdGF0aWMgc3NpemVfdCBNeVNlbmRSZWNlaXZlKAotICAgICAgICBpbnQgcywgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCBmbGFncywgYm9vbCBzZW5kRGF0YSkgewotICAgIHNzaXplX3QgcmVzdWx0ID0gMDsKLQotICAgIGlmIChzIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICBmZF9zZXQgcnMsIHdzLCBlczsKLSAgICAgICAgRkRfWkVSTygmcnMpOwotICAgICAgICBGRF9aRVJPKCZ3cyk7Ci0gICAgICAgIEZEX1pFUk8oJmVzKTsKLSAgICAgICAgRkRfU0VUKHMsIHNlbmREYXRhID8gJndzIDogJnJzKTsKLSAgICAgICAgRkRfU0VUKHMsICZlcyk7Ci0KLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIHR2LnR2X3NlYyA9IDA7Ci0gICAgICAgIHR2LnR2X3VzZWMgPSAxMDAwMDBsbDsKLQotICAgICAgICBpbnQgbmZkcyA9IDo6c2VsZWN0KAotICAgICAgICAgICAgICAgIHMgKyAxLAotICAgICAgICAgICAgICAgIHNlbmREYXRhID8gTlVMTCA6ICZycywKLSAgICAgICAgICAgICAgICBzZW5kRGF0YSA/ICZ3cyA6IE5VTEwsCi0gICAgICAgICAgICAgICAgJmVzLAotICAgICAgICAgICAgICAgICZ0dik7Ci0KLSAgICAgICAgaWYgKG5mZHMgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAobmZkcyA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB0aW1lb3V0Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0tfRVEobmZkcywgMSk7Ci0KLSAgICAgICAgc3NpemVfdCBuYnl0ZXMgPQotICAgICAgICAgICAgc2VuZERhdGEgPyBzZW5kKHMsIGRhdGEsIHNpemUsIGZsYWdzKSA6IHJlY3YocywgZGF0YSwgc2l6ZSwgZmxhZ3MpOwotCi0gICAgICAgIGlmIChuYnl0ZXMgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAobmJ5dGVzID09IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRhdGEgPSAodWludDhfdCAqKWRhdGEgKyBuYnl0ZXM7Ci0gICAgICAgIHNpemUgLT0gbmJ5dGVzOwotCi0gICAgICAgIHJlc3VsdCA9IG5ieXRlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHNzaXplX3QgTXlTZW5kKGludCBzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKSB7Ci0gICAgcmV0dXJuIE15U2VuZFJlY2VpdmUoCi0gICAgICAgICAgICBzLCBjb25zdF9jYXN0PHZvaWQgKj4oZGF0YSksIHNpemUsIGZsYWdzLCB0cnVlIC8qIHNlbmREYXRhICovKTsKLX0KLQotc3RhdGljIHNzaXplX3QgTXlSZWNlaXZlKGludCBzLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKSB7Ci0gICAgcmV0dXJuIE15U2VuZFJlY2VpdmUocywgZGF0YSwgc2l6ZSwgZmxhZ3MsIGZhbHNlIC8qIHNlbmREYXRhICovKTsKLX0KLQotc3RhdHVzX3QgSFRUUFN0cmVhbTo6Y29ubmVjdChjb25zdCBjaGFyICpzZXJ2ZXIsIGludCBwb3J0LCBib29sIGh0dHBzKSB7Ci0gICAgaWYgKHBvcnQgPCAwKSB7Ci0gICAgICAgIHBvcnQgPSBodHRwcyA/IDQ0MyA6IDgwOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9BTFJFQURZX0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICBpZiAocG9ydCA8IDAgfHwgcG9ydCA+IChpbnQpIFVTSFJUX01BWCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjaGFyIHNlcnZpY2Vbc2l6ZW9mKCI2NTUzNiIpXTsKLSAgICBzcHJpbnRmKHNlcnZpY2UsICIlZCIsIHBvcnQpOwotICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpOwotICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfQUREUkNPTkZJRyB8IEFJX05VTUVSSUNTRVJWOwotICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0KLSAgICBpbnQgcmV0ID0gZ2V0YWRkcmluZm8oc2VydmVyLCBzZXJ2aWNlLCAmaGludHMsICZhaSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5LTk9XTl9IT1NUOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1Tb2NrZXQsIC0xKTsKLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7Ci0gICAgc3RhdHVzX3QgcmVzID0gLTE7Ci0gICAgc3RydWN0IGFkZHJpbmZvICp0bXA7Ci0gICAgZm9yICh0bXAgPSBhaTsgdG1wOyB0bXAgPSB0bXAtPmFpX25leHQpIHsKLSAgICAgICAgbVNvY2tldCA9IHNvY2tldCh0bXAtPmFpX2ZhbWlseSwgdG1wLT5haV9zb2NrdHlwZSwgdG1wLT5haV9wcm90b2NvbCk7Ci0gICAgICAgIGlmIChtU29ja2V0IDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZWNlaXZlVGltZW91dCgzMCk7ICAvLyBUaW1lIG91dCByZWFkcyBhZnRlciAzMCBzZWNzIGJ5IGRlZmF1bHQuCi0KLSAgICAgICAgaW50IHMgPSBtU29ja2V0OwotCi0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotCi0gICAgICAgIHJlcyA9IE15Q29ubmVjdChzLCB0bXAtPmFpX2FkZHIsIHRtcC0+YWlfYWRkcmxlbik7Ci0KLSAgICAgICAgbUxvY2subG9jaygpOwotCi0gICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICAgICAgY2xvc2Uocyk7Ci0gICAgICAgICAgICBmcmVlYWRkcmluZm8oYWkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNsb3NlKHMpOwotICAgIH0KLQotICAgIGZyZWVhZGRyaW5mbyhhaSk7Ci0KLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIGNsb3NlKG1Tb2NrZXQpOwotICAgICAgICBtU29ja2V0ID0gLTE7Ci0KLSAgICAgICAgbVN0YXRlID0gUkVBRFk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgaWYgKGh0dHBzKSB7Ci0gICAgICAgIENIRUNLKG1TU0wgPT0gTlVMTCk7Ci0KLSAgICAgICAgaWYgKG1TU0xDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKLQotICAgICAgICAgICAgbVNTTENvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV9jbGllbnRfbWV0aG9kKCkpOwotCi0gICAgICAgICAgICBpZiAobVNTTENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgU1NMIGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBSRUFEWTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtU1NMID0gU1NMX25ldygoU1NMX0NUWCAqKW1TU0xDb250ZXh0KTsKLQotICAgICAgICBpZiAobVNTTCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIFNTTCBzZXNzaW9uIik7Ci0KLSAgICAgICAgICAgIG1TdGF0ZSA9IFJFQURZOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlcyA9IFNTTF9zZXRfZmQoKFNTTCAqKW1TU0wsIG1Tb2NrZXQpOwotCi0gICAgICAgIGlmIChyZXMgPT0gMSkgewotICAgICAgICAgICAgcmVzID0gU1NMX2Nvbm5lY3QoKFNTTCAqKW1TU0wpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcyAhPSAxKSB7Ci0gICAgICAgICAgICBTU0xfZnJlZSgoU1NMICopbVNTTCk7Ci0gICAgICAgICAgICBtU1NMID0gTlVMTDsKLQotICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGNvbm5lY3Qgb3ZlciBTU0wiKTsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFJFQURZOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEhUVFBTdHJlYW06OmRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEICYmIG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9OT1RfQ09OTkVDVEVEOwotICAgIH0KLQotICAgIGlmIChtU1NMICE9IE5VTEwpIHsKLSAgICAgICAgU1NMX3NodXRkb3duKChTU0wgKiltU1NMKTsKLQotICAgICAgICBTU0xfZnJlZSgoU1NMICopbVNTTCk7Ci0gICAgICAgIG1TU0wgPSBOVUxMOwotICAgIH0KLQotICAgIENIRUNLKG1Tb2NrZXQgPj0gMCk7Ci0gICAgY2xvc2UobVNvY2tldCk7Ci0gICAgbVNvY2tldCA9IC0xOwotCi0gICAgbVN0YXRlID0gUkVBRFk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEhUVFBTdHJlYW06OnNlbmQoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgc3NpemVfdCBuOwotICAgICAgICBpZiAobVNTTCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuID0gU1NMX3dyaXRlKChTU0wgKiltU1NMLCBkYXRhLCBzaXplKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgbiA9IC1TU0xfZ2V0X2Vycm9yKChTU0wgKiltU1NMLCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG4gPSBNeVNlbmQobVNvY2tldCwgZGF0YSwgc2l6ZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9DT05ORUNUSU9OX0xPU1Q7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplIC09IChzaXplX3QpbjsKLSAgICAgICAgZGF0YSArPSAoc2l6ZV90KW47Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBIVFRQU3RyZWFtOjpzZW5kKGNvbnN0IGNoYXIgKmRhdGEpIHsKLSAgICByZXR1cm4gc2VuZChkYXRhLCBzdHJsZW4oZGF0YSkpOwotfQotCi0vLyBBIGNlcnRhaW4gYXBwbGljYXRpb24gc3Bhd25zIGEgbG9jYWwgd2Vic2VydmVyIHRoYXQgc2VuZHMgaW52YWxpZCByZXNwb25zZXMsCi0vLyBzcGVjaWZpY2FsbHkgaXQgdGVybWluYXRlcyBoZWFkZXIgbGluZSB3aXRoIG9ubHkgYSBuZXdsaW5lIGluc3RlYWQgb2YgdGhlCi0vLyBDUkxGIChjYXJyaWFnZS1yZXR1cm4gZm9sbG93ZWQgYnkgbmV3bGluZSkgcmVxdWlyZWQgYnkgdGhlIEhUVFAgc3BlY3MuCi0vLyBUaGUgd29ya2Fyb3VuZCBhY2NlcHRzIGJvdGggYmVoYXZpb3VycyBidXQgY291bGQgcG90ZW50aWFsbHkgYnJlYWsKLS8vIGxlZ2l0aW1hdGUgcmVzcG9uc2VzIHRoYXQgdXNlIGEgc2luZ2xlIG5ld2xpbmUgdG8gImZvbGQiIGhlYWRlcnMsIHdoaWNoIGlzCi0vLyB3aHkgaXQncyBub3QgeWV0IG9uIGJ5IGRlZmF1bHQuCi0jZGVmaW5lIFdPUktBUk9VTkRfRk9SX01JU1NJTkdfQ1IgICAgICAgMQotCi1zdGF0dXNfdCBIVFRQU3RyZWFtOjpyZWNlaXZlX2xpbmUoY2hhciAqbGluZSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKLSAgICB9Ci0KLSAgICBib29sIHNhd19DUiA9IGZhbHNlOwotICAgIHNpemVfdCBsZW5ndGggPSAwOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgaWYgKG1TU0wgIT0gTlVMTCkgewotICAgICAgICAgICAgbiA9IFNTTF9yZWFkKChTU0wgKiltU1NMLCAmYywgMSk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIG4gPSAtU1NMX2dldF9lcnJvcigoU1NMICopbVNTTCwgbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuID0gTXlSZWNlaXZlKG1Tb2NrZXQsICZjLCAxLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9DT05ORUNUSU9OX0xPU1Q7Ci0gICAgICAgIH0KLQotI2lmIFdPUktBUk9VTkRfRk9SX01JU1NJTkdfQ1IKLSAgICAgICAgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGNvbXBsZXRlIGxpbmUuCi0KLSAgICAgICAgICAgIGxpbmVbc2F3X0NSID8gbGVuZ3RoIC0gMSA6IGxlbmd0aF0gPSAnXDAnOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoc2F3X0NSICYmICBjID09ICdcbicpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBjb21wbGV0ZSBsaW5lLgotCi0gICAgICAgICAgICBsaW5lW2xlbmd0aCAtIDFdID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgc2F3X0NSID0gKGMgPT0gJ1xyJyk7Ci0KLSAgICAgICAgaWYgKGxlbmd0aCArIDEgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBsaW5lW2xlbmd0aCsrXSA9IGM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBIVFRQU3RyZWFtOjpyZWNlaXZlX2hlYWRlcihpbnQgKmh0dHBfc3RhdHVzKSB7Ci0gICAgKmh0dHBfc3RhdHVzID0gLTE7Ci0gICAgbUhlYWRlcnMuY2xlYXIoKTsKLQotICAgIGNoYXIgbGluZVsyMDQ4XTsKLSAgICBzdGF0dXNfdCBlcnIgPSByZWNlaXZlX2xpbmUobGluZSwgc2l6ZW9mKGxpbmUpKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUhlYWRlcnMuYWRkKEFTdHJpbmcoa1N0YXR1c0tleSksIEFTdHJpbmcobGluZSkpOwotCi0gICAgY2hhciAqc3BhY2VQb3MgPSBzdHJjaHIobGluZSwgJyAnKTsKLSAgICBpZiAoc3BhY2VQb3MgPT0gTlVMTCkgewotICAgICAgICAvLyBNYWxmb3JtZWQgcmVzcG9uc2U/Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGNoYXIgKnN0YXR1c19zdGFydCA9IHNwYWNlUG9zICsgMTsKLSAgICBjaGFyICpzdGF0dXNfZW5kID0gc3RhdHVzX3N0YXJ0OwotICAgIHdoaWxlIChpc2RpZ2l0KCpzdGF0dXNfZW5kKSkgewotICAgICAgICArK3N0YXR1c19lbmQ7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1c19lbmQgPT0gc3RhdHVzX3N0YXJ0KSB7Ci0gICAgICAgIC8vIE1hbGZvcm1lZCByZXNwb25zZSwgc3RhdHVzIG1pc3Npbmc/Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1lbW1vdmUobGluZSwgc3RhdHVzX3N0YXJ0LCBzdGF0dXNfZW5kIC0gc3RhdHVzX3N0YXJ0KTsKLSAgICBsaW5lW3N0YXR1c19lbmQgLSBzdGF0dXNfc3RhcnRdID0gJ1wwJzsKLQotICAgIGxvbmcgdG1wID0gc3RydG9sKGxpbmUsIE5VTEwsIDEwKTsKLSAgICBpZiAodG1wIDwgMCB8fCB0bXAgPiA5OTkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgKmh0dHBfc3RhdHVzID0gKGludCl0bXA7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGVyciA9IHJlY2VpdmVfbGluZShsaW5lLCBzaXplb2YobGluZSkpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpsaW5lID09ICdcMCcpIHsKLSAgICAgICAgICAgIC8vIEVtcHR5IGxpbmUgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHB1dHMobGluZSk7Ci0KLSAgICAgICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIobGluZSwgJzonKTsKLSAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFTdHJpbmcga2V5ID0gbGluZTsKLSAgICAgICAgICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICAgICAgICAgIG1IZWFkZXJzLmFkZChrZXksIEFTdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICplbmRfb2Zfa2V5ID0gY29sb25Qb3M7Ci0gICAgICAgICAgICB3aGlsZSAoZW5kX29mX2tleSA+IGxpbmUgJiYgaXNzcGFjZShlbmRfb2Zfa2V5Wy0xXSkpIHsKLSAgICAgICAgICAgICAgICAtLWVuZF9vZl9rZXk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoYXIgKnN0YXJ0X29mX3ZhbHVlID0gY29sb25Qb3MgKyAxOwotICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnN0YXJ0X29mX3ZhbHVlKSkgewotICAgICAgICAgICAgICAgICsrc3RhcnRfb2ZfdmFsdWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICplbmRfb2Zfa2V5ID0gJ1wwJzsKLQotICAgICAgICAgICAgQVN0cmluZyBrZXkgPSBsaW5lOwotICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKLQotICAgICAgICAgICAgbUhlYWRlcnMuYWRkKGtleSwgQVN0cmluZyhzdGFydF9vZl92YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zc2l6ZV90IEhUVFBTdHJlYW06OnJlY2VpdmUodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgdG90YWwgPSAwOwotICAgIHdoaWxlICh0b3RhbCA8IHNpemUpIHsKLSAgICAgICAgc3NpemVfdCBuOwotICAgICAgICBpZiAobVNTTCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuID0gU1NMX3JlYWQoKFNTTCAqKW1TU0wsIChjaGFyICopZGF0YSArIHRvdGFsLCBzaXplIC0gdG90YWwpOwotCi0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBuID0gLVNTTF9nZXRfZXJyb3IoKFNTTCAqKW1TU0wsIG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbiA9IE15UmVjZWl2ZShtU29ja2V0LCAoY2hhciAqKWRhdGEgKyB0b3RhbCwgc2l6ZSAtIHRvdGFsLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgTE9HRSgicmVjdiBmYWlsZWQsIGVycm5vID0gJWQgKCVzKSIsIChpbnQpbiwgc3RyZXJyb3IoLW4pKTsKLQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgcmV0dXJuIChzc2l6ZV90KUVSUk9SX0lPOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICBMT0dFKCJyZWN2IGZhaWxlZCwgc2VydmVyIGlzIGdvbmUsIHRvdGFsIHJlY2VpdmVkOiAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgIHRvdGFsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRvdGFsID09IDAgPyAoc3NpemVfdClFUlJPUl9DT05ORUNUSU9OX0xPU1QgOiB0b3RhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRvdGFsICs9IChzaXplX3QpbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHNzaXplX3QpdG90YWw7Ci19Ci0KLWJvb2wgSFRUUFN0cmVhbTo6ZmluZF9oZWFkZXJfdmFsdWUoY29uc3QgQVN0cmluZyAma2V5LCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5X2xvd2VyID0ga2V5OwotICAgIGtleV9sb3dlci50b2xvd2VyKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZktleShrZXlfbG93ZXIpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBtSGVhZGVycy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEhUVFBTdHJlYW06OnNldFJlY2VpdmVUaW1lb3V0KGludCBzZWNvbmRzKSB7Ci0gICAgaWYgKHNlY29uZHMgPCAwKSB7Ci0gICAgICAgIC8vIERpc2FibGUgdGhlIHRpbWVvdXQuCi0gICAgICAgIHNlY29uZHMgPSAwOwotICAgIH0KLQotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHR2LnR2X3VzZWMgPSAwOwotICAgIHR2LnR2X3NlYyA9IHNlY29uZHM7Ci0gICAgQ0hFQ0tfRVEoMCwgc2V0c29ja29wdChtU29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnR2LCBzaXplb2YodHYpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDAzY2UyMDIuLjkyZTg0YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKIAorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKICNpbmNsdWRlICJpbmNsdWRlL1ZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1hJTkdTZWVrZXIuaCIKQEAgLTQ0LDE0MyArNDUsNiBAQAogLy8gWWVzIC4uLiB0aGVyZSBhcmUgdGhpbmdzIHRoYXQgbXVzdCBpbmRlZWQgbWF0Y2guLi4KIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWFzayA9IDB4ZmZmZTBjMDA7CiAKLS8vIHN0YXRpYwotYm9vbCBNUDNFeHRyYWN0b3I6OmdldF9tcDNfZnJhbWVfc2l6ZSgKLSAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCi0gICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUsIGludCAqb3V0X2NoYW5uZWxzLAotICAgICAgICBpbnQgKm91dF9iaXRyYXRlKSB7Ci0gICAgKmZyYW1lX3NpemUgPSAwOwotCi0gICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7Ci0gICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG91dF9jaGFubmVscykgewotICAgICAgICAqb3V0X2NoYW5uZWxzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAob3V0X2JpdHJhdGUpIHsKLSAgICAgICAgKm91dF9iaXRyYXRlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAweDAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKLQotICAgIGlmIChsYXllciA9PSAweDAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwcm90ZWN0aW9uID0gKGhlYWRlciA+PiAxNikgJiAxOwotCi0gICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKLQotICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7Ci0gICAgICAgIC8vIERpc2FsbG93ICJmcmVlIiBiaXRyYXRlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKLQotICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKLSAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKLSAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7Ci0KLSAgICBpZiAobGF5ZXIgPT0gMykgewotICAgICAgICAvLyBsYXllciBJCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPSB7Ci0gICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwKLSAgICAgICAgICAgIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAotICAgICAgICAgICAgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgotICAgICAgICB9OwotCi0gICAgICAgIGludCBiaXRyYXRlID0KLSAgICAgICAgICAgICh2ZXJzaW9uID09IDMgLyogVjEgKi8pCi0gICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXQotICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0KLSAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7Ci0gICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBsYXllciBJSSBvciBJSUkKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0gewotICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsCi0gICAgICAgICAgICAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDNbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsCi0gICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPSB7Ci0gICAgICAgICAgICA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwKLSAgICAgICAgICAgIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGJpdHJhdGU7Ci0gICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKLSAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykKLSAgICAgICAgICAgICAgICA/IGtCaXRyYXRlVjFMMltiaXRyYXRlX2luZGV4IC0gMV0KLSAgICAgICAgICAgICAgICA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBWMiAob3IgMi41KQotCi0gICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKLSAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7Ci0gICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFYyIG9yIFYyLjUKLSAgICAgICAgICAgICpmcmFtZV9zaXplID0gNzIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKLSAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKLSAgICB9Ci0KLSAgICBpZiAob3V0X2NoYW5uZWxzKSB7Ci0gICAgICAgIGludCBjaGFubmVsX21vZGUgPSAoaGVhZGVyID4+IDYpICYgMzsKLQotICAgICAgICAqb3V0X2NoYW5uZWxzID0gKGNoYW5uZWxfbW9kZSA9PSAzKSA/IDEgOiAyOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCiBzdGF0aWMgYm9vbCBSZXN5bmMoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKICAgICAgICAgb2ZmNjRfdCAqaW5vdXRfcG9zLCBvZmY2NF90ICpwb3N0X2lkM19wb3MsIHVpbnQzMl90ICpvdXRfaGVhZGVyKSB7CkBAIC0yODIsNyArMTQ2LDcgQEAKIAogICAgICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKICAgICAgICAgaW50IHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIGJpdHJhdGU7Ci0gICAgICAgIGlmICghTVAzRXh0cmFjdG9yOjpnZXRfbXAzX2ZyYW1lX3NpemUoCisgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAogICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKSkgewogICAgICAgICAgICAgKytwb3M7CkBAIC0zMTYsNyArMTgwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IHRlc3RfZnJhbWVfc2l6ZTsKLSAgICAgICAgICAgIGlmICghTVAzRXh0cmFjdG9yOjpnZXRfbXAzX2ZyYW1lX3NpemUoCisgICAgICAgICAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfaGVhZGVyLCAmdGVzdF9mcmFtZV9zaXplKSkgewogICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNzQsNiArMjM4LDkgQEAKICAgICBzcDxNUDNTZWVrZXI+IG1TZWVrZXI7CiAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCisgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CisgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CisKICAgICBNUDNTb3VyY2UoY29uc3QgTVAzU291cmNlICYpOwogICAgIE1QM1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1QM1NvdXJjZSAmKTsKIH07CkBAIC00MTksNyArMjg2LDcgQEAKICAgICBpbnQgc2FtcGxlX3JhdGU7CiAgICAgaW50IG51bV9jaGFubmVsczsKICAgICBpbnQgYml0cmF0ZTsKLSAgICBnZXRfbXAzX2ZyYW1lX3NpemUoCisgICAgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAogICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSk7CiAKICAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKQEAgLTQ4OSw3ICszNTYsOSBAQAogICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2Vla2VyKHNlZWtlciksCi0gICAgICBtR3JvdXAoTlVMTCkgeworICAgICAgbUdyb3VwKE5VTEwpLAorICAgICAgbUJhc2lzVGltZVVzKDApLAorICAgICAgbVNhbXBsZXNSZWFkKDApIHsKIH0KIAogTVAzU291cmNlOjp+TVAzU291cmNlKCkgewpAQCAtNTA5LDYgKzM3OCw5IEBACiAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvczsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7CiAKKyAgICBtQmFzaXNUaW1lVXMgPSBtQ3VycmVudFRpbWVVczsKKyAgICBtU2FtcGxlc1JlYWQgPSAwOworCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtNTM1LDYgKzQwNyw4IEBACiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgYm9vbCBzZWVrQ0JSID0gZmFsc2U7CisKICAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7CiAgICAgICAgIGlmIChtU2Vla2VyID09IE5VTEwKQEAgLTU0OSw5ICs0MjMsMTMgQEAKIAogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrVGltZVVzOwogICAgICAgICAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvcyArIHNlZWtUaW1lVXMgKiBiaXRyYXRlIC8gODAwMDAwMDsKKyAgICAgICAgICAgIHNlZWtDQlIgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBhY3R1YWxTZWVrVGltZVVzOwogICAgICAgICB9CisKKyAgICAgICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7CisgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKQEAgLTU2Miw2ICs0NDAsOCBAQAogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CiAgICAgaW50IGJpdHJhdGU7CisgICAgaW50IG51bV9zYW1wbGVzOworICAgIGludCBzYW1wbGVfcmF0ZTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlci0+ZGF0YSgpLCA0KTsKICAgICAgICAgaWYgKG4gPCA0KSB7CkBAIC01NzQsOCArNDU0LDE2IEBACiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKIAogICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCi0gICAgICAgICAgICAmJiBNUDNFeHRyYWN0b3I6OmdldF9tcDNfZnJhbWVfc2l6ZSgKLSAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCBOVUxMLCBOVUxMLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgICYmIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsIE5VTEwsCisgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1fc2FtcGxlcykpIHsKKworICAgICAgICAgICAgLy8gcmUtY2FsY3VsYXRlIG1DdXJyZW50VGltZVVzIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBjYWxsZWQgUmVzeW5jKCkKKyAgICAgICAgICAgIGlmIChzZWVrQ0JSKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSAobUN1cnJlbnRQb3MgLSBtRmlyc3RGcmFtZVBvcykgKiA4MDAwIC8gYml0cmF0ZTsKKyAgICAgICAgICAgICAgICBtQmFzaXNUaW1lVXMgPSBtQ3VycmVudFRpbWVVczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjEzLDcgKzUwMSw5IEBACiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKIAogICAgIG1DdXJyZW50UG9zICs9IGZyYW1lX3NpemU7Ci0gICAgbUN1cnJlbnRUaW1lVXMgKz0gZnJhbWVfc2l6ZSAqIDgwMDBsbCAvIGJpdHJhdGU7CisKKyAgICBtU2FtcGxlc1JlYWQgKz0gbnVtX3NhbXBsZXM7CisgICAgbUN1cnJlbnRUaW1lVXMgPSBtQmFzaXNUaW1lVXMgKyAoKG1TYW1wbGVzUmVhZCAqIDEwMDAwMDApIC8gc2FtcGxlX3JhdGUpOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCA0ZTRmMjg5Li4wMmVlYjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtNDY2LDYgKzQ2Niw4IEBACiAKIE1QRUcyVFNXcml0ZXI6Ok1QRUcyVFNXcml0ZXIoaW50IGZkKQogICAgIDogbUZpbGUoZmRvcGVuKGR1cChmZCksICJ3YiIpKSwKKyAgICAgIG1Xcml0ZUNvb2tpZShOVUxMKSwKKyAgICAgIG1Xcml0ZUZ1bmMoTlVMTCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtTnVtU291cmNlc0RvbmUoMCksCiAgICAgICBtTnVtVFNQYWNrZXRzV3JpdHRlbigwKSwKQEAgLTQ3NSw2ICs0NzcsMjEgQEAKIAogTVBFRzJUU1dyaXRlcjo6TVBFRzJUU1dyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKICAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAid2IiKSksCisgICAgICBtV3JpdGVDb29raWUoTlVMTCksCisgICAgICBtV3JpdGVGdW5jKE5VTEwpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbU51bVNvdXJjZXNEb25lKDApLAorICAgICAgbU51bVRTUGFja2V0c1dyaXR0ZW4oMCksCisgICAgICBtTnVtVFNQYWNrZXRzQmVmb3JlTWV0YSgwKSB7CisgICAgaW5pdCgpOworfQorCitNUEVHMlRTV3JpdGVyOjpNUEVHMlRTV3JpdGVyKAorICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgIHNzaXplX3QgKCp3cml0ZSkodm9pZCAqY29va2llLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkpCisgICAgOiBtRmlsZShOVUxMKSwKKyAgICAgIG1Xcml0ZUNvb2tpZShjb29raWUpLAorICAgICAgbVdyaXRlRnVuYyh3cml0ZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtTnVtU291cmNlc0RvbmUoMCksCiAgICAgICBtTnVtVFNQYWNrZXRzV3JpdHRlbigwKSwKQEAgLTQ4Myw3ICs1MDAsNyBAQAogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OmluaXQoKSB7Ci0gICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7CisgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCB8fCBtV3JpdGVGdW5jICE9IE5VTEwpOwogCiAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIG1Mb29wZXItPnNldE5hbWUoIk1QRUcyVFNXcml0ZXIiKTsKQEAgLTUwMiw4ICs1MTksMTAgQEAKICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKICAgICBtTG9vcGVyLT5zdG9wKCk7CiAKLSAgICBmY2xvc2UobUZpbGUpOwotICAgIG1GaWxlID0gTlVMTDsKKyAgICBpZiAobUZpbGUgIT0gTlVMTCkgeworICAgICAgICBmY2xvc2UobUZpbGUpOworICAgICAgICBtRmlsZSA9IE5VTEw7CisgICAgfQogfQogCiBzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKQEAgLTcxOCw3ICs3MzcsNyBAQAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQ29udGludWl0eUNvdW50ZXIgPSA1OwogICAgIGJ1ZmZlci0+ZGF0YSgpWzNdIHw9IGtDb250aW51aXR5Q291bnRlcjsKIAotICAgIENIRUNLX0VRKGZ3cml0ZShidWZmZXItPmRhdGEoKSwgMSwgYnVmZmVyLT5zaXplKCksIG1GaWxlKSwgYnVmZmVyLT5zaXplKCkpOworICAgIENIRUNLX0VRKGludGVybmFsV3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKSwgYnVmZmVyLT5zaXplKCkpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OndyaXRlUHJvZ3JhbU1hcCgpIHsKQEAgLTc5NCw3ICs4MTMsNyBAQAogICAgICpwdHIrKyA9IDB4MDA7CiAgICAgKnB0cisrID0gMHgwMDsKIAotICAgIENIRUNLX0VRKGZ3cml0ZShidWZmZXItPmRhdGEoKSwgMSwgYnVmZmVyLT5zaXplKCksIG1GaWxlKSwgYnVmZmVyLT5zaXplKCkpOworICAgIENIRUNLX0VRKGludGVybmFsV3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKSwgYnVmZmVyLT5zaXplKCkpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OndyaXRlQWNjZXNzVW5pdCgKQEAgLTg5MCw3ICs5MDksNyBAQAogCiAgICAgbWVtY3B5KHB0ciwgYWNjZXNzVW5pdC0+ZGF0YSgpLCBjb3B5KTsKIAotICAgIENIRUNLX0VRKGZ3cml0ZShidWZmZXItPmRhdGEoKSwgMSwgYnVmZmVyLT5zaXplKCksIG1GaWxlKSwgYnVmZmVyLT5zaXplKCkpOworICAgIENIRUNLX0VRKGludGVybmFsV3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKSwgYnVmZmVyLT5zaXplKCkpOwogCiAgICAgc2l6ZV90IG9mZnNldCA9IGNvcHk7CiAgICAgd2hpbGUgKG9mZnNldCA8IGFjY2Vzc1VuaXQtPnNpemUoKSkgewpAQCAtOTIzLDcgKzk0Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOwotICAgICAgICBDSEVDS19FUShmd3JpdGUoYnVmZmVyLT5kYXRhKCksIDEsIGJ1ZmZlci0+c2l6ZSgpLCBtRmlsZSksCisgICAgICAgIENIRUNLX0VRKGludGVybmFsV3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKSwKICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOwogCiAgICAgICAgIG9mZnNldCArPSBjb3B5OwpAQCAtOTM5LDUgKzk1OCwxMyBAQAogICAgIH0KIH0KIAorc3NpemVfdCBNUEVHMlRTV3JpdGVyOjppbnRlcm5hbFdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1GaWxlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZ3cml0ZShkYXRhLCAxLCBzaXplLCBtRmlsZSk7CisgICAgfQorCisgICAgcmV0dXJuICgqbVdyaXRlRnVuYykobVdyaXRlQ29va2llLCBkYXRhLCBzaXplKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDdiOTZkMDEuLjczYTA1YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCisjaW5jbHVkZSAidGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oIgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKQEAgLTI5LDcgKzMxLDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMjYyLDcgKzI2Myw3IEBACiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1IYXZlTWV0YWRhdGEoZmFsc2UpLAorICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCksCkBAIC0zNjEsOCArMzYyLDggQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKLSAgICBpZiAobUhhdmVNZXRhZGF0YSkgewotICAgICAgICByZXR1cm4gT0s7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CkBAIC0zNzAsMjEgKzM3MSwyMCBAQAogICAgIHdoaWxlICgoZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKSkgPT0gT0spIHsKICAgICB9CiAKLSAgICBpZiAobUhhdmVNZXRhZGF0YSkgeworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIGlmIChtSGFzVmlkZW8pIHsKICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAidmlkZW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUluaXRDaGVjayA9IGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE1QRUc0RXh0cmFjdG9yOjpzZXREcm1GbGFnKGJvb2wgZmxhZykgewotICAgIG1Jc0RybSA9IGZsYWc7CisgICAgQ0hFQ0tfTkUoZXJyLCAoc3RhdHVzX3QpTk9fSU5JVCk7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKIGNoYXIqIE1QRUc0RXh0cmFjdG9yOjpnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CkBAIC02NDksNiArNjQ5LDcgQEAKICAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9ICpvZmZzZXQgKyBjaHVua19zaXplIC0gZGF0YV9vZmZzZXQ7CiAKICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2MnLCAncCcsICdyJywgJ3QnKQorICAgICAgICAgICAgJiYgY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKQogICAgICAgICAgICAgJiYgbVBhdGguc2l6ZSgpID09IDUgJiYgdW5kZXJNZXRhRGF0YVBhdGgobVBhdGgpKSB7CiAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwpAQCAtNzU1LDcgKzc1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7Ci0gICAgICAgICAgICAgICAgbUhhdmVNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogCiAgICAgICAgICAgICAgICAgaWYgKCFtSXNEcm0pIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBkdW1teSBlcnJvci4KQEAgLTgyOSw2ICs4MzAsMzMgQEAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKIAorICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOworICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBsYW5nX29mZnNldCA9IHRpbWVzY2FsZV9vZmZzZXQgKyA0ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFuZ19vZmZzZXQgPSB0aW1lc2NhbGVfb2Zmc2V0ICsgNCArIDQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQobGFuZ19vZmZzZXQsICZsYW5nLCBzaXplb2YobGFuZykpCisgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGxhbmcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUbyBnZXQgdGhlIElTTy02MzktMi9UIHRocmVlIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlCisgICAgICAgICAgICAvLyAxIGJpdCBwYWQgZm9sbG93ZWQgYnkgMyA1LWJpdHMgY2hhcmFjdGVycy4gRWFjaCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIC8vIGlzIHBhY2tlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0cyBBU0NJSSB2YWx1ZSBhbmQgMHg2MC4KKyAgICAgICAgICAgIGNoYXIgbGFuZ19jb2RlWzRdOworICAgICAgICAgICAgbGFuZ19jb2RlWzBdID0gKChsYW5nWzBdID4+IDIpICYgMHgxZikgKyAweDYwOworICAgICAgICAgICAgbGFuZ19jb2RlWzFdID0gKChsYW5nWzBdICYgMHgzKSA8PCAzIHwgKGxhbmdbMV0gPj4gNSkpICsgMHg2MDsKKyAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOworICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKKworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmdfY29kZSk7CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC04NTcsMTEgKzg4NSwxNyBAQAogICAgICAgICAgICAgdWludDMyX3QgZW50cnlfY291bnQgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7CiAKICAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KLQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIEZvciAzR1BQIHRpbWVkIHRleHQsIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHR4M2cgYm94ZXMgY29udGFpbgorICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHRleHQgZGlzcGxheSBmb3JtYXRzLiBUaGVzZSBmb3JtYXRzIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIHRpbWVkIHRleHQuCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKQEAgLTEyOTIsNiArMTMyNiw4MSBAQAogICAgICAgICAgICAgcmV0dXJuIHBhcnNlRHJtU0lORihvZmZzZXQsIGRhdGFfb2Zmc2V0KTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA4LCAmYnVmZmVyLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBudG9obChidWZmZXIpOworICAgICAgICAgICAgLy8gRm9yIHRoZSAzR1BQIGZpbGUgZm9ybWF0LCB0aGUgaGFuZGxlci10eXBlIHdpdGhpbiB0aGUgJ2hkbHInIGJveAorICAgICAgICAgICAgLy8gc2hhbGwgYmUgJ3RleHQnCisgICAgICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3QnLCAnZScsICd4JywgJ3QnKSkgeworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kRGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgdWludDhfdFtzaXplICsgY2h1bmtfc2l6ZV07CisKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHNpemVfdCkobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIgKyBzaXplLCBjaHVua19zaXplKSkKKyAgICAgICAgICAgICAgICAgICAgPCBjaHVua19zaXplKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CisKKyAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUZpbGVNZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJWxsZCBhbmQgZGF0YV9vZmZzZXQgPSAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W2NodW5rX2RhdGFfc2l6ZSArIDFdOworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpICE9IChzc2l6ZV90KWNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQga1NraXBCeXRlc09mRGF0YUJveCA9IDE2OworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsga1NraXBCeXRlc09mRGF0YUJveCwgY2h1bmtfZGF0YV9zaXplIC0ga1NraXBCeXRlc09mRGF0YUJveCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMTkwMSw3ICsyMDEwLDcgQEAKIAogICAgIG9mZjY0X3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwotICAgIHVpbnQzMl90IGR0czsKKyAgICB1aW50MzJfdCBjdHM7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGU7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CkBAIC0xOTA5LDcgKzIwMTgsNyBAQAogCiAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmR0cywgJmlzU3luY1NhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTkzOSw3ICsyMDQ4LDcgQEAKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOwogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWR0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMjAyNSwxNCArMjEzNCwxOCBAQAogICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKICAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soc3JjT2Zmc2V0ICsgbU5BTExlbmd0aFNpemUgPD0gc2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IChzcmNPZmZzZXQgKyBtTkFMTGVuZ3RoU2l6ZSA+IHNpemUpOworICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjA1Nyw3ICsyMTcwLDcgQEAKIAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpZHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0yMDc3LDYgKzIxOTAsMjAgQEAKICAgICB9CiB9CiAKK01QRUc0RXh0cmFjdG9yOjpUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmZpbmRUcmFja0J5TWltZVByZWZpeCgKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVByZWZpeCkgeworICAgIGZvciAoVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7IHRyYWNrICE9IE5VTEw7IHRyYWNrID0gdHJhY2stPm5leHQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgaWYgKHRyYWNrLT5tZXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiB0cmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobWltZSwgbWltZVByZWZpeCwgc3RybGVuKG1pbWVQcmVmaXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwpAQCAtMjEwOSw2ICsyMjM2LDE0IEBACiAgICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAogICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCisKKyAgICAgICAgLy8gV29uJ3QgcHJvbWlzZSB0aGF0IHRoZSBmb2xsb3dpbmcgZmlsZSB0eXBlcyBjYW4gYmUgcGxheWVkLgorICAgICAgICAvLyBKdXN0IGdpdmUgdGhlc2UgZmlsZSB0eXBlcyBhIGNoYW5jZS4KKyAgICAgICAgRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJyksICAvLyBBcHBsZSdzIFF1aWNrVGltZQorICAgICAgICBGT1VSQ0MoJ00nLCAnUycsICdOJywgJ1YnKSwgIC8vIFNvbnkncyBQU1AKKworICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCisgICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDVkNmVhN2MuLjhjOWZmODcKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMzMsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC00NSwxNCArNDUsMTEgQEAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXgzMkJpdEZpbGVTaXplID0gMHgwMDdmZmZmZmZmTEw7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCA9IDB4MDc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCA9IDB4MDg7Ci0KLS8vIFVzaW5nIGxvbmdlciBhZGp1c3RtZW50IHBlcmlvZCB0byBzdXBwcmVzcyBmbHVjdHVhdGlvbnMgaW4KLS8vIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRocwotc3RhdGljIGNvbnN0IGludDY0X3Qga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzID0gNjAwMDAwMDAwTEw7ICAvLyAxMCBtaW51dGVzCitzdGF0aWMgY29uc3QgaW50NjRfdCBrSW5pdGlhbERlbGF5VGltZVVzICAgICA9IDcwMDAwMExMOwogCiBjbGFzcyBNUEVHNFdyaXRlcjo6VHJhY2sgewogcHVibGljOgotICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIFRyYWNrKE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKTsKIAogICAgIH5UcmFjaygpOwogCkBAIC02MywxMiArNjAsMTMgQEAKIAogICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIGNvbnN0OwogICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdDsKLSAgICB2b2lkIHdyaXRlVHJhY2tIZWFkZXIoaW50MzJfdCB0cmFja0lELCBib29sIHVzZTMyQml0T2Zmc2V0ID0gdHJ1ZSk7CisgICAgdm9pZCB3cml0ZVRyYWNrSGVhZGVyKGJvb2wgdXNlMzJCaXRPZmZzZXQgPSB0cnVlKTsKICAgICB2b2lkIGJ1ZmZlckNodW5rKGludDY0X3QgdGltZXN0YW1wVXMpOwogICAgIGJvb2wgaXNBdmMoKSBjb25zdCB7IHJldHVybiBtSXNBdmM7IH0KICAgICBib29sIGlzQXVkaW8oKSBjb25zdCB7IHJldHVybiBtSXNBdWRpbzsgfQogICAgIGJvb2wgaXNNUEVHNCgpIGNvbnN0IHsgcmV0dXJuIG1Jc01QRUc0OyB9CiAgICAgdm9pZCBhZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCk7CisgICAgaW50MzJfdCBnZXRUcmFja0lkKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrSWQ7IH0KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC04MiwxMCArODAsMTAgQEAKICAgICBib29sIG1Jc0F2YzsKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIGJvb2wgbUlzTVBFRzQ7CisgICAgaW50MzJfdCBtVHJhY2tJZDsKICAgICBpbnQ2NF90IG1UcmFja0R1cmF0aW9uVXM7CisgICAgaW50NjRfdCBtTWF4Q2h1bmtEdXJhdGlvblVzOwogCi0gICAgLy8gRm9yIHJlYWx0aW1lIGFwcGxpY2F0aW9ucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlIG1lZGlhIGNsb2NrCi0gICAgLy8gZm9yIHZpZGVvIHRyYWNrIGJhc2VkIG9uIHRoZSBhdWRpbyBtZWRpYSBjbG9jawogICAgIGJvb2wgbUlzUmVhbFRpbWVSZWNvcmRpbmc7CiAgICAgaW50NjRfdCBtTWF4VGltZVN0YW1wVXM7CiAgICAgaW50NjRfdCBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXM7CkBAIC0xMjMsMTcgKzEyMSwyOCBAQAogICAgIHNpemVfdCAgICAgICAgbU51bVN0c3NUYWJsZUVudHJpZXM7CiAgICAgTGlzdDxpbnQzMl90PiBtU3Rzc1RhYmxlRW50cmllczsKIAotICAgIHNpemVfdCAgICAgICAgbU51bVN0dHNUYWJsZUVudHJpZXM7CiAgICAgc3RydWN0IFN0dHNUYWJsZUVudHJ5IHsKIAotICAgICAgICBTdHRzVGFibGVFbnRyeSh1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZHVyYXRpb25VcykKLSAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvblVzKGR1cmF0aW9uVXMpIHt9CisgICAgICAgIFN0dHNUYWJsZUVudHJ5KHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBkdXJhdGlvbikKKyAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvbihkdXJhdGlvbikge30KIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb247ICAvLyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgfTsKKyAgICBzaXplX3QgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzOwogICAgIExpc3Q8U3R0c1RhYmxlRW50cnk+IG1TdHRzVGFibGVFbnRyaWVzOwogCisgICAgc3RydWN0IEN0dHNUYWJsZUVudHJ5IHsKKyAgICAgICAgQ3R0c1RhYmxlRW50cnkodWludDMyX3QgY291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cikKKyAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvbih0aW1lc2NhbGVkRHVyKSB7fQorCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50OworICAgICAgICBpbnQzMl90IHNhbXBsZUR1cmF0aW9uOyAgLy8gdGltZSBzY2FsZSBiYXNlZAorICAgIH07CisgICAgYm9vbCAgICAgICAgICBtSGFzTmVnYXRpdmVDdHRzRGVsdGFEdXJhdGlvbjsKKyAgICBzaXplX3QgICAgICAgIG1OdW1DdHRzVGFibGVFbnRyaWVzOworICAgIExpc3Q8Q3R0c1RhYmxlRW50cnk+IG1DdHRzVGFibGVFbnRyaWVzOworCiAgICAgLy8gU2VxdWVuY2UgcGFyYW1ldGVyIHNldCBvciBwaWN0dXJlIHBhcmFtZXRlciBzZXQKICAgICBzdHJ1Y3QgQVZDUGFyYW1TZXQgewogICAgICAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCkBAIC0xNTUsNDMgKzE2NCwyMyBAQAogCiAgICAgYm9vbCBtUmVhY2hlZEVPUzsKICAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworICAgIGludDY0X3QgbVN0YXJ0VGltZVJlYWxVczsKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVSZWFsVXM7CiAgICAgaW50NjRfdCBtUHJldmlvdXNUcmFja1RpbWVVczsKICAgICBpbnQ2NF90IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXM7CiAKLSAgICAvLyBIYXMgdGhlIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBmb3IgdmlkZW8gc3RhcnRlZD8KLSAgICBib29sICAgIG1Jc01lZGlhVGltZUFkanVzdG1lbnRPbjsKLSAgICAvLyBUaGUgdGltZSBzdGFtcCB3aGVuIHByZXZpb3VzIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBwZXJpb2Qgc3RhcnRzCi0gICAgaW50NjRfdCBtUHJldk1lZGlhVGltZUFkanVzdFRpbWVzdGFtcFVzOwotICAgIC8vIE51bWJlciBvZiB2aWRvZSBmcmFtZXMgd2hvc2UgdGltZSBzdGFtcCBtYXkgYmUgYWRqdXN0ZWQKLSAgICBpbnQ2NF90IG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXM7Ci0gICAgLy8gVGhlIHNhbXBsZSBudW1iZXIgd2hlbiBwcmV2aW91cyBtZWlkYSB0aW1lIGFkanVzdG1uZXQgcGVyaW9kIHN0YXJ0cwotICAgIGludDY0X3QgbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGU7Ci0gICAgLy8gVGhlIHRvdGFsIGFjY3VtdWxhdGVkIGRyaWZ0IHRpbWUgd2l0aGluIGEgcGVyaW9kIG9mCi0gICAgLy8ga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLgotICAgIGludDY0X3QgbVRvdGFsRHJpZnRUaW1lVG9BZGp1c3RVczsKLSAgICAvLyBUaGUgdG90YWwgYWNjdW1hbGF0ZWQgZHJpZnQgdGltZSBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZGluZwotICAgIC8vIGV4Y2x1ZGluZyB0aGUgY3VycmVudCB0aW1lIGFkanVzdG1lbnQgcGVyaW9kCi0gICAgaW50NjRfdCBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVczsKLQogICAgIC8vIFVwZGF0ZSB0aGUgYXVkaW8gdHJhY2sncyBkcmlmdCBpbmZvcm1hdGlvbi4KICAgICB2b2lkIHVwZGF0ZURyaWZ0VGltZShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogCi0gICAgLy8gQWRqdXN0IHRoZSB0aW1lIHN0YW1wIG9mIHRoZSB2aWRlbyB0cmFjayBhY2NvcmRpbmcgdG8KLSAgICAvLyB0aGUgZHJpZnQgdGltZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhdWRpbyB0cmFjay4KLSAgICB2b2lkIGFkanVzdE1lZGlhVGltZShpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Ci0KICAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICptZSk7CiAgICAgc3RhdHVzX3QgdGhyZWFkRW50cnkoKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnBhcnNlUGFyYW1TZXQoCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKTsKIAotICAgIHN0YXR1c190IG1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBtYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IGNvcHlBVkNDb2RlY1NwZWNpZmljRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCiAgICAgdm9pZCB0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CkBAIC0yMTIsNyArMjAxLDM4IEBACiAgICAgdm9pZCB1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpOwogICAgIHZvaWQgYWRkT25lU3RzY1RhYmxlRW50cnkoc2l6ZV90IGNodW5rSWQsIHNpemVfdCBzYW1wbGVJZCk7CiAgICAgdm9pZCBhZGRPbmVTdHNzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlSWQpOwotICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQ2NF90IGR1cmF0aW9uVXMpOworCisgICAgLy8gRHVyYXRpb24gaXMgdGltZSBzY2FsZSBiYXNlZAorICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOworICAgIHZvaWQgYWRkT25lQ3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOworCisgICAgYm9vbCBpc1RyYWNrTWFsRm9ybWVkKCkgY29uc3Q7CisgICAgdm9pZCBzZW5kVHJhY2tTdW1tYXJ5KGJvb2wgaGFzTXVsdGlwbGVUcmFja3MpOworCisgICAgLy8gV3JpdGUgdGhlIGJveGVzCisgICAgdm9pZCB3cml0ZVN0Y29Cb3goYm9vbCB1c2UzMkJpdE9mZnNldCk7CisgICAgdm9pZCB3cml0ZVN0c2NCb3goKTsKKyAgICB2b2lkIHdyaXRlU3RzekJveCgpOworICAgIHZvaWQgd3JpdGVTdHNzQm94KCk7CisgICAgdm9pZCB3cml0ZVN0dHNCb3goKTsKKyAgICB2b2lkIHdyaXRlQ3R0c0JveCgpOworICAgIHZvaWQgd3JpdGVEMjYzQm94KCk7CisgICAgdm9pZCB3cml0ZVBhc3BCb3goKTsKKyAgICB2b2lkIHdyaXRlQXZjY0JveCgpOworICAgIHZvaWQgd3JpdGVVcmxCb3goKTsKKyAgICB2b2lkIHdyaXRlRHJlZkJveCgpOworICAgIHZvaWQgd3JpdGVEaW5mQm94KCk7CisgICAgdm9pZCB3cml0ZURhbXJCb3goKTsKKyAgICB2b2lkIHdyaXRlTWRoZEJveCh0aW1lX3Qgbm93KTsKKyAgICB2b2lkIHdyaXRlU21oZEJveCgpOworICAgIHZvaWQgd3JpdGVWbWhkQm94KCk7CisgICAgdm9pZCB3cml0ZUhkbHJCb3goKTsKKyAgICB2b2lkIHdyaXRlVGtoZEJveCh0aW1lX3Qgbm93KTsKKyAgICB2b2lkIHdyaXRlTXA0YUVzZHNCb3goKTsKKyAgICB2b2lkIHdyaXRlTXA0dkVzZHNCb3goKTsKKyAgICB2b2lkIHdyaXRlQXVkaW9Gb3VyQ0NCb3goKTsKKyAgICB2b2lkIHdyaXRlVmlkZW9Gb3VyQ0NCb3goKTsKKyAgICB2b2lkIHdyaXRlU3RibEJveChib29sIHVzZTMyQml0T2Zmc2V0KTsKIAogICAgIFRyYWNrKGNvbnN0IFRyYWNrICYpOwogICAgIFRyYWNrICZvcGVyYXRvcj0oY29uc3QgVHJhY2sgJik7CkBAIC0yMjYsMTIgKzI0NiwxNyBAQAogICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAogICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZChmYWxzZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbU1kYXRPZmZzZXQoMCksCiAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUoMCksCi0gICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCkgeworICAgICAgbUludGVybGVhdmVEdXJhdGlvblVzKDEwMDAwMDApLAorICAgICAgbUxhdGl0dWRleDEwMDAwKDApLAorICAgICAgbUxvbmdpdHVkZXgxMDAwMCgwKSwKKyAgICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlKGZhbHNlKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygtMSkgewogCi0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyk7CisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUik7CiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKICAgICB9CkBAIC0yNDUsMTAgKzI3MCwxNSBAQAogICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAogICAgICAgbVBhdXNlZChmYWxzZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtV3JpdGVyVGhyZWFkU3RhcnRlZChmYWxzZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbU1kYXRPZmZzZXQoMCksCiAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUoMCksCi0gICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMoMTAwMDAwMCkgeworICAgICAgbUludGVybGVhdmVEdXJhdGlvblVzKDEwMDAwMDApLAorICAgICAgbUxhdGl0dWRleDEwMDAwKDApLAorICAgICAgbUxvbmdpdHVkZXgxMDAwMCgwKSwKKyAgICAgIG1BcmVHZW9UYWdzQXZhaWxhYmxlKGZhbHNlKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygtMSkgewogfQogCiBNUEVHNFdyaXRlcjo6fk1QRUc0V3JpdGVyKCkgewpAQCAtMjk1LDcgKzMyNSwxMiBAQAogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgVHJhY2sgKnRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHNvdXJjZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGFkZCBzb3VyY2UgQUZURVIgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBzb3VyY2UsIG1UcmFja3Muc2l6ZSgpKTsKICAgICBtVHJhY2tzLnB1c2hfYmFjayh0cmFjayk7CiAKICAgICByZXR1cm4gT0s7CkBAIC00NDQsMjAgKzQ3OSw3IEBACiAgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOwogICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKIAotICAgIGJlZ2luQm94KCJmdHlwIik7Ci0gICAgICB7Ci0gICAgICAgIGludDMyX3QgZmlsZVR5cGU7Ci0gICAgICAgIGlmIChwYXJhbSAmJiBwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSAmJgotICAgICAgICAgICAgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKLSAgICAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB3cml0ZUludDMyKDApOwotICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgZW5kQm94KCk7CisgICAgd3JpdGVGdHlwQm94KHBhcmFtKTsKIAogICAgIG1GcmVlQm94T2Zmc2V0ID0gbU9mZnNldDsKIApAQCAtNTE4LDYgKzU0MCw5IEBACiAKIHZvaWQgTVBFRzRXcml0ZXI6OnN0b3BXcml0ZXJUaHJlYWQoKSB7CiAgICAgTE9HRCgiU3RvcHBpbmcgd3JpdGVyIHRocmVhZCIpOworICAgIGlmICghbVdyaXRlclRocmVhZFN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKQEAgLTUyOCw2ICs1NTMsNyBAQAogCiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CisgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQgPSBmYWxzZTsKICAgICBMT0dEKCJXcml0ZXIgdGhyZWFkIHN0b3BwZWQiKTsKIH0KIApAQCAtNTgzLDEwICs2MDksMjUgQEAKICAgICB3cml0ZUludDMyKDB4NDAwMDAwMDApOyAgLy8gdwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpyZWxlYXNlKCkgeworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0b3AoKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbVdyaXRlclRocmVhZFN0YXJ0ZWQgfHwKKyAgICAgICAgICAgICFtU3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKG1Xcml0ZXJUaHJlYWRTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgc3RvcFdyaXRlclRocmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CkBAIC02MTcsMTAgKzY1OCw3IEBACiAKICAgICAvLyBEbyBub3Qgd3JpdGUgb3V0IG1vdmllIGhlYWRlciBvbiBlcnJvci4KICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIApAQCAtNjM3LDQzICs2NzUsMTIgQEAKICAgICB9CiAgICAgbHNlZWs2NChtRmQsIG1PZmZzZXQsIFNFRUtfU0VUKTsKIAotICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogICAgIGNvbnN0IG9mZjY0X3QgbW9vdk9mZnNldCA9IG1PZmZzZXQ7CiAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gdHJ1ZTsKICAgICBtTW9vdkJveEJ1ZmZlciA9ICh1aW50OF90ICopIG1hbGxvYyhtRXN0aW1hdGVkTW9vdkJveFNpemUpOwogICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKICAgICBDSEVDSyhtTW9vdkJveEJ1ZmZlciAhPSBOVUxMKTsKLSAgICBpbnQzMl90IGR1cmF0aW9uID0gKG1heER1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKLQotICAgIGJlZ2luQm94KCJtb292Iik7Ci0KLSAgICAgIGJlZ2luQm94KCJtdmhkIik7Ci0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICB3cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCi0gICAgICAgIHdyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgIHdyaXRlSW50MzIobVRpbWVTY2FsZSk7ICAgIC8vIG12aGQgdGltZXNjYWxlCi0gICAgICAgIHdyaXRlSW50MzIoZHVyYXRpb24pOwotICAgICAgICB3cml0ZUludDMyKDB4MTAwMDApOyAgICAgICAvLyByYXRlOiAxLjAKLSAgICAgICAgd3JpdGVJbnQxNigweDEwMCk7ICAgICAgICAgLy8gdm9sdW1lCi0gICAgICAgIHdyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIHdyaXRlQ29tcG9zaXRpb25NYXRyaXgoMCk7IC8vIG1hdHJpeAotICAgICAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKLSAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICB3cml0ZUludDMyKG1UcmFja3Muc2l6ZSgpICsgMSk7ICAvLyBuZXh0VHJhY2tJRAotICAgICAgZW5kQm94KCk7ICAvLyBtdmhkCi0KLSAgICAgIGludDMyX3QgaWQgPSAxOwotICAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCwgKytpZCkgewotICAgICAgICAgICgqaXQpLT53cml0ZVRyYWNrSGVhZGVyKGlkLCBtVXNlMzJCaXRPZmZzZXQpOwotICAgICAgfQotICAgIGVuZEJveCgpOyAgLy8gbW9vdgorICAgIHdyaXRlTW9vdkJveChtYXhEdXJhdGlvblVzKTsKIAogICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IGZhbHNlOwogICAgIGlmIChtU3RyZWFtYWJsZUZpbGUpIHsKQEAgLTY5OSwxMyArNzA2LDk2IEBACiAKICAgICBDSEVDSyhtQm94ZXMuZW1wdHkoKSk7CiAKLSAgICBjbG9zZShtRmQpOwotICAgIG1GZCA9IC0xOwotICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmVsZWFzZSgpOwogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlTXZoZEJveChpbnQ2NF90IGR1cmF0aW9uVXMpIHsKKyAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgICBiZWdpbkJveCgibXZoZCIpOworICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIHdyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKKyAgICB3cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZQorICAgIHdyaXRlSW50MzIobVRpbWVTY2FsZSk7ICAgIC8vIG12aGQgdGltZXNjYWxlCisgICAgaW50MzJfdCBkdXJhdGlvbiA9IChkdXJhdGlvblVzICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgd3JpdGVJbnQzMihkdXJhdGlvbik7CisgICAgd3JpdGVJbnQzMigweDEwMDAwKTsgICAgICAgLy8gcmF0ZTogMS4wCisgICAgd3JpdGVJbnQxNigweDEwMCk7ICAgICAgICAgLy8gdm9sdW1lCisgICAgd3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgd3JpdGVDb21wb3NpdGlvbk1hdHJpeCgwKTsgLy8gbWF0cml4CisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICB3cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgd3JpdGVJbnQzMihtVHJhY2tzLnNpemUoKSArIDEpOyAgLy8gbmV4dFRyYWNrSUQKKyAgICBlbmRCb3goKTsgIC8vIG12aGQKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVNb292Qm94KGludDY0X3QgZHVyYXRpb25VcykgeworICAgIGJlZ2luQm94KCJtb292Iik7CisgICAgd3JpdGVNdmhkQm94KGR1cmF0aW9uVXMpOworICAgIGlmIChtQXJlR2VvVGFnc0F2YWlsYWJsZSkgeworICAgICAgICB3cml0ZVVkdGFCb3goKTsKKyAgICB9CisgICAgaW50MzJfdCBpZCA9IDE7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCwgKytpZCkgeworICAgICAgICAoKml0KS0+d3JpdGVUcmFja0hlYWRlcihtVXNlMzJCaXRPZmZzZXQpOworICAgIH0KKyAgICBlbmRCb3goKTsgIC8vIG1vb3YKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVGdHlwQm94KE1ldGFEYXRhICpwYXJhbSkgeworICAgIGJlZ2luQm94KCJmdHlwIik7CisKKyAgICBpbnQzMl90IGZpbGVUeXBlOworICAgIGlmIChwYXJhbSAmJiBwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSAmJgorICAgICAgICBmaWxlVHlwZSAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgeworICAgICAgICB3cml0ZUZvdXJjYygiM2dwNCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgfQorCisgICAgd3JpdGVJbnQzMigwKTsKKyAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CisgICAgZW5kQm94KCk7Cit9CisKK3N0YXRpYyBib29sIGlzVGVzdE1vZGVFbmFibGVkKCkgeworI2lmIChQUk9QRVJUWV9WQUxVRV9NQVggPCA1KQorI2Vycm9yICJQUk9QRVJUWV9WQUxVRV9NQVggbXVzdCBiZSBhdCBsZWFzdCA1IgorI2VuZGlmCisKKyAgICAvLyBUZXN0IG1vZGUgaXMgZW5hYmxlZCBvbmx5IGlmIHJ3Lm1lZGlhLnJlY29yZC50ZXN0IHN5c3RlbQorICAgIC8vIHByb3BlcnR5IGlzIGVuYWJsZWQuCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJ3Lm1lZGlhLnJlY29yZC50ZXN0IiwgdmFsdWUsIE5VTEwpICYmCisgICAgICAgICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIjEiKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6c2VuZFNlc3Npb25TdW1tYXJ5KCkgeworICAgIC8vIFNlbmQgc2Vzc2lvbiBzdW1tYXJ5IG9ubHkgaWYgdGVzdCBtb2RlIGlzIGVuYWJsZWQKKyAgICBpZiAoIWlzVGVzdE1vZGVFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoTGlzdDxDaHVua0luZm8+OjppdGVyYXRvciBpdCA9IG1DaHVua0luZm9zLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtQ2h1bmtJbmZvcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpbnQgdHJhY2tOdW0gPSBpdC0+bVRyYWNrLT5nZXRUcmFja0lkKCkgPDwgMjg7CisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5URVJfQ0hVTktfVElNRV9NUywKKyAgICAgICAgICAgICAgICBpdC0+bU1heEludGVyQ2h1bmtEdXJVcyk7CisgICAgfQorfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKHVpbnQzMl90IGR1cmF0aW9uVXMpIHsKICAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwogICAgIHJldHVybiBPSzsKQEAgLTg2OCw2ICs5NTgsNzcgQEAKICAgICB3cml0ZShzLCAxLCA0KTsKIH0KIAorCisvLyBXcml0dGVuIGluICsvLURELkREREQgZm9ybWF0Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUxhdGl0dWRlKGludCBkZWdyZWV4MTAwMDApIHsKKyAgICBib29sIGlzTmVnYXRpdmUgPSAoZGVncmVleDEwMDAwIDwgMCk7CisgICAgY2hhciBzaWduID0gaXNOZWdhdGl2ZT8gJy0nOiAnKyc7CisKKyAgICAvLyBIYW5kbGUgdGhlIHdob2xlIHBhcnQKKyAgICBjaGFyIHN0cls5XTsKKyAgICBpbnQgd2hvbGVQYXJ0ID0gZGVncmVleDEwMDAwIC8gMTAwMDA7CisgICAgaWYgKHdob2xlUGFydCA9PSAwKSB7CisgICAgICAgIHNucHJpbnRmKHN0ciwgNSwgIiVjJS4yZC4iLCBzaWduLCB3aG9sZVBhcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKHN0ciwgNSwgIiUrLjJkLiIsIHdob2xlUGFydCk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIHRoZSBmcmFjdGlvbmFsIHBhcnQKKyAgICBpbnQgZnJhY3Rpb25hbFBhcnQgPSBkZWdyZWV4MTAwMDAgLSAod2hvbGVQYXJ0ICogMTAwMDApOworICAgIGlmIChmcmFjdGlvbmFsUGFydCA8IDApIHsKKyAgICAgICAgZnJhY3Rpb25hbFBhcnQgPSAtZnJhY3Rpb25hbFBhcnQ7CisgICAgfQorICAgIHNucHJpbnRmKCZzdHJbNF0sIDUsICIlLjRkIiwgZnJhY3Rpb25hbFBhcnQpOworCisgICAgLy8gRG8gbm90IHdyaXRlIHRoZSBudWxsIHRlcm1pbmF0b3IKKyAgICB3cml0ZShzdHIsIDEsIDgpOworfQorCisvLyBXcml0dGVuIGluICsvLSBEREQuRERERCBmb3JtYXQKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlTG9uZ2l0dWRlKGludCBkZWdyZWV4MTAwMDApIHsKKyAgICBib29sIGlzTmVnYXRpdmUgPSAoZGVncmVleDEwMDAwIDwgMCk7CisgICAgY2hhciBzaWduID0gaXNOZWdhdGl2ZT8gJy0nOiAnKyc7CisKKyAgICAvLyBIYW5kbGUgdGhlIHdob2xlIHBhcnQKKyAgICBjaGFyIHN0clsxMF07CisgICAgaW50IHdob2xlUGFydCA9IGRlZ3JlZXgxMDAwMCAvIDEwMDAwOworICAgIGlmICh3aG9sZVBhcnQgPT0gMCkgeworICAgICAgICBzbnByaW50ZihzdHIsIDYsICIlYyUuM2QuIiwgc2lnbiwgd2hvbGVQYXJ0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihzdHIsIDYsICIlKy4zZC4iLCB3aG9sZVBhcnQpOworICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGUgZnJhY3Rpb25hbCBwYXJ0CisgICAgaW50IGZyYWN0aW9uYWxQYXJ0ID0gZGVncmVleDEwMDAwIC0gKHdob2xlUGFydCAqIDEwMDAwKTsKKyAgICBpZiAoZnJhY3Rpb25hbFBhcnQgPCAwKSB7CisgICAgICAgIGZyYWN0aW9uYWxQYXJ0ID0gLWZyYWN0aW9uYWxQYXJ0OworICAgIH0KKyAgICBzbnByaW50Zigmc3RyWzVdLCA1LCAiJS40ZCIsIGZyYWN0aW9uYWxQYXJ0KTsKKworICAgIC8vIERvIG5vdCB3cml0ZSB0aGUgbnVsbCB0ZXJtaW5hdG9yCisgICAgd3JpdGUoc3RyLCAxLCA5KTsKK30KKworLyoKKyAqIEdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KKyAqIGxhdGl0dWRleDEwMDAwIGlzIGxhdGl0dWRlIGluIGRlZ3JlZXMgdGltZXMgMTAwMDAsIGFuZAorICogbG9uZ2l0dWRleDEwMDAwIGlzIGxvbmdpdHVkZSBpbiBkZWdyZWVzIHRpbWVzIDEwMDAwLgorICogVGhlIHJhbmdlIGZvciB0aGUgbGF0aXR1ZGUgaXMgaW4gWy05MCwgKzkwXSwgYW5kCisgKiBUaGUgcmFuZ2UgZm9yIHRoZSBsb25naXR1ZGUgaXMgaW4gWy0xODAsICsxODBdCisgKi8KK3N0YXR1c190IE1QRUc0V3JpdGVyOjpzZXRHZW9EYXRhKGludCBsYXRpdHVkZXgxMDAwMCwgaW50IGxvbmdpdHVkZXgxMDAwMCkgeworICAgIC8vIElzIGxhdGl0dWRlIG9yIGxvbmdpdHVkZSBvdXQgb2YgcmFuZ2U/CisgICAgaWYgKGxhdGl0dWRleDEwMDAwIDwgLTkwMDAwMCB8fCBsYXRpdHVkZXgxMDAwMCA+IDkwMDAwMCB8fAorICAgICAgICBsb25naXR1ZGV4MTAwMDAgPCAtMTgwMDAwMCB8fCBsb25naXR1ZGV4MTAwMDAgPiAxODAwMDAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbUxhdGl0dWRleDEwMDAwID0gbGF0aXR1ZGV4MTAwMDA7CisgICAgbUxvbmdpdHVkZXgxMDAwMCA9IGxvbmdpdHVkZXgxMDAwMDsKKyAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZSA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHdyaXRlKGRhdGEsIDEsIHNpemUpOwogfQpAQCAtOTQ1LDcgKzExMDYsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRXcml0ZXI6OlRyYWNrOjpUcmFjaygKLSAgICAgICAgTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHRyYWNrSWQpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbU1ldGEoc291cmNlLT5nZXRGb3JtYXQoKSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCkBAIC05NTMsNiArMTExNCw3IEBACiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1SZXN1bWVkKGZhbHNlKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1UcmFja0lkKHRyYWNrSWQpLAogICAgICAgbVRyYWNrRHVyYXRpb25VcygwKSwKICAgICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcygwKSwKICAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplKHRydWUpLApAQCAtOTg4LDYgKzExNTAsNyBAQAogICAgICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgKz0gbU51bVN0c2NUYWJsZUVudHJpZXMgKiAxMiArICAvLyBzdHNjIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUN0dHNUYWJsZUVudHJpZXMgKiA4ICsgICAvLyBjdHRzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3pCb3hTaXplQnl0ZXM7ICAgICAgICAgICAgLy8gc3RzeiBib3ggc2l6ZQogICAgIH0KQEAgLTEwMDcsMTMgKzExNzAsMjcgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZVN0dHNUYWJsZUVudHJ5KAotICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDY0X3QgZHVyYXRpb25VcykgeworICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgZHVyYXRpb24pIHsKIAotICAgIFN0dHNUYWJsZUVudHJ5IHN0dHNFbnRyeShzYW1wbGVDb3VudCwgZHVyYXRpb25Vcyk7CisgICAgU3R0c1RhYmxlRW50cnkgc3R0c0VudHJ5KHNhbXBsZUNvdW50LCBkdXJhdGlvbik7CiAgICAgbVN0dHNUYWJsZUVudHJpZXMucHVzaF9iYWNrKHN0dHNFbnRyeSk7CiAgICAgKyttTnVtU3R0c1RhYmxlRW50cmllczsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZUN0dHNUYWJsZUVudHJ5KAorICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgZHVyYXRpb24pIHsKKworICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkdXJhdGlvbiA8IDAgJiYgIW1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uKSB7CisgICAgICAgIG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgQ3R0c1RhYmxlRW50cnkgY3R0c0VudHJ5KHNhbXBsZUNvdW50LCBkdXJhdGlvbik7CisgICAgbUN0dHNUYWJsZUVudHJpZXMucHVzaF9iYWNrKGN0dHNFbnRyeSk7CisgICAgKyttTnVtQ3R0c1RhYmxlRW50cmllczsKK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgKyttTnVtU3Rjb1RhYmxlRW50cmllczsKICAgICBtQ2h1bmtPZmZzZXRzLnB1c2hfYmFjayhvZmZzZXQpOwpAQCAtMTE0OSwxOCArMTMyNiwxNCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVBbGxDaHVua3MoKSB7CiAgICAgTE9HVigid3JpdGVBbGxDaHVua3MiKTsKICAgICBzaXplX3Qgb3V0c3RhbmRpbmdDaHVua3MgPSAwOwotICAgIHdoaWxlICghbUNodW5rSW5mb3MuZW1wdHkoKSkgewotICAgICAgICBMaXN0PENodW5rSW5mbz46Oml0ZXJhdG9yIGl0ID0gbUNodW5rSW5mb3MuYmVnaW4oKTsKLSAgICAgICAgd2hpbGUgKCFpdC0+bUNodW5rcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBDaHVuayBjaHVuazsKLSAgICAgICAgICAgIGlmIChmaW5kQ2h1bmtUb1dyaXRlKCZjaHVuaykpIHsKLSAgICAgICAgICAgICAgICB3cml0ZUNodW5rVG9GaWxlKCZjaHVuayk7Ci0gICAgICAgICAgICAgICAgKytvdXRzdGFuZGluZ0NodW5rczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpdC0+bVRyYWNrID0gTlVMTDsKLSAgICAgICAgbUNodW5rSW5mb3MuZXJhc2UoaXQpOworICAgIENodW5rIGNodW5rOworICAgIHdoaWxlIChmaW5kQ2h1bmtUb1dyaXRlKCZjaHVuaykpIHsKKyAgICAgICAgd3JpdGVDaHVua1RvRmlsZSgmY2h1bmspOworICAgICAgICArK291dHN0YW5kaW5nQ2h1bmtzOwogICAgIH0KKworICAgIHNlbmRTZXNzaW9uU3VtbWFyeSgpOworCiAgICAgbUNodW5rSW5mb3MuY2xlYXIoKTsKICAgICBMT0dEKCIlZCBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7CiB9CkBAIC0xMTY4LDggKzEzNDEsNiBAQAogYm9vbCBNUEVHNFdyaXRlcjo6ZmluZENodW5rVG9Xcml0ZShDaHVuayAqY2h1bmspIHsKICAgICBMT0dWKCJmaW5kQ2h1bmtUb1dyaXRlIik7CiAKLSAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCB0aW1lc3RhbXAsIGFuZCB3cml0ZSB0aGF0IGNodW5rIG91dAotICAgIC8vIFhYWDogV2hhdCBpZiBzb21lIHRyYWNrIGlzIGp1c3QgdG9vIHNsb3c/CiAgICAgaW50NjRfdCBtaW5UaW1lc3RhbXBVcyA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOwogICAgIFRyYWNrICp0cmFjayA9IE5VTEw7CiAgICAgZm9yIChMaXN0PENodW5rSW5mbz46Oml0ZXJhdG9yIGl0ID0gbUNodW5rSW5mb3MuYmVnaW4oKTsKQEAgLTExOTgsNiArMTM2OSwxMyBAQAogICAgICAgICAgICAgKmNodW5rID0gKihpdC0+bUNodW5rcy5iZWdpbigpKTsKICAgICAgICAgICAgIGl0LT5tQ2h1bmtzLmVyYXNlKGl0LT5tQ2h1bmtzLmJlZ2luKCkpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoY2h1bmstPm1UcmFjaywgdHJhY2spOworCisgICAgICAgICAgICBpbnQ2NF90IGludGVyQ2h1bmtUaW1lVXMgPQorICAgICAgICAgICAgICAgIGNodW5rLT5tVGltZVN0YW1wVXMgLSBpdC0+bVByZXZDaHVua1RpbWVzdGFtcFVzOworICAgICAgICAgICAgaWYgKGludGVyQ2h1bmtUaW1lVXMgPiBpdC0+bVByZXZDaHVua1RpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgaXQtPm1NYXhJbnRlckNodW5rRHVyVXMgPSBpbnRlckNodW5rVGltZVVzOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyNDEsNiArMTQxOSw4IEBACiAgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIENodW5rSW5mbyBpbmZvOwogICAgICAgICBpbmZvLm1UcmFjayA9ICppdDsKKyAgICAgICAgaW5mby5tUHJldkNodW5rVGltZXN0YW1wVXMgPSAwOworICAgICAgICBpbmZvLm1NYXhJbnRlckNodW5rRHVyVXMgPSAwOwogICAgICAgICBtQ2h1bmtJbmZvcy5wdXNoX2JhY2soaW5mbyk7CiAgICAgfQogCkBAIC0xMjQ5LDYgKzE0MjksNyBAQAogICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwogICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CiAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIG1Xcml0ZXJUaHJlYWRTdGFydGVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEyNjQsNiArMTQ0NSw3IEBACiAgICAgaWYgKHBhcmFtcyA9PSBOVUxMIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgewogICAgICAgICBzdGFydFRpbWVVcyA9IDA7CiAgICAgfQorICAgIG1TdGFydFRpbWVSZWFsVXMgPSBzdGFydFRpbWVVczsKIAogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghbUlzQXVkaW8gJiYgcGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKQEAgLTEyODgsMTAgKzE0NzAsMTUgQEAKICAgICAgICAgICogc2Vzc2lvbiwgYW5kIGl0IGFsc28gaGVscHMgZWxpbWluYXRlIHRoZSAicmVjb3JkaW5nIiBzb3VuZCBmb3IKICAgICAgICAgICogY2FtY29yZGVyIGFwcGxpY2F0aW9ucy4KICAgICAgICAgICoKLSAgICAgICAgICogSWRlYWxseSwgdGhpcyBwbGF0Zm9ybS1zcGVjaWZpYyB2YWx1ZSBzaG91bGQgYmUgZGVmaW5lZAotICAgICAgICAgKiBpbiBtZWRpYV9wcm9maWxlcy54bWwgZmlsZQorICAgICAgICAgKiBJZiBjbGllbnQgZG9lcyBub3Qgc2V0IHRoZSBzdGFydCB0aW1lIG9mZnNldCwgd2UgZmFsbCBiYWNrIHRvCisgICAgICAgICAqIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIGRlbGF5IHZhbHVlLgogICAgICAgICAgKi8KLSAgICAgICAgc3RhcnRUaW1lVXMgKz0gNzAwMDAwOworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRNcygpICogMTAwMExMOworICAgICAgICBpZiAoc3RhcnRUaW1lT2Zmc2V0VXMgPCAwKSB7ICAvLyBTdGFydCB0aW1lIG9mZnNldCB3YXMgbm90IHNldAorICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOworICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOworICAgICAgICBMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJWxsZCB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKICAgICB9CiAKICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwpAQCAtMTMxNSwxMyArMTUwMiwxMSBAQAogICAgIG1OdW1TdHNzVGFibGVFbnRyaWVzID0gMDsKICAgICBtTnVtU3RzY1RhYmxlRW50cmllcyA9IDA7CiAgICAgbU51bVN0dHNUYWJsZUVudHJpZXMgPSAwOworICAgIG1OdW1DdHRzVGFibGVFbnRyaWVzID0gMDsKICAgICBtTWRhdFNpemVCeXRlcyA9IDA7Ci0gICAgbUlzTWVkaWFUaW1lQWRqdXN0bWVudE9uID0gZmFsc2U7Ci0gICAgbVByZXZNZWRpYVRpbWVBZGp1c3RUaW1lc3RhbXBVcyA9IDA7Ci0gICAgbU1lZGlhVGltZUFkanVzdE51bUZyYW1lcyA9IDA7Ci0gICAgbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGUgPSAwOwotICAgIG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgPSAwOwotICAgIG1QcmV2VG90YWxBY2N1bURyaWZ0VGltZVVzID0gMDsKKworICAgIG1NYXhDaHVua0R1cmF0aW9uVXMgPSAwOworICAgIG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uID0gZmFsc2U7CiAKICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgJmF0dHIsIFRocmVhZFdyYXBwZXIsIHRoaXMpOwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKQEAgLTE1MzAsNyArMTcxNSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KLQorLy8gRklYTUU6CisvLyBBZGQgY2hyb21hdF9mb3JtYXRfaWRjLCBiaXQgZGVwdGggdmFsdWVzLCBldGMgZm9yIEFWQy9oMjY0IGhpZ2ggcHJvZmlsZSBhbmQgYWJvdmUKKy8vIGFuZCByZW1vdmUgI2lmIDAKKyNpZiAwCiAgICAgewogICAgICAgICAvLyBDaGVjayBvbiB0aGUgcHJvZmlsZXMKICAgICAgICAgLy8gVGhlc2UgcHJvZmlsZXMgcmVxdWlyZXMgYWRkaXRpb25hbCBwYXJhbWV0ZXIgc2V0IGV4dGVuc2lvbnMKQEAgLTE1NDAsNyArMTcyOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQotCisjZW5kaWYKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2MTgsMTI4ICsxODA2LDYgQEAKIH0KIAogLyoKLSogVGhlIHZpZGVvIHRyYWNrJ3MgbWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zCi0qIGlzIGRlc2NyaWJlZCBhcyBmb2xsb3dzOgotKgotKiBGaXJzdCwgdGhlIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBpcyBkb25lIGZvciBldmVyeSBwZXJpb2Qgb2YKLSoga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMKLSogaXMgY3VycmVudGx5IGEgZml4ZWQgdmFsdWUgY2hvc2VuIGhldXJpc3RpY2FsbHkuIFRoZSB2YWx1ZSBvZgotKiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMgc2hvdWxkIG5vdCBiZSB2ZXJ5IGxhcmdlIG9yIHZlcnkgc21hbGwKLSogZm9yIHR3byBjb25zaWRlcmF0aW9uczogb24gb25lIGhhbmQsIGEgcmVsYXRpdmVseSBsYXJnZSB2YWx1ZQotKiBoZWxwcyByZWR1Y2UgbGFyZ2UgZmx1Y3R1YXRpb24gb2YgZHJpZnQgdGltZSBpbiB0aGUgYXVkaW8gZW5jb2RpbmcKLSogcGF0aDsgd2hpbGUgb24gdGhlIG90aGVyIGhhbmQsIGEgcmVsYXRpdmVseSBzbWFsbCB2YWx1ZSBoZWxwcyBrZWVwCi0qIHJlc3RvcmluZyBzeW5jaHJvbml6YXRpb24gaW4gYXVkaW8vdmlkZW8gbW9yZSBmcmVxdWVudGx5LiBOb3RlIGZvciB0aGUKLSogdmVyeSBmaXJzdCBwZXJpb2Qgb2Yga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLCB0aGVyZSBpcwotKiBubyBtZWRpYSB0aW1lIGFkanVzdG1lbnQgZm9yIHRoZSB2aWRlbyB0cmFjay4KLSoKLSogU2Vjb25kLCB0aGUgdG90YWwgYWNjdW11bGF0ZWQgYXVkaW8gdHJhY2sgdGltZSBkcmlmdCBmb3VuZAotKiBpbiBhIHBlcmlvZCBvZiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMgaXMgZGlzdHJpYnV0ZWQKLSogb3ZlciBhIHN0cmVhbSBvZiBpbmNvbWluZyB2aWRlbyBmcmFtZXMuIFRoZSBudW1iZXIgb2YgdmlkZW8gZnJhbWVzCi0qIGFmZmVjdGVkIGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIG51bWJlciBvZiByZWNvcmRlZCB2aWRlbyBmcmFtZXMKLSogd2l0aGluIHRoZSBwYXN0IGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVcyBwZXJpb2QuCi0qIFdlIGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBkcmlmdCB0aW1lIG92ZXIgb25seSBhIHBvcnRpb24KLSogKHJhdGhlciB0aGFuIGFsbCkgb2YgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRlZCB2aWRlbyBmcmFtZXMKLSogaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZpZGVvIHRyYWNrIG1lZGlhIHRpbWUgYWRqdXN0bWVudCBpcwotKiBjb21wbGV0ZWQgZm9yIHRoZSBjdXJyZW50IHBlcmlvZCBiZWZvcmUgdGhlIG5leHQgdmlkZW8gdHJhY2sgbWVkaWEKLSogdGltZSBhZGp1c3RtZW50IHBlcmlvZCBzdGFydHMuIEN1cnJlbnRseSwgdGhlIHBvcnRpb24gY2hvc2VuIGlzIGEKLSogaGFsZiAoMC41KS4KLSoKLSogTGFzdCwgdmFyaW91cyBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHRvIGVuc3VyZSB0aGF0Ci0qIHRoZSBhY3R1YWwgYXVkaW8gZW5jb2RpbmcgcGF0aCBkb2VzIG5vdCBoYXZlIHRvbyBtdWNoIGRyaWZ0LgotKiBJbiBwYXJ0aWN1bGFyLCAxKSB3ZSB3YW50IHRvIGxpbWl0IHRoZSBhdmVyYWdlIGluY3JlbWVudGFsIHRpbWUKLSogYWRqdXN0bWVudCBmb3IgZWFjaCB2aWRlbyBmcmFtZSB0byBiZSBsZXNzIHRoYW4gYSB0aHJlc2hvbGQKLSogZm9yIGEgc2luZ2xlIHBlcmlvZCBvZiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMuCi0qIEN1cnJlbnRseSwgdGhlIHRocmVzaG9sZCBpcyBzZXQgdG8gNSBtcy4gSWYgdGhlIGF2ZXJhZ2UgaW5jcmVtZW50YWwKLSogbWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciBhIHZpZGVvIGZyYW1lIGlzIGxhcmdlciB0aGFuIHRoZQotKiB0aHJlc2hvbGQsIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRoIGhhcyB0b28gbXVjaCB0aW1lIGRyaWZ0LgotKiAyKSBXZSBhbHNvIHdhbnQgdG8gbGltaXQgdGhlIHRvdGFsIHRpbWUgZHJpZnQgaW4gdGhlIGF1ZGlvCi0qIGVuY29kaW5nIHBhdGggdG8gYmUgbGVzcyB0aGFuIGEgdGhyZXNob2xkIGZvciBhIHBlcmlvZCBvZgotKiBrVmlkZW9NZWRpYVRpbWVBZGp1c3RQZXJpb2RUaW1lVXMuIEN1cnJlbnRseSwgdGhlIHRocmVzaG9sZAotKiBpcyAwLjUlIG9mIGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVcy4gSWYgdGhlIHRpbWUgZHJpZnQgb2YKLSogdGhlIGF1ZGlvIGVuY29kaW5nIHBhdGggaXMgbGFyZ2VyIHRoYW4gdGhlIHRocmVzaG9sZCwgdGhlIGF1ZGlvCi0qIGVuY29kaW5nIHBhdGggaGFzIHRvbyBtdWNoIHRpbWUgZHJpZnQuIFdlIHRyZWF0IHRoZSBsYXJnZSB0aW1lCi0qIGRyaWZ0IG9mIHRoZSBhdWRpbyBlbmNvZGluZyBwYXRoIGFzIGVycm9ycywgc2luY2UgdGhlcmUgaXMgbm8KLSogd2F5IHRvIGtlZXAgYXVkaW8vdmlkZW8gaW4gc3luY2hyb25pemF0aW9uIGZvciByZWFsLXRpbWUKLSogYXBwbGljYXRpb25zIGlmIHRoZSB0aW1lIGRyaWZ0IGlzIHRvbyBsYXJnZSB1bmxlc3Mgd2UgZHJvcCBzb21lCi0qIHZpZGVvIGZyYW1lcywgd2hpY2ggaGFzIGl0cyBvd24gcHJvYmxlbXMgdGhhdCB3ZSBkb24ndCB3YW50Ci0qIHRvIGdldCBpbnRvIGZvciB0aGUgdGltZSBiZWluZy4KLSovCi12b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRqdXN0TWVkaWFUaW1lKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7Ci0gICAgaWYgKCp0aW1lc3RhbXBVcyAtIG1QcmV2TWVkaWFUaW1lQWRqdXN0VGltZXN0YW1wVXMgPj0KLSAgICAgICAga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzKSB7Ci0KLSAgICAgICAgTE9HVigiTmV3IG1lZGlhIHRpbWUgYWRqdXN0bWVudCBwZXJpb2QgYXQgJWxsZCB1cyIsICp0aW1lc3RhbXBVcyk7Ci0gICAgICAgIG1Jc01lZGlhVGltZUFkanVzdG1lbnRPbiA9IHRydWU7Ci0gICAgICAgIG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXMgPQotICAgICAgICAgICAgICAgIChtTnVtU2FtcGxlcyAtIG1QcmV2TWVkaWFUaW1lQWRqdXN0U2FtcGxlKSA+PiAxOwotCi0gICAgICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0VGltZXN0YW1wVXMgPSAqdGltZXN0YW1wVXM7Ci0gICAgICAgIG1QcmV2TWVkaWFUaW1lQWRqdXN0U2FtcGxlID0gbU51bVNhbXBsZXM7Ci0gICAgICAgIGludDY0X3QgdG90YWxBY2N1bURyaWZ0VGltZVVzID0gbU93bmVyLT5nZXREcmlmdFRpbWVVcygpOwotICAgICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzID0KLSAgICAgICAgICAgICAgICB0b3RhbEFjY3VtRHJpZnRUaW1lVXMgLSBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVczsKLQotICAgICAgICBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyA9IHRvdGFsQWNjdW1EcmlmdFRpbWVVczsKLQotICAgICAgICAvLyBDaGVjayBvbiBpbmNyZW1lbnRhbCBhZGp1c3RlZCB0aW1lIHBlciBmcmFtZQotICAgICAgICBpbnQ2NF90IGFkanVzdFRpbWVQZXJGcmFtZVVzID0KLSAgICAgICAgICAgICAgICBtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzIC8gbU1lZGlhVGltZUFkanVzdE51bUZyYW1lczsKLQotICAgICAgICBpZiAoYWRqdXN0VGltZVBlckZyYW1lVXMgPCAwKSB7Ci0gICAgICAgICAgICBhZGp1c3RUaW1lUGVyRnJhbWVVcyA9IC1hZGp1c3RUaW1lUGVyRnJhbWVVczsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWRqdXN0VGltZVBlckZyYW1lVXMgPj0gNTAwMCkgewotICAgICAgICAgICAgTE9HRSgiQWRqdXN0ZWQgdGltZSBwZXIgdmlkZW8gZnJhbWUgaXMgJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgYWRqdXN0VGltZVBlckZyYW1lVXMpOwotICAgICAgICAgICAgQ0hFQ0soISJWaWRlbyBmcmFtZSB0aW1lIGFkanVzdG1lbnQgaXMgdG9vIGxhcmdlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgb24gdG90YWwgYWNjdW11bGF0ZWQgdGltZSBkcmlmdCB3aXRoaW4gYSBwZXJpb2Qgb2YKLSAgICAgICAgLy8ga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzLgotICAgICAgICBpbnQ2NF90IGRyaWZ0UGVyY2VudGFnZSA9IChtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzICogMTAwMCkKLSAgICAgICAgICAgICAgICAvIGtWaWRlb01lZGlhVGltZUFkanVzdFBlcmlvZFRpbWVVczsKLQotICAgICAgICBpZiAoZHJpZnRQZXJjZW50YWdlIDwgMCkgewotICAgICAgICAgICAgZHJpZnRQZXJjZW50YWdlID0gLWRyaWZ0UGVyY2VudGFnZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHJpZnRQZXJjZW50YWdlID4gNSkgewotICAgICAgICAgICAgTE9HRSgiQXVkaW8gdHJhY2sgaGFzIHRpbWUgZHJpZnQgJWxsZCB1cyBvdmVyICVsbGQgdXMiLAotICAgICAgICAgICAgICAgIG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMsCi0gICAgICAgICAgICAgICAga1ZpZGVvTWVkaWFUaW1lQWRqdXN0UGVyaW9kVGltZVVzKTsKLQotICAgICAgICAgICAgQ0hFQ0soISJUaGUgYXVkaW8gdHJhY2sgbWVkaWEgdGltZSBkcmlmdHMgdG9vIG11Y2ghIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGlmIChtSXNNZWRpYVRpbWVBZGp1c3RtZW50T24pIHsKLSAgICAgICAgaWYgKG1OdW1TYW1wbGVzIC0gbVByZXZNZWRpYVRpbWVBZGp1c3RTYW1wbGUgPD0KLSAgICAgICAgICAgIG1NZWRpYVRpbWVBZGp1c3ROdW1GcmFtZXMpIHsKLQotICAgICAgICAgICAgLy8gRG8gbWVkaWEgdGltZSBpbmNyZW1lbnRhbCBhZGp1c3RtZW50Ci0gICAgICAgICAgICBpbnQ2NF90IGluY3JlbWVudGFsQWRqdXN0VGltZVVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtVG90YWxEcmlmdFRpbWVUb0FkanVzdFVzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bVNhbXBsZXMgLSBtUHJldk1lZGlhVGltZUFkanVzdFNhbXBsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbU1lZGlhVGltZUFkanVzdE51bUZyYW1lczsKLQotICAgICAgICAgICAgKnRpbWVzdGFtcFVzICs9Ci0gICAgICAgICAgICAgICAgKGluY3JlbWVudGFsQWRqdXN0VGltZVVzICsgbVByZXZUb3RhbEFjY3VtRHJpZnRUaW1lVXMpOwotCi0gICAgICAgICAgICBMT0dWKCJJbmNyZW1lbnRhbCB2aWRlbyBmcmFtZSBtZWRpYSB0aW1lIGFkanVzdG1lbnQ6ICVsbGQgdXMiLAotICAgICAgICAgICAgICAgIChpbmNyZW1lbnRhbEFkanVzdFRpbWVVcyArIG1QcmV2VG90YWxBY2N1bURyaWZ0VGltZVVzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXaXRoaW4gdGhlIHJlbWFpbmluZyBhZGp1c3RtZW50IHBlcmlvZCwKLSAgICAgICAgICAgIC8vIG5vIGluY3JlbWVudGFsIGFkanVzdG1lbnQgaXMgbmVlZGVkLgotICAgICAgICAgICAgKnRpbWVzdGFtcFVzICs9Ci0gICAgICAgICAgICAgICAgKG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgKyBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcyk7Ci0KLSAgICAgICAgICAgIExPR1YoIkZpeGVkIHZpZGVvIGZyYW1lIG1lZGlhIHRpbWUgYWRqdXN0bWVudDogJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgKG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgKyBtUHJldlRvdGFsQWNjdW1EcmlmdFRpbWVVcykpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgogICogVXBkYXRlcyB0aGUgZHJpZnQgdGltZSBmcm9tIHRoZSBhdWRpbyB0cmFjayBzbyB0aGF0CiAgKiB0aGUgdmlkZW8gdHJhY2sgY2FuIGdldCB0aGUgdXBkYXRlZCBkcmlmdCB0aW1lIGluZm9ybWF0aW9uCiAgKiBmcm9tIHRoZSBmaWxlIHdyaXRlci4gVGhlIGZsdWN0dWF0aW9uIG9mIHRoZSBkcmlmdCB0aW1lIG9mIHRoZSBhdWRpbwpAQCAtMTc1OSwyNCArMTgyNSw0MCBAQAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjp0aHJlYWRFbnRyeSgpIHsKICAgICBpbnQzMl90IGNvdW50ID0gMDsKICAgICBjb25zdCBpbnQ2NF90IGludGVybGVhdmVEdXJhdGlvblVzID0gbU93bmVyLT5pbnRlcmxlYXZlRHVyYXRpb24oKTsKKyAgICBjb25zdCBib29sIGhhc011bHRpcGxlVHJhY2tzID0gKG1Pd25lci0+bnVtVHJhY2tzKCkgPiAxKTsKICAgICBpbnQ2NF90IGNodW5rVGltZXN0YW1wVXMgPSAwOwogICAgIGludDMyX3QgbkNodW5rcyA9IDA7CiAgICAgaW50MzJfdCBuWmVyb0xlbmd0aEZyYW1lcyA9IDA7Ci0gICAgaW50NjRfdCBsYXN0VGltZXN0YW1wVXMgPSAwOyAgLy8gUHJldmlvdXMgc2FtcGxlIHRpbWUgc3RhbXAgaW4gbXMKLSAgICBpbnQ2NF90IGxhc3REdXJhdGlvblVzID0gMDsgICAvLyBCZXR3ZWVuIHRoZSBwcmV2aW91cyB0d28gc2FtcGxlcyBpbiBtcwotICAgIGludDY0X3QgY3VyckR1cmF0aW9uVGlja3MgPSAwOyAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCi0gICAgaW50NjRfdCBsYXN0RHVyYXRpb25UaWNrcyA9IDA7ICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKLSAgICBpbnQzMl90IHNhbXBsZUNvdW50ID0gMTsgICAgICAvLyBTYW1wbGUgY291bnQgaW4gdGhlIGN1cnJlbnQgc3R0cyB0YWJsZSBlbnRyeQotICAgIHVpbnQzMl90IHByZXZpb3VzU2FtcGxlU2l6ZSA9IDA7ICAvLyBTaXplIG9mIHRoZSBwcmV2aW91cyBzYW1wbGUKKyAgICBpbnQ2NF90IGxhc3RUaW1lc3RhbXBVcyA9IDA7ICAgICAgLy8gUHJldmlvdXMgc2FtcGxlIHRpbWUgc3RhbXAKKyAgICBpbnQ2NF90IGxhc3RDdHRzVGltZVVzID0gMDsgICAgICAgLy8gUHJldmlvdXMgc2FtcGxlIHRpbWUgc3RhbXAKKyAgICBpbnQ2NF90IGxhc3REdXJhdGlvblVzID0gMDsgICAgICAgLy8gQmV0d2VlbiB0aGUgcHJldmlvdXMgdHdvIHNhbXBsZXMKKyAgICBpbnQ2NF90IGN1cnJEdXJhdGlvblRpY2tzID0gMDsgICAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25UaWNrcyA9IDA7ICAgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDMyX3Qgc2FtcGxlQ291bnQgPSAxOyAgICAgICAgICAvLyBTYW1wbGUgY291bnQgaW4gdGhlIGN1cnJlbnQgc3R0cyB0YWJsZSBlbnRyeQorICAgIGludDY0X3QgY3VyckN0dHNEdXJUaWNrcyA9IDA7ICAgICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKKyAgICBpbnQ2NF90IGxhc3RDdHRzRHVyVGlja3MgPSAwOyAgICAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50MzJfdCBjdHRzU2FtcGxlQ291bnQgPSAxOyAgICAgIC8vIFNhbXBsZSBjb3VudCBpbiB0aGUgY3VycmVudCBjdHRzIHRhYmxlIGVudHJ5CisgICAgdWludDMyX3QgcHJldmlvdXNTYW1wbGVTaXplID0gMDsgICAgICAvLyBTaXplIG9mIHRoZSBwcmV2aW91cyBzYW1wbGUKICAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7Ci0gICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQ2NF90IGN0dHNEZWx0YVRpbWVVcyA9IDA7CisgICAgYm9vbCBoYXNCRnJhbWVzID0gZmFsc2U7CiAKKyNpZiAxCisgICAgLy8gWFhYOiBTYW1zdW5nJ3MgdmlkZW8gZW5jb2RlcidzIG91dHB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgLy8gaXMgbm90IGNvcnJlY3QuIHNlZSBidWcgNDcyNDMzOQorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJydy5tZWRpYS5yZWNvcmQuaGFzYiIsIHZhbHVlLCBOVUxMKSAmJgorICAgICAgICAoIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICIxIikpKSB7CisgICAgICAgIGhhc0JGcmFtZXMgPSB0cnVlOworICAgIH0KKyNlbmRpZgogICAgIGlmIChtSXNBdWRpbykgewogICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIkF1ZGlvVHJhY2tFbmNvZGluZyIsIDAsIDAsIDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiVmlkZW9UcmFja0VuY29kaW5nIiwgMCwgMCwgMCk7CiAgICAgfQotICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogCiAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YTsKIApAQCAtMTg2NiwzNyArMTk0OCwxMSBAQAogCiAgICAgICAgIGludDMyX3QgaXNTeW5jID0gZmFsc2U7CiAgICAgICAgIG1ldGFfZGF0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIG9yaWdpbmFsIHRpbWVzdGFtcCBmb3VuZCBpbiB0aGUgZGF0YSBidWZmZXIgd2lsbCBiZSBtb2RpZmllZCBhcyBiZWxvdzoKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlcmUgaXMgYSBwbGF5YmFjayBvZmZzZXQgaW50byB0aGlzIHRyYWNrIGlmIHRoZSB0cmFjaydzIHN0YXJ0IHRpbWUKLSAgICAgICAgICogaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBtb3ZpZSBzdGFydCB0aW1lLCB3aGljaCB3aWxsIGJlIHJlY29yZGVkIGluIGVkc3QKLSAgICAgICAgICogYm94IG9mIHRoZSBvdXRwdXQgZmlsZS4gVGhlIHBsYXliYWNrIG9mZnNldCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgICAgICAgICogc3RhcnRpbmcgdGltZSBvZiB0aGUgYXVkaW8vdmlkZW8gdHJhY2tzIGFyZSBzeW5jaHJvbml6ZWQuIEFsdGhvdWdoIHRoZQotICAgICAgICAgKiB0cmFjaydzIG1lZGlhIHRpbWVzdGFtcCBtYXkgYmUgc3ViamVjdCB0byB2YXJpb3VzIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgICogYXMgb3V0bGluZWQgYmVsb3csIHRoZSB0cmFjaydzIHBsYXliYWNrIG9mZnNldCB0aW1lIHJlbWFpbnMgdW5jaGFuZ2VkCi0gICAgICAgICAqIG9uY2UgdGhlIGZpcnN0IGRhdGEgYnVmZmVyIG9mIHRoZSB0cmFjayBpcyByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIG1lZGlhIHRpbWUgc3RhbXAgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSBwbGF5YmFjayBvZmZzZXQKLSAgICAgICAgICogKGFuZCBwb3RlbnRpYWwgcGF1c2UgZHVyYXRpb25zKSBmcm9tIHRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgaW4gdGhlIGJ1ZmZlci4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhpcyB0cmFjayBpcyBhIHZpZGVvIHRyYWNrIGZvciBhIHJlYWwtdGltZSByZWNvcmRpbmcgYXBwbGljYXRpb24gd2l0aAotICAgICAgICAgKiBib3RoIGF1ZGlvIGFuZCB2aWRlbyB0cmFja3MsIGl0cyBtZWRpYSB0aW1lc3RhbXAgd2lsbCBzdWJqZWN0IHRvIGZ1cnRoZXIKLSAgICAgICAgICogbW9kaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSBtZWRpYSBjbG9jayBvZiB0aGUgYXVkaW8gdHJhY2suIFRoaXMgbW9kaWZpY2F0aW9uCi0gICAgICAgICAqIGlzIG5lZWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbWFpbnRhaW5pbmcgZ29vZCBhdWRpby92aWRlbyBzeW5jaHJvbml6YXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIElmIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBpcyBwYXVzZWQgYW5kIHJlc3VtZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB0cmFjawotICAgICAgICAgKiBtZWRpYSB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCBhcyBpZiB0aGUgIHJlY29yZGluZyBzZXNzaW9uIGhhZCBuZXZlciBiZWVuCi0gICAgICAgICAqIHBhdXNlZCBhdCBhbGwgZHVyaW5nIHBsYXliYWNrIG9mIHRoZSByZWNvcmRlZCBvdXRwdXQgZmlsZS4gSW4gb3RoZXIgd29yZHMsCi0gICAgICAgICAqIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGhhdmUgbm8gbWVtb3J5IG9mIHBhdXNlL3Jlc3VtZSBkdXJhdGlvbnMuCi0gICAgICAgICAqCi0gICAgICAgICAqLwogICAgICAgICBDSEVDSyhtZXRhX2RhdGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7Ci0gICAgICAgIExPR1YoIiVzIHRpbWVzdGFtcFVzOiAlbGxkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgaWYgKG1TYW1wbGVTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgICAgICBtT3duZXItPnNldFN0YXJ0VGltZXN0YW1wVXMobVN0YXJ0VGltZXN0YW1wVXMpOwogICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CkBAIC0xOTEzLDMzICsxOTY5LDMyIEBACiAKICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwogICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKKyAgICAgICAgaWYgKCFtSXNBdWRpbyAmJiBoYXNCRnJhbWVzKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZTogdGltZXN0YW1wVXMKKyAgICAgICAgICAgICAqIERlY29kaW5nIHRpbWU6IGRlY29kaW5nVGltZVVzCisgICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lIGRlbHRhID0gY29tcG9zaXRpb24gdGltZSAtIGRlY29kaW5nIHRpbWUKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBXZSBzYXZlIHBpY3R1cmUgZGVjb2RpbmcgdGltZSBzdGFtcCBkZWx0YSBpbiBzdHRzIHRhYmxlIGVudHJpZXMsCisgICAgICAgICAgICAgKiBhbmQgY29tcG9zaXRpb24gdGltZSBkZWx0YSBkdXJhdGlvbiBpbiBjdHRzIHRhYmxlIGVudHJpZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludDY0X3QgZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICBDSEVDSyhtZXRhX2RhdGEtPmZpbmRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCAmZGVjb2RpbmdUaW1lVXMpKTsKKyAgICAgICAgICAgIGRlY29kaW5nVGltZVVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICBjdHRzRGVsdGFUaW1lVXMgPSB0aW1lc3RhbXBVcyAtIGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgdGltZXN0YW1wVXMgPSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgIExPR1YoImRlY29kaW5nIHRpbWU6ICVsbGQgYW5kIGN0dHMgZGVsdGEgdGltZTogJWxsZCIsCisgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNEZWx0YVRpbWVVcyk7CisgICAgICAgIH0KIAotICAgICAgICAvLyBNZWRpYSB0aW1lIGFkanVzdG1lbnQgZm9yIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMKICAgICAgICAgaWYgKG1Jc1JlYWxUaW1lUmVjb3JkaW5nKSB7CiAgICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKICAgICAgICAgICAgICAgICB1cGRhdGVEcmlmdFRpbWUobWV0YV9kYXRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0TWVkaWFUaW1lKCZ0aW1lc3RhbXBVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKLSAgICAgICAgaWYgKG1OdW1TYW1wbGVzID4gMSkgewotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFVzIDw9IGxhc3RUaW1lc3RhbXBVcykgewotICAgICAgICAgICAgICAgIExPR1coIkZyYW1lIGFycml2ZXMgdG9vIGxhdGUhIik7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZHJvcCB0aGUgbGF0ZSBmcmFtZSwgc2luY2UgZHJvcHBpbmcgYSBmcmFtZSBtYXkgY2F1c2UKLSAgICAgICAgICAgICAgICAvLyBwcm9ibGVtcyBsYXRlciBkdXJpbmcgcGxheWJhY2sKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgaGF2aW5nIHR3byBvciBtb3JlIHNhbXBsZXMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAvLyBzYW1lIHRpbWVzdGFtcCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICAgICAgICAgICAgaWYgKG1UaW1lU2NhbGUgPj0gMTAwMDAwMExMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gbGFzdFRpbWVzdGFtcFVzICsgMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RUaW1lc3RhbXBVcyArICgxMDAwMDAwTEwgKyAobVRpbWVTY2FsZSA+PiAxKSkgLyBtVGltZVNjYWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIExPR1YoIiVzIG1lZGlhIHRpbWUgc3RhbXA6ICVsbGQgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlbGxkIiwKICAgICAgICAgICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CiAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1UcmFja0R1cmF0aW9uVXMpIHsKQEAgLTE5NjMsMTEgKzIwMTgsMjMgQEAKICAgICAgICAgICAgIGlmIChtTnVtU2FtcGxlcyA9PSAzIHx8IGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSB7CiAgICAgICAgICAgICAgICAgTE9HVigiJXMgbGFzdER1cmF0aW9uVXM6ICVsbGQgdXMsIGN1cnJEdXJhdGlvblRpY2tzOiAlbGxkIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCBsYXN0RHVyYXRpb25VcywgY3VyckR1cmF0aW9uVGlja3MpOwotICAgICAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50LCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblRpY2tzKTsKICAgICAgICAgICAgICAgICBzYW1wbGVDb3VudCA9IDE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBjdXJyQ3R0c0R1clRpY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICgoY3R0c0RlbHRhVGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCisgICAgICAgICAgICAgICAgICAgICAobGFzdEN0dHNUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyckN0dHNEdXJUaWNrcyAhPSBsYXN0Q3R0c0R1clRpY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KGN0dHNTYW1wbGVDb3VudCwgbGFzdEN0dHNEdXJUaWNrcyk7CisgICAgICAgICAgICAgICAgICAgIGN0dHNTYW1wbGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytjdHRzU2FtcGxlQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgewogICAgICAgICAgICAgaWYgKG1OdW1TYW1wbGVzID49IDIgJiYgcHJldmlvdXNTYW1wbGVTaXplICE9IHNhbXBsZVNpemUpIHsKQEAgLTE5ODEsNiArMjA0OCwxMSBAQAogICAgICAgICBsYXN0RHVyYXRpb25UaWNrcyA9IGN1cnJEdXJhdGlvblRpY2tzOwogICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKIAorICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgICAgICBsYXN0Q3R0c0R1clRpY2tzID0gY3VyckN0dHNEdXJUaWNrczsKKyAgICAgICAgICAgIGxhc3RDdHRzVGltZVVzID0gY3R0c0RlbHRhVGltZVVzOworICAgICAgICB9CisKICAgICAgICAgaWYgKGlzU3luYyAhPSAwKSB7CiAgICAgICAgICAgICBhZGRPbmVTdHNzVGFibGVFbnRyeShtTnVtU2FtcGxlcyk7CiAgICAgICAgIH0KQEAgLTE5OTEsNyArMjA2Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cmFja1Byb2dyZXNzU3RhdHVzKHRpbWVzdGFtcFVzKTsKICAgICAgICAgfQotICAgICAgICBpZiAobU93bmVyLT5udW1UcmFja3MoKSA9PSAxKSB7CisgICAgICAgIGlmICghaGFzTXVsdGlwbGVUcmFja3MpIHsKICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzQXZjPyBtT3duZXItPmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woY29weSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5KTsKICAgICAgICAgICAgIGlmIChtQ2h1bmtPZmZzZXRzLmVtcHR5KCkpIHsKQEAgLTIwMTAsNyArMjA4MiwxMSBAQAogICAgICAgICAgICAgaWYgKGNodW5rVGltZXN0YW1wVXMgPT0gMCkgewogICAgICAgICAgICAgICAgIGNodW5rVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFVzIC0gY2h1bmtUaW1lc3RhbXBVcyA+IGludGVybGVhdmVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBjaHVua0R1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGNodW5rVGltZXN0YW1wVXM7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rRHVyYXRpb25VcyA+IGludGVybGVhdmVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua0R1cmF0aW9uVXMgPiBtTWF4Q2h1bmtEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWF4Q2h1bmtEdXJhdGlvblVzID0gY2h1bmtEdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICsrbkNodW5rczsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5DaHVua3MgPT0gMSB8fCAgLy8gRmlyc3QgY2h1bmsKICAgICAgICAgICAgICAgICAgICAgICAgICgtLShtU3RzY1RhYmxlRW50cmllcy5lbmQoKSkpLT5zYW1wbGVzUGVyQ2h1bmsgIT0KQEAgLTIwMjUsMTUgKzIxMDEsMTQgQEAKIAogICAgIH0KIAotICAgIGlmIChtU2FtcGxlU2l6ZXMuZW1wdHkoKSB8fCAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzYW1wbGVzIHdyaXR0ZW4KLSAgICAgICAgKCFtSXNBdWRpbyAmJiBtTnVtU3Rzc1RhYmxlRW50cmllcyA9PSAwKSB8fCAgLy8gbm8gc3luYyBmcmFtZXMgZm9yIHZpZGVvCi0gICAgICAgIChPSyAhPSBjaGVja0NvZGVjU3BlY2lmaWNEYXRhKCkpKSB7ICAgICAgICAgIC8vIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBpZiAoaXNUcmFja01hbEZvcm1lZCgpKSB7CiAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKHRoaXMsIC0xLCBlcnIpOworCisgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKG1UcmFja0lkLCAtMSwgZXJyKTsKIAogICAgIC8vIExhc3QgY2h1bmsKLSAgICBpZiAobU93bmVyLT5udW1UcmFja3MoKSA9PSAxKSB7CisgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgxLCBtTnVtU2FtcGxlcyk7CiAgICAgfSBlbHNlIGlmICghbUNodW5rU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KCsrbkNodW5rcywgbUNodW5rU2FtcGxlcy5zaXplKCkpOwpAQCAtMjA0NSwyMSArMjEyMCwyOCBAQAogICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCiAgICAgaWYgKG1OdW1TYW1wbGVzID09IDEpIHsKICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KKyAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSAwOworICAgICAgICBsYXN0Q3R0c0R1clRpY2tzID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICArK3NhbXBsZUNvdW50OyAgLy8gQ291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZQorICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKICAgICB9CiAKICAgICBpZiAobU51bVNhbXBsZXMgPD0gMikgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeSgxLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KDEsIGxhc3REdXJhdGlvblRpY2tzKTsKICAgICAgICAgaWYgKHNhbXBsZUNvdW50IC0gMSA+IDApIHsKLSAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50IC0gMSwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQgLSAxLCBsYXN0RHVyYXRpb25UaWNrcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwogICAgIH0KIAorICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KGN0dHNTYW1wbGVDb3VudCwgbGFzdEN0dHNEdXJUaWNrcyk7CiAgICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisKKyAgICBzZW5kVHJhY2tTdW1tYXJ5KGhhc011bHRpcGxlVHJhY2tzKTsKKwogICAgIExPR0koIlJlY2VpdmVkIHRvdGFsLzAtbGVuZ3RoICglZC8lZCkgYnVmZmVycyBhbmQgZW5jb2RlZCAlZCBmcmFtZXMuIC0gJXMiLAogICAgICAgICAgICAgY291bnQsIG5aZXJvTGVuZ3RoRnJhbWVzLCBtTnVtU2FtcGxlcywgbUlzQXVkaW8/ICJhdWRpbyI6ICJ2aWRlbyIpOwogICAgIGlmIChtSXNBdWRpbykgewpAQCAtMjA3Miw0NiArMjE1NCwxMTIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNUcmFja01hbEZvcm1lZCgpIGNvbnN0IHsKKyAgICBpZiAobVNhbXBsZVNpemVzLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2FtcGxlcyB3cml0dGVuCisgICAgICAgIExPR0UoIlRoZSBudW1iZXIgb2YgcmVjb3JkZWQgc2FtcGxlcyBpcyAwIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghbUlzQXVkaW8gJiYgbU51bVN0c3NUYWJsZUVudHJpZXMgPT0gMCkgeyAgLy8gbm8gc3luYyBmcmFtZXMgZm9yIHZpZGVvCisgICAgICAgIExPR0UoIlRoZXJlIGFyZSBubyBzeW5jIGZyYW1lcyBmb3IgdmlkZW8gdHJhY2siKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKE9LICE9IGNoZWNrQ29kZWNTcGVjaWZpY0RhdGEoKSkgeyAgICAgICAgIC8vIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6c2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKSB7CisKKyAgICAvLyBTZW5kIHRyYWNrIHN1bW1hcnkgb25seSBpZiB0ZXN0IG1vZGUgaXMgZW5hYmxlZC4KKyAgICBpZiAoIWlzVGVzdE1vZGVFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB0cmFja051bSA9IChtVHJhY2tJZCA8PCAyOCk7CisKKyAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8/IDA6IDEpOworCisgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX0RVUkFUSU9OX01TLAorICAgICAgICAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzIC8gMTAwMCk7CisKKyAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fRU5DT0RFRF9GUkFNRVMsCisgICAgICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzKTsKKworICAgIHsKKyAgICAgICAgLy8gVGhlIHN5c3RlbSBkZWxheSB0aW1lIGV4Y2x1ZGluZyB0aGUgcmVxdWVzdGVkIGluaXRpYWwgZGVsYXkgdGhhdAorICAgICAgICAvLyBpcyB1c2VkIHRvIGVsaW1pbmF0ZSB0aGUgcmVjb3JkaW5nIHNvdW5kLgorICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVPZmZzZXRNcygpICogMTAwMExMOworICAgICAgICBpZiAoc3RhcnRUaW1lT2Zmc2V0VXMgPCAwKSB7ICAvLyBTdGFydCB0aW1lIG9mZnNldCB3YXMgbm90IHNldAorICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgaW5pdGlhbERlbGF5VXMgPQorICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyAtIG1TdGFydFRpbWVSZWFsVXMgLSBzdGFydFRpbWVPZmZzZXRVczsKKworICAgICAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fSU5JVElBTF9ERUxBWV9NUywKKyAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxEZWxheVVzKSAvIDEwMDApOworICAgIH0KKworICAgIG1Pd25lci0+bm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19EQVRBX0tCWVRFUywKKyAgICAgICAgICAgICAgICAgICAgbU1kYXRTaXplQnl0ZXMgLyAxMDI0KTsKKworICAgIGlmIChoYXNNdWx0aXBsZVRyYWNrcykgeworICAgICAgICBtT3duZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fTUFYX0NIVU5LX0RVUl9NUywKKyAgICAgICAgICAgICAgICAgICAgbU1heENodW5rRHVyYXRpb25VcyAvIDEwMDApOworCisgICAgICAgIGludDY0X3QgbW9vdlN0YXJ0VGltZVVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVzdGFtcFVzKCk7CisgICAgICAgIGlmIChtU3RhcnRUaW1lc3RhbXBVcyAhPSBtb292U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lT2Zmc2V0VXMgPSBtU3RhcnRUaW1lc3RhbXBVcyAtIG1vb3ZTdGFydFRpbWVVczsKKyAgICAgICAgICAgIG1Pd25lci0+bm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfVFJBQ0tfSU5GT19TVEFSVF9PRkZTRVRfTVMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZU9mZnNldFVzIC8gMTAwMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKICAgICBMT0dWKCJ0cmFja1Byb2dyZXNzU3RhdHVzOiAlbGxkIHVzIiwgdGltZVVzKTsKICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDAgJiYKICAgICAgICAgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMgPj0gbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcykgewogICAgICAgICBMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOwotICAgICAgICBtT3duZXItPnRyYWNrUHJvZ3Jlc3NTdGF0dXModGhpcywgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CisgICAgICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyhtVHJhY2tJZCwgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CiAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOwogICAgIH0KIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6dHJhY2tQcm9ncmVzc1N0YXR1cygKLSAgICAgICAgY29uc3QgTVBFRzRXcml0ZXI6OlRyYWNrKiB0cmFjaywgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgeworICAgICAgICBzaXplX3QgdHJhY2tJZCwgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpbnQzMl90IG5UcmFja3MgPSBtVHJhY2tzLnNpemUoKTsKLSAgICBDSEVDSyhuVHJhY2tzID49IDEpOwotICAgIENIRUNLKG5UcmFja3MgPCA2NCk7ICAvLyBBcmJpdHJhcnkgbnVtYmVyCi0KLSAgICBpbnQzMl90IHRyYWNrTnVtID0gMDsKLSAgICBDSEVDSyh0cmFja051bSA8IG5UcmFja3MpOwotICAgIHRyYWNrTnVtIDw8PSAxNjsKKyAgICBpbnQzMl90IHRyYWNrTnVtID0gKHRyYWNrSWQgPDwgMjgpOwogCiAgICAgLy8gRXJyb3Igbm90aWZpY2F0aW9uCiAgICAgLy8gRG8gbm90IGNvbnNpZGVyIEVSUk9SX0VORF9PRl9TVFJFQU0gYW4gZXJyb3IKICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9FUlJPUiwKLSAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiwKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0VSUk9SLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19FUlJPUl9HRU5FUkFMLAogICAgICAgICAgICAgICAgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmICh0aW1lVXMgPT0gLTEpIHsKICAgICAgICAgLy8gU2VuZCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbgotICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywKLSAgICAgICAgICAgICAgIHRyYWNrTnVtIHwgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUywKKyAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0lORk8sCisgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX1RSQUNLX0lORk9fQ09NUExFVElPTl9TVEFUVVMsCiAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gU2VuZCBwcm9ncmVzcyBzdGF0dXMKLSAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sCi0gICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX0lORk9fUFJPR1JFU1NfVElNRV9TVEFUVVMsCisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9UUkFDS19JTkZPX1BST0dSRVNTX0lOX1RJTUUsCiAgICAgICAgICAgICAgICB0aW1lVXMgLyAxMDAwKTsKICAgICB9CiB9CkBAIC0yMTY5LDM4OCArMjMxNyw1MTcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKAotICAgICAgICBpbnQzMl90IHRyYWNrSUQsIGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVRyYWNrSGVhZGVyKGJvb2wgdXNlMzJCaXRPZmZzZXQpIHsKIAogICAgIExPR1YoIiVzIHRyYWNrIHRpbWUgc2NhbGU6ICVkIiwKICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIG1UaW1lU2NhbGUpOwogCiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICBtT3duZXItPmJlZ2luQm94KCJ0cmFrIik7CisgICAgICAgIHdyaXRlVGtoZEJveChub3cpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CisgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKKyAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOworICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWluZiIpOworICAgICAgICAgICAgICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVNtaGRCb3goKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVZtaGRCb3goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVEaW5mQm94KCk7CisgICAgICAgICAgICAgICAgd3JpdGVTdGJsQm94KHVzZTMyQml0T2Zmc2V0KTsKKyAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtaW5mCisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtZGlhCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHRyYWsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlU3RibEJveChib29sIHVzZTMyQml0T2Zmc2V0KSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgic3RibCIpOworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c2QiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDMyKDEpOyAgICAgICAgICAgICAgIC8vIGVudHJ5IGNvdW50CisgICAgaWYgKG1Jc0F1ZGlvKSB7CisgICAgICAgIHdyaXRlQXVkaW9Gb3VyQ0NCb3goKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZVZpZGVvRm91ckNDQm94KCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCisgICAgd3JpdGVTdHRzQm94KCk7CisgICAgd3JpdGVDdHRzQm94KCk7CisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICB3cml0ZVN0c3NCb3goKTsKKyAgICB9CisgICAgd3JpdGVTdHN6Qm94KCk7CisgICAgd3JpdGVTdHNjQm94KCk7CisgICAgd3JpdGVTdGNvQm94KHVzZTMyQml0T2Zmc2V0KTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RibAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVWaWRlb0ZvdXJDQ0JveCgpIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1wNHYiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInMyNjMiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZSkpIHsKKyAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjMSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlVua25vd24gbWltZSB0eXBlICclcycuIiwgbWltZSk7CisgICAgICAgIENIRUNLKCEic2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG1pbWUgdHlwZS4iKTsKKyAgICB9CisKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBzdWNjZXNzID0gbU1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQxNih3aWR0aCk7CisgICAgbU93bmVyLT53cml0ZUludDE2KGhlaWdodCk7CisgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gaG9yaXogcmVzb2x1dGlvbgorICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDQ4MDAwMCk7ICAgIC8vIHZlcnQgcmVzb2x1dGlvbgorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZnJhbWUgY291bnQKKyAgICBtT3duZXItPndyaXRlKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIDMyKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgxOCk7ICAgICAgICAvLyBkZXB0aAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigtMSk7ICAgICAgICAgIC8vIHByZWRlZmluZWQKKworICAgIENIRUNLKDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA8IDEyOCk7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlTXA0dkVzZHNCb3goKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlRDI2M0JveCgpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgeworICAgICAgICB3cml0ZUF2Y2NCb3goKTsKKyAgICB9CisKKyAgICB3cml0ZVBhc3BCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbXA0diwgczI2MyBvciBhdmMxCit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUF1ZGlvRm91ckNDQm94KCkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IE5VTEw7CisgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkpIHsKKyAgICAgICAgZm91cmNjID0gInNhbXIiOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgeworICAgICAgICBmb3VyY2MgPSAic2F3YiI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgIGZvdXJjYyA9ICJtcDRhIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOworICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgLy8gYXVkaW8gZm9ybWF0CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDEpOyAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIGludDMyX3QgbkNoYW5uZWxzOworICAgIENIRUNLX0VRKHRydWUsIG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNihuQ2hhbm5lbHMpOyAgIC8vIGNoYW5uZWwgY291bnQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMTYpOyAgICAgICAgICAvLyBzYW1wbGUgc2l6ZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorCisgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSk7CisgICAgQ0hFQ0soc3VjY2Vzcyk7CisgICAgbU93bmVyLT53cml0ZUludDMyKHNhbXBsZXJhdGUgPDwgMTYpOworICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7CisgICAgICAgIHdyaXRlTXA0YUVzZHNCb3goKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkgfHwKKyAgICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKKyAgICAgICAgd3JpdGVEYW1yQm94KCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1wNGFFc2RzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKKyAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGEpOworICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPiAwKTsKKworICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIDIzIDwgMTI4KTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsvLyBFU19JRAorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOworCisgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50OCgweDQwKTsgICAvLyBvYmplY3RUeXBlSW5kaWNhdGlvbiBJU08vSUVDIDE0NDkyLTIKKyAgICBtT3duZXItPndyaXRlSW50OCgweDE1KTsgICAvLyBzdHJlYW1UeXBlIEF1ZGlvU3RyZWFtCisKKyAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMyk7ICAvLyBYWFgKKyAgICBtT3duZXItPndyaXRlSW50OCgweDAwKTsgICAvLyBidWZmZXIgc2l6ZSAyNC1iaXQKKyAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBtYXggYml0IHJhdGUKKyAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBhdmcgYml0IHJhdGUKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKKyAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKKyAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZworICAgICAgICAweDAxLAorICAgICAgICAweDAyCisgICAgfTsKKyAgICBtT3duZXItPndyaXRlKGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGVzZHMKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTXA0dkVzZHNCb3goKSB7CisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKKyAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7CisgICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOworCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgLy8gRVNfRGVzY3JUYWcKKyAgICBtT3duZXItPndyaXRlSW50OCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOyAgLy8gRVNfSUQKKyAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKKworICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDQpOyAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCisgICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlSW50OCgweDIwKTsgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgorICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTEpOyAgLy8gc3RyZWFtVHlwZSBWaXN1YWxTdHJlYW0KKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7CisgICAgICAgIDB4MDEsIDB4NzcsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDMsIDB4ZTgsIDB4MDAsCisgICAgICAgIDB4MDAsIDB4MDMsIDB4ZTgsIDB4MDAKKyAgICB9OworICAgIG1Pd25lci0+d3JpdGUoa0RhdGEsIHNpemVvZihrRGF0YSkpOworCisgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCisKKyAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKG1Db2RlY1NwZWNpZmljRGF0YSwgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKKyAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZworICAgICAgICAweDAxLAorICAgICAgICAweDAyCisgICAgfTsKKyAgICBtT3duZXItPndyaXRlKGtEYXRhMiwgc2l6ZW9mKGtEYXRhMikpOworCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGVzZHMKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlVGtoZEJveCh0aW1lX3Qgbm93KSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgidGtoZCIpOworICAgIC8vIEZsYWdzID0gNyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFjayBpcyBlbmFibGVkLCBhbmQKKyAgICAvLyBwYXJ0IG9mIHRoZSBwcmVzZW50YXRpb24KKyAgICBtT3duZXItPndyaXRlSW50MzIoMHgwNyk7ICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9NworICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gY3JlYXRpb24gdGltZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKKyAgICBtT3duZXItPndyaXRlSW50MzIobVRyYWNrSWQgKyAxKTsgIC8vIHRyYWNrIGlkIHN0YXJ0cyB3aXRoIDEKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgaW50NjRfdCB0cmFrRHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXMoKTsKKyAgICBpbnQzMl90IG12aGRUaW1lU2NhbGUgPSBtT3duZXItPmdldFRpbWVTY2FsZSgpOworICAgIGludDMyX3QgdGtoZER1cmF0aW9uID0KKyAgICAgICAgKHRyYWtEdXJhdGlvblVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgbU93bmVyLT53cml0ZUludDMyKHRraGREdXJhdGlvbik7ICAvLyBpbiBtdmhkIHRpbWVzY2FsZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBsYXllcgorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGdyb3VwCisgICAgbU93bmVyLT53cml0ZUludDE2KG1Jc0F1ZGlvID8gMHgxMDAgOiAwKTsgIC8vIHZvbHVtZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKworICAgIG1Pd25lci0+d3JpdGVDb21wb3NpdGlvbk1hdHJpeChtUm90YXRpb24pOyAgICAgICAvLyBtYXRyaXgKKworICAgIGlmIChtSXNBdWRpbykgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgICAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgICAgICBtT3duZXItPndyaXRlSW50MzIod2lkdGggPDwgMTYpOyAgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQorICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaGVpZ2h0IDw8IDE2KTsgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQorICAgIH0KKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gdGtoZAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVWbWhkQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInZtaGQiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMHgwMSk7ICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTEKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBncmFwaGljcyBtb2RlCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gb3Bjb2xvcgorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKKyAgICBtT3duZXItPndyaXRlSW50MTYoMCk7CisgICAgbU93bmVyLT5lbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlU21oZEJveCgpIHsKKyAgICBtT3duZXItPmJlZ2luQm94KCJzbWhkIik7CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gYmFsYW5jZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT5lbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlSGRsckJveCgpIHsKKyAgICBtT3duZXItPmJlZ2luQm94KCJoZGxyIik7CisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0eXBlOiBzaG91bGQgYmUgbWhscgorICAgIG1Pd25lci0+d3JpdGVGb3VyY2MobUlzQXVkaW8gPyAic291biIgOiAidmlkZSIpOyAgLy8gY29tcG9uZW50IHN1YnR5cGUKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAvLyBSZW1vdmluZyAiciIgZm9yIHRoZSBuYW1lIHN0cmluZyBqdXN0IG1ha2VzIHRoZSBzdHJpbmcgNCBieXRlIGFsaWduZWQKKyAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtSXNBdWRpbyA/ICJTb3VuZEhhbmRsZSI6ICJWaWRlb0hhbmRsZSIpOyAgLy8gbmFtZQorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZU1kaGRCb3godGltZV90IG5vdykgeworICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CisgICAgbU93bmVyLT5iZWdpbkJveCgibWRoZCIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCisgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtVGltZVNjYWxlKTsgICAgLy8gbWVkaWEgdGltZXNjYWxlCisgICAgaW50MzJfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICBtT3duZXItPndyaXRlSW50MzIobWRoZER1cmF0aW9uKTsgIC8vIHVzZSBtZWRpYSB0aW1lc2NhbGUKKyAgICAvLyBMYW5ndWFnZSBmb2xsb3dzIHRoZSB0aHJlZSBsZXR0ZXIgc3RhbmRhcmQgSVNPLTYzOS0yL1QKKyAgICAvLyAnZScsICduJywgJ2cnIGZvciAiRW5nbGlzaCIsIGZvciBpbnN0YW5jZS4KKyAgICAvLyBFYWNoIGNoYXJhY3RlciBpcyBwYWNrZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpdHMgQVNDSUkgdmFsdWUgYW5kIDB4NjAuCisgICAgLy8gRm9yICJFbmdsaXNoIiwgdGhlc2UgYXJlIDAwMTAxLCAwMTExMCwgMDAxMTEuCisgICAgLy8gWFhYOiBXaGVyZSBpcyB0aGUgcGFkZGluZyBiaXQgbG9jYXRlZDogMHgxNUM3PworICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZQorICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAorICAgIG1Pd25lci0+ZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZURhbXJCb3goKSB7CisgICAgLy8gM2dwcDIgU3BlYyBBTVJTYW1wbGVFbnRyeSBmaWVsZHMKKyAgICBtT3duZXItPmJlZ2luQm94KCJkYW1yIik7CisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcoIiAgICIpOyAgLy8gdmVuZG9yOiA0IGJ5dGVzCisgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gZGVjb2RlciB2ZXJzaW9uCisgICAgbU93bmVyLT53cml0ZUludDE2KDB4ODNGRik7ICAgLy8gbW9kZSBzZXQ6IGFsbCBlbmFibGVkCisgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgICAgICAgLy8gbW9kZSBjaGFuZ2UgcGVyaW9kCisgICAgbU93bmVyLT53cml0ZUludDgoMSk7ICAgICAgICAgLy8gZnJhbWVzIHBlciBzYW1wbGUKKyAgICBtT3duZXItPmVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVVcmxCb3goKSB7CisgICAgLy8gVGhlIHRhYmxlIGluZGV4IGhlcmUgcmVmZXJzIHRvIHRoZSBzYW1wbGUgZGVzY3JpcHRpb24gaW5kZXgKKyAgICAvLyBpbiB0aGUgc2FtcGxlIHRhYmxlIGVudHJpZXMuCisgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MSAoc2VsZi1jb250YWluZWQpCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHVybAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEcmVmQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImRyZWYiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAvLyBlbnRyeSBjb3VudCAoZWl0aGVyIHVybCBvciB1cm4pCisgICAgd3JpdGVVcmxCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZHJlZgorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEaW5mQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImRpbmYiKTsKKyAgICB3cml0ZURyZWZCb3goKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZGluZgorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVBdmNjQm94KCkgeworICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CisgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA+PSA1KTsKKworICAgIC8vIFBhdGNoIGF2Y2MncyBsZW5ndGhTaXplIGZpZWxkIHRvIG1hdGNoIHRoZSBudW1iZXIKKyAgICAvLyBvZiBieXRlcyB3ZSB1c2UgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgYSBuYWwgdW5pdC4KKyAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKW1Db2RlY1NwZWNpZmljRGF0YTsKKyAgICBwdHJbNF0gPSAocHRyWzRdICYgMHhmYykgfCAobU93bmVyLT51c2VOYWxMZW5ndGhGb3VyKCkgPyAzIDogMSk7CisgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjQyIpOworICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gYXZjQworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVEMjYzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goImQyNjMiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZW5kb3IKKyAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBkZWNvZGVyIHZlcnNpb24KKyAgICBtT3duZXItPndyaXRlSW50OCgxMCk7ICAvLyBsZXZlbDogMTAKKyAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBwcm9maWxlOiAwCisgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGQyNjMKK30KKworLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVBhc3BCb3goKSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgicGFzcCIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigxIDw8IDE2KTsgIC8vIGhzcGFjaW5nCisgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gcGFzcAorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHRzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0dHMiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0dHNUYWJsZUVudHJpZXMpOwogCiAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igc21hbGwgc3RhcnQgdGltZSBkaWZmZXJlbmNlIGZyb20gZGlmZmVyZW50IG1lZGlhIHRyYWNrcwogICAgIGludDY0X3QgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IDA7CisgICAgaW50NjRfdCBtb292U3RhcnRUaW1lVXMgPSBtT3duZXItPmdldFN0YXJ0VGltZXN0YW1wVXMoKTsKKyAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgIT0gbW9vdlN0YXJ0VGltZVVzKSB7CisgICAgICAgIENIRUNLKG1TdGFydFRpbWVzdGFtcFVzID4gbW9vdlN0YXJ0VGltZVVzKTsKKyAgICAgICAgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IG1TdGFydFRpbWVzdGFtcFVzIC0gbW9vdlN0YXJ0VGltZVVzOworICAgIH0KKyAgICBMaXN0PFN0dHNUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3R0c1RhYmxlRW50cmllcy5iZWdpbigpOworICAgIENIRUNLKGl0ICE9IG1TdHRzVGFibGVFbnRyaWVzLmVuZCgpICYmIGl0LT5zYW1wbGVDb3VudCA9PSAxKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKKyAgICBpbnQzMl90IGR1ciA9ICh0cmFja1N0YXJ0VGltZU9mZnNldFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKKyAgICBtT3duZXItPndyaXRlSW50MzIoZHVyICsgaXQtPnNhbXBsZUR1cmF0aW9uKTsKIAotICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKKyAgICBpbnQ2NF90IHRvdGFsQ291bnQgPSAxOworICAgIHdoaWxlICgrK2l0ICE9IG1TdHRzVGFibGVFbnRyaWVzLmVuZCgpKSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlQ291bnQpOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUR1cmF0aW9uKTsKKyAgICAgICAgdG90YWxDb3VudCArPSBpdC0+c2FtcGxlQ291bnQ7CisgICAgfQorICAgIENIRUNLKHRvdGFsQ291bnQgPT0gbU51bVNhbXBsZXMpOworICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCit9CiAKLSAgICAgIG1Pd25lci0+YmVnaW5Cb3goInRraGQiKTsKLSAgICAgICAgLy8gRmxhZ3MgPSA3IHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYWNrIGlzIGVuYWJsZWQsIGFuZAotICAgICAgICAvLyBwYXJ0IG9mIHRoZSBwcmVzZW50YXRpb24KLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MDcpOyAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTcKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHRyYWNrSUQpOwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIGludDMyX3QgdGtoZER1cmF0aW9uID0KLSAgICAgICAgICAgICh0cmFrRHVyYXRpb25VcyAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OwotICAgICAgICBtT3duZXItPndyaXRlSW50MzIodGtoZER1cmF0aW9uKTsgIC8vIGluIG12aGQgdGltZXNjYWxlCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAgIC8vIGxheWVyCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGdyb3VwCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihtSXNBdWRpbyA/IDB4MTAwIDogMCk7ICAvLyB2b2x1bWUKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlQ3R0c0JveCgpIHsKKyAgICBpZiAobUlzQXVkaW8pIHsgIC8vIGN0dHMgaXMgbm90IGZvciBhdWRpbworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIG1Pd25lci0+d3JpdGVDb21wb3NpdGlvbk1hdHJpeChtUm90YXRpb24pOyAgICAgICAvLyBtYXRyaXgKKyAgICAvLyBEbyBub3Qgd3JpdGUgY3R0cyBib3ggd2hlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgaXQuCisgICAgaWYgKChtTnVtQ3R0c1RhYmxlRW50cmllcyA9PSAxICYmCisgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzLmJlZ2luKCktPnNhbXBsZUR1cmF0aW9uID09IDApIHx8CisgICAgICAgIG1OdW1DdHRzVGFibGVFbnRyaWVzID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOwotICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKLSAgICAgICAgICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIExPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIiwgbU51bUN0dHNUYWJsZUVudHJpZXMpOwogCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIod2lkdGggPDwgMTYpOyAgIC8vIDMyLWJpdCBmaXhlZC1wb2ludCB2YWx1ZQotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGhlaWdodCA8PCAxNik7ICAvLyAzMi1iaXQgZml4ZWQtcG9pbnQgdmFsdWUKKyAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CisgICAgaWYgKG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uKSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDAwMDEwMDAwKTsgIC8vIHZlcnNpb249MSwgZmxhZ3M9MAorICAgIH0gZWxzZSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIH0KKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bUN0dHNUYWJsZUVudHJpZXMpOworCisgICAgaW50NjRfdCB0b3RhbENvdW50ID0gMDsKKyAgICBmb3IgKExpc3Q8Q3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1DdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtQ3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVEdXJhdGlvbik7CisgICAgICAgIHRvdGFsQ291bnQgKz0gaXQtPnNhbXBsZUNvdW50OworICAgIH0KKyAgICBDSEVDSyh0b3RhbENvdW50ID09IG1OdW1TYW1wbGVzKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY3R0cworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHNzQm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3MiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0c3NUYWJsZUVudHJpZXMpOyAgLy8gbnVtYmVyIG9mIHN5bmMgZnJhbWVzCisgICAgZm9yIChMaXN0PGludDMyX3Q+OjppdGVyYXRvciBpdCA9IG1TdHNzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1TdHNzVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOworICAgIH0KKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzcworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHN6Qm94KCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3oiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBpZiAobVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKKyAgICAgICAgTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKml0KTsgIC8vIGRlZmF1bHQgc2FtcGxlIHNpemUKKyAgICB9IGVsc2UgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CisgICAgfQorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU2FtcGxlcyk7CisgICAgaWYgKCFtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgeworICAgICAgICBmb3IgKExpc3Q8c2l6ZV90Pjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlU2l6ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1TYW1wbGVTaXplcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCppdCk7CiAgICAgICAgIH0KLSAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB0a2hkCisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHN6Cit9CiAKLSAgICAgIGludDY0X3QgbW9vdlN0YXJ0VGltZVVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVzdGFtcFVzKCk7Ci0gICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgIT0gbW9vdlN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgQ0hFQ0sobVN0YXJ0VGltZXN0YW1wVXMgPiBtb292U3RhcnRUaW1lVXMpOwotICAgICAgICAgIHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXMgPSBtU3RhcnRUaW1lc3RhbXBVcyAtIG1vb3ZTdGFydFRpbWVVczsKLSAgICAgIH0KK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVN0c2NCb3goKSB7CisgICAgbU93bmVyLT5iZWdpbkJveCgic3RzYyIpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3RzY1RhYmxlRW50cmllcyk7CisgICAgZm9yIChMaXN0PFN0c2NUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3RzY1RhYmxlRW50cmllcy5iZWdpbigpOworICAgICAgICBpdCAhPSBtU3RzY1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPmZpcnN0Q2h1bmspOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZXNQZXJDaHVuayk7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlRGVzY3JpcHRpb25JZCk7CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNjCit9CiAKLSAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1kaWEiKTsKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVN0Y29Cb3goYm9vbCB1c2UzMkJpdE9mZnNldCkgeworICAgIG1Pd25lci0+YmVnaW5Cb3godXNlMzJCaXRPZmZzZXQ/ICJzdGNvIjogImNvNjQiKTsKKyAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0Y29UYWJsZUVudHJpZXMpOworICAgIGZvciAoTGlzdDxvZmY2NF90Pjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtPZmZzZXRzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1DaHVua09mZnNldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKHVzZTMyQml0T2Zmc2V0KSB7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oKml0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50NjQoKCppdCkpOworICAgICAgICB9CisgICAgfQorICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdGNvIG9yIGNvNjQKK30KIAotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGhkIik7Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1UaW1lU2NhbGUpOyAgICAvLyBtZWRpYSB0aW1lc2NhbGUKLSAgICAgICAgICBpbnQzMl90IG1kaGREdXJhdGlvbiA9ICh0cmFrRHVyYXRpb25VcyAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OwotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtZGhkRHVyYXRpb24pOyAgLy8gdXNlIG1lZGlhIHRpbWVzY2FsZQotICAgICAgICAgIC8vIExhbmd1YWdlIGZvbGxvd3MgdGhlIHRocmVlIGxldHRlciBzdGFuZGFyZCBJU08tNjM5LTIvVAotICAgICAgICAgIC8vICdlJywgJ24nLCAnZycgZm9yICJFbmdsaXNoIiwgZm9yIGluc3RhbmNlLgotICAgICAgICAgIC8vIEVhY2ggY2hhcmFjdGVyIGlzIHBhY2tlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0cyBBU0NJSSB2YWx1ZSBhbmQgMHg2MC4KLSAgICAgICAgICAvLyBGb3IgIkVuZ2xpc2giLCB0aGVzZSBhcmUgMDAxMDEsIDAxMTEwLCAwMDExMS4KLSAgICAgICAgICAvLyBYWFg6IFdoZXJlIGlzIHRoZSBwYWRkaW5nIGJpdCBsb2NhdGVkOiAweDE1Qzc/Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgIG1Pd25lci0+ZW5kQm94KCk7Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZVVkdGFCb3goKSB7CisgICAgYmVnaW5Cb3goInVkdGEiKTsKKyAgICB3cml0ZUdlb0RhdGFCb3goKTsKKyAgICBlbmRCb3goKTsKK30KIAotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJoZGxyIik7Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0eXBlOiBzaG91bGQgYmUgbWhscgotICAgICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MobUlzQXVkaW8gPyAic291biIgOiAidmlkZSIpOyAgLy8gY29tcG9uZW50IHN1YnR5cGUKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAvLyBSZW1vdmluZyAiciIgZm9yIHRoZSBuYW1lIHN0cmluZyBqdXN0IG1ha2VzIHRoZSBzdHJpbmcgNCBieXRlIGFsaWduZWQKLSAgICAgICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtSXNBdWRpbyA/ICJTb3VuZEhhbmRsZSI6ICJWaWRlb0hhbmRsZSIpOyAgLy8gbmFtZQotICAgICAgICBtT3duZXItPmVuZEJveCgpOwotCi0gICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1pbmYiKTsKLSAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic21oZCIpOwotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gYmFsYW5jZQotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInZtaGQiKTsKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MDEpOyAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0xCi0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIGdyYXBoaWNzIG1vZGUKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gb3Bjb2xvcgotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7Ci0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKLSAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkaW5mIik7Ci0gICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJkcmVmIik7Ci0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAvLyBlbnRyeSBjb3VudCAoZWl0aGVyIHVybCBvciB1cm4pCi0gICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBpbmRleCBoZXJlIHJlZmVycyB0byB0aGUgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4Ci0gICAgICAgICAgICAgIC8vIGluIHRoZSBzYW1wbGUgdGFibGUgZW50cmllcy4KLSAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgidXJsICIpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MSAoc2VsZi1jb250YWluZWQpCi0gICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB1cmwKLSAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkcmVmCi0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGRpbmYKLQotICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdGJsIik7Ci0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHNkIik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7ICAgICAgICAgICAgICAgLy8gZW50cnkgY291bnQKLSAgICAgICAgICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvdXJjYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgbWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91cmNjID0gInNhbXIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSAic2F3YiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdXJjYyA9ICJtcDRhIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgICAvLyBhdWRpbyBmb3JtYXQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MSk7ICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICBDSEVDS19FUSh0cnVlLCBtTWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihuQ2hhbm5lbHMpOyAgIC8vIGNoYW5uZWwgY291bnQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigxNik7ICAgICAgICAgIC8vIHNhbXBsZSBzaXplCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7Ci0gICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSk7Ci0gICAgICAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzYW1wbGVyYXRlIDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgc2l6ZXMgZW5jb2RlIHRvIGEgc2luZ2xlIGJ5dGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplICsgMjMgPCAxMjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDAwMCk7Ly8gRVNfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDA0KTsgICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDE1ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDQwKTsgICAvLyBvYmplY3RUeXBlSW5kaWNhdGlvbiBJU08vSUVDIDE0NDkyLTIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MTUpOyAgIC8vIHN0cmVhbVR5cGUgQXVkaW9TdHJlYW0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MDMpOyAgLy8gWFhYCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDAwKTsgICAvLyBidWZmZXIgc2l6ZSAyNC1iaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMig5NjAwMCk7IC8vIG1heCBiaXQgcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDk2MDAwKTsgLy8gYXZnIGJpdCByYXRlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShtQ29kZWNTcGVjaWZpY0RhdGEsIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTJbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LCAgLy8gU0xDb25maWdEZXNjcmlwdG9yVGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShrRGF0YTIsIHNpemVvZihrRGF0YTIpKTsKLQotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZXNkcwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIG1pbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gM2dwcDIgU3BlYyBBTVJTYW1wbGVFbnRyeSBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZGFtciIpOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKCIgICAiKTsgIC8vIHZlbmRvcjogNCBieXRlcwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDApOyAgICAgICAgIC8vIGRlY29kZXIgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDgzRkYpOyAgIC8vIG1vZGUgc2V0OiBhbGwgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDApOyAgICAgICAgIC8vIG1vZGUgY2hhbmdlIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDEpOyAgICAgICAgIC8vIGZyYW1lcyBwZXIgc2FtcGxlCi0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtcDR2Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzMjYzIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImF2YzEiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIG1pbWUgdHlwZSAnJXMnLiIsIG1pbWUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBtaW1lIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigxKTsgICAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4Ci0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKLSAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNihoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gaG9yaXogcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4NDgwMDAwKTsgICAgLy8gdmVydCByZXNvbHV0aW9uCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZnJhbWUgY291bnQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgMzIpOwotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDB4MTgpOyAgICAgICAgLy8gZGVwdGgKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigtMSk7ICAgICAgICAgIC8vIHByZWRlZmluZWQKLQotICAgICAgICAgICAgICAgICAgQ0hFQ0soMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDwgMTI4KTsKLQotICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA+IDApOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgLy8gRVNfRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDIzICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHgwMDAwKTsgIC8vIEVTX0lECi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDE1ICsgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDIwKTsgIC8vIG9iamVjdFR5cGVJbmRpY2F0aW9uIElTTy9JRUMgMTQ0OTItMgotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgxMSk7ICAvLyBzdHJlYW1UeXBlIFZpc3VhbFN0cmVhbQotCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YVtdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4NzcsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMywgMHhlOCwgMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAzLCAweGU4LCAweDAwCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShrRGF0YSwgc2l6ZW9mKGtEYXRhKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgLy8gRGVjb2RlclNwZWNpZmljSW5mb1RhZwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEyW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoa0RhdGEyLCBzaXplb2Yoa0RhdGEyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZXNkcwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImQyNjMiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZW5kb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMCk7ICAgLy8gZGVjb2RlciB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KDEwKTsgIC8vIGxldmVsOiAxMAotICAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAvLyBwcm9maWxlOiAwCi0KLSAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZDI2MwotICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID49IDUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgLy8gUGF0Y2ggYXZjYydzIGxlbmd0aFNpemUgZmllbGQgdG8gbWF0Y2ggdGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGJ5dGVzIHdlIHVzZSB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiBhIG5hbCB1bml0LgotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopbUNvZGVjU3BlY2lmaWNEYXRhOwotICAgICAgICAgICAgICAgICAgICAgIHB0cls0XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChwdHJbNF0gJiAweGZjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpID8gMyA6IDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShtQ29kZWNTcGVjaWZpY0RhdGEsIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBhdmNDCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInBhc3AiKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gaHNwYWNpbmcKLSAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBwYXNwCi0gICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1wNHYsIHMyNjMgb3IgYXZjMQotICAgICAgICAgICAgfQotICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCi0KLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHRzIik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3R0c1RhYmxlRW50cmllcyk7Ci0gICAgICAgICAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgIGl0ICE9IG1TdHRzVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVDb3VudCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgY2FsY3VsYXRpbmcgdGhlIHNhbXBsZSBkdXJhdGlvbiB0aGUgZXhhY3RseQotICAgICAgICAgICAgICAgIC8vIHNhbWUgd2F5IGFzIHdlIG1hZGUgZGVjaXNpb24gb24gaG93IHRvIGNyZWF0ZSBzdHRzIGVudHJpZXMuCi0gICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyVGltZXN0YW1wVXMgPSBwcmV2VGltZXN0YW1wVXMgKyBpdC0+c2FtcGxlRHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGR1ciA9ICgoY3VyclRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwotICAgICAgICAgICAgICAgIHByZXZUaW1lc3RhbXBVcyArPSAoaXQtPnNhbXBsZUNvdW50ICogaXQtPnNhbXBsZUR1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGR1cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKLQotICAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKLSAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3MiKTsKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3Rzc1RhYmxlRW50cmllcyk7ICAvLyBudW1iZXIgb2Ygc3luYyBmcmFtZXMKLSAgICAgICAgICAgICAgZm9yIChMaXN0PGludDMyX3Q+OjppdGVyYXRvciBpdCA9IG1TdHNzVGFibGVFbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgaXQgIT0gbVN0c3NUYWJsZUVudHJpZXMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzcwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3oiKTsKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOyAgLy8gZGVmYXVsdCBzYW1wbGUgc2l6ZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVNhbXBsZXMpOwotICAgICAgICAgICAgaWYgKCFtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgewotICAgICAgICAgICAgICAgIGZvciAoTGlzdDxzaXplX3Q+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVTaXplcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbVNhbXBsZVNpemVzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigqaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzegotCi0gICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic3RzYyIpOwotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0c2NUYWJsZUVudHJpZXMpOwotICAgICAgICAgICAgZm9yIChMaXN0PFN0c2NUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3RzY1RhYmxlRW50cmllcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtU3RzY1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+Zmlyc3RDaHVuayk7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVzUGVyQ2h1bmspOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlRGVzY3JpcHRpb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0c2MKLSAgICAgICAgICBtT3duZXItPmJlZ2luQm94KHVzZTMyQml0T2Zmc2V0PyAic3RjbyI6ICJjbzY0Iik7Ci0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3Rjb1RhYmxlRW50cmllcyk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8b2ZmNjRfdD46Oml0ZXJhdG9yIGl0ID0gbUNodW5rT2Zmc2V0cy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtQ2h1bmtPZmZzZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZTMyQml0T2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PigqaXQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50NjQoKCppdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RjbyBvciBjbzY0Ci0KLSAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0YmwKLSAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbWluZgotICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1kaWEKLSAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gdHJhaworLyoKKyAqIEdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KKyAqLwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVHZW9EYXRhQm94KCkgeworICAgIGJlZ2luQm94KCJceEE5eHl6Iik7CisgICAgLyoKKyAgICAgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBhbnkgdXNlciBkYXRhIHN0YXJ0CisgICAgICogd2l0aCAiXDB4QTkiLCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGl0cyBhc3NvaWNhdGVkCisgICAgICogbGFuZ3VhZ2UgY29kZS4KKyAgICAgKiAweDAwMTI6IHRleHQgc3RyaW5nIGxlbmd0aAorICAgICAqIDB4MTVjNzogbGFuZyAobG9jYWxlKSBjb2RlOiBlbgorICAgICAqLworICAgIHdyaXRlSW50MzIoMHgwMDEyMTVjNyk7CisgICAgd3JpdGVMYXRpdHVkZShtTGF0aXR1ZGV4MTAwMDApOworICAgIHdyaXRlTG9uZ2l0dWRlKG1Mb25naXR1ZGV4MTAwMDApOworICAgIHdyaXRlSW50OCgweDJGKTsKKyAgICBlbmRCb3goKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDBiZTcyNjEuLjAxZjFmYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiA9ICJ2aWRlby9tcGVnMiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVcgPSAidmlkZW8vcmF3IjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOwpAQCAtNDMsNyArNDQsMTAgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXBwbGljYXRpb24vb2dnIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSA9ICJ2aWRlby94LW1hdHJvc2thIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTID0gInZpZGVvL21wMnRzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkgPSAidmlkZW8vYXZpIjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSA9ICJ2aWRlby93dm0iOwogCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAgPSAidGV4dC8zZ3BwLXR0IjsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAyM2JhZDViLi5hODAyM2RmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKQEAgLTEwOCwxMyArMTA5LDIwIEBACiAgICAgICAgIHJldCA9IG5ldyBNYXRyb3NrYUV4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpKSB7CiAgICAgICAgIHJldCA9IG5ldyBNUEVHMlRTRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJKSkgeworICAgICAgICByZXQgPSBuZXcgQVZJRXh0cmFjdG9yKHNvdXJjZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNKSkgewogICAgICAgICByZXQgPSBuZXcgV1ZNRXh0cmFjdG9yKHNvdXJjZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUykpIHsKICAgICAgICAgcmV0ID0gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UpOwogICAgIH0KLSAgICBpZiAocmV0ICE9IE5VTEwgJiYgaXNEcm0pIHsKLSAgICAgICAgcmV0LT5nZXRNZXRhRGF0YSgpLT5zZXRJbnQzMihrS2V5SXNEUk0sIDEpOworCisgICAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgICAgaWYgKGlzRHJtKSB7CisgICAgICAgICAgIHJldC0+c2V0RHJtRmxhZyh0cnVlKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICByZXQtPnNldERybUZsYWcoZmFsc2UpOworICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggMjQ4YjY3OC4uNGVkYjYxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMTg0LDcgKzE4NSw4IEBACiAgICAgICBtRmluYWxTdGF0dXMoT0spLAogICAgICAgbUxhc3RBY2Nlc3NQb3MoMCksCiAgICAgICBtRmV0Y2hpbmcodHJ1ZSksCi0gICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSB7CisgICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSwKKyAgICAgIG1OdW1SZXRyaWVzTGVmdChrTWF4TnVtUmV0cmllcykgewogICAgIG1Mb29wZXItPnNldE5hbWUoIk51Q2FjaGVkU291cmNlMiIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKICAgICBtTG9vcGVyLT5zdGFydCgpOwpAQCAtMjAxLDYgKzIwMywyMiBAQAogICAgIG1DYWNoZSA9IE5VTEw7CiB9CiAKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgSFRUUEJhc2UqIHNvdXJjZSA9IHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1Tb3VyY2UuZ2V0KCkpOworICAgICAgICByZXR1cm4gc291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGticHMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBzb3VyY2UtPnNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShmcmVxTXMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6aW5pdENoZWNrKCkgY29uc3QgewogICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKIH0KQEAgLTIxMCw3ICsyMjgsOSBAQAogfQogCiB1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgewotICAgIHJldHVybiAobVNvdXJjZS0+ZmxhZ3MoKSAmIH5rV2FudHNQcmVmZXRjaGluZykgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZTsKKyAgICAvLyBSZW1vdmUgSFRUUCByZWxhdGVkIGZsYWdzIHNpbmNlIE51Q2FjaGVkU291cmNlMiBpcyBub3QgSFRUUC1iYXNlZC4KKyAgICB1aW50MzJfdCBmbGFncyA9IG1Tb3VyY2UtPmZsYWdzKCkgJiB+KGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlKTsKKyAgICByZXR1cm4gKGZsYWdzIHwga0lzQ2FjaGluZ0RhdGFTb3VyY2UpOwogfQogCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTIzNSw3ICsyNTUsMjcgQEAKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpmZXRjaEludGVybmFsKCkgewogICAgIExPR1YoImZldGNoSW50ZXJuYWwiKTsKIAotICAgIENIRUNLX0VRKG1GaW5hbFN0YXR1cywgKHN0YXR1c190KU9LKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIENIRUNLKG1GaW5hbFN0YXR1cyA9PSBPSyB8fCBtTnVtUmV0cmllc0xlZnQgPiAwKTsKKworICAgICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAtLW1OdW1SZXRyaWVzTGVmdDsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtU291cmNlLT5yZWNvbm5lY3RBdE9mZnNldChtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9VTlNVUFBPUlRFRCkgeworICAgICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJUaGUgYXR0ZW1wdCB0byByZWNvbm5lY3QgZmFpbGVkLCAlZCByZXRyaWVzIHJlbWFpbmluZyIsCisgICAgICAgICAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgUGFnZUNhY2hlOjpQYWdlICpwYWdlID0gbUNhY2hlLT5hY3F1aXJlUGFnZSgpOwogCkBAIC0yNDUsMTQgKzI4NSwyMyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgTE9HRSgic291cmNlIHJldHVybmVkIGVycm9yICVsZCIsIG4pOworICAgICAgICBMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJWxkLCAlZCByZXRyaWVzIGxlZnQiLCBuLCBtTnVtUmV0cmllc0xlZnQpOwogICAgICAgICBtRmluYWxTdGF0dXMgPSBuOwogICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOwogICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CiAgICAgICAgIExPR0koIkVSUk9SX0VORF9PRl9TVFJFQU0iKTsKKworICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwogICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworCiAgICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgTE9HSSgicmV0cnlpbmcgYSBwcmV2aW91c2x5IGZhaWxlZCByZWFkIHN1Y2NlZWRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSBrTWF4TnVtUmV0cmllczsKKyAgICAgICAgbUZpbmFsU3RhdHVzID0gT0s7CisKICAgICAgICAgcGFnZS0+bVNpemUgPSBuOwogICAgICAgICBtQ2FjaGUtPmFwcGVuZFBhZ2UocGFnZSk7CiAgICAgfQpAQCAtMjYxLDcgKzMxMCw3IEBACiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25GZXRjaCgpIHsKICAgICBMT0dWKCJvbkZldGNoIik7CiAKLSAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LKSB7CisgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPT0gMCkgewogICAgICAgICBMT0dWKCJFT1MgcmVhY2hlZCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7CiAgICAgICAgIG1GZXRjaGluZyA9IGZhbHNlOwogICAgIH0KQEAgLTI4OSw4ICszMzgsMTkgQEAKICAgICAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKCk7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KAotICAgICAgICAgICAgbUZldGNoaW5nID8gMCA6IDEwMDAwMGxsKTsKKyAgICBpbnQ2NF90IGRlbGF5VXM7CisgICAgaWYgKG1GZXRjaGluZykgeworICAgICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA+IDApIHsKKyAgICAgICAgICAgIC8vIFdlIGZhaWxlZCB0aGlzIHRpbWUgYW5kIHdpbGwgdHJ5IGFnYWluIGluIDMgc2Vjb25kcy4KKyAgICAgICAgICAgIGRlbGF5VXMgPSAzMDAwMDAwbGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWxheVVzID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGF5VXMgPSAxMDAwMDBsbDsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoZGVsYXlVcyk7CiB9CiAKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTMyMywyNSArMzgzLDI4IEBACiB9CiAKIHZvaWQgTnVDYWNoZWRTb3VyY2UyOjpyZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCi0gICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQpIHsKKyAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCwgYm9vbCBmb3JjZSkgewogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0dyYXlBcmVhID0gMTAyNCAqIDEwMjQ7CiAKLSAgICBpZiAobUZldGNoaW5nIHx8IG1GaW5hbFN0YXR1cyAhPSBPSykgeworICAgIGlmIChtRmV0Y2hpbmcgfHwgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPT0gMCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICghaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQKKyAgICBpZiAoIWlnbm9yZUxvd1dhdGVyVGhyZXNob2xkICYmICFmb3JjZQogICAgICAgICAgICAgJiYgbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSAtIG1MYXN0QWNjZXNzUG9zCiAgICAgICAgICAgICAgICAgPj0ga0xvd1dhdGVyVGhyZXNob2xkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBzaXplX3QgbWF4Qnl0ZXMgPSBtTGFzdEFjY2Vzc1BvcyAtIG1DYWNoZU9mZnNldDsKLSAgICBpZiAobWF4Qnl0ZXMgPCBrR3JheUFyZWEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAotICAgIG1heEJ5dGVzIC09IGtHcmF5QXJlYTsKKyAgICBpZiAoIWZvcmNlKSB7CisgICAgICAgIGlmIChtYXhCeXRlcyA8IGtHcmF5QXJlYSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbWF4Qnl0ZXMgLT0ga0dyYXlBcmVhOworICAgIH0KIAogICAgIHNpemVfdCBhY3R1YWxCeXRlcyA9IG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydChtYXhCeXRlcyk7CiAgICAgbUNhY2hlT2Zmc2V0ICs9IGFjdHVhbEJ5dGVzOwpAQCAtNDA1LDYgKzQ2OCwxMiBAQAogCiBzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSB7CiAgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOworCisgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmUgdW50aWwgd2UncmUgb3V0IG9mIHJldHJpZXMuCisgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOworICAgIH0KKwogICAgIG9mZjY0X3QgbGFzdEJ5dGVQb3NDYWNoZWQgPSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwogICAgIGlmIChtTGFzdEFjY2Vzc1BvcyA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CiAgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG1MYXN0QWNjZXNzUG9zOwpAQCAtNDEzLDEwICs0ODIsMTkgQEAKIH0KIAogc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDS19MRShzaXplLCAoc2l6ZV90KWtIaWdoV2F0ZXJUaHJlc2hvbGQpOworCiAgICAgTE9HVigicmVhZEludGVybmFsIG9mZnNldCAlbGxkIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIGlmICghbUZldGNoaW5nKSB7CisgICAgICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OworICAgICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCisgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkCisgICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIGZvcmNlCisgICAgfQorCiAgICAgaWYgKG9mZnNldCA8IG1DYWNoZU9mZnNldAogICAgICAgICAgICAgfHwgb2Zmc2V0ID49IChvZmY2NF90KShtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSkgewogICAgICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrUGFkZGluZyA9IDI1NiAqIDEwMjQ7CkBAIC00MzgsNiArNTE2LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgYXZhaWwgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpIC0gZGVsdGE7CisKKyAgICAgICAgaWYgKGF2YWlsID4gc2l6ZSkgeworICAgICAgICAgICAgYXZhaWwgPSBzaXplOworICAgICAgICB9CisKICAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBhdmFpbCk7CiAKICAgICAgICAgcmV0dXJuIGF2YWlsOwpAQCAtNDgxLDExICs1NjQsMTEgQEAKICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2wodHJ1ZSAvKiBpZ25vcmUgbG93IHdhdGVyIHRocmVzaG9sZCAqLyk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIE51Q2FjaGVkU291cmNlMjo6RHJtSW5pdGlhbGl6YXRpb24oKSB7CitzcDxEZWNyeXB0SGFuZGxlPiBOdUNhY2hlZFNvdXJjZTI6OkRybUluaXRpYWxpemF0aW9uKCkgewogICAgIHJldHVybiBtU291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbigpOwogfQogCi12b2lkIE51Q2FjaGVkU291cmNlMjo6Z2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Cit2b2lkIE51Q2FjaGVkU291cmNlMjo6Z2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7CiAgICAgbVNvdXJjZS0+Z2V0RHJtSW5mbyhoYW5kbGUsIGNsaWVudCk7CiB9CiAKQEAgLTQ5Myw0ICs1NzYsOCBAQAogICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkoKTsKIH0KIAorU3RyaW5nOCBOdUNhY2hlZFNvdXJjZTI6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBtU291cmNlLT5nZXRNSU1FVHlwZSgpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlMGQ1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOdUhUVFBEYXRhU291cmNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBib29sIFBhcnNlU2luZ2xlVW5zaWduZWRMb25nKAotICAgICAgICBjb25zdCBjaGFyICpmcm9tLCB1bnNpZ25lZCBsb25nICp4KSB7Ci0gICAgY2hhciAqZW5kOwotICAgICp4ID0gc3RydG91bChmcm9tLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IGZyb20gfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgUGFyc2VVUkwoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgU3RyaW5nOCAqaG9zdCwgdW5zaWduZWQgKnBvcnQsCi0gICAgICAgIFN0cmluZzggKnBhdGgsIGJvb2wgKmh0dHBzKSB7Ci0gICAgaG9zdC0+c2V0VG8oIiIpOwotICAgICpwb3J0ID0gMDsKLSAgICBwYXRoLT5zZXRUbygiIik7Ci0KLSAgICBzaXplX3QgaG9zdFN0YXJ0OwotICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpKSB7Ci0gICAgICAgIGhvc3RTdGFydCA9IDc7Ci0gICAgICAgICpodHRwcyA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVybCwgOCkpIHsKLSAgICAgICAgaG9zdFN0YXJ0ID0gODsKLSAgICAgICAgKmh0dHBzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJjaHIoJnVybFtob3N0U3RhcnRdLCAnLycpOwotCi0gICAgaWYgKHNsYXNoUG9zID09IE5VTEwpIHsKLSAgICAgICAgaG9zdC0+c2V0VG8oJnVybFtob3N0U3RhcnRdKTsKLSAgICAgICAgcGF0aC0+c2V0VG8oIi8iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBob3N0LT5zZXRUbygmdXJsW2hvc3RTdGFydF0sIHNsYXNoUG9zIC0gJnVybFtob3N0U3RhcnRdKTsKLSAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOwotCi0gICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB4OwotICAgICAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKGNvbG9uUG9zICsgMSwgJngpIHx8IHggPj0gNjU1MzYpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgICpwb3J0ID0geDsKLQotICAgICAgICBzaXplX3QgY29sb25PZmZzZXQgPSBjb2xvblBvcyAtIGhvc3QtPnN0cmluZygpOwotICAgICAgICBTdHJpbmc4IHRtcChob3N0LT5zdHJpbmcoKSwgY29sb25PZmZzZXQpOwotICAgICAgICAqaG9zdCA9IHRtcDsKLSAgICB9IGVsc2UgewotICAgICAgICAqcG9ydCA9ICgqaHR0cHMpID8gNDQzIDogODA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLU51SFRUUERhdGFTb3VyY2U6Ok51SFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpCi0gICAgOiBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCi0gICAgICBtUG9ydCgwKSwKLSAgICAgIG1IVFRQUyhmYWxzZSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUNvbnRlbnRMZW5ndGgoMCksCi0gICAgICBtQ29udGVudExlbmd0aFZhbGlkKGZhbHNlKSwKLSAgICAgIG1IYXNDaHVua2VkVHJhbnNmZXJFbmNvZGluZyhmYWxzZSksCi0gICAgICBtQ2h1bmtEYXRhQnl0ZXNMZWZ0KDApLAotICAgICAgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKLSAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAotICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewotfQotCi1OdUhUVFBEYXRhU291cmNlOjp+TnVIVFRQRGF0YVNvdXJjZSgpIHsKLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCi0gICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBOdUhUVFBEYXRhU291cmNlOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgU3RyaW5nOCBoZWFkZXJzOwotICAgIE1ha2VGdWxsSGVhZGVycyhvdmVycmlkZXMsICZoZWFkZXJzKTsKLQotICAgIHJldHVybiBjb25uZWN0KHVyaSwgaGVhZGVycywgb2Zmc2V0KTsKLX0KLQotc3RhdHVzX3QgTnVIVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBTdHJpbmc4ICZoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIFN0cmluZzggaG9zdCwgcGF0aDsKLSAgICB1bnNpZ25lZCBwb3J0OwotCi0gICAgbVVyaSA9IHVyaTsKLQotICAgIGJvb2wgaHR0cHM7Ci0gICAgaWYgKCFQYXJzZVVSTCh1cmksICZob3N0LCAmcG9ydCwgJnBhdGgsICZodHRwcykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29ubmVjdChob3N0LCBwb3J0LCBwYXRoLCBodHRwcywgaGVhZGVycywgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGJvb2wgSXNSZWRpcmVjdFN0YXR1c0NvZGUoaW50IGh0dHBTdGF0dXMpIHsKLSAgICByZXR1cm4gaHR0cFN0YXR1cyA9PSAzMDEgfHwgaHR0cFN0YXR1cyA9PSAzMDIKLSAgICAgICAgfHwgaHR0cFN0YXR1cyA9PSAzMDMgfHwgaHR0cFN0YXR1cyA9PSAzMDc7Ci19Ci0KLXN0YXR1c190IE51SFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgICAgIGJvb2wgaHR0cHMsCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgaWYgKCEobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pKSB7Ci0gICAgICAgIExPR0koImNvbm5lY3QgdG8gJXM6JXUlcyBAJWxsZCIsIGhvc3QsIHBvcnQsIHBhdGgsIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HSSgiY29ubmVjdCB0byA8VVJMIHN1cHByZXNzZWQ+IEAlbGxkIiwgb2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBib29sIG5lZWRzVG9SZWNvbm5lY3QgPSB0cnVlOwotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgaG9zdCA9PSBtSG9zdCAmJiBwb3J0ID09IG1Qb3J0Ci0gICAgICAgICAgICAmJiBodHRwcyA9PSBtSFRUUFMgJiYgb2Zmc2V0ID09IG1PZmZzZXQpIHsKLSAgICAgICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQgJiYgbU9mZnNldCA9PSBtQ29udGVudExlbmd0aCkgewotICAgICAgICAgICAgTE9HSSgiRGlkbid0IGhhdmUgdG8gcmVjb25uZWN0LCBvbGQgb25lJ3Mgc3RpbGwgZ29vZC4iKTsKLSAgICAgICAgICAgIG5lZWRzVG9SZWNvbm5lY3QgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1Ib3N0ID0gaG9zdDsKLSAgICBtUG9ydCA9IHBvcnQ7Ci0gICAgbVBhdGggPSBwYXRoOwotICAgIG1IVFRQUyA9IGh0dHBzOwotICAgIG1IZWFkZXJzID0gaGVhZGVyczsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgbVN0YXRlID0gQ09OTkVDVElORzsKLQotICAgIGlmIChuZWVkc1RvUmVjb25uZWN0KSB7Ci0gICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgZXJyID0gbUhUVFAuY29ubmVjdChob3N0LCBwb3J0LCBodHRwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLQotICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBtQ29udGVudExlbmd0aCA9IDA7Ci0gICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmc4IHJlcXVlc3QoIkdFVCAiKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQobVBhdGgpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIEhUVFAvMS4xXHJcbiIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiSG9zdDogIik7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKG1Ib3N0KTsKLSAgICAgICAgaWYgKG1Qb3J0ICE9IDgwKSB7Ci0gICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChTdHJpbmdQcmludGYoIjoldSIsIG1Qb3J0KS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIGlmIChvZmZzZXQgIT0gMCkgewotICAgICAgICAgICAgY2hhciByYW5nZUhlYWRlclsxMjhdOwotICAgICAgICAgICAgc3ByaW50ZihyYW5nZUhlYWRlciwgIlJhbmdlOiBieXRlcz0lbGxkLVxyXG4iLCBvZmZzZXQpOwotICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocmFuZ2VIZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVxdWVzdC5hcHBlbmQobUhlYWRlcnMpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotCi0gICAgICAgIGludCBodHRwU3RhdHVzOwotICAgICAgICBpZiAoKGVyciA9IG1IVFRQLnNlbmQocmVxdWVzdC5zdHJpbmcoKSwgcmVxdWVzdC5zaXplKCkpKSAhPSBPSwotICAgICAgICAgICAgICAgIHx8IChlcnIgPSBtSFRUUC5yZWNlaXZlX2hlYWRlcigmaHR0cFN0YXR1cykpICE9IE9LKSB7Ci0gICAgICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKElzUmVkaXJlY3RTdGF0dXNDb2RlKGh0dHBTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHZhbHVlOwotICAgICAgICAgICAgQ0hFQ0sobUhUVFAuZmluZF9oZWFkZXJfdmFsdWUoIkxvY2F0aW9uIiwgJnZhbHVlKSk7Ci0KLSAgICAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLQotICAgICAgICAgICAgbUhUVFAuZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gY29ubmVjdCh2YWx1ZS5jX3N0cigpLCBoZWFkZXJzLCBvZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBTdGF0dXMgPCAyMDAgfHwgaHR0cFN0YXR1cyA+PSAzMDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgbUhhc0NodW5rZWRUcmFuc2ZlckVuY29kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgQVN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgIGlmIChtSFRUUC5maW5kX2hlYWRlcl92YWx1ZSgiVHJhbnNmZXItRW5jb2RpbmciLCAmdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgYW55IHRyYW5zZmVyIGVuY29kaW5ncyBidXQKLSAgICAgICAgICAgICAgICAvLyBjaHVua2VkLgotCi0gICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKHZhbHVlLmNfc3RyKCksICJjaHVua2VkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HSSgiQ2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBhcHBsaWVkLiIpOwotICAgICAgICAgICAgICAgICAgICBtSGFzQ2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtQ2h1bmtEYXRhQnl0ZXNMZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICBMT0dFKCJXZSBkb24ndCBzdXBwb3J0ICclcycgdHJhbnNmZXIgZW5jb2RpbmcuIiwgdmFsdWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFwcGx5VGltZW91dFJlc3BvbnNlKCk7Ci0KLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHZhbHVlOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwotICAgICAgICAgICAgaWYgKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKEFTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksICZ2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgUGFyc2VTaW5nbGVVbnNpZ25lZExvbmcodmFsdWUuY19zdHIoKSwgJngpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRlbnRMZW5ndGggPSAob2ZmNjRfdCl4OwotICAgICAgICAgICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJTZXJ2ZXIgZGlkIG5vdCBnaXZlIHVzIHRoZSBjb250ZW50IGxlbmd0aCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChodHRwU3RhdHVzICE9IDIwNiAvKiBQYXJ0aWFsIENvbnRlbnQgKi8pIHsKLSAgICAgICAgICAgICAgICAvLyBXZSByZXF1ZXN0ZWQgYSByYW5nZSBidXQgdGhlIHNlcnZlciBkaWRuJ3Qgc3VwcG9ydCB0aGF0LgotICAgICAgICAgICAgICAgIExPR0UoIldlIHJlcXVlc3RlZCBhIHJhbmdlIGJ1dCB0aGUgc2VydmVyIGRpZG4ndCAiCi0gICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCB0aGF0LiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICAgICAgICAgIGlmIChtSFRUUC5maW5kX2hlYWRlcl92YWx1ZShBU3RyaW5nKCJDb250ZW50LVJhbmdlIiksICZ2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cmNocih2YWx1ZS5jX3N0cigpLCAnLycpOwotICAgICAgICAgICAgICAgIGlmIChzbGFzaFBvcyAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZyhzbGFzaFBvcyArIDEsICZ4KSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udGVudExlbmd0aCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcgfHwgbVN0YXRlID09IENPTk5FQ1RFRCkgewotICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7Ci0gICAgfQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLX0KLQotc3RhdHVzX3QgTnVIVFRQRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBOT19JTklUOwotfQotCi1zc2l6ZV90IE51SFRUUERhdGFTb3VyY2U6OmludGVybmFsUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmICghbUhhc0NodW5rZWRUcmFuc2ZlckVuY29kaW5nKSB7Ci0gICAgICAgIHJldHVybiBtSFRUUC5yZWNlaXZlKGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIGlmIChtQ2h1bmtEYXRhQnl0ZXNMZWZ0IDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKG1DaHVua0RhdGFCeXRlc0xlZnQgPT0gMCkgewotICAgICAgICBjaGFyIGxpbmVbMTAyNF07Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQLnJlY2VpdmVfbGluZShsaW5lLCBzaXplb2YobGluZSkpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0dWKCJsaW5lID0gJyVzJyIsIGxpbmUpOwotCi0gICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBuID0gc3RydG91bChsaW5lLCAmZW5kLCAxNik7Ci0KLSAgICAgICAgaWYgKGVuZCA9PSBsaW5lIHx8ICgqZW5kICE9ICc7JyAmJiAqZW5kICE9ICdcMCcpKSB7Ci0gICAgICAgICAgICBMT0dFKCJtYWxmb3JtZWQgSFRUUCBjaHVuayAnJXMnIiwgbGluZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNodW5rRGF0YUJ5dGVzTGVmdCA9IG47Ci0gICAgICAgIExPR1YoImNodW5rIGRhdGEgc2l6ZSA9ICVsdSIsIG4pOwotCi0gICAgICAgIGlmIChtQ2h1bmtEYXRhQnl0ZXNMZWZ0ID09IDApIHsKLSAgICAgICAgICAgIG1DaHVua0RhdGFCeXRlc0xlZnQgPSAtMTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgfQotCi0gICAgaWYgKHNpemUgPiAoc2l6ZV90KW1DaHVua0RhdGFCeXRlc0xlZnQpIHsKLSAgICAgICAgc2l6ZSA9IG1DaHVua0RhdGFCeXRlc0xlZnQ7Ci0gICAgfQotCi0gICAgc3NpemVfdCBuID0gbUhUVFAucmVjZWl2ZShkYXRhLCBzaXplKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICBtQ2h1bmtEYXRhQnl0ZXNMZWZ0IC09IChzaXplX3QpbjsKLQotICAgIGlmIChtQ2h1bmtEYXRhQnl0ZXNMZWZ0ID09IDApIHsKLSAgICAgICAgY2hhciBsaW5lWzEwMjRdOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUC5yZWNlaXZlX2xpbmUobGluZSwgc2l6ZW9mKGxpbmUpKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVbMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgTE9HRSgibWlzc2luZyBIVFRQIGNodW5rIHRlcm1pbmF0b3IuIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG47Ci19Ci0KLXNzaXplX3QgTnVIVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIExPR1YoInJlYWRBdCBvZmZzZXQgJWxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAob2Zmc2V0ICE9IG1PZmZzZXQpIHsKLSAgICAgICAgU3RyaW5nOCBob3N0ID0gbUhvc3Q7Ci0gICAgICAgIFN0cmluZzggcGF0aCA9IG1QYXRoOwotICAgICAgICBTdHJpbmc4IGhlYWRlcnMgPSBtSGVhZGVyczsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdChob3N0LCBtUG9ydCwgcGF0aCwgbUhUVFBTLCBoZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZCkgewotICAgICAgICBzaXplX3QgYXZhaWwgPQotICAgICAgICAgICAgKG9mZnNldCA+PSBtQ29udGVudExlbmd0aCkgPyAwIDogbUNvbnRlbnRMZW5ndGggLSBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKHNpemUgPiBhdmFpbCkgewotICAgICAgICAgICAgc2l6ZSA9IGF2YWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKLSAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgc3NpemVfdCBuID0KLSAgICAgICAgICAgIGludGVybmFsUmVhZCgodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIHNpemUgLSBudW1CeXRlc1JlYWQpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgaWYgKG51bUJ5dGVzUmVhZCA9PSAwIHx8IG1Db250ZW50TGVuZ3RoVmFsaWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdlIHdhbnQgdG8gYXQgbGVhc3QgcmV0dXJuIHRoZSBkYXRhCi0gICAgICAgICAgICAvLyB3ZSd2ZSBhbHJlYWR5IHN1Y2Nlc3NmdWxseSByZWFkLiBUaGUgbmV4dCBjYWxsIHRvIHJlYWQgd2lsbAotICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGVycm9yLgotICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7Ci0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2wobiwgZGVsYXlVcyk7Ci0KLSAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKLQotICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIGNvbnRlbnQgbGVuZ3RoIGFuZCBtYWRlIHN1cmUgbm90IHRvIHJlYWQgYmV5b25kCi0gICAgICAgICAgICAgICAgLy8gaXQgYW5kIHlldCB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBvbiB1cy4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbU9mZnNldCArPSBudW1CeXRlc1JlYWQ7Ci0KLSAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOwotfQotCi1zdGF0dXNfdCBOdUhUVFBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQpIHsKLSAgICAgICAgKnNpemUgPSBtQ29udGVudExlbmd0aDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotdWludDMyX3QgTnVIVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6TWFrZUZ1bGxIZWFkZXJzKAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzLCBTdHJpbmc4ICpoZWFkZXJzKSB7Ci0gICAgaGVhZGVycy0+c2V0VG8oIiIpOwotCi0gICAgaGVhZGVycy0+YXBwZW5kKCJVc2VyLUFnZW50OiBzdGFnZWZyaWdodC8xLjEgKExpbnV4O0FuZHJvaWQgIik7Ci0KLSNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKLSNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKLSNlbmRpZgotCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7Ci0gICAgaGVhZGVycy0+YXBwZW5kKHZhbHVlKTsKLSAgICBoZWFkZXJzLT5hcHBlbmQoIilcclxuIik7Ci0KLSAgICBpZiAob3ZlcnJpZGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3ZlcnJpZGVzLT5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGxpbmU7Ci0gICAgICAgIGxpbmUuYXBwZW5kKG92ZXJyaWRlcy0+a2V5QXQoaSkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQob3ZlcnJpZGVzLT52YWx1ZUF0KGkpKTsKLSAgICAgICAgbGluZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBoZWFkZXJzLT5hcHBlbmQobGluZSk7Ci0gICAgfQotfQotCi12b2lkIE51SFRUUERhdGFTb3VyY2U6OmFwcGx5VGltZW91dFJlc3BvbnNlKCkgewotICAgIEFTdHJpbmcgdGltZW91dDsKLSAgICBpZiAobUhUVFAuZmluZF9oZWFkZXJfdmFsdWUoIlgtU29ja2V0VGltZW91dCIsICZ0aW1lb3V0KSkgewotICAgICAgICBjb25zdCBjaGFyICpzID0gdGltZW91dC5jX3N0cigpOwotICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgIGxvbmcgdG1wID0gc3RydG9sKHMsICZlbmQsIDEwKTsKLSAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAgICAgTE9HVygiSWxsZWdhbCBYLVNvY2tldFRpbWVvdXQgdmFsdWUgZ2l2ZW4uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMT0dJKCJvdmVycmlkaW5nIGRlZmF1bHQgdGltZW91dCwgbmV3IHRpbWVvdXQgaXMgJWxkIHNlY29uZHMiLCB0bXApOwotICAgICAgICBtSFRUUC5zZXRSZWNlaXZlVGltZW91dCh0bXApOwotICAgIH0KLX0KLQotYm9vbCBOdUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbCgKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7Ci0gICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKLSAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOwotCi0gICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKLSAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgfQotfQotCi1EZWNyeXB0SGFuZGxlKiBOdUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgLyogTm90ZSBpZiByZWRpcmVjdCBvY2N1cnMsIG1VcmkgaXMgdGhlIHJlZGlyZWN0IHVyaSBpbnN0ZWFkIG9mIHRoZQotICAgICAgICAgKiBvcmlnaW5hbCBvbmUKLSAgICAgICAgICovCi0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbihtVXJpKTsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgKmhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwotCi0gICAgKmNsaWVudCA9IG1Ecm1NYW5hZ2VyQ2xpZW50OwotfQotCi1TdHJpbmc4IE51SFRUUERhdGFTb3VyY2U6OmdldFVyaSgpIHsKLSAgICByZXR1cm4gbVVyaTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGU5NmNlMjguLmE0ZjM5MjIKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTgsMjAgKzE4LDExIEBACiAjZGVmaW5lIExPR19UQUcgIk9NWENvZGVjIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9BQUNEZWNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFbmNvZGVyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9BTVJOQkRlY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0FNUk5CRW5jb2Rlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvQU1SV0JEZWNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BTVJXQkVuY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0FWQ0RlY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0FWQ0VuY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0c3MTFEZWNvZGVyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9NNHZIMjYzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTTR2SDI2M0VuY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL01QM0RlY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1ZvcmJpc0RlY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1ZQWERlY29kZXIuaCIKIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCkBAIC01MywyMyArNDQsMTkgQEAKICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1RocmVhZGVkU291cmNlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOworLy8gVHJlYXQgdGltZSBvdXQgYXMgYW4gZXJyb3IgaWYgd2UgaGF2ZSBub3QgcmVjZWl2ZWQgYW55IG91dHB1dAorLy8gYnVmZmVycyBhZnRlciAzIHNlY29uZHMuCitjb25zdCBzdGF0aWMgaW50NjRfdCBrQnVmZmVyRmlsbGVkRXZlbnRUaW1lT3V0VXMgPSAzMDAwMDAwMDAwTEw7CiAKIHN0cnVjdCBDb2RlY0luZm8gewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgY29uc3QgY2hhciAqY29kZWM7CiB9OwogCi0jZGVmaW5lIEZBQ1RPUllfQ1JFQVRFKG5hbWUpIFwKLXN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gTWFrZSMjbmFtZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeyBcCi0gICAgcmV0dXJuIG5ldyBuYW1lKHNvdXJjZSk7IFwKLX0KLQogI2RlZmluZSBGQUNUT1JZX0NSRUFURV9FTkNPREVSKG5hbWUpIFwKIHN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gTWFrZSMjbmFtZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKSB7IFwKICAgICByZXR1cm4gbmV3IG5hbWUoc291cmNlLCBtZXRhKTsgXApAQCAtNzcsMTUgKzY0LDYgQEAKIAogI2RlZmluZSBGQUNUT1JZX1JFRihuYW1lKSB7ICNuYW1lLCBNYWtlIyNuYW1lIH0sCiAKLUZBQ1RPUllfQ1JFQVRFKE1QM0RlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBTVJOQkRlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBTVJXQkRlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBQUNEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoQVZDRGVjb2RlcikKLUZBQ1RPUllfQ1JFQVRFKEc3MTFEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoTTR2SDI2M0RlY29kZXIpCi1GQUNUT1JZX0NSRUFURShWb3JiaXNEZWNvZGVyKQotRkFDVE9SWV9DUkVBVEUoVlBYRGVjb2RlcikKIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQU1STkJFbmNvZGVyKQogRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJXQkVuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFBQ0VuY29kZXIpCkBAIC0xMTcsNzYgKzk1LDQ4IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gSW5zdGFudGlhdGVTb2Z0d2FyZUNvZGVjKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHN0cnVjdCBGYWN0b3J5SW5mbyB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiAoKkNyZWF0ZUZ1bmMpKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmKTsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IEZhY3RvcnlJbmZvIGtGYWN0b3J5SW5mb1tdID0gewotICAgICAgICBGQUNUT1JZX1JFRihNUDNEZWNvZGVyKQotICAgICAgICBGQUNUT1JZX1JFRihBTVJOQkRlY29kZXIpCi0gICAgICAgIEZBQ1RPUllfUkVGKEFNUldCRGVjb2RlcikKLSAgICAgICAgRkFDVE9SWV9SRUYoQUFDRGVjb2RlcikKLSAgICAgICAgRkFDVE9SWV9SRUYoQVZDRGVjb2RlcikKLSAgICAgICAgRkFDVE9SWV9SRUYoRzcxMURlY29kZXIpCi0gICAgICAgIEZBQ1RPUllfUkVGKE00dkgyNjNEZWNvZGVyKQotICAgICAgICBGQUNUT1JZX1JFRihWb3JiaXNEZWNvZGVyKQotICAgICAgICBGQUNUT1JZX1JFRihWUFhEZWNvZGVyKQotICAgIH07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICBpIDwgc2l6ZW9mKGtGYWN0b3J5SW5mbykgLyBzaXplb2Yoa0ZhY3RvcnlJbmZvWzBdKTsgKytpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIGtGYWN0b3J5SW5mb1tpXS5uYW1lKSkgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlZQWERlY29kZXIiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGhyZWFkZWRTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAoKmtGYWN0b3J5SW5mb1tpXS5DcmVhdGVGdW5jKShzb3VyY2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoKmtGYWN0b3J5SW5mb1tpXS5DcmVhdGVGdW5jKShzb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KICN1bmRlZiBGQUNUT1JZX1JFRgogI3VuZGVmIEZBQ1RPUllfQ1JFQVRFCiAKIHN0YXRpYyBjb25zdCBDb2RlY0luZm8ga0RlY29kZXJJbmZvW10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHLCAiT01YLlRJLkpQRUcuZGVjb2RlIiB9LAotLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLk52aWRpYS5tcDMuZGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5USS5NUDMuZGVjb2RlIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk1QM0RlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLlRJLkFNUi5kZWNvZGUiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5OdmlkaWEuYW1yLmRlY29kZXIiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJBTVJOQkRlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5OdmlkaWEuYW1yd2IuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5USS5XQkFNUi5kZWNvZGUiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJBTVJXQkRlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5OdmlkaWEuYWFjLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmRlY29kZSIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0RlY29kZXIiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJHNzExRGVjb2RlciIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgIkc3MTFEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgIk9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguVEkuRFVDQVRJMS5WSURFTy5ERUNPREVSIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguTnZpZGlhLm1wNC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5TRUMuTVBFRzQuRGVjb2RlciIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiTTR2SDI2M0RlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguVEkuRFVDQVRJMS5WSURFTy5ERUNPREVSIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5TRUMuSDI2My5EZWNvZGVyIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLkRVQ0FUSTEuVklERU8uREVDT0RFUiIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5OdmlkaWEuaDI2NC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5TRUMuQVZDLkRlY29kZXIiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJBVkNEZWNvZGVyIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiVm9yYmlzRGVjb2RlciIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWCwgIlZQWERlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5nb29nbGUuYXZjLmRlY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlBYLCAiT01YLmdvb2dsZS52cHguZGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCAiT01YLk52aWRpYS5tcGVnMnYuZGVjb2RlIiB9LAogfTsKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRW5jb2RlckluZm9bXSA9IHsKQEAgLTE5NiwxOCArMTQ2LDIxIEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJBTVJXQkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmVuY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0VuY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5EVUNBVEkxLlZJREVPLk1QRUc0RSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20uN3gzMC52aWRlby5lbmNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLm1wZWc0IiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguVEkuVmlkZW8uZW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLk52aWRpYS5tcDQuZW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlNFQy5NUEVHNC5FbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJNNHZIMjYzRW5jb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguVEkuRFVDQVRJMS5WSURFTy5NUEVHNEUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5lbmNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5lbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5TRUMuSDI2My5FbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNFbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLkRVQ0FUSTEuVklERU8uSDI2NEUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20udmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguVEkuVmlkZW8uZW5jb2RlciIgfSwKQEAgLTI3Nyw2ICsyMzAsMTAgQEAKIH0KIAogc3RhdGljIGJvb2wgSXNTb2Z0d2FyZUNvZGVjKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUpIHsKKyAgICBpZiAoIXN0cm5jbXAoIk9NWC5nb29nbGUuIiwgY29tcG9uZW50TmFtZSwgMTEpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIGlmICghc3RybmNtcCgiT01YLiIsIGNvbXBvbmVudE5hbWUsIDQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yODQsMjYgKzI0MSwyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0vLyBBIHNvcnQgb3JkZXIgaW4gd2hpY2ggbm9uLU9NWCBjb21wb25lbnRzIGFyZSBmaXJzdCwKLS8vIGZvbGxvd2VkIGJ5IHNvZnR3YXJlIGNvZGVjcywgYW5kIGZvbGxvd2VkIGJ5IGFsbCB0aGUgb3RoZXJzLgorLy8gQSBzb3J0IG9yZGVyIGluIHdoaWNoIE9NWCBzb2Z0d2FyZSBjb2RlY3MgYXJlIGZpcnN0LCBmb2xsb3dlZAorLy8gYnkgb3RoZXIgKG5vbi1PTVgpIHNvZnR3YXJlIGNvZGVjcywgZm9sbG93ZWQgYnkgZXZlcnl0aGluZyBlbHNlLgogc3RhdGljIGludCBDb21wYXJlU29mdHdhcmVDb2RlY3NGaXJzdCgKICAgICAgICAgY29uc3QgU3RyaW5nOCAqZWxlbTEsIGNvbnN0IFN0cmluZzggKmVsZW0yKSB7Ci0gICAgYm9vbCBpc05vdE9NWDEgPSBzdHJuY21wKGVsZW0xLT5zdHJpbmcoKSwgIk9NWC4iLCA0KTsKLSAgICBib29sIGlzTm90T01YMiA9IHN0cm5jbXAoZWxlbTItPnN0cmluZygpLCAiT01YLiIsIDQpOwotCi0gICAgaWYgKGlzTm90T01YMSkgewotICAgICAgICBpZiAoaXNOb3RPTVgyKSB7IHJldHVybiAwOyB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGlzTm90T01YMikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9CisgICAgYm9vbCBpc09NWDEgPSAhc3RybmNtcChlbGVtMS0+c3RyaW5nKCksICJPTVguIiwgNCk7CisgICAgYm9vbCBpc09NWDIgPSAhc3RybmNtcChlbGVtMi0+c3RyaW5nKCksICJPTVguIiwgNCk7CiAKICAgICBib29sIGlzU29mdHdhcmVDb2RlYzEgPSBJc1NvZnR3YXJlQ29kZWMoZWxlbTEtPnN0cmluZygpKTsKICAgICBib29sIGlzU29mdHdhcmVDb2RlYzIgPSBJc1NvZnR3YXJlQ29kZWMoZWxlbTItPnN0cmluZygpKTsKIAogICAgIGlmIChpc1NvZnR3YXJlQ29kZWMxKSB7Ci0gICAgICAgIGlmIChpc1NvZnR3YXJlQ29kZWMyKSB7IHJldHVybiAwOyB9CisgICAgICAgIGlmICghaXNTb2Z0d2FyZUNvZGVjMikgeyByZXR1cm4gLTE7IH0KKworICAgICAgICBpZiAoaXNPTVgxKSB7CisgICAgICAgICAgICBpZiAoaXNPTVgyKSB7IHJldHVybiAwOyB9CisKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpc09NWDIpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0zNjEsNyArMzIxLDIwIEBACiAgICAgICAgIHF1aXJrcyB8PSBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbjsKICAgICB9CiAKLSAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5USS4iLCA3KSkgeworICAgIGlmICghc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguVEkuRFVDQVRJMS5WSURFTy5ERUNPREVSIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOworICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgIH0KKworICAgIC8vIEZJWE1FOgorICAgIC8vIFJlbW92ZSB0aGUgcXVpcmtzIGFmdGVyIHRoZSB3b3JrIGlzIGRvbmUuCisgICAgZWxzZSBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlRJLkRVQ0FUSTEuVklERU8uTVBFRzRFIikgfHwKKyAgICAgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguVEkuRFVDQVRJMS5WSURFTy5IMjY0RSIpKSB7CisKKyAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOworICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgIH0KKyAgICBlbHNlIGlmICghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLlRJLiIsIDcpKSB7CiAgICAgICAgIC8vIEFwcGFyZW50bHkgSSBtdXN0IG5vdCB1c2UgT01YX1VzZUJ1ZmZlciBvbiBlaXRoZXIgaW5wdXQgb3IKICAgICAgICAgLy8gb3V0cHV0IHBvcnRzIG9uIGFueSBvZiB0aGUgVEkgY29tcG9uZW50cyBvciBxdW90ZToKICAgICAgICAgLy8gIihJKSBtYXkgaGF2ZSB1bmV4cGVjdGVkIHByb2JsZW0gKHNpYykgd2hpY2ggY2FuIGJlIHRpbWluZyByZWxhdGVkCkBAIC00NDUsNiArNDE4LDE1IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKm1hdGNoQ29tcG9uZW50TmFtZSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpIHsKKyAgICBpbnQzMl90IHJlcXVpcmVzU2VjdXJlQnVmZmVyczsKKyAgICBpZiAoc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgJnJlcXVpcmVzU2VjdXJlQnVmZmVycykKKyAgICAgICAgICAgICYmIHJlcXVpcmVzU2VjdXJlQnVmZmVycykgeworICAgICAgICBmbGFncyB8PSBrSWdub3JlQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgICAgIGZsYWdzIHw9IGtVc2VTZWN1cmVJbnB1dEJ1ZmZlcnM7CisgICAgfQorCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKQEAgLTQ2NCwxNCArNDQ2LDE1IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV0uc3RyaW5nKCk7CiAKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvZnR3YXJlQ29kZWMgPSBjcmVhdGVFbmNvZGVyPwotICAgICAgICAgICAgSW5zdGFudGlhdGVTb2Z0d2FyZUVuY29kZXIoY29tcG9uZW50TmFtZSwgc291cmNlLCBtZXRhKToKLSAgICAgICAgICAgIEluc3RhbnRpYXRlU29mdHdhcmVDb2RlYyhjb21wb25lbnROYW1lLCBzb3VyY2UpOworICAgICAgICBpZiAoY3JlYXRlRW5jb2RlcikgeworICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvZnR3YXJlQ29kZWMgPQorICAgICAgICAgICAgICAgIEluc3RhbnRpYXRlU29mdHdhcmVFbmNvZGVyKGNvbXBvbmVudE5hbWUsIHNvdXJjZSwgbWV0YSk7CiAKLSAgICAgICAgaWYgKHNvZnR3YXJlQ29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgTE9HVigiU3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBzb2Z0d2FyZSBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBpZiAoc29mdHdhcmVDb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HVigiU3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBzb2Z0d2FyZSBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKLSAgICAgICAgICAgIHJldHVybiBzb2Z0d2FyZUNvZGVjOworICAgICAgICAgICAgICAgIHJldHVybiBzb2Z0d2FyZUNvZGVjOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CkBAIC00OTgsMTUgKzQ4MSwxOSBAQAogICAgICAgICAgICAgTE9HVigiU3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKICAgICAgICAgICAgIHNwPE9NWENvZGVjPiBjb2RlYyA9IG5ldyBPTVhDb2RlYygKLSAgICAgICAgICAgICAgICAgICAgb214LCBub2RlLCBxdWlya3MsCisgICAgICAgICAgICAgICAgICAgIG9teCwgbm9kZSwgcXVpcmtzLCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRW5jb2RlciwgbWltZSwgY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBuYXRpdmVXaW5kb3cpOwogCiAgICAgICAgICAgICBvYnNlcnZlci0+c2V0Q29kZWMoY29kZWMpOwogCi0gICAgICAgICAgICBlcnIgPSBjb2RlYy0+Y29uZmlndXJlQ29kZWMobWV0YSwgZmxhZ3MpOworICAgICAgICAgICAgZXJyID0gY29kZWMtPmNvbmZpZ3VyZUNvZGVjKG1ldGEpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIk9NWC5OdmlkaWEubXBlZzJ2LmRlY29kZSIsIGNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5tRmxhZ3MgfD0ga09ubHlTdWJtaXRPbmVJbnB1dEJ1ZmZlckF0T25lVGltZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICByZXR1cm4gY29kZWM7CiAgICAgICAgICAgICB9CiAKQEAgLTUxNywyNCArNTA0LDExIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpjb25maWd1cmVDb2RlYyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9IGZhbHNlOwotICAgIGlmIChmbGFncyAmIGtTdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpIHsKLSAgICAgICAgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9IHRydWU7Ci0gICAgfQorc3RhdHVzX3QgT01YQ29kZWM6OmNvbmZpZ3VyZUNvZGVjKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkgeworICAgIExPR1YoImNvbmZpZ3VyZUNvZGVjIHByb3RlY3RlZD0lZCIsCisgICAgICAgICAobUZsYWdzICYga0VuYWJsZUdyYWxsb2NVc2FnZVByb3RlY3RlZCkgPyAxIDogMCk7CiAKLSAgICBtT25seVN1Ym1pdE9uZUJ1ZmZlckF0T25lVGltZSA9IGZhbHNlOwotICAgIGlmIChmbGFncyAmIGtPbmx5U3VibWl0T25lSW5wdXRCdWZmZXJBdE9uZVRpbWUpIHsKLSAgICAgICAgbU9ubHlTdWJtaXRPbmVCdWZmZXJBdE9uZVRpbWUgPSB0cnVlOwotICAgIH0KLQotICAgIG1FbmFibGVHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQgPSBmYWxzZTsKLSAgICBpZiAoZmxhZ3MgJiBrRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkKSB7Ci0gICAgICAgIG1FbmFibGVHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBMT0dWKCJjb25maWd1cmVDb2RlYyBwcm90ZWN0ZWQ9JWQiLCBtRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkKTsKLQotICAgIGlmICghKGZsYWdzICYga0lnbm9yZUNvZGVjU3BlY2lmaWNEYXRhKSkgeworICAgIGlmICghKG1GbGFncyAmIGtJZ25vcmVDb2RlY1NwZWNpZmljRGF0YSkpIHsKICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7CkBAIC02MjIsNiArNTk2LDExIEBACiAgICAgICAgICAgICAgICAgTE9HRSgiUHJvZmlsZSBhbmQvb3IgbGV2ZWwgZXhjZWVkIHRoZSBkZWNvZGVyJ3MgY2FwYWJpbGl0aWVzLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MzEsMTYgKzYxMCwyMyBAQAogICAgIH0KICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtTUlNRSkpIHsKICAgICAgICAgc2V0QU1SRm9ybWF0KGZhbHNlIC8qIGlzV0FNUiAqLywgYml0UmF0ZSk7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1NSU1FKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtTUlNRSkpIHsKICAgICAgICAgc2V0QU1SRm9ybWF0KHRydWUgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbU1JTUUpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1NSU1FKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKIAogICAgICAgICBzZXRBQUNGb3JtYXQobnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdFJhdGUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCBtTUlNRSkKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgbU1JTUUpKSB7CisgICAgICAgIC8vIFRoZXNlIGFyZSBQQ00tbGlrZSBmb3JtYXRzIHdpdGggYSBmaXhlZCBzYW1wbGUgcmF0ZSBidXQKKyAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgY2hhbm5lbHMuCisKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworCisgICAgICAgIHNldEc3MTFGb3JtYXQobnVtQ2hhbm5lbHMpOwogICAgIH0KIAogICAgIGlmICghc3RybmNhc2VjbXAobU1JTUUsICJ2aWRlby8iLCA2KSkgewpAQCAtNjk3LDcgKzY4Myw3IEBACiAKICAgICBpbml0T3V0cHV0Rm9ybWF0KG1ldGEpOwogCi0gICAgaWYgKChmbGFncyAmIGtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKQorICAgIGlmICgobUZsYWdzICYga0NsaWVudE5lZWRzRnJhbWVidWZmZXIpCiAgICAgICAgICAgICAmJiAhc3RybmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5TRUMuIiwgOCkpIHsKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKIApAQCAtODQzLDYgKzgyOSw3IEBACiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtODY2LDYgKzg1Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdldCBjb2xvciBmb3JtYXQgaXMgc3VwcG9ydGVkLgogICAgIHJldHVybiBpc0NvbG9yRm9ybWF0U3VwcG9ydGVkKCpjb2xvckZvcm1hdCwga1BvcnRJbmRleElucHV0KTsKIH0KQEAgLTEyNTEsMTMgKzEyMzksNiBAQAogICAgIGgyNjR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0KICAgICAgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlSSB8IE9NWF9WSURFT19QaWN0dXJlVHlwZVA7CiAKLSAgICBoMjY0dHlwZS5uU2xpY2VIZWFkZXJTcGFjaW5nID0gMDsKLSAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IDA7ICAgLy8gTm8gQiBmcmFtZXMgc3VwcG9ydCB5ZXQKLSAgICBoMjY0dHlwZS5uUEZyYW1lcyA9IHNldFBGcmFtZXNTcGFjaW5nKGlGcmFtZXNJbnRlcnZhbCwgZnJhbWVSYXRlKTsKLSAgICBpZiAoaDI2NHR5cGUublBGcmFtZXMgPT0gMCkgewotICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9IE9NWF9WSURFT19QaWN0dXJlVHlwZUk7Ci0gICAgfQotCiAgICAgLy8gQ2hlY2sgcHJvZmlsZSBhbmQgbGV2ZWwgcGFyYW1ldGVycwogICAgIENvZGVjUHJvZmlsZUxldmVsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbDsKICAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlID0gaDI2NHR5cGUuZVByb2ZpbGU7CkBAIC0xMjY3LDkgKzEyNDgsMjEgQEAKICAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRT4ocHJvZmlsZUxldmVsLm1Qcm9maWxlKTsKICAgICBoMjY0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fQVZDTEVWRUxUWVBFPihwcm9maWxlTGV2ZWwubUxldmVsKTsKIAorICAgIC8vIEZJWE1FOgorICAgIC8vIFJlbW92ZSB0aGUgd29ya2Fyb3VuZCBhZnRlciB0aGUgd29yayBpbiBkb25lLgorICAgIGlmICghc3RybmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5USS5EVUNBVEkxIiwgMTQpKSB7CisgICAgICAgIGgyNjR0eXBlLmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKKyAgICB9CisKICAgICBpZiAoaDI2NHR5cGUuZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgeworICAgICAgICBoMjY0dHlwZS5uU2xpY2VIZWFkZXJTcGFjaW5nID0gMDsKICAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAxOworICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IDA7CisgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lc0ludGVydmFsLCBmcmFtZVJhdGUpOworICAgICAgICBpZiAoaDI2NHR5cGUublBGcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgaDI2NHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPSBPTVhfVklERU9fUGljdHVyZVR5cGVJOworICAgICAgICB9CiAgICAgICAgIGgyNjR0eXBlLm5SZWZJZHgxMEFjdGl2ZU1pbnVzMSA9IDA7CiAgICAgICAgIGgyNjR0eXBlLm5SZWZJZHgxMUFjdGl2ZU1pbnVzMSA9IDA7CiAgICAgICAgIGgyNjR0eXBlLmJFbnRyb3B5Q29kaW5nQ0FCQUMgPSBPTVhfRkFMU0U7CkBAIC0xMzE2LDYgKzEzMDksMTAgQEAKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIMjYzOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fVlBYLCBtaW1lKSkgeworICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUFg7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgiTm90IGEgc3VwcG9ydGVkIHZpZGVvIG1pbWUgdHlwZTogJXMiLCBtaW1lKTsKICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIE5vdCBhIHN1cHBvcnRlZCB2aWRlbyBtaW1lIHR5cGUuIik7CkBAIC0xMzQxLDExICsxMzM4LDEwIEBACiAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKICAgICAgICAgQ0hFQ0tfRVEoKGludClmb3JtYXQuZUNvbXByZXNzaW9uRm9ybWF0LCAoaW50KU9NWF9WSURFT19Db2RpbmdVbnVzZWQpOwogCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KICAgICAgICAgQ0hFQ0soZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyCiAgICAgICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyCiAgICAgICAgICAgICAgICB8fCBmb3JtYXQuZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRDYllDclkKKyAgICAgICAgICAgICAgIHx8IGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIKICAgICAgICAgICAgICAgIHx8IGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcik7CiAKICAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKApAQCAtMTQxNyw3ICsxNDEzLDggQEAKIH0KIAogT01YQ29kZWM6Ok9NWENvZGVjKAotICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LCBJT01YOjpub2RlX2lkIG5vZGUsIHVpbnQzMl90IHF1aXJrcywKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICB1aW50MzJfdCBxdWlya3MsIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBib29sIGlzRW5jb2RlciwKICAgICAgICAgY29uc3QgY2hhciAqbWltZSwKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKQEAgLTE0MjcsNiArMTQyNCw3IEBACiAgICAgICBtT01YTGl2ZXNMb2NhbGx5KG9teC0+bGl2ZXNMb2NhbGx5KGdldHBpZCgpKSksCiAgICAgICBtTm9kZShub2RlKSwKICAgICAgIG1RdWlya3MocXVpcmtzKSwKKyAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtSXNFbmNvZGVyKGlzRW5jb2RlciksCiAgICAgICBtTUlNRShzdHJkdXAobWltZSkpLAogICAgICAgbUNvbXBvbmVudE5hbWUoc3RyZHVwKGNvbXBvbmVudE5hbWUpKSwKQEAgLTE0NDMsNyArMTQ0MSw4IEBACiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFBlbmRpbmcoZmFsc2UpLAogICAgICAgbUxlZnRPdmVyQnVmZmVyKE5VTEwpLAogICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdykgeworICAgICAgbU5hdGl2ZVdpbmRvdyghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLmdvb2dsZS4iLCAxMSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gTlVMTCA6IG5hdGl2ZVdpbmRvdykgewogICAgIG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhJbnB1dF0gPSBFTkFCTEVEOwogICAgIG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhPdXRwdXRdID0gRU5BQkxFRDsKIApAQCAtMTU5MywzMCArMTU5MiwzMiBAQAogICAgICAgICByZXR1cm4gYWxsb2NhdGVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygpOwogICAgIH0KIAotICAgIGlmIChtRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7CisgICAgaWYgKChtRmxhZ3MgJiBrRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkKSAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkgewogICAgICAgICBMT0dFKCJwcm90ZWN0ZWQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSBzdGVudCB0byBhbiBBTmF0aXZlV2luZG93Iik7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAoKG1GbGFncyAmIGtTdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpCisgICAgICAgICAgICAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSB7CisgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhJbnB1dCwgT01YX1RSVUUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0dFKCJTdG9yaW5nIG1ldGEgZGF0YSBpbiB2aWRlbyBidWZmZXJzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwogICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaWYgKG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgewotICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4SW5wdXQsIE9NWF9UUlVFKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgTE9HRSgiU3RvcmluZyBtZXRhIGRhdGEgaW4gdmlkZW8gYnVmZmVycyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQ09ERUNfTE9HSSgiYWxsb2NhdGluZyAlbHUgYnVmZmVycyBvZiBzaXplICVsdSBvbiAlcyBwb3J0IiwKICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOwpAQCAtMTYzNCw3ICsxNjM1LDggQEAKIAogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVyOwogICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dAotICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHMpKSB7CisgICAgICAgICAgICAgICAgJiYgKChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHMpCisgICAgICAgICAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzKSkpIHsKICAgICAgICAgICAgIGlmIChtT01YTGl2ZXNMb2NhbGx5KSB7CiAgICAgICAgICAgICAgICAgbWVtLmNsZWFyKCk7CiAKQEAgLTE2OTUsNiArMTY5NywzMSBAQAogCiAgICAgLy8gZHVtcFBvcnRTdGF0dXMocG9ydEluZGV4KTsKIAorICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIChtRmxhZ3MgJiBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzKSkgeworICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gYnVmZmVyczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5pdGVtQXQoaSk7CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGluZm8ubURhdGEsIGluZm8ubVNpemUpOworICAgICAgICAgICAgYnVmZmVycy5wdXNoKG1idWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVycyhidWZmZXJzKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlZi5uQnVmZmVyQ291bnRBY3R1YWw7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOworCisgICAgICAgICAgICBDT0RFQ19MT0dFKAorICAgICAgICAgICAgICAgICAgICAiQ29kZWMgcmVxdWVzdGVkIHRvIHVzZSBzZWN1cmUgaW5wdXQgYnVmZmVycyBidXQgIgorICAgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc291cmNlIGRpZG4ndCBzdXBwb3J0IHRoYXQuIik7CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE3MzcsNiArMTc2NCwxMyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShtTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAogICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCkBAIC0xNzYyLDcgKzE3OTYsNyBAQAogICAgICAgICAvLyBYWFg6IEN1cnJlbnRseSB0aGlzIGVycm9yIGlzIGxvZ2dlZCwgYnV0IG5vdCBmYXRhbC4KICAgICAgICAgdXNhZ2UgPSAwOwogICAgIH0KLSAgICBpZiAobUVuYWJsZUdyYWxsb2NVc2FnZVByb3RlY3RlZCkgeworICAgIGlmIChtRmxhZ3MgJiBrRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkKSB7CiAgICAgICAgIHVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEOwogICAgIH0KIApAQCAtMTc4NSw3ICsxODE5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIExPR1YoIm5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlIHVzYWdlPTB4JXgiLCB1c2FnZSk7CisgICAgTE9HVigibmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UgdXNhZ2U9MHglbHgiLCB1c2FnZSk7CiAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB1c2FnZSB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCk7CiAgICAgaWYgKGVyciAhPSAwKSB7CkBAIC0xODMwLDcgKzE4NjQsNyBAQAogCiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCiAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7Ci0gICAgICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWY7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKICAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKQEAgLTE5MDAsNyArMTkzNCw3IEBACiAKIE9NWENvZGVjOjpCdWZmZXJJbmZvKiBPTVhDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgLy8gRGVxdWV1ZSB0aGUgbmV4dCBidWZmZXIgZnJvbSB0aGUgbmF0aXZlIHdpbmRvdy4KLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKTsKICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgIENPREVDX0xPR0UoImRlcXVldWVCdWZmZXIgZmFpbGVkIHcvIGVycm9yIDB4JTA4eCIsIGVycik7CkBAIC0xOTM1LDcgKzE5NjksMzMgQEAKICAgICByZXR1cm4gYnVmSW5mbzsKIH0KIAoraW50NjRfdCBPTVhDb2RlYzo6cmV0cmlldmVEZWNvZGluZ1RpbWVVcyhib29sIGlzQ29kZWNTcGVjaWZpYykgeworICAgIENIRUNLKG1Jc0VuY29kZXIpOworCisgICAgaWYgKG1EZWNvZGluZ1RpbWVMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgQ0hFQ0sobU5vTW9yZU91dHB1dERhdGEpOworICAgICAgICAvLyBObyBjb3JyZXNwb25kaW5nIGlucHV0IGZyYW1lIGF2YWlsYWJsZS4KKyAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gd2hlbiBFT1MgaXMgcmVhY2hlZC4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTGlzdDxpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBtRGVjb2RpbmdUaW1lTGlzdC5iZWdpbigpOworICAgIGludDY0X3QgdGltZVVzID0gKml0OworCisgICAgLy8gSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwKKyAgICAvLyBkbyBub3QgcmVtb3ZlIHRoZSBkZWNvZGluZyB0aW1lIGZyb20gdGhlIGxpc3QuCisgICAgaWYgKCFpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgbURlY29kaW5nVGltZUxpc3QuZXJhc2UoaXQpOworICAgIH0KKyAgICByZXR1cm4gdGltZVVzOworfQorCiB2b2lkIE9NWENvZGVjOjpvbl9tZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKKyAgICBpZiAobVN0YXRlID09IEVSUk9SKSB7CisgICAgICAgIExPR1coIkRyb3BwaW5nIE9NWCBtZXNzYWdlIC0gd2UncmUgaW4gRVJST1Igc3RhdGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7CiAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgogICAgICAgICB7CkBAIC0xOTg4LDcgKzIwNDgsMTIgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IEVSUk9SCiAgICAgICAgICAgICAgICAgICAgICYmIG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhJbnB1dF0gIT0gU0hVVFRJTkdfRE9XTikgewogICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSwgKGludClFTkFCTEVEKTsKLSAgICAgICAgICAgICAgICBkcmFpbklucHV0QnVmZmVyKCZidWZmZXJzLT5lZGl0SXRlbUF0KGkpKTsKKworICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGRyYWluQW55SW5wdXRCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkcmFpbklucHV0QnVmZmVyKCZidWZmZXJzLT5lZGl0SXRlbUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjA3Nyw4ICsyMTQyLDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgaXNDb2RlY1NwZWNpZmljID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpc0NvZGVjU3BlY2lmaWMgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc0dyYXBoaWNCdWZmZXIgfHwgbVF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkgewpAQCAtMjA5OCw2ICsyMTY1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIG1Ob01vcmVPdXRwdXREYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzID0gcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhpc0NvZGVjU3BlY2lmaWMpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCBkZWNvZGluZ1RpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPD0gbVRhcmdldFRpbWVVcyk7CiAKQEAgLTIyMzksMTMgKzIzMTEsMTUgQEAKIAogICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgewogICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGExID09IGtQb3J0SW5kZXhPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgJiYgZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMSA9PSBrUG9ydEluZGV4T3V0cHV0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlKSkgewogCiAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG9sZE91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgICAgICAgaW5pdE91dHB1dEZvcm1hdChtU291cmNlLT5nZXRGb3JtYXQoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0SGFzTm90YWJseUNoYW5nZWQob2xkT3V0cHV0Rm9ybWF0LCBtT3V0cHV0Rm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wICYmCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEhhc05vdGFibHlDaGFuZ2VkKG9sZE91dHB1dEZvcm1hdCwgbU91dHB1dEZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0hhdmVDaGFuZ2VkID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CkBAIC0yMjY0LDYgKzIzMzgsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW52YWxpZCwgd2UnbGwga25vdyBzb29uIGVub3VnaC4KICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmNyb3ApOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmc2NhbGUpOworICAgICAgICAgICAgICAgICAgICBzY2FsZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgZGlzcGxheSBkaW1lbnNpb24gb25seSB3aGVuIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKE9LID09IG1PTVgtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUsIHNpemVvZihzY2FsZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LCAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LCAmYm90dG9tKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzY2FsZSBpcyBpbiAxNi4xNiBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSAxLjAgPSAweDAxMDAwMC4gV2hlbiB0aGVyZSBpcyBubworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXksIHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJHZXQgT01YX0luZGV4Q29uZmlnU2NhbGU6IDB4JWx4LzB4JWx4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUueFdpZHRoLCBzY2FsZS54SGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlLnhXaWR0aCAhPSAweDAxMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJpZ2h0IC0gbGVmdCArICAxKSAqIHNjYWxlLnhXaWR0aCkgID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUueEhlaWdodCAhPSAweDAxMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChib3R0b20gIC0gdG9wICsgMSkgKiBzY2FsZS54SGVpZ2h0KSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0hhdmVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjY4MywzMiArMjc5MCw4MSBAQAogdm9pZCBPTVhDb2RlYzo6ZHJhaW5JbnB1dEJ1ZmZlcnMoKSB7CiAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gUkVDT05GSUdVUklORyk7CiAKLSAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzLT5zaXplKCk7ICsraSkgewotICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJmJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSk7Ci0KLSAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgIT0gT1dORURfQllfVVMpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGlmIChtRmxhZ3MgJiBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzKSB7CisgICAgICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFkcmFpbkFueUlucHV0QnVmZmVyKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtPbmx5U3VibWl0T25lSW5wdXRCdWZmZXJBdE9uZVRpbWUpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF07CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmYnVmZmVycy0+ZWRpdEl0ZW1BdChpKTsKIAotICAgICAgICBpZiAoIWRyYWluSW5wdXRCdWZmZXIoaW5mbykpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBPV05FRF9CWV9VUykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtT25seVN1Ym1pdE9uZUJ1ZmZlckF0T25lVGltZSkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIWRyYWluSW5wdXRCdWZmZXIoaW5mbykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtPbmx5U3VibWl0T25lSW5wdXRCdWZmZXJBdE9uZVRpbWUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAorYm9vbCBPTVhDb2RlYzo6ZHJhaW5BbnlJbnB1dEJ1ZmZlcigpIHsKKyAgICByZXR1cm4gZHJhaW5JbnB1dEJ1ZmZlcigoQnVmZmVySW5mbyAqKU5VTEwpOworfQorCitPTVhDb2RlYzo6QnVmZmVySW5mbyAqT01YQ29kZWM6OmZpbmRJbnB1dEJ1ZmZlckJ5RGF0YVBvaW50ZXIodm9pZCAqcHRyKSB7CisgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICppbmZvcyA9ICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLT5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJmluZm9zLT5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tRGF0YSA9PSBwdHIpIHsKKyAgICAgICAgICAgIENPREVDX0xPR1YoCisgICAgICAgICAgICAgICAgICAgICJpbnB1dCBidWZmZXIgZGF0YSBwdHIgPSAlcCwgYnVmZmVyX2lkID0gJXAiLAorICAgICAgICAgICAgICAgICAgICBwdHIsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXIpOworCisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSRVNQQVNTKCk7Cit9CisKK09NWENvZGVjOjpCdWZmZXJJbmZvICpPTVhDb2RlYzo6ZmluZEVtcHR5SW5wdXRCdWZmZXIoKSB7CisgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICppbmZvcyA9ICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLT5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJmluZm9zLT5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IE9XTkVEX0JZX1VTKSB7CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSRVNQQVNTKCk7Cit9CisKIGJvb2wgT01YQ29kZWM6OmRyYWluSW5wdXRCdWZmZXIoQnVmZmVySW5mbyAqaW5mbykgewotICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClPV05FRF9CWV9VUyk7CisgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpT1dORURfQllfVVMpOworICAgIH0KIAogICAgIGlmIChtU2lnbmFsbGVkRU9TKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhSW5kZXggPCBtQ29kZWNTcGVjaWZpY0RhdGEuc2l6ZSgpKSB7CisgICAgICAgIENIRUNLKCEobUZsYWdzICYga1VzZVNlY3VyZUlucHV0QnVmZmVycykpOworCiAgICAgICAgIGNvbnN0IENvZGVjU3BlY2lmaWNEYXRhICpzcGVjaWZpYyA9CiAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFbbUNvZGVjU3BlY2lmaWNEYXRhSW5kZXhdOwogCkBAIC0yODA0LDYgKzI5NjAsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1GbGFncyAmIGtVc2VTZWN1cmVJbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGluZm8gPSBmaW5kSW5wdXRCdWZmZXJCeURhdGFQb2ludGVyKHNyY0J1ZmZlci0+ZGF0YSgpKTsKKyAgICAgICAgICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgICAgIH0KKwogICAgICAgICBzaXplX3QgcmVtYWluaW5nQnl0ZXMgPSBpbmZvLT5tU2l6ZSAtIG9mZnNldDsKIAogICAgICAgICBpZiAoc3JjQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IHJlbWFpbmluZ0J5dGVzKSB7CkBAIC0yODM5LDE5ICszMDAwLDMyIEBACiAgICAgICAgICAgICByZWxlYXNlQnVmZmVyID0gZmFsc2U7CiAgICAgICAgICAgICBpbmZvLT5tTWVkaWFCdWZmZXIgPSBzcmNCdWZmZXI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycykgeworICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtTdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlQnVmZmVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyID0gc3JjQnVmZmVyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjQnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3JjQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrVXNlU2VjdXJlSW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgLy8gRGF0YSBpbiAiaW5mbyIgaXMgYWxyZWFkeSBwcm92aWRlZCBhdCB0aGlzIHRpbWUuCisKKyAgICAgICAgICAgICAgICByZWxlYXNlQnVmZmVyID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBDSEVDSyhpbmZvLT5tTWVkaWFCdWZmZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyID0gc3JjQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilpbmZvLT5tRGF0YSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjQnVmZmVyLT5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNyY0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgbGFzdEJ1ZmZlclRpbWVVczsKICAgICAgICAgQ0hFQ0soc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbGFzdEJ1ZmZlclRpbWVVcykpOwogICAgICAgICBDSEVDSyhsYXN0QnVmZmVyVGltZVVzID49IDApOworICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgbURlY29kaW5nVGltZUxpc3QucHVzaF9iYWNrKGxhc3RCdWZmZXJUaW1lVXMpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RCdWZmZXJUaW1lVXM7CkBAIC0yODU5LDYgKzMwMzMsMjMgQEAKIAogICAgICAgICBvZmZzZXQgKz0gc3JjQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAorICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCBtTUlNRSkpIHsKKyAgICAgICAgICAgIENIRUNLKCEobVF1aXJrcyAmIGtTdXBwb3J0c011bHRpcGxlRnJhbWVzUGVySW5wdXRCdWZmZXIpKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGluZm8tPm1TaXplLCBvZmZzZXQgKyBzaXplb2YoaW50MzJfdCkpOworCisgICAgICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgICAgICAgICAgaWYgKCFzcmNCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CisgICAgICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgJm51bVBhZ2VTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZWxlYXNlQnVmZmVyKSB7CiAgICAgICAgICAgICBzcmNCdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIHNyY0J1ZmZlciA9IE5VTEw7CkBAIC0yODk1LDYgKzMwODYsMTYgQEAKICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXIsIG9mZnNldCwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCB0aW1lc3RhbXBVcyAvIDFFNik7CiAKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIENIRUNLKG1GbGFncyAmIGtVc2VTZWN1cmVJbnB1dEJ1ZmZlcnMpOworICAgICAgICBDSEVDSyhzaWduYWxFT1MpOworCisgICAgICAgIC8vIFRoaXMgaXMgZmlzaHksIHRoZXJlJ3Mgc3RpbGwgYSBNZWRpYUJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAgICAgLy8gaW5mbyBhdmFpbGFibGUgdG8gdGhlIHNvdXJjZSBhdCB0aGlzIHBvaW50IGV2ZW4gdGhvdWdoIHdlJ3JlIGdvaW5nCisgICAgICAgIC8vIHRvIHVzZSBpdCB0byBzaWduYWwgRU9TIHRvIHRoZSBjb2RlYy4KKyAgICAgICAgaW5mbyA9IGZpbmRFbXB0eUlucHV0QnVmZmVyKCk7CisgICAgfQorCiAgICAgZXJyID0gbU9NWC0+ZW1wdHlCdWZmZXIoCiAgICAgICAgICAgICBtTm9kZSwgaW5mby0+bUJ1ZmZlciwgMCwgb2Zmc2V0LAogICAgICAgICAgICAgZmxhZ3MsIHRpbWVzdGFtcFVzKTsKQEAgLTI5ODksNiArMzE5MCwxNiBAQAogICAgIG1CdWZmZXJGaWxsZWQuc2lnbmFsKCk7CiB9CiAKK3N0YXR1c190IE9NWENvZGVjOjp3YWl0Rm9yQnVmZmVyRmlsbGVkX2woKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckZpbGxlZC53YWl0UmVsYXRpdmUobUxvY2ssIGtCdWZmZXJGaWxsZWRFdmVudFRpbWVPdXRVcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBMT0dFKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgYnVmZmVycyBmcm9tIHZpZGVvIGVuY29kZXI6ICVkLyVkIiwKKyAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdKSwKKyAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XSkpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiB2b2lkIE9NWENvZGVjOjpzZXRSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscykgewogCkBAIC0zMTg0LDYgKzMzOTUsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgT01YQ29kZWM6OnNldEc3MTFGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscykgeworICAgIENIRUNLKCFtSXNFbmNvZGVyKTsKKyAgICBzZXRSYXdBdWRpb0Zvcm1hdChrUG9ydEluZGV4SW5wdXQsIDgwMDAsIG51bUNoYW5uZWxzKTsKK30KKwogdm9pZCBPTVhDb2RlYzo6c2V0SW1hZ2VPdXRwdXRGb3JtYXQoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZvcm1hdCwgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpIHsKICAgICBDT0RFQ19MT0dWKCJzZXRJbWFnZU91dHB1dEZvcm1hdCglbGQsICVsZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTMzMzksNyArMzU1NSw3IEBACiB9CiAKIHN0YXR1c190IE9NWENvZGVjOjpzdG9wKCkgewotICAgIENPREVDX0xPR0koInN0b3AgbVN0YXRlPSVkIiwgbVN0YXRlKTsKKyAgICBDT0RFQ19MT0dWKCJzdG9wIG1TdGF0ZT0lZCIsIG1TdGF0ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zNDAxLDcgKzM2MTcsNiBAQAogICAgICAgICBtTGVmdE92ZXJCdWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIENPREVDX0xPR0koInN0b3BwaW5nIHZpZGVvIHNvdXJjZSIpOwogICAgIG1Tb3VyY2UtPnN0b3AoKTsKIAogICAgIENPREVDX0xPR0koInN0b3BwZWQgaW4gc3RhdGUgJWQiLCBtU3RhdGUpOwpAQCAtMzQxNyw2ICszNjMyLDcgQEAKIAogc3RhdHVzX3QgT01YQ29kZWM6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICpidWZmZXIgPSBOVUxMOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTM0NTcsNyArMzY3Myw5IEBACiAKICAgICBpZiAoc2Vla2luZykgewogICAgICAgICB3aGlsZSAobVN0YXRlID09IFJFQ09ORklHVVJJTkcpIHsKLSAgICAgICAgICAgIG1CdWZmZXJGaWxsZWQud2FpdChtTG9jayk7CisgICAgICAgICAgICBpZiAoKGVyciA9IHdhaXRGb3JCdWZmZXJGaWxsZWRfbCgpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVN0YXRlICE9IEVYRUNVVElORykgewpAQCAtMzQ4OCwxOSArMzcwNiwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXJGaWxsZWQud2FpdChtTG9jayk7CisgICAgICAgICAgICBpZiAoKGVyciA9IHdhaXRGb3JCdWZmZXJGaWxsZWRfbCgpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAobVN0YXRlICE9IEVSUk9SICYmICFtTm9Nb3JlT3V0cHV0RGF0YSAmJiBtRmlsbGVkQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChtSXNFbmNvZGVyKSB7Ci0gICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gbUJ1ZmZlckZpbGxlZC53YWl0UmVsYXRpdmUobUxvY2ssIDMwMDAwMDAwMDBMTCkpIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgYnVmZmVycyBmcm9tIHZpZGVvIGVuY29kZXI6ICVkLyVkIiwKLSAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJzV2VPd24obVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0pLAotICAgICAgICAgICAgICAgICAgICBjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJGaWxsZWQud2FpdChtTG9jayk7CisgICAgICAgIGlmICgoZXJyID0gd2FpdEZvckJ1ZmZlckZpbGxlZF9sKCkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNjUwLDcgKzM4NjQsOSBAQAogCiAgICAgc2l6ZV90IG51bU5hbWVzID0gc2l6ZW9mKGtOYW1lcykgLyBzaXplb2Yoa05hbWVzWzBdKTsKIAotICAgIGlmICh0eXBlID09IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAodHlwZSA9PSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcikgeworICAgICAgICByZXR1cm4gIk9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcikgewogICAgICAgICByZXR1cm4gIk9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIiOwogICAgIH0gZWxzZSBpZiAodHlwZSA8IDAgfHwgKHNpemVfdCl0eXBlID49IG51bU5hbWVzKSB7CiAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CkBAIC0zOTc0LDYgKzQxOTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gKGludDMyX3QpcGFyYW1zLm5TYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiQ29kZWMgb3V0cHV0cyBhdCBkaWZmZXJlbnQgc2FtcGxpbmcgcmF0ZSB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdCB0aGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5zIChjb250YWlucyBkYXRhIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgSHosIGNvZGVjIG91dHB1dHMgJWx1IEh6KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldENTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAKQEAgLTM5ODYsOCArNDIwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAobVF1aXJrcyAmIGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVscykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bUNoYW5uZWxzIDogcGFyYW1zLm5DaGFubmVscyk7CiAKLSAgICAgICAgICAgICAgICAvLyBUaGUgY29kZWMtcmVwb3J0ZWQgc2FtcGxlUmF0ZSBpcyBub3QgcmVsaWFibGUuLi4KLSAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXVkaW9fZGVmLT5lRW5jb2RpbmcgPT0gT01YX0FVRElPX0NvZGluZ0FNUikgewogICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIGFtcjsKICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZhbXIpOwpAQCAtNDA2Miw2ICs0Mjg0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSk7CiAKKyAgICAgICAgICAgICAgICBDT0RFQ19MT0dJKAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvIGRpbWVuc2lvbnMgYXJlICVsZCB4ICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19kZWYtPm5GcmFtZVdpZHRoLCB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCk7CisKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOwogICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOwpAQCAtNDA3Niw2ICs0MzAyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvcCByZWN0IGlzICVsZCB4ICVsZCBAICglbGQsICVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoLCByZWN0Lm5IZWlnaHQsIHJlY3QubkxlZnQsIHJlY3QublRvcCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0UmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsCkBAIC00MDg0LDcgKzQzMTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0IC0gMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00MDk0LDYgKzQzMjMsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gSWYgdGhlIGlucHV0IGZvcm1hdCBjb250YWlucyByb3RhdGlvbiBpbmZvcm1hdGlvbiwgZmxhZyB0aGUgb3V0cHV0CisgICAgLy8gZm9ybWF0IGFjY29yZGluZ2x5LgorCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQogfQogCiBzdGF0dXNfdCBPTVhDb2RlYzo6cGF1c2UoKSB7CkBAIC00MTA4LDI2ICs0MzQ1LDE5IEBACiAKIHN0YXR1c190IFF1ZXJ5Q29kZWNzKAogICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIHF1ZXJ5RGVjb2RlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgcXVlcnlEZWNvZGVycywgYm9vbCBod0NvZGVjT25seSwKICAgICAgICAgVmVjdG9yPENvZGVjQ2FwYWJpbGl0aWVzPiAqcmVzdWx0cykgeworICAgIFZlY3RvcjxTdHJpbmc4PiBtYXRjaGluZ0NvZGVjczsKICAgICByZXN1bHRzLT5jbGVhcigpOwogCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOzsgKytpbmRleCkgewotICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lOworICAgIE9NWENvZGVjOjpmaW5kTWF0Y2hpbmdDb2RlY3MobWltZSwKKyAgICAgICAgICAgICFxdWVyeURlY29kZXJzIC8qY3JlYXRlRW5jb2RlciovLAorICAgICAgICAgICAgTlVMTCAvKm1hdGNoQ29tcG9uZW50TmFtZSovLAorICAgICAgICAgICAgaHdDb2RlY09ubHkgPyBPTVhDb2RlYzo6a0hhcmR3YXJlQ29kZWNzT25seSA6IDAgLypmbGFncyovLAorICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAotICAgICAgICBpZiAoIXF1ZXJ5RGVjb2RlcnMpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBHZXRDb2RlYygKLSAgICAgICAgICAgICAgICAgICAga0VuY29kZXJJbmZvLCBzaXplb2Yoa0VuY29kZXJJbmZvKSAvIHNpemVvZihrRW5jb2RlckluZm9bMF0pLAotICAgICAgICAgICAgICAgICAgICBtaW1lLCBpbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb25lbnROYW1lID0gR2V0Q29kZWMoCi0gICAgICAgICAgICAgICAgICAgIGtEZWNvZGVySW5mbywgc2l6ZW9mKGtEZWNvZGVySW5mbykgLyBzaXplb2Yoa0RlY29kZXJJbmZvWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgbWltZSwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb21wb25lbnROYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgYysrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjcy5pdGVtQXQoYykuc3RyaW5nKCk7CiAKICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewogICAgICAgICAgICAgLy8gTm90IGFuIE9wZW5NYXggY29tcG9uZW50IGJ1dCBhIHNvZnR3YXJlIGNvZGVjLgpAQCAtNDEzNSw3ICs0MzY1LDYgQEAKICAgICAgICAgICAgIHJlc3VsdHMtPnB1c2goKTsKICAgICAgICAgICAgIENvZGVjQ2FwYWJpbGl0aWVzICpjYXBzID0gJnJlc3VsdHMtPmVkaXRJdGVtQXQocmVzdWx0cy0+c2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICBjYXBzLT5tQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTQxOTAsNiArNDQxOSwxNSBAQAogCiAgICAgICAgIENIRUNLX0VRKG9teC0+ZnJlZU5vZGUobm9kZSksIChzdGF0dXNfdClPSyk7CiAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBRdWVyeUNvZGVjcygKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsIGJvb2wgcXVlcnlEZWNvZGVycywKKyAgICAgICAgVmVjdG9yPENvZGVjQ2FwYWJpbGl0aWVzPiAqcmVzdWx0cykgeworICAgIHJldHVybiBRdWVyeUNvZGVjcyhvbXgsIG1pbWVUeXBlLCBxdWVyeURlY29kZXJzLCBmYWxzZSAvKmh3Q29kZWNPbmx5Ki8sIHJlc3VsdHMpOwogfQogCiB2b2lkIE9NWENvZGVjOjpyZXN0b3JlUGF0Y2hlZERhdGFQb2ludGVyKEJ1ZmZlckluZm8gKmluZm8pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IDY1MzhhMDUuLjI5ZTY5MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcApAQCAtMzc4LDEyICszNzgsMTkgQEAKIAogc3NpemVfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6cmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpIHsKICAgICB1aW50OF90IGhlYWRlclsyN107Ci0gICAgaWYgKG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCisgICAgc3NpemVfdCBuOworICAgIGlmICgobiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4IiwKLSAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgb2Zmc2V0KTsKKyAgICAgICAgTE9HVigiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgb2Zmc2V0IDB4JTAxNmxseCwgZ290ICVsZCBieXRlcyIsCisgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIG9mZnNldCwgbik7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewpAQCAtNDk4LDggKzUwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUpOwogCiAgICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KXBhY2tldFNpemUpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCAweCUwMTZsbHgiLAotICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgZGF0YU9mZnNldCk7CisgICAgICAgICAgICAgICAgTE9HVigiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgMHglMDE2bGx4LCBnb3QgJWxkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIGRhdGFPZmZzZXQsIG4pOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtNzIzLDggKzczMCw5IEBACiAgICAgICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgICAgICB1aW50NjRfdCBicHMgPSBhcHByb3hCaXRyYXRlKCk7Ci0KLSAgICAgICAgICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKKyAgICAgICAgICAgICAgICBpZiAoYnBzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAppbmRleCA0MjNkZjcwLi5hOGEwOTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCkBAIC01Myw2ICs1Myw3IEBACiAgICAgICBtTnVtU2FtcGxlU2l6ZXMoMCksCiAgICAgICBtVGltZVRvU2FtcGxlQ291bnQoMCksCiAgICAgICBtVGltZVRvU2FtcGxlKE5VTEwpLAorICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzKE5VTEwpLAogICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyhOVUxMKSwKICAgICAgIG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMoMCksCiAgICAgICBtU3luY1NhbXBsZU9mZnNldCgtMSksCkBAIC03Myw2ICs3NCw5IEBACiAgICAgZGVsZXRlW10gbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllczsKICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gTlVMTDsKIAorICAgIGRlbGV0ZVtdIG1TYW1wbGVUaW1lRW50cmllczsKKyAgICBtU2FtcGxlVGltZUVudHJpZXMgPSBOVUxMOworCiAgICAgZGVsZXRlW10gbVRpbWVUb1NhbXBsZTsKICAgICBtVGltZVRvU2FtcGxlID0gTlVMTDsKIApAQCAtMjE2LDcgKzIyMCw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKLSAgICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUgPSBtRGVmYXVsdFNhbXBsZVNpemUgJiAweGY7CisgICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gbURlZmF1bHRTYW1wbGVTaXplICYgMHhmZjsKICAgICAgICAgbURlZmF1bHRTYW1wbGVTaXplID0gMDsKIAogICAgICAgICBpZiAobVNhbXBsZVNpemVGaWVsZFNpemUgIT0gNCAmJiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSA4CkBAIC0zODEsNjcgKzM4NSwxMzYgQEAKICAgICByZXR1cm4gdGltZTEgPiB0aW1lMiA/IHRpbWUxIC0gdGltZTIgOiB0aW1lMiAtIHRpbWUxOwogfQogCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgLy8gWFhYIHRoaXMgY3VycmVudGx5IHVzZXMgZGVjb2RpbmcgdGltZSwgaW5zdGVhZCBvZiBjb21wb3NpdGlvbiB0aW1lLgorLy8gc3RhdGljCitpbnQgU2FtcGxlVGFibGU6OkNvbXBhcmVJbmNyZWFzaW5nVGltZShjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpIHsKKyAgICBjb25zdCBTYW1wbGVUaW1lRW50cnkgKmEgPSAoY29uc3QgU2FtcGxlVGltZUVudHJ5ICopX2E7CisgICAgY29uc3QgU2FtcGxlVGltZUVudHJ5ICpiID0gKGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqKV9iOwogCi0gICAgKnNhbXBsZV9pbmRleCA9IDA7CisgICAgaWYgKGEtPm1Db21wb3NpdGlvblRpbWUgPCBiLT5tQ29tcG9zaXRpb25UaW1lKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGEtPm1Db21wb3NpdGlvblRpbWUgPiBiLT5tQ29tcG9zaXRpb25UaW1lKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAorICAgIHJldHVybiAwOworfQorCit2b2lkIFNhbXBsZVRhYmxlOjpidWlsZFNhbXBsZUVudHJpZXNUYWJsZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgdWludDMyX3QgY3VyX3NhbXBsZSA9IDA7Ci0gICAgdWludDMyX3QgdGltZSA9IDA7CisgICAgaWYgKG1TYW1wbGVUaW1lRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2FtcGxlVGltZUVudHJpZXMgPSBuZXcgU2FtcGxlVGltZUVudHJ5W21OdW1TYW1wbGVTaXplc107CisKKyAgICB1aW50MzJfdCBzYW1wbGVJbmRleCA9IDA7CisgICAgdWludDMyX3Qgc2FtcGxlVGltZSA9IDA7CisKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50OyArK2kpIHsKICAgICAgICAgdWludDMyX3QgbiA9IG1UaW1lVG9TYW1wbGVbMiAqIGldOwogICAgICAgICB1aW50MzJfdCBkZWx0YSA9IG1UaW1lVG9TYW1wbGVbMiAqIGkgKyAxXTsKIAotICAgICAgICBpZiAocmVxX3RpbWUgPCB0aW1lICsgbiAqIGRlbHRhKSB7Ci0gICAgICAgICAgICBpbnQgaiA9IChyZXFfdGltZSAtIHRpbWUpIC8gZGVsdGE7CisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVJbmRleCA8IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBpZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgIC8vIGlzIHdlbGwtZm9ybWVkLCBidXQgeW91IGtub3cuLi4gdGhlcmUncyAoZ2FzcCkgbWFsZm9ybWVkCisgICAgICAgICAgICAgICAgLy8gY29udGVudCBvdXQgdGhlcmUuCiAKLSAgICAgICAgICAgIHVpbnQzMl90IHRpbWUxID0gdGltZSArIGogKiBkZWx0YTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRpbWUyID0gdGltZTEgKyBkZWx0YTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1TYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OwogCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOwotICAgICAgICAgICAgaWYgKGkrMSA9PSBtVGltZVRvU2FtcGxlQ291bnQKLSAgICAgICAgICAgICAgICAgICAgfHwgKGFic19kaWZmZXJlbmNlKHJlcV90aW1lLCB0aW1lMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDwgYWJzX2RpZmZlcmVuY2UocmVxX3RpbWUsIHRpbWUyKSkpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0gY3VyX3NhbXBsZSArIGo7Ci0gICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IHRpbWUxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0gY3VyX3NhbXBsZSArIGogKyAxOwotICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSB0aW1lMjsKKyAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1Db21wb3NpdGlvblRpbWUgPQorICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICsgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChmbGFncykgewotICAgICAgICAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IHJlcV90aW1lICYmICpzYW1wbGVfaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLSpzYW1wbGVfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPCByZXFfdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICpzYW1wbGVfaW5kZXggKyAxIDwgbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKypzYW1wbGVfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7CisgICAgICAgICAgICBzYW1wbGVUaW1lICs9IGRlbHRhOwogICAgICAgICB9Ci0KLSAgICAgICAgdGltZSArPSBkZWx0YSAqIG47Ci0gICAgICAgIGN1cl9zYW1wbGUgKz0gbjsKICAgICB9CiAKLSAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIHFzb3J0KG1TYW1wbGVUaW1lRW50cmllcywgbU51bVNhbXBsZVNpemVzLCBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKKyAgICAgICAgICBDb21wYXJlSW5jcmVhc2luZ1RpbWUpOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKKyAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKKworICAgIHVpbnQzMl90IGxlZnQgPSAwOworICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVNhbXBsZVNpemVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgICB1aW50MzJfdCBjZW50ZXJUaW1lID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubUNvbXBvc2l0aW9uVGltZTsKKworICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7CisgICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlZnQgPT0gbU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgLS1sZWZ0OworICAgIH0KKworICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7CisKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggPiAwCisgICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHJlcV90aW1lKSB7CisgICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGNsb3Nlc3RJbmRleCArIDEgPCBtTnVtU2FtcGxlU2l6ZXMKKyAgICAgICAgICAgICAgICAgICAgJiYgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcmVxX3RpbWUpIHsKKyAgICAgICAgICAgICAgICArK2Nsb3Nlc3RJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKworICAgICAgICAgICAgaWYgKGNsb3Nlc3RJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBsZWZ0IG5laWdoYm91ciBhbmQgcGljayBjbG9zZXN0LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGFic2RpZmYxID0KKyAgICAgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdGltZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNkaWZmMiA9CisgICAgICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXggLSAxXS5tQ29tcG9zaXRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChhYnNkaWZmMSA+IGFic2RpZmYyKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RJbmRleCA9IGNsb3Nlc3RJbmRleCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tU2FtcGxlSW5kZXg7CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU3luY1NhbXBsZU5lYXIoCkBAIC02MTMsNyArNjg2LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICB1aW50MzJfdCAqZGVjb2RpbmdUaW1lLAorICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAogICAgICAgICBib29sICppc1N5bmNTYW1wbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC02MzAsOCArNzAzLDggQEAKICAgICAgICAgKnNpemUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVNpemUoKTsKICAgICB9CiAKLSAgICBpZiAoZGVjb2RpbmdUaW1lKSB7Ci0gICAgICAgICpkZWNvZGluZ1RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKyAgICBpZiAoY29tcG9zaXRpb25UaW1lKSB7CisgICAgICAgICpjb21wb3NpdGlvblRpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKICAgICB9CiAKICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaG91dGNhc3RTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzZjJkMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaG91dGNhc3RTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQU3RyZWFtLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Nob3V0Y2FzdFNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVNob3V0Y2FzdFNvdXJjZTo6U2hvdXRjYXN0U291cmNlKEhUVFBTdHJlYW0gKmh0dHApCi0gICAgOiBtSHR0cChodHRwKSwKLSAgICAgIG1NZXRhRGF0YU9mZnNldCgwKSwKLSAgICAgIG1CeXRlc1VudGlsTWV0YURhdGEoMCksCi0gICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgewotICAgIEFTdHJpbmcgbWV0YWludDsKLSAgICBpZiAobUh0dHAtPmZpbmRfaGVhZGVyX3ZhbHVlKCJpY3ktbWV0YWludCIsICZtZXRhaW50KSkgewotICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gbWV0YWludC5jX3N0cigpOwotICAgICAgICBtTWV0YURhdGFPZmZzZXQgPSBzdHJ0b2woc3RhcnQsICZlbmQsIDEwKTsKLSAgICAgICAgQ0hFQ0soZW5kID4gc3RhcnQgJiYgKmVuZCA9PSAnXDAnKTsKLSAgICAgICAgQ0hFQ0sobU1ldGFEYXRhT2Zmc2V0ID4gMCk7Ci0KLSAgICAgICAgbUJ5dGVzVW50aWxNZXRhRGF0YSA9IG1NZXRhRGF0YU9mZnNldDsKLSAgICB9Ci19Ci0KLVNob3V0Y2FzdFNvdXJjZTo6flNob3V0Y2FzdFNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLQotICAgIGRlbGV0ZSBtSHR0cDsKLSAgICBtSHR0cCA9IE5VTEw7Ci19Ci0KLXN0YXR1c190IFNob3V0Y2FzdFNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKikgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDQwOTYpKTsgIC8vIFhYWAotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTaG91dGNhc3RTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFNob3V0Y2FzdFNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgNDQxMDApOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOyAgLy8gWFhYCi0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotc3RhdHVzX3QgU2hvdXRjYXN0U291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgc2l6ZV90IG51bV9ieXRlcyA9IGJ1ZmZlci0+c2l6ZSgpOwotICAgIGlmIChtTWV0YURhdGFPZmZzZXQgPiAwICYmIG51bV9ieXRlcyA+IG1CeXRlc1VudGlsTWV0YURhdGEpIHsKLSAgICAgICAgbnVtX2J5dGVzID0gbUJ5dGVzVW50aWxNZXRhRGF0YTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IG4gPSBtSHR0cC0+cmVjZWl2ZShidWZmZXItPmRhdGEoKSwgbnVtX2J5dGVzKTsKLQotICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIChzdGF0dXNfdCluOwotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwotCi0gICAgbUJ5dGVzVW50aWxNZXRhRGF0YSAtPSAoc2l6ZV90KW47Ci0KLSAgICBpZiAobUJ5dGVzVW50aWxNZXRhRGF0YSA9PSAwKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbnVtXzE2X2J5dGVfYmxvY2tzID0gMDsKLSAgICAgICAgbiA9IG1IdHRwLT5yZWNlaXZlKChjaGFyICopJm51bV8xNl9ieXRlX2Jsb2NrcywgMSk7Ci0gICAgICAgIENIRUNLX0VRKG4sIDEpOwotCi0gICAgICAgIGNoYXIgbWV0YVsyNTUgKiAxNl07Ci0gICAgICAgIHNpemVfdCBtZXRhX3NpemUgPSBudW1fMTZfYnl0ZV9ibG9ja3MgKiAxNjsKLSAgICAgICAgc2l6ZV90IG1ldGFfbGVuZ3RoID0gMDsKLSAgICAgICAgd2hpbGUgKG1ldGFfbGVuZ3RoIDwgbWV0YV9zaXplKSB7Ci0gICAgICAgICAgICBuID0gbUh0dHAtPnJlY2VpdmUoJm1ldGFbbWV0YV9sZW5ndGhdLCBtZXRhX3NpemUgLSBtZXRhX2xlbmd0aCk7Ci0gICAgICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0dXNfdCluOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXRhX2xlbmd0aCArPSAoc2l6ZV90KSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG1ldGFfbGVuZ3RoID4gMCAmJiBtZXRhW21ldGFfbGVuZ3RoIC0gMV0gPT0gJ1wwJykgewotICAgICAgICAgICAgLS1tZXRhX2xlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhX2xlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBwcm9iYWJseSBhdHRhY2ggdGhpcyBtZXRhIGRhdGEgdG8gdGhlCi0gICAgICAgICAgICAvLyBuZXh0IGJ1ZmZlci4gWFhYCi0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXREYXRhKCdzaG91JywgJ3Nob3UnLCBtZXRhLCBtZXRhX2xlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnl0ZXNVbnRpbE1ldGFEYXRhID0gbU1ldGFEYXRhT2Zmc2V0OwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IDg0ZjY1ZmYuLjU3MWU4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTM3LDcgKzM3LDggQEAKICAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAogICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAogICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIsCi0gICAgICAgICIubWt2IiwgIi5ta2EiLCAiLndlYm0iLCAiLnRzIiwgIi5mbCIsICIuZmxhYyIKKyAgICAgICAgIi5ta3YiLCAiLm1rYSIsICIud2VibSIsICIudHMiLCAiLmZsIiwgIi5mbGFjIiwgIi5teG1mIiwKKyAgICAgICAgIi5hdmkiLAogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KICAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOwpAQCAtNTEsMTMgKzUyLDEzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgSGFuZGxlTUlESSgKK3N0YXRpYyBNZWRpYVNjYW5SZXN1bHQgSGFuZGxlTUlESSgKICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIE1lZGlhU2Nhbm5lckNsaWVudCAqY2xpZW50KSB7CiAgICAgLy8gZ2V0IHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gYW5kIGRvIHNhbml0eSBjaGVjawogICAgIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIHBMaWJDb25maWcgPSBFQVNfQ29uZmlnKCk7CiAgICAgaWYgKChwTGliQ29uZmlnID09IE5VTEwpIHx8IChMSUJfVkVSU0lPTiAhPSBwTGliQ29uZmlnLT5saWJWZXJzaW9uKSkgewogICAgICAgICBMT0dFKCJFQVMgbGlicmFyeS9oZWFkZXIgbWlzbWF0Y2hcbiIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SOwogICAgIH0KICAgICBFQVNfSTMyIHRlbXA7CiAKQEAgLTg3LDM0ICs4OCw0MSBAQAogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9TS0lQUEVEOwogICAgIH0KIAogICAgIGNoYXIgYnVmZmVyWzIwXTsKICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVsZCIsIHRlbXApOwotICAgIGlmICghY2xpZW50LT5hZGRTdHJpbmdUYWcoImR1cmF0aW9uIiwgYnVmZmVyKSkgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LT5hZGRTdHJpbmdUYWcoImR1cmF0aW9uIiwgYnVmZmVyKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGUoCitNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKICAgICBMT0dWKCJwcm9jZXNzRmlsZSAnJXMnLiIsIHBhdGgpOwogCiAgICAgY2xpZW50LnNldExvY2FsZShsb2NhbGUoKSk7CiAgICAgY2xpZW50LmJlZ2luRmlsZSgpOworICAgIE1lZGlhU2NhblJlc3VsdCByZXN1bHQgPSBwcm9jZXNzRmlsZUludGVybmFsKHBhdGgsIG1pbWVUeXBlLCBjbGllbnQpOworICAgIGNsaWVudC5lbmRGaWxlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAorTWVkaWFTY2FuUmVzdWx0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZUludGVybmFsKAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKICAgICBjb25zdCBjaGFyICpleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7CiAKICAgICBpZiAoIWV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX1NLSVBQRUQ7CiAgICAgfQogCiAgICAgaWYgKCFGaWxlSGFzQWNjZXB0YWJsZUV4dGVuc2lvbihleHRlbnNpb24pKSB7Ci0gICAgICAgIGNsaWVudC5lbmRGaWxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9TS0lQUEVEOwogICAgIH0KIAogICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sICIubWlkIikKQEAgLTEyNCw1MyArMTMyLDU5IEBACiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIueG1mIikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5ydHR0bCIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIucnR4IikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5vdGEiKSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBIYW5kbGVNSURJKHBhdGgsICZjbGllbnQpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoZXh0ZW5zaW9uLCAiLm90YSIpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIubXhtZiIpKSB7CisgICAgICAgIHJldHVybiBIYW5kbGVNSURJKHBhdGgsICZjbGllbnQpOworICAgIH0KKworICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IG1SZXRyaWV2ZXIobmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICBpZiAoKHZhbHVlID0gbVJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUlNRVRZUEUpKSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IGNsaWVudC5zZXRNaW1lVHlwZSh2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IG1SZXRyaWV2ZXIobmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIpOworICAgIH0KIAotICAgICAgICAgaWYgKG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UocGF0aCkgPT0gT0spIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IG1SZXRyaWV2ZXItPmV4dHJhY3RNZXRhZGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUlNRVRZUEUpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50LnNldE1pbWVUeXBlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KKyAgICBzdHJ1Y3QgS2V5TWFwIHsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnOworICAgICAgICBpbnQga2V5OworICAgIH07CisgICAgc3RhdGljIGNvbnN0IEtleU1hcCBrS2V5TWFwW10gPSB7CisgICAgICAgIHsgInRyYWNrbnVtYmVyIiwgTUVUQURBVEFfS0VZX0NEX1RSQUNLX05VTUJFUiB9LAorICAgICAgICB7ICJkaXNjbnVtYmVyIiwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSIH0sCisgICAgICAgIHsgImFsYnVtIiwgTUVUQURBVEFfS0VZX0FMQlVNIH0sCisgICAgICAgIHsgImFydGlzdCIsIE1FVEFEQVRBX0tFWV9BUlRJU1QgfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiY29tcG9zZXIiLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIgfSwKKyAgICAgICAgeyAiZ2VucmUiLCBNRVRBREFUQV9LRVlfR0VOUkUgfSwKKyAgICAgICAgeyAidGl0bGUiLCBNRVRBREFUQV9LRVlfVElUTEUgfSwKKyAgICAgICAgeyAieWVhciIsIE1FVEFEQVRBX0tFWV9ZRUFSIH0sCisgICAgICAgIHsgImR1cmF0aW9uIiwgTUVUQURBVEFfS0VZX0RVUkFUSU9OIH0sCisgICAgICAgIHsgIndyaXRlciIsIE1FVEFEQVRBX0tFWV9XUklURVIgfSwKKyAgICAgICAgeyAiY29tcGlsYXRpb24iLCBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04gfSwKKyAgICAgICAgeyAiaXNkcm0iLCBNRVRBREFUQV9LRVlfSVNfRFJNIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1FbnRyaWVzID0gc2l6ZW9mKGtLZXlNYXApIC8gc2l6ZW9mKGtLZXlNYXBbMF0pOwogCi0gICAgICAgICAgICBzdHJ1Y3QgS2V5TWFwIHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgICAgICAgICAgICAgaW50IGtleTsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgS2V5TWFwIGtLZXlNYXBbXSA9IHsKLSAgICAgICAgICAgICAgICB7ICJ0cmFja251bWJlciIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIgfSwKLSAgICAgICAgICAgICAgICB7ICJkaXNjbnVtYmVyIiwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSIH0sCi0gICAgICAgICAgICAgICAgeyAiYWxidW0iLCBNRVRBREFUQV9LRVlfQUxCVU0gfSwKLSAgICAgICAgICAgICAgICB7ICJhcnRpc3QiLCBNRVRBREFUQV9LRVlfQVJUSVNUIH0sCi0gICAgICAgICAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgfSwKLSAgICAgICAgICAgICAgICB7ICJjb21wb3NlciIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUiB9LAotICAgICAgICAgICAgICAgIHsgImdlbnJlIiwgTUVUQURBVEFfS0VZX0dFTlJFIH0sCi0gICAgICAgICAgICAgICAgeyAidGl0bGUiLCBNRVRBREFUQV9LRVlfVElUTEUgfSwKLSAgICAgICAgICAgICAgICB7ICJ5ZWFyIiwgTUVUQURBVEFfS0VZX1lFQVIgfSwKLSAgICAgICAgICAgICAgICB7ICJkdXJhdGlvbiIsIE1FVEFEQVRBX0tFWV9EVVJBVElPTiB9LAotICAgICAgICAgICAgICAgIHsgIndyaXRlciIsIE1FVEFEQVRBX0tFWV9XUklURVIgfSwKLSAgICAgICAgICAgICAgICB7ICJjb21waWxhdGlvbiIsIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiB9LAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUVudHJpZXMgPSBzaXplb2Yoa0tleU1hcCkgLyBzaXplb2Yoa0tleU1hcFswXSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bUVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPSBtUmV0cmlldmVyLT5leHRyYWN0TWV0YWRhdGEoa0tleU1hcFtpXS5rZXkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5hZGRTdHJpbmdUYWcoa0tleU1hcFtpXS50YWcsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtRW50cmllczsgKytpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICBpZiAoKHZhbHVlID0gbVJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKGtLZXlNYXBbaV0ua2V5KSkgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gY2xpZW50LmFkZFN0cmluZ1RhZyhrS2V5TWFwW2ldLnRhZywgdmFsdWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgICAgIHJldHVybiBNRURJQV9TQ0FOX1JFU1VMVF9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGNsaWVudC5lbmRGaWxlKCk7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogfQogCiBjaGFyICpTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6ZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBlYTNiODAxLi43NzhjMGI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDcgKzQ5LDggQEAKICAgICBtQ2xpZW50LmRpc2Nvbm5lY3QoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CiAKICAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKQEAgLTU2LDcgKzU4LDcgQEAKICAgICBkZWxldGUgbUFsYnVtQXJ0OwogICAgIG1BbGJ1bUFydCA9IE5VTEw7CiAKLSAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSwgaGVhZGVycyk7CiAKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtMTQ1LDcgKzE0Nyw4IEBACiAKICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWU7CiAgICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgewotICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmdGh1bWJOYWlsVGltZSkpIHsKKyAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCisgICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKICAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOwogICAgICAgICB9CiAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRodW1iTmFpbFRpbWUsIG1vZGUpOwpAQCAtMjMxLDYgKzIzNCwxNCBAQAogICAgIGZyYW1lLT5tRGF0YSA9IG5ldyB1aW50OF90W2ZyYW1lLT5tU2l6ZV07CiAgICAgZnJhbWUtPm1Sb3RhdGlvbkFuZ2xlID0gcm90YXRpb25BbmdsZTsKIAorICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpIHsKKyAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7CisgICAgfQorICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgeworICAgICAgICBmcmFtZS0+bURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OworICAgIH0KKwogICAgIGludDMyX3Qgc3JjRm9ybWF0OwogICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZzcmNGb3JtYXQpKTsKIApAQCAtMzA2LDYgKzMxNywxNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgc2l6ZV90IGRhdGFTaXplOworICAgIGlmIChtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQorICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKKyAgICAgICAgbUFsYnVtQXJ0ID0gbmV3IE1lZGlhQWxidW1BcnQ7CisgICAgICAgIG1BbGJ1bUFydC0+bVNpemUgPSBkYXRhU2l6ZTsKKyAgICAgICAgbUFsYnVtQXJ0LT5tRGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKKyAgICAgICAgbWVtY3B5KG1BbGJ1bUFydC0+bURhdGEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICB9CisKICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9CiAgICAgICAgIGV4dHJhY3RWaWRlb0ZyYW1lV2l0aENvZGVjRmxhZ3MoCiAgICAgICAgICAgICAgICAgJm1DbGllbnQsIHRyYWNrTWV0YSwgc291cmNlLCBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzLApAQCAtMzk3LDcgKzQxOSw4IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICB1aW50MzJfdCB0eXBlOwogICAgIHNpemVfdCBkYXRhU2l6ZTsKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZkYXRhU2l6ZSkpIHsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZkYXRhU2l6ZSkKKyAgICAgICAgICAgICYmIG1BbGJ1bUFydCA9PSBOVUxMKSB7CiAgICAgICAgIG1BbGJ1bUFydCA9IG5ldyBNZWRpYUFsYnVtQXJ0OwogICAgICAgICBtQWxidW1BcnQtPm1TaXplID0gZGF0YVNpemU7CiAgICAgICAgIG1BbGJ1bUFydC0+bURhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07CkBAIC00MTEsOCArNDM0LDE1IEBACiAKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLCBTdHJpbmc4KHRtcCkpOwogCisgICAgYm9vbCBoYXNBdWRpbyA9IGZhbHNlOworICAgIGJvb2wgaGFzVmlkZW8gPSBmYWxzZTsKKyAgICBpbnQzMl90IHZpZGVvV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IHZpZGVvSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCBhdWRpb0JpdHJhdGUgPSAtMTsKKwogICAgIC8vIFRoZSBvdmVyYWxsIGR1cmF0aW9uIGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCB0cmFjay4KICAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOworICAgIFN0cmluZzggdGltZWRUZXh0TGFuZzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwogCkBAIC00MjIsMTIgKzQ1Miw2NyBAQAogICAgICAgICAgICAgICAgIG1heER1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgIGlmICghaGFzQXVkaW8gJiYgIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgICAgIGhhc0F1ZGlvID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdWRpb0JpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQml0cmF0ZSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1ZpZGVvICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICBoYXNWaWRlbyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2aWRlb1dpZHRoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZpZGVvSGVpZ2h0KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nOworICAgICAgICAgICAgICAgIHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsICZsYW5nKTsKKyAgICAgICAgICAgICAgICB0aW1lZFRleHRMYW5nLmFwcGVuZChTdHJpbmc4KGxhbmcpKTsKKyAgICAgICAgICAgICAgICB0aW1lZFRleHRMYW5nLmFwcGVuZChTdHJpbmc4KCI6IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVG8gc2F2ZSB0aGUgbGFuZ3VhZ2UgY29kZXMgZm9yIGFsbCB0aW1lZCB0ZXh0IHRyYWNrcworICAgIC8vIElmIG11bHRpcGxlIHRleHQgdHJhY2tzIHByZXNlbnQsIHRoZSBmb3JtYXQgd2lsbCBsb29rCisgICAgLy8gbGlrZSAiZW5nOmNoaSIKKyAgICBpZiAoIXRpbWVkVGV4dExhbmcuaXNFbXB0eSgpKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1RJTUVEX1RFWFRfTEFOR1VBR0VTLCB0aW1lZFRleHRMYW5nKTsKICAgICB9CiAKICAgICAvLyBUaGUgZHVyYXRpb24gdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkdXJhdGlvbiBpbiBtcy4KICAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCAobWF4RHVyYXRpb25VcyArIDUwMCkgLyAxMDAwKTsKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgU3RyaW5nOCh0bXApKTsKIAorICAgIGlmIChoYXNBdWRpbykgeworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9IQVNfQVVESU8sIFN0cmluZzgoInllcyIpKTsKKyAgICB9CisKKyAgICBpZiAoaGFzVmlkZW8pIHsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX1ZJREVPLCBTdHJpbmc4KCJ5ZXMiKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvV2lkdGgpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19XSURUSCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgdmlkZW9IZWlnaHQpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19IRUlHSFQsIFN0cmluZzgodG1wKSk7CisgICAgfQorCisgICAgaWYgKG51bVRyYWNrcyA9PSAxICYmIGhhc0F1ZGlvICYmIGF1ZGlvQml0cmF0ZSA+PSAwKSB7CisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBhdWRpb0JpdHJhdGUpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKKyAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNvdXJjZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICBpbnQ2NF90IGF2Z0JpdFJhdGUgPSAoaW50NjRfdCkoc291cmNlU2l6ZSAqIDhFNiAvIG1heER1cmF0aW9uVXMpOworCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCBhdmdCaXRSYXRlKTsKKyAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0JJVFJBVEUsIFN0cmluZzgodG1wKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobnVtVHJhY2tzID09IDEpIHsKICAgICAgICAgY29uc3QgY2hhciAqZmlsZU1JTUU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJmZpbGVNSU1FKSk7CkBAIC00NDUsNiArNTMwLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyBUbyBjaGVjayB3aGV0aGVyIHRoZSBtZWRpYSBmaWxlIGlzIGRybS1wcm90ZWN0ZWQKKyAgICBpZiAobUV4dHJhY3Rvci0+Z2V0RHJtRmxhZygpKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lTX0RSTSwgU3RyaW5nOCgiMSIpKTsKKyAgICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDhjNTZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcApAQCAtMCwwICsxLDc5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZSIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oPgorCisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2VDb21wb3Nlci5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lHcmFwaGljQnVmZmVyQWxsb2MuaD4KKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU3VyZmFjZU1lZGlhU291cmNlOjpTdXJmYWNlTWVkaWFTb3VyY2UodWludDMyX3QgYnVmVywgdWludDMyX3QgYnVmSCkgOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0V2lkdGgoYnVmVyksCisgICAgICAgICAgICAgICAgbURlZmF1bHRIZWlnaHQoYnVmSCksCisgICAgICAgICAgICAgICAgbVBpeGVsRm9ybWF0KDApLAorICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudChNSU5fQVNZTkNfQlVGRkVSX1NMT1RTKSwKKyAgICAgICAgICAgICAgICBtQ2xpZW50QnVmZmVyQ291bnQoMCksCisgICAgICAgICAgICAgICAgbVNlcnZlckJ1ZmZlckNvdW50KE1JTl9BU1lOQ19CVUZGRVJfU0xPVFMpLAorICAgICAgICAgICAgICAgIG1DdXJyZW50U2xvdChJTlZBTElEX0JVRkZFUl9TTE9UKSwKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICBtU3luY2hyb25vdXNNb2RlKHRydWUpLAorICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcGkoTk9fQ09OTkVDVEVEX0FQSSksCisgICAgICAgICAgICAgICAgbUZyYW1lUmF0ZSgzMCksCisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQoZmFsc2UpICAgeworICAgIExPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6U3VyZmFjZU1lZGlhU291cmNlIik7CisgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7CisgICAgbUdyYXBoaWNCdWZmZXJBbGxvYyA9IGNvbXBvc2VyLT5jcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKTsKK30KKworU3VyZmFjZU1lZGlhU291cmNlOjp+U3VyZmFjZU1lZGlhU291cmNlKCkgeworICAgIExPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6flN1cmZhY2VNZWRpYVNvdXJjZSIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorICAgIGZyZWVBbGxCdWZmZXJzKCk7Cit9CisKK3NpemVfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldFF1ZXVlZENvdW50KCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIG1RdWV1ZS5zaXplKCk7Cit9CisKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0QnVmZmVyQ291bnRTZXJ2ZXJMb2NrZWQoaW50IGJ1ZmZlckNvdW50KSB7CisgICAgaWYgKGJ1ZmZlckNvdW50ID4gTlVNX0JVRkZFUl9TTE9UUykKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIHNwZWNpYWwtY2FzZSwgbm90aGluZyB0byBkbworICAgIGlmIChidWZmZXJDb3VudCA9PSBtQnVmZmVyQ291bnQpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGlmICghbUNsaWVudEJ1ZmZlckNvdW50ICYmCisgICAgICAgIGJ1ZmZlckNvdW50ID49IG1CdWZmZXJDb3VudCkgeworICAgICAgICAvLyBlYXN5LCB3ZSBqdXN0IGhhdmUgbW9yZSBidWZmZXJzCisgICAgICAgIG1CdWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50OworICAgICAgICBtU2VydmVyQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKKyAgICAgICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gd2UncmUgaGVyZSBiZWNhdXNlIHdlJ3JlIGVpdGhlcgorICAgICAgICAvLyAtIHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcnMKKyAgICAgICAgLy8gLSBvciB0aGVyZSBpcyBhIGNsaWVudC1idWZmZXItY291bnQgaW4gZWZmZWN0CisKKyAgICAgICAgLy8gbGVzcyB0aGFuIDIgYnVmZmVycyBpcyBuZXZlciBhbGxvd2VkCisgICAgICAgIGlmIChidWZmZXJDb3VudCA8IDIpCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm9uIGNsaWVudC1idWZmZXItY291bnQgaW4gZWZmZWN0LCB0aGUgY2xpZW50IGlzIG5vdAorICAgICAgICAvLyBhbGxvd2VkIHRvIGRlcXVldWUgbW9yZSB0aGFuIG9uZSBidWZmZXIgYXQgYSB0aW1lLAorICAgICAgICAvLyBzbyB0aGUgbmV4dCB0aW1lIHRoZXkgZGVxdWV1ZSBhIGJ1ZmZlciwgd2Uga25vdyB0aGF0IHRoZXkgZG9uJ3QKKyAgICAgICAgLy8gb3duIG9uZS4gdGhlIGFjdHVhbCByZXNpemluZyB3aWxsIGhhcHBlbiBkdXJpbmcgdGhlIG5leHQKKyAgICAgICAgLy8gZGVxdWV1ZUJ1ZmZlci4KKworICAgICAgICBtU2VydmVyQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBDYWxsZWQgZnJvbSB0aGUgY29uc3VtZXIgc2lkZQorc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRCdWZmZXJDb3VudFNlcnZlcihpbnQgYnVmZmVyQ291bnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIHJldHVybiBzZXRCdWZmZXJDb3VudFNlcnZlckxvY2tlZChidWZmZXJDb3VudCk7Cit9CisKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KSB7CisgICAgTE9HVigiU3VyZmFjZU1lZGlhU291cmNlOjpzZXRCdWZmZXJDb3VudCIpOworICAgIGlmIChidWZmZXJDb3VudCA+IE5VTV9CVUZGRVJfU0xPVFMpIHsKKyAgICAgICAgTE9HRSgic2V0QnVmZmVyQ291bnQ6IGJ1ZmZlckNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnVmZmVyIHNsb3RzIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAvLyBFcnJvciBvdXQgaWYgdGhlIHVzZXIgaGFzIGRlcXVldWVkIGJ1ZmZlcnMKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtQnVmZmVyQ291bnQgOyBpKyspIHsKKyAgICAgICAgaWYgKG1TbG90c1tpXS5tQnVmZmVyU3RhdGUgPT0gQnVmZmVyU2xvdDo6REVRVUVVRUQpIHsKKyAgICAgICAgICAgIExPR0UoInNldEJ1ZmZlckNvdW50OiBjbGllbnQgb3ducyBzb21lIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBtaW5CdWZmZXJTbG90cyA9IG1TeW5jaHJvbm91c01vZGUgPworICAgICAgICAgICAgICAgIE1JTl9TWU5DX0JVRkZFUl9TTE9UUyA6IE1JTl9BU1lOQ19CVUZGRVJfU0xPVFM7CisgICAgICAgIG1DbGllbnRCdWZmZXJDb3VudCA9IDA7CisgICAgICAgIGJ1ZmZlckNvdW50ID0gKG1TZXJ2ZXJCdWZmZXJDb3VudCA+PSBtaW5CdWZmZXJTbG90cykgPworICAgICAgICAgICAgICAgIG1TZXJ2ZXJCdWZmZXJDb3VudCA6IG1pbkJ1ZmZlclNsb3RzOworICAgICAgICByZXR1cm4gc2V0QnVmZmVyQ291bnRTZXJ2ZXJMb2NrZWQoYnVmZmVyQ291bnQpOworICAgIH0KKworICAgIC8vIFdlIGRvbid0IGFsbG93IHRoZSBjbGllbnQgdG8gc2V0IGEgYnVmZmVyLWNvdW50IGxlc3MgdGhhbgorICAgIC8vIE1JTl9BU1lOQ19CVUZGRVJfU0xPVFMgKDMpLCB0aGVyZSBpcyBubyByZWFzb24gZm9yIGl0LgorICAgIGlmIChidWZmZXJDb3VudCA8IE1JTl9BU1lOQ19CVUZGRVJfU0xPVFMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBoZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGRvZXNuJ3QgaGF2ZSBkZXF1ZXVlZCBidWZmZXJzCisgICAgLy8gYW5kIHdpbGwgcmVsZWFzZSBhbGwgb2YgaXRzIGJ1ZmZlciByZWZlcmVuY2VzLgorICAgIGZyZWVBbGxCdWZmZXJzKCk7CisgICAgbUJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7CisgICAgbUNsaWVudEJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7CisgICAgbUN1cnJlbnRTbG90ID0gSU5WQUxJRF9CVUZGRVJfU0xPVDsKKyAgICBtUXVldWUuY2xlYXIoKTsKKyAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVxdWVzdEJ1ZmZlcihpbnQgc2xvdCwgc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZikgeworICAgIExPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6cmVxdWVzdEJ1ZmZlciIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgaWYgKHNsb3QgPCAwIHx8IG1CdWZmZXJDb3VudCA8PSBzbG90KSB7CisgICAgICAgIExPR0UoInJlcXVlc3RCdWZmZXI6IHNsb3QgaW5kZXggb3V0IG9mIHJhbmdlIFswLCAlZF06ICVkIiwKKyAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQsIHNsb3QpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtU2xvdHNbc2xvdF0ubVJlcXVlc3RCdWZmZXJDYWxsZWQgPSB0cnVlOworICAgICpidWYgPSBtU2xvdHNbc2xvdF0ubUdyYXBoaWNCdWZmZXI7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OmRlcXVldWVCdWZmZXIoaW50ICpvdXRCdWYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKKyAgICBMT0dWKCJkZXF1ZXVlQnVmZmVyIik7CisKKworICAgIC8vIENoZWNrIGZvciB0aGUgYnVmZmVyIHNpemUtIHRoZSBjbGllbnQgc2hvdWxkIGp1c3QgdXNlIHRoZQorICAgIC8vIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCwgYW5kIG5vdCB0cnkgdG8gc2V0IHRob3NlLgorICAgIC8vIFRoaXMgaXMgbmVlZGVkIHNpbmNlCisgICAgLy8gdGhlIGdldEZvcm1hdCgpIHJldHVybnMgbURlZmF1bHRXaWR0aC8gSGVpZ2h0IGZvciB0aGUgT01YLiBJdCBpcworICAgIC8vIHF1ZXJpZWQgYnkgT01YIGluIHRoZSBiZWdpbm5pbmcgYW5kIG5vdCBldmVyeSB0aW1lIGEgZnJhbWUgY29tZXMuCisgICAgLy8gTm90IHN1cmUgaWYgdGhlcmUgaXMgIGEgd2F5IHRvIHVwZGF0ZSB0aGUKKyAgICAvLyBmcmFtZSBzaXplIHdoaWxlIHJlY29yZGluZy4gU28gYXMgb2Ygbm93LCB0aGUgY2xpZW50IHNpZGUKKyAgICAvLyBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyB2aWEgdGhlIGNvbnN0cnVjdG9yLCBhbmQgdGhlIGVuY29kZXIgaXMKKyAgICAvLyBzZXR1cCB0byBlbmNvZGUgZnJhbWVzIG9mIHRoYXQgc2l6ZQorICAgIC8vIFRoZSBkZXNpZ24gbWlnaHQgbmVlZCB0byBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKyAgICAvLyBUT0RPOiBDdXJyZW50bHkganVzdCB1c2VzIG1EZWZhdWx0V2lkdGgvSGVpZ2h0LiBJbiB0aGUgZnV0dXJlCisgICAgLy8gd2UgbWlnaHQgZGVjbGFyZSBtSGVpZ2h0IGFuZCBtV2lkdGggYW5kIGNoZWNrIGFnYWluc3QgdGhvc2UgaGVyZS4KKyAgICBpZiAoKHcgIT0gMCkgfHwgKGggIT0gMCkpIHsKKyAgICAgICAgTE9HRSgiZGVxdWV1ZWJ1ZmZlcjogaW52YWxpZCBidWZmZXIgc2l6ZSEgUmVxOiAlZHglZCwgRm91bmQ6ICVkeCVkIiwKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFdpZHRoLCBtRGVmYXVsdEhlaWdodCwgdywgaCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIHN0YXR1c190IHJldHVybkZsYWdzKE9LKTsKKworICAgIGludCBmb3VuZCwgZm91bmRTeW5jOworICAgIGludCBkZXF1ZXVlZENvdW50ID0gMDsKKyAgICBib29sIHRyeUFnYWluID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ5QWdhaW4pIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgRklGTyB0byBkcmFpbiBpZiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcgorICAgICAgICAvLyBuZWVkcyB0byBjaGFuZ2UuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBjb25kaXRpb24gIm51bWJlciBvZiBidWZmZXIgbmVlZHMgdG8gY2hhbmdlIiBpcyB0cnVlIGlmCisgICAgICAgIC8vIC0gdGhlIGNsaWVudCBkb2Vzbid0IGNhcmUgYWJvdXQgaG93IG1hbnkgYnVmZmVycyB0aGVyZSBhcmUKKyAgICAgICAgLy8gLSBBTkQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVyIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgd2FzCisgICAgICAgIC8vICAgc2V0IGluIHRoZSBsYXN0IHNldEJ1ZmZlckNvdW50U2VydmVyKCkKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLSBPUiAtCisgICAgICAgIC8vICAgc2V0QnVmZmVyQ291bnRTZXJ2ZXIoKSB3YXMgc2V0IHRvIGEgdmFsdWUgaW5jb21wYXRpYmxlIHdpdGgKKyAgICAgICAgLy8gICB0aGUgc3luY2hyb25pemF0aW9uIG1vZGUgKGZvciBpbnN0YW5jZSBiZWNhdXNlIHRoZSBzeW5jIG1vZGUKKyAgICAgICAgLy8gICBjaGFuZ2VkIHNpbmNlKQorICAgICAgICAvLworICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgY29uZGl0aW9uIGlzIHRydWUgQU5EIHRoZSBGSUZPIGlzIG5vdCBlbXB0eSwgd2UKKyAgICAgICAgLy8gd2FpdCBvbiBtRGVxdWV1ZUNvbmRpdGlvbi4KKworICAgICAgICBpbnQgbWluQnVmZmVyQ291bnROZWVkZWQgPSBtU3luY2hyb25vdXNNb2RlID8KKyAgICAgICAgICAgICAgICBNSU5fU1lOQ19CVUZGRVJfU0xPVFMgOiBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTOworCisgICAgICAgIGlmICghbUNsaWVudEJ1ZmZlckNvdW50ICYmCisgICAgICAgICAgICAgICAgKChtU2VydmVyQnVmZmVyQ291bnQgIT0gbUJ1ZmZlckNvdW50KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG1TZXJ2ZXJCdWZmZXJDb3VudCA8IG1pbkJ1ZmZlckNvdW50TmVlZGVkKSkpIHsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBGSUZPIHRvIGRyYWluCisgICAgICAgICAgICB3aGlsZSAoIW1RdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJXYWl0aW5nIGZvciB0aGUgRklGTyB0byBkcmFpbiIpOworICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgYWdhaW4gc2luY2UgdGhlIG1vZGUgY291bGQgaGF2ZSBjaGFuZ2VkCisgICAgICAgICAgICAvLyB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcKKyAgICAgICAgICAgIG1pbkJ1ZmZlckNvdW50TmVlZGVkID0gbVN5bmNocm9ub3VzTW9kZSA/CisgICAgICAgICAgICAgICAgICAgIE1JTl9TWU5DX0JVRkZFUl9TTE9UUyA6IE1JTl9BU1lOQ19CVUZGRVJfU0xPVFM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1DbGllbnRCdWZmZXJDb3VudCAmJgorICAgICAgICAgICAgICAgICgobVNlcnZlckJ1ZmZlckNvdW50ICE9IG1CdWZmZXJDb3VudCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU2VydmVyQnVmZmVyQ291bnQgPCBtaW5CdWZmZXJDb3VudE5lZWRlZCkpKSB7CisgICAgICAgICAgICAvLyBoZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBtUXVldWUgaXMgZW1wdHkKKyAgICAgICAgICAgIGZyZWVBbGxCdWZmZXJzKCk7CisgICAgICAgICAgICBtQnVmZmVyQ291bnQgPSBtU2VydmVyQnVmZmVyQ291bnQ7CisgICAgICAgICAgICBpZiAobUJ1ZmZlckNvdW50IDwgbWluQnVmZmVyQ291bnROZWVkZWQpCisgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50ID0gbWluQnVmZmVyQ291bnROZWVkZWQ7CisgICAgICAgICAgICBtQ3VycmVudFNsb3QgPSBJTlZBTElEX0JVRkZFUl9TTE9UOworICAgICAgICAgICAgcmV0dXJuRmxhZ3MgfD0gSVN1cmZhY2VUZXh0dXJlOjpSRUxFQVNFX0FMTF9CVUZGRVJTOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBmb3IgYSBmcmVlIGJ1ZmZlciB0byBnaXZlIHRvIHRoZSBjbGllbnQKKyAgICAgICAgZm91bmQgPSBJTlZBTElEX0JVRkZFUl9TTE9UOworICAgICAgICBmb3VuZFN5bmMgPSBJTlZBTElEX0JVRkZFUl9TTE9UOworICAgICAgICBkZXF1ZXVlZENvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHN0YXRlID0gbVNsb3RzW2ldLm1CdWZmZXJTdGF0ZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCdWZmZXJTbG90OjpERVFVRVVFRCkgeworICAgICAgICAgICAgICAgIGRlcXVldWVkQ291bnQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gd29uJ3QgYmUgY29udGludWluZyBpZiBjb3VsZAorICAgICAgICAgICAgICAgIC8vIGRlcXVldWUgYSBub24gJ0ZSRUUnIGN1cnJlbnQgc2xvdCBsaWtlCisgICAgICAgICAgICAgICAgLy8gdGhhdCBpbiBTdXJmYWNlVGV4dHVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBFbmNvZGluZywgd2UgZG8gbm90IGRlcXVlIHRoZSBtQ3VycmVudFNsb3QgYnVmZmVyCisgICAgICAgICAgICAvLyAgc2luY2Ugd2UgZm9sbG93IHN5bmNocm9ub3VzIG1vZGUgKHVubGlrZSBwb3NzaWJseSBpbgorICAgICAgICAgICAgLy8gIFN1cmZhY2VUZXh0dXJlIHRoYXQgY291bGQgYmUgdXNpbmcgdGhlIGFzeW5jaCBtb2RlCisgICAgICAgICAgICAvLyAgb3IgaGFzIHNvbWUgbWVjaGFuaXNtIGluIEdMIHRvIGJlIGFibGUgdG8gd2FpdCB0aWxsIHRoZQorICAgICAgICAgICAgLy8gIGN1cnJlbnRzbG90IGlzIGRvbmUgdXNpbmcgdGhlIGRhdGEpCisgICAgICAgICAgICAvLyBIZXJlLCB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBNUEVHNFdyaXRlcihvciBlcXVpdikKKyAgICAgICAgICAgIC8vIHRvIHRlbGwgdXMgd2hlbiBpdCdzIGRvbmUgdXNpbmcgdGhlIGN1cnJlbnQgYnVmZmVyCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQnVmZmVyU2xvdDo6RlJFRSkgeworICAgICAgICAgICAgICAgIGZvdW5kU3luYyA9IGk7CisgICAgICAgICAgICAgICAgLy8gVW5saWtlIHRoYXQgaW4gU3VyZmFjZVRleHR1cmUsCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBpZiBpdCBpcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50c2xvdCBvciBub3QgYXMgaXQgaXMgaW4gc3RhdGUgRlJFRQorICAgICAgICAgICAgICAgIGZvdW5kID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsaWVudHMgYXJlIG5vdCBhbGxvd2VkIHRvIGRlcXVldWUgbW9yZSB0aGFuIG9uZSBidWZmZXIKKyAgICAgICAgLy8gaWYgdGhleSBkaWRuJ3Qgc2V0IGEgYnVmZmVyIGNvdW50LgorICAgICAgICBpZiAoIW1DbGllbnRCdWZmZXJDb3VudCAmJiBkZXF1ZXVlZENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSB3aGV0aGVyIGEgYnVmZmVyIGhhcyBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgbGFzdCBzZXRCdWZmZXJDb3VudCBzbworICAgICAgICAvLyB3ZSBrbm93IHdoZXRoZXIgdG8gcGVyZm9ybSB0aGUgTUlOX1VOREVRVUVVRURfQlVGRkVSUyBjaGVjayBiZWxvdy4KKyAgICAgICAgYm9vbCBidWZmZXJIYXNCZWVuUXVldWVkID0gbUN1cnJlbnRTbG90ICE9IElOVkFMSURfQlVGRkVSX1NMT1Q7CisgICAgICAgIGlmIChidWZmZXJIYXNCZWVuUXVldWVkKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNsaWVudCBpcyBub3QgdHJ5aW5nIHRvIGRlcXVldWUgbW9yZSBidWZmZXJzCisgICAgICAgICAgICAvLyB0aGFuIGFsbG93ZWQuCisgICAgICAgICAgICBjb25zdCBpbnQgYXZhaWwgPSBtQnVmZmVyQ291bnQgLSAoZGVxdWV1ZWRDb3VudCsxKTsKKyAgICAgICAgICAgIGlmIChhdmFpbCA8IChNSU5fVU5ERVFVRVVFRF9CVUZGRVJTLWludChtU3luY2hyb25vdXNNb2RlKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlQnVmZmVyOiBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTPSVkIGV4Y2VlZGVkIChkZXF1ZXVlZD0lZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgTUlOX1VOREVRVUVVRURfQlVGRkVSUy1pbnQobVN5bmNocm9ub3VzTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlZENvdW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSBhbmQgZGlkbid0IGZpbmQgYSBidWZmZXIsIHdlIG5lZWQgdG8gd2FpdAorICAgICAgICAvLyBmb3IgZm9yIHNvbWUgYnVmZmVycyB0byBiZSBjb25zdW1lZAorICAgICAgICB0cnlBZ2FpbiA9IG1TeW5jaHJvbm91c01vZGUgJiYgKGZvdW5kU3luYyA9PSBJTlZBTElEX0JVRkZFUl9TTE9UKTsKKyAgICAgICAgaWYgKHRyeUFnYWluKSB7CisgICAgICAgICAgICBMT0dXKCJXYWl0aW5nLi5JbiBzeW5jaHJvbm91cyBtb2RlIGFuZCBubyBidWZmZXIgdG8gZFEiKTsKKyAgICAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3luY2hyb25vdXNNb2RlICYmIGZvdW5kID09IElOVkFMSURfQlVGRkVSX1NMT1QpIHsKKyAgICAgICAgLy8gZm91bmRTeW5jIGd1YXJhbnRlZWQgdG8gYmUgIT0gSU5WQUxJRF9CVUZGRVJfU0xPVAorICAgICAgICBmb3VuZCA9IGZvdW5kU3luYzsKKyAgICB9CisKKyAgICBpZiAoZm91bmQgPT0gSU5WQUxJRF9CVUZGRVJfU0xPVCkgeworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGNvbnN0IGludCBidWYgPSBmb3VuZDsKKyAgICAqb3V0QnVmID0gZm91bmQ7CisKKyAgICBjb25zdCBib29sIHVzZURlZmF1bHRTaXplID0gIXcgJiYgIWg7CisgICAgaWYgKHVzZURlZmF1bHRTaXplKSB7CisgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBzaXplCisgICAgICAgIHcgPSBtRGVmYXVsdFdpZHRoOworICAgICAgICBoID0gbURlZmF1bHRIZWlnaHQ7CisgICAgfQorCisgICAgY29uc3QgYm9vbCB1cGRhdGVGb3JtYXQgPSAoZm9ybWF0ICE9IDApOworICAgIGlmICghdXBkYXRlRm9ybWF0KSB7CisgICAgICAgIC8vIGtlZXAgdGhlIGN1cnJlbnQgKG9yIGRlZmF1bHQpIGZvcm1hdAorICAgICAgICBmb3JtYXQgPSBtUGl4ZWxGb3JtYXQ7CisgICAgfQorCisgICAgLy8gYnVmZmVyIGlzIG5vdyBpbiBERVFVRVVFRCAoYnV0IGNhbiBhbHNvIGJlIGN1cnJlbnQgYXQgdGhlIHNhbWUgdGltZSwKKyAgICAvLyBpZiB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlKQorICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEOworCisgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcihtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlcik7CisgICAgaWYgKChidWZmZXIgPT0gTlVMTCkgfHwKKyAgICAgICAgKHVpbnQzMl90KGJ1ZmZlci0+d2lkdGgpICAhPSB3KSB8fAorICAgICAgICAodWludDMyX3QoYnVmZmVyLT5oZWlnaHQpICE9IGgpIHx8CisgICAgICAgICh1aW50MzJfdChidWZmZXItPmZvcm1hdCkgIT0gZm9ybWF0KSB8fAorICAgICAgICAoKHVpbnQzMl90KGJ1ZmZlci0+dXNhZ2UpICYgdXNhZ2UpICE9IHVzYWdlKSkgeworICAgICAgICAgICAgdXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yOworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJBbGxvYy0+Y3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIGZvcm1hdCwgdXNhZ2UsICZlcnJvcikpOworICAgICAgICAgICAgaWYgKGdyYXBoaWNCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoImRlcXVldWVCdWZmZXI6IFN1cmZhY2VDb21wb3Nlcjo6Y3JlYXRlR3JhcGhpY0J1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXBkYXRlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgbVBpeGVsRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXIgPSBncmFwaGljQnVmZmVyOworICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubVJlcXVlc3RCdWZmZXJDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybkZsYWdzIHw9IElTdXJmYWNlVGV4dHVyZTo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJldHVybkZsYWdzOworfQorCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldFN5bmNocm9ub3VzTW9kZShib29sIGVuYWJsZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKCFlbmFibGVkKSB7CisgICAgICAgIC8vIGdvaW5nIHRvIGFzeW5jaHJvbm91cyBtb2RlLCBkcmFpbiB0aGUgcXVldWUKKyAgICAgICAgd2hpbGUgKG1TeW5jaHJvbm91c01vZGUgIT0gZW5hYmxlZCAmJiAhbVF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbURlcXVldWVDb25kaXRpb24ud2FpdChtTXV0ZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TeW5jaHJvbm91c01vZGUgIT0gZW5hYmxlZCkgeworICAgICAgICAvLyAtIGlmIHdlJ3JlIGdvaW5nIHRvIGFzeW5jaHJvbm91cyBtb2RlLCB0aGUgcXVldWUgaXMgZ3VhcmFudGVlZCB0byBiZQorICAgICAgICAvLyBlbXB0eSBoZXJlCisgICAgICAgIC8vIC0gaWYgdGhlIGNsaWVudCBzZXQgdGhlIG51bWJlciBvZiBidWZmZXJzLCB3ZSdyZSBndWFyYW50ZWVkIHRoYXQKKyAgICAgICAgLy8gd2UgaGF2ZSBhdCBsZWFzdCAzIChiZWNhdXNlIHdlIGRvbid0IGFsbG93IGxlc3MpCisgICAgICAgIG1TeW5jaHJvbm91c01vZGUgPSBlbmFibGVkOworICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpjb25uZWN0KGludCBhcGkpIHsKKyAgICBMT0dWKCJTdXJmYWNlTWVkaWFTb3VyY2U6OmNvbm5lY3QiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOworICAgIHN3aXRjaCAoYXBpKSB7CisgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfRUdMOgorICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NQVToKKyAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9NRURJQToKKyAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkE6CisgICAgICAgICAgICBpZiAobUNvbm5lY3RlZEFwaSAhPSBOT19DT05ORUNURURfQVBJKSB7CisgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwaSA9IGFwaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OmRpc2Nvbm5lY3QoaW50IGFwaSkgeworICAgIExPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6ZGlzY29ubmVjdCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CisgICAgc3dpdGNoIChhcGkpIHsKKyAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9FR0w6CisgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ1BVOgorICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX01FRElBOgorICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQToKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBpID09IGFwaSkgeworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcGkgPSBOT19DT05ORUNURURfQVBJOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cXVldWVCdWZmZXIoaW50IGJ1ZiwgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgeworICAgIExPR1YoInF1ZXVlQnVmZmVyIik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGlmIChidWYgPCAwIHx8IGJ1ZiA+PSBtQnVmZmVyQ291bnQpIHsKKyAgICAgICAgTE9HRSgicXVldWVCdWZmZXI6IHNsb3QgaW5kZXggb3V0IG9mIHJhbmdlIFswLCAlZF06ICVkIiwKKyAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQsIGJ1Zik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAobVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlICE9IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEKSB7CisgICAgICAgIExPR0UoInF1ZXVlQnVmZmVyOiBzbG90ICVkIGlzIG5vdCBvd25lZCBieSB0aGUgY2xpZW50IChzdGF0ZT0lZCkiLAorICAgICAgICAgICAgICAgIGJ1ZiwgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIGlmICghbVNsb3RzW2J1Zl0ubVJlcXVlc3RCdWZmZXJDYWxsZWQpIHsKKyAgICAgICAgTE9HRSgicXVldWVCdWZmZXI6IHNsb3QgJWQgd2FzIGVucXVldWVkIHdpdGhvdXQgcmVxdWVzdGluZyBhICIKKyAgICAgICAgICAgICAgICAiYnVmZmVyIiwgYnVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1TeW5jaHJvbm91c01vZGUpIHsKKyAgICAgICAgLy8gaW4gc3luY2hyb25vdXMgbW9kZSB3ZSBxdWV1ZSBhbGwgYnVmZmVycyBpbiBhIEZJRk8KKyAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWYpOworICAgICAgICBMT0dWKCJDbGllbnQgcXVldWVkIGJ1ZmZlciBvbiBzbG90OiAlZCwgUSBzaXplID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBtUXVldWUuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpbiBhc3luY2hyb25vdXMgbW9kZSB3ZSBvbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGJ1ZmZlcgorICAgICAgICBpZiAobVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2soYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZpZm86Oml0ZXJhdG9yIGZyb250KG1RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBjdXJyZW50bHkgcXVldWVkIGlzIGZyZWVkCisgICAgICAgICAgICBtU2xvdHNbKmZyb250XS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpGUkVFOworICAgICAgICAgICAgLy8gYW5kIHdlIHJlY29yZCB0aGUgbmV3IGJ1ZmZlciBpbmRleCBpbiB0aGUgcXVldWVkIGxpc3QKKyAgICAgICAgICAgICpmcm9udCA9IGJ1ZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OlFVRVVFRDsKKyAgICBtU2xvdHNbYnVmXS5tVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgIC8vIFRPRE86IChDb25maXJtKSBEb24ndCB3YW50IHRvIHNpZ25hbCBkZXF1ZXVlIGhlcmUuCisgICAgLy8gTWF5IGJlIGp1c3QgaW4gYXN5bmNocm9ub3VzIG1vZGU/CisgICAgLy8gbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7CisKKyAgICAvLyBPbmNlIHRoZSBxdWV1aW5nIGlzIGRvbmUsIHdlIG5lZWQgdG8gbGV0IHRoZSBsaXN0ZW5lcgorICAgIC8vIGFuZCBzaWduYWwgdGhlIGJ1ZmZlciBjb25zdW1lciAoZW5jb2Rlcikga25vdyB0aGF0IGEKKyAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlCisgICAgb25GcmFtZVJlY2VpdmVkTG9ja2VkKCk7CisKKyAgICAqb3V0V2lkdGggPSBtRGVmYXVsdFdpZHRoOworICAgICpvdXRIZWlnaHQgPSBtRGVmYXVsdEhlaWdodDsKKyAgICAqb3V0VHJhbnNmb3JtID0gMDsKKworICAgIHJldHVybiBPSzsKK30KKworCisvLyBvbkZyYW1lUmVjZWl2ZWRMb2NrZWQgaW5mb3JtcyB0aGUgYnVmZmVyIGNvbnN1bWVycyAoU3RhZ2VGcmlnaHRSZWNvcmRlcikKKy8vIG9yIGxpc3RlbmVycyB0aGF0IGEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQKKy8vIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gcXVldWVidWZmZXIuCisvLyBUaGUgYnVmZmVyIGlzIE5PVCBtYWRlIGF2YWlsYWJsZSBmb3IgZGVxdWV1ZWluZyBpbW1lZGlhdGVseS4gV2UgbmVlZCB0bworLy8gd2FpdCB0byBoZWFyIGZyb20gU3RhZ2VGcmlnaHRSZWNvcmRlciB0byBzZXQgdGhlIGJ1ZmZlciBGUkVFCisvLyBNYWtlIHN1cmUgdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbXV0ZXggaXMgbG9ja2VkCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6Om9uRnJhbWVSZWNlaXZlZExvY2tlZCgpIHsKKyAgICBMT0dWKCJPbiBGcmFtZSBSZWNlaXZlZCIpOworICAgIC8vIFNpZ25hbCB0aGUgZW5jb2RlciB0aGF0IGEgbmV3IGZyYW1lIGhhcyBhcnJpdmVkCisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgLy8gY2FsbCBiYWNrIHRoZSBsaXN0ZW5lcgorICAgIC8vIFRPRE86IFRoZSBsaXN0ZW5lciBtYXkgbm90IGJlIG5lZWRlZCBpbiBTdXJmYWNlTWVkaWFTb3VyY2UgYXQgYWxsLgorICAgIC8vIFRoaXMgY2FuIGJlIG1hZGUgYSBTdXJmYWNlVGV4dHVyZSBzcGVjaWZpYyB0aGluZworICAgIHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+IGxpc3RlbmVyOworICAgIGlmIChtU3luY2hyb25vdXNNb2RlIHx8IG1RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIGxpc3RlbmVyID0gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7CisgICAgfQorCisgICAgaWYgKGxpc3RlbmVyICE9IDApIHsKKyAgICAgICAgbGlzdGVuZXItPm9uRnJhbWVBdmFpbGFibGUoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpjYW5jZWxCdWZmZXIoaW50IGJ1ZikgeworICAgIExPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZTo6Y2FuY2VsQnVmZmVyIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAoYnVmIDwgMCB8fCBidWYgPj0gbUJ1ZmZlckNvdW50KSB7CisgICAgICAgIExPR0UoImNhbmNlbEJ1ZmZlcjogc2xvdCBpbmRleCBvdXQgb2YgcmFuZ2UgWzAsICVkXTogJWQiLAorICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudCwgYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlICE9IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEKSB7CisgICAgICAgIExPR0UoImNhbmNlbEJ1ZmZlcjogc2xvdCAlZCBpcyBub3Qgb3duZWQgYnkgdGhlIGNsaWVudCAoc3RhdGU9JWQpIiwKKyAgICAgICAgICAgICAgICBidWYsIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6RlJFRTsKKyAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworbnNlY3NfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldFRpbWVzdGFtcCgpIHsKKyAgICBMT0dWKCJTdXJmYWNlTWVkaWFTb3VyY2U6OmdldFRpbWVzdGFtcCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIG1DdXJyZW50VGltZXN0YW1wOworfQorCisKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKAorICAgICAgICBjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBMT0dWKCJTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIG1GcmFtZUF2YWlsYWJsZUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpmcmVlQWxsQnVmZmVycygpIHsKKyAgICBMT0dWKCJmcmVlQWxsQnVmZmVycyIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7CisgICAgICAgIG1TbG90c1tpXS5tR3JhcGhpY0J1ZmZlciA9IDA7CisgICAgICAgIG1TbG90c1tpXS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpGUkVFOworICAgIH0KK30KKworc3A8R3JhcGhpY0J1ZmZlcj4gU3VyZmFjZU1lZGlhU291cmNlOjpnZXRDdXJyZW50QnVmZmVyKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIG1DdXJyZW50QnVmOworfQorCitpbnQgU3VyZmFjZU1lZGlhU291cmNlOjpxdWVyeShpbnQgd2hhdCwgaW50KiBvdXRWYWx1ZSkKK3sKKyAgICBMT0dWKCJxdWVyeSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgaW50IHZhbHVlOworICAgIHN3aXRjaCAod2hhdCkgeworICAgIGNhc2UgTkFUSVZFX1dJTkRPV19XSURUSDoKKyAgICAgICAgdmFsdWUgPSBtRGVmYXVsdFdpZHRoOworICAgICAgICBpZiAoIW1EZWZhdWx0V2lkdGggJiYgIW1EZWZhdWx0SGVpZ2h0ICYmIG1DdXJyZW50QnVmICE9IDApCisgICAgICAgICAgICB2YWx1ZSA9IG1DdXJyZW50QnVmLT53aWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX0hFSUdIVDoKKyAgICAgICAgdmFsdWUgPSBtRGVmYXVsdEhlaWdodDsKKyAgICAgICAgaWYgKCFtRGVmYXVsdFdpZHRoICYmICFtRGVmYXVsdEhlaWdodCAmJiBtQ3VycmVudEJ1ZiAhPSAwKQorICAgICAgICAgICAgdmFsdWUgPSBtQ3VycmVudEJ1Zi0+aGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfRk9STUFUOgorICAgICAgICB2YWx1ZSA9IG1QaXhlbEZvcm1hdDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlM6CisgICAgICAgIHZhbHVlID0gbVN5bmNocm9ub3VzTW9kZSA/CisgICAgICAgICAgICAgICAgKE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMtMSkgOiBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBvdXRWYWx1ZVswXSA9IHZhbHVlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXAoU3RyaW5nOCYgcmVzdWx0KSBjb25zdAoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGR1bXAocmVzdWx0LCAiIiwgYnVmZmVyLCAxMDI0KTsKK30KKwordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjb25zdCBjaGFyKiBwcmVmaXgsCisgICAgICAgIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgIiVzbUJ1ZmZlckNvdW50PSVkLCBtU3luY2hyb25vdXNNb2RlPSVkLCBkZWZhdWx0LXNpemU9WyVkeCVkXSwgIgorICAgICAgICAgICAgIm1QaXhlbEZvcm1hdD0lZCwgXG4iLAorICAgICAgICAgICAgcHJlZml4LCBtQnVmZmVyQ291bnQsIG1TeW5jaHJvbm91c01vZGUsIG1EZWZhdWx0V2lkdGgsIG1EZWZhdWx0SGVpZ2h0LAorICAgICAgICAgICAgbVBpeGVsRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBTdHJpbmc4IGZpZm87CisgICAgaW50IGZpZm9TaXplID0gMDsKKyAgICBGaWZvOjpjb25zdF9pdGVyYXRvciBpKG1RdWV1ZS5iZWdpbigpKTsKKyAgICB3aGlsZSAoaSAhPSBtUXVldWUuZW5kKCkpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTAyZCAiLCAqaSsrKTsKKyAgICAgICAgZmlmb1NpemUrKzsKKyAgICAgICAgZmlmby5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICogb3BlcmF0b3IoKShpbnQgc3RhdGUpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OkRFUVVFVUVEOiByZXR1cm4gIkRFUVVFVUVEIjsKKyAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OlFVRVVFRDogcmV0dXJuICJRVUVVRUQiOworICAgICAgICAgICAgICAgIGNhc2UgQnVmZmVyU2xvdDo6RlJFRTogcmV0dXJuICJGUkVFIjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVua25vd24iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBzdGF0ZU5hbWU7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlclNsb3QmIHNsb3QobVNsb3RzW2ldKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgICAgICIlcyVzWyUwMmRdIHN0YXRlPSUtOHMsICIKKyAgICAgICAgICAgICAgICAidGltZXN0YW1wPSVsbGRcbiIsCisgICAgICAgICAgICAgICAgcHJlZml4LCAoaT09bUN1cnJlbnRTbG90KT8iPiI6IiAiLCBpLCBzdGF0ZU5hbWUoc2xvdC5tQnVmZmVyU3RhdGUpLAorICAgICAgICAgICAgICAgIHNsb3QubVRpbWVzdGFtcAorICAgICAgICApOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lUmF0ZShpbnQzMl90IGZwcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGNvbnN0IGludCBNQVhfRlJBTUVfUkFURSA9IDYwOworICAgIGlmIChmcHMgPCAwIHx8IGZwcyA+IE1BWF9GUkFNRV9SQVRFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1GcmFtZVJhdGUgPSBmcHM7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFN1cmZhY2VNZWRpYVNvdXJjZTo6aXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCkgY29uc3QgeworICAgIExPR1YoImlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyIpOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0RnJhbWVSYXRlKCApIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIHJldHVybiBtRnJhbWVSYXRlOworfQorCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpCit7CisgICAgTE9HVigic3RhcnQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworCitzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnN0b3AoKQoreworICAgIExPR1YoIlN0b3AiKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgLy8gVE9ETzogQWRkIHdhaXRpbmcgb24gbUZyYW1lQ29tcGxldGVkQ29uZGl0aW9uIGhlcmU/CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpCit7CisgICAgTE9HVigiZ2V0Rm9ybWF0Iik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1EZWZhdWx0V2lkdGgpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1EZWZhdWx0SGVpZ2h0KTsKKyAgICAvLyBUaGUgZW5jb2RlciBmb3JtYXQgaXMgc2V0IGFzIGFuIG9wYXF1ZSBjb2xvcmZvcm1hdAorICAgIC8vIFRoZSBlbmNvZGVyIHdpbGwgbGF0ZXIgZmluZCBvdXQgdGhlIGFjdHVhbCBjb2xvcmZvcm1hdAorICAgIC8vIGZyb20gdGhlIEdMIEZyYW1lcyBpdHNlbGYuCisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgbURlZmF1bHRXaWR0aCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBtRGVmYXVsdEhlaWdodCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7CisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgcmV0dXJuIG1ldGE7Cit9CisKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVhZCggTWVkaWFCdWZmZXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQoreworICAgIExPR1YoIlJlYWQuIFNpemUgb2YgcXVldWVkIGJ1ZmZlcjogJWQiLCBtUXVldWUuc2l6ZSgpKTsKKyAgICAqYnVmZmVyID0gTlVMTDsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpIDsKKyAgICAvLyBJZiB0aGUgcmVjb3JkaW5nIGhhcyBzdGFydGVkIGFuZCB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4ganVzdAorICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQorICAgIHdoaWxlIChtU3RhcnRlZCAmJiBtUXVldWUuZW1wdHkoKSkgeworICAgICAgICBMT0dWKCJOTyBGUkFNRVMhIFJlY29yZGVyIHdhaXRpbmcgZm9yIEZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uIik7CisgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGxvb3Agd2FzIGV4aXRlZCBhcyBhIHJlc3VsdCBvZiBzdG9wcGluZyB0aGUgcmVjb3JkaW5nLAorICAgIC8vIGl0IGlzIE9LCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IGJ1ZmZlciBpbmZvCisgICAgLy8gVE9ETzogbUN1cnJlbnRTbG90IGNhbiBiZSBtYWRlIGEgYnVmZmVyc3RhdGUgc2luY2UgdGhlcmUKKyAgICAvLyBjYW4gYmUgbW9yZSB0aGFuIG9uZSAiY3VycmVudCIgc2xvdHMuCisgICAgRmlmbzo6aXRlcmF0b3IgZnJvbnQobVF1ZXVlLmJlZ2luKCkpOworICAgIG1DdXJyZW50U2xvdCA9ICpmcm9udDsKKyAgICBtQ3VycmVudEJ1ZiA9IG1TbG90c1ttQ3VycmVudFNsb3RdLm1HcmFwaGljQnVmZmVyOworICAgIG1DdXJyZW50VGltZXN0YW1wID0gbVNsb3RzW21DdXJyZW50U2xvdF0ubVRpbWVzdGFtcDsKKworICAgIC8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCisgICAgcGFzc01ldGFkYXRhQnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisKKyAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOworICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVzdGFtcCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCisvLyBUaGUgbWV0YWRhdGEgcGFzc2VkIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKKy8vIDEuIEZpcnN0LCB0aGVyZSBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIEdSQWxsb2MKKy8vIHNvdXJjZSAoa01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpCisvLyAyLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJfaGFuZGxlX3QgdGhhdCBpcyBhIGhhbmRsZSB0byB0aGUKKy8vIEdSYWxsb2MgYnVmZmVyLiBUaGUgZW5jb2RlciBuZWVkcyB0byBpbnRlcnByZXQgdGhpcyBHUmFsbG9jIGhhbmRsZQorLy8gYW5kIGVuY29kZSB0aGUgZnJhbWVzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHwgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlIHwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkgfAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vdGU6IENhbGwgb25seSB3aGVuIHlvdSBoYXZlIHRoZSBsb2NrCit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6cGFzc01ldGFkYXRhQnVmZmVyTG9ja2VkKE1lZGlhQnVmZmVyICoqYnVmZmVyKSB7CisgICAgTE9HVigicGFzc01ldGFkYXRhQnVmZmVyIik7CisgICAgLy8gTWVkaWFCdWZmZXIgYWxsb2NhdGVzIGFuZCBvd25zIHRoaXMgZGF0YQorICAgIE1lZGlhQnVmZmVyICp0ZW1wQnVmZmVyID0KKyAgICAgICAgbmV3IE1lZGlhQnVmZmVyKDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgY2hhciAqZGF0YSA9IChjaGFyICopdGVtcEJ1ZmZlci0+ZGF0YSgpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcGFzc2luZyBidWZmZXIgbWV0YWRhdGEhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKKyAgICBtZW1jcHkoZGF0YSArIDQsICYobUN1cnJlbnRCdWYtPmhhbmRsZSksIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKK30KKworCit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIExPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkIik7CisKKyAgICBib29sIGZvdW5kQnVmZmVyID0gZmFsc2U7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coInNpZ25hbEJ1ZmZlclJldHVybmVkOiBtU3RhcnRlZCA9IGZhbHNlISBOb3RoaW5nIHRvIGRvISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChGaWZvOjppdGVyYXRvciBpdCA9IG1RdWV1ZS5iZWdpbigpOyBpdCAhPSBtUXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQ0hFQ0sobVNsb3RzWyppdF0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmIChjaGVja0J1ZmZlck1hdGNoZXNTbG90KCppdCwgYnVmZmVyKSkgeworICAgICAgICAgICAgbVNsb3RzWyppdF0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6RlJFRTsKKyAgICAgICAgICAgIG1RdWV1ZS5lcmFzZShpdCk7CisgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKDApOworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICAgICAgZm91bmRCdWZmZXIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kQnVmZmVyKSB7CisgICAgICAgIENIRUNLX0VRKDAsICJzaWduYWxCdWZmZXJSZXR1cm5lZDogYm9ndXMgYnVmZmVyIik7CisgICAgfQorfQorCitib29sIFN1cmZhY2VNZWRpYVNvdXJjZTo6Y2hlY2tCdWZmZXJNYXRjaGVzU2xvdChpbnQgc2xvdCwgTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIExPR1YoIkNoZWNrIGlmIEJ1ZmZlciBtYXRjaGVzIHNsb3QiKTsKKyAgICAvLyBuZWVkIHRvIGNvbnZlcnQgdG8gY2hhciogZm9yIHBvaW50ZXIgYXJpdGhtZXRpYyBhbmQgdGhlbgorICAgIC8vIGNvcHkgdGhlIGJ5dGUgc3RyZWFtIGludG8gb3VyIGhhbmRsZQorICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGUgOworICAgIG1lbWNweSggJmJ1ZmZlckhhbmRsZSwgKGNoYXIgKikoYnVmZmVyLT5kYXRhKCkpICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgIHJldHVybiBtU2xvdHNbc2xvdF0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSAgPT0gIGJ1ZmZlckhhbmRsZTsKK30KKworCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyZWFkZWRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyZWFkZWRTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2ZTJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RocmVhZGVkU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJUaHJlYWRlZFNvdXJjZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvVGhyZWFkZWRTb3VyY2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhRdWV1ZVNpemUgPSAyOwotCi1UaHJlYWRlZFNvdXJjZTo6VGhyZWFkZWRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxUaHJlYWRlZFNvdXJjZT4odGhpcykpLAotICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgewotICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKLX0KLQotVGhyZWFkZWRTb3VyY2U6On5UaHJlYWRlZFNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVGhyZWFkZWRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRmluYWxSZXN1bHQgPSBPSzsKLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1EZWNvZGVQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3REZWNvZGVNb3JlX2woKTsKLQotICAgIENIRUNLX0VRKG1Mb29wZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFRocmVhZGVkU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIENIRUNLX0VRKG1Mb29wZXItPnN0b3AoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgY2xlYXJRdWV1ZV9sKCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFRocmVhZGVkU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotfQotCi1zdGF0dXNfdCBUaHJlYWRlZFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKmJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKLSAgICAgICAgaW50MzJfdCBzZWVrQ29tcGxldGUgPSAwOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBtUmVmbGVjdG9yLT5pZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoIm1vZGUiLCBzZWVrTW9kZSk7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcigiY29tcGxldGUiLCAmc2Vla0NvbXBsZXRlKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0KLSAgICAgICAgd2hpbGUgKCFzZWVrQ29tcGxldGUpIHsKLSAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobVF1ZXVlLmVtcHR5KCkgJiYgbUZpbmFsUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgaWYgKCFtUXVldWUuZW1wdHkoKSkgewotICAgICAgICAqYnVmZmVyID0gKm1RdWV1ZS5iZWdpbigpOwotICAgICAgICBtUXVldWUuZXJhc2UobVF1ZXVlLmJlZ2luKCkpOwotCi0gICAgICAgIGlmIChtRmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgICAgIHBvc3REZWNvZGVNb3JlX2woKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUZpbmFsUmVzdWx0OwotfQotCi12b2lkIFRocmVhZGVkU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdFNlZWs6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbVNlZWtUaW1lVXMpKTsKLSAgICAgICAgICAgIENIRUNLX0dFKG1TZWVrVGltZVVzLCAwbGwpOwotCi0gICAgICAgICAgICBpbnQzMl90IHg7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZ4KSk7Ci0gICAgICAgICAgICBtU2Vla01vZGUgPSAoUmVhZE9wdGlvbnM6OlNlZWtNb2RlKXg7Ci0KLSAgICAgICAgICAgIGludDMyX3QgKnNlZWtDb21wbGV0ZTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImNvbXBsZXRlIiwgKHZvaWQgKiopJnNlZWtDb21wbGV0ZSkpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgY2xlYXJRdWV1ZV9sKCk7Ci0gICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBPSzsKLQotICAgICAgICAgICAgKnNlZWtDb21wbGV0ZSA9IDE7Ci0gICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotCi0gICAgICAgICAgICBwb3N0RGVjb2RlTW9yZV9sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXREZWNvZGVNb3JlOgotICAgICAgICB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBtRGVjb2RlUGVuZGluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1RdWV1ZS5zaXplKCkgPT0ga01heFF1ZXVlU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywgbVNlZWtNb2RlKTsKLSAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xbGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIsICZvcHRpb25zKTsKLQotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IGVycjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1RdWV1ZS5zaXplKCkgPCBrTWF4UXVldWVTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3REZWNvZGVNb3JlX2woKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFRocmVhZGVkU291cmNlOjpwb3N0RGVjb2RlTW9yZV9sKCkgewotICAgIGlmIChtRGVjb2RlUGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbURlY29kZVBlbmRpbmcgPSB0cnVlOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREZWNvZGVNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKLX0KLQotdm9pZCBUaHJlYWRlZFNvdXJjZTo6Y2xlYXJRdWV1ZV9sKCkgewotICAgIHdoaWxlICghbVF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9ICptUXVldWUuYmVnaW4oKTsKLSAgICAgICAgbVF1ZXVlLmVyYXNlKG1RdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAppbmRleCA1YTQ1M2U5Li4xMDBkOGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKQEAgLTMwLDcgKzMwLDYgQEAKIAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAKQEAgLTIxMCw4ICsyMDksNyBAQAogICAgIHZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKCZlbnYsIE5VTEwpOwogI2VuZGlmCiAKLSAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCk7Ci0gICAgc2V0X3NjaGVkX3BvbGljeShhbmRyb2lkR2V0VGlkKCksIFNQX0ZPUkVHUk9VTkQpOworICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSgwLCBBTkRST0lEX1BSSU9SSVRZX0ZPUkVHUk9VTkQpOwogCiAgICAgc3RhdGljX2Nhc3Q8VGltZWRFdmVudFF1ZXVlICo+KG1lKS0+dGhyZWFkRW50cnkoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAppbmRleCA0OGJkZGMyLi42Zjk2OGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9WQlJJU2Vla2VyLmgiCiAKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVAzRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNDYsNyArNDcsNyBAQAogICAgIHVpbnQzMl90IHRtcCA9IFUzMl9BVCgmaGVhZGVyWzBdKTsKICAgICBzaXplX3QgZnJhbWVTaXplOwogICAgIGludCBzYW1wbGVSYXRlOwotICAgIGlmICghTVAzRXh0cmFjdG9yOjpnZXRfbXAzX2ZyYW1lX3NpemUodG1wLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSh0bXAsICZmcmFtZVNpemUsICZzYW1wbGVSYXRlKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IDkzMzIxMjAuLmM0MDY5NjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcApAQCAtMjY0LDYgKzI2NCw4IEBACiAgICAgICBtR3JvdXAoTlVMTCkgewogICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwogICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOworCisgICAgbU1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNTMsOCArMzU1LDYgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgbUN1cnJlbnRQb3MgKz0gbjsKLQogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewpAQCAtMzcwLDcgKzM3MCw5IEBACiAKICAgICAgICAgICAgIGludDE2X3QgKmRzdCA9IChpbnQxNl90ICopdG1wLT5kYXRhKCk7CiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMgPSBuOworCisgICAgICAgICAgICB3aGlsZSAobnVtQnl0ZXMtLSA+IDApIHsKICAgICAgICAgICAgICAgICAqZHN0KysgPSAoKGludDE2X3QpKCpzcmMpIC0gMTI4KSAqIDI1NjsKICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgIH0KQEAgLTQwNiw2ICs0MDgsNyBAQAogICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKSAvIG1TYW1wbGVSYXRlKTsKIAogICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgbUN1cnJlbnRQb3MgKz0gbjsKIAogICAgICpvdXQgPSBidWZmZXI7CiAKQEAgLTQyNiw2ICs0MjksMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgaWYgKGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWOwogICAgICpjb25maWRlbmNlID0gMC4zZjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9YSU5HU2Vla2VyLmNwcAppbmRleCA2MTY4MzZjLi4yMDkxMzgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9YSU5HU2Vla2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9YSU5HU2Vla2VyLmNwcApAQCAtMjQsOCArMjQsOCBAQAogc3RhdGljIGJvb2wgcGFyc2VfeGluZ19oZWFkZXIoCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLAogICAgICAgICBpbnQzMl90ICpmcmFtZV9udW1iZXIgPSBOVUxMLCBpbnQzMl90ICpieXRlX251bWJlciA9IE5VTEwsCi0gICAgICAgIGNoYXIgKnRhYmxlX29mX2NvbnRlbnRzID0gTlVMTCwgaW50MzJfdCAqcXVhbGl0eV9pbmRpY2F0b3IgPSBOVUxMLAotICAgICAgICBpbnQ2NF90ICpkdXJhdGlvbiA9IE5VTEwpOworICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWJsZV9vZl9jb250ZW50cyA9IE5VTEwsCisgICAgICAgIGludDMyX3QgKnF1YWxpdHlfaW5kaWNhdG9yID0gTlVMTCwgaW50NjRfdCAqZHVyYXRpb24gPSBOVUxMKTsKIAogLy8gc3RhdGljCiBzcDxYSU5HU2Vla2VyPiBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKApAQCAtNDEsOCArNDEsNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBMT0dJKCJGb3VuZCBYSU5HIGhlYWRlci4iKTsKLQogICAgIHJldHVybiBzZWVrZXI7CiB9CiAKQEAgLTk2LDcgKzk0LDcgQEAKIHN0YXRpYyBib29sIHBhcnNlX3hpbmdfaGVhZGVyKAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywKICAgICAgICAgaW50MzJfdCAqZnJhbWVfbnVtYmVyLCBpbnQzMl90ICpieXRlX251bWJlciwKLSAgICAgICAgY2hhciAqdGFibGVfb2ZfY29udGVudHMsIGludDMyX3QgKnF1YWxpdHlfaW5kaWNhdG9yLAorICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWJsZV9vZl9jb250ZW50cywgaW50MzJfdCAqcXVhbGl0eV9pbmRpY2F0b3IsCiAgICAgICAgIGludDY0X3QgKmR1cmF0aW9uKSB7CiAgICAgaWYgKGZyYW1lX251bWJlcikgewogICAgICAgICAqZnJhbWVfbnVtYmVyID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IDk1Y2YyZDMuLjhhNDJlOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgfQogCiAgICAgc2l6ZV90IGVuZE9mZnNldCA9IG9mZnNldCAtIDI7Ci0gICAgd2hpbGUgKGRhdGFbZW5kT2Zmc2V0IC0gMV0gPT0gMHgwMCkgeworICAgIHdoaWxlIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCArIDEgJiYgZGF0YVtlbmRPZmZzZXQgLSAxXSA9PSAweDAwKSB7CiAgICAgICAgIC0tZW5kT2Zmc2V0OwogICAgIH0KIApAQCAtMzc2LDUgKzM3NiwyMzYgQEAKICAgICByZXR1cm4gbWV0YTsKIH0KIAorYm9vbCBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgQUJpdFJlYWRlciBicigmZGF0YVs0XSwgc2l6ZSAtIDQpOworICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gcmFuZG9tX2FjY2Vzc2libGVfdm9sCisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiA9IGJyLmdldEJpdHMoOCk7CisKKyAgICBDSEVDS19ORSh2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uLAorICAgICAgICAgICAgIDB4MjF1IC8qIEZpbmUgR3JhbnVsYXJpdHkgU2NhbGFibGUgKi8pOworCisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkOworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eTsKKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeworICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOworICAgIH0KKyAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faW5mbyA9IGJyLmdldEJpdHMoNCk7CisgICAgaWYgKGFzcGVjdF9yYXRpb19pbmZvID09IDB4MGYgLyogZXh0ZW5kZWQgUEFSICovKSB7CisgICAgICAgIGJyLnNraXBCaXRzKDgpOyAgLy8gcGFyX3dpZHRoCisgICAgICAgIGJyLnNraXBCaXRzKDgpOyAgLy8gcGFyX2hlaWdodAorICAgIH0KKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdm9sX2NvbnRyb2xfcGFyYW1ldGVycworICAgICAgICBici5za2lwQml0cygyKTsgIC8vIGNocm9tYV9mb3JtYXQKKyAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBsb3dfZGVsYXkKKyAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZidl9wYXJhbWV0ZXJzCisgICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBmaXJzdF9oYWxmX2JpdF9yYXRlCisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGxhdHRlcl9oYWxmX2JpdF9yYXRlCisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplCisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDMpOyAgLy8gbGF0dGVyX2hhbGZfdmJ2X2J1ZmZlcl9zaXplCisgICAgICAgICAgICBici5za2lwQml0cygxMSk7ICAvLyBmaXJzdF9oYWxmX3Zidl9vY2N1cGFuY3kKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgIH0KKyAgICB9CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gYnIuZ2V0Qml0cygyKTsKKyAgICBDSEVDS19FUSh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUsIDB4MDB1IC8qIHJlY3Rhbmd1bGFyICovKTsKKworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgIHVuc2lnbmVkIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID0gYnIuZ2V0Qml0cygxNik7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisKKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gZml4ZWRfdm9wX3JhdGUKKyAgICAgICAgLy8gcmFuZ2UgWzAuLnZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uKQorCisgICAgICAgIC8vIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uCisgICAgICAgIC8vIDIgPT4gMC4uMSwgMSBiaXQKKyAgICAgICAgLy8gMyA9PiAwLi4yLCAyIGJpdHMKKyAgICAgICAgLy8gNCA9PiAwLi4zLCAyIGJpdHMKKyAgICAgICAgLy8gNSA9PiAwLi40LCAzIGJpdHMKKyAgICAgICAgLy8gLi4uCisKKyAgICAgICAgQ0hFQ0tfR1Qodm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24sIDB1KTsKKyAgICAgICAgLS12b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbjsKKworICAgICAgICB1bnNpZ25lZCBudW1CaXRzID0gMDsKKyAgICAgICAgd2hpbGUgKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4gMCkgeworICAgICAgICAgICAgKytudW1CaXRzOworICAgICAgICAgICAgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPj49IDE7CisgICAgICAgIH0KKworICAgICAgICBici5za2lwQml0cyhudW1CaXRzKTsgIC8vIGZpeGVkX3ZvcF90aW1lX2luY3JlbWVudAorICAgIH0KKworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl93aWR0aCA9IGJyLmdldEJpdHMoMTMpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgPSBici5nZXRCaXRzKDEzKTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKworICAgIHVuc2lnbmVkIGludGVybGFjZWQgPSBici5nZXRCaXRzKDEpOworCisgICAgKndpZHRoID0gdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoOworICAgICpoZWlnaHQgPSB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSwgaW50ICpvdXRfY2hhbm5lbHMsCisgICAgICAgIGludCAqb3V0X2JpdHJhdGUsIGludCAqb3V0X251bV9zYW1wbGVzKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IDA7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICB9CisKKyAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgKm91dF9iaXRyYXRlID0gMDsKKyAgICB9CisKKyAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgIH0KKworICAgIGlmICgoaGVhZGVyICYgMHhmZmUwMDAwMCkgIT0gMHhmZmUwMDAwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgdmVyc2lvbiA9IChoZWFkZXIgPj4gMTkpICYgMzsKKworICAgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGxheWVyID0gKGhlYWRlciA+PiAxNykgJiAzOworCisgICAgaWYgKGxheWVyID09IDB4MDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIHByb3RlY3Rpb24gPSAoaGVhZGVyID4+IDE2KSAmIDE7CisKKyAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOworCisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHsKKyAgICAgICAgLy8gRGlzYWxsb3cgImZyZWUiIGJpdHJhdGUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMCkgJiAzOworCisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7CisgICAgICAgIC8vIGxheWVyIEkKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHsKKyAgICAgICAgICAgIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LAorICAgICAgICAgICAgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0geworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsCisgICAgICAgICAgICAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPQorICAgICAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykKKyAgICAgICAgICAgICAgICA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdCisgICAgICAgICAgICAgICAgOiBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworCisgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBsYXllciBJSSBvciBJSUkKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0geworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsCisgICAgICAgICAgICAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDNbXSA9IHsKKyAgICAgICAgICAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsCisgICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPSB7CisgICAgICAgICAgICA4LCAxNiwgMjQsIDMyLCA0MCwgNDgsIDU2LCA2NCwKKyAgICAgICAgICAgIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykKKyAgICAgICAgICAgICAgICA/IGtCaXRyYXRlVjFMMltiaXRyYXRlX2luZGV4IC0gMV0KKyAgICAgICAgICAgICAgICA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFYyIChvciAyLjUpCisKKyAgICAgICAgICAgIGJpdHJhdGUgPSBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gNTc2OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWMiBvciBWMi41CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDcyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzNlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCisgICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwICAgICAgICBcCisgICAgICAgIHN1cHBvcnQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorICAgICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCisgICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydAoraW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E5ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisjaW5jbHVkZSAic3VwcG9ydC5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Nocm9taXVtSFRUUERhdGFTb3VyY2U6OkNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpCisgICAgOiBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCisgICAgICBtRGVsZWdhdGUobmV3IFNmRGVsZWdhdGUpLAorICAgICAgbUN1cnJlbnRPZmZzZXQoMCksCisgICAgICBtSU9SZXN1bHQoT0spLAorICAgICAgbUNvbnRlbnRTaXplKC0xKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgeworICAgIG1EZWxlZ2F0ZS0+c2V0T3duZXIodGhpcyk7Cit9CisKK0Nocm9taXVtSFRUUERhdGFTb3VyY2U6On5DaHJvbWl1bUhUVFBEYXRhU291cmNlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKKworICAgIGRlbGV0ZSBtRGVsZWdhdGU7CisgICAgbURlbGVnYXRlID0gTlVMTDsKKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KK30KKworc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgcmV0dXJuIGNvbm5lY3RfbCh1cmksIGhlYWRlcnMsIG9mZnNldCk7Cit9CisKK3N0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3RfbCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgeworICAgICAgICBkaXNjb25uZWN0X2woKTsKKyAgICB9CisKKyAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKKyAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiY29ubmVjdCB0byAlcyBAJWxsZCIsIHVyaSwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsCisgICAgICAgICAgICAgICAgImNvbm5lY3QgdG8gPFVSTCBzdXBwcmVzc2VkPiBAJWxsZCIsIG9mZnNldCk7CisgICAgfQorCisgICAgbVVSSSA9IHVyaTsKKyAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgbUhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGVhZGVycy5jbGVhcigpOworICAgIH0KKworICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CisgICAgbUNvbnRlbnRTaXplID0gLTE7CisgICAgbUN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7CisKKyAgICBtRGVsZWdhdGUtPmluaXRpYXRlQ29ubmVjdGlvbihtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBtSU9SZXN1bHQ7Cit9CisKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCisgICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtU3RhdGUgPSBDT05ORUNURUQ7CisgICAgbUNvbnRlbnRTaXplID0gKGNvbnRlbnRTaXplIDwgMCkgPyAtMSA6IGNvbnRlbnRTaXplICsgbUN1cnJlbnRPZmZzZXQ7CisgICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOChjb250ZW50VHlwZSk7CisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvbkNvbm5lY3Rpb25GYWlsZWQoc3RhdHVzX3QgZXJyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKworICAgIC8vIG1VUkkuY2xlYXIoKTsKKworICAgIG1JT1Jlc3VsdCA9IGVycjsKKworICAgIGNsZWFyRFJNU3RhdGVfbCgpOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBkaXNjb25uZWN0X2woKTsKK30KKwordm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0X2woKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RJTkc7CisgICAgbUlPUmVzdWx0ID0gLUVJTlRSOworCisgICAgbURlbGVnYXRlLT5pbml0aWF0ZURpc2Nvbm5lY3QoKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gRElTQ09OTkVDVElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7Cit9CisKK3N0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IE5PX0lOSVQ7Cit9CisKK3NzaXplX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisjaWYgMAorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5kaXNhYmxlLW5ldCIsIHZhbHVlLCAwKQorICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpIHx8ICFzdHJjbXAodmFsdWUsICIxIikpKSB7CisgICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlNpbXVsYXRpbmcgdGhhdCB0aGUgbmV0d29yayBpcyBkb3duLiIpOworICAgICAgICBkaXNjb25uZWN0X2woKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG9mZnNldCAhPSBtQ3VycmVudE9mZnNldCkgeworICAgICAgICBBU3RyaW5nIHRtcCA9IG1VUkk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IHRtcEhlYWRlcnMgPSBtSGVhZGVyczsKKworICAgICAgICBkaXNjb25uZWN0X2woKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wodG1wLmNfc3RyKCksICZ0bXBIZWFkZXJzLCBvZmZzZXQpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhdGUgPSBSRUFESU5HOworCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gUkVBRElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGlmIChtSU9SZXN1bHQgPCBPSykgeworICAgICAgICByZXR1cm4gbUlPUmVzdWx0OworICAgIH0KKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7CisKKyAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OworICAgICAgICByZXR1cm4gbUlPUmVzdWx0OworICAgIH0KKworICAgIHJldHVybiBFUlJPUl9JTzsKK30KKwordm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1JT1Jlc3VsdCA9IHNpemU7CisKKyAgICBpZiAobVN0YXRlID09IFJFQURJTkcpIHsKKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtQ29udGVudFNpemUgPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1Db250ZW50U2l6ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6SW5pdGlhdGVSZWFkKAorICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBtZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uRGlzY29ubmVjdENvbXBsZXRlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVElORyk7CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgLy8gbVVSSS5jbGVhcigpOworCisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKworICAgIGNsZWFyRFJNU3RhdGVfbCgpOworfQorCitzcDxEZWNyeXB0SGFuZGxlPiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgIH0KKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vdGUgaWYgcmVkaXJlY3Qgb2NjdXJzLCBtVXJpIGlzIHRoZSByZWRpcmVjdCB1cmkgaW5zdGVhZCBvZiB0aGUKKyAgICAgICAgICogb3JpZ2luYWwgb25lCisgICAgICAgICAqLworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nOChtVVJJLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Cit9CisKK3ZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbygKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK1N0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0VXJpKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gU3RyaW5nOChtVVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworfQorCit2b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNsZWFyRFJNU3RhdGVfbCgpIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCisgICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVVSSS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3RpbmcuLi4iKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wobVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3QgZmFpbGVkIHcvIGVyciAweCUwOHgiLCBlcnIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzNlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlU3VwcG9ydCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAic3VwcG9ydC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9uZXQvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnlfaW1wbC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2NlcnRfdmVyaWZpZXIuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9jb29raWVfbW9uc3Rlci5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2hvc3RfcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9zc2xfY29uZmlnX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2F1dGhfaGFuZGxlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9jYWNoZS5oIgorI2luY2x1ZGUgIm5ldC9wcm94eS9wcm94eV9jb25maWdfc2VydmljZV9hbmRyb2lkLmgiCisKKyNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgTXV0ZXggZ05ldHdvcmtUaHJlYWRMb2NrOworc3RhdGljIGJhc2U6OlRocmVhZCAqZ05ldHdvcmtUaHJlYWQgPSBOVUxMOworc3RhdGljIHNjb3BlZF9yZWZwdHI8bmV0OjpVUkxSZXF1ZXN0Q29udGV4dD4gZ1JlcUNvbnRleHQ7CitzdGF0aWMgc2NvcGVkX3B0cjxuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcj4gZ05ldHdvcmtDaGFuZ2VOb3RpZmllcjsKKworc3RhdGljIHZvaWQgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ05ldHdvcmtUaHJlYWRMb2NrKTsKKyAgICBpZiAoZ05ldHdvcmtUaHJlYWQgPT0gTlVMTCkgeworICAgICAgICBnTmV0d29ya1RocmVhZCA9IG5ldyBiYXNlOjpUaHJlYWQoIm5ldHdvcmsiKTsKKyAgICAgICAgYmFzZTo6VGhyZWFkOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgIG9wdGlvbnMubWVzc2FnZV9sb29wX3R5cGUgPSBNZXNzYWdlTG9vcDo6VFlQRV9JTzsKKyAgICAgICAgQ0hFQ0soZ05ldHdvcmtUaHJlYWQtPlN0YXJ0V2l0aE9wdGlvbnMob3B0aW9ucykpOworCisgICAgICAgIGdSZXFDb250ZXh0ID0gbmV3IFNmUmVxdWVzdENvbnRleHQ7CisKKyAgICAgICAgZ05ldHdvcmtDaGFuZ2VOb3RpZmllci5yZXNldChuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q3JlYXRlKCkpOworCisgICAgICAgIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5OjpSZWdpc3RlclNoYXJlZEluc3RhbmNlKAorICAgICAgICAgICAgICAgIG5ldyBTZk5ldHdvcmtMaWJyYXJ5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIE1ZX0xPR0koY29uc3QgY2hhciAqcykgeworICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIiVzIiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIE1ZX0xPR1YoY29uc3QgY2hhciAqcykgeworI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAorICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgIiVzIiwgcyk7CisjZW5kaWYKK30KKworU2ZOZXRMb2c6OlNmTmV0TG9nKCkKKyAgICA6IG1OZXh0SUQoMSkgeworfQorCit2b2lkIFNmTmV0TG9nOjpBZGRFbnRyeSgKKyAgICAgICAgRXZlbnRUeXBlIHR5cGUsCisgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKKyAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCisgICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCisgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKSB7CisjaWYgMAorICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICJBZGRFbnRyeSB0aW1lPSVzIHR5cGU9JXMgc291cmNlPSVzIHBoYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgIFRpY2tDb3VudFRvU3RyaW5nKHRpbWUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgRXZlbnRUeXBlVG9TdHJpbmcodHlwZSksCisgICAgICAgICAgICAgICAgU291cmNlVHlwZVRvU3RyaW5nKHNvdXJjZS50eXBlKSwKKyAgICAgICAgICAgICAgICBFdmVudFBoYXNlVG9TdHJpbmcocGhhc2UpKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit1aW50MzIgU2ZOZXRMb2c6Ok5leHRJRCgpIHsKKyAgICByZXR1cm4gbU5leHRJRCsrOworfQorCituZXQ6Ok5ldExvZzo6TG9nTGV2ZWwgU2ZOZXRMb2c6OkdldExvZ0xldmVsKCkgY29uc3QgeworICAgIHJldHVybiBMT0dfQUxMOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTZlJlcXVlc3RDb250ZXh0OjpTZlJlcXVlc3RDb250ZXh0KCkgeworICAgIEFTdHJpbmcgdWE7CisgICAgdWEuYXBwZW5kKCJzdGFnZWZyaWdodC8xLjIgKExpbnV4O0FuZHJvaWQgIik7CisKKyNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKKyNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKKyNlbmRpZgorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7CisgICAgdWEuYXBwZW5kKHZhbHVlKTsKKyAgICB1YS5hcHBlbmQoIikiKTsKKworICAgIG1Vc2VyQWdlbnQgPSB1YS5jX3N0cigpOworCisgICAgc2V0X25ldF9sb2cobmV3IFNmTmV0TG9nKCkpOworCisgICAgc2V0X2hvc3RfcmVzb2x2ZXIoCisgICAgICAgIG5ldDo6Q3JlYXRlU3lzdGVtSG9zdFJlc29sdmVyKAorICAgICAgICAgICAgICAgIG5ldDo6SG9zdFJlc29sdmVyOjprRGVmYXVsdFBhcmFsbGVsaXNtLAorICAgICAgICAgICAgICAgIE5VTEwgLyogcmVzb2x2ZXJfcHJvYyAqLywKKyAgICAgICAgICAgICAgICBuZXRfbG9nKCkpKTsKKworICAgIHNldF9zc2xfY29uZmlnX3NlcnZpY2UoCisgICAgICAgIG5ldDo6U1NMQ29uZmlnU2VydmljZTo6Q3JlYXRlU3lzdGVtU1NMQ29uZmlnU2VydmljZSgpKTsKKworICAgIHNldF9wcm94eV9zZXJ2aWNlKG5ldDo6UHJveHlTZXJ2aWNlOjpDcmVhdGVXaXRob3V0UHJveHlSZXNvbHZlcigKKyAgICAgICAgbmV3IG5ldDo6UHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZCwgbmV0X2xvZygpKSk7CisKKyAgICBzZXRfaHR0cF90cmFuc2FjdGlvbl9mYWN0b3J5KG5ldyBuZXQ6Okh0dHBDYWNoZSgKKyAgICAgICAgICAgIGhvc3RfcmVzb2x2ZXIoKSwKKyAgICAgICAgICAgIG5ldyBuZXQ6OkNlcnRWZXJpZmllcigpLAorICAgICAgICAgICAgZG5zcnJfcmVzb2x2ZXIoKSwKKyAgICAgICAgICAgIGRuc19jZXJ0X2NoZWNrZXIoKSwKKyAgICAgICAgICAgIHByb3h5X3NlcnZpY2UoKSwKKyAgICAgICAgICAgIHNzbF9jb25maWdfc2VydmljZSgpLAorICAgICAgICAgICAgbmV0OjpIdHRwQXV0aEhhbmRsZXJGYWN0b3J5OjpDcmVhdGVEZWZhdWx0KGhvc3RfcmVzb2x2ZXIoKSksCisgICAgICAgICAgICBuZXR3b3JrX2RlbGVnYXRlKCksCisgICAgICAgICAgICBuZXRfbG9nKCksCisgICAgICAgICAgICBOVUxMKSk7ICAvLyBiYWNrZW5kX2ZhY3RvcnkKKworICAgIHNldF9jb29raWVfc3RvcmUobmV3IG5ldDo6Q29va2llTW9uc3RlcihOVUxMLCBOVUxMKSk7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nICZTZlJlcXVlc3RDb250ZXh0OjpHZXRVc2VyQWdlbnQoY29uc3QgR1VSTCAmdXJsKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2VyQWdlbnQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NmTmV0d29ya0xpYnJhcnk6OlNmTmV0d29ya0xpYnJhcnkoKSB7fQorCitTZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlSZXN1bHQgU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5WDUwOUNlcnRDaGFpbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpIHsKKyAgICByZXR1cm4gVkVSSUZZX09LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTZkRlbGVnYXRlOjpTZkRlbGVnYXRlKCkKKyAgICA6IG1Pd25lcihOVUxMKSwKKyAgICAgIG1VUkxSZXF1ZXN0KE5VTEwpLAorICAgICAgbVJlYWRCdWZmZXIobmV3IG5ldDo6SU9CdWZmZXJXaXRoU2l6ZSg4MTkyKSksCisgICAgICBtTnVtQnl0ZXNSZWFkKDApLAorICAgICAgbU51bUJ5dGVzVG90YWwoMCksCisgICAgICBtRGF0YURlc3RpbmF0aW9uKE5VTEwpLAorICAgICAgbUF0RU9TKGZhbHNlKSB7CisgICAgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpOworfQorCitTZkRlbGVnYXRlOjp+U2ZEZWxlZ2F0ZSgpIHsKKyAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpzZXRPd25lcihDaHJvbWl1bUhUVFBEYXRhU291cmNlICpvd25lcikgeworICAgIG1Pd25lciA9IG93bmVyOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uUmVjZWl2ZWRSZWRpcmVjdCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpIHsKKyAgICBNWV9MT0dWKCJPblJlY2VpdmVkUmVkaXJlY3QiKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkF1dGhSZXF1aXJlZCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKSB7CisgICAgTVlfTE9HVigiT25BdXRoUmVxdWlyZWQiKTsKKworICAgIGluaGVyaXRlZDo6T25BdXRoUmVxdWlyZWQocmVxdWVzdCwgYXV0aF9pbmZvKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAorICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pIHsKKyAgICBNWV9MT0dWKCJPbkNlcnRpZmljYXRlUmVxdWVzdGVkIik7CisKKyAgICBpbmhlcml0ZWQ6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQocmVxdWVzdCwgY2VydF9yZXF1ZXN0X2luZm8pOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcigKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPblNTTENlcnRpZmljYXRlRXJyb3IgY2VydF9lcnJvcj0lZFxuIiwgY2VydF9lcnJvcik7CisKKyAgICBpbmhlcml0ZWQ6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcihyZXF1ZXN0LCBjZXJ0X2Vycm9yLCBjZXJ0KTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7CisgICAgTVlfTE9HVigiT25HZXRDb29raWVzIik7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6T25TZXRDb29raWUoCisgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAorICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKKyAgICBNWV9MT0dWKCJPblNldENvb2tpZSIpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OlNVQ0NFU1MpIHsKKyAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCBhbmQgb3NfZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkub3NfZXJyb3IoKSkuY19zdHIoKSk7CisKKyAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OworICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7CisKKyAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtUmFuZ2VSZXF1ZXN0ZWQgJiYgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSB7CisgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAiV2UgcmVxdWVzdGVkIGEgY29udGVudCByYW5nZSwgYnV0IHNlcnZlciBkaWRuJ3QgIgorICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCB0aGF0LiAocmVzcG9uZGVkIHdpdGggJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOworCisgICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKKyAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOworCisgICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKC1FUElQRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKChyZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAvIDEwMCkgIT0gMikgeworICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIlNlcnZlciByZXNwb25kZWQgd2l0aCBodHRwIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKKworICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7CisgICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKKworICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNWV9MT0dWKCJPblJlc3BvbnNlU3RhcnRlZCIpOworCisgICAgc3RkOjpzdHJpbmcgaGVhZGVyczsKKyAgICByZXF1ZXN0LT5HZXRBbGxSZXNwb25zZUhlYWRlcnMoJmhlYWRlcnMpOworCisgICAgTVlfTE9HVihTdHJpbmdQcmludGYoInJlc3BvbnNlIGhlYWRlcnM6ICVzIiwgaGVhZGVycy5jX3N0cigpKS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOworICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlSGVhZGVyQnlOYW1lKCJDb250ZW50LVR5cGUiLCAmY29udGVudFR5cGUpOworCisgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKKyAgICAgICAgICAgIHJlcXVlc3QtPkdldEV4cGVjdGVkQ29udGVudFNpemUoKSwgY29udGVudFR5cGUuY19zdHIoKSk7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWFkQ29tcGxldGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGJ5dGVzX3JlYWQpIHsKKyAgICBpZiAoYnl0ZXNfcmVhZCA9PSAtMSkgeworICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIk9uUmVhZENvbXBsZXRlZCwgcmVhZCBmYWlsZWQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKKworICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiT25SZWFkQ29tcGxldGVkLCByZWFkICVkIGJ5dGVzIiwgYnl0ZXNfcmVhZCkuY19zdHIoKSk7CisKKyAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKKyAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICJSZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKKworICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgeworICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0dUKGJ5dGVzX3JlYWQsIDApOworICAgIENIRUNLX0xFKG1OdW1CeXRlc1JlYWQgKyBieXRlc19yZWFkLCBtTnVtQnl0ZXNUb3RhbCk7CisKKyAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKKyAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgYnl0ZXNfcmVhZCk7CisKKyAgICBtTnVtQnl0ZXNSZWFkICs9IGJ5dGVzX3JlYWQ7CisKKyAgICByZWFkTW9yZShyZXF1ZXN0KTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpyZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKKyAgICB3aGlsZSAobU51bUJ5dGVzUmVhZCA8IG1OdW1CeXRlc1RvdGFsKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gbU51bUJ5dGVzVG90YWwgLSBtTnVtQnl0ZXNSZWFkOworICAgICAgICBpZiAoY29weSA+IG1SZWFkQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvcHkgPSBtUmVhZEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG47CisgICAgICAgIGlmIChyZXF1ZXN0LT5SZWFkKG1SZWFkQnVmZmVyLCBjb3B5LCAmbikpIHsKKyAgICAgICAgICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJSZWFkICVkIGJ5dGVzIGRpcmVjdGx5LiIsIG4pLmNfc3RyKCkpOworCisgICAgICAgICAgICBDSEVDS19MRSgoc2l6ZV90KW4sIGNvcHkpOworCisgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIG4pOworCisgICAgICAgICAgICBtTnVtQnl0ZXNSZWFkICs9IG47CisKKyAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTVlfTE9HVigicmVhZE1vcmUgcGVuZGluZyByZWFkIik7CisKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OklPX1BFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0IHJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgR1VSTCB1cmwodXJpKTsKKworICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOworICAgIGxvb3AtPlBvc3RUYXNrKAorICAgICAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKKyAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyLAorICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgdXJsLAorICAgICAgICAgICAgICAgIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgb2Zmc2V0KSk7CisKK30KKworLy8gc3RhdGljCit2b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKKyAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIEdVUkwgdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBtZS0+b25Jbml0aWF0ZUNvbm5lY3Rpb24odXJsLCBoZWFkZXJzLCBvZmZzZXQpOworfQorCit2b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBHVVJMICZ1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpleHRyYSwKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKKworICAgIG1VUkxSZXF1ZXN0ID0gbmV3IG5ldDo6VVJMUmVxdWVzdCh1cmwsIHRoaXMpOworICAgIG1BdEVPUyA9IGZhbHNlOworCisgICAgbVJhbmdlUmVxdWVzdGVkID0gZmFsc2U7CisKKyAgICBpZiAob2Zmc2V0ICE9IDAgfHwgZXh0cmEgIT0gTlVMTCkgeworICAgICAgICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzID0KKyAgICAgICAgICAgIG1VUkxSZXF1ZXN0LT5leHRyYV9yZXF1ZXN0X2hlYWRlcnMoKTsKKworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIGhlYWRlcnMuQWRkSGVhZGVyRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJSYW5nZTogYnl0ZXM9JWxsZC0iLCBvZmZzZXQpLmNfc3RyKCkpOworCisgICAgICAgICAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmEtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgQVN0cmluZyBzOworICAgICAgICAgICAgICAgIHMuYXBwZW5kKGV4dHJhLT5rZXlBdChpKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoIjogIik7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPnZhbHVlQXQoaSkuc3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKHMuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtVVJMUmVxdWVzdC0+U2V0RXh0cmFSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKTsKKyAgICB9CisKKyAgICBtVVJMUmVxdWVzdC0+c2V0X2NvbnRleHQoZ1JlcUNvbnRleHQpOworCisgICAgbVVSTFJlcXVlc3QtPlN0YXJ0KCk7Cit9CisKK3ZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVEaXNjb25uZWN0KCkgeworICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOworICAgIGxvb3AtPlBvc3RUYXNrKAorICAgICAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKKyAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyLCB0aGlzKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpIHsKKyAgICBtZS0+b25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlRGlzY29ubmVjdCgpIHsKKyAgICBtVVJMUmVxdWVzdC0+Q2FuY2VsKCk7CisKKyAgICBkZWxldGUgbVVSTFJlcXVlc3Q7CisgICAgbVVSTFJlcXVlc3QgPSBOVUxMOworCisgICAgbU93bmVyLT5vbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOworfQorCit2b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOworICAgIGxvb3AtPlBvc3RUYXNrKAorICAgICAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKKyAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyLCB0aGlzLCBkYXRhLCBzaXplKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlUmVhZFdyYXBwZXIoCisgICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1lLT5vbkluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKK30KKwordm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLKG1VUkxSZXF1ZXN0ICE9IE5VTEwpOworCisgICAgbU51bUJ5dGVzUmVhZCA9IDA7CisgICAgbU51bUJ5dGVzVG90YWwgPSBzaXplOworICAgIG1EYXRhRGVzdGluYXRpb24gPSBkYXRhOworCisgICAgaWYgKG1BdEVPUykgeworICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlYWRNb3JlKG1VUkxSZXF1ZXN0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU4ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNVUFBPUlRfSF8KKworI2RlZmluZSBTVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIm5ldC9iYXNlL25ldF9sb2cuaCIKKyNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3QuaCIKKyNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dC5oIgorI2luY2x1ZGUgIm5ldC9iYXNlL2FuZHJvaWRfbmV0d29ya19saWJyYXJ5LmgiCisjaW5jbHVkZSAibmV0L2Jhc2UvaW9fYnVmZmVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU2ZOZXRMb2cgOiBwdWJsaWMgbmV0OjpOZXRMb2cgeworICAgIFNmTmV0TG9nKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgQWRkRW50cnkoCisgICAgICAgICAgICBFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKKyAgICAgICAgICAgIGNvbnN0IFNvdXJjZSAmc291cmNlLAorICAgICAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKKyAgICAgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdWludDMyIE5leHRJRCgpOworICAgIHZpcnR1YWwgTG9nTGV2ZWwgR2V0TG9nTGV2ZWwoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzIgbU5leHRJRDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0TG9nKTsKK307CisKK3N0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIG5ldDo6VVJMUmVxdWVzdENvbnRleHQgeworICAgIFNmUmVxdWVzdENvbnRleHQoKTsKKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Vc2VyQWdlbnQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZlJlcXVlc3RDb250ZXh0KTsKK307CisKKy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGh0dHBzIHN1cHBvcnQsIHdlIGRvbid0IHJlYWxseSB2ZXJpZnkgY2VydGlmaWNhdGVzLAorLy8gd2UgYWNjZXB0IGFueXRoaW5nLi4uCitzdHJ1Y3QgU2ZOZXR3b3JrTGlicmFyeSA6IHB1YmxpYyBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeSB7CisgICAgU2ZOZXR3b3JrTGlicmFyeSgpOworCisgICAgdmlydHVhbCBWZXJpZnlSZXN1bHQgVmVyaWZ5WDUwOUNlcnRDaGFpbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0d29ya0xpYnJhcnkpOworfTsKKworc3RydWN0IENocm9taXVtSFRUUERhdGFTb3VyY2U7CisKK3N0cnVjdCBTZkRlbGVnYXRlIDogcHVibGljIG5ldDo6VVJMUmVxdWVzdDo6RGVsZWdhdGUgeworICAgIFNmRGVsZWdhdGUoKTsKKyAgICB2aXJ0dWFsIH5TZkRlbGVnYXRlKCk7CisKKyAgICB2b2lkIGluaXRpYXRlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdm9pZCBpbml0aWF0ZURpc2Nvbm5lY3QoKTsKKyAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIHNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlZFJlZGlyZWN0KAorICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25BdXRoUmVxdWlyZWQoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6QXV0aENoYWxsZW5nZUluZm8gKmF1dGhfaW5mbyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCgKKyAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpTU0xDZXJ0UmVxdWVzdEluZm8gKmNlcnRfcmVxdWVzdF9pbmZvKTsKKworICAgIHZpcnR1YWwgdm9pZCBPblNTTENlcnRpZmljYXRlRXJyb3IoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBjZXJ0X2Vycm9yLCBuZXQ6Olg1MDlDZXJ0aWZpY2F0ZSAqY2VydCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25HZXRDb29raWVzKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgT25TZXRDb29raWUoCisgICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCisgICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgICAgICBib29sIGJsb2NrZWRfYnlfcG9saWN5KTsKKworICAgIHZpcnR1YWwgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgdmlydHVhbCB2b2lkIE9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIERlbGVnYXRlIGluaGVyaXRlZDsKKworICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcjsKKworICAgIG5ldDo6VVJMUmVxdWVzdCAqbVVSTFJlcXVlc3Q7CisgICAgc2NvcGVkX3JlZnB0cjxuZXQ6OklPQnVmZmVyV2l0aFNpemU+IG1SZWFkQnVmZmVyOworCisgICAgc2l6ZV90IG1OdW1CeXRlc1JlYWQ7CisgICAgc2l6ZV90IG1OdW1CeXRlc1RvdGFsOworICAgIHZvaWQgKm1EYXRhRGVzdGluYXRpb247CisKKyAgICBib29sIG1SYW5nZVJlcXVlc3RlZDsKKyAgICBib29sIG1BdEVPUzsKKworICAgIHZvaWQgcmVhZE1vcmUobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKKworICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKKyAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLAorICAgICAgICAgICAgR1VSTCB1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlUmVhZFdyYXBwZXIoCisgICAgICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBvbkluaXRpYXRlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEdVUkwgJnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdm9pZCBvbkluaXRpYXRlRGlzY29ubmVjdCgpOworICAgIHZvaWQgb25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZEZWxlZ2F0ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNVUFBPUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg0MzFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJBQUNEZWNvZGVyLmgiCi0jZGVmaW5lIExPR19UQUcgIkFBQ0RlY29kZXIiCi0KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL0VTRFMuaCIKLQotI2luY2x1ZGUgInB2bXA0YXVkaW9kZWNvZGVyX2FwaS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BQUNEZWNvZGVyOjpBQUNEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAotICAgICAgbUNvbmZpZyhuZXcgdFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWwpLAotICAgICAgbURlY29kZXJCdWYoTlVMTCksCi0gICAgICBtQW5jaG9yVGltZVVzKDApLAotICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCi0gICAgICBtSW5wdXRCdWZmZXIoTlVMTCkgewotCi0gICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotCi0gICAgLy8gV2UnbGwgYWx3YXlzIG91dHB1dCBzdGVyZW8sIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgY2hhbm5lbHMgYXJlCi0gICAgLy8gcHJlc2VudCBpbiB0aGUgaW5wdXQgZHVlIHRvIGRlY29kZXIgbGltaXRhdGlvbnMuCi0gICAgbU1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFBQ0RlY29kZXIiKTsKLQotICAgIG1Jbml0Q2hlY2sgPSBpbml0Q2hlY2soKTsKLX0KLQotc3RhdHVzX3QgQUFDRGVjb2Rlcjo6aW5pdENoZWNrKCkgewotICAgIG1lbXNldChtQ29uZmlnLCAwLCBzaXplb2YodFBWTVA0QXVkaW9EZWNvZGVyRXh0ZXJuYWwpKTsKLSAgICBtQ29uZmlnLT5vdXRwdXRGb3JtYXQgPSBPVVRQVVRGT1JNQVRfMTZQQ01fSU5URVJMRUFWRUQ7Ci0gICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAxOwotCi0gICAgLy8gVGhlIHNvZnR3YXJlIGRlY29kZXIgZG9lc24ndCBwcm9wZXJseSBzdXBwb3J0IG1vbm8gb3V0cHV0IG9uCi0gICAgLy8gQUFDcGx1cyBmaWxlcy4gQWx3YXlzIG91dHB1dCBzdGVyZW8uCi0gICAgbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzID0gMjsKLQotICAgIFVJbnQzMiBtZW1SZXF1aXJlbWVudHMgPSBQVk1QNEF1ZGlvRGVjb2RlckdldE1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBQVk1QNEF1ZGlvRGVjb2RlckluaXRMaWJyYXJ5KG1Db25maWcsIG1EZWNvZGVyQnVmKTsKLSAgICBpZiAoZXJyICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgTVA0IGF1ZGlvIGRlY29kZXIiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKLSAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICBjb25zdCB2b2lkICpjb2RlY19zcGVjaWZpY19kYXRhOwotICAgICAgICBzaXplX3QgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAotICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhLCAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLQotICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSAoVUNoYXIgKiljb2RlY19zcGVjaWZpY19kYXRhOwotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKLQotICAgICAgICBpZiAoUFZNUDRBdWRpb0RlY29kZXJDb25maWcobUNvbmZpZywgbURlY29kZXJCdWYpCi0gICAgICAgICAgICAgICAgIT0gTVA0QVVERUNfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotQUFDRGVjb2Rlcjo6fkFBQ0RlY29kZXIoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUNvbmZpZzsKLSAgICBtQ29uZmlnID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgQUFDRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDQwOTYgKiAyKSk7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgbUFuY2hvclRpbWVVcyA9IDA7Ci0gICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtTnVtRGVjb2RlZEJ1ZmZlcnMgPSAwOwotICAgIG1VcHNhbXBsaW5nRmFjdG9yID0gMjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQUFDRGVjb2Rlcjo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGZyZWUobURlY29kZXJCdWYpOwotICAgIG1EZWNvZGVyQnVmID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBQUNEZWNvZGVyOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBBQUNEZWNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwotCi0gICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCi0gICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KLSAgICAgICAgUFZNUDRBdWRpb0RlY29kZXJSZXNldEJ1ZmZlcihtRGVjb2RlckJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2Vla1RpbWVVcyA9IC0xOwotICAgIH0KLQotICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsIG9wdGlvbnMpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGhhdmUgYSBuZXcgdGltZXN0YW1wIGFmdGVyIHNlZWtpbmcuCi0gICAgICAgICAgICBDSEVDSyhzZWVrVGltZVVzIDwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlciksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAoVUNoYXIgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKLSAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOwotICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOwotCi0gICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHN0YXRpY19jYXN0PEludDE2ICo+KGJ1ZmZlci0+ZGF0YSgpKTsKLSAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSAmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsyMDQ4XTsKLSAgICBtQ29uZmlnLT5yZXBvc2l0aW9uRmxhZyA9IGZhbHNlOwotCi0gICAgSW50IGRlY29kZXJFcnIgPSBQVk1QNEF1ZGlvRGVjb2RlRnJhbWUobUNvbmZpZywgbURlY29kZXJCdWYpOwotCi0gICAgLyoKLSAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKLSAgICAgKiBvciBpbXBsaWNpdGx5LCBhY2NvcmRpbmcgdG8gTVBFRzQgc3BlYy4gQUFDKy9lQUFDKyBpcyBhIGR1YWwKLSAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQotICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgotICAgICAqCi0gICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAotICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZwotICAgICAqIFNCUiBjb250ZW50IGluIEFBQyBleHRlbnNpb24gcGF5bG9hZCBzcGVjaWZpYyB0byBTQlIsIGFuZCBoZW5jZQotICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgotICAgICAqCi0gICAgICogVGh1cywgd2UgY291bGQgbm90IHNheSBmb3Igc3VyZSB3aGV0aGVyIGEgc3RyZWFtIGlzCi0gICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgotICAgICAqLwotICAgIGlmICgrK21OdW1EZWNvZGVkQnVmZmVycyA8PSAyKSB7Ci0gICAgICAgIExPR1YoImF1ZGlvL2V4dGVuZGVkIGF1ZGlvIG9iamVjdCB0eXBlOiAlZCArICVkIiwKLSAgICAgICAgICAgIG1Db25maWctPmF1ZGlvT2JqZWN0VHlwZSwgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUpOwotICAgICAgICBMT0dWKCJhYWMrIHVwc2FtcGxpbmcgZmFjdG9yOiAlZCBkZXNpcmVkIGNoYW5uZWxzOiAlZCIsCi0gICAgICAgICAgICBtQ29uZmlnLT5hYWNQbHVzVXBzYW1wbGluZ0ZhY3RvciwgbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzKTsKLQotICAgICAgICBDSEVDSyhtTnVtRGVjb2RlZEJ1ZmZlcnMgPiAwKTsKLSAgICAgICAgaWYgKG1OdW1EZWNvZGVkQnVmZmVycyA9PSAxKSB7Ci0gICAgICAgICAgICBtVXBzYW1wbGluZ0ZhY3RvciA9IG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yOwotICAgICAgICAgICAgLy8gQ2hlY2sgb24gdGhlIHNhbXBsaW5nIHJhdGUgdG8gc2VlIHdoZXRoZXIgaXQgaXMgY2hhbmdlZC4KLSAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgTE9HVygiU2FtcGxlIHJhdGUgd2FzICVkIEh6LCBidXQgbm93IGlzICVkIEh6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5GT19GT1JNQVRfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgIC8vIG1OdW1EZWNvZGVkQnVmZmVycyA9PSAyCi0gICAgICAgICAgICBpZiAobUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUgPT0gTVA0QVVESU9fQUFDX0xDIHx8Ci0gICAgICAgICAgICAgICAgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUgPT0gTVA0QVVESU9fTFRQKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1VcHNhbXBsaW5nRmFjdG9yID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSB0dXJucyBvdXQgdG8gYmUgbm90IGFhY1BsdXMgbW9kZSBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgTE9HVygiRGlzYWJsZSBBQUMrL2VBQUMrIHNpbmNlIGV4dGVuZGVkIGF1ZGlvIG9iamVjdCB0eXBlIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmV4dGVuZGVkQXVkaW9PYmplY3RUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1VcHNhbXBsaW5nRmFjdG9yID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWFjUGx1cyBtb2RlIGRvZXMgbm90IGJ1eSB1cyBhbnl0aGluZywgYnV0IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIDEuIENQVSBsb2FkIHRvIGluY3JlYXNlLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gYSBoYWxmIHNwZWVkIG9mIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgIExPR1coIkRpc2FibGUgQUFDKy9lQUFDKyBzaW5jZSB1cHNhbXBsaW5nIGZhY3RvciBpcyAxIik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25maWctPmFhY1BsdXNFbmFibGVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQotICAgICAgICBtQ29uZmlnLT5mcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1Db25maWctPmRlc2lyZWRDaGFubmVsczsKLSAgICBpZiAobVVwc2FtcGxpbmdGYWN0b3IgPT0gMikgewotICAgICAgICBpZiAobUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzID09IDEpIHsKLSAgICAgICAgICAgIG1lbWNweSgmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsxMDI0XSwgJm1Db25maWctPnBPdXRwdXRCdWZmZXJbMjA0OF0sIG51bU91dEJ5dGVzICogMik7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtT3V0Qnl0ZXMgKj0gMjsKLSAgICB9Ci0KLSAgICBpZiAoZGVjb2RlckVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7Ci0gICAgICAgIExPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkLCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOwotCi0gICAgICAgIG1lbXNldChidWZmZXItPmRhdGEoKSwgMCwgbnVtT3V0Qnl0ZXMpOwotCi0gICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICB9Ci0KLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBudW1PdXRCeXRlcyk7Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCwKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoKTsKLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLAotICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMCkgLyBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpOwotCi0gICAgbU51bVNhbXBsZXNPdXRwdXQgKz0gbUNvbmZpZy0+ZnJhbWVMZW5ndGggKiBtVXBzYW1wbGluZ0ZhY3RvcjsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKaW5kZXggNjllMzMxZi4uMjBjN2JjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawpAQCAtMTQzLDE0ICsxNDMsMzggQEAKICAJdW5wYWNrX2lkeC5jcHAgXAogIAl3aW5kb3dfdGFibGVzX2Z4cC5jcHAgXAogIAlwdm1wNHNldGF1ZGlvY29uZmlnLmNwcCBcCi0gICAgICAgIEFBQ0RlY29kZXIuY3BwCiAKIExPQ0FMX0NGTEFHUyA6PSAtREFBQ19QTFVTIC1ESFFfU0JSIC1EUEFSQU1FVFJJQ1NURVJFTyAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPQogCi1MT0NBTF9DX0lOQ0xVREVTIDo9IGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCiBMT0NBTF9BUk1fTU9ERSA6PSBhcm0KIAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2FhY2RlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0QUFDLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZGVjCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9hYWNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDZkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMuY3BwCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdEFBQy5oIgorCisjaW5jbHVkZSAicHZtcDRhdWRpb2RlY29kZXJfYXBpLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0QUFDOjpTb2Z0QUFDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1Db25maWcobmV3IHRQVk1QNEF1ZGlvRGVjb2RlckV4dGVybmFsKSwKKyAgICAgIG1EZWNvZGVyQnVmKE5VTEwpLAorICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtVXBzYW1wbGluZ0ZhY3RvcigyKSwKKyAgICAgIG1BbmNob3JUaW1lVXMoMCksCisgICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0QUFDOjp+U29mdEFBQygpIHsKKyAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICBtRGVjb2RlckJ1ZiA9IE5VTEw7CisKKyAgICBkZWxldGUgbUNvbmZpZzsKKyAgICBtQ29uZmlnID0gTlVMTDsKK30KKwordm9pZCBTb2Z0QUFDOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vYWFjIik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdBQUM7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA4MTkyOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKworc3RhdHVzX3QgU29mdEFBQzo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KG1Db25maWcsIDAsIHNpemVvZih0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbCkpOworICAgIG1Db25maWctPm91dHB1dEZvcm1hdCA9IE9VVFBVVEZPUk1BVF8xNlBDTV9JTlRFUkxFQVZFRDsKKyAgICBtQ29uZmlnLT5hYWNQbHVzRW5hYmxlZCA9IDE7CisKKyAgICAvLyBUaGUgc29mdHdhcmUgZGVjb2RlciBkb2Vzbid0IHByb3Blcmx5IHN1cHBvcnQgbW9ubyBvdXRwdXQgb24KKyAgICAvLyBBQUNwbHVzIGZpbGVzLiBBbHdheXMgb3V0cHV0IHN0ZXJlby4KKyAgICBtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHMgPSAyOworCisgICAgVUludDMyIG1lbVJlcXVpcmVtZW50cyA9IFBWTVA0QXVkaW9EZWNvZGVyR2V0TWVtUmVxdWlyZW1lbnRzKCk7CisgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKworICAgIEludCBlcnIgPSBQVk1QNEF1ZGlvRGVjb2RlckluaXRMaWJyYXJ5KG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZXJyICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgTVA0IGF1ZGlvIGRlY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBQUM6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWFjUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisgICAgICAgICAgICBhYWNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7CisgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyA9IDA7CisgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUNFUnRvb2xzID0gMDsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1Byb2ZpbGUgPSBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbjsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1N0cmVhbUZvcm1hdCA9IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKKyAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUNoYW5uZWxNb2RlID0gT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5GcmFtZUxlbmd0aCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkNoYW5uZWxzID0gbUNvbmZpZy0+ZW5jb2RlZENoYW5uZWxzOworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uRnJhbWVMZW5ndGggPSBtQ29uZmlnLT5mcmFtZUxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1Db25maWctPmRlc2lyZWRDaGFubmVsczsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFBQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKmFhY1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0QUFDOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID4gMDsKK30KKwordm9pZCBTb2Z0QUFDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBoZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKworICAgICAgICBJbnQgZXJyID0gUFZNUDRBdWRpb0RlY29kZXJDb25maWcobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgICAgICBpZiAoZXJyICE9IE1QNEFVREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKKworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOworCisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxJbnQxNiAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworCisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXJfcGx1cyA9ICZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzIwNDhdOworICAgICAgICBtQ29uZmlnLT5yZXBvc2l0aW9uRmxhZyA9IGZhbHNlOworCisgICAgICAgIEludDMyIHByZXZTYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgIEludCBkZWNvZGVyRXJyID0gUFZNUDRBdWRpb0RlY29kZUZyYW1lKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKKyAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZworICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMikgeworICAgICAgICAgICAgTE9HVigiYXVkaW8vZXh0ZW5kZWQgYXVkaW8gb2JqZWN0IHR5cGU6ICVkICsgJWQiLAorICAgICAgICAgICAgICAgIG1Db25maWctPmF1ZGlvT2JqZWN0VHlwZSwgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUpOworICAgICAgICAgICAgTE9HVigiYWFjKyB1cHNhbXBsaW5nIGZhY3RvcjogJWQgZGVzaXJlZCBjaGFubmVsczogJWQiLAorICAgICAgICAgICAgICAgIG1Db25maWctPmFhY1BsdXNVcHNhbXBsaW5nRmFjdG9yLCBtQ29uZmlnLT5kZXNpcmVkQ2hhbm5lbHMpOworCisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1VcHNhbXBsaW5nRmFjdG9yID0gbUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3I7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgb24gdGhlIHNhbXBsaW5nIHJhdGUgdG8gc2VlIHdoZXRoZXIgaXQgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IHByZXZTYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiU2FtcGxlIHJhdGUgd2FzICVkIEh6LCBidXQgbm93IGlzICVkIEh6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGhvbGQgb250byB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3aWxsIGRlY29kZQorICAgICAgICAgICAgICAgICAgICAvLyBpdCBhZ2FpbiBvbmNlIHRoZSBvdXRwdXQgcG9ydCBoYXMgYmVlbiByZWNvbmZpZ3VyZWQuCisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAgLy8gbUlucHV0QnVmZmVyQ291bnQgPT0gMgorICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnLT5leHRlbmRlZEF1ZGlvT2JqZWN0VHlwZSA9PSBNUDRBVURJT19BQUNfTEMgfHwKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUgPT0gTVA0QVVESU9fTFRQKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVXBzYW1wbGluZ0ZhY3RvciA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RyZWFtIHR1cm5zIG91dCB0byBiZSBub3QgYWFjUGx1cyBtb2RlIGFueXdheQorICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygiRGlzYWJsZSBBQUMrL2VBQUMrIHNpbmNlIGV4dGVuZGVkIGF1ZGlvIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+ZXh0ZW5kZWRBdWRpb09iamVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1VcHNhbXBsaW5nRmFjdG9yID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFhY1BsdXMgbW9kZSBkb2VzIG5vdCBidXkgdXMgYW55dGhpbmcsIGJ1dCB0byBjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQ1BVIGxvYWQgdG8gaW5jcmVhc2UsIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gYSBoYWxmIHNwZWVkIG9mIGRlY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJEaXNhYmxlIEFBQysvZUFBQysgc2luY2UgdXBzYW1wbGluZyBmYWN0b3IgaXMgMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgIG1Db25maWctPmZyYW1lTGVuZ3RoICogc2l6ZW9mKGludDE2X3QpICogbUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzOworCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IE1QNEFVREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIENIRUNLX0xFKG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworCisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLAorICAgICAgICAgICAgICAgICBkZWNvZGVyRXJyKTsKKworICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgMCwgbnVtT3V0Qnl0ZXMpOworCisgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBpZiAobVVwc2FtcGxpbmdGYWN0b3IgPT0gMikgeworICAgICAgICAgICAgaWYgKG1Db25maWctPmRlc2lyZWRDaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzEwMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsyMDQ4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtT3V0Qnl0ZXMgKiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bU91dEJ5dGVzICo9IDI7CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1PdXRCeXRlczsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzCisgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworCisgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ICs9IG1Db25maWctPmZyYW1lTGVuZ3RoICogbVVwc2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgIH0KK30KKwordm9pZCBTb2Z0QUFDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICAgICAgUFZNUDRBdWRpb0RlY29kZXJSZXNldEJ1ZmZlcihtRGVjb2RlckJ1Zik7CisgICAgfQorfQorCit2b2lkIFNvZnRBQUM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QUFDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzZmQyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfQUFDX0hfCisKKyNkZWZpbmUgU09GVF9BQUNfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworc3RydWN0IHRQVk1QNEF1ZGlvRGVjb2RlckV4dGVybmFsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QUFDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBQUMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBQUMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNAorICAgIH07CisKKyAgICB0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKKyAgICB2b2lkICptRGVjb2RlckJ1ZjsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgbVVwc2FtcGxpbmdGYWN0b3I7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFBQyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfQUFDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL3Nicl9kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9zYnJfZGVjLmNwcAppbmRleCA4ZmNjM2NlLi44NTE5YjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL3Nicl9kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvc2JyX2RlYy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBQYWNrZXRWaWRlbwogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNDQ3LDcgKzQ0NywxMiBAQAogCiAgICAgICAgICAgICBpZiAoeG92ZXJCYW5kID4gc2JyRGVjLT5oaWdoU3ViYmFuZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4b3ZlckJhbmQgPSAzMjsgLyogZXJyb3IgY29uZGl0aW9uLCBkZWZhdWx0IHRvIHVwc2FtcGxpbmcgbW9kZSAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZXJyb3IgY29uZGl0aW9uLCBkZWZhdWx0IHRvIHVwc2FtcGxpbmcgbW9kZQorICAgICAgICAgICAgICAgICAqIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIGJhbmRzIGZvciB4b3ZlciBkb2VzCisgICAgICAgICAgICAgICAgICogbm90IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGhpZ2ggZnJlcSBiYW5kcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB4b3ZlckJhbmQgPSAoc2JyRGVjLT5oaWdoU3ViYmFuZCA+IDMyKT8gMzI6IHNickRlYy0+aGlnaFN1YmJhbmQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG0gPSBzYnJEZWMtPmJ1ZlJlYWRPZmZzICsgaTsgICAgLyogIDIgKyBpICovCkBAIC01NTgsMTggKzU2MywyMiBAQAogICAgICAgICAvKgogICAgICAgICAgKiAgU2V0IENpcmN1bGFyIGJ1ZmZlciBmb3IgUFMgaHlicmlkIGFuYWx5c2lzCiAgICAgICAgICAqLworCisgICAgICAgIGludDMyX3QgKnB0X3RlbXAgPSAmc2NyYXRjaF9tZW1bMl1bMzJdOworCiAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICB7CiAKLSAgICAgICAgICAgIHB2X21lbW1vdmUoJnNjcmF0Y2hfbWVtWzJdWzMyICsgaiAgICAgXSwKKyAgICAgICAgICAgIHB2X21lbW1vdmUoJnB0X3RlbXBbIGpdLAogICAgICAgICAgICAgICAgICAgICAgICBoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+aEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWxbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIEhZQlJJRF9GSUxURVJfTEVOR1RIX21fMSpzaXplb2YoKmhQYXJhbWV0cmljU3RlcmVvRGVjLT5oSHlicmlkLT5tUW1mQnVmZmVyUmVhbCkpOwotICAgICAgICAgICAgcHZfbWVtbW92ZSgmc2NyYXRjaF9tZW1bMl1bMzIgKyBqICsgNDRdLAorICAgICAgICAgICAgcHZfbWVtbW92ZSgmcHRfdGVtcFsgaiArIDQ0XSwKICAgICAgICAgICAgICAgICAgICAgICAgaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnW2ldLAogICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfRklMVEVSX0xFTkdUSF9tXzEqc2l6ZW9mKCpoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+aEh5YnJpZC0+bVFtZkJ1ZmZlckltYWcpKTsKICAgICAgICAgICAgIGogKz0gODg7CiAgICAgICAgIH0KIAorCiAgICAgICAgIHB2X21lbXNldCgodm9pZCAqKSZxbWZfUFNfZ2VuZXJhdGVkX1JlYWxbaFBhcmFtZXRyaWNTdGVyZW9EZWMtPnVzYl0sCiAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgKDY0IC0gaFBhcmFtZXRyaWNTdGVyZW9EZWMtPnVzYikqc2l6ZW9mKCpxbWZfUFNfZ2VuZXJhdGVkX1JlYWwpKTsKQEAgLTYyNiwxOSArNjM1LDIzIEBACiAgICAgICAgICAqICBTYXZlIENpcmN1bGFyIGJ1ZmZlciBoaXN0b3J5IHVzZWQgb24gUFMgaHlicmlkIGFuYWx5c2lzCiAgICAgICAgICAqLwogCisKKyAgICAgICAgcHRfdGVtcCA9ICZzY3JhdGNoX21lbVsyXVs2NF07CisKICAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIHB2X21lbW1vdmUoaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJSZWFsW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAmc2NyYXRjaF9tZW1bMl1bIDY0ICsgaiAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnB0X3RlbXBbIGpdLAogICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfRklMVEVSX0xFTkdUSF9tXzEqc2l6ZW9mKCpoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+aEh5YnJpZC0+bVFtZkJ1ZmZlclJlYWwpKTsKIAogICAgICAgICAgICAgcHZfbWVtbW92ZShoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+aEh5YnJpZC0+bVFtZkJ1ZmZlckltYWdbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoX21lbVsyXVsgNjQgKyBqICsgNDRdLAorICAgICAgICAgICAgICAgICAgICAgICAmcHRfdGVtcFsgaiArIDQ0XSwKICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEX0ZJTFRFUl9MRU5HVEhfbV8xKnNpemVvZigqaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmhIeWJyaWQtPm1RbWZCdWZmZXJJbWFnKSk7CiAKICAgICAgICAgICAgIGogKz0gODg7CiAgICAgICAgIH0KIAorCiAgICAgICAgIHB2X21lbW1vdmUoaEZyYW1lRGF0YS0+ViwgJmNpcmN1bGFyX2J1ZmZlcl9zWzBdLCAxMTUyKnNpemVvZigqY2lyY3VsYXJfYnVmZmVyX3MpKTsKIAogICAgICAgICAvKgpAQCAtNzQ2LDcgKzc1OSwxMiBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHhvdmVyQmFuZCA+IHNickRlYy0+aGlnaFN1YmJhbmQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4b3ZlckJhbmQgPSAzMjsgLyogZXJyb3IgY29uZGl0aW9uLCBkZWZhdWx0IHRvIHVwc2FtcGxpbmcgbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBlcnJvciBjb25kaXRpb24sIGRlZmF1bHQgdG8gdXBzYW1wbGluZyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAqIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbnVtYmVyIG9mIGJhbmRzIGZvciB4b3ZlciBkb2VzCisgICAgICAgICAgICAgICAgICAgICAqIG5vdCBleGNlZWQgdGhlIG51bWJlciBvZiBoaWdoIGZyZXEgYmFuZHMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB4b3ZlckJhbmQgPSAoc2JyRGVjLT5oaWdoU3ViYmFuZCA+IDMyKT8gMzI6IHNickRlYy0+aGlnaFN1YmJhbmQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKaW5kZXggZTRmZjEyOC4uMGJmZjUyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCkBAIC04NCw3ICs4NCw3IEBACiAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICBwYXJhbXMuYml0UmF0ZSA9IG1CaXRSYXRlOwogICAgIHBhcmFtcy5uQ2hhbm5lbHMgPSBtQ2hhbm5lbHM7Ci0gICAgcGFyYW1zLmFkdHNVc2VkID0gMDsgIC8vIEZvciBNUDQgZmlsZSwgZG9uJ3QgdXNlIGFkdHMgZm9ybWF0JAorICAgIHBhcmFtcy5hZHRzVXNlZCA9IDA7ICAvLyBXZSBhZGQgYWR0cyBoZWFkZXIgaW4gdGhlIGZpbGUgd3JpdGVyIGlmIG5lZWRlZC4KICAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICAmcGFyYW1zKSkgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKaW5kZXggMzc4Mjg1My4uZjljYzZhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tawpAQCAtMiw3ICsyLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogaW5jbHVkZSBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBMT0NBTF9TUkNfRklMRVMgOj0gYmFzaWNfb3AvYmFzaWNvcDIuYyBiYXNpY19vcC9vcGVyXzMyYi5jCiAKQEAgLTU5LDcgKzU5LDcgQEAKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMKaW5kZXggYzdiMjYxNi4uMmVhOTQ0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jCkBAIC0yOSwxMSArMjksMTEgQEAKICNpbmNsdWRlCQkiY21uTWVtb3J5LmgiCiAKICNkZWZpbmUgIFZPX0FBQ19FX09VVFBVVAkgIDEKLSNkZWZpbmUgUkVBRF9TSVpFCSgxMDI0KjgpCisjZGVmaW5lIFJFQURfU0laRQkoMTAyNCo4KQkKIHVuc2lnbmVkIGNoYXIgb3V0QnVmWzEwMjQqOF07CiB1bnNpZ25lZCBjaGFyIGluQnVmW1JFQURfU0laRV07CiAKLWNvbnN0IGNoYXIqIEhlbHBTdHJpbmcgPQorY29uc3QgY2hhciogSGVscFN0cmluZyA9IAogIlZpc3VhbE9uIEFBQyBlbmNvZGVyIFVzYWdlOlxuIgogInZvQUFDRW5jVGVzdCAtaWYgPGlucHV0ZmlsZS5wY20+IC1vZiA8b3V0cHV0ZmlsZS5hYWM+IC1zciA8c2FtcGxlcmF0ZT4gLWNoIDxjaGFubmVsPiAtYnIgPGJpdHJhdGU+IC1hZHRzIDxhZHRzPiBcbiIKICItaWYgaW5wdXQgZmlsZSBuYW1lIFxuIgpAQCAtNDksNyArNDksNyBAQAogewogCS8vIG5vdGljZSB0aGF0OgogCS8vIGJpdFJhdGUvbkNoYW5uZWxzID4gODAwMAotCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgMTYwMDAwCisJLy8gYml0UmF0ZS9uQ2hhbm5lbHMgPCAxNjAwMDAgCiAJLy8gYml0UmF0ZS9uQ2hhbm5lbHMgPCBzYW1wbGVSYXRlKjYKIAlwYXJhbS0+YWR0c1VzZWQgPSAxOwogCXBhcmFtLT5iaXRSYXRlID0gMDsKQEAgLTY5LDcgKzY5LDcgQEAKIAkJewogCQkJYXJndisrOwogCQkJYXJnYy0tOwotCQkJKmlucHV0X2ZpbGVuYW1lID0gKmFyZ3Y7CisJCQkqaW5wdXRfZmlsZW5hbWUgPSAqYXJndjsgCiAJCX0KIAkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1vZiIpKQogCQl7CkBAIC0xODgsNyArMTg4LDcgQEAKIAl1c2VEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOwogCXVzZURhdGEubWVtRGF0YSA9IChWT19QVFIpKCZtb3Blcik7CiAJLy8gb3BlbiBlbmNvZGVyIGRsbDsKLQloYW5kbGUgPSBkbG9wZW4oIi9kYXRhL2xvY2FsL3RtcC9saWJ2b0FBQ0VuY3Y3LnNvIiwgUlRMRF9OT1cpOworCWhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHQuc28iLCBSVExEX05PVyk7CiAJaWYoaGFuZGxlID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCmluZGV4IDlmMTY4Y2IuLmJhM2Y0ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCkBAIC0xLDI0ICsxLDI1IEBACiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTIDo9IAlBQUNfRV9TQU1QTEVTLmMKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQUFDX0VfU0FNUExFUy5jIFwKKyAgICAuLi8uLi9jb21tb24vY21uTWVtb3J5LmMKIAotTE9DQUxfU1JDX0ZJTEVTICs9IAlcCi0JLi4vLi4vLi4vQ29tbW9uL2Ntbk1lbW9yeS5jCitMT0NBTF9DRkxBR1MgKz0gJChWT19DRkxBR1MpCiAKLUxPQ0FMX01PRFVMRSA6PSBUZXN0dm9BQUNFbmMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRSA6PSBBQUNFbmNUZXN0CiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidm9BQUNFbmMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICBsaWJkbAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKExPQ0FMX1BBVEgpLyBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9Db21tb24gXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vSW5jbHVkZSBcCi0KLUxPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKKyAgICAkKExPQ0FMX1BBVEgpLyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi9jb21tb24gXAorICAgICQoTE9DQUxfUEFUSCkvLi4vLi4vY29tbW9uL2luY2x1ZGUgXAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVjNDJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjcKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gZXhlCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LgotIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlCi1WT01NOj0gI0FSTVY1RQotCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PSB2b0FBQ0VuY1Rlc3R2NwotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5tawotaW5jbHVkZSAuLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsKLQotIyBkZXBlbmRlbnQgbGlicmFyaWVzLgotVk9ERVBMSUJTOj0tbGRsCi0KLSMgbW9kdWxlIHNvdXJjZQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUKLWluY2x1ZGUgLi4vbXMubWsKLQotCi0jIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQKLVZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi9SZWxlYXNlLwotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL21zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjI1NWU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9tcy5taworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMvKgotIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jKioKLSMqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jKioKLSMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jKioKLSMqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jKi8KLQotIyBwbGVhc2UgbGlzdCBhbGwgb2JqZWN0cyBuZWVkZWQgYnkgeW91ciB0YXJnZXQgaGVyZQotT0JKUzo9QUFDX0VfU0FNUExFUy5vCWNtbk1lbW9yeS5vCi0KLSMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZQotVk9TUkNESVI6PS4uLyAuLi8uLi8uLi8uLi9pbmNsdWRlICAuLi8uLi8uLi8uLi9Db21tb24KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2RvaXQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2RvaXQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjQzNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Ub29scy9kb2l0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi1WRVJCT1NFOj1ACi0KLQotVk9NVCA/PSBsaWIKLQotaWZlcSAoJChWT01UKSwgbGliKQotTElCX1NUQVRJQz0kKFZPVEFSR0VUKS5hCi1MSUJfRFlOQU1JQz0kKFZPVEFSR0VUKS5zbwotZW5kaWYKLQotaWZlcSAoJChWT01UKSwgZXhlKQotVEFSR0VUPSQoVk9UQVJHRVQpCi1lbmRpZgotCi1DRkxBR1M9JChWT0NGTEFHUykgJChhZGRwcmVmaXggLUksICQoVk9TUkNESVIpKQotQ1BQRkxBR1M9JChWT0NQUEZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpCi1pZm5lcSAoJChWT1RUKSwgcGMpCi1BU0ZMQUdTPSQoVk9BU0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpCi1lbmRpZgotCi1MREZMQUdTOj0kKFZPTERGTEFHUykKLVZPVEVERVBTKz0kKFZPREVQTElCUykKLVZPVExERVBTKz0kKFZPREVQTElCUykKLVZPU1RDTElCUyA/PQotCi12cGF0aCAlLmMgJChWT1NSQ0RJUikKLXZwYXRoICUuY3BwICQoVk9TUkNESVIpCi1pZm5lcSAoJChWT1RUKSwgcGMpCi12cGF0aCAlLnMgJChWT1NSQ0RJUikKLWVuZGlmCi0KLWlmZXEgKCQoVk9UVCksIHBjKQotQkxURElSUz0kKFZPUkVMRElSKS9MaW51eC9zdGF0aWMKLUJMVERJUkQ9JChWT1JFTERJUikvTGludXgvc2hhcmVkCi1lbHNlCi1CTFRESVJTPSQoVk9SRUxESVIpL0dvb2dsZS8kKFZPTkopL2xpYi8kKFZPVFQpCi1CTFRESVJEPSQoVk9SRUxESVIpL0dvb2dsZS8kKFZPTkopL3NvLyQoVk9UVCkKLWVuZGlmCi0KLQotLlBSRUNJT1VTOiAkKE9CSkRJUikvJS5vCi0KLWlmZXEgKCQoVk9NVCksIGxpYikKLWFsbDogbWtkaXJzICQoTElCX1NUQVRJQykgJChMSUJfRFlOQU1JQykKLW1rZGlyczogJChPQkpESVIpICQoQkxURElSUykgJChCTFRESVJEKQotZWxzZQotYWxsOiBta2RpcnMgJChUQVJHRVQpCi1ta2RpcnM6ICQoT0JKRElSKQotZW5kaWYKLQotJChPQkpESVIpOgotCUBpZiB0ZXN0ICEgLWQgJEA7IHRoZW4gXAotCQlta2RpciAtcCAkQDsgXAotCWZpOwotCi1pZmVxICgkKFZPTVQpLCBsaWIpCi0kKEJMVERJUlMpOgotCUBpZiB0ZXN0ICEgLWQgJEA7IHRoZW4gXAotCQlta2RpciAtcCAkQDsgXAotCWZpOwotJChCTFRESVJEKToKLQlAaWYgdGVzdCAhIC1kICRAOyB0aGVuIFwKLQkJbWtkaXIgLXAgJEA7IFwKLQlmaTsKLWVuZGlmCi0KLQotaWZlcSAoJChWT01UKSwgbGliKQotJChMSUJfU1RBVElDKTokKE9CSlMpCi0JJChBUikgY3IgJEAgJChPQkpESVIpLyoubyAkKFZPU1RDTElCUykKLQkkKFJBTkxJQikgJEAKLWlmbmVxICgkKFZPREJHKSwgeWVzKQotCSMkKFNUUklQKSAkQAotZW5kaWYKLQotJChMSUJfRFlOQU1JQyk6JChPQkpTKQotCSQoR0cpICQoTERGTEFHUykgLW8gJEAgJChPQkpESVIpLyoubyAtV2wsLS13aG9sZS1hcmNoaXZlICQoVk9TVENMSUJTKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlICQoVk9UTERFUFMpCi1pZm5lcSAoJChWT0RCRyksIHllcykKLQkJJChTVFJJUCkgJEAKLWVuZGlmCi0KLWVsc2UKLQotJChUQVJHRVQpOiQoT0JKUykKLQkkKEdHKSAkKExERkxBR1MpIC1vICRAICQoT0JKRElSKS8qLm8gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFZPU1RDTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAkKFZPVEVERVBTKQotaWZuZXEgKCQoVk9EQkcpLCB5ZXMpCi0JJChTVFJJUCkgJEAKLWVuZGlmCi0KLWVuZGlmCi0KLQotLlNVRkZJWEVTOiAuYyAuY3BwIC5zIC5vCi0uYy5vOgotCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICQoT0JKRElSKS8kQCAtYyAkPAotIyUuYzokKE9CSkRJUikvJS5vCi0jCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQ8Ci0uY3BwLm86Ci0JJChWRVJCT1NFKSAkKEdHKSAkKENQUEZMQUdTKSAtbyAkKE9CSkRJUikvJEAgLWMgJDwKLWlmbmVxICgkKFZPVFQpLCBwYykKLS5zLm86Ci0JJChWRVJCT1NFKSAkKEFTKSAkKEFTRkxBR1MpIC1vICQoT0JKRElSKS8kQCAkPAotZW5kaWYKLQotCi0uUEhPTlk6IGNsZWFuIGRldmVsCi1jbGVhbjoKLWlmZXEgKCQoVk9NVCksIGxpYikKLQktcm0gLWZyICQoT0JKRElSKSAuKi5zdyogJChWT1RBUkdFVCkuKgotZWxzZQotCS1ybSAtZnIgJChPQkpESVIpIC4qLnN3KiAkKFZPVEFSR0VUKQotZW5kaWYKLQotZGV2ZWw6Ci0JY3AgLWEgJChMSUJfU1RBVElDKSAkKEJMVERJUlMpCi0JY3AgLWEgJChMSUJfRFlOQU1JQykgJChCTFRESVJEKQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2VjbGFpci5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWRkOWMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi0jIHNwZWNpYWwgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGJ1aWxkaW5nCi1WT1BSRURFRj0tRExJTlVYIC1EX0xJTlVYCi0KLVZPUFJKID89Ci1WT05KID89IGVjbGFpcgotVk9UVCA/PSB2NgotIyBjb250cm9sIHRoZSB2ZXJzaW9uIHRvIHJlbGVhc2Ugb3V0Ci0jIGF2YWlsYWJsZTogZXZhKGV2YWx1YXRpb24pLCByZWwocmVsZWFzZSkKLVZPVkVSPQotaWZlcSAoJChWT1ZFUiksIGV2YSkKLVZPUFJFREVGKz0tRF9fVk9WRVJfRVZBX18KLWVuZGlmCi0KLSMgZm9yIGRlYnVnIG9yIG5vdDogeWVzIGZvciBkZWJ1ZywgYW55IG90aGVyIGZvciByZWxlYXNlCi1WT0RCRz89eWUKLQotIyBmb3IgZGV0ZWN0aW5nIG1lbW9yeSBsZWFrCi1WT0RNTD0KLWlmZXEgKCQoVk9ETUwpLCB5ZXMpCi1WT1BSRURFRis9LURETUVNTEVBSwotZW5kaWYKLQotVk9QUkVERUYrPS1EX19WT1RUX0FSTV9fIC1EX19WT05KX0VDTEFJUl9fCi1UQ1JPT1RQQVRIOj0vb3B0L2VjbGFpcgotR0NDVkVSOj00LjQuMAotVENQQVRIOj0kKFRDUk9PVFBBVEgpL3ByZWJ1aWx0L2xpbnV4LXg4Ni90b29sY2hhaW4vYXJtLWVhYmktJChHQ0NWRVIpCi1DQ1RQUkU6PSQoVENQQVRIKS9iaW4vYXJtLWVhYmktCi1BUzo9JChDQ1RQUkUpYXMKLUFSOj0kKENDVFBSRSlhcgotTk06PSQoQ0NUUFJFKW5tCi1DQzo9JChDQ1RQUkUpZ2NjCi1HRzo9JChDQ1RQUkUpZysrCi1MRDo9JChDQ1RQUkUpbGQKLVNJWkU6PSQoQ0NUUFJFKXNpemUKLVNUUklQOj0kKENDVFBSRSlzdHJpcAotUkFOTElCOj0kKENDVFBSRSlyYW5saWIKLU9CSkNPUFk6PSQoQ0NUUFJFKW9iamNvcHkKLU9CSkRVTVA6PSQoQ0NUUFJFKW9iamR1bXAKLVJFQURFTEY6PSQoQ0NUUFJFKXJlYWRlbGYKLVNUUklOR1M6PSQoQ0NUUFJFKXN0cmluZ3MKLQotIyB0YXJnZXQgcHJvZHVjdCBkZXBlbmRjeQotIyBhdmFpbGFibGU6IGRyZWFtLCBnZW5lcmljCi1WT1RQOj1zYXBwaGlyZS1vcGVuCi1DQ1RMSUI6PSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL2xpYgotQ0NUSU5DOj0tSSQoVENST09UUEFUSCkvc3lzdGVtL2NvcmUvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9oYXJkd2FyZS9yaWwvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2hhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZGFsdmlrL2xpYm5hdGl2ZWhlbHBlci9pbmNsdWRlL25hdGl2ZWhlbHBlciBcCi0JLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIFwKLQktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2xpYnMvYXVkaW9mbGluZ2VyIFwKLQktSSQoVENST09UUEFUSCkvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYmMvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0JLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibS9pbmNsdWRlIFwKLQktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYm0vaW5jbHVkZS9hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlidGhyZWFkX2RiL2luY2x1ZGUgXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibS9hcm0gXAotCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibSBcCi0JLUkkKFRDUk9PVFBBVEgpL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZQotCSMtSSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlibV9pbnRlcm1lZGlhdGVzCi0KLUNDVENGTEFHUzo9LW1zb2Z0LWZsb2F0IC1tdGh1bWItaW50ZXJ3b3JrIC1mbm8tZXhjZXB0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mdW53aW5kLXRhYmxlcyAtZnN0YWNrLXByb3RlY3RvciAtZm5vLXNob3J0LWVudW1zIC1mbWVzc2FnZS1sZW5ndGg9MCAtZmlubGluZS1mdW5jdGlvbnMgLWZpbmxpbmUtbGltaXQ9NjAwIC1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSAtZmdjc2UtYWZ0ZXItcmVsb2FkIC1mcmVydW4tY3NlLWFmdGVyLWxvb3AgLWZyZW5hbWUtcmVnaXN0ZXJzIC1mc3RyaWN0LWFsaWFzaW5nIC1mdW5zd2l0Y2gtbG9vcHMKLSMtZndpZGUtZXhlYy1jaGFyc2V0PWNoYXJzZXQ9VVRGLTMyCi0KLSMgZm9yIHRhcmdldCBleGUKLVRFTERGTEFHUzo9LW5vc3RkbGliIC1CZHluYW1pYyAtV2wsLVQsJChUQ1JPT1RQQVRIKS9idWlsZC9jb3JlL2FybWVsZi54IC1XbCwtZHluYW1pYy1saW5rZXIsL3N5c3RlbS9iaW4vbGlua2VyIC1XbCwtLWdjLXNlY3Rpb25zIC1XbCwteixub2NvcHlyZWxvYyAtV2wsLS1uby11bmRlZmluZWQgLVdsLC1ycGF0aC1saW5rPSQoQ0NUTElCKSAtTCQoQ0NUTElCKQotCi1WT1RFREVQUzo9JChDQ1RMSUIpL2NydGJlZ2luX2R5bmFtaWMubyAkKENDVExJQikvY3J0ZW5kX2FuZHJvaWQubyAkKFRDUEFUSCkvbGliL2djYy9hcm0tZWFiaS8kKEdDQ1ZFUikvaW50ZXJ3b3JrL2xpYmdjYy5hIC1sYyAtbG0KLQotIyBmb3IgdGFyZ2V0IGxpYgotVExMREZMQUdTOj0tbm9zdGRsaWIgLVdsLC1ULCQoVENST09UUEFUSCkvYnVpbGQvY29yZS9hcm1lbGYueHNjIC1XbCwtLWdjLXNlY3Rpb25zIC1XbCwtc2hhcmVkLC1Cc3ltYm9saWMgLUwkKENDVExJQikgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAtV2wsLS1uby11bmRlZmluZWQgJChUQ1BBVEgpL2xpYi9nY2MvYXJtLWVhYmkvJChHQ0NWRVIpL2ludGVyd29yay9saWJnY2MuYQotCi1WT1RMREVQUzo9LWxtIC1sYwotCi0KLWlmZXEgKCQoVk9UVCksIHY0KQotVk9DRkxBR1M6PS1tdHVuZT1hcm05dGRtaSAtbWFyY2g9YXJtdjR0Ci1WT0FTRkxBR1M6PS1tYXJjaD1hcm12NHQgLW1mcHU9c29mdGZwYQotZW5kaWYKLQotaWZlcSAoJChWT1RUKSwgdjUpCi1WT0NGTEFHUzo9LW1hcmNoPWFybXY1dGUKLVZPQVNGTEFHUzo9LW1hcmNoPWFybXY1dGUgLW1mcHU9dmZwCi1lbmRpZgotCi1pZmVxICgkKFZPVFQpLCB2NXgpCi1WT0NGTEFHUzo9LW1hcmNoPWFybXY1dGUgLW10dW5lPXhzY2FsZQotVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjV0ZSAtbWZwdT12ZnAKLWVuZGlmCi0KLWlmZXEgKCQoVk9UVCksIHY2KQotI1ZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjYgLW10dW5lPWFybTExMzZqZi1zCi0jVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjYKLVZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjZqIC1tdHVuZT1hcm0xMTM2amYtcyAtbWZwdT12ZnAgLW1mbG9hdC1hYmk9c29mdGZwIC1tYXBjcyAtbXRwY3MtbGVhZi1mcmFtZSAtbWxvbmctY2FsbHMKLVZPQVNGTEFHUzo9LW1hcmNoPWFybXY2aiAtbWNwdT1hcm0xMTM2amYtcyAtbWZwdT1hcm0xMTM2amYtcyAtbWZsb2F0LWFiaT1zb2Z0ZnAgLW1hcGNzLWZsb2F0IC1tYXBjcy1yZWVudHJhbnQKLWVuZGlmCi0KLSMKLSMgZ2xvYmFsIGxpbmsgb3B0aW9ucwotVk9MREZMQUdTOj0tV2wsLXgsLVgsLS1hcy1uZWVkZWQKLQotCi1pZmVxICgkKFZPVFQpLCB2NykKLVZPQ0ZMQUdTKz0tbWFyY2g9YXJtdjctYSAtbXR1bmU9Y29ydGV4LWE4IC1tZnB1PW5lb24gLW1mbG9hdC1hYmk9c29mdGZwCi1WT0FTRkxBR1MrPS1tYXJjaD1hcm12Ny1hIC1tY3B1PWNvcnRleC1hOCAtbWZwdT1uZW9uIC1tZmxvYXQtYWJpPXNvZnRmcAotVk9MREZMQUdTKz0tV2wsLS1maXgtY29ydGV4LWE4Ci1lbmRpZgotCi0jZ2xvYmFsIGNvbXBpbGluZyBvcHRpb25zIGZvciBBUk0gdGFyZ2V0Ci1pZm5lcSAoJChWT1RUKSwgcGMpCi1WT0FTRkxBR1MrPS0tc3RyaXAtbG9jYWwtYWJzb2x1dGUgLVIKLWVuZGlmCi0KLQotaWZlcSAoJChWT0RCRyksIHllcykKLVZPQ0ZMQUdTKz0tRF9ERUJVRyAtZwotZWxzZQotVk9DRkxBR1MrPS1ETkRFQlVHIC1PMwotZW5kaWYKLQotVk9DRkxBR1MrPSQoVk9QUkVERUYpICQoVk9NTSkgLVdhbGwgLWZzaWduZWQtY2hhciAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLWxlYWRpbmctdW5kZXJzY29yZSAtZnBpYyAtZlBJQyAtcGlwZSAtZnRyYWNlciAtZmZvcmNlLWFkZHIgLWZuby1ib3VuZHMtY2hlY2sgIy1mdmlzaWJpbGl0eT1oaWRkZW4gIy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiAjIy1mdHJlZS1sb29wLWxpbmVhciAgLW10aHVtYiAtbm9zdGRpbmMgIC1kRCAtZnByZWZldGNoLWxvb3AtYXJyYXlzCi0KLQotaWZuZXEgKCQoVk9UVCksIHBjKQotVk9DRkxBR1MrPSQoQ0NUQ0ZMQUdTKSAkKENDVElOQykKLVZPQ1BQRkxBR1M6PS1mbm8tcnR0aSAkKFZPQ0ZMQUdTKQotCi1pZmVxICgkKFZPTVQpLCBleGUpCi1WT0xERkxBR1MrPSQoVEVMREZMQUdTKQotZW5kaWYKLQotaWZlcSAoJChWT01UKSwgbGliKQotVk9MREZMQUdTKz0kKFRMTERGTEFHUykKLWVuZGlmCi1lbHNlCi1WT0NQUEZMQUdTOj0kKFZPQ0ZMQUdTKQotaWZlcSAoJChWT01UKSwgbGliKQotVk9MREZMQUdTKz0tc2hhcmVkCi1lbmRpZgotZW5kaWYKLQotaWZlcSAoJChWT0RCRyksIHllcykKLSNWT0xERkxBR1M6PQotZW5kaWYKLQotIyB3aGVyZSB0byBwbGFjZSBvYmplY3QgZmlsZXMKLU9CSkRJUj1vYmoKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oCmluZGV4IGVmM2MzMWIuLjgyOTE2ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKQEAgLTkxLDcgKzkxLDcgQEAKICNlbHNlCiBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7CiAjZW5kaWYKLQorICAgIAogLyogTG9uZyBzdWIsICAgICAgICAyICovCiAjaWYgKExfU1VCX0lTX0lOTElORSkKIF9faW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKQEAgLTExOSw3ICsxMTksNyBAQAogI2Vsc2UKIFdvcmQxNiBhZGQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7CiAjZW5kaWYKLQorICAgIAogLyogU2hvcnQgc3ViLCAgICAgICAgICAgMSAgICovCiAjaWYgKFNVQl9JU19JTkxJTkUpCiBfX2lubGluZSBXb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7CkBAIC0yMjcsNDggKzIyNyw0OCBAQAogI2lmIEFSTVY0X0lOQVNNCiBfX2lubGluZSBXb3JkMzIgQVNNX0xfc2hyKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQogewotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiTU9WICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgJVt2YXIyXSBcbiIKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAorCQkiTU9WICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgJVt2YXIyXSBcbiIgCiAJCTpbcmVzdWx0XSI9ciIocmVzdWx0KQogCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKKwkJKTsgCisJcmV0dXJuIHJlc3VsdDsJCiB9Ci0KKyAKIF9faW5saW5lIFdvcmQzMiBBU01fTF9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCiB7Ci0JV29yZDMyIHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDMyIHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIk1PVglyMiwgJVtMX3ZhcjFdIFxuIgogCQkiTU9WCXIzLCAjMHg3ZmZmZmZmZlxuIgotCQkiTU9WCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXSBcbiIKKwkJIk1PVgklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl0gXG4iIAogCQkiVEVRCXIyLCAlW3Jlc3VsdF0sIEFTUiAlW3ZhcjJdXG4iCiAJCSJFT1JORSAgJVtyZXN1bHRdLHIzLHIyLEFTUiMzMVxuIgogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQogCQk6InIyIiwgInIzIgotCQkpOwotCXJldHVybiByZXN1bHQ7CisJCSk7IAorCXJldHVybiByZXN1bHQ7CQogfQogCiBfX2lubGluZSBXb3JkMzIgQVNNX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKIHsKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAogCQkiQ01QCSVbdmFyMl0sICMxNVxuIgogCQkiTU9WR0UgICVbdmFyMl0sICMxNVxuIgogCQkiTU9WCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgJVt2YXIyXVxuIgogCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci19CisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMikgCisJCSk7IAorCXJldHVybiByZXN1bHQ7CQorfSAKIAogX19pbmxpbmUgV29yZDMyIEFTTV9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCiB7Ci0JV29yZDMyIHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDMyIHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIkNNUAklW3ZhcjJdLCAjMTZcbiIKIAkJIk1PVkdFICAlW3ZhcjJdLCAjMTZcbiIKIAkJIk1PViAgICAlW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl1cbiIKQEAgLTI4MCw5ICsyODAsOSBAQAogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQogCQk6InIyIiwgInIzIgotCQkpOwotCXJldHVybiByZXN1bHQ7Ci19CisJCSk7IAorCXJldHVybiByZXN1bHQ7CQorfSAKICNlbmRpZgogCiAvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpAQCAtMzAwLDE3ICszMDAsMTcgQEAKIAkJIk1PVglyMywgIzFcbiIKIAkJIk1PVglyMiwlW0xfdmFyMV0sQVNSIzE1XG4iCiAJCSJSU0IJcjMsIHIzLCByMywgTFNMICMxNVxuIgotCQkiVEVRCXIyLCVbTF92YXIxXSxBU1IjMzFcbiIKKwkJIlRFUQlyMiwlW0xfdmFyMV0sQVNSIzMxXG4iCQogCQkiRU9STkUJJVtyZXN1bHRdLHIzLCVbTF92YXIxXSxBU1IjMzFcbiIKIAkJOltyZXN1bHRdIityIihyZXN1bHQpCiAJCTpbTF92YXIxXSJyIihMX3ZhcjEpCi0JCToicjIiLCAicjMiCisJCToicjIiLCAicjMiCQkJCiAJKTsKIAogCXJldHVybiByZXN1bHQ7CiAjZWxzZQogICAgIFdvcmQxNiB2YXJfb3V0OwotCisgICAgCiAgICAgLy92YXJfb3V0ID0gKExfdmFyMSA+IChXb3JkMzIpMFgwMDAwN2ZmZkwpID8gKE1BWF8xNikgOiAoKExfdmFyMSA8IChXb3JkMzIpMHhmZmZmODAwMEwpID8gKE1JTl8xNikgOiAoKFdvcmQxNilMX3ZhcjEpKTsKIAogICAgIGlmIChMX3ZhcjEgPiAwWDAwMDA3ZmZmTCkKQEAgLTQxOSwxMyArNDE5LDEzIEBACiBfX2lubGluZSBXb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKIHsKICNpZiBBUk1WNVRFX0xfTVVMVAotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIlFBREQgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICVbcmVzdWx0XSBcbiIKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAorCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIgCisJCSJRQUREICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAlW3Jlc3VsdF0gXG4iIAogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7CisJCSk7IAogCXJldHVybiByZXN1bHQ7CiAjZWxzZQogICAgIFdvcmQzMiBMX3Zhcl9vdXQ7CkBAIC00NDksMTQgKzQ0OSwxNCBAQAogX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCiB7CiAjaWYgQVJNVjVURV9MX01TVQotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAorCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIgCiAJCSJRQUREICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAlW3Jlc3VsdF0gXG4iCiAJCSJRU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjNdLCAlW3Jlc3VsdF1cbiIKIAkJOltyZXN1bHRdIityIihyZXN1bHQpCiAJCTpbTF92YXIzXSJyIihMX3ZhcjMpLCBbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMzIgTF92YXJfb3V0OwpAQCAtNDczLDEyICs0NzMsMTIgQEAKIF9faW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQogewogI2lmIEFSTVY1VEVfTF9TVUIKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAogCQkiUVNVQiAlW3Jlc3VsdF0sICVbTF92YXIxXSwgJVtMX3ZhcjJdXG4iCiAJCTpbcmVzdWx0XSIrciIocmVzdWx0KQogCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW0xfdmFyMl0iciIoTF92YXIyKQotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMzIgTF92YXJfb3V0OwpAQCAtNTg4LDkgKzU4OCw5IEBACiBfX2lubGluZSBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCiB7CiAjaWYgQVJNVjVURV9BREQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKLQkJIkFERCAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgorCVdvcmQzMiByZXN1bHQ7IAorCWFzbSB2b2xhdGlsZSggCisJCSJBREQgICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIgCiAJCSJNT1YgIHIzLCAjMHgxXG4iCiAJCSJNT1YgIHIyLCAlW3Jlc3VsdF0sIEFTUiAjMTVcbiIKIAkJIlJTQiAgcjMsIHIzLCByMywgTFNMLCAjMTVcbiIKQEAgLTU5OSw3ICs1OTksNyBAQAogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCiAJCToicjIiLCAicjMiCi0JCSk7CisJCSk7IAogCXJldHVybiByZXN1bHQ7CiAjZWxzZQogICAgIFdvcmQxNiB2YXJfb3V0OwpAQCAtNjE4LDE4ICs2MTgsMTggQEAKIF9faW5saW5lIFdvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQogewogI2lmIEFSTVY1VEVfU1VCCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDMyIHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIk1PViAgIHIzLCAjMVxuIgotCQkiU1VCICAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgorCQkiU1VCICAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgkJCiAJCSJSU0IgICByMyxyMyxyMyxMU0wjMTVcbiIKLQkJIk1PViAgIHIyLCAlW3ZhcjFdLCBBU1IgIzE1IFxuIgorCQkiTU9WICAgcjIsICVbdmFyMV0sIEFTUiAjMTUgXG4iIAogCQkiVEVRICAgcjIsICVbdmFyMV0sIEFTUiAjMzEgXG4iCiAJCSJFT1JORSAlW3Jlc3VsdF0sIHIzLCAlW3Jlc3VsdF0sIEFTUiAjMzEgXG4iCiAJCTpbcmVzdWx0XSIrciIocmVzdWx0KQogCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikKIAkJOiJyMiIsICJyMyIKLQkJKTsKKwkJKTsgCiAJcmV0dXJuIHJlc3VsdDsKICNlbHNlCiAgICAgV29yZDE2IHZhcl9vdXQ7CkBAIC02MzcsNyArNjM3LDcgQEAKIAogICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOwogICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOwotCisgICAKICAgICByZXR1cm4gKHZhcl9vdXQpOwogI2VuZGlmCiB9CkBAIC02NTcsMTYgKzY1NywxNiBAQAogICAgIHsKICAgICAJdmFyX291dCA9IDA7CiAgICAgCUxfbnVtID0gKFdvcmQzMikgdmFyMTsKLQorICAgIAogICAgIAlMX2Rlbm9tID0gKFdvcmQzMikgdmFyMjsKLQorICAgIAkKIAkJLy9yZXR1cm4gKExfbnVtPDwxNSkvdmFyMjsKIAogICAgIAlmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDE1OyBpdGVyYXRpb24rKykKICAgICAJewogICAgIAkJdmFyX291dCA8PD0gMTsKICAgICAJCUxfbnVtIDw8PSAxOwotCisgICAgCQkKICAgICAJCWlmIChMX251bSA+PSBMX2Rlbm9tKQogICAgIAkJewogICAgIAkJCUxfbnVtIC09IExfZGVub207CkBAIC02ODMsOCArNjgzLDggQEAKIF9faW5saW5lIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCiB7CiAjaWYgQVJNVjVURV9NVUxUCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDMyIHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIlNNVUxCQiByMiwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKIAkJIk1PVglyMywgIzFcbiIKIAkJIk1PVgklW3Jlc3VsdF0sIHIyLCBBU1IgIzE1XG4iCkBAIC02OTUsNyArNjk1LDcgQEAKIAkJOltyZXN1bHRdIityIihyZXN1bHQpCiAJCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQogCQk6InIyIiwgInIzIgotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMTYgdmFyX291dDsKQEAgLTcxOCw4ICs3MTgsOCBAQAogX19pbmxpbmUgV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpCiB7CiAjaWYgQVJNVjVURV9OT1JNX1MKLQlXb3JkMTYgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKKwlXb3JkMTYgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAogCQkiTU9WICAgcjIsJVt2YXIxXSBcbiIKIAkJIkNNUCAgIHIyLCAjMFxuIgogCQkiUlNCTFQgJVt2YXIxXSwgJVt2YXIxXSwgIzAgXG4iCkBAIC03MjcsMTEgKzcyNywxMSBAQAogCQkiU1VCTkUgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICMxN1xuIgogCQkiTU9WRVEgJVtyZXN1bHRdLCAjMFxuIgogCQkiQ01QICAgcjIsICMtMVxuIgotCQkiTU9WRVEgJVtyZXN1bHRdLCAjMTVcbiIKKwkJIk1PVkVRICVbcmVzdWx0XSwgIzE1XG4iIAogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOlt2YXIxXSJyIih2YXIxKQogCQk6InIyIgotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMTYgdmFyX291dDsKQEAgLTc2OCwxNSArNzY4LDE1IEBACiBfX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQogewogI2lmIEFSTVY1VEVfTk9STV9MCi0JV29yZDE2IHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDE2IHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIkNNUCAgICAlW0xfdmFyMV0sICMwXG4iCiAJCSJDTFpORSAgJVtyZXN1bHRdLCAlW0xfdmFyMV1cbiIKLQkJIlNVQk5FICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgIzFcbiIKKwkJIlNVQk5FICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgIzFcbiIgCiAJCSJNT1ZFUSAgJVtyZXN1bHRdLCAjMFxuIgogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOltMX3ZhcjFdInIiKExfdmFyMSkKLQkJKTsKKwkJKTsgCiAJcmV0dXJuIHJlc3VsdDsKICNlbHNlCiAgICAgLy9Xb3JkMTYgdmFyX291dDsKQEAgLTgwNSw4NCArODA1LDg0IEBACiAgICAgLy99CiAgICAgLy9yZXR1cm4gKHZhcl9vdXQpOwogICBXb3JkMTYgYTE2OwotICBXb3JkMTYgciA9IDAgOworICBXb3JkMTYgciA9IDAgOyAgICAgICAKIAotCisgICAKICAgaWYgKCBMX3ZhcjEgPCAwICkgewotICAgIExfdmFyMSA9IH5MX3ZhcjE7CisgICAgTF92YXIxID0gfkxfdmFyMTsgCiAgIH0KIAogICBpZiAoMCA9PSAoTF92YXIxICYgMHg3ZmZmODAwMCkpIHsKICAgICBhMTYgPSBleHRyYWN0X2woTF92YXIxKTsKICAgICByICs9IDE2OwotCisgICAgICAgCiAgICAgaWYgKDAgPT0gKGExNiAmIDB4N2Y4MCkpIHsKICAgICAgIHIgKz0gODsKLQorICAgICAgICAgCiAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDc4KSkgewogICAgICAgICByICs9IDQ7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDYpKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwMSkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA0KSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDQwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLQorICAgIH0gCisgICAgZWxzZSB7IAorICAgICAgICAgCiAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ODAwKSkgewogICAgICAgICByICs9IDQ7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDA2MDApKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDEwMCkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNDAwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KQEAgLTg5MiwzOCArODkyLDM4IEBACiAgIH0KICAgZWxzZSB7CiAgICAgYTE2ID0gZXh0cmFjdF9oKExfdmFyMSk7Ci0KKyAgICAgICAKICAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ZjgwKSkgewogICAgICAgciArPSA4OwotCisgICAgICAgICAKICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNzgpKSB7CiAgICAgICAgIHIgKz0gNCA7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDYpKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwMSkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDA0KSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgCiAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7CiAgICAgICAgICAgciArPSAyOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAxMCkpIHsKICAgICAgICAgICAgIHIgKz0gMTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDQwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KQEAgLTkzMSwzNSArOTMxLDM1IEBACiAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotCisgICAgICAgICAKICAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7CiAgICAgICAgIHIgKz0gNDsKLQorICAgICAgICAgICAKICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDYwMCkpIHsKICAgICAgICAgICByICs9IDI7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMTAwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLQorICAgICAgICAgICAgIAogICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDA0MDApKSB7CiAgICAgICAgICAgICByICs9IDE7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKLQorICAgICAgICAgICAKICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NjAwMCkpIHsKICAgICAgICAgICByICs9IDI7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgxMDAwKSkgewogICAgICAgICAgICAgciArPSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLQorICAgICAgICAgICAgIAogICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDQwMDApKSB7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICB9CkBAIC05NjcsNyArOTY3LDcgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLQorICAKICAgcmV0dXJuIHIgOwogI2VuZGlmCiB9CkBAIC05NzgsMTcgKzk3OCwxNyBAQAogX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSkKIHsKICNpZiBBUk1WNVRFX1JPVU5ECi0JV29yZDE2IHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCisJV29yZDE2IHJlc3VsdDsgCisJYXNtIHZvbGF0aWxlKCAKIAkJIk1PViAgIHIxLCMweDAwMDA4MDAwXG4iCiAJCSJRQUREICAlW3Jlc3VsdF0sICVbTF92YXIxXSwgcjFcbiIKLQkJIk1PViAgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCBBU1IgIzE2IFxuIgorCQkiTU9WICAgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sIEFTUiAjMTYgXG4iIAogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOltMX3ZhcjFdInIiKExfdmFyMSkKIAkJOiJyMSIKLQkJKTsKKwkJKTsgCiAJcmV0dXJuIHJlc3VsdDsKLSNlbHNlCisjZWxzZSAgIAogICAgIFdvcmQxNiB2YXJfb3V0OwogICAgIFdvcmQzMiBMX3JvdW5kZWQ7CiAKQEAgLTEwMDQsMTQgKzEwMDQsMTQgQEAKIF9faW5saW5lIFdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQogewogI2lmIEFSTVY1VEVfTF9NQUMKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAogCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXVxuIgogCQkiUUFERAklW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdXG4iCiAJCSJRQUREICAgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICVbTF92YXIzXVxuIgogCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkKIAkJOiBbTF92YXIzXSJyIihMX3ZhcjMpLCBbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMzIgTF92YXJfb3V0OwpAQCAtMTAyOCwxMiArMTAyOCwxMiBAQAogX19pbmxpbmUgV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQogewogI2lmIEFSTVY1VEVfTF9BREQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKKwlXb3JkMzIgcmVzdWx0OyAKKwlhc20gdm9sYXRpbGUoIAogCQkiUUFERCAlW3Jlc3VsdF0sICVbTF92YXIxXSwgJVtMX3ZhcjJdXG4iCiAJCTpbcmVzdWx0XSIrciIocmVzdWx0KQogCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW0xfdmFyMl0iciIoTF92YXIyKQotCQkpOworCQkpOyAKIAlyZXR1cm4gcmVzdWx0OwogI2Vsc2UKICAgICBXb3JkMzIgTF92YXJfb3V0OwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIAogICAgIExfdmFyMyA9IExfbXN1IChMX3ZhcjMsIHZhcjEsIHZhcjIpOwogICAgIHZhcl9vdXQgPSAoV29yZDE2KSgoTF92YXIzICsgMHg4MDAwTCkgPj4gMTYpOwotCisgICAgCiAgICAgcmV0dXJuICh2YXJfb3V0KTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jCmluZGV4IGQ0M2JiZDkuLjgyZDNmMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljb3AyLmMKQEAgLTE2LDcgKzE2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJRmlsZToJCWJhc2ljb3AyLmMKIAotCUNvbnRlbnQ6CUJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzLgorCUNvbnRlbnQ6CUJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzLiAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDYyLDcgKzQ2Miw3IEBACiAgICAgewogICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7CiAgICAgfQotCisgICAgICAgIAogICAgIHJldHVybiAoTF92YXJfb3V0KTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmluZGV4IGU0OGFmOWQuLjBhZDgyZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAlGaWxlOgkJb3Blcl8zMmIuYwogCiAJQ29udGVudDoJICBUaGlzIGZpbGUgY29udGFpbnMgb3BlcmF0aW9ucyBpbiBkb3VibGUgcHJlY2lzaW9uLgotCisgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHlwZWRlZi5oIgpAQCAtMjAwLDEyICsyMDAsMTIgQEAKIH0KIAogLyohCi0KLSAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBsb2cgZHVhbGlzIHRpbWVzIDQgb2YgYXJndW1lbnQKKyAKKyAgXGJyaWVmICBjYWxjdWxhdGVzIHRoZSBsb2cgZHVhbGlzIHRpbWVzIDQgb2YgYXJndW1lbnQgCiAgICAgICAgICAgaUxvZzQoeCkgPSAoV29yZDMyKSg0ICogbG9nKHZhbHVlKS9sb2coMi4wKSkKIAogICBccmV0dXJuIGlsb2c0IHZhbHVlCi0KKyAKICovCiBXb3JkMTYgaUxvZzQoV29yZDMyIHZhbHVlKQogewpAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgaUxvZzQgPSAoLShpTG9nNCA8PCAyKSAtIG5vcm1fcyh0bXAxNikpIC0gMTsKICAgfQogICBlbHNlIHsKLSAgICBpTG9nNCA9IC0xMjg7IC8qIC0oSU5UX0JJVFMqNCk7ICovCisgICAgaUxvZzQgPSAtMTI4OyAvKiAtKElOVF9CSVRTKjQpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAKICAgcmV0dXJuIGlMb2c0OwpAQCAtMjY4LDc5ICsyNjgsNzkgQEAKIH0KIAogc3RhdGljIGNvbnN0IFdvcmQzMiBwb3cyVGFibGVbUE9XMl9UQUJMRV9TSVpFXSA9IHsKLTB4N2ZmZmZmZmYsIDB4N2ZhNzY1YWQsIDB4N2Y0ZjA4YWUsIDB4N2VmNmU4ZGEsCi0weDdlOWYwNjA2LCAweDdlNDc2MDA5LCAweDdkZWZmNmI2LCAweDdkOThjOWU2LAotMHg3ZDQxZDk2ZSwgMHg3Y2ViMjUyMywgMHg3Yzk0YWNkZSwgMHg3YzNlNzA3MywKLTB4N2JlODZmYjksIDB4N2I5MmFhODgsIDB4N2IzZDIwYjYsIDB4N2FlN2QyMWEsCi0weDdhOTJiZThiLCAweDdhM2RlNWRmLCAweDc5ZTk0N2VmLCAweDc5OTRlNDkyLAotMHg3OTQwYmI5ZSwgMHg3OGVjY2NlYywgMHg3ODk5MTg1NCwgMHg3ODQ1OWRhYywKLTB4NzdmMjVjY2UsIDB4Nzc5ZjU1OTEsIDB4Nzc0Yzg3Y2MsIDB4NzZmOWYzNTksCi0weDc2YTc5ODBmLCAweDc2NTU3NWM4LCAweDc2MDM4YzViLCAweDc1YjFkYmEyLAotMHg3NTYwNjM3NCwgMHg3NTBmMjNhYiwgMHg3NGJlMWMyMCwgMHg3NDZkNGNhYywKLTB4NzQxY2I1MjgsIDB4NzNjYzU1NmQsIDB4NzM3YzJkNTUsIDB4NzMyYzNjYmEsCi0weDcyZGM4Mzc0LCAweDcyOGQwMTVkLCAweDcyM2RiNjUwLCAweDcxZWVhMjI2LAotMHg3MTlmYzRiOSwgMHg3MTUxMWRlNCwgMHg3MTAyYWQ4MCwgMHg3MGI0NzM2OCwKLTB4NzA2NjZmNzYsIDB4NzAxOGExODUsIDB4NmZjYjA5NmYsIDB4NmY3ZGE3MTAsCi0weDZmMzA3YTQxLCAweDZlZTM4MmRlLCAweDZlOTZjMGMzLCAweDZlNGEzM2M5LAotMHg2ZGZkZGJjYywgMHg2ZGIxYjhhOCwgMHg2ZDY1Y2EzOCwgMHg2ZDFhMTA1NywKLTB4NmNjZThhZTEsIDB4NmM4MzM5YjIsIDB4NmMzODFjYTYsIDB4NmJlZDMzOTgsCi0weDZiYTI3ZTY2LCAweDZiNTdmY2U5LCAweDZiMGRhZWZmLCAweDZhYzM5NDg1LAotMHg2YTc5YWQ1NiwgMHg2YTJmZjk0ZiwgMHg2OWU2Nzg0ZCwgMHg2OTlkMmEyYywKLTB4Njk1NDBlYzksIDB4NjkwYjI2MDEsIDB4NjhjMjZmYjEsIDB4Njg3OWViYjYsCi0weDY4MzE5OWVkLCAweDY3ZTk3YTM0LCAweDY3YTE4YzY4LCAweDY3NTlkMDY1LAotMHg2NzEyNDYwYiwgMHg2NmNhZWQzNSwgMHg2NjgzYzVjMywgMHg2NjNjY2Y5MiwKLTB4NjVmNjBhODAsIDB4NjVhZjc2NmEsIDB4NjU2OTEzMmYsIDB4NjUyMmUwYWQsCi0weDY0ZGNkZWMzLCAweDY0OTcwZDRmLCAweDY0NTE2YzJlLCAweDY0MGJmYjQxLAotMHg2M2M2YmE2NCwgMHg2MzgxYTk3OCwgMHg2MzNjYzg1YiwgMHg2MmY4MTZlYiwKLTB4NjJiMzk1MDksIDB4NjI2ZjQyOTIsIDB4NjIyYjFmNjYsIDB4NjFlNzJiNjUsCi0weDYxYTM2NjZkLCAweDYxNWZkMDVmLCAweDYxMWM2OTE5LCAweDYwZDkzMDdiLAotMHg2MDk2MjY2NSwgMHg2MDUzNGFiNywgMHg2MDEwOWQ1MSwgMHg1ZmNlMWUxMiwKLTB4NWY4YmNjZGIsIDB4NWY0OWE5OGMsIDB4NWYwN2I0MDUsIDB4NWVjNWVjMjYsCi0weDVlODQ1MWQwLCAweDVlNDJlNGUzLCAweDVlMDFhNTQwLCAweDVkYzA5MmM3LAotMHg1ZDdmYWQ1OSwgMHg1ZDNlZjRkNywgMHg1Y2ZlNjkyMywgMHg1Y2JlMGExYywKLTB4NWM3ZGQ3YTQsIDB4NWMzZGQxOWMsIDB4NWJmZGY3ZTUsIDB4NWJiZTRhNjEsCi0weDViN2VjOGYyLCAweDViM2Y3Mzc3LCAweDViMDA0OWQ0LCAweDVhYzE0YmVhLAotMHg1YTgyNzk5YSwgMHg1YTQzZDJjNiwgMHg1YTA1NTc1MSwgMHg1OWM3MDcxYywKLTB4NTk4OGUyMDksIDB4NTk0YWU3ZmIsIDB4NTkwZDE4ZDMsIDB4NThjZjc0NzQsCi0weDU4OTFmYWMxLCAweDU4NTRhYjliLCAweDU4MTc4NmU2LCAweDU3ZGE4YzgzLAotMHg1NzlkYmM1NywgMHg1NzYxMTY0MiwgMHg1NzI0OWEyOSwgMHg1NmU4NDdlZiwKLTB4NTZhYzFmNzUsIDB4NTY3MDIwYTAsIDB4NTYzNDRiNTIsIDB4NTVmODlmNzAsCi0weDU1YmQxY2RiLCAweDU1ODFjMzc4LCAweDU1NDY5MzI5LCAweDU1MGI4YmQ0LAotMHg1NGQwYWQ1YiwgMHg1NDk1ZjdhMSwgMHg1NDViNmE4YiwgMHg1NDIxMDVmZCwKLTB4NTNlNmM5ZGIsIDB4NTNhY2I2MDcsIDB4NTM3MmNhNjgsIDB4NTMzOTA2ZTAsCi0weDUyZmY2YjU1LCAweDUyYzVmN2FhLCAweDUyOGNhYmMzLCAweDUyNTM4Nzg2LAotMHg1MjFhOGFkNywgMHg1MWUxYjU5YSwgMHg1MWE5MDdiNCwgMHg1MTcwODEwYiwKLTB4NTEzODIxODIsIDB4NTBmZmU4ZmUsIDB4NTBjN2Q3NjUsIDB4NTA4ZmVjOWMsCi0weDUwNTgyODg4LCAweDUwMjA4YjBlLCAweDRmZTkxNDEzLCAweDRmYjFjMzdjLAotMHg0ZjdhOTkzMCwgMHg0ZjQzOTUxNCwgMHg0ZjBjYjcwYywgMHg0ZWQ1ZmYwMCwKLTB4NGU5ZjZjZDQsIDB4NGU2OTAwNmUsIDB4NGUzMmI5YjQsIDB4NGRmYzk4OGMsCi0weDRkYzY5Y2RkLCAweDRkOTBjNjhiLCAweDRkNWIxNTdlLCAweDRkMjU4OTljLAotMHg0Y2YwMjJjYSwgMHg0Y2JhZTBlZiwgMHg0Yzg1YzNmMSwgMHg0YzUwY2JiOCwKLTB4NGMxYmY4MjksIDB4NGJlNzQ5MmIsIDB4NGJiMmJlYTUsIDB4NGI3ZTU4N2QsCi0weDRiNGExNjljLCAweDRiMTVmOGU2LCAweDRhZTFmZjQzLCAweDRhYWUyOTliLAotMHg0YTdhNzdkNSwgMHg0YTQ2ZTlkNiwgMHg0YTEzN2Y4OCwgMHg0OWUwMzhkMCwKLTB4NDlhZDE1OTgsIDB4NDk3YTE1YzQsIDB4NDk0NzM5M2YsIDB4NDkxNDdmZWUsCi0weDQ4ZTFlOWJhLCAweDQ4YWY3NjhhLCAweDQ4N2QyNjQ2LCAweDQ4NGFmOGQ2LAotMHg0ODE4ZWUyMiwgMHg0N2U3MDYxMSwgMHg0N2I1NDA4YywgMHg0NzgzOWQ3YiwKLTB4NDc1MjFjYzYsIDB4NDcyMGJlNTUsIDB4NDZlZjgyMTAsIDB4NDZiZTY3ZTAsCi0weDQ2OGQ2ZmFlLCAweDQ2NWM5OTYxLCAweDQ2MmJlNGUyLCAweDQ1ZmI1MjFhLAotMHg0NWNhZTBmMiwgMHg0NTlhOTE1MiwgMHg0NTZhNjMyMywgMHg0NTNhNTY0ZCwKLTB4NDUwYTZhYmIsIDB4NDRkYWEwNTQsIDB4NDRhYWY3MDIsIDB4NDQ3YjZlYWQsCi0weDQ0NGMwNzQwLCAweDQ0MWNjMGEzLCAweDQzZWQ5YWMwLCAweDQzYmU5NTgwLAotMHg0MzhmYjBjYiwgMHg0MzYwZWM4ZCwgMHg0MzMyNDhhZSwgMHg0MzAzYzUxNywKLTB4NDJkNTYxYjQsIDB4NDJhNzFlNmMsIDB4NDI3OGZiMmIsIDB4NDI0YWY3ZGEsCi0weDQyMWQxNDYyLCAweDQxZWY1MGFlLCAweDQxYzFhY2E4LCAweDQxOTQyODM5LAotMHg0MTY2YzM0YywgMHg0MTM5N2RjYywgMHg0MTBjNTdhMiwgMHg0MGRmNTBiOCwKLTB4NDBiMjY4ZmEsIDB4NDA4NWEwNTEsIDB4NDA1OGY2YTgsIDB4NDAyYzZiZTkKKzB4N2ZmZmZmZmYsIDB4N2ZhNzY1YWQsIDB4N2Y0ZjA4YWUsIDB4N2VmNmU4ZGEsIAorMHg3ZTlmMDYwNiwgMHg3ZTQ3NjAwOSwgMHg3ZGVmZjZiNiwgMHg3ZDk4YzllNiwgCisweDdkNDFkOTZlLCAweDdjZWIyNTIzLCAweDdjOTRhY2RlLCAweDdjM2U3MDczLCAKKzB4N2JlODZmYjksIDB4N2I5MmFhODgsIDB4N2IzZDIwYjYsIDB4N2FlN2QyMWEsIAorMHg3YTkyYmU4YiwgMHg3YTNkZTVkZiwgMHg3OWU5NDdlZiwgMHg3OTk0ZTQ5MiwgCisweDc5NDBiYjllLCAweDc4ZWNjY2VjLCAweDc4OTkxODU0LCAweDc4NDU5ZGFjLCAKKzB4NzdmMjVjY2UsIDB4Nzc5ZjU1OTEsIDB4Nzc0Yzg3Y2MsIDB4NzZmOWYzNTksIAorMHg3NmE3OTgwZiwgMHg3NjU1NzVjOCwgMHg3NjAzOGM1YiwgMHg3NWIxZGJhMiwgCisweDc1NjA2Mzc0LCAweDc1MGYyM2FiLCAweDc0YmUxYzIwLCAweDc0NmQ0Y2FjLCAKKzB4NzQxY2I1MjgsIDB4NzNjYzU1NmQsIDB4NzM3YzJkNTUsIDB4NzMyYzNjYmEsIAorMHg3MmRjODM3NCwgMHg3MjhkMDE1ZCwgMHg3MjNkYjY1MCwgMHg3MWVlYTIyNiwgCisweDcxOWZjNGI5LCAweDcxNTExZGU0LCAweDcxMDJhZDgwLCAweDcwYjQ3MzY4LCAKKzB4NzA2NjZmNzYsIDB4NzAxOGExODUsIDB4NmZjYjA5NmYsIDB4NmY3ZGE3MTAsIAorMHg2ZjMwN2E0MSwgMHg2ZWUzODJkZSwgMHg2ZTk2YzBjMywgMHg2ZTRhMzNjOSwgCisweDZkZmRkYmNjLCAweDZkYjFiOGE4LCAweDZkNjVjYTM4LCAweDZkMWExMDU3LCAKKzB4NmNjZThhZTEsIDB4NmM4MzM5YjIsIDB4NmMzODFjYTYsIDB4NmJlZDMzOTgsIAorMHg2YmEyN2U2NiwgMHg2YjU3ZmNlOSwgMHg2YjBkYWVmZiwgMHg2YWMzOTQ4NSwgCisweDZhNzlhZDU2LCAweDZhMmZmOTRmLCAweDY5ZTY3ODRkLCAweDY5OWQyYTJjLCAKKzB4Njk1NDBlYzksIDB4NjkwYjI2MDEsIDB4NjhjMjZmYjEsIDB4Njg3OWViYjYsIAorMHg2ODMxOTllZCwgMHg2N2U5N2EzNCwgMHg2N2ExOGM2OCwgMHg2NzU5ZDA2NSwgCisweDY3MTI0NjBiLCAweDY2Y2FlZDM1LCAweDY2ODNjNWMzLCAweDY2M2NjZjkyLCAKKzB4NjVmNjBhODAsIDB4NjVhZjc2NmEsIDB4NjU2OTEzMmYsIDB4NjUyMmUwYWQsIAorMHg2NGRjZGVjMywgMHg2NDk3MGQ0ZiwgMHg2NDUxNmMyZSwgMHg2NDBiZmI0MSwgCisweDYzYzZiYTY0LCAweDYzODFhOTc4LCAweDYzM2NjODViLCAweDYyZjgxNmViLCAKKzB4NjJiMzk1MDksIDB4NjI2ZjQyOTIsIDB4NjIyYjFmNjYsIDB4NjFlNzJiNjUsIAorMHg2MWEzNjY2ZCwgMHg2MTVmZDA1ZiwgMHg2MTFjNjkxOSwgMHg2MGQ5MzA3YiwgCisweDYwOTYyNjY1LCAweDYwNTM0YWI3LCAweDYwMTA5ZDUxLCAweDVmY2UxZTEyLCAKKzB4NWY4YmNjZGIsIDB4NWY0OWE5OGMsIDB4NWYwN2I0MDUsIDB4NWVjNWVjMjYsIAorMHg1ZTg0NTFkMCwgMHg1ZTQyZTRlMywgMHg1ZTAxYTU0MCwgMHg1ZGMwOTJjNywgCisweDVkN2ZhZDU5LCAweDVkM2VmNGQ3LCAweDVjZmU2OTIzLCAweDVjYmUwYTFjLCAKKzB4NWM3ZGQ3YTQsIDB4NWMzZGQxOWMsIDB4NWJmZGY3ZTUsIDB4NWJiZTRhNjEsIAorMHg1YjdlYzhmMiwgMHg1YjNmNzM3NywgMHg1YjAwNDlkNCwgMHg1YWMxNGJlYSwgCisweDVhODI3OTlhLCAweDVhNDNkMmM2LCAweDVhMDU1NzUxLCAweDU5YzcwNzFjLCAKKzB4NTk4OGUyMDksIDB4NTk0YWU3ZmIsIDB4NTkwZDE4ZDMsIDB4NThjZjc0NzQsIAorMHg1ODkxZmFjMSwgMHg1ODU0YWI5YiwgMHg1ODE3ODZlNiwgMHg1N2RhOGM4MywgCisweDU3OWRiYzU3LCAweDU3NjExNjQyLCAweDU3MjQ5YTI5LCAweDU2ZTg0N2VmLCAKKzB4NTZhYzFmNzUsIDB4NTY3MDIwYTAsIDB4NTYzNDRiNTIsIDB4NTVmODlmNzAsIAorMHg1NWJkMWNkYiwgMHg1NTgxYzM3OCwgMHg1NTQ2OTMyOSwgMHg1NTBiOGJkNCwgCisweDU0ZDBhZDViLCAweDU0OTVmN2ExLCAweDU0NWI2YThiLCAweDU0MjEwNWZkLCAKKzB4NTNlNmM5ZGIsIDB4NTNhY2I2MDcsIDB4NTM3MmNhNjgsIDB4NTMzOTA2ZTAsIAorMHg1MmZmNmI1NSwgMHg1MmM1ZjdhYSwgMHg1MjhjYWJjMywgMHg1MjUzODc4NiwgCisweDUyMWE4YWQ3LCAweDUxZTFiNTlhLCAweDUxYTkwN2I0LCAweDUxNzA4MTBiLCAKKzB4NTEzODIxODIsIDB4NTBmZmU4ZmUsIDB4NTBjN2Q3NjUsIDB4NTA4ZmVjOWMsIAorMHg1MDU4Mjg4OCwgMHg1MDIwOGIwZSwgMHg0ZmU5MTQxMywgMHg0ZmIxYzM3YywgCisweDRmN2E5OTMwLCAweDRmNDM5NTE0LCAweDRmMGNiNzBjLCAweDRlZDVmZjAwLCAKKzB4NGU5ZjZjZDQsIDB4NGU2OTAwNmUsIDB4NGUzMmI5YjQsIDB4NGRmYzk4OGMsIAorMHg0ZGM2OWNkZCwgMHg0ZDkwYzY4YiwgMHg0ZDViMTU3ZSwgMHg0ZDI1ODk5YywgCisweDRjZjAyMmNhLCAweDRjYmFlMGVmLCAweDRjODVjM2YxLCAweDRjNTBjYmI4LCAKKzB4NGMxYmY4MjksIDB4NGJlNzQ5MmIsIDB4NGJiMmJlYTUsIDB4NGI3ZTU4N2QsIAorMHg0YjRhMTY5YywgMHg0YjE1ZjhlNiwgMHg0YWUxZmY0MywgMHg0YWFlMjk5YiwgCisweDRhN2E3N2Q1LCAweDRhNDZlOWQ2LCAweDRhMTM3Zjg4LCAweDQ5ZTAzOGQwLCAKKzB4NDlhZDE1OTgsIDB4NDk3YTE1YzQsIDB4NDk0NzM5M2YsIDB4NDkxNDdmZWUsIAorMHg0OGUxZTliYSwgMHg0OGFmNzY4YSwgMHg0ODdkMjY0NiwgMHg0ODRhZjhkNiwgCisweDQ4MThlZTIyLCAweDQ3ZTcwNjExLCAweDQ3YjU0MDhjLCAweDQ3ODM5ZDdiLCAKKzB4NDc1MjFjYzYsIDB4NDcyMGJlNTUsIDB4NDZlZjgyMTAsIDB4NDZiZTY3ZTAsIAorMHg0NjhkNmZhZSwgMHg0NjVjOTk2MSwgMHg0NjJiZTRlMiwgMHg0NWZiNTIxYSwgCisweDQ1Y2FlMGYyLCAweDQ1OWE5MTUyLCAweDQ1NmE2MzIzLCAweDQ1M2E1NjRkLCAKKzB4NDUwYTZhYmIsIDB4NDRkYWEwNTQsIDB4NDRhYWY3MDIsIDB4NDQ3YjZlYWQsIAorMHg0NDRjMDc0MCwgMHg0NDFjYzBhMywgMHg0M2VkOWFjMCwgMHg0M2JlOTU4MCwgCisweDQzOGZiMGNiLCAweDQzNjBlYzhkLCAweDQzMzI0OGFlLCAweDQzMDNjNTE3LCAKKzB4NDJkNTYxYjQsIDB4NDJhNzFlNmMsIDB4NDI3OGZiMmIsIDB4NDI0YWY3ZGEsIAorMHg0MjFkMTQ2MiwgMHg0MWVmNTBhZSwgMHg0MWMxYWNhOCwgMHg0MTk0MjgzOSwgCisweDQxNjZjMzRjLCAweDQxMzk3ZGNjLCAweDQxMGM1N2EyLCAweDQwZGY1MGI4LCAKKzB4NDBiMjY4ZmEsIDB4NDA4NWEwNTEsIDB4NDA1OGY2YTgsIDB4NDAyYzZiZTkgCiB9OwogCiAvKiEKLQotICBcYnJpZWYgY2FsY3VsYXRlcyAyIF4gKHgveSkgZm9yIHg8PTAsIHkgPiAwLCB4IDw9IDMyNzY4ICogeQotCisgCisgIFxicmllZiBjYWxjdWxhdGVzIDIgXiAoeC95KSBmb3IgeDw9MCwgeSA+IDAsIHggPD0gMzI3NjggKiB5IAorICAKICAgYXZvaWRzIGludGVnZXIgZGl2aXNpb24KLQotICBccmV0dXJuCisgIAorICBccmV0dXJuIAogKi8KIFdvcmQzMiBwb3cyX3h5KFdvcmQzMiB4LCBXb3JkMzIgeSkKIHsKQEAgLTM1NSw3ICszNTUsNyBAQAogICBmUGFydCA9IHRtcDIgLSBpUGFydCp5OwogICBpUGFydCA9IG1pbihpUGFydCxJTlRfQklUUy0xKTsKIAotICByZXMgPSBwb3cyVGFibGVbKFBPVzJfVEFCTEVfU0laRSpmUGFydCkveV0gPj4gaVBhcnQ7Ci0KKyAgcmVzID0gcG93MlRhYmxlWyhQT1cyX1RBQkxFX1NJWkUqZlBhcnQpL3ldID4+IGlQYXJ0OyAKKyAKICAgcmV0dXJuKHJlcyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oCmluZGV4IDllYmQxYzIuLjFkMzVlNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKQEAgLTUxLDIxICs1MSwyMSBAQAogICAgIHN3SGlnaDEgPSAoV29yZDE2KShMX3ZhcjIgPj4gMTYpOwogCiAgICAgbF92YXJfb3V0ID0gKGxvbmcpc3dMb3cxICogKGxvbmcpdmFyMSA+PiAxNTsKLQorICAgIAogICAgIGxfdmFyX291dCArPSBzd0hpZ2gxICogdmFyMSA8PCAxOwotCisgICAgCiAgICAgcmV0dXJuKGxfdmFyX291dCk7CiB9CiAKIF9faW5saW5lIFdvcmQzMiBMX21weV93eChXb3JkMzIgTF92YXIyLCBXb3JkMTYgdmFyMSkKIHsKICNpZiBBUk1WNVRFX0xfTVBZX0xTCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gdm9sYXRpbGUoCi0JCSJTTVVMV0IgICVbcmVzdWx0XSwgJVtMX3ZhcjJdLCAlW3ZhcjFdIFxuIgorCVdvcmQzMiByZXN1bHQ7IAorCWFzbSB2b2xhdGlsZSggCisJCSJTTVVMV0IgICVbcmVzdWx0XSwgJVtMX3ZhcjJdLCAlW3ZhcjFdIFxuIiAKIAkJOltyZXN1bHRdIityIihyZXN1bHQpCiAJCTpbTF92YXIyXSJyIihMX3ZhcjIpLCBbdmFyMV0iciIodmFyMSkKLQkJKTsKKwkJKTsgCiAJcmV0dXJuIHJlc3VsdDsKICNlbHNlCiAgICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOwpAQCAtNzUsOSArNzUsOSBAQAogICAgIHN3TG93MSA9ICh1bnNpZ25lZCBzaG9ydCkoTF92YXIyKTsKICAgICBzd0hpZ2gxID0gKFdvcmQxNikoTF92YXIyID4+IDE2KTsKIAotICAgIGxfdmFyX291dCA9IChsb25nKXN3TG93MSAqIChsb25nKXZhcjEgPj4gMTY7CisgICAgbF92YXJfb3V0ID0gKGxvbmcpc3dMb3cxICogKGxvbmcpdmFyMSA+PiAxNjsgICAgCiAgICAgbF92YXJfb3V0ICs9IHN3SGlnaDEgKiB2YXIxOwotCisgICAgCiAgICAgcmV0dXJuKGxfdmFyX291dCk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmgKaW5kZXggYjFmODIyNS4uMTAzMDgwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmgKQEAgLTMwLDcgKzMwLDcgQEAKIC8qCiAgKiB0aGlzIGlzIHRoZSBvcmlnaW5hbCBjb2RlIGZyb20gdGhlIEVUU0kgZmlsZSB0eXBlZGVmLmgKICAqLwotCisgICAKICNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1pUQ19fKQogdHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKIHR5cGVkZWYgc2hvcnQgV29yZDE2OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oCmluZGV4IGM5MjRlMmMuLmM3ZTc3NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKQEAgLTU1LDcgKzU1LDcgQEAKICNkZWZpbmUgSU5UX0JJVFMgICAzMgogLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTCisqICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiAvKgpAQCAtMTIwLDEyICsxMjAsMTIgQEAKICAgICAjZGVmaW5lIEFSTVY1VEVfTF9NVUxUICAgICAgICAxCiAgICAgI2RlZmluZSBBUk1WNVRFX0xfTUFDICAgICAgICAgMQogICAgICNkZWZpbmUgQVJNVjVURV9MX01TVSAgICAgICAgIDEKLQotCisgICAKKyAgICAKICAgICAjZGVmaW5lIEFSTVY1VEVfRElWX1MgICAgICAgICAxCiAgICAgI2RlZmluZSBBUk1WNVRFX1JPVU5EICAgICAgICAgMQogICAgICNkZWZpbmUgQVJNVjVURV9NVUxUICAgICAgICAgIDEKLQorICAgIAogICAgICNkZWZpbmUgQVJNVjVURV9OT1JNX1MgICAgICAgIDEKICAgICAjZGVmaW5lIEFSTVY1VEVfTk9STV9MICAgICAgICAxCiAJI2RlZmluZSBBUk1WNVRFX0xfTVBZX0xTCSAgMQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAjZGVmaW5lIFJPVU5EX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHJvdW5kIGFzIGlubGluZSBmdW5jdGlvbgogI2RlZmluZSBMX01BQ19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21hYyBhcyBpbmxpbmUgZnVuY3Rpb24KICNkZWZpbmUgTF9BRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9hZGQgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIEVYVFJBQ1RfSF9JU19JTkxJTkUgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGV4dHJhY3RfaCBhcyBpbmxpbmUgZnVuY3Rpb24KKyNkZWZpbmUgRVhUUkFDVF9IX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9oIGFzIGlubGluZSBmdW5jdGlvbiAKICNkZWZpbmUgRVhUUkFDVF9MX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9sIGFzIGlubGluZSBmdW5jdGlvbiAgICAgICAgLy8/Pz8KICNkZWZpbmUgTVVMVF9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXVsdF9yIGFzIGlubGluZSBmdW5jdGlvbgogI2RlZmluZSBTSFJfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzaHJfciBhcyBpbmxpbmUgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZTdkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjUKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gbGliCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LgotIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlCi1WT01NOj0gLURBUk1WNUUgLURBUk1fSU5BU00gLURBUk1WNV9JTkFTTQotCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PWxpYnZvQUFDRW5jdjUKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rCi0KLSMgZGVwZW5kZW50IGxpYnJhcmllcy4KLVZPREVQTElCUzo9Iy1sZGwgLWxzdGRjKysKLQotIyBtb2R1bGUgc291cmNlCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQotaW5jbHVkZSAuLi8uLi9tcy5tawotCi0KLSMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZAotVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5tawotaW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9kb2l0Lm1rCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmM4NTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgdGFyZ2V0NgotIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pCi1WT1RUOj0gdjcKLQotCi0jIG1vZHVsZSB0eXBlCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlCi1WT01UOj0gbGliCi0KLQotIyBtb2R1bGUgbWFjcm9zCi0jIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LgotIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlCi1WT01NOj0gLURBUk1WNUUgLURBUk1WN05lb24gLURBUk1fSU5BU00gLURBUk1WNV9JTkFTTQotCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQotVk9UQVJHRVQ6PWxpYnZvQUFDRW5jdjcKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rCi0KLSMgZGVwZW5kZW50IGxpYnJhcmllcy4KLVZPREVQTElCUzo9Iy1sZGwgLWxzdGRjKysKLQotIyBtb2R1bGUgc291cmNlCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQotaW5jbHVkZSAuLi8uLi9tcy5tawotCi0KLSMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZAotVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UKLQotCi0jIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5tawotaW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9kb2l0Lm1rCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjRkMTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jLyoKLSMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyoqCi0jKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyoqCi0jKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyoqCi0jKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyovCi0KLSMgSnVzdCBhY3RpbmcgYXMgRmF0aGVyIE1ha2VmaWxlIG9mIE1vZHVsZXMKLSMgcGxlYXNlIGtlZXAgdGhlIG5hbWUgJ21ha2VmaWxlJyB1bmNoYW5nZWQKLQotIyBNb2R1bGUgU3ViZGlycwotVk9NU0Q6PSQoZGlyICQoc2hlbGwgZmluZCAuIC1uYW1lICdNYWtlZmlsZScpKQotCi1hbGw6Ci0JZm9yIGRpciBpbiAkKFZPTVNEKTsgXAotCQlkbyBcCi0JCQkkKE1BS0UpIC1DICQkZGlyOyBcCi0JCWRvbmUKLQotLlBIT05ZOmNsZWFuIGRldmVsCi1jbGVhbjoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXIgY2xlYW47IFwKLQkJZG9uZQotCi1kZXZlbDoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXIgZGV2ZWw7IFwKLQkJZG9uZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvbXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YWRiYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMvKgotIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jKioKLSMqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jKioKLSMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jKioKLSMqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jKi8KLQotCi0jIHBsZWFzZSBsaXN0IGFsbCBvYmplY3RzIG5lZWRlZCBieSB5b3VyIHRhcmdldCBoZXJlCi1PQkpTOj1iYXNpY29wMi5vIG9wZXJfMzJiLm8gYWFjX3JvbS5vIGFhY2VuYy5vIGFhY2VuY19jb3JlLm8gYWRqX3Roci5vIFwKLQkJCWJhbmRfbnJnLm8gYml0X2NudC5vIGJpdGJ1ZmZlci5vIGJpdGVuYy5vIGJsb2NrX3N3aXRjaC5vIGNoYW5uZWxfbWFwLm8gXAotCQkJZHluX2JpdHMubyBncnBfZGF0YS5vIGludGVyZmFjZS5vIGxpbmVfcGUubyBtZW1hbGlnbi5vIG1zX3N0ZXJlby5vIFwKLQkJCXByZV9lY2hvX2NvbnRyb2wubyBwc3lfY29uZmlndXJhdGlvbi5vIHBzeV9tYWluLm8gcWNfbWFpbi5vIHF1YW50aXplLm8gc2ZfZXN0aW0ubyBcCi0JCQlzcHJlYWRpbmcubyBzdGF0X2JpdHMubyB0bnMubyB0cmFuc2Zvcm0ubwotCi0jIHBsZWFzZSBsaXN0IGFsbCBkaXJlY3RvcmllcyB0aGF0IGFsbCBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgd2l0aCB5b3VyIG1vZHVsZSguaCAuYyAuY3BwKSBsb2NhdGUKLVZPU1JDRElSOj0uLi8uLi8uLi9zcmMgXAotCQkJCQkuLi8uLi8uLi9pbmMgXAotCQkJCQkuLi8uLi8uLi9iYXNpY19vcFwKLQkJCQkJLi4vLi4vLi4vLi4vLi4vSW5jbHVkZQotCi1pZmVxICgkKFZPVFQpLCB2NSkKLU9CSlMrPSBBdXRvQ29ycmVsYXRpb25fdjUubyBiYW5kX25yZ192NS5vIENhbGNXaW5kb3dFbmVyZ3lfdjUubyBcCi0JCQkJUHJlUG9zdE1EQ1RfdjUubyBSNFI4Rmlyc3RfdjUubyBSYWRpeDRGRlRfdjUubwotVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RS8KLWVuZGlmCi0KLWlmZXEgKCQoVk9UVCksIHY3KQotT0JKUys9IEF1dG9Db3JyZWxhdGlvbl92NS5vIGJhbmRfbnJnX3Y1Lm8gQ2FsY1dpbmRvd0VuZXJneV92NS5vIFwKLQkJCSBQcmVQb3N0TURDVF92Ny5vIFI0UjhGaXJzdF92Ny5vIFJhZGl4NEZGVF92Ny5vCi1WT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFLwotVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY3LwotZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaAppbmRleCA4ZTIwNmI3Li43ODRiYjcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNfcm9tLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oCkBAIC0xNiw3ICsxNiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCUZpbGU6CQlhYWNfcm9tLmgKIAotCUNvbnRlbnQ6CWNvbnN0YW50IHRhYmxlcworCUNvbnRlbnQ6CWNvbnN0YW50IHRhYmxlcyAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKaW5kZXggMWFjZGJiYy4uNDFiYTc1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNlbmNfY29yZS5oCkBAIC00Nyw3ICs0Nyw3IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotCisJCiAgIEFBQ0VOQ19DT05GSUcgY29uZmlnOyAgICAgLyogV29yZDE2IHNpemU6IDggKi8KIAogICBFTEVNRU5UX0lORk8gZWxJbmZvOyAgICAgIC8qIFdvcmQxNiBzaXplOiA0ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKaW5kZXggMGY0YmI1ZS4uZjdjYjg4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Roci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHIuaApAQCAtMTYsNyArMTYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlGaWxlOgkJYWRqX3Roci5oCiAKLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIGZ1bmN0aW9uCisJQ29udGVudDoJVGhyZXNob2xkIGNvbXBlbnNhdGlvbiBmdW5jdGlvbiAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmNoQml0RGlzdHJpYnV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT0UsCiAJCQkJCSAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCiAJCQkJCSAgY29uc3QgV29yZDE2IG5DaGFubmVscywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKaW5kZXggMzAxMzJkOC4uOWFjNDY2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKQEAgLTE2LDcgKzE2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAJRmlsZToJCWFkal90aHJfZGF0YS5oCiAKLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIHBhcmFtZXRlcgorCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gcGFyYW1ldGVyIAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCmluZGV4IDZhNThhZWIuLjZkZWQzYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgInRucy5oIgogI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiICAKIAogc3RydWN0IEJJVFNUUkVBTUVOQ09ERVJfSU5JVAogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaAppbmRleCBhNDJlNmE5Li45NjZhYzk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaApAQCAtNTUsMTEgKzU1LDExIEBACiAgIFdvcmQxNiAgd2luZG93U2hhcGU7CiAgIFdvcmQxNiAgZ3JvdXBpbmdNYXNrOwogICBXb3JkMTYgIHNmYk9mZnNldHNbTUFYX0dST1VQRURfU0ZCKzFdOwotICBXb3JkMTYgIG1kY3RTY2FsZTsKLSAgV29yZDMyICpzZmJFbmVyZ3k7CisgIFdvcmQxNiAgbWRjdFNjYWxlOyAKKyAgV29yZDMyICpzZmJFbmVyZ3k7IAogICBXb3JkMzIgKnNmYlNwcmVhZGVkRW5lcmd5OwotICBXb3JkMzIgKnNmYlRocmVzaG9sZDsKLSAgV29yZDMyICptZGN0U3BlY3RydW07CisgIFdvcmQzMiAqc2ZiVGhyZXNob2xkOyAgICAgICAKKyAgV29yZDMyICptZGN0U3BlY3RydW07ICAgICAgICAKICAgV29yZDMyICBzZmJFblN1bUxSOwogICBXb3JkMzIgIHNmYkVuU3VtTVM7CiAgIFdvcmQzMiBzZmJEaXN0W01BWF9HUk9VUEVEX1NGQl07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9saW5lX3BlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9saW5lX3BlLmgKaW5kZXggMTE2ZDVhOC4uMDM4ZDVhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaApAQCAtMjQsOCArMjQsOCBAQAogI2RlZmluZSBfX0xJTkVfUEVfSAogCiAKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIgCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiIAogCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTcyLDQgKzcyLDQgQEAKIAogCiAKLSNlbmRpZgorI2VuZGlmIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbnN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaAppbmRleCAxOWZiOWIyLi5iMDVkNjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaApAQCAtNjksNyArNjksNyBAQAogCiAjZGVmaW5lIEJMT0NLX1NXSVRDSElOR19PRkZTRVQJCSAgICgxKjEwMjQrMyoxMjgrNjQrMTI4KQogI2RlZmluZSBCTE9DS19TV0lUQ0hJTkdfREFUQV9TSVpFICAgICAgICAgIEZSQU1FX0xFTl9MT05HCi0KKwkJCQkJCQkJCQkgICAgCiAjZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfTE9ORyAgICAwCiAjZGVmaW5lIFRSQU5TRk9STV9PRkZTRVRfU0hPUlQgICA0NDgKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X21haW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKaW5kZXggMmNjYWM2MC4uNWZjYmUxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X21haW4uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfbWFpbi5oCkBAIC01NCw5ICs1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgpOwogCiAKLVdvcmQxNiBwc3lNYWluKFdvcmQxNiAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsICAgLyohPCB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KK1dvcmQxNiBwc3lNYWluKFdvcmQxNiAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsICAgLyohPCB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8gICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgICplbGVtSW5mbywKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAqdGltZVNpZ25hbCwgLyohPCBpbnRlcmxlYXZlZCB0aW1lIHNpZ25hbCAqLworICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLCAvKiE8IGludGVybGVhdmVkIHRpbWUgc2lnbmFsICovIAogICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKICAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCiAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HKiAgcHN5Q29uZkxvbmcsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19tYWluLmgKaW5kZXggOGY4Mzk3My4uOTI0YTA2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX21haW4uaApAQCAtMzUsNyArMzUsNyBAQAogCiBXb3JkMTYgUUNOZXcoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwogCi1Xb3JkMTYgUUNJbml0KFFDX1NUQVRFICpoUUMsCitXb3JkMTYgUUNJbml0KFFDX1NUQVRFICpoUUMsIAogICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7CiAKIHZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3F1YW50aXplLmgKaW5kZXggMWNhZmVmNi4uN2RhYzJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xdWFudGl6ZS5oCkBAIC0yOCw3ICsyOCw3IEBACiAKICNkZWZpbmUgTUFYX1FVQU5UIDgxOTEKIAotdm9pZCBRdWFudGl6ZVNwZWN0cnVtKFdvcmQxNiBzZmJDbnQsCit2b2lkIFF1YW50aXplU3BlY3RydW0oV29yZDE2IHNmYkNudCwgCiAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldCwgV29yZDMyICptZGN0U3BlY3RydW0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaAppbmRleCA5MDM5ZjI1Li4xMTQzNmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NmX2VzdGltLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpZm5kZWYgX19TRl9FU1RJTV9IX18KICNkZWZpbmUgX19TRl9FU1RJTV9IX18KIC8qCi0gICBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgorICAgU2NhbGUgZmFjdG9yIGVzdGltYXRpb24gCiAgKi8KICNpbmNsdWRlICJwc3lfY29uc3QuaCIKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3N0YXRfYml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmgKaW5kZXggOWNkZGMxZC4uZmZmM2QxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogV29yZDE2IGNvdW50U3RhdGljQml0ZGVtYW5kKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywgCiAJCQkJCQkJV29yZDE2IGFkdHNVc2VkKTsKIAogI2VuZGlmIC8qIF9fU1RBVF9CSVRTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19wYXJhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKaW5kZXggMGFhMzNjMy4uNzgyNjViYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIH1UTlNfSU5GT19UQUI7CiAKIAotdm9pZCBHZXRUbnNQYXJhbShUTlNfQ09ORklHX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiLAordm9pZCBHZXRUbnNQYXJhbShUTlNfQ09ORklHX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiLCAKICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsIFdvcmQxNiBjaGFubmVscywgV29yZDE2IGJsb2NrVHlwZSk7CiAKIHZvaWQgR2V0VG5zTWF4QmFuZHMoV29yZDMyIHNhbXBsaW5nUmF0ZSwgV29yZDE2IGJsb2NrVHlwZSwgV29yZDE2KiB0bnNNYXhTZmIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaAppbmRleCBmYmFjN2FhLi45M2Q1ZmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaApAQCAtMjQsNyArMjQsNyBAQAogI2RlZmluZSBfX1RSQU5TRk9STV9IX18KIAogI2luY2x1ZGUgInR5cGVkZWYuaCIKLQorICAgICAgICAgICAgICAgICAgCiB2b2lkIFRyYW5zZm9ybV9SZWFsKFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCiAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwgICAgIC8qISBjaGFubmVsIGluY3JlbWVudCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjX3JvbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjX3JvbS5jCmluZGV4IDA4NzkyZTguLjE2YjQ0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMKQEAgLTI0LDE0ICsyNCwxNCBAQAogCiAjaWYgZGVmaW5lZCAoQVJNVjVFKSAmJiAhZGVmaW5lZCAoQVJNVjdOZW9uKQogCi0vKgotICogIFEzMCBmb3IgMTI4IGFuZCAxMDI0CisvKiAKKyAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNCAKICAqCiAgKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgewogICogICBhbmdsZSA9IChpICsgMC4xMjUpICogTV9QSSAvIG51bTsKICAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7CiAgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICoKKyAqIAogICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKICAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7CiAgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwpAQCAtMzksMzEzICszOSwzMTMgQEAKICAqLwogY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsKIAkvKiAxMjggKi8KLQkweDNmZmZlYzQzLCAweDAwMzI0M2YxLCAweDAxNWZkNGQyLCAweDNmZmMzOGQxLCAweDNmZjljMTNhLCAweDAxYzQ1NGY1LCAweDAyZjFiNzU1LCAweDNmZWVhNzc2LAotCTB4M2ZlOWI4YTksIDB4MDM1NjIwMzgsIDB4MDQ4MzI1OWQsIDB4M2ZkNzNhNGEsIDB4M2ZjZmQ1MGIsIDB4MDRlNzY3YzUsIDB4MDYxM2UxYzUsIDB4M2ZiNWY0ZWEsCi0JMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwKLQkweDNmNDczNzU5LCAweDA5OTViZGZkLCAweDBhYmY4MDQzLCAweDNmMTc0ZTcwLCAweDNmMDYxZTk1LCAweDBiMjI4ZDQyLCAweDBjNGIwYjk0LCAweDNlY2VlYWFkLAotCTB4M2ViYjRkZGIsIDB4MGNhZGE0ZjUsIDB4MGRkNGIxOWEsIDB4M2U3Y2Q3NzgsIDB4M2U2NmQwYjQsIDB4MGUzNmM4MmEsIDB4MGY1YzM1YTMsIDB4M2UyMTIxNzksCi0JMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwKLQkweDNkMmZkODZjLCAweDEyYzQxYTRmLCAweDEzZTM5YmU5LCAweDNjZDRjMzhiLCAweDNjYjUzYWFhLCAweDE0NDMxMGRkLCAweDE1NjA0MDEzLCAweDNjNTMxZTg4LAotCTB4M2MzMTQwNjAsIDB4MTViZWU3OGMsIDB4MTZkOTk4NjQsIDB4M2JjODJjMWYsIDB4M2JhM2ZkZTcsIDB4MTczNzYzYzksIDB4MTg0ZjZhYWIsIDB4M2IzNDAxYmIsCi0JMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwKLQkweDM5YzU2NjRmLCAweDFiOGE3ODE1LCAweDFjOTk3ZmM0LCAweDM5NDExZTMzLCAweDM5MTNlYjBlLCAweDFjZjM0YmFmLCAweDFkZmVmZjY3LCAweDM4ODkwNjYzLAotCTB4Mzg1OWEyOTIsIDB4MWU1N2E4NmQsIDB4MWY1ZmRlZTYsIDB4MzdjODM2YzIsIDB4Mzc5NmE5OTYsIDB4MWZiNzU3NWMsIDB4MjBiYmU3ZDgsIDB4MzZmZWNkMGUsCi0JMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwKLQkweDM1MWFjZWRkLCAweDIzYjgzNmNhLCAweDI0YjBlNjk5LCAweDM0NzAzMDk1LCAweDM0MzY0ZGE2LCAweDI1MDMxN2RmLCAweDI1Zjc4NDk3LCAweDMzODVhMjIyLAotCTB4MzM0OWJmNDgsIDB4MjY0ODQzZDksIDB4MjczODQ3YzgsIDB4MzI5MzIxYzcsIDB4MzI1NTQ4NDAsIDB4Mjc4Nzg4OTMsIDB4Mjg3MmZlYjYsIDB4MzE5OGQ0ZWEsCi0JMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwKLQkweDJmNDllZTBmLCAweDJiMjAwM2FjLCAweDJiZmNmOTdjLCAweDJlN2NhYjFjLCAweDJlMzc1OTJjLCAweDJjNDVjOGEwLCAweDJkMWRhM2Q1LCAweDJkNjRiOWRhLAorCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsIAorCTB4M2ZlOWI4YTksIDB4MDM1NjIwMzgsIDB4MDQ4MzI1OWQsIDB4M2ZkNzNhNGEsIDB4M2ZjZmQ1MGIsIDB4MDRlNzY3YzUsIDB4MDYxM2UxYzUsIDB4M2ZiNWY0ZWEsIAorCTB4M2ZhYzFhNWIsIDB4MDY3N2VkYmIsIDB4MDdhM2FkZmYsIDB4M2Y4YWRjNzcsIDB4M2Y3ZThlMWUsIDB4MDgwNzc0NTcsIDB4MDkzMjRjYTcsIDB4M2Y1NWY3OTYsIAorCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsIAorCTB4M2ViYjRkZGIsIDB4MGNhZGE0ZjUsIDB4MGRkNGIxOWEsIDB4M2U3Y2Q3NzgsIDB4M2U2NmQwYjQsIDB4MGUzNmM4MmEsIDB4MGY1YzM1YTMsIDB4M2UyMTIxNzksIAorCTB4M2UwOGI0MmEsIDB4MGZiZGJhNDAsIDB4MTBlMTViNGUsIDB4M2RiYmQ2ZDQsIDB4M2RhMTA2YmQsIDB4MTE0MjNlZjAsIDB4MTI2M2U2OTksIDB4M2Q0ZDA3MjgsIAorCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsIAorCTB4M2MzMTQwNjAsIDB4MTViZWU3OGMsIDB4MTZkOTk4NjQsIDB4M2JjODJjMWYsIDB4M2JhM2ZkZTcsIDB4MTczNzYzYzksIDB4MTg0ZjZhYWIsIDB4M2IzNDAxYmIsIAorCTB4M2IwZDg5MDksIDB4MThhYzRiODcsIDB4MTljMTdkNDQsIDB4M2E5NmI2MzYsIDB4M2E2ZGY4ZjgsIDB4MWExZDY1NDQsIDB4MWIyZjk3MWUsIDB4MzlmMDYxZDIsIAorCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsIAorCTB4Mzg1OWEyOTIsIDB4MWU1N2E4NmQsIDB4MWY1ZmRlZTYsIDB4MzdjODM2YzIsIDB4Mzc5NmE5OTYsIDB4MWZiNzU3NWMsIDB4MjBiYmU3ZDgsIDB4MzZmZWNkMGUsIAorCTB4MzZjYjFlMmEsIDB4MjExMjIyNDAsIDB4MjIxMmU0OTIsIDB4MzYyY2U4NTUsIDB4MzVmNzFmYjEsIDB4MjI2N2QzYTAsIDB4MjM2NGEwMmUsIDB4MzU1MmE4ZjQsIAorCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsIAorCTB4MzM0OWJmNDgsIDB4MjY0ODQzZDksIDB4MjczODQ3YzgsIDB4MzI5MzIxYzcsIDB4MzI1NTQ4NDAsIDB4Mjc4Nzg4OTMsIDB4Mjg3MmZlYjYsIDB4MzE5OGQ0ZWEsIAorCTB4MzE1OTBlM2UsIDB4MjhjMGI0ZDIsIDB4MjlhNzc4ZGIsIDB4MzA5NmUyMjMsIDB4MzA1NTM4MjgsIDB4MjlmMzk4NGMsIDB4MmFkNTg2YTMsIDB4MmY4ZDcxM2EsIAorCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsIAogCS8qIDEwMjQgKi8KLQkweDNmZmZmZmIxLCAweDAwMDY0ODdmLCAweDAwMmJmYjc0LCAweDNmZmZmMGUzLCAweDNmZmZlNzA1LCAweDAwMzg4YzZlLCAweDAwNWUzZjRjLCAweDNmZmZiYTliLAotCTB4M2ZmZmE2ZGUsIDB4MDA2YWQwM2IsIDB4MDA5MDgyZWEsIDB4M2ZmZjVjZDgsIDB4M2ZmZjNmM2MsIDB4MDA5ZDEzYzUsIDB4MDBjMmM2MmYsIDB4M2ZmZWQ3OWIsCi0JMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwKLQkweDNmZmQxYjdlLCAweDAxMzNkYmEzLCAweDAxNTk4Y2IxLCAweDNmZmM1YjBjLCAweDNmZmMxNWY3LCAweDAxNjYxY2YwLCAweDAxOGJjZDViLCAweDNmZmIzN2VjLAotCTB4M2ZmYWU4ZjksIDB4MDE5ODVkNjAsIDB4MDFiZTBkMTEsIDB4M2ZmOWVkNTMsIDB4M2ZmOTk0ODMsIDB4MDFjYTljZDQsIDB4MDFmMDRiYjQsIDB4M2ZmODdiNDQsCi0JMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwKLQkweDNmZjRhYTVkLCAweDAyNjE1NDE0LCAweDAyODZmZmYzLCAweDNmZjMzODU4LCAweDNmZjJiODEzLCAweDAyOTM4ZTYyLCAweDAyYjkzOTE0LCAweDNmZjEyODc4LAotCTB4M2ZmMDllNTYsIDB4MDJjNWM3MWEsIDB4MDJlYjcwODYsIDB4M2ZlZWYxMjYsIDB4M2ZlZTVkMjgsIDB4MDJmN2ZlMWMsIDB4MDMxZGE2MmIsIDB4M2ZlYzkyNjUsCi0JMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwKLQkweDNmZTZhZDA4LCAweDAzOGU5N2E5LCAweDAzYjQzYjE3LCAweDNmZTQ4OTkwLCAweDNmZTNjZTI2LCAweDAzYzBjNjllLCAweDAzZTY2ODUyLCAweDNmZTE4ZDFmLAotCTB4M2ZlMGM3ZGEsIDB4MDNmMmYzNDIsIDB4MDQxODkzMjYsIDB4M2ZkZTY5NDUsIDB4M2ZkZDlhMjcsIDB4MDQyNTFkNzcsIDB4MDQ0YWJiNzMsIDB4M2ZkYjFlMDYsCi0JMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwKLQkweDNmZDMyNGI3LCAweDA0YmI4YzQyLCAweDA0ZTEyM2ZhLCAweDNmZDA0ZmZjLCAweDNmY2Y1OTdjLCAweDA0ZWRhYjgzLCAweDA1MTM0MGY2LCAweDNmY2M2NzNiLAotCTB4M2ZjYjY2ZTQsIDB4MDUxZmM3YjksIDB4MDU0NTVhZDEsIDB4M2ZjODU3MWYsIDB4M2ZjNzRjZjMsIDB4MDU1MWUwYzcsIDB4MDU3NzcxNmIsIDB4M2ZjNDFmYWMsCi0JMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywKLQkweDNmYmExMzFiLCAweDA1ZTgxN2MzLCAweDA2MGRhMDgzLCAweDNmYjY4ZDViLCAweDNmYjU1YmRjLCAweDA2MWEyMmY3LCAweDA2M2ZhOGU3LCAweDNmYjFiOGEyLAotCTB4M2ZiMDdkNTAsIDB4MDY0YzJhNjcsIDB4MDY3MWFkNzEsIDB4M2ZhY2JjOWYsIDB4M2ZhYjc3N2IsIDB4MDY3ZTJkZjUsIDB4MDZhM2FlMDAsIDB4M2ZhNzk5NTQsCi0JMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywKLQkweDNmOWI3YTYyLCAweDA3MTQyMDFiLCAweDA3Mzk5NmExLCAweDNmOTc0M2ViLCAweDNmOTVkNzg3LCAweDA3NDYxMmViLCAweDA3NmI4NjE2LCAweDNmOTE4M2E1LAotCTB4M2Y5MDBkNzIsIDB4MDc3ODAxM2QsIDB4MDc5ZDcwZjcsIDB4M2Y4YjljMjgsIDB4M2Y4YTFjMjksIDB4MDdhOWVhZjUsIDB4MDdjZjU3MjYsIDB4M2Y4NThkNzksCi0JMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwKLQkweDNmNzc1ZDMxLCAweDA4M2Y4YjQzLCAweDA4NjRlYzRmLCAweDNmNzI3NjYxLCAweDNmNzBjZjM4LCAweDA4NzE2MTU5LCAweDA4OTZiZTgwLCAweDNmNmJjYjBlLAotCTB4M2Y2YTFhMWMsIDB4MDhhMzMyM2EsIDB4MDhjODhiNjUsIDB4M2Y2NGY4OWIsIDB4M2Y2MzNkZTIsIDB4MDhkNGZkYzYsIDB4MDhmYTUyZGUsIDB4M2Y1ZGZmMGUsCi0JMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwKLQkweDNmNGRiZWFjLCAweDA5NmEzZjQyLCAweDA5OGY4Nzk2LCAweDNmNDgyN2YwLCAweDNmNDY0NjI2LCAweDA5OWJmNDRjLCAweDA5YzEzODMxLCAweDNmNDA5MjIzLAotCTB4M2YzZWE2OTcsIDB4MDljZGEzNjgsIDB4MDlmMmUyYzcsIDB4M2YzOGQ1NTIsIDB4M2YzNmUwMDYsIDB4MDlmZjRjNzgsIDB4MGEyNDg3M2EsIDB4M2YzMGYxODEsCi0JMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwKLQkweDNmMWVhMjZlLCAweDBhOTQyMjJmLCAweDBhYjk0ZThmLCAweDNmMTg1YzQzLCAweDNmMTY0MDAxLCAweDBhYzViMWRjLCAweDBhZWFkOTQ0LCAweDNmMGZkY2E1LAotCTB4M2YwZGI2YTksIDB4MGFmNzNhZTUsIDB4MGIxYzVkM2QsIDB4M2YwNzM2MjEsIDB4M2YwNTA2NmQsIDB4MGIyOGJkMmEsIDB4MGI0ZGRhNWMsIDB4M2VmZTY4YmMsCi0JMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwKLQkweDNlZWEwYzhlLCAweDBiYmQxYTMzLCAweDBiZTIyNzY2LCAweDNlZTMxNzdlLCAweDNlZTBjMGY0LCAweDBiZWU4MDM4LCAweDBjMTM4N2U5LCAweDNlZDlhZWNjLAotCTB4M2VkNzRlOTEsIDB4MGMxZmRlZTEsIDB4MGM0NGUwZjksIDB4M2VkMDFmNTUsIDB4M2VjZGI1NmEsIDB4MGM1MTM2MTAsIDB4MGM3NjMyNzgsIDB4M2VjNjY5MjAsCi0JMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwKLQkweDNlYjAwMTljLCAweDBjZTUwZDhjLCAweDBkMDlmODViLCAweDNlYTg1ZTQxLCAweDNlYTVjZGEzLCAweDBkMTY0NWEwLCAweDBkM2IyYTY0LCAweDNlOWUwZDRjLAotCTB4M2U5YjczMDYsIDB4MGQ0Nzc1YTEsIDB4MGQ2YzU0NDMsIDB4M2U5Mzk1YjcsIDB4M2U5MGYxY2EsIDB4MGQ3ODlkNzEsIDB4MGQ5ZDc1ZGIsIDB4M2U4OGY3ODgsCi0JMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwKLQkweDNlNzA4NjlmLCAweDBlMGJlMjhlLCAweDBlMzBhN2M1LCAweDNlNjgzNWE0LCAweDNlNjU2YjJiLCAweDBlM2NlODZiLCAweDBlNjFhNzBmLCAweDNlNWNmZDUxLAotCTB4M2U1YTI5MzksIDB4MGU2ZGU1ODAsIDB4MGU5MjlkN2EsIDB4M2U1MTllODYsIDB4M2U0ZWMwZDEsIDB4MGU5ZWQ5YWYsIDB4MGVjMzhhZTgsIDB4M2U0NjE5NGEsCi0JMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywKLQkweDNlMmJhMTFiLCAweDBmMzE3ZmE1LCAweDBmNTYxYzE1LCAweDNlMjJhMzM4LCAweDNlMWY5ZjIxLCAweDBmNjI0ZjBjLCAweDBmODZlNDYwLCAweDNlMTY4NDgwLAotCTB4M2UxMzc2ZDUsIDB4MGY5MzE0ZjUsIDB4MGZiN2EzMTcsIDB4M2UwYTNmN2IsIDB4M2UwNzI4M2YsIDB4MGZjM2QxNDMsIDB4MGZlODU4MWQsIDB4M2RmZGQ0MzIsCi0JMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwKLQkweDNkZTE1NzA4LCAweDEwNTVjYjViLCAweDEwN2EzYmQ1LCAweDNkZDdhZDA1LCAweDNkZDQ2Zjk0LCAweDEwODY2MDBlLCAweDEwYWFjOGU2LCAweDNkY2FhOGY1LAotCTB4M2RjNzYxZmMsIDB4MTBiNmVhOTAsIDB4MTBkYjRiYWYsIDB4M2RiZDdlYzcsIDB4M2RiYTJlNDgsIDB4MTBlNzZhYzMsIDB4MTEwYmM0MTMsIDB4M2RiMDJlODQsCi0JMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwKLQkweDNkOTFhZWQ5LCAweDExNzhhYzUzLCAweDExOWNlZGFmLCAweDNkODc1OThjLCAweDNkODNlMzA5LCAweDExYTkwMjFkLCAweDExY2QzYjUwLCAweDNkNzk3MTQ1LAotCTB4M2Q3NWYxNDcsIDB4MTFkOTRkMDIsIDB4MTFmZDdkZjYsIDB4M2Q2YjYzMTMsIDB4M2Q2N2Q5OWIsIDB4MTIwOThjZTUsIDB4MTIyZGI1ODMsIDB4M2Q1ZDJlZmUsCi0JMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwKLQkweDNkM2NhZjc2LCAweDEyOWEwOTU0LCAweDEyYmUxODZjLCAweDNkMzFhZmM1LCAweDNkMmUwMDdjLCAweDEyY2ExYzAzLCAweDEyZWUyMjZjLCAweDNkMjJlNDdjLAotCTB4M2QxZjJiYzUsIDB4MTJmYTIzMWIsIDB4MTMxZTIwYzAsIDB4M2QxM2YzN2UsIDB4M2QxMDMxNWEsIDB4MTMyYTFlN2UsIDB4MTM0ZTEzNDgsIDB4M2QwNGRjZDIsCi0JMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwKLQkweDNjZTI2MDNmLCAweDEzYjljOTQzLCAweDEzZGRhMmY3LCAweDNjZDZiNzFlLCAweDNjZDJjZjYyLCAweDEzZTk5NGFiLCAweDE0MGQ2NTJjLCAweDNjYzcwYTFjLAotCTB4M2NjMzE4ZmYsIDB4MTQxOTUzY2IsIDB4MTQzZDFiMDIsIDB4M2NiNzM3OWMsIDB4M2NiMzNkMjIsIDB4MTQ0OTA2ODUsIDB4MTQ2Y2M0NWMsIDB4M2NhNzNmYTksCi0JMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwKLQkweDNjODJjOTA5LCAweDE0ZDdkMzJhLCAweDE0ZmI3NDVlLCAweDNjNzY3NzdiLCAweDNjNzI1N2EyLCAweDE1MDc1MzI3LCAweDE1MmFlYWEzLCAweDNjNjVlYTFjLAotCTB4M2M2MWMwZjEsIDB4MTUzNmM2MmIsIDB4MTU1YTUzZDksIDB4M2M1NTM3N2IsIDB4M2M1MTA1MDEsIDB4MTU2NjJjMTgsIDB4MTU4OWFmZTMsIDB4M2M0NDVmYTIsCi0JMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwKLQkweDNjMWRmMjFmLCAweDE1ZjQwZTNhLCAweDE2MTc3M2Q2LCAweDNjMTBmOTM1LCAweDNjMGNhMTliLCAweDE2MjMzZWFjLCAweDE2NDY5YTBkLCAweDNiZmY4Y2U4LAotCTB4M2JmYjJjMGMsIDB4MTY1MjYxNzYsIDB4MTY3NWIyODYsIDB4M2JlZGZiOTksIDB4M2JlOTkxN2UsIDB4MTY4MTc2N2MsIDB4MTZhNGJkMjUsIDB4M2JkYzQ1NTIsCi0JMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwKLQkweDNiYjNlNDQwLCAweDE3MGU2MWNjLCAweDE3MzE4OGJlLCAweDNiYTY0NTFiLCAweDNiYTFiNjIwLCAweDE3M2QzZTliLCAweDE3NjA1YWQwLCAweDNiOTNmYjYzLAotCTB4M2I4ZjYzMzcsIDB4MTc2YzBkMTUsIDB4MTc4ZjFlNzYsIDB4M2I4MThjZWIsIDB4M2I3Y2ViOTAsIDB4MTc5YWNkMWMsIDB4MTdiZGQzOTQsIDB4M2I2ZWY5YmUsCi0JMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwKLQkweDNiNDRhOGEwLCAweDE4MjZiNTYxLCAweDE4NDk5YTlkLCAweDNiMzY2NDZlLCAweDNiMzE5ZTc3LCAweDE4NTUzYTdkLCAweDE4NzgxNDdhLCAweDNiMjMzZWUxLAotCTB4M2IxZTZmY2EsIDB4MTg4M2IwOTcsIDB4MThhNjdmM2YsIDB4M2IwZmY0ZDksIDB4M2IwYjFjYTYsIDB4MThiMjE3OTEsIDB4MThkNGRhZDAsIDB4M2FmYzg2NjMsCi0JMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwKLQkweDNhZDA0OGUzLCAweDE5M2NmMGE5LCAweDE5NWY5MTI4LCAweDNhYzE2MGUxLCAweDNhYmM2NDU4LCAweDE5NmIxYTA5LCAweDE5OGRhZWM4LCAweDNhYWQ2MTI5LAotCTB4M2FhODViOTIsIDB4MTk5OTMzYmIsIDB4MTliYmJjYTYsIDB4M2E5OTNkM2UsIDB4M2E5NDJlOWQsIDB4MTljNzNkYTMsIDB4MTllOWJhYTMsIDB4M2E4NGY1MmYsCi0JMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwKLQkweDNhNTZjZjIzLCAweDFhNTBmYjgxLCAweDFhNzM1NDQyLCAweDNhNDc0NDljLCAweDNhNDIxMWYwLCAweDFhN2VjNTI0LCAweDFhYTExMWE2LCAweDNhMzI2Yzc0LAotCTB4M2EyZDMwY2QsIDB4MWFhYzdlNmYsIDB4MWFjZWJlOWQsIDB4M2ExZDcwNjYsIDB4M2ExODJiYzgsIDB4MWFkYTI3NDYsIDB4MWFmYzViMGEsIDB4M2EwODUwN2YsCi0JMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwKLQkweDM5ZDg0NWU5LCAweDFiNjJiZGY4LCAweDFiODRjYzAxLCAweDM5YzgxYTM2LCAweDM5YzJiMWRhLCAweDFiOTAyM2U1LCAweDFiYjIyNTMwLCAweDM5YjI2YjZkLAotCTB4MzlhY2ZhMmIsIDB4MWJiZDc4ZDIsIDB4MWJkZjZkNGEsIDB4Mzk5Yzk5MGQsIDB4Mzk5NzFlZTcsIDB4MWJlYWJjYTEsIDB4MWMwY2E0MzIsIDB4Mzk4NmEzMjQsCi0JMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwKLQkweDM5NTRiODJlLCAweDFjNzIyMDRmLCAweDFjOTNlMGFiLCAweDM5NDNlY2I2LCAweDM5M2U0ZjIzLCAweDFjOWYxZTk2LCAweDFjYzBkMWI2LCAweDM5MmQ2OTJmLAotCTB4MzkyN2MyYzksIDB4MWNjYzBiMzUsIDB4MWNlZGIxMDYsIDB4MzkxNmMyNjIsIDB4MzkxMTEzMmQsIDB4MWNmOGU2MTEsIDB4MWQxYTdlN2QsIDB4MzhmZmY4NWUsCi0JMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwKLQkweDM4Y2MzMTVkLCAweDFkN2YwYWZiLCAweDFkYTA3YWJjLCAweDM4YmFjNzk1LCAweDM4YjRmNTQ3LCAweDFkYWI5ZGI1LCAweDFkY2NmZmJmLCAweDM4YTM3MTQyLAotCTB4Mzg5ZDk2MzcsIDB4MWRkODFlMjEsIDB4MWRmOTcyNWYsIDB4Mzg4YmY3ZmYsIDB4Mzg4NjE0M2IsIDB4MWUwNDhjMjQsIDB4MWUyNWQyODIsIDB4Mzg3NDViZGIsCi0JMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwKLQkweDM4M2ViZDRjLCAweDFlODk2NmE4LCAweDFlYWE4MmU5LCAweDM4MmNiNmI3LCAweDM4MjZiMDMwLCAweDFlYjU4OWY3LCAweDFlZDY5ODA1LCAweDM4MTQ4ZjlmLAotCTB4MzgwZTgwNzEsIDB4MWVlMTlhNTQsIDB4MWYwMjlhMWMsIDB4MzdmYzQ1ZWYsIDB4MzdmNjJlMWQsIDB4MWYwZDk3YTUsIDB4MWYyZTg5MTEsIDB4MzdlM2Q5YjcsCi0JMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywKLQkweDM3YWM2ODQxLCAweDFmOTExYzNkLCAweDFmYjFlMjFkLCAweDM3OTljNjZmLCAweDM3OTM4YzM0LCAweDFmYmNjYzRkLCAweDFmZGQ4MzgxLCAweDM3ODBkMGFhLAotCTB4Mzc3YThkZGYsIDB4MWZlODY4YzgsIDB4MjAwOTExM2MsIDB4Mzc2N2I4YTksIDB4Mzc2MTZkNTEsIDB4MjAxM2YxOTYsIDB4MjAzNDhiMzUsIDB4Mzc0ZTdlN2IsCi0JMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwKLQkweDM3MTUzZWVlLCAweDIwOTYxNGQ5LCAweDIwYjY4MTgxLCAweDM3MDIwMzdjLCAweDM2ZmI5NjE4LCAweDIwYzE0ZGRmLCAweDIwZTFhYjYzLCAweDM2ZTg0MTM1LAotCTB4MzZlMWNiNTgsIDB4MjBlYzcyYjEsIDB4MjEwY2MwZmMsIDB4MzZjZTVkMTAsIDB4MzZjN2RlYmQsIDB4MjExNzgzMzQsIDB4MjEzN2MyMzIsIDB4MzZiNDU3MWIsCi0JMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwKLQkweDM2Nzk0ZTZlLCAweDIxOTgzOWQ4LCAweDIxYjg0YTc5LCAweDM2NjU3YjA4LCAweDM2NWVkYjA5LCAweDIxYzJmODE1LCAweDIxZTJmOTFhLCAweDM2NGFlZTdiLAotCTB4MzY0NDQ2MWIsIDB4MjFlZGExN2YsIDB4MjIwZDkyZDQsIDB4MzYzMDQwNzAsIDB4MzYyOThmYjQsIDB4MjIxODM1ZmIsIDB4MjIzODE3OGQsIDB4MzYxNTcwZjgsCi0JMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywKLQkweDM1ZDhhNDQ5LCAweDIyOTc3NGQ3LCAweDIyYjcyNmE4LCAweDM1YzQzYWE3LCAweDM1YmQ2OGExLCAweDIyYzFiNDk2LCAweDIyZTE1NjU1LCAweDM1YThlNjIxLAotCTB4MzVhMjBiZDMsIDB4MjJlYmRlZTUsIDB4MjMwYjcwN2UsIDB4MzU4ZDcwODEsIDB4MzU4NjhkZWYsIDB4MjMxNWYzYTgsIDB4MjMzNTc1MDksIDB4MzU3MWQ5ZDksCi0JMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwKLQkweDM1MzM0ZTZmLCAweDIzOTNhZmIyLCAweDIzYjJmZmYzLCAweDM1MWU1MDU2LCAweDM1MTc0Y2UwLCAweDIzYmQ2ZDQ4LCAweDIzZGNhZDAzLCAweDM1MDIzNjM2LAotCTB4MzRmYjJhOTIsIDB4MjNlNzE0ZDMsIDB4MjQwNjQzZjQsIDB4MzRlNWZiNjMsIDB4MzRkZWU3OTUsIDB4MjQxMGE2MzksIDB4MjQyZmM0YWQsIDB4MzRjOTlmZWYsCi0JMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwKLQkweDM0ODk1YjM2LCAweDI0OGNkNDg3LCAweDI0YWJjMDgyLCAweDM0NzNjYTc5LCAweDM0NmM5NjJmLCAweDI0YjYwYzU3LCAweDI0ZDRlNzU3LCAweDM0NTZlZDJmLAotCTB4MzQ0ZmIwZDEsIDB4MjRkZjJkODEsIDB4MjRmZGY3NzUsIDB4MzQzOWVmOWMsIDB4MzQzMmFiMmUsIDB4MjUwODM3ZWQsIDB4MjUyNmYwYzEsIDB4MzQxY2QxZDIsCi0JMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwKLQkweDMzZGFkOTVlLCAweDI1ODJjZGJjLCAweDI1YTE1MmMwLCAweDMzYzRiN2RiLCAweDMzYmQ1MzVjLCAweDI1YWI3YzMwLCAweDI1YzllZmNhLCAweDMzYTcxOWU4LAotCTB4MzM5ZmFkNzAsIDB4MjVkNDEzNjksIDB4MjVmMjc1ODQsIDB4MzM4OTVjMTgsIDB4MzM4MWU3YWMsIDB4MjVmYzkzNGIsIDB4MjYxYWUzZDYsIDB4MzM2YjdlN2UsCi0JMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwKLQkweDMzMjdkODA4LCAweDI2NzU4NWY4LCAweDI2OTNhMTYxLCAweDMzMTEyN2FiLCAweDMzMDk5MzljLCAweDI2OWRhNzhiLCAweDI2YmJiMTE5LCAweDMyZjJjYmExLAotCTB4MzJlYjJmYjUsIDB4MjZjNWIxNGMsIDB4MjZlM2E4ZWMsIDB4MzJkNDUwMjksIDB4MzJjY2FjNjQsIDB4MjZlZGEzMjIsIDB4MjcwYjg4YzIsIDB4MzJiNWI1NTcsCi0JMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwKLQkweDMyNzA2NmJjLCAweDI3NjRlODJmLCAweDI3ODI5NzYwLCAweDMyNTkyOTdkLCAweDMyNTE2Njg2LCAweDI3OGM3OTY1LCAweDI3YWExNjRjLCAweDMyM2ExMWZlLAotCTB4MzIzMjQ3NDYsIDB4MjdiM2YyMzUsIDB4MjdkMTdjYzEsIDB4MzIxYWRiODMsIDB4MzIxMzA5MGYsIDB4MjdkYjUyODgsIDB4MjdmOGNhYTUsIDB4MzFmYjg2MjAsCi0JMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwKLQkweDMxYjQ5NTY0LCAweDI4NTBkZjlkLCAweDI4NmUyMDAyLCAweDMxOWNjZDQ2LCAweDMxOTRkYzE0LCAweDI4NzdkZDA3LCAweDI4OTUwYWI2LCAweDMxN2NmZDA0LAotCTB4MzE3NTA0MmUsIDB4Mjg5ZWMxN2EsIDB4MjhiYmRjNjEsIDB4MzE1ZDBlM2IsIDB4MzE1NTBkYzYsIDB4MjhjNThjZGYsIDB4MjhlMjk0ZWIsIDB4MzEzZDAwZmYsCi0JMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwKLQkweDMwZjQ3NDQ5LCAweDI5Mzk1N2M5LCAweDI5NTYyNmRhLCAweDMwZGMyMzVlLCAweDMwZDQwNGEwLCAweDI5NWZiZTA2LCAweDI5N2M3OWY1LCAweDMwYmI5ZDFjLAotCTB4MzBiMzc2ZDgsIDB4Mjk4NjBhYmQsIDB4MjlhMmIzNzgsIDB4MzA5YWY4Y2EsIDB4MzA5MmNiMDUsIDB4MjlhYzNkZDcsIDB4MjljOGQzNGQsIDB4MzA3YTM2N2MsCi0JMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwKLQkweDMwMzAxNDE4LCAweDJhMWUzYzhhLCAweDJhM2E5N2M3LCAweDMwMTczYzdhLCAweDMwMGVmMGU1LCAweDJhNDQwODQ0LCAweDJhNjA0ZmY1LCAweDJmZjYwMzBhLAotCTB4MmZlZGIwMGQsIDB4MmE2OWI5ZWMsIDB4MmE4NWVlMDAsIDB4MmZkNGFjMDQsIDB4MmZjYzUxYTUsIDB4MmE4ZjUxNmIsIDB4MmFhYjcxZDAsIDB4MmZiMzM3N2MsCi0JMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwKLQkweDJmNjc4NWQ3LCAweDJhZmY3YTA1LCAweDJiMWI1ZWY4LCAweDJmNGUyOWFmLCAweDJmNDViMWZiLCAweDJiMjRhN2Y2LCAweDJiNDA3OGY1LCAweDJmMmMzZmYyLAotCTB4MmYyM2MwZjYsIDB4MmI0OWJiNGEsIDB4MmI2NTc4NDQsIDB4MmYwYTM5MWQsIDB4MmYwMWIyZGUsIDB4MmI2ZWIzZWEsIDB4MmI4YTVjY2UsIDB4MmVlODE1NDMsCi0JMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwKLQkweDJlOWFkYWVlLCAweDJiZGNmY2IwLCAweDJiZjg2OGVkLCAweDJlODBmYzZlLCAweDJlNzg1OTU4LCAweDJjMDE4OTllLCAweDJjMWNlMTgxLCAweDJlNWU2NTU2LAotCTB4MmU1NWJiMTcsIDB4MmMyNWZiNjYsIDB4MmM0MTNlZGYsIDB4MmUzYmIxYTQsIDB4MmUzMzAwNDIsIDB4MmM0YTUxZjMsIDB4MmM2NTgwZjEsIDB4MmUxOGUxNmQsCi0JMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywKLQkweDJkY2EyNTFjLCAweDJjYjZiMTU1LCAweDJjZDFhMjdiLCAweDJkYWZjNjgzLCAweDJkYTZmOGNhLCAweDJjZGE5YTE0LCAweDJjZjU3NjdjLCAweDJkOGM4NTEwLAorCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsIAorCTB4M2ZmZmE2ZGUsIDB4MDA2YWQwM2IsIDB4MDA5MDgyZWEsIDB4M2ZmZjVjZDgsIDB4M2ZmZjNmM2MsIDB4MDA5ZDEzYzUsIDB4MDBjMmM2MmYsIDB4M2ZmZWQ3OWIsIAorCTB4M2ZmZWIwMjEsIDB4MDBjZjU2ZWYsIDB4MDBmNTA4ZmMsIDB4M2ZmZTJhZTUsIDB4M2ZmZGY5OGMsIDB4MDEwMTk5OTgsIDB4MDEyNzRiMzEsIDB4M2ZmZDU2YjUsIAorCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsIAorCTB4M2ZmYWU4ZjksIDB4MDE5ODVkNjAsIDB4MDFiZTBkMTEsIDB4M2ZmOWVkNTMsIDB4M2ZmOTk0ODMsIDB4MDFjYTljZDQsIDB4MDFmMDRiYjQsIDB4M2ZmODdiNDQsIAorCTB4M2ZmODE4OTYsIDB4MDFmY2RiMmUsIDB4MDIyMjg5MjQsIDB4M2ZmNmUxYmYsIDB4M2ZmNjc1MzQsIDB4MDIyZjE4NGQsIDB4MDI1NGM1NDQsIDB4M2ZmNTIwYzUsIAorCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsIAorCTB4M2ZmMDllNTYsIDB4MDJjNWM3MWEsIDB4MDJlYjcwODYsIDB4M2ZlZWYxMjYsIDB4M2ZlZTVkMjgsIDB4MDJmN2ZlMWMsIDB4MDMxZGE2MmIsIDB4M2ZlYzkyNjUsIAorCTB4M2ZlYmY0OGIsIDB4MDMyYTMzNDksIDB4MDM0ZmQ5ZTUsIDB4M2ZlYTBjMzUsIDB4M2ZlOTY0ODAsIDB4MDM1YzY2ODIsIDB4MDM4MjBiOTMsIDB4M2ZlNzVlOTgsIAorCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsIAorCTB4M2ZlMGM3ZGEsIDB4MDNmMmYzNDIsIDB4MDQxODkzMjYsIDB4M2ZkZTY5NDUsIDB4M2ZkZDlhMjcsIDB4MDQyNTFkNzcsIDB4MDQ0YWJiNzMsIDB4M2ZkYjFlMDYsIAorCTB4M2ZkYTQ1MGYsIDB4MDQ1NzQ1MWQsIDB4MDQ3Y2UxMWEsIDB4M2ZkN2FiNjQsIDB4M2ZkNmM4OTQsIDB4MDQ4OTZhMTYsIDB4MDRhZjAzZmMsIDB4M2ZkNDExNWYsIAorCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsIAorCTB4M2ZjYjY2ZTQsIDB4MDUxZmM3YjksIDB4MDU0NTVhZDEsIDB4M2ZjODU3MWYsIDB4M2ZjNzRjZjMsIDB4MDU1MWUwYzcsIDB4MDU3NzcxNmIsIDB4M2ZjNDFmYWMsIAorCTB4M2ZjMzBiYWEsIDB4MDU4M2Y2OGMsIDB4MDVhOTg0YTYsIDB4M2ZiZmMwZTMsIDB4M2ZiZWEzMGMsIDB4MDViNjA4ZWIsIDB4MDVkYjk0NjMsIDB4M2ZiYjNhYzcsIAorCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsIAorCTB4M2ZiMDdkNTAsIDB4MDY0YzJhNjcsIDB4MDY3MWFkNzEsIDB4M2ZhY2JjOWYsIDB4M2ZhYjc3N2IsIDB4MDY3ZTJkZjUsIDB4MDZhM2FlMDAsIDB4M2ZhNzk5NTQsIAorCTB4M2ZhNjRhNWYsIDB4MDZiMDJkODEsIDB4MDZkNWFhNzcsIDB4M2ZhMjRlYzYsIDB4M2ZhMGY2MDAsIDB4MDZlMjI4ZWUsIDB4MDcwN2EyYjcsIDB4M2Y5Y2RjZjcsIAorCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsIAorCTB4M2Y5MDBkNzIsIDB4MDc3ODAxM2QsIDB4MDc5ZDcwZjcsIDB4M2Y4YjljMjgsIDB4M2Y4YTFjMjksIDB4MDdhOWVhZjUsIDB4MDdjZjU3MjYsIDB4M2Y4NThkNzksIAorCTB4M2Y4NDAzYWUsIDB4MDdkYmNmZjIsIDB4MDgwMTM4ODMsIDB4M2Y3ZjU3OWIsIDB4M2Y3ZGM0MDUsIDB4MDgwZGIwMTYsIDB4MDgzMzE0ZjEsIDB4M2Y3OGZhOTIsIAorCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsIAorCTB4M2Y2YTFhMWMsIDB4MDhhMzMyM2EsIDB4MDhjODhiNjUsIDB4M2Y2NGY4OWIsIDB4M2Y2MzNkZTIsIDB4MDhkNGZkYzYsIDB4MDhmYTUyZGUsIDB4M2Y1ZGZmMGUsIAorCTB4M2Y1YzNhOGYsIDB4MDkwNmMzZTAsIDB4MDkyYzE0Y2UsIDB4M2Y1NmRlNmEsIDB4M2Y1NTEwMjYsIDB4MDkzODg0NjksIDB4MDk1ZGQxMTYsIDB4M2Y0Zjk2YjQsIAorCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsIAorCTB4M2YzZWE2OTcsIDB4MDljZGEzNjgsIDB4MDlmMmUyYzcsIDB4M2YzOGQ1NTIsIDB4M2YzNmUwMDYsIDB4MDlmZjRjNzgsIDB4MGEyNDg3M2EsIDB4M2YzMGYxODEsIAorCTB4M2YyZWYyNzYsIDB4MGEzMGVmNWUsIDB4MGE1NjI1NmMsIDB4M2YyOGU2YjYsIDB4M2YyNmRkZWMsIDB4MGE2MjhiZmEsIDB4MGE4N2JkM2QsIDB4M2YyMGI0ZjUsIAorCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsIAorCTB4M2YwZGI2YTksIDB4MGFmNzNhZTUsIDB4MGIxYzVkM2QsIDB4M2YwNzM2MjEsIDB4M2YwNTA2NmQsIDB4MGIyOGJkMmEsIDB4MGI0ZGRhNWMsIDB4M2VmZTY4YmMsIAorCTB4M2VmYzJmNTAsIDB4MGI1YTM4OGQsIDB4MGI3ZjUwODEsIDB4M2VmNTc0N2IsIDB4M2VmMzMxNWEsIDB4MGI4YmFjZjAsIDB4MGJiMGJmOGYsIDB4M2VlYzU5NjUsIAorCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsIAorCTB4M2VkNzRlOTEsIDB4MGMxZmRlZTEsIDB4MGM0NGUwZjksIDB4M2VkMDFmNTUsIDB4M2VjZGI1NmEsIDB4MGM1MTM2MTAsIDB4MGM3NjMyNzgsIDB4M2VjNjY5MjAsIAorCTB4M2VjM2Y1ODUsIDB4MGM4Mjg1YTUsIDB4MGNhNzdjNDcsIDB4M2ViYzhjMzEsIDB4M2ViYTBlZTksIDB4MGNiM2NkODQsIDB4MGNkOGJlNDcsIDB4M2ViMjg4OGYsIAorCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsIAorCTB4M2U5YjczMDYsIDB4MGQ0Nzc1YTEsIDB4MGQ2YzU0NDMsIDB4M2U5Mzk1YjcsIDB4M2U5MGYxY2EsIDB4MGQ3ODlkNzEsIDB4MGQ5ZDc1ZGIsIDB4M2U4OGY3ODgsIAorCTB4M2U4NjQ5ZjUsIDB4MGRhOWJjZjIsIDB4MGRjZThmMGQsIDB4M2U3ZTMyYzYsIDB4M2U3YjdiOTAsIDB4MGRkYWQ0MDYsIDB4MGRmZjlmYmEsIDB4M2U3MzQ3NzgsIAorCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsIAorCTB4M2U1YTI5MzksIDB4MGU2ZGU1ODAsIDB4MGU5MjlkN2EsIDB4M2U1MTllODYsIDB4M2U0ZWMwZDEsIDB4MGU5ZWQ5YWYsIDB4MGVjMzhhZTgsIDB4M2U0NjE5NGEsIAorCTB4M2U0MzMxZmEsIDB4MGVjZmM0ZDksIDB4MGVmNDZmM2IsIDB4M2UzYTZkYTQsIDB4M2UzNzdjYmIsIDB4MGYwMGE2ZGYsIDB4MGYyNTRhNTMsIDB4M2UyZTliOWMsIAorCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsIAorCTB4M2UxMzc2ZDUsIDB4MGY5MzE0ZjUsIDB4MGZiN2EzMTcsIDB4M2UwYTNmN2IsIDB4M2UwNzI4M2YsIDB4MGZjM2QxNDMsIDB4MGZlODU4MWQsIDB4M2RmZGQ0MzIsIAorCTB4M2RmYWIzNjUsIDB4MGZmNDgzZDcsIDB4MTAxOTAzNTIsIDB4M2RmMTQyYWIsIDB4M2RlZTE4NTEsIDB4MTAyNTJjOTQsIDB4MTA0OWE0OWEsIDB4M2RlNDhhZWYsIAorCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsIAorCTB4M2RjNzYxZmMsIDB4MTBiNmVhOTAsIDB4MTBkYjRiYWYsIDB4M2RiZDdlYzcsIDB4M2RiYTJlNDgsIDB4MTBlNzZhYzMsIDB4MTEwYmM0MTMsIDB4M2RiMDJlODQsIAorCTB4M2RhY2Q0ODEsIDB4MTExN2UwODgsIDB4MTEzYzMxZjMsIDB4M2RhMmI4MzQsIDB4M2Q5ZjU0YWYsIDB4MTE0ODRiYzIsIDB4MTE2Yzk1MzEsIDB4M2Q5NTFiZGUsIAorCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsIAorCTB4M2Q3NWYxNDcsIDB4MTFkOTRkMDIsIDB4MTFmZDdkZjYsIDB4M2Q2YjYzMTMsIDB4M2Q2N2Q5OWIsIDB4MTIwOThjZTUsIDB4MTIyZGI1ODMsIDB4M2Q1ZDJlZmUsIAorCTB4M2Q1OTljMGUsIDB4MTIzOWMxYTcsIDB4MTI1ZGUxZGEsIDB4M2Q0ZWQ1MGYsIDB4M2Q0YjM4YWEsIDB4MTI2OWViMmIsIDB4MTI4ZTAyZGMsIDB4M2Q0MDU1NGUsIAorCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsIAorCTB4M2QxZjJiYzUsIDB4MTJmYTIzMWIsIDB4MTMxZTIwYzAsIDB4M2QxM2YzN2UsIDB4M2QxMDMxNWEsIDB4MTMyYTFlN2UsIDB4MTM0ZTEzNDgsIDB4M2QwNGRjZDIsIAorCTB4M2QwMTExNDUsIDB4MTM1YTBlMGUsIDB4MTM3ZGY5ZTcsIDB4M2NmNWEwODIsIDB4M2NmMWNiOGUsIDB4MTM4OWYxYWYsIDB4MTNhZGQ0ODEsIDB4M2NlNjNlOTgsIAorCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsIAorCTB4M2NjMzE4ZmYsIDB4MTQxOTUzY2IsIDB4MTQzZDFiMDIsIDB4M2NiNzM3OWMsIDB4M2NiMzNkMjIsIDB4MTQ0OTA2ODUsIDB4MTQ2Y2M0NWMsIDB4M2NhNzNmYTksIAorCTB4M2NhMzNiZDMsIDB4MTQ3OGFjYmMsIDB4MTQ5YzYxMWQsIDB4M2M5NzIyNGMsIDB4M2M5MzE1MWQsIDB4MTRhODQ2NTIsIDB4MTRjYmYxMjcsIDB4M2M4NmRmOGUsIAorCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsIAorCTB4M2M2MWMwZjEsIDB4MTUzNmM2MmIsIDB4MTU1YTUzZDksIDB4M2M1NTM3N2IsIDB4M2M1MTA1MDEsIDB4MTU2NjJjMTgsIDB4MTU4OWFmZTMsIDB4M2M0NDVmYTIsIAorCTB4M2M0MDIzZGQsIDB4MTU5NTg0ZDMsIDB4MTViOGZlYTQsIDB4M2MzMzYyOWQsIDB4M2MyZjFkOGUsIDB4MTVjNGQwM2UsIDB4MTVlODNmZmYsIDB4M2MyMjQwNzUsIAorCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsIAorCTB4M2JmYjJjMGMsIDB4MTY1MjYxNzYsIDB4MTY3NWIyODYsIDB4M2JlZGZiOTksIDB4M2JlOTkxN2UsIDB4MTY4MTc2N2MsIDB4MTZhNGJkMjUsIDB4M2JkYzQ1NTIsIAorCTB4M2JkN2QxZmEsIDB4MTZiMDdkOWYsIDB4MTZkM2I5Y2MsIDB4M2JjYTZhMWQsIDB4M2JjNWVkOGQsIDB4MTZkZjc2YzMsIDB4MTcwMmE4NWUsIDB4M2JiODZhMDgsIAorCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsIAorCTB4M2I4ZjYzMzcsIDB4MTc2YzBkMTUsIDB4MTc4ZjFlNzYsIDB4M2I4MThjZWIsIDB4M2I3Y2ViOTAsIDB4MTc5YWNkMWMsIDB4MTdiZGQzOTQsIDB4M2I2ZWY5YmUsIAorCTB4M2I2YTRmMzgsIDB4MTdjOTdlOTMsIDB4MTdlYzdhMGQsIDB4M2I1YzQxZTgsIDB4M2I1NzhlMzksIDB4MTdmODIxNWUsIDB4MTgxYjExYzQsIDB4M2I0OTY1NzQsIAorCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsIAorCTB4M2IxZTZmY2EsIDB4MTg4M2IwOTcsIDB4MThhNjdmM2YsIDB4M2IwZmY0ZDksIDB4M2IwYjFjYTYsIDB4MThiMjE3OTEsIDB4MThkNGRhZDAsIDB4M2FmYzg2NjMsIAorCTB4M2FmN2E1MTYsIDB4MThlMDZmNTAsIDB4MTkwMzI3MGYsIDB4M2FlOGYzOGIsIDB4M2FlNDA5MjYsIDB4MTkwZWI3YjcsIDB4MTkzMTYzZTEsIDB4M2FkNTNjNWIsIAorCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksIAorCTB4M2FhODViOTIsIDB4MTk5OTMzYmIsIDB4MTliYmJjYTYsIDB4M2E5OTNkM2UsIDB4M2E5NDJlOWQsIDB4MTljNzNkYTMsIDB4MTllOWJhYTMsIDB4M2E4NGY1MmYsIAorCTB4M2E3ZmRkODYsIDB4MTlmNTM3YTQsIDB4MWExN2E4YTUsIDB4M2E3MDg5MDYsIDB4M2E2YjY4NTksIDB4MWEyMzIxYTIsIDB4MWE0NTg2OGUsIDB4M2E1YmY4ZDEsIAorCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsIAorCTB4M2EyZDMwY2QsIDB4MWFhYzdlNmYsIDB4MWFjZWJlOWQsIDB4M2ExZDcwNjYsIDB4M2ExODJiYzgsIDB4MWFkYTI3NDYsIDB4MWFmYzViMGEsIDB4M2EwODUwN2YsIAorCTB4M2EwMzAyZWQsIDB4MWIwN2JmOGMsIDB4MWIyOWU2ZDIsIDB4MzlmMzBjY2MsIDB4MzllZGI2NDksIDB4MWIzNTQ3MjcsIDB4MWI1NzYxZDgsIDB4MzlkZGE1NWEsIAorCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsIAorCTB4MzlhY2ZhMmIsIDB4MWJiZDc4ZDIsIDB4MWJkZjZkNGEsIDB4Mzk5Yzk5MGQsIDB4Mzk5NzFlZTcsIDB4MWJlYWJjYTEsIDB4MWMwY2E0MzIsIDB4Mzk4NmEzMjQsIAorCTB4Mzk4MTIwMWUsIDB4MWMxN2VmMzksIDB4MWMzOWM5Y2QsIDB4Mzk3MDg5YmYsIDB4Mzk2YWZkZGMsIDB4MWM0NTEwN2MsIDB4MWM2NmRkZmUsIDB4Mzk1YTRjZWIsIAorCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsIAorCTB4MzkyN2MyYzksIDB4MWNjYzBiMzUsIDB4MWNlZGIxMDYsIDB4MzkxNmMyNjIsIDB4MzkxMTEzMmQsIDB4MWNmOGU2MTEsIDB4MWQxYTdlN2QsIDB4MzhmZmY4NWUsIAorCTB4MzhmYTQwNWUsIDB4MWQyNWFmMGQsIDB4MWQ0NzNhMDAsIDB4MzhlOTBiMzEsIDB4MzhlMzRhNjksIDB4MWQ1MjY2MGYsIDB4MWQ3M2UzNzQsIDB4MzhkMWZhZTksIAorCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsIAorCTB4Mzg5ZDk2MzcsIDB4MWRkODFlMjEsIDB4MWRmOTcyNWYsIDB4Mzg4YmY3ZmYsIDB4Mzg4NjE0M2IsIDB4MWUwNDhjMjQsIDB4MWUyNWQyODIsIDB4Mzg3NDViZGIsIAorCTB4Mzg2ZTZmNjAsIDB4MWUzMGU3YTQsIDB4MWU1MjIwMGMsIDB4Mzg1YzljZTMsIDB4Mzg1NmE3YjYsIDB4MWU1ZDMwODQsIDB4MWU3ZTVhZTIsIDB4Mzg0NGJiMjgsIAorCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsIAorCTB4MzgwZTgwNzEsIDB4MWVlMTlhNTQsIDB4MWYwMjlhMWMsIDB4MzdmYzQ1ZWYsIDB4MzdmNjJlMWQsIDB4MWYwZDk3YTUsIDB4MWYyZTg5MTEsIDB4MzdlM2Q5YjcsIAorCTB4MzdkZGI5NDUsIDB4MWYzOTgxY2UsIDB4MWY1YTY0Y2IsIDB4MzdjYjRiMDQsIDB4MzdjNTIxZjYsIDB4MWY2NTU4YjUsIDB4MWY4NjJkMmQsIDB4MzdiMjk5ZTcsIAorCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsIAorCTB4Mzc3YThkZGYsIDB4MWZlODY4YzgsIDB4MjAwOTExM2MsIDB4Mzc2N2I4YTksIDB4Mzc2MTZkNTEsIDB4MjAxM2YxOTYsIDB4MjAzNDhiMzUsIDB4Mzc0ZTdlN2IsIAorCTB4Mzc0ODJhOWEsIDB4MjAzZjY2OTksIDB4MjA1ZmYxNGYsIDB4MzczNTIyMmYsIDB4MzcyZWM1YzksIDB4MjA2YWM3YjgsIDB4MjA4YjQzNzIsIDB4MzcxYmEzZDQsIAorCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsIAorCTB4MzZlMWNiNTgsIDB4MjBlYzcyYjEsIDB4MjEwY2MwZmMsIDB4MzZjZTVkMTAsIDB4MzZjN2RlYmQsIDB4MjExNzgzMzQsIDB4MjEzN2MyMzIsIDB4MzZiNDU3MWIsIAorCTB4MzZhZGQwNTgsIDB4MjE0MjdmNGQsIDB4MjE2MmFlZWEsIDB4MzY5YTJmNjksIDB4MzY5M2EwMzgsIDB4MjE2ZDY2ZTIsIDB4MjE4ZDg3MGIsIDB4MzY3ZmU2MDgsIAorCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsIAorCTB4MzY0NDQ2MWIsIDB4MjFlZGExN2YsIDB4MjIwZDkyZDQsIDB4MzYzMDQwNzAsIDB4MzYyOThmYjQsIDB4MjIxODM1ZmIsIDB4MjIzODE3OGQsIDB4MzYxNTcwZjgsIAorCTB4MzYwZWI3ZTMsIDB4MjI0MmI1NmYsIDB4MjI2Mjg3MjksIDB4MzVmYTgwMjMsIDB4MzVmM2JlYmEsIDB4MjI2ZDFmYzEsIDB4MjI4Y2UxOTEsIDB4MzVkZjZlMDMsIAorCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsIAorCTB4MzVhMjBiZDMsIDB4MjJlYmRlZTUsIDB4MjMwYjcwN2UsIDB4MzU4ZDcwODEsIDB4MzU4NjhkZWYsIDB4MjMxNWYzYTgsIDB4MjMzNTc1MDksIDB4MzU3MWQ5ZDksIAorCTB4MzU2YWVmMDgsIDB4MjMzZmYyYzgsIDB4MjM1ZjYzZGMsIDB4MzU1NjIyMzksIDB4MzU0ZjJmMmMsIDB4MjM2OWRjMjksIDB4MjM4OTNjZGQsIDB4MzUzYTQ5YjIsIAorCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsIAorCTB4MzRmYjJhOTIsIDB4MjNlNzE0ZDMsIDB4MjQwNjQzZjQsIDB4MzRlNWZiNjMsIDB4MzRkZWU3OTUsIDB4MjQxMGE2MzksIDB4MjQyZmM0YWQsIDB4MzRjOTlmZWYsIAorCTB4MzRjMjgzZmIsIDB4MjQzYTIxNWYsIDB4MjQ1OTJmMTMsIDB4MzRhZDIzZWIsIDB4MzRhNWZmZDUsIDB4MjQ2Mzg2MmMsIDB4MjQ4MjgzMGQsIDB4MzQ5MDg3NjgsIAorCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsIAorCTB4MzQ0ZmIwZDEsIDB4MjRkZjJkODEsIDB4MjRmZGY3NzUsIDB4MzQzOWVmOWMsIDB4MzQzMmFiMmUsIDB4MjUwODM3ZWQsIDB4MjUyNmYwYzEsIDB4MzQxY2QxZDIsIAorCTB4MzQxNTg1NTksIDB4MjUzMTJiODEsIDB4MjU0ZmQzMjMsIDB4MzNmZjkzZTIsIDB4MzNmODNmNjIsIDB4MjU1YTA4MjMsIDB4MjU3ODllODAsIDB4MzNlMjM1ZGYsIAorCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsIAorCTB4MzM5ZmFkNzAsIDB4MjVkNDEzNjksIDB4MjVmMjc1ODQsIDB4MzM4OTVjMTgsIDB4MzM4MWU3YWMsIDB4MjVmYzkzNGIsIDB4MjYxYWUzZDYsIDB4MzM2YjdlN2UsIAorCTB4MzM2NDAyMjMsIDB4MjYyNGZiYmYsIDB4MjY0MzNhYTcsIDB4MzM0ZDgxMmQsIDB4MzM0NWZjZTYsIDB4MjY0ZDRjYWMsIDB4MjY2Yjc5ZGQsIDB4MzMyZjY0MzUsIAorCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsIAorCTB4MzJlYjJmYjUsIDB4MjZjNWIxNGMsIDB4MjZlM2E4ZWMsIDB4MzJkNDUwMjksIDB4MzJjY2FjNjQsIDB4MjZlZGEzMjIsIDB4MjcwYjg4YzIsIDB4MzJiNWI1NTcsIAorCTB4MzJhZTA5YmUsIDB4MjcxNTdjZjUsIDB4MjczMzUwODIsIDB4MzI5NmZiM2QsIDB4MzI4ZjQ3ZDUsIDB4MjczZDNlYWMsIDB4Mjc1YjAwMTQsIDB4MzI3ODIxZWUsIAorCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsIAorCTB4MzIzMjQ3NDYsIDB4MjdiM2YyMzUsIDB4MjdkMTdjYzEsIDB4MzIxYWRiODMsIDB4MzIxMzA5MGYsIDB4MjdkYjUyODgsIDB4MjdmOGNhYTUsIDB4MzFmYjg2MjAsIAorCTB4MzFmM2FiZjUsIDB4MjgwMjlhNDUsIDB4MjgxZmZmZTIsIDB4MzFkYzExZTgsIDB4MzFkNDMwMGIsIDB4MjgyOWM5NTQsIDB4Mjg0NzFjNWUsIDB4MzFiYzdlZWUsIAorCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsIAorCTB4MzE3NTA0MmUsIDB4Mjg5ZWMxN2EsIDB4MjhiYmRjNjEsIDB4MzE1ZDBlM2IsIDB4MzE1NTBkYzYsIDB4MjhjNThjZGYsIDB4MjhlMjk0ZWIsIDB4MzEzZDAwZmYsIAorCTB4MzEzNGY4ZjEsIDB4MjhlYzNmMWUsIDB4MjkwOTM0M2UsIDB4MzExY2Q1NjQsIDB4MzExNGM1YzAsIDB4MjkxMmQ4MWYsIDB4MjkyZmJhNDAsIDB4MzBmYzhiN2QsIAorCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsIAorCTB4MzBiMzc2ZDgsIDB4Mjk4NjBhYmQsIDB4MjlhMmIzNzgsIDB4MzA5YWY4Y2EsIDB4MzA5MmNiMDUsIDB4MjlhYzNkZDcsIDB4MjljOGQzNGQsIDB4MzA3YTM2N2MsIAorCTB4MzA3MjAxM2MsIDB4MjlkMjU3M2MsIDB4MjllZWQ5NWIsIDB4MzA1OTU2NDgsIDB4MzA1MTE5OTEsIDB4MjlmODU2ZDUsIDB4MmExNGM1OGIsIDB4MzAzODU4NDAsIAorCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsIAorCTB4MmZlZGIwMGQsIDB4MmE2OWI5ZWMsIDB4MmE4NWVlMDAsIDB4MmZkNGFjMDQsIDB4MmZjYzUxYTUsIDB4MmE4ZjUxNmIsIDB4MmFhYjcxZDAsIDB4MmZiMzM3N2MsIAorCTB4MmZhYWQ1YzEsIDB4MmFiNGNlYTksIDB4MmFkMGRiNGUsIDB4MmY5MWE1ODksIDB4MmY4OTNjNzUsIDB4MmFkYTMxOGUsIDB4MmFmNjJhNjMsIDB4MmY2ZmY2M2QsIAorCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsIAorCTB4MmYyM2MwZjYsIDB4MmI0OWJiNGEsIDB4MmI2NTc4NDQsIDB4MmYwYTM5MWQsIDB4MmYwMWIyZGUsIDB4MmI2ZWIzZWEsIDB4MmI4YTVjY2UsIDB4MmVlODE1NDMsIAorCTB4MmVkZjg3YzYsIDB4MmI5MzkxYzAsIDB4MmJhZjI2N2QsIDB4MmVjNWQ0NzksIDB4MmViZDNmYzQsIDB4MmJiODU0YjQsIDB4MmJkM2Q1M2EsIDB4MmVhMzc2ZDYsIAorCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsIAorCTB4MmU1NWJiMTcsIDB4MmMyNWZiNjYsIDB4MmM0MTNlZGYsIDB4MmUzYmIxYTQsIDB4MmUzMzAwNDIsIDB4MmM0YTUxZjMsIDB4MmM2NTgwZjEsIDB4MmUxOGUxNmQsIAorCTB4MmUxMDI4ZWQsIDB4MmM2ZThkMmUsIDB4MmM4OWE3OWYsIDB4MmRmNWY0YzcsIDB4MmRlZDM1MmYsIDB4MmM5MmFkMDEsIDB4MmNhZGIyZDUsIDB4MmRkMmViYzcsIAorCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsIAogCTB4MmQ4M2IwNGYsIDB4MmNmZTY3MjgsIDB4MmQxOTJlYzEsIDB4MmQ2OTI3ODQsIDB4MmQ2MDRiYzAsIDB4MmQyMjE4N2EsIDB4MmQzY2NiMzQsIDB4MmQ0NWFkZjYKIH07CiAKIAogY29uc3QgaW50IHR3aWRUYWI1MTJbKDgqNiArIDMyKjYgKyAxMjgqNikvMl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzYjIwMTg3ZCwKLQkweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDJkNDEyZDQxLCAweDNiMjAxODdkLAotCTB4MTg3ZDNiMjAsIDB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhlNzgzM2IyMCwKLQkweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLAotCTB4YzRlMGU3ODMsIDB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzYjIwMTg3ZCwgCisJMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgCisJMHgxODdkM2IyMCwgMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwgCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhlNzgzM2IyMCwgCisJMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgCisJMHhjNGUwZTc4MywgMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwgCiAKLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmYjEwNjQ1LAotCTB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsCi0JMHgzZDNlMTI5NCwgMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwKLQkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDM4NzExZTJiLAotCTB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsCi0JMHgyODk5MzE3OSwgMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwKLQkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDI4OTkzMTc5LAotCTB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsCi0JMHgwNjQ1M2ZiMSwgMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywKLQkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDEyOTQzZDNlLAotCTB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksCi0JMHhlMWQ1Mzg3MSwgMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywKLQkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGY5YmIzZmIxLAotCTB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksCi0JMHhjNzhmMWUyYiwgMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwKLQkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGUxZDUzODcxLAotCTB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsCi0JMHhjMDRmZjliYiwgMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwKLQkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNlODcyODk5LAotCTB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsCi0JMHhjZTg3ZDc2NywgMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwKLQkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGMyYzIxMjk0LAotCTB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsCi0JMHhlZDZjYzJjMiwgMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwKKwkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmYjEwNjQ1LCAKKwkweDNmZWMwMzIzLCAweDNmNGUwOTY0LCAweDNlYzUwYzdjLCAweDNmYjEwNjQ1LCAKKwkweDNkM2UxMjk0LCAweDNkM2UxMjk0LCAweDNmNGUwOTY0LCAweDM5ZGExYjVkLCAKKwkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDM4NzExZTJiLCAKKwkweDNlMTQwZjhjLCAweDJmNmIyYWZhLCAweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAKKwkweDI4OTkzMTc5LCAweDMxNzkyODk5LCAweDNjNDIxNThmLCAweDIwZTczNmU1LCAKKwkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDI4OTkzMTc5LCAKKwkweDM5ZGExYjVkLCAweDBmOGMzZTE0LCAweDIzOGUzNTM2LCAweDM4NzExZTJiLCAKKwkweDA2NDUzZmIxLCAweDFlMmIzODcxLCAweDM2ZTUyMGU3LCAweGZjZGQzZmVjLCAKKwkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDEyOTQzZDNlLCAKKwkweDMzNjcyNjFmLCAweGVhNzEzYzQyLCAweDBjN2MzZWM1LCAweDMxNzkyODk5LCAKKwkweGUxZDUzODcxLCAweDA2NDUzZmIxLCAweDJmNmIyYWZhLCAweGQ5ZTEzMzY3LCAKKwkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGY5YmIzZmIxLCAKKwkweDJhZmEyZjZiLCAweGNjOTkyNjFmLCAweGYzODQzZWM1LCAweDI4OTkzMTc5LCAKKwkweGM3OGYxZTJiLCAweGVkNmMzZDNlLCAweDI2MWYzMzY3LCAweGMzYmUxNThmLCAKKwkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGUxZDUzODcxLCAKKwkweDIwZTczNmU1LCAweGMwMTQwMzIzLCAweGRjNzIzNTM2LCAweDFlMmIzODcxLCAKKwkweGMwNGZmOWJiLCAweGQ3NjczMTc5LCAweDFiNWQzOWRhLCAweGMxZWNmMDc0LCAKKwkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNlODcyODk5LCAKKwkweDE1OGYzYzQyLCAweGM5MWJkZjE5LCAweGNhY2EyMzhlLCAweDEyOTQzZDNlLCAKKwkweGNlODdkNzY3LCAweGM3OGYxZTJiLCAweDBmOGMzZTE0LCAweGQ1MDZkMDk1LCAKKwkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGMyYzIxMjk0LCAKKwkweDA5NjQzZjRlLCAweGU0YTNjNjI2LCAweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAKKwkweGVkNmNjMmMyLCAweGMwNGYwNjQ1LCAweDAzMjMzZmVjLCAweGY2OWNjMGIyLCAKIAotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2ZmYjAxOTIsCi0JMHgzZmZlMDBjOSwgMHgzZmY0MDI1YiwgMHgzZmVjMDMyMywgMHgzZmZiMDE5MiwKLQkweDNmZDMwNGI1LCAweDNmZDMwNGI1LCAweDNmZjQwMjViLCAweDNmOWMwNzBkLAotCTB4M2ZiMTA2NDUsIDB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2Y4NDA3ZDUsCi0JMHgzZmUxMDNlYywgMHgzZWViMGJiNiwgMHgzZjRlMDk2NCwgMHgzZmQzMDRiNSwKLQkweDNlNzEwZTA1LCAweDNmMGUwYWYxLCAweDNmYzMwNTdkLCAweDNkZTIxMDRmLAotCTB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsIDB4M2QzZTEyOTQsIDB4M2U3MTBlMDUsCi0JMHgzZjljMDcwZCwgMHgzYzg0MTRkMSwgMHgzZTE0MGY4YywgMHgzZjg0MDdkNSwKLQkweDNiYjYxNzA4LCAweDNkYWUxMTExLCAweDNmNmEwODljLCAweDNhZDIxOTM3LAotCTB4M2QzZTEyOTQsIDB4M2Y0ZTA5NjQsIDB4MzlkYTFiNWQsIDB4M2NjNTE0MTMsCi0JMHgzZjJmMGEyYSwgMHgzOGNmMWQ3OSwgMHgzYzQyMTU4ZiwgMHgzZjBlMGFmMSwKLQkweDM3YWYxZjhiLCAweDNiYjYxNzA4LCAweDNlZWIwYmI2LCAweDM2N2MyMTkyLAotCTB4M2IyMDE4N2QsIDB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4M2E4MjE5ZWYsCi0JMHgzZTljMGQ0MSwgMHgzM2RlMjU3ZCwgMHgzOWRhMWI1ZCwgMHgzZTcxMGUwNSwKLQkweDMyNzQyNzVmLCAweDM5MmExY2M2LCAweDNlNDQwZWM5LCAweDMwZjgyOTM0LAotCTB4Mzg3MTFlMmIsIDB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzdhZjFmOGIsCi0JMHgzZGUyMTA0ZiwgMHgyZGNlMmNiMiwgMHgzNmU1MjBlNywgMHgzZGFlMTExMSwKLQkweDJjMjEyZTVhLCAweDM2MTIyMjNkLCAweDNkNzcxMWQzLCAweDJhNjUyZmYxLAotCTB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIDB4Mjg5OTMxNzksIDB4MzQ1MzI0ZGEsCi0JMHgzZDAyMTM1NCwgMHgyNmMwMzJlZSwgMHgzMzY3MjYxZiwgMHgzY2M1MTQxMywKLQkweDI0ZGEzNDUzLCAweDMyNzQyNzVmLCAweDNjODQxNGQxLCAweDIyZTYzNWE1LAotCTB4MzE3OTI4OTksIDB4M2M0MjE1OGYsIDB4MjBlNzM2ZTUsIDB4MzA3NjI5Y2QsCi0JMHgzYmZkMTY0YywgMHgxZWRjMzgxMSwgMHgyZjZiMmFmYSwgMHgzYmI2MTcwOCwKLQkweDFjYzYzOTJhLCAweDJlNWEyYzIxLCAweDNiNmMxN2MzLCAweDFhYTYzYTJmLAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MmMyMTJlNWEsCi0JMHgzYWQyMTkzNywgMHgxNjRjM2JmZCwgMHgyYWZhMmY2YiwgMHgzYTgyMTllZiwKLQkweDE0MTMzY2M1LCAweDI5Y2QzMDc2LCAweDNhMmYxYWE2LCAweDExZDMzZDc3LAotCTB4Mjg5OTMxNzksIDB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4Mjc1ZjMyNzQsCi0JMHgzOTgzMWMxMiwgMHgwZDQxM2U5YywgMHgyNjFmMzM2NywgMHgzOTJhMWNjNiwKLQkweDBhZjEzZjBlLCAweDI0ZGEzNDUzLCAweDM4Y2YxZDc5LCAweDA4OWMzZjZhLAotCTB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsIDB4MDY0NTNmYjEsIDB4MjIzZDM2MTIsCi0JMHgzODExMWVkYywgMHgwM2VjM2ZlMSwgMHgyMGU3MzZlNSwgMHgzN2FmMWY4YiwKLQkweDAxOTIzZmZiLCAweDFmOGIzN2FmLCAweDM3NGIyMDM5LCAweGZmMzczZmZlLAotCTB4MWUyYjM4NzEsIDB4MzZlNTIwZTcsIDB4ZmNkZDNmZWMsIDB4MWNjNjM5MmEsCi0JMHgzNjdjMjE5MiwgMHhmYTgzM2ZjMywgMHgxYjVkMzlkYSwgMHgzNjEyMjIzZCwKLQkweGY4MmIzZjg0LCAweDE5ZWYzYTgyLCAweDM1YTUyMmU2LCAweGY1ZDYzZjJmLAotCTB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsIDB4MTcwODNiYjYsCi0JMHgzNGM2MjQzNCwgMHhmMTM3M2U0NCwgMHgxNThmM2M0MiwgMHgzNDUzMjRkYSwKLQkweGVlZWYzZGFlLCAweDE0MTMzY2M1LCAweDMzZGUyNTdkLCAweGVjYWMzZDAyLAotCTB4MTI5NDNkM2UsIDB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MTExMTNkYWUsCi0JMHgzMmVlMjZjMCwgMHhlODNkM2I2YywgMHgwZjhjM2UxNCwgMHgzMjc0Mjc1ZiwKLQkweGU2MTEzYTgyLCAweDBlMDUzZTcxLCAweDMxZjcyN2ZkLCAweGUzZWUzOTgzLAotCTB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIDB4ZTFkNTM4NzEsIDB4MGFmMTNmMGUsCi0JMHgzMGY4MjkzNCwgMHhkZmM3Mzc0YiwgMHgwOTY0M2Y0ZSwgMHgzMDc2MjljZCwKLQkweGRkYzMzNjEyLCAweDA3ZDUzZjg0LCAweDJmZjEyYTY1LCAweGRiY2MzNGM2LAotCTB4MDY0NTNmYjEsIDB4MmY2YjJhZmEsIDB4ZDllMTMzNjcsIDB4MDRiNTNmZDMsCi0JMHgyZWUzMmI4ZSwgMHhkODAzMzFmNywgMHgwMzIzM2ZlYywgMHgyZTVhMmMyMSwKLQkweGQ2MzMzMDc2LCAweDAxOTIzZmZiLCAweDJkY2UyY2IyLCAweGQ0NzIyZWUzLAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZmU2ZTNmZmIsCi0JMHgyY2IyMmRjZSwgMHhkMTFkMmI4ZSwgMHhmY2RkM2ZlYywgMHgyYzIxMmU1YSwKLQkweGNmOGEyOWNkLCAweGZiNGIzZmQzLCAweDJiOGUyZWUzLCAweGNlMDkyN2ZkLAotCTB4ZjliYjNmYjEsIDB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjgyYjNmODQsCi0JMHgyYTY1MmZmMSwgMHhjYjNhMjQzNCwgMHhmNjljM2Y0ZSwgMHgyOWNkMzA3NiwKLQkweGM5ZWUyMjNkLCAweGY1MGYzZjBlLCAweDI5MzQzMGY4LCAweGM4YjUyMDM5LAotCTB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksIDB4Yzc4ZjFlMmIsIDB4ZjFmYjNlNzEsCi0JMHgyN2ZkMzFmNywgMHhjNjdkMWMxMiwgMHhmMDc0M2UxNCwgMHgyNzVmMzI3NCwKLQkweGM1N2UxOWVmLCAweGVlZWYzZGFlLCAweDI2YzAzMmVlLCAweGM0OTQxN2MzLAotCTB4ZWQ2YzNkM2UsIDB4MjYxZjMzNjcsIDB4YzNiZTE1OGYsIDB4ZWJlZDNjYzUsCi0JMHgyNTdkMzNkZSwgMHhjMmZlMTM1NCwgMHhlYTcxM2M0MiwgMHgyNGRhMzQ1MywKLQkweGMyNTIxMTExLCAweGU4ZjgzYmI2LCAweDI0MzQzNGM2LCAweGMxYmMwZWM5LAotCTB4ZTc4MzNiMjAsIDB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZTYxMTNhODIsCi0JMHgyMmU2MzVhNSwgMHhjMGQxMGEyYSwgMHhlNGEzMzlkYSwgMHgyMjNkMzYxMiwKLQkweGMwN2MwN2Q1LCAweGUzM2EzOTJhLCAweDIxOTIzNjdjLCAweGMwM2QwNTdkLAotCTB4ZTFkNTM4NzEsIDB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZTA3NTM3YWYsCi0JMHgyMDM5Mzc0YiwgMHhjMDAyMDBjOSwgMHhkZjE5MzZlNSwgMHgxZjhiMzdhZiwKLQkweGMwMDVmZTZlLCAweGRkYzMzNjEyLCAweDFlZGMzODExLCAweGMwMWZmYzE0LAotCTB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIDB4YzA0ZmY5YmIsIDB4ZGIyNjM0NTMsCi0JMHgxZDc5MzhjZiwgMHhjMDk2Zjc2NCwgMHhkOWUxMzM2NywgMHgxY2M2MzkyYSwKLQkweGMwZjJmNTBmLCAweGQ4YTEzMjc0LCAweDFjMTIzOTgzLCAweGMxNjRmMmJmLAotCTB4ZDc2NzMxNzksIDB4MWI1ZDM5ZGEsIDB4YzFlY2YwNzQsIDB4ZDYzMzMwNzYsCi0JMHgxYWE2M2EyZiwgMHhjMjg5ZWUyZCwgMHhkNTA2MmY2YiwgMHgxOWVmM2E4MiwKLQkweGMzM2JlYmVkLCAweGQzZGYyZTVhLCAweDE5MzczYWQyLCAweGM0MDNlOWI0LAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4ZDFhNjJjMjEsCi0JMHgxN2MzM2I2YywgMHhjNWQxZTU1YSwgMHhkMDk1MmFmYSwgMHgxNzA4M2JiNiwKLQkweGM2ZDZlMzNhLCAweGNmOGEyOWNkLCAweDE2NGMzYmZkLCAweGM3ZWZlMTI0LAotCTB4Y2U4NzI4OTksIDB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2Q4YzI3NWYsCi0JMHgxNGQxM2M4NCwgMHhjYTViZGQxYSwgMHhjYzk5MjYxZiwgMHgxNDEzM2NjNSwKLQkweGNiYWRkYjI2LCAweGNiYWQyNGRhLCAweDEzNTQzZDAyLCAweGNkMTJkOTQwLAotCTB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsIDB4Y2U4N2Q3NjcsIDB4YzllZTIyM2QsCi0JMHgxMWQzM2Q3NywgMHhkMDBmZDU5YiwgMHhjOTFiMjBlNywgMHgxMTExM2RhZSwKLQkweGQxYTZkM2RmLCAweGM4NTExZjhiLCAweDEwNGYzZGUyLCAweGQzNGVkMjMyLAotCTB4Yzc4ZjFlMmIsIDB4MGY4YzNlMTQsIDB4ZDUwNmQwOTUsIDB4YzZkNjFjYzYsCi0JMHgwZWM5M2U0NCwgMHhkNmNjY2YwOCwgMHhjNjI2MWI1ZCwgMHgwZTA1M2U3MSwKLQkweGQ4YTFjZDhjLCAweGM1N2UxOWVmLCAweDBkNDEzZTljLCAweGRhODNjYzIyLAotCTB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsIDB4YzQ0YTE3MDgsCi0JMHgwYmI2M2VlYiwgMHhkZTZlYzk4NCwgMHhjM2JlMTU4ZiwgMHgwYWYxM2YwZSwKLQkweGUwNzVjODUxLCAweGMzM2IxNDEzLCAweDBhMmEzZjJmLCAweGUyODdjNzMxLAotCTB4YzJjMjEyOTQsIDB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzI1MjExMTEsCi0JMHgwODljM2Y2YSwgMHhlNmM5YzUyZSwgMHhjMWVjMGY4YywgMHgwN2Q1M2Y4NCwKLQkweGU4ZjhjNDRhLCAweGMxOGYwZTA1LCAweDA3MGQzZjljLCAweGViMmZjMzdjLAotCTB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIDB4ZWQ2Y2MyYzIsIDB4YzBmMjBhZjEsCi0JMHgwNTdkM2ZjMywgMHhlZmIxYzIxZSwgMHhjMGIyMDk2NCwgMHgwNGI1M2ZkMywKLQkweGYxZmJjMThmLCAweGMwN2MwN2Q1LCAweDAzZWMzZmUxLCAweGY0NGFjMTE1LAotCTB4YzA0ZjA2NDUsIDB4MDMyMzNmZWMsIDB4ZjY5Y2MwYjIsIDB4YzAyZDA0YjUsCi0JMHgwMjViM2ZmNCwgMHhmOGYzYzA2NCwgMHhjMDE0MDMyMywgMHgwMTkyM2ZmYiwKLQkweGZiNGJjMDJkLCAweGMwMDUwMTkyLCAweDAwYzkzZmZlLCAweGZkYTVjMDBjCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZmZiMDE5MiwgCisJMHgzZmZlMDBjOSwgMHgzZmY0MDI1YiwgMHgzZmVjMDMyMywgMHgzZmZiMDE5MiwgCisJMHgzZmQzMDRiNSwgMHgzZmQzMDRiNSwgMHgzZmY0MDI1YiwgMHgzZjljMDcwZCwgCisJMHgzZmIxMDY0NSwgMHgzZmVjMDMyMywgMHgzZjRlMDk2NCwgMHgzZjg0MDdkNSwgCisJMHgzZmUxMDNlYywgMHgzZWViMGJiNiwgMHgzZjRlMDk2NCwgMHgzZmQzMDRiNSwgCisJMHgzZTcxMGUwNSwgMHgzZjBlMGFmMSwgMHgzZmMzMDU3ZCwgMHgzZGUyMTA0ZiwgCisJMHgzZWM1MGM3YywgMHgzZmIxMDY0NSwgMHgzZDNlMTI5NCwgMHgzZTcxMGUwNSwgCisJMHgzZjljMDcwZCwgMHgzYzg0MTRkMSwgMHgzZTE0MGY4YywgMHgzZjg0MDdkNSwgCisJMHgzYmI2MTcwOCwgMHgzZGFlMTExMSwgMHgzZjZhMDg5YywgMHgzYWQyMTkzNywgCisJMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwgMHgzY2M1MTQxMywgCisJMHgzZjJmMGEyYSwgMHgzOGNmMWQ3OSwgMHgzYzQyMTU4ZiwgMHgzZjBlMGFmMSwgCisJMHgzN2FmMWY4YiwgMHgzYmI2MTcwOCwgMHgzZWViMGJiNiwgMHgzNjdjMjE5MiwgCisJMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgzYTgyMTllZiwgCisJMHgzZTljMGQ0MSwgMHgzM2RlMjU3ZCwgMHgzOWRhMWI1ZCwgMHgzZTcxMGUwNSwgCisJMHgzMjc0Mjc1ZiwgMHgzOTJhMWNjNiwgMHgzZTQ0MGVjOSwgMHgzMGY4MjkzNCwgCisJMHgzODcxMWUyYiwgMHgzZTE0MGY4YywgMHgyZjZiMmFmYSwgMHgzN2FmMWY4YiwgCisJMHgzZGUyMTA0ZiwgMHgyZGNlMmNiMiwgMHgzNmU1MjBlNywgMHgzZGFlMTExMSwgCisJMHgyYzIxMmU1YSwgMHgzNjEyMjIzZCwgMHgzZDc3MTFkMywgMHgyYTY1MmZmMSwgCisJMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwgMHgyODk5MzE3OSwgMHgzNDUzMjRkYSwgCisJMHgzZDAyMTM1NCwgMHgyNmMwMzJlZSwgMHgzMzY3MjYxZiwgMHgzY2M1MTQxMywgCisJMHgyNGRhMzQ1MywgMHgzMjc0Mjc1ZiwgMHgzYzg0MTRkMSwgMHgyMmU2MzVhNSwgCisJMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwgMHgzMDc2MjljZCwgCisJMHgzYmZkMTY0YywgMHgxZWRjMzgxMSwgMHgyZjZiMmFmYSwgMHgzYmI2MTcwOCwgCisJMHgxY2M2MzkyYSwgMHgyZTVhMmMyMSwgMHgzYjZjMTdjMywgMHgxYWE2M2EyZiwgCisJMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyYzIxMmU1YSwgCisJMHgzYWQyMTkzNywgMHgxNjRjM2JmZCwgMHgyYWZhMmY2YiwgMHgzYTgyMTllZiwgCisJMHgxNDEzM2NjNSwgMHgyOWNkMzA3NiwgMHgzYTJmMWFhNiwgMHgxMWQzM2Q3NywgCisJMHgyODk5MzE3OSwgMHgzOWRhMWI1ZCwgMHgwZjhjM2UxNCwgMHgyNzVmMzI3NCwgCisJMHgzOTgzMWMxMiwgMHgwZDQxM2U5YywgMHgyNjFmMzM2NywgMHgzOTJhMWNjNiwgCisJMHgwYWYxM2YwZSwgMHgyNGRhMzQ1MywgMHgzOGNmMWQ3OSwgMHgwODljM2Y2YSwgCisJMHgyMzhlMzUzNiwgMHgzODcxMWUyYiwgMHgwNjQ1M2ZiMSwgMHgyMjNkMzYxMiwgCisJMHgzODExMWVkYywgMHgwM2VjM2ZlMSwgMHgyMGU3MzZlNSwgMHgzN2FmMWY4YiwgCisJMHgwMTkyM2ZmYiwgMHgxZjhiMzdhZiwgMHgzNzRiMjAzOSwgMHhmZjM3M2ZmZSwgCisJMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywgMHgxY2M2MzkyYSwgCisJMHgzNjdjMjE5MiwgMHhmYTgzM2ZjMywgMHgxYjVkMzlkYSwgMHgzNjEyMjIzZCwgCisJMHhmODJiM2Y4NCwgMHgxOWVmM2E4MiwgMHgzNWE1MjJlNiwgMHhmNWQ2M2YyZiwgCisJMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwgMHgxNzA4M2JiNiwgCisJMHgzNGM2MjQzNCwgMHhmMTM3M2U0NCwgMHgxNThmM2M0MiwgMHgzNDUzMjRkYSwgCisJMHhlZWVmM2RhZSwgMHgxNDEzM2NjNSwgMHgzM2RlMjU3ZCwgMHhlY2FjM2QwMiwgCisJMHgxMjk0M2QzZSwgMHgzMzY3MjYxZiwgMHhlYTcxM2M0MiwgMHgxMTExM2RhZSwgCisJMHgzMmVlMjZjMCwgMHhlODNkM2I2YywgMHgwZjhjM2UxNCwgMHgzMjc0Mjc1ZiwgCisJMHhlNjExM2E4MiwgMHgwZTA1M2U3MSwgMHgzMWY3MjdmZCwgMHhlM2VlMzk4MywgCisJMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwgMHhlMWQ1Mzg3MSwgMHgwYWYxM2YwZSwgCisJMHgzMGY4MjkzNCwgMHhkZmM3Mzc0YiwgMHgwOTY0M2Y0ZSwgMHgzMDc2MjljZCwgCisJMHhkZGMzMzYxMiwgMHgwN2Q1M2Y4NCwgMHgyZmYxMmE2NSwgMHhkYmNjMzRjNiwgCisJMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywgMHgwNGI1M2ZkMywgCisJMHgyZWUzMmI4ZSwgMHhkODAzMzFmNywgMHgwMzIzM2ZlYywgMHgyZTVhMmMyMSwgCisJMHhkNjMzMzA3NiwgMHgwMTkyM2ZmYiwgMHgyZGNlMmNiMiwgMHhkNDcyMmVlMywgCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmZTZlM2ZmYiwgCisJMHgyY2IyMmRjZSwgMHhkMTFkMmI4ZSwgMHhmY2RkM2ZlYywgMHgyYzIxMmU1YSwgCisJMHhjZjhhMjljZCwgMHhmYjRiM2ZkMywgMHgyYjhlMmVlMywgMHhjZTA5MjdmZCwgCisJMHhmOWJiM2ZiMSwgMHgyYWZhMmY2YiwgMHhjYzk5MjYxZiwgMHhmODJiM2Y4NCwgCisJMHgyYTY1MmZmMSwgMHhjYjNhMjQzNCwgMHhmNjljM2Y0ZSwgMHgyOWNkMzA3NiwgCisJMHhjOWVlMjIzZCwgMHhmNTBmM2YwZSwgMHgyOTM0MzBmOCwgMHhjOGI1MjAzOSwgCisJMHhmMzg0M2VjNSwgMHgyODk5MzE3OSwgMHhjNzhmMWUyYiwgMHhmMWZiM2U3MSwgCisJMHgyN2ZkMzFmNywgMHhjNjdkMWMxMiwgMHhmMDc0M2UxNCwgMHgyNzVmMzI3NCwgCisJMHhjNTdlMTllZiwgMHhlZWVmM2RhZSwgMHgyNmMwMzJlZSwgMHhjNDk0MTdjMywgCisJMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwgMHhlYmVkM2NjNSwgCisJMHgyNTdkMzNkZSwgMHhjMmZlMTM1NCwgMHhlYTcxM2M0MiwgMHgyNGRhMzQ1MywgCisJMHhjMjUyMTExMSwgMHhlOGY4M2JiNiwgMHgyNDM0MzRjNiwgMHhjMWJjMGVjOSwgCisJMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhlNjExM2E4MiwgCisJMHgyMmU2MzVhNSwgMHhjMGQxMGEyYSwgMHhlNGEzMzlkYSwgMHgyMjNkMzYxMiwgCisJMHhjMDdjMDdkNSwgMHhlMzNhMzkyYSwgMHgyMTkyMzY3YywgMHhjMDNkMDU3ZCwgCisJMHhlMWQ1Mzg3MSwgMHgyMGU3MzZlNSwgMHhjMDE0MDMyMywgMHhlMDc1MzdhZiwgCisJMHgyMDM5Mzc0YiwgMHhjMDAyMDBjOSwgMHhkZjE5MzZlNSwgMHgxZjhiMzdhZiwgCisJMHhjMDA1ZmU2ZSwgMHhkZGMzMzYxMiwgMHgxZWRjMzgxMSwgMHhjMDFmZmMxNCwgCisJMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwgMHhjMDRmZjliYiwgMHhkYjI2MzQ1MywgCisJMHgxZDc5MzhjZiwgMHhjMDk2Zjc2NCwgMHhkOWUxMzM2NywgMHgxY2M2MzkyYSwgCisJMHhjMGYyZjUwZiwgMHhkOGExMzI3NCwgMHgxYzEyMzk4MywgMHhjMTY0ZjJiZiwgCisJMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwgMHhkNjMzMzA3NiwgCisJMHgxYWE2M2EyZiwgMHhjMjg5ZWUyZCwgMHhkNTA2MmY2YiwgMHgxOWVmM2E4MiwgCisJMHhjMzNiZWJlZCwgMHhkM2RmMmU1YSwgMHgxOTM3M2FkMiwgMHhjNDAzZTliNCwgCisJMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhkMWE2MmMyMSwgCisJMHgxN2MzM2I2YywgMHhjNWQxZTU1YSwgMHhkMDk1MmFmYSwgMHgxNzA4M2JiNiwgCisJMHhjNmQ2ZTMzYSwgMHhjZjhhMjljZCwgMHgxNjRjM2JmZCwgMHhjN2VmZTEyNCwgCisJMHhjZTg3Mjg5OSwgMHgxNThmM2M0MiwgMHhjOTFiZGYxOSwgMHhjZDhjMjc1ZiwgCisJMHgxNGQxM2M4NCwgMHhjYTViZGQxYSwgMHhjYzk5MjYxZiwgMHgxNDEzM2NjNSwgCisJMHhjYmFkZGIyNiwgMHhjYmFkMjRkYSwgMHgxMzU0M2QwMiwgMHhjZDEyZDk0MCwgCisJMHhjYWNhMjM4ZSwgMHgxMjk0M2QzZSwgMHhjZTg3ZDc2NywgMHhjOWVlMjIzZCwgCisJMHgxMWQzM2Q3NywgMHhkMDBmZDU5YiwgMHhjOTFiMjBlNywgMHgxMTExM2RhZSwgCisJMHhkMWE2ZDNkZiwgMHhjODUxMWY4YiwgMHgxMDRmM2RlMiwgMHhkMzRlZDIzMiwgCisJMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwgMHhjNmQ2MWNjNiwgCisJMHgwZWM5M2U0NCwgMHhkNmNjY2YwOCwgMHhjNjI2MWI1ZCwgMHgwZTA1M2U3MSwgCisJMHhkOGExY2Q4YywgMHhjNTdlMTllZiwgMHgwZDQxM2U5YywgMHhkYTgzY2MyMiwgCisJMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwgMHhjNDRhMTcwOCwgCisJMHgwYmI2M2VlYiwgMHhkZTZlYzk4NCwgMHhjM2JlMTU4ZiwgMHgwYWYxM2YwZSwgCisJMHhlMDc1Yzg1MSwgMHhjMzNiMTQxMywgMHgwYTJhM2YyZiwgMHhlMjg3YzczMSwgCisJMHhjMmMyMTI5NCwgMHgwOTY0M2Y0ZSwgMHhlNGEzYzYyNiwgMHhjMjUyMTExMSwgCisJMHgwODljM2Y2YSwgMHhlNmM5YzUyZSwgMHhjMWVjMGY4YywgMHgwN2Q1M2Y4NCwgCisJMHhlOGY4YzQ0YSwgMHhjMThmMGUwNSwgMHgwNzBkM2Y5YywgMHhlYjJmYzM3YywgCisJMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwgMHhlZDZjYzJjMiwgMHhjMGYyMGFmMSwgCisJMHgwNTdkM2ZjMywgMHhlZmIxYzIxZSwgMHhjMGIyMDk2NCwgMHgwNGI1M2ZkMywgCisJMHhmMWZiYzE4ZiwgMHhjMDdjMDdkNSwgMHgwM2VjM2ZlMSwgMHhmNDRhYzExNSwgCisJMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwgMHhjMDJkMDRiNSwgCisJMHgwMjViM2ZmNCwgMHhmOGYzYzA2NCwgMHhjMDE0MDMyMywgMHgwMTkyM2ZmYiwgCisJMHhmYjRiYzAyZCwgMHhjMDA1MDE5MiwgMHgwMGM5M2ZmZSwgMHhmZGE1YzAwYwkKIH07CiAKIGNvbnN0IGludCB0d2lkVGFiNjRbKDQqNiArIDE2KjYpLzJdID0gewotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTJkNDEsCi0JMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwKLQkweGQyYmYyZDQxLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLAorCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTJkNDEsIAorCTB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIAorCTB4ZDJiZjJkNDEsIDB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIAogCi0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZWM1MGM3YywKLQkweDNmYjEwNjQ1LCAweDNkM2UxMjk0LCAweDNiMjAxODdkLCAweDNlYzUwYzdjLAotCTB4MzUzNjIzOGUsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIDB4Mjg5OTMxNzksCi0JMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyMzhlMzUzNiwKLQkweDM4NzExZTJiLCAweDA2NDUzZmIxLCAweDE4N2QzYjIwLCAweDM1MzYyMzhlLAotCTB4ZjM4NDNlYzUsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIDB4ZTFkNTM4NzEsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmMzg0M2VjNSwKLQkweDI4OTkzMTc5LCAweGM3OGYxZTJiLCAweGU3ODMzYjIwLCAweDIzOGUzNTM2LAotCTB4YzEzYjBjN2MsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIDB4YzA0ZmY5YmIsCi0JMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhjYWNhMjM4ZSwKLQkweDEyOTQzZDNlLCAweGNlODdkNzY3LCAweGM0ZTAxODdkLCAweDBjN2MzZWM1LAotCTB4ZGM3MmNhY2EsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIDB4ZWQ2Y2MyYzIKKwkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNlYzUwYzdjLCAKKwkweDNmYjEwNjQ1LCAweDNkM2UxMjk0LCAweDNiMjAxODdkLCAweDNlYzUwYzdjLCAKKwkweDM1MzYyMzhlLCAweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAweDI4OTkzMTc5LCAKKwkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDIzOGUzNTM2LCAKKwkweDM4NzExZTJiLCAweDA2NDUzZmIxLCAweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAKKwkweGYzODQzZWM1LCAweDBjN2MzZWM1LCAweDMxNzkyODk5LCAweGUxZDUzODcxLCAKKwkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGYzODQzZWM1LCAKKwkweDI4OTkzMTc5LCAweGM3OGYxZTJiLCAweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAKKwkweGMxM2IwYzdjLCAweGRjNzIzNTM2LCAweDFlMmIzODcxLCAweGMwNGZmOWJiLCAKKwkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNhY2EyMzhlLCAKKwkweDEyOTQzZDNlLCAweGNlODdkNzY3LCAweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAKKwkweGRjNzJjYWNhLCAweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAweGVkNmNjMmMyIAogfTsKIAogI2VsaWYgZGVmaW5lZCBBUk1WN05lb24KLS8qCi0gKiAgUTI5IGZvciAxMjggYW5kIDEwMjQKKy8qIAorICogIFEyOSBmb3IgMTI4IGFuZCAxMDI0IAogICoKICAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7CiAgKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwogICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsKICAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKgorICogCiAgKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwogICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsKICAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAyOSk7CkBAIC0zNTMsMzEzICszNTMsMzEzIEBACiAgKi8KIGNvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF0gPSB7CiAJLyogMTI4ICovCi0JMHgxZmZmZjYyMSwgMHgwMDE5MjFmOSwgMHgwMGFmZWE2OSwgMHgxZmZlMWM2OCwgMHgxZmZjZTA5ZCwgMHgwMGUyMmE3YSwgMHgwMTc4ZGJhYSwgMHgxZmY3NTNiYiwKLQkweDFmZjRkYzU1LCAweDAxYWIxMDFjLCAweDAyNDE5MmNmLCAweDFmZWI5ZDI1LCAweDFmZTdlYTg1LCAweDAyNzNiM2UyLCAweDAzMDlmMGUyLCAweDFmZGFmYTc1LAotCTB4MWZkNjBkMmUsIDB4MDMzYmY2ZGQsIDB4MDNkMWQ3MDAsIDB4MWZjNTZlM2IsIDB4MWZiZjQ3MGYsIDB4MDQwM2JhMmIsIDB4MDQ5OTI2NTMsIDB4MWZhYWZiY2IsCi0JMHgxZmEzOWJhYywgMHgwNGNhZGVmZSwgMHgwNTVmYzAyMiwgMHgxZjhiYTczOCwgMHgxZjgzMGY0YSwgMHgwNTkxNDZhMSwgMHgwNjI1ODVjYSwgMHgxZjY3NzU1NywKLQkweDFmNWRhNmVkLCAweDA2NTZkMjdhLCAweDA2ZWE1OGNkLCAweDFmM2U2YmJjLCAweDFmMzM2ODVhLCAweDA3MWI2NDE1LCAweDA3YWUxYWQyLCAweDFmMTA5MGJkLAotCTB4MWYwNDVhMTUsIDB4MDdkZWRkMjAsIDB4MDg3MGFkYTcsIDB4MWVkZGViNmEsIDB4MWVkMDgzNWYsIDB4MDhhMTFmNzgsIDB4MDkzMWYzNGQsIDB4MWVhNjgzOTQsCi0JMHgxZTk3ZWMzNiwgMHgwOTYyMGQyNywgMHgwOWYxY2RmNSwgMHgxZTZhNjFjNSwgMHgxZTVhOWQ1NSwgMHgwYTIxODg2ZSwgMHgwYWIwMjAwOSwgMHgxZTI5OGY0NCwKLQkweDFlMThhMDMwLCAweDBhZGY3M2M2LCAweDBiNmNjYzMyLCAweDFkZTQxNjBmLCAweDFkZDFmZWY0LCAweDBiOWJiMWU1LCAweDBjMjdiNTU1LCAweDFkOWEwMGRlLAotCTB4MWQ4NmM0ODQsIDB4MGM1NjI1YzMsIDB4MGNlMGJlYTIsIDB4MWQ0YjViMWIsIDB4MWQzNmZjN2MsIDB4MGQwZWIyYTIsIDB4MGQ5N2NiOGYsIDB4MWNmODMwZTksCi0JMHgxY2UyYjMyOCwgMHgwZGM1M2MwYSwgMHgwZTRjYmZlMiwgMHgxY2EwOGYxYSwgMHgxYzg5ZjU4NywgMHgwZTc5YTVkNywgMHgwZWZmN2ZiMywgMHgxYzQ0ODMzMSwKLQkweDFjMmNkMTQ5LCAweDBmMmJkNDM3LCAweDBmYWZlZjczLCAweDFiZTQxYjYxLCAweDFiY2I1NGNiLCAweDBmZGJhYmFlLCAweDEwNWRmM2VjLCAweDFiN2Y2Njg3LAotCTB4MWI2NThmMTUsIDB4MTA4OTExMjAsIDB4MTEwOTcyNDksIDB4MWIxNjc0MmEsIDB4MWFmYjhmZDksIDB4MTEzM2U5ZDAsIDB4MTFiMjUwMTcsIDB4MWFhOTU0N2EsCi0JMHgxYThkNjc2ZSwgMHgxMWRjMWI2NSwgMHgxMjU4NzM0ZCwgMHgxYTM4MTg0YSwgMHgxYTFiMjZkMywgMHgxMjgxOGJlZiwgMHgxMmZiYzI0YiwgMHgxOWMyZDExMSwKLQkweDE5YTRkZmE0LCAweDEzMjQyMWVjLCAweDEzOWMyM2U0LCAweDE5NDk5MGU0LCAweDE5MmFhNDIwLCAweDEzYzNjNDRhLCAweDE0Mzk3ZjViLCAweDE4Y2M2YTc1LAotCTB4MThhYzg3MWYsIDB4MTQ2MDVhNjksIDB4MTRkM2JjNmQsIDB4MTg0YjcxMTIsIDB4MTgyYTljMTQsIDB4MTRmOWNjMjYsIDB4MTU2YWMzNTIsIDB4MTdjNmI4OWQsCisJMHgxZmZmZjYyMSwgMHgwMDE5MjFmOSwgMHgwMGFmZWE2OSwgMHgxZmZlMWM2OCwgMHgxZmZjZTA5ZCwgMHgwMGUyMmE3YSwgMHgwMTc4ZGJhYSwgMHgxZmY3NTNiYiwgCisJMHgxZmY0ZGM1NSwgMHgwMWFiMTAxYywgMHgwMjQxOTJjZiwgMHgxZmViOWQyNSwgMHgxZmU3ZWE4NSwgMHgwMjczYjNlMiwgMHgwMzA5ZjBlMiwgMHgxZmRhZmE3NSwgCisJMHgxZmQ2MGQyZSwgMHgwMzNiZjZkZCwgMHgwM2QxZDcwMCwgMHgxZmM1NmUzYiwgMHgxZmJmNDcwZiwgMHgwNDAzYmEyYiwgMHgwNDk5MjY1MywgMHgxZmFhZmJjYiwgCisJMHgxZmEzOWJhYywgMHgwNGNhZGVmZSwgMHgwNTVmYzAyMiwgMHgxZjhiYTczOCwgMHgxZjgzMGY0YSwgMHgwNTkxNDZhMSwgMHgwNjI1ODVjYSwgMHgxZjY3NzU1NywgCisJMHgxZjVkYTZlZCwgMHgwNjU2ZDI3YSwgMHgwNmVhNThjZCwgMHgxZjNlNmJiYywgMHgxZjMzNjg1YSwgMHgwNzFiNjQxNSwgMHgwN2FlMWFkMiwgMHgxZjEwOTBiZCwgCisJMHgxZjA0NWExNSwgMHgwN2RlZGQyMCwgMHgwODcwYWRhNywgMHgxZWRkZWI2YSwgMHgxZWQwODM1ZiwgMHgwOGExMWY3OCwgMHgwOTMxZjM0ZCwgMHgxZWE2ODM5NCwgCisJMHgxZTk3ZWMzNiwgMHgwOTYyMGQyNywgMHgwOWYxY2RmNSwgMHgxZTZhNjFjNSwgMHgxZTVhOWQ1NSwgMHgwYTIxODg2ZSwgMHgwYWIwMjAwOSwgMHgxZTI5OGY0NCwgCisJMHgxZTE4YTAzMCwgMHgwYWRmNzNjNiwgMHgwYjZjY2MzMiwgMHgxZGU0MTYwZiwgMHgxZGQxZmVmNCwgMHgwYjliYjFlNSwgMHgwYzI3YjU1NSwgMHgxZDlhMDBkZSwgCisJMHgxZDg2YzQ4NCwgMHgwYzU2MjVjMywgMHgwY2UwYmVhMiwgMHgxZDRiNWIxYiwgMHgxZDM2ZmM3YywgMHgwZDBlYjJhMiwgMHgwZDk3Y2I4ZiwgMHgxY2Y4MzBlOSwgCisJMHgxY2UyYjMyOCwgMHgwZGM1M2MwYSwgMHgwZTRjYmZlMiwgMHgxY2EwOGYxYSwgMHgxYzg5ZjU4NywgMHgwZTc5YTVkNywgMHgwZWZmN2ZiMywgMHgxYzQ0ODMzMSwgCisJMHgxYzJjZDE0OSwgMHgwZjJiZDQzNywgMHgwZmFmZWY3MywgMHgxYmU0MWI2MSwgMHgxYmNiNTRjYiwgMHgwZmRiYWJhZSwgMHgxMDVkZjNlYywgMHgxYjdmNjY4NywgCisJMHgxYjY1OGYxNSwgMHgxMDg5MTEyMCwgMHgxMTA5NzI0OSwgMHgxYjE2NzQyYSwgMHgxYWZiOGZkOSwgMHgxMTMzZTlkMCwgMHgxMWIyNTAxNywgMHgxYWE5NTQ3YSwgCisJMHgxYThkNjc2ZSwgMHgxMWRjMWI2NSwgMHgxMjU4NzM0ZCwgMHgxYTM4MTg0YSwgMHgxYTFiMjZkMywgMHgxMjgxOGJlZiwgMHgxMmZiYzI0YiwgMHgxOWMyZDExMSwgCisJMHgxOWE0ZGZhNCwgMHgxMzI0MjFlYywgMHgxMzljMjNlNCwgMHgxOTQ5OTBlNCwgMHgxOTJhYTQyMCwgMHgxM2MzYzQ0YSwgMHgxNDM5N2Y1YiwgMHgxOGNjNmE3NSwgCisJMHgxOGFjODcxZiwgMHgxNDYwNWE2OSwgMHgxNGQzYmM2ZCwgMHgxODRiNzExMiwgMHgxODJhOWMxNCwgMHgxNGY5Y2MyNiwgMHgxNTZhYzM1MiwgMHgxN2M2Yjg5ZCwgCiAJMHgxN2E0ZjcwOCwgMHgxNTkwMDFkNiwgMHgxNWZlN2NiZSwgMHgxNzNlNTU4ZSwgMHgxNzFiYWM5NiwgMHgxNjIyZTQ1MCwgMHgxNjhlZDFlYiwgMHgxNmIyNWNlZCwKIAkvKiAxMDI0ICovCi0JMHgxZmZmZmZkOSwgMHgwMDAzMjQzZiwgMHgwMDE1ZmRiYSwgMHgxZmZmZjg3MiwgMHgxZmZmZjM4MiwgMHgwMDFjNDYzNywgMHgwMDJmMWZhNiwgMHgxZmZmZGQ0ZCwKLQkweDFmZmZkMzZmLCAweDAwMzU2ODFkLCAweDAwNDg0MTc1LCAweDFmZmZhZTZjLCAweDFmZmY5ZjllLCAweDAwNGU4OWUzLCAweDAwNjE2MzE4LCAweDFmZmY2YmNlLAotCTB4MWZmZjU4MTEsIDB4MDA2N2FiNzcsIDB4MDA3YTg0N2UsIDB4MWZmZjE1NzIsIDB4MWZmZWZjYzYsIDB4MDA4MGNjY2MsIDB4MDA5M2E1OTksIDB4MWZmZWFiNWIsCi0JMHgxZmZlOGRiZiwgMHgwMDk5ZWRkMiwgMHgwMGFjYzY1OCwgMHgxZmZlMmQ4NiwgMHgxZmZlMGFmYywgMHgwMGIzMGU3OCwgMHgwMGM1ZTZhZCwgMHgxZmZkOWJmNiwKLQkweDFmZmQ3NDdjLCAweDAwY2MyZWIwLCAweDAwZGYwNjg4LCAweDFmZmNmNmFhLCAweDFmZmNjYTQxLCAweDAwZTU0ZTZhLCAweDAwZjgyNWRhLCAweDFmZmMzZGEyLAotCTB4MWZmYzBjNGIsIDB4MDBmZTZkOTcsIDB4MDExMTQ0OTIsIDB4MWZmYjcwZTAsIDB4MWZmYjNhOWEsIDB4MDExNzhjMjcsIDB4MDEyYTYyYTIsIDB4MWZmYTkwNjMsCi0JMHgxZmZhNTUyZSwgMHgwMTMwYWEwYSwgMHgwMTQzN2ZmYSwgMHgxZmY5OWMyYywgMHgxZmY5NWMwOSwgMHgwMTQ5YzczMSwgMHgwMTVjOWM4YSwgMHgxZmY4OTQzYywKLQkweDFmZjg0ZjJiLCAweDAxNjJlMzhkLCAweDAxNzViODQzLCAweDFmZjc3ODkzLCAweDFmZjcyZTk0LCAweDAxN2JmZjBlLCAweDAxOGVkMzE2LCAweDFmZjY0OTMyLAotCTB4MWZmNWZhNDYsIDB4MDE5NTE5YTUsIDB4MDFhN2VjZjIsIDB4MWZmNTA2MWIsIDB4MWZmNGIyNDAsIDB4MDFhZTMzNDEsIDB4MDFjMTA1YzksIDB4MWZmM2FmNGMsCi0JMHgxZmYzNTY4NCwgMHgwMWM3NGJkNSwgMHgwMWRhMWQ4YywgMHgxZmYyNDRjOCwgMHgxZmYxZTcxMywgMHgwMWUwNjM0ZiwgMHgwMWYzMzQyOSwgMHgxZmYwYzY4ZiwKLQkweDFmZjA2M2VkLCAweDAxZjk3OWExLCAweDAyMGM0OTkzLCAweDFmZWYzNGEzLCAweDFmZWVjZDE0LCAweDAyMTI4ZWJiLCAweDAyMjU1ZGI5LCAweDFmZWQ4ZjAzLAotCTB4MWZlZDIyODcsIDB4MDIyYmEyOGYsIDB4MDIzZTcwOGQsIDB4MWZlYmQ1YjIsIDB4MWZlYjY0NGEsIDB4MDI0NGI1MGIsIDB4MDI1NzgxZmUsIDB4MWZlYTA4YjAsCi0JMHgxZmU5OTI1YywgMHgwMjVkYzYyMSwgMHgwMjcwOTFmZCwgMHgxZmU4MjdmZSwgMHgxZmU3YWNiZSwgMHgwMjc2ZDVjMSwgMHgwMjg5YTA3YiwgMHgxZmU2MzM5ZCwKLQkweDFmZTViMzcyLCAweDAyOGZlM2RkLCAweDAyYTJhZDY5LCAweDFmZTQyYjkwLCAweDFmZTNhNjc5LCAweDAyYThmMDYzLCAweDAyYmJiOGI2LCAweDFmZTIwZmQ2LAotCTB4MWZlMTg1ZDUsIDB4MDJjMWZiNDYsIDB4MDJkNGMyNTMsIDB4MWZkZmUwNzEsIDB4MWZkZjUxODYsIDB4MDJkYjA0NzUsIDB4MDJlZGNhMzIsIDB4MWZkZDlkNjQsCi0JMHgxZmRkMDk4ZSwgMHgwMmY0MGJlMiwgMHgwMzA2ZDA0MiwgMHgxZmRiNDZhZSwgMHgxZmRhYWRlZSwgMHgwMzBkMTE3YywgMHgwMzFmZDQ3NCwgMHgxZmQ4ZGM1MSwKLQkweDFmZDgzZWE4LCAweDAzMjYxNTM0LCAweDAzMzhkNmI4LCAweDFmZDY1ZTRmLCAweDFmZDViYmJkLCAweDAzM2YxNmZiLCAweDAzNTFkNzAwLCAweDFmZDNjY2FhLAotCTB4MWZkMzI1MzAsIDB4MDM1ODE2YzEsIDB4MDM2YWQ1M2MsIDB4MWZkMTI3NjMsIDB4MWZkMDdiMDAsIDB4MDM3MTE0NzcsIDB4MDM4M2QxNWMsIDB4MWZjZTZlN2MsCi0JMHgxZmNkYmQzMSwgMHgwMzhhMTAwZSwgMHgwMzljY2I1MSwgMHgxZmNiYTFmNSwgMHgxZmNhZWJjMywgMHgwM2EzMDk3NSwgMHgwM2I1YzMwYiwgMHgxZmM4YzFkMiwKLQkweDFmYzgwNmI5LCAweDAzYmMwMDlmLCAweDAzY2ViODdjLCAweDFmYzVjZTE0LCAweDFmYzUwZTE0LCAweDAzZDRmNTdhLCAweDAzZTdhYjkzLCAweDFmYzJjNmJkLAotCTB4MWZjMjAxZDcsIDB4MDNlZGU3ZjksIDB4MDQwMDljNDIsIDB4MWZiZmFiY2QsIDB4MWZiZWUyMDIsIDB4MDQwNmQ4MGIsIDB4MDQxOThhNzgsIDB4MWZiYzdkNDksCi0JMHgxZmJiYWU5OSwgMHgwNDFmYzVhMSwgMHgwNDMyNzYyOCwgMHgxZmI5M2IzMSwgMHgxZmI4Njc5YywgMHgwNDM4YjBhYywgMHgwNDRiNWY0MCwgMHgxZmI1ZTU4NywKLQkweDFmYjUwZDBlLCAweDA0NTE5OTFkLCAweDA0NjQ0NWIyLCAweDFmYjI3YzRlLCAweDFmYjE5ZWYxLCAweDA0NmE3ZWUzLCAweDA0N2QyOTZmLCAweDFmYWVmZjg3LAotCTB4MWZhZTFkNDcsIDB4MDQ4MzYxZjAsIDB4MDQ5NjBhNjcsIDB4MWZhYjZmMzUsIDB4MWZhYTg4MTMsIDB4MDQ5YzQyMzUsIDB4MDRhZWU4OGIsIDB4MWZhN2NiNWEsCi0JMHgxZmE2ZGY1NiwgMHgwNGI1MWZhMSwgMHgwNGM3YzNjYiwgMHgxZmE0MTNmOCwgMHgxZmEzMjMxMywgMHgwNGNkZmEyNiwgMHgwNGUwOWMxOCwgMHgxZmEwNDkxMiwKLQkweDFmOWY1MzRjLCAweDA0ZTZkMWI0LCAweDA0Zjk3MTYzLCAweDFmOWM2YWE5LCAweDFmOWI3MDAzLCAweDA0ZmZhNjNjLCAweDA1MTI0MzlkLCAweDFmOTg3OGMxLAotCTB4MWY5Nzc5M2IsIDB4MDUxODc3YWYsIDB4MDUyYjEyYjYsIDB4MWY5NDczNWIsIDB4MWY5MzZlZjYsIDB4MDUzMTQ1ZmQsIDB4MDU0M2RlOWUsIDB4MWY5MDVhN2EsCi0JMHgxZjhmNTEzNywgMHgwNTRhMTExNywgMHgwNTVjYTc0OCwgMHgxZjhjMmUyMSwgMHgxZjhiMjAwMCwgMHgwNTYyZDhlZSwgMHgwNTc1NmNhMiwgMHgxZjg3ZWU1MiwKLQkweDFmODZkYjU1LCAweDA1N2I5ZDczLCAweDA1OGUyZTlmLCAweDFmODM5YjEwLCAweDFmODI4MzM2LCAweDA1OTQ1ZTk1LCAweDA1YTZlZDJlLCAweDFmN2YzNDVlLAotCTB4MWY3ZTE3YTgsIDB4MDVhZDFjNDcsIDB4MDViZmE4NDAsIDB4MWY3YWJhM2UsIDB4MWY3OTk4YWQsIDB4MDVjNWQ2NzgsIDB4MDVkODVmYzcsIDB4MWY3NjJjYjIsCi0JMHgxZjc1MDY0NywgMHgwNWRlOGQxOSwgMHgwNWYxMTNiMywgMHgxZjcxOGJiZiwgMHgxZjcwNjA3YSwgMHgwNWY3NDAxYywgMHgwNjA5YzNmNSwgMHgxZjZjZDc2NiwKLQkweDFmNmJhNzQ4LCAweDA2MGZlZjcxLCAweDA2MjI3MDdkLCAweDFmNjgwZmFiLCAweDFmNjZkYWI1LCAweDA2Mjg5YjA4LCAweDA2M2IxOTNjLCAweDFmNjMzNDkwLAotCTB4MWY2MWZhYzMsIDB4MDY0MTQyZDMsIDB4MDY1M2JlMjMsIDB4MWY1ZTQ2MTksIDB4MWY1ZDA3NzUsIDB4MDY1OWU2YzIsIDB4MDY2YzVmMjQsIDB4MWY1OTQ0NDgsCi0JMHgxZjU4MDBjZSwgMHgwNjcyODZjNiwgMHgwNjg0ZmMyZSwgMHgxZjU0MmYyMSwgMHgxZjUyZTZkMiwgMHgwNjhiMjJkMCwgMHgwNjlkOTUzMiwgMHgxZjRmMDZhNiwKLQkweDFmNGRiOTgzLCAweDA2YTNiYWQwLCAweDA2YjYyYTIyLCAweDFmNDljYWRjLCAweDFmNDg3OGU1LCAweDA2YmM0ZWI5LCAweDA2Y2ViYWVlLCAweDFmNDQ3YmM0LAotCTB4MWY0MzI0ZmIsIDB4MDZkNGRlNzksIDB4MDZlNzQ3ODYsIDB4MWYzZjE5NjMsIDB4MWYzZGJkYzgsIDB4MDZlZDZhMDMsIDB4MDZmZmNmZGQsIDB4MWYzOWEzYmMsCi0JMHgxZjM4NDM1MCwgMHgwNzA1ZjE0NywgMHgwNzE4NTNlMywgMHgxZjM0MWFkMiwgMHgxZjMyYjU5NSwgMHgwNzFlNzQzNiwgMHgwNzMwZDM4OCwgMHgxZjJlN2VhOSwKLQkweDFmMmQxNDlkLCAweDA3MzZmMmMwLCAweDA3NDk0ZWJkLCAweDFmMjhjZjQzLCAweDFmMjc2MDY5LCAweDA3NGY2Y2Q3LCAweDA3NjFjNTc0LCAweDFmMjMwY2E1LAotCTB4MWYyMTk4ZmQsIDB4MDc2N2UyNmMsIDB4MDc3YTM3OWQsIDB4MWYxZDM2ZDIsIDB4MWYxYmJlNWQsIDB4MDc4MDUzNzAsIDB4MDc5MmE1MmEsIDB4MWYxNzRkY2UsCi0JMHgxZjE1ZDA4ZCwgMHgwNzk4YmZkMywgMHgwN2FiMGUwYSwgMHgxZjExNTE5YywgMHgxZjBmY2Y5MSwgMHgwN2IxMjc4NiwgMHgwN2MzNzIzMCwgMHgxZjBiNDI0MCwKLQkweDFmMDliYjZiLCAweDA3Yzk4YTdhLCAweDA3ZGJkMThjLCAweDFmMDUxZmJlLCAweDFmMDM5NDFmLCAweDA3ZTFlOGExLCAweDA3ZjQyYzBlLCAweDFlZmVlYTE5LAotCTB4MWVmZDU5YjMsIDB4MDdmYTQxZWIsIDB4MDgwYzgxYTksIDB4MWVmOGExNTUsIDB4MWVmNzBjMjgsIDB4MDgxMjk2NGEsIDB4MDgyNGQyNGQsIDB4MWVmMjQ1NzcsCi0JMHgxZWYwYWI4NCwgMHgwODJhZTVhZCwgMHgwODNkMWRlYSwgMHgxZWViZDY4MiwgMHgxZWVhMzdjYSwgMHgwODQzMzAwNywgMHgwODU1NjQ3MywgMHgxZWU1NTQ3YSwKLQkweDFlZTNiMGZlLCAweDA4NWI3NTQ4LCAweDA4NmRhNWQ4LCAweDFlZGViZjY0LCAweDFlZGQxNzI0LCAweDA4NzNiNTYyLCAweDA4ODVlMjA5LCAweDFlZDgxNzQyLAotCTB4MWVkNjZhNDEsIDB4MDg4YmYwNDQsIDB4MDg5ZTE4ZjksIDB4MWVkMTVjMWEsIDB4MWVjZmFhNTcsIDB4MDhhNDI1ZTEsIDB4MDhiNjRhOTgsIDB4MWVjYThkZWYsCi0JMHgxZWM4ZDc2YywgMHgwOGJjNTYyYSwgMHgwOGNlNzZkOCwgMHgxZWMzYWNjNiwgMHgxZWMxZjE4NCwgMHgwOGQ0ODEwZiwgMHgwOGU2OWRhOCwgMHgxZWJjYjhhMywKLQkweDFlYmFmOGEzLCAweDA4ZWNhNjgxLCAweDA4ZmViZWZiLCAweDFlYjViMThhLCAweDFlYjNlY2NkLCAweDA5MDRjNjczLCAweDA5MTZkYWMyLCAweDFlYWU5NzdmLAotCTB4MWVhY2NlMDcsIDB4MDkxY2UwZDQsIDB4MDkyZWYwZWQsIDB4MWVhNzZhODcsIDB4MWVhNTljNTUsIDB4MDkzNGY1OTYsIDB4MDk0NzAxNmUsIDB4MWVhMDJhYTcsCi0JMHgxZTllNTdiYiwgMHgwOTRkMDRhYSwgMHgwOTVmMGMzNiwgMHgxZTk4ZDdlMiwgMHgxZTk3MDAzZSwgMHgwOTY1MGUwMSwgMHgwOTc3MTEzNiwgMHgxZTkxNzIzZSwKLQkweDFlOGY5NWUzLCAweDA5N2QxMThkLCAweDA5OGYxMDYwLCAweDFlODlmOWJmLCAweDFlODgxOGFkLCAweDA5OTUwZjNmLCAweDA5YTcwOWE0LCAweDFlODI2ZTY5LAotCTB4MWU4MDg4YTIsIDB4MDlhZDA3MDcsIDB4MDliZWZjZjQsIDB4MWU3YWQwNDEsIDB4MWU3OGU1YzcsIDB4MDljNGY4ZDgsIDB4MDlkNmVhNDAsIDB4MWU3MzFmNGMsCi0JMHgxZTcxMzAxZiwgMHgwOWRjZTRhMSwgMHgwOWVlZDE3YiwgMHgxZTZiNWI4ZiwgMHgxZTY5NjdiMSwgMHgwOWY0Y2E1NiwgMHgwYTA2YjI5NiwgMHgxZTYzODUwZSwKLQkweDFlNjE4YzgwLCAweDBhMGNhOWU2LCAweDBhMWU4ZDgxLCAweDFlNWI5YmNlLCAweDFlNTk5ZTkxLCAweDBhMjQ4MzQzLCAweDBhMzY2MjJlLCAweDFlNTM5ZmQ0LAotCTB4MWU1MTlkZWEsIDB4MGEzYzU2NWUsIDB4MGE0ZTMwOGYsIDB4MWU0YjkxMjYsIDB4MWU0OThhOGUsIDB4MGE1NDIzMjksIDB4MGE2NWY4OTQsIDB4MWU0MzZmYzcsCi0JMHgxZTQxNjQ4NSwgMHgwYTZiZTk5NSwgMHgwYTdkYmEyZiwgMHgxZTNiM2JiZCwgMHgxZTM5MmJkMSwgMHgwYTgzYTk5MywgMHgwYTk1NzU1MSwgMHgxZTMyZjUwZSwKLQkweDFlMzBlMDc5LCAweDBhOWI2MzE1LCAweDBhYWQyOWVjLCAweDFlMmE5YmJkLCAweDFlMjg4MjgxLCAweDBhYjMxNjBjLCAweDBhYzRkN2YxLCAweDFlMjIyZmQxLAotCTB4MWUyMDExZWUsIDB4MGFjYWMyNmEsIDB4MGFkYzdmNTIsIDB4MWUxOWIxNGYsIDB4MWUxNzhlYzcsIDB4MGFlMjY4MWYsIDB4MGFmNDFmZmYsIDB4MWUxMTIwM2IsCi0JMHgxZTBlZjkxMCwgMHgwYWZhMDcxZCwgMHgwYjBiYjllYiwgMHgxZTA4N2M5YiwgMHgxZTA2NTBjZSwgMHgwYjExOWY1NiwgMHgwYjIzNGQwNywgMHgxZGZmYzY3NCwKLQkweDFkZmQ5NjA2LCAweDBiMjkzMGJiLCAweDBiM2FkOTQzLCAweDFkZjZmZGNjLCAweDFkZjRjOGJmLCAweDBiNDBiYjNlLCAweDBiNTI1ZTkyLCAweDFkZWUyMmE5LAotCTB4MWRlYmU4ZmQsIDB4MGI1ODNlY2YsIDB4MGI2OWRjZTYsIDB4MWRlNTM1MGYsIDB4MWRlMmY2YzYsIDB4MGI2ZmJiNjIsIDB4MGI4MTU0MmYsIDB4MWRkYzM1MDQsCi0JMHgxZGQ5ZjIyMCwgMHgwYjg3MzBlNiwgMHgwYjk4YzQ1ZiwgMHgxZGQzMjI4ZSwgMHgxZGQwZGIxMCwgMHgwYjllOWY0ZCwgMHgwYmIwMmQ2OCwgMHgxZGM5ZmRiMiwKLQkweDFkYzdiMTliLCAweDBiYjYwNjhhLCAweDBiYzc4ZjNiLCAweDFkYzBjNjc2LCAweDFkYmU3NWM4LCAweDBiY2Q2NjhlLCAweDBiZGVlOWNhLCAweDFkYjc3Y2RmLAotCTB4MWRiNTI3OWMsIDB4MGJlNGJmNGEsIDB4MGJmNjNkMDcsIDB4MWRhZTIwZjQsIDB4MWRhYmM3MWQsIDB4MGJmYzEwYWYsIDB4MGMwZDg4ZTIsIDB4MWRhNGIyYmEsCi0JMHgxZGEyNTQ1MCwgMHgwYzEzNWFiMCwgMHgwYzI0Y2Q0ZSwgMHgxZDliMzIzNywgMHgxZDk4Y2YzYiwgMHgwYzJhOWQzZSwgMHgwYzNjMGEzZCwgMHgxZDkxOWY3MCwKLQkweDFkOGYzN2U1LCAweDBjNDFkODRiLCAweDBjNTMzZmEwLCAweDFkODdmYTZkLCAweDFkODU4ZTUzLCAweDBjNTkwYmM5LCAweDBjNmE2ZDY4LCAweDFkN2U0MzMyLAotCTB4MWQ3YmQyOGIsIDB4MGM3MDM3YTgsIDB4MGM4MTkzODgsIDB4MWQ3NDc5YzUsIDB4MWQ3MjA0OTMsIDB4MGM4NzViZGIsIDB4MGM5OGIxZjAsIDB4MWQ2YTllMmUsCi0JMHgxZDY4MjQ3MiwgMHgwYzllNzg1NCwgMHgwY2FmYzg5NCwgMHgxZDYwYjA3MCwgMHgxZDVlMzIyYywgMHgwY2I1OGQwNCwgMHgwY2M2ZDc2NCwgMHgxZDU2YjA5NCwKLQkweDFkNTQyZGM5LCAweDBjY2M5OWRlLCAweDBjZGRkZTUzLCAweDFkNGM5ZTlmLCAweDFkNGExNzRmLCAweDBjZTM5ZWQyLCAweDBjZjRkZDUyLCAweDFkNDI3YTk3LAotCTB4MWQzZmVlYzMsIDB4MGNmYTliZDIsIDB4MGQwYmQ0NTIsIDB4MWQzODQ0ODMsIDB4MWQzNWI0MmQsIDB4MGQxMTkwZDEsIDB4MGQyMmMzNDcsIDB4MWQyZGZjNjgsCi0JMHgxZDJiNjc5MSwgMHgwZDI4N2RjMSwgMHgwZDM5YWEyMSwgMHgxZDIzYTI0ZSwgMHgxZDIxMDhmOCwgMHgwZDNmNjI5MiwgMHgwZDUwODhkMywgMHgxZDE5MzYzYSwKLQkweDFkMTY5ODY3LCAweDBkNTYzZjM4LCAweDBkNjc1ZjRlLCAweDFkMGViODMzLCAweDFkMGMxNWU0LCAweDBkNmQxM2EzLCAweDBkN2UyZDg1LCAweDFkMDQyODNmLAotCTB4MWQwMTgxNzYsIDB4MGQ4M2RmYzYsIDB4MGQ5NGYzNjksIDB4MWNmOTg2NjYsIDB4MWNmNmRiMjQsIDB4MGQ5YWEzOTMsIDB4MGRhYmIwZWMsIDB4MWNlZWQyYWQsCi0JMHgxY2VjMjJmNCwgMHgwZGIxNWVmYywgMHgwZGMyNjYwMCwgMHgxY2U0MGQxYiwgMHgxY2UxNThlZCwgMHgwZGM4MTFmMywgMHgwZGQ5MTI5OCwgMHgxY2Q5MzViNywKLQkweDFjZDY3ZDE1LCAweDBkZGViYzY5LCAweDBkZWZiNmE1LCAweDFjY2U0Yzg3LCAweDFjY2I4Zjc0LCAweDBkZjU1ZTUxLCAweDBlMDY1MjE5LCAweDFjYzM1MTkyLAotCTB4MWNjMDkwMGYsIDB4MGUwYmY3OWMsIDB4MGUxY2U0ZTYsIDB4MWNiODQ0ZGYsIDB4MWNiNTdlZWUsIDB4MGUyMjg4M2UsIDB4MGUzMzZlZmYsIDB4MWNhZDI2NzUsCi0JMHgxY2FhNWMxNywgMHgwZTM5MTAyNywgMHgwZTQ5ZjA1NSwgMHgxY2ExZjY1YiwgMHgxYzlmMjc5MiwgMHgwZTRmOGY0YiwgMHgwZTYwNjhkYiwgMHgxYzk2YjQ5NywKLQkweDFjOTNlMTY1LCAweDBlNjYwNTlhLCAweDBlNzZkODgzLCAweDFjOGI2MTMxLCAweDFjODg4OTk3LCAweDBlN2M3MzA4LCAweDBlOGQzZjNlLCAweDFjN2ZmYzJmLAotCTB4MWM3ZDIwMmYsIDB4MGU5MmQ3ODcsIDB4MGVhMzlkMDAsIDB4MWM3NDg1OTksIDB4MWM3MWE1MzUsIDB4MGVhOTMzMDgsIDB4MGViOWYxYmEsIDB4MWM2OGZkNzUsCi0JMHgxYzY2MThhZSwgMHgwZWJmODU3ZCwgMHgwZWQwM2Q1ZSwgMHgxYzVkNjNjYSwgMHgxYzVhN2FhNCwgMHgwZWQ1Y2VkYSwgMHgwZWU2N2ZkZiwgMHgxYzUxYjhhMSwKLQkweDFjNGVjYjFjLCAweDBlZWMwZjEwLCAweDBlZmNiOTJmLCAweDFjNDVmYzAwLCAweDFjNDMwYTFkLCAweDBmMDI0NjEyLCAweDBmMTJlOTQxLCAweDFjM2EyZGVkLAotCTB4MWMzNzM3YjAsIDB4MGYxODczZDIsIDB4MGYyOTEwMDYsIDB4MWMyZTRlNzIsIDB4MWMyYjUzZGIsIDB4MGYyZTk4NDIsIDB4MGYzZjJkNzEsIDB4MWMyMjVkOTQsCi0JMHgxYzFmNWVhNiwgMHgwZjQ0YjM1NCwgMHgwZjU1NDE3NSwgMHgxYzE2NWI1YiwgMHgxYzEzNTgxOCwgMHgwZjVhYzRmYywgMHgwZjZiNGMwMywgMHgxYzBhNDdjZiwKLQkweDFjMDc0MDM4LCAweDBmNzBjZDJhLCAweDBmODE0ZDBlLCAweDFiZmUyMmY4LCAweDFiZmIxNzBmLCAweDBmODZjYmQzLCAweDBmOTc0NDg5LCAweDFiZjFlY2RiLAotCTB4MWJlZWRjYTIsIDB4MGY5Y2MwZTcsIDB4MGZhZDMyNjUsIDB4MWJlNWE1ODIsIDB4MWJlMjkwZmIsIDB4MGZiMmFjNWEsIDB4MGZjMzE2OTcsIDB4MWJkOTRjZjQsCi0JMHgxYmQ2MzQyMSwgMHgwZmM4OGUxZSwgMHgwZmQ4ZjEwZiwgMHgxYmNjZTMzNywgMHgxYmM5YzYxYSwgMHgwZmRlNjYyNiwgMHgwZmVlYzFjMCwgMHgxYmMwNjg1NSwKLQkweDFiYmQ0NmYwLCAweDBmZjQzNDY0LCAweDEwMDQ4ODllLCAweDFiYjNkYzU1LCAweDFiYjBiNmE5LCAweDEwMDlmOGNiLCAweDEwMWE0NTlhLCAweDFiYTczZjNkLAotCTB4MWJhNDE1NGQsIDB4MTAxZmIzNGQsIDB4MTAyZmY4YTgsIDB4MWI5YTkxMTcsIDB4MWI5NzYyZTQsIDB4MTAzNTYzZGMsIDB4MTA0NWExYjksIDB4MWI4ZGQxZWEsCi0JMHgxYjhhOWY3NywgMHgxMDRiMGE2YywgMHgxMDViNDBjMSwgMHgxYjgxMDFiZSwgMHgxYjdkY2IwYywgMHgxMDYwYTZlZiwgMHgxMDcwZDViMSwgMHgxYjc0MjA5YiwKLQkweDFiNzBlNWFjLCAweDEwNzYzOTU4LCAweDEwODY2MDdlLCAweDFiNjcyZTg4LCAweDFiNjNlZjVmLCAweDEwOGJjMTlhLCAweDEwOWJlMTE5LCAweDFiNWEyYjhlLAotCTB4MWI1NmU4MmMsIDB4MTBhMTNmYTYsIDB4MTBiMTU3NzUsIDB4MWI0ZDE3YjQsIDB4MWI0OWQwMWMsIDB4MTBiNmIzNzEsIDB4MTBjNmMzODUsIDB4MWIzZmYzMDQsCi0JMHgxYjNjYTczNywgMHgxMGNjMWNlYywgMHgxMGRjMjUzYywgMHgxYjMyYmQ4NCwgMHgxYjJmNmQ4NSwgMHgxMGUxN2MwYiwgMHgxMGYxN2M4ZCwgMHgxYjI1NzczZCwKLQkweDFiMjIyMzBlLCAweDEwZjZkMGMwLCAweDExMDZjOTZhLCAweDFiMTgyMDM4LCAweDFiMTRjN2RhLCAweDExMGMxYWZlLCAweDExMWMwYmM2LCAweDFiMGFiODdjLAotCTB4MWIwNzViZjEsIDB4MTEyMTVhYjgsIDB4MTEzMTQzOTUsIDB4MWFmZDQwMTIsIDB4MWFmOWRmNWQsIDB4MTEzNjhmZTEsIDB4MTE0NjcwYzgsIDB4MWFlZmI3MDIsCi0JMHgxYWVjNTIyNSwgMHgxMTRiYmE2YiwgMHgxMTViOTM1NCwgMHgxYWUyMWQ1NCwgMHgxYWRlYjQ1MSwgMHgxMTYwZGE0YiwgMHgxMTcwYWIyYSwgMHgxYWQ0NzMxMSwKLQkweDFhZDEwNWU5LCAweDExNzVlZjcyLCAweDExODViODNmLCAweDFhYzZiODQxLCAweDFhYzM0NmY4LCAweDExOGFmOWQ0LCAweDExOWFiYTg0LCAweDFhYjhlY2VjLAotCTB4MWFiNTc3ODQsIDB4MTE5ZmY5NjQsIDB4MTFhZmIxZWUsIDB4MWFhYjExMWMsIDB4MWFhNzk3OTYsIDB4MTFiNGVlMTQsIDB4MTFjNDllNmYsIDB4MWE5ZDI0ZDksCi0JMHgxYTk5YTczNywgMHgxMWM5ZDdkOSwgMHgxMWQ5N2ZmOSwgMHgxYThmMjgyYiwgMHgxYThiYTY3MCwgMHgxMWRlYjZhNCwgMHgxMWVlNTY4MiwgMHgxYTgxMWIxYiwKLQkweDFhN2Q5NTQ5LCAweDExZjM4YTZhLCAweDEyMDMyMWZhLCAweDFhNzJmZGIyLCAweDFhNmY3M2NhLCAweDEyMDg1MzFjLCAweDEyMTdlMjU2LCAweDFhNjRjZmY4LAotCTB4MWE2MTQxZmQsIDB4MTIxZDEwYWYsIDB4MTIyYzk3ODksIDB4MWE1NjkxZjUsIDB4MWE1MmZmZWIsIDB4MTIzMWMzMTYsIDB4MTI0MTQxODYsIDB4MWE0ODQzYjQsCi0JMHgxYTQ0YWQ5YiwgMHgxMjQ2NmE0NCwgMHgxMjU1ZTA0MSwgMHgxYTM5ZTUzZCwgMHgxYTM2NGIxNywgMHgxMjViMDYyYiwgMHgxMjZhNzNhYywgMHgxYTJiNzY5OCwKLQkweDFhMjdkODY4LCAweDEyNmY5NmMxLCAweDEyN2VmYmJiLCAweDFhMWNmN2NlLCAweDFhMTk1NTk3LCAweDEyODQxYmY2LCAweDEyOTM3ODYxLCAweDFhMGU2OGU5LAotCTB4MWEwYWMyYWMsIDB4MTI5ODk1YzAsIDB4MTJhN2U5OTEsIDB4MTlmZmM5ZjEsIDB4MTlmYzFmYjEsIDB4MTJhZDA0MTIsIDB4MTJiYzRmNDAsIDB4MTlmMTFhZjAsCi0JMHgxOWVkNmNhZiwgMHgxMmMxNjZkZSwgMHgxMmQwYTk2MCwgMHgxOWUyNWJlZSwgMHgxOWRlYTlhZSwgMHgxMmQ1YmUxOCwgMHgxMmU0ZjdlNSwgMHgxOWQzOGNmNCwKLQkweDE5Y2ZkNmI4LCAweDEyZWEwOWI0LCAweDEyZjkzYWMyLCAweDE5YzRhZTBjLCAweDE5YzBmM2Q2LCAweDEyZmU0OWE2LCAweDEzMGQ3MWViLCAweDE5YjViZjNmLAotCTB4MTliMjAxMTEsIDB4MTMxMjdkZTAsIDB4MTMyMTlkNTMsIDB4MTlhNmMwOTYsIDB4MTlhMmZlNzMsIDB4MTMyNmE2NTYsIDB4MTMzNWJjZWYsIDB4MTk5N2IyMWIsCi0JMHgxOTkzZWMwNCwgMHgxMzNhYzJmYywgMHgxMzQ5ZDBiMCwgMHgxOTg4OTNkNiwgMHgxOTg0YzljZSwgMHgxMzRlZDNjNSwgMHgxMzVkZDg4YywgMHgxOTc5NjVkMCwKLQkweDE5NzU5N2RhLCAweDEzNjJkOGE2LCAweDEzNzFkNDc2LCAweDE5NmEyODE1LCAweDE5NjY1NjMyLCAweDEzNzZkMTkxLCAweDEzODVjNDYxLCAweDE5NWFkYWFiLAotCTB4MTk1NzA0ZGYsIDB4MTM4YWJlN2IsIDB4MTM5OWE4NDEsIDB4MTk0YjdkOWUsIDB4MTk0N2EzZWIsIDB4MTM5ZTlmNTYsIDB4MTNhZDgwMGEsIDB4MTkzYzEwZjcsCi0JMHgxOTM4MzM1ZSwgMHgxM2IyNzQxNywgMHgxM2MxNGJiMCwgMHgxOTJjOTRiZiwgMHgxOTI4YjM0MywgMHgxM2M2M2NiMiwgMHgxM2Q1MGIyNiwgMHgxOTFkMDhmZiwKLQkweDE5MTkyM2EzLCAweDEzZDlmOTFiLCAweDEzZThiZTYwLCAweDE5MGQ2ZGMxLCAweDE5MDk4NDg4LCAweDEzZWRhOTQ0LCAweDEzZmM2NTUzLCAweDE4ZmRjMzEwLAotCTB4MThmOWQ1ZmEsIDB4MTQwMTRkMjMsIDB4MTQwZmZmZjEsIDB4MThlZTA4ZjQsIDB4MThlYTE4MDUsIDB4MTQxNGU0YWEsIDB4MTQyMzhlMmYsIDB4MThkZTNmNzcsCi0JMHgxOGRhNGFiMiwgMHgxNDI4NmZjZSwgMHgxNDM3MTAwMSwgMHgxOGNlNjZhMywgMHgxOGNhNmUwYSwgMHgxNDNiZWU4MywgMHgxNDRhODU1YiwgMHgxOGJlN2U4MiwKLQkweDE4YmE4MjE3LCAweDE0NGY2MGJkLCAweDE0NWRlZTMwLCAweDE4YWU4NzFlLCAweDE4YWE4NmUzLCAweDE0NjJjNjcwLCAweDE0NzE0YTc2LCAweDE4OWU4MDgwLAotCTB4MTg5YTdjNzgsIDB4MTQ3NjFmOGYsIDB4MTQ4NDlhMWYsIDB4MTg4ZTZhYjIsIDB4MTg4YTYyZTAsIDB4MTQ4OTZjMGYsIDB4MTQ5N2RkMjAsIDB4MTg3ZTQ1YmUsCi0JMHgxODdhM2EyNSwgMHgxNDljYWJlNCwgMHgxNGFiMTM2ZCwgMHgxODZlMTFhZiwgMHgxODZhMDI1MCwgMHgxNGFmZGYwMywgMHgxNGJlM2NmYSwgMHgxODVkY2U4ZSwKLQkweDE4NTliYjZjLCAweDE0YzMwNTVlLCAweDE0ZDE1OWJjLCAweDE4NGQ3YzY1LCAweDE4NDk2NTgzLCAweDE0ZDYxZWViLCAweDE0ZTQ2OWE2LCAweDE4M2QxYjNlLAotCTB4MTgzOTAwOWUsIDB4MTRlOTJiOWUsIDB4MTRmNzZjYWQsIDB4MTgyY2FiMjQsIDB4MTgyODhjYzgsIDB4MTRmYzJiNmEsIDB4MTUwYTYyYzYsIDB4MTgxYzJjMjAsCi0JMHgxODE4MGEwYywgMHgxNTBmMWU0NSwgMHgxNTFkNGJlMywgMHgxODBiOWUzZCwgMHgxODA3Nzg3MywgMHgxNTIyMDQyMiwgMHgxNTMwMjdmYiwgMHgxN2ZiMDE4NSwKLQkweDE3ZjZkODA3LCAweDE1MzRkY2Y2LCAweDE1NDJmNzAwLCAweDE3ZWE1NjAyLCAweDE3ZTYyOGQzLCAweDE1NDdhOGI1LCAweDE1NTViOGU4LCAweDE3ZDk5YmJlLAotCTB4MTdkNTZhZTAsIDB4MTU1YTY3NTQsIDB4MTU2ODZkYTcsIDB4MTdjOGQyYzQsIDB4MTdjNDllM2IsIDB4MTU2ZDE4YzcsIDB4MTU3YjE1MzIsIDB4MTdiN2ZiMWYsCi0JMHgxN2IzYzJlYywgMHgxNTdmYmQwMywgMHgxNThkYWY3YywgMHgxN2E3MTRkNywgMHgxN2EyZDhmZSwgMHgxNTkyNTNmYiwgMHgxNWEwM2M3YSwgMHgxNzk2MWZmOSwKLQkweDE3OTFlMDdiLCAweDE1YTRkZGE1LCAweDE1YjJiYzIyLCAweDE3ODUxYzhlLCAweDE3ODBkOTZmLCAweDE1Yjc1OWY1LCAweDE1YzUyZTY3LCAweDE3NzQwYWExLAotCTB4MTc2ZmMzZTMsIDB4MTVjOWM4ZTAsIDB4MTVkNzkzM2YsIDB4MTc2MmVhM2QsIDB4MTc1ZTlmZTIsIDB4MTVkYzJhNWEsIDB4MTVlOWVhOWQsIDB4MTc1MWJiNmIsCi0JMHgxNzRkNmQ3NywgMHgxNWVlN2U1OCwgMHgxNWZjMzQ3NywgMHgxNzQwN2UzNywgMHgxNzNjMmNhYywgMHgxNjAwYzRjZiwgMHgxNjBlNzBjMSwgMHgxNzJmMzJhYiwKLQkweDE3MmFkZDhjLCAweDE2MTJmZGIzLCAweDE2MjA5ZjcwLCAweDE3MWRkOGQyLCAweDE3MTk4MDIxLCAweDE2MjUyOGZhLCAweDE2MzJjMDc4LCAweDE3MGM3MGI3LAotCTB4MTcwODE0NzcsIDB4MTYzNzQ2OTcsIDB4MTY0NGQzZDAsIDB4MTZmYWZhNjQsIDB4MTZmNjlhOTcsIDB4MTY0OTU2ODAsIDB4MTY1NmQ5NmEsIDB4MTZlOTc1ZTQsCi0JMHgxNmU1MTI4ZSwgMHgxNjViNThhYSwgMHgxNjY4ZDEzZSwgMHgxNmQ3ZTM0MSwgMHgxNmQzN2M2NSwgMHgxNjZkNGQwYSwgMHgxNjdhYmIzZSwgMHgxNmM2NDI4OCwKKwkweDFmZmZmZmQ5LCAweDAwMDMyNDNmLCAweDAwMTVmZGJhLCAweDFmZmZmODcyLCAweDFmZmZmMzgyLCAweDAwMWM0NjM3LCAweDAwMmYxZmE2LCAweDFmZmZkZDRkLCAKKwkweDFmZmZkMzZmLCAweDAwMzU2ODFkLCAweDAwNDg0MTc1LCAweDFmZmZhZTZjLCAweDFmZmY5ZjllLCAweDAwNGU4OWUzLCAweDAwNjE2MzE4LCAweDFmZmY2YmNlLCAKKwkweDFmZmY1ODExLCAweDAwNjdhYjc3LCAweDAwN2E4NDdlLCAweDFmZmYxNTcyLCAweDFmZmVmY2M2LCAweDAwODBjY2NjLCAweDAwOTNhNTk5LCAweDFmZmVhYjViLCAKKwkweDFmZmU4ZGJmLCAweDAwOTllZGQyLCAweDAwYWNjNjU4LCAweDFmZmUyZDg2LCAweDFmZmUwYWZjLCAweDAwYjMwZTc4LCAweDAwYzVlNmFkLCAweDFmZmQ5YmY2LCAKKwkweDFmZmQ3NDdjLCAweDAwY2MyZWIwLCAweDAwZGYwNjg4LCAweDFmZmNmNmFhLCAweDFmZmNjYTQxLCAweDAwZTU0ZTZhLCAweDAwZjgyNWRhLCAweDFmZmMzZGEyLCAKKwkweDFmZmMwYzRiLCAweDAwZmU2ZDk3LCAweDAxMTE0NDkyLCAweDFmZmI3MGUwLCAweDFmZmIzYTlhLCAweDAxMTc4YzI3LCAweDAxMmE2MmEyLCAweDFmZmE5MDYzLCAKKwkweDFmZmE1NTJlLCAweDAxMzBhYTBhLCAweDAxNDM3ZmZhLCAweDFmZjk5YzJjLCAweDFmZjk1YzA5LCAweDAxNDljNzMxLCAweDAxNWM5YzhhLCAweDFmZjg5NDNjLCAKKwkweDFmZjg0ZjJiLCAweDAxNjJlMzhkLCAweDAxNzViODQzLCAweDFmZjc3ODkzLCAweDFmZjcyZTk0LCAweDAxN2JmZjBlLCAweDAxOGVkMzE2LCAweDFmZjY0OTMyLCAKKwkweDFmZjVmYTQ2LCAweDAxOTUxOWE1LCAweDAxYTdlY2YyLCAweDFmZjUwNjFiLCAweDFmZjRiMjQwLCAweDAxYWUzMzQxLCAweDAxYzEwNWM5LCAweDFmZjNhZjRjLCAKKwkweDFmZjM1Njg0LCAweDAxYzc0YmQ1LCAweDAxZGExZDhjLCAweDFmZjI0NGM4LCAweDFmZjFlNzEzLCAweDAxZTA2MzRmLCAweDAxZjMzNDI5LCAweDFmZjBjNjhmLCAKKwkweDFmZjA2M2VkLCAweDAxZjk3OWExLCAweDAyMGM0OTkzLCAweDFmZWYzNGEzLCAweDFmZWVjZDE0LCAweDAyMTI4ZWJiLCAweDAyMjU1ZGI5LCAweDFmZWQ4ZjAzLCAKKwkweDFmZWQyMjg3LCAweDAyMmJhMjhmLCAweDAyM2U3MDhkLCAweDFmZWJkNWIyLCAweDFmZWI2NDRhLCAweDAyNDRiNTBiLCAweDAyNTc4MWZlLCAweDFmZWEwOGIwLCAKKwkweDFmZTk5MjVjLCAweDAyNWRjNjIxLCAweDAyNzA5MWZkLCAweDFmZTgyN2ZlLCAweDFmZTdhY2JlLCAweDAyNzZkNWMxLCAweDAyODlhMDdiLCAweDFmZTYzMzlkLCAKKwkweDFmZTViMzcyLCAweDAyOGZlM2RkLCAweDAyYTJhZDY5LCAweDFmZTQyYjkwLCAweDFmZTNhNjc5LCAweDAyYThmMDYzLCAweDAyYmJiOGI2LCAweDFmZTIwZmQ2LCAKKwkweDFmZTE4NWQ1LCAweDAyYzFmYjQ2LCAweDAyZDRjMjUzLCAweDFmZGZlMDcxLCAweDFmZGY1MTg2LCAweDAyZGIwNDc1LCAweDAyZWRjYTMyLCAweDFmZGQ5ZDY0LCAKKwkweDFmZGQwOThlLCAweDAyZjQwYmUyLCAweDAzMDZkMDQyLCAweDFmZGI0NmFlLCAweDFmZGFhZGVlLCAweDAzMGQxMTdjLCAweDAzMWZkNDc0LCAweDFmZDhkYzUxLCAKKwkweDFmZDgzZWE4LCAweDAzMjYxNTM0LCAweDAzMzhkNmI4LCAweDFmZDY1ZTRmLCAweDFmZDViYmJkLCAweDAzM2YxNmZiLCAweDAzNTFkNzAwLCAweDFmZDNjY2FhLCAKKwkweDFmZDMyNTMwLCAweDAzNTgxNmMxLCAweDAzNmFkNTNjLCAweDFmZDEyNzYzLCAweDFmZDA3YjAwLCAweDAzNzExNDc3LCAweDAzODNkMTVjLCAweDFmY2U2ZTdjLCAKKwkweDFmY2RiZDMxLCAweDAzOGExMDBlLCAweDAzOWNjYjUxLCAweDFmY2JhMWY1LCAweDFmY2FlYmMzLCAweDAzYTMwOTc1LCAweDAzYjVjMzBiLCAweDFmYzhjMWQyLCAKKwkweDFmYzgwNmI5LCAweDAzYmMwMDlmLCAweDAzY2ViODdjLCAweDFmYzVjZTE0LCAweDFmYzUwZTE0LCAweDAzZDRmNTdhLCAweDAzZTdhYjkzLCAweDFmYzJjNmJkLCAKKwkweDFmYzIwMWQ3LCAweDAzZWRlN2Y5LCAweDA0MDA5YzQyLCAweDFmYmZhYmNkLCAweDFmYmVlMjAyLCAweDA0MDZkODBiLCAweDA0MTk4YTc4LCAweDFmYmM3ZDQ5LCAKKwkweDFmYmJhZTk5LCAweDA0MWZjNWExLCAweDA0MzI3NjI4LCAweDFmYjkzYjMxLCAweDFmYjg2NzljLCAweDA0MzhiMGFjLCAweDA0NGI1ZjQwLCAweDFmYjVlNTg3LCAKKwkweDFmYjUwZDBlLCAweDA0NTE5OTFkLCAweDA0NjQ0NWIyLCAweDFmYjI3YzRlLCAweDFmYjE5ZWYxLCAweDA0NmE3ZWUzLCAweDA0N2QyOTZmLCAweDFmYWVmZjg3LCAKKwkweDFmYWUxZDQ3LCAweDA0ODM2MWYwLCAweDA0OTYwYTY3LCAweDFmYWI2ZjM1LCAweDFmYWE4ODEzLCAweDA0OWM0MjM1LCAweDA0YWVlODhiLCAweDFmYTdjYjVhLCAKKwkweDFmYTZkZjU2LCAweDA0YjUxZmExLCAweDA0YzdjM2NiLCAweDFmYTQxM2Y4LCAweDFmYTMyMzEzLCAweDA0Y2RmYTI2LCAweDA0ZTA5YzE4LCAweDFmYTA0OTEyLCAKKwkweDFmOWY1MzRjLCAweDA0ZTZkMWI0LCAweDA0Zjk3MTYzLCAweDFmOWM2YWE5LCAweDFmOWI3MDAzLCAweDA0ZmZhNjNjLCAweDA1MTI0MzlkLCAweDFmOTg3OGMxLCAKKwkweDFmOTc3OTNiLCAweDA1MTg3N2FmLCAweDA1MmIxMmI2LCAweDFmOTQ3MzViLCAweDFmOTM2ZWY2LCAweDA1MzE0NWZkLCAweDA1NDNkZTllLCAweDFmOTA1YTdhLCAKKwkweDFmOGY1MTM3LCAweDA1NGExMTE3LCAweDA1NWNhNzQ4LCAweDFmOGMyZTIxLCAweDFmOGIyMDAwLCAweDA1NjJkOGVlLCAweDA1NzU2Y2EyLCAweDFmODdlZTUyLCAKKwkweDFmODZkYjU1LCAweDA1N2I5ZDczLCAweDA1OGUyZTlmLCAweDFmODM5YjEwLCAweDFmODI4MzM2LCAweDA1OTQ1ZTk1LCAweDA1YTZlZDJlLCAweDFmN2YzNDVlLCAKKwkweDFmN2UxN2E4LCAweDA1YWQxYzQ3LCAweDA1YmZhODQwLCAweDFmN2FiYTNlLCAweDFmNzk5OGFkLCAweDA1YzVkNjc4LCAweDA1ZDg1ZmM3LCAweDFmNzYyY2IyLCAKKwkweDFmNzUwNjQ3LCAweDA1ZGU4ZDE5LCAweDA1ZjExM2IzLCAweDFmNzE4YmJmLCAweDFmNzA2MDdhLCAweDA1Zjc0MDFjLCAweDA2MDljM2Y1LCAweDFmNmNkNzY2LCAKKwkweDFmNmJhNzQ4LCAweDA2MGZlZjcxLCAweDA2MjI3MDdkLCAweDFmNjgwZmFiLCAweDFmNjZkYWI1LCAweDA2Mjg5YjA4LCAweDA2M2IxOTNjLCAweDFmNjMzNDkwLCAKKwkweDFmNjFmYWMzLCAweDA2NDE0MmQzLCAweDA2NTNiZTIzLCAweDFmNWU0NjE5LCAweDFmNWQwNzc1LCAweDA2NTllNmMyLCAweDA2NmM1ZjI0LCAweDFmNTk0NDQ4LCAKKwkweDFmNTgwMGNlLCAweDA2NzI4NmM2LCAweDA2ODRmYzJlLCAweDFmNTQyZjIxLCAweDFmNTJlNmQyLCAweDA2OGIyMmQwLCAweDA2OWQ5NTMyLCAweDFmNGYwNmE2LCAKKwkweDFmNGRiOTgzLCAweDA2YTNiYWQwLCAweDA2YjYyYTIyLCAweDFmNDljYWRjLCAweDFmNDg3OGU1LCAweDA2YmM0ZWI5LCAweDA2Y2ViYWVlLCAweDFmNDQ3YmM0LCAKKwkweDFmNDMyNGZiLCAweDA2ZDRkZTc5LCAweDA2ZTc0Nzg2LCAweDFmM2YxOTYzLCAweDFmM2RiZGM4LCAweDA2ZWQ2YTAzLCAweDA2ZmZjZmRkLCAweDFmMzlhM2JjLCAKKwkweDFmMzg0MzUwLCAweDA3MDVmMTQ3LCAweDA3MTg1M2UzLCAweDFmMzQxYWQyLCAweDFmMzJiNTk1LCAweDA3MWU3NDM2LCAweDA3MzBkMzg4LCAweDFmMmU3ZWE5LCAKKwkweDFmMmQxNDlkLCAweDA3MzZmMmMwLCAweDA3NDk0ZWJkLCAweDFmMjhjZjQzLCAweDFmMjc2MDY5LCAweDA3NGY2Y2Q3LCAweDA3NjFjNTc0LCAweDFmMjMwY2E1LCAKKwkweDFmMjE5OGZkLCAweDA3NjdlMjZjLCAweDA3N2EzNzlkLCAweDFmMWQzNmQyLCAweDFmMWJiZTVkLCAweDA3ODA1MzcwLCAweDA3OTJhNTJhLCAweDFmMTc0ZGNlLCAKKwkweDFmMTVkMDhkLCAweDA3OThiZmQzLCAweDA3YWIwZTBhLCAweDFmMTE1MTljLCAweDFmMGZjZjkxLCAweDA3YjEyNzg2LCAweDA3YzM3MjMwLCAweDFmMGI0MjQwLCAKKwkweDFmMDliYjZiLCAweDA3Yzk4YTdhLCAweDA3ZGJkMThjLCAweDFmMDUxZmJlLCAweDFmMDM5NDFmLCAweDA3ZTFlOGExLCAweDA3ZjQyYzBlLCAweDFlZmVlYTE5LCAKKwkweDFlZmQ1OWIzLCAweDA3ZmE0MWViLCAweDA4MGM4MWE5LCAweDFlZjhhMTU1LCAweDFlZjcwYzI4LCAweDA4MTI5NjRhLCAweDA4MjRkMjRkLCAweDFlZjI0NTc3LCAKKwkweDFlZjBhYjg0LCAweDA4MmFlNWFkLCAweDA4M2QxZGVhLCAweDFlZWJkNjgyLCAweDFlZWEzN2NhLCAweDA4NDMzMDA3LCAweDA4NTU2NDczLCAweDFlZTU1NDdhLCAKKwkweDFlZTNiMGZlLCAweDA4NWI3NTQ4LCAweDA4NmRhNWQ4LCAweDFlZGViZjY0LCAweDFlZGQxNzI0LCAweDA4NzNiNTYyLCAweDA4ODVlMjA5LCAweDFlZDgxNzQyLCAKKwkweDFlZDY2YTQxLCAweDA4OGJmMDQ0LCAweDA4OWUxOGY5LCAweDFlZDE1YzFhLCAweDFlY2ZhYTU3LCAweDA4YTQyNWUxLCAweDA4YjY0YTk4LCAweDFlY2E4ZGVmLCAKKwkweDFlYzhkNzZjLCAweDA4YmM1NjJhLCAweDA4Y2U3NmQ4LCAweDFlYzNhY2M2LCAweDFlYzFmMTg0LCAweDA4ZDQ4MTBmLCAweDA4ZTY5ZGE4LCAweDFlYmNiOGEzLCAKKwkweDFlYmFmOGEzLCAweDA4ZWNhNjgxLCAweDA4ZmViZWZiLCAweDFlYjViMThhLCAweDFlYjNlY2NkLCAweDA5MDRjNjczLCAweDA5MTZkYWMyLCAweDFlYWU5NzdmLCAKKwkweDFlYWNjZTA3LCAweDA5MWNlMGQ0LCAweDA5MmVmMGVkLCAweDFlYTc2YTg3LCAweDFlYTU5YzU1LCAweDA5MzRmNTk2LCAweDA5NDcwMTZlLCAweDFlYTAyYWE3LCAKKwkweDFlOWU1N2JiLCAweDA5NGQwNGFhLCAweDA5NWYwYzM2LCAweDFlOThkN2UyLCAweDFlOTcwMDNlLCAweDA5NjUwZTAxLCAweDA5NzcxMTM2LCAweDFlOTE3MjNlLCAKKwkweDFlOGY5NWUzLCAweDA5N2QxMThkLCAweDA5OGYxMDYwLCAweDFlODlmOWJmLCAweDFlODgxOGFkLCAweDA5OTUwZjNmLCAweDA5YTcwOWE0LCAweDFlODI2ZTY5LCAKKwkweDFlODA4OGEyLCAweDA5YWQwNzA3LCAweDA5YmVmY2Y0LCAweDFlN2FkMDQxLCAweDFlNzhlNWM3LCAweDA5YzRmOGQ4LCAweDA5ZDZlYTQwLCAweDFlNzMxZjRjLCAKKwkweDFlNzEzMDFmLCAweDA5ZGNlNGExLCAweDA5ZWVkMTdiLCAweDFlNmI1YjhmLCAweDFlNjk2N2IxLCAweDA5ZjRjYTU2LCAweDBhMDZiMjk2LCAweDFlNjM4NTBlLCAKKwkweDFlNjE4YzgwLCAweDBhMGNhOWU2LCAweDBhMWU4ZDgxLCAweDFlNWI5YmNlLCAweDFlNTk5ZTkxLCAweDBhMjQ4MzQzLCAweDBhMzY2MjJlLCAweDFlNTM5ZmQ0LCAKKwkweDFlNTE5ZGVhLCAweDBhM2M1NjVlLCAweDBhNGUzMDhmLCAweDFlNGI5MTI2LCAweDFlNDk4YThlLCAweDBhNTQyMzI5LCAweDBhNjVmODk0LCAweDFlNDM2ZmM3LCAKKwkweDFlNDE2NDg1LCAweDBhNmJlOTk1LCAweDBhN2RiYTJmLCAweDFlM2IzYmJkLCAweDFlMzkyYmQxLCAweDBhODNhOTkzLCAweDBhOTU3NTUxLCAweDFlMzJmNTBlLCAKKwkweDFlMzBlMDc5LCAweDBhOWI2MzE1LCAweDBhYWQyOWVjLCAweDFlMmE5YmJkLCAweDFlMjg4MjgxLCAweDBhYjMxNjBjLCAweDBhYzRkN2YxLCAweDFlMjIyZmQxLCAKKwkweDFlMjAxMWVlLCAweDBhY2FjMjZhLCAweDBhZGM3ZjUyLCAweDFlMTliMTRmLCAweDFlMTc4ZWM3LCAweDBhZTI2ODFmLCAweDBhZjQxZmZmLCAweDFlMTEyMDNiLCAKKwkweDFlMGVmOTEwLCAweDBhZmEwNzFkLCAweDBiMGJiOWViLCAweDFlMDg3YzliLCAweDFlMDY1MGNlLCAweDBiMTE5ZjU2LCAweDBiMjM0ZDA3LCAweDFkZmZjNjc0LCAKKwkweDFkZmQ5NjA2LCAweDBiMjkzMGJiLCAweDBiM2FkOTQzLCAweDFkZjZmZGNjLCAweDFkZjRjOGJmLCAweDBiNDBiYjNlLCAweDBiNTI1ZTkyLCAweDFkZWUyMmE5LCAKKwkweDFkZWJlOGZkLCAweDBiNTgzZWNmLCAweDBiNjlkY2U2LCAweDFkZTUzNTBmLCAweDFkZTJmNmM2LCAweDBiNmZiYjYyLCAweDBiODE1NDJmLCAweDFkZGMzNTA0LCAKKwkweDFkZDlmMjIwLCAweDBiODczMGU2LCAweDBiOThjNDVmLCAweDFkZDMyMjhlLCAweDFkZDBkYjEwLCAweDBiOWU5ZjRkLCAweDBiYjAyZDY4LCAweDFkYzlmZGIyLCAKKwkweDFkYzdiMTliLCAweDBiYjYwNjhhLCAweDBiYzc4ZjNiLCAweDFkYzBjNjc2LCAweDFkYmU3NWM4LCAweDBiY2Q2NjhlLCAweDBiZGVlOWNhLCAweDFkYjc3Y2RmLCAKKwkweDFkYjUyNzljLCAweDBiZTRiZjRhLCAweDBiZjYzZDA3LCAweDFkYWUyMGY0LCAweDFkYWJjNzFkLCAweDBiZmMxMGFmLCAweDBjMGQ4OGUyLCAweDFkYTRiMmJhLCAKKwkweDFkYTI1NDUwLCAweDBjMTM1YWIwLCAweDBjMjRjZDRlLCAweDFkOWIzMjM3LCAweDFkOThjZjNiLCAweDBjMmE5ZDNlLCAweDBjM2MwYTNkLCAweDFkOTE5ZjcwLCAKKwkweDFkOGYzN2U1LCAweDBjNDFkODRiLCAweDBjNTMzZmEwLCAweDFkODdmYTZkLCAweDFkODU4ZTUzLCAweDBjNTkwYmM5LCAweDBjNmE2ZDY4LCAweDFkN2U0MzMyLCAKKwkweDFkN2JkMjhiLCAweDBjNzAzN2E4LCAweDBjODE5Mzg4LCAweDFkNzQ3OWM1LCAweDFkNzIwNDkzLCAweDBjODc1YmRiLCAweDBjOThiMWYwLCAweDFkNmE5ZTJlLCAKKwkweDFkNjgyNDcyLCAweDBjOWU3ODU0LCAweDBjYWZjODk0LCAweDFkNjBiMDcwLCAweDFkNWUzMjJjLCAweDBjYjU4ZDA0LCAweDBjYzZkNzY0LCAweDFkNTZiMDk0LCAKKwkweDFkNTQyZGM5LCAweDBjY2M5OWRlLCAweDBjZGRkZTUzLCAweDFkNGM5ZTlmLCAweDFkNGExNzRmLCAweDBjZTM5ZWQyLCAweDBjZjRkZDUyLCAweDFkNDI3YTk3LCAKKwkweDFkM2ZlZWMzLCAweDBjZmE5YmQyLCAweDBkMGJkNDUyLCAweDFkMzg0NDgzLCAweDFkMzViNDJkLCAweDBkMTE5MGQxLCAweDBkMjJjMzQ3LCAweDFkMmRmYzY4LCAKKwkweDFkMmI2NzkxLCAweDBkMjg3ZGMxLCAweDBkMzlhYTIxLCAweDFkMjNhMjRlLCAweDFkMjEwOGY4LCAweDBkM2Y2MjkyLCAweDBkNTA4OGQzLCAweDFkMTkzNjNhLCAKKwkweDFkMTY5ODY3LCAweDBkNTYzZjM4LCAweDBkNjc1ZjRlLCAweDFkMGViODMzLCAweDFkMGMxNWU0LCAweDBkNmQxM2EzLCAweDBkN2UyZDg1LCAweDFkMDQyODNmLCAKKwkweDFkMDE4MTc2LCAweDBkODNkZmM2LCAweDBkOTRmMzY5LCAweDFjZjk4NjY2LCAweDFjZjZkYjI0LCAweDBkOWFhMzkzLCAweDBkYWJiMGVjLCAweDFjZWVkMmFkLCAKKwkweDFjZWMyMmY0LCAweDBkYjE1ZWZjLCAweDBkYzI2NjAwLCAweDFjZTQwZDFiLCAweDFjZTE1OGVkLCAweDBkYzgxMWYzLCAweDBkZDkxMjk4LCAweDFjZDkzNWI3LCAKKwkweDFjZDY3ZDE1LCAweDBkZGViYzY5LCAweDBkZWZiNmE1LCAweDFjY2U0Yzg3LCAweDFjY2I4Zjc0LCAweDBkZjU1ZTUxLCAweDBlMDY1MjE5LCAweDFjYzM1MTkyLCAKKwkweDFjYzA5MDBmLCAweDBlMGJmNzljLCAweDBlMWNlNGU2LCAweDFjYjg0NGRmLCAweDFjYjU3ZWVlLCAweDBlMjI4ODNlLCAweDBlMzM2ZWZmLCAweDFjYWQyNjc1LCAKKwkweDFjYWE1YzE3LCAweDBlMzkxMDI3LCAweDBlNDlmMDU1LCAweDFjYTFmNjViLCAweDFjOWYyNzkyLCAweDBlNGY4ZjRiLCAweDBlNjA2OGRiLCAweDFjOTZiNDk3LCAKKwkweDFjOTNlMTY1LCAweDBlNjYwNTlhLCAweDBlNzZkODgzLCAweDFjOGI2MTMxLCAweDFjODg4OTk3LCAweDBlN2M3MzA4LCAweDBlOGQzZjNlLCAweDFjN2ZmYzJmLCAKKwkweDFjN2QyMDJmLCAweDBlOTJkNzg3LCAweDBlYTM5ZDAwLCAweDFjNzQ4NTk5LCAweDFjNzFhNTM1LCAweDBlYTkzMzA4LCAweDBlYjlmMWJhLCAweDFjNjhmZDc1LCAKKwkweDFjNjYxOGFlLCAweDBlYmY4NTdkLCAweDBlZDAzZDVlLCAweDFjNWQ2M2NhLCAweDFjNWE3YWE0LCAweDBlZDVjZWRhLCAweDBlZTY3ZmRmLCAweDFjNTFiOGExLCAKKwkweDFjNGVjYjFjLCAweDBlZWMwZjEwLCAweDBlZmNiOTJmLCAweDFjNDVmYzAwLCAweDFjNDMwYTFkLCAweDBmMDI0NjEyLCAweDBmMTJlOTQxLCAweDFjM2EyZGVkLCAKKwkweDFjMzczN2IwLCAweDBmMTg3M2QyLCAweDBmMjkxMDA2LCAweDFjMmU0ZTcyLCAweDFjMmI1M2RiLCAweDBmMmU5ODQyLCAweDBmM2YyZDcxLCAweDFjMjI1ZDk0LCAKKwkweDFjMWY1ZWE2LCAweDBmNDRiMzU0LCAweDBmNTU0MTc1LCAweDFjMTY1YjViLCAweDFjMTM1ODE4LCAweDBmNWFjNGZjLCAweDBmNmI0YzAzLCAweDFjMGE0N2NmLCAKKwkweDFjMDc0MDM4LCAweDBmNzBjZDJhLCAweDBmODE0ZDBlLCAweDFiZmUyMmY4LCAweDFiZmIxNzBmLCAweDBmODZjYmQzLCAweDBmOTc0NDg5LCAweDFiZjFlY2RiLCAKKwkweDFiZWVkY2EyLCAweDBmOWNjMGU3LCAweDBmYWQzMjY1LCAweDFiZTVhNTgyLCAweDFiZTI5MGZiLCAweDBmYjJhYzVhLCAweDBmYzMxNjk3LCAweDFiZDk0Y2Y0LCAKKwkweDFiZDYzNDIxLCAweDBmYzg4ZTFlLCAweDBmZDhmMTBmLCAweDFiY2NlMzM3LCAweDFiYzljNjFhLCAweDBmZGU2NjI2LCAweDBmZWVjMWMwLCAweDFiYzA2ODU1LCAKKwkweDFiYmQ0NmYwLCAweDBmZjQzNDY0LCAweDEwMDQ4ODllLCAweDFiYjNkYzU1LCAweDFiYjBiNmE5LCAweDEwMDlmOGNiLCAweDEwMWE0NTlhLCAweDFiYTczZjNkLCAKKwkweDFiYTQxNTRkLCAweDEwMWZiMzRkLCAweDEwMmZmOGE4LCAweDFiOWE5MTE3LCAweDFiOTc2MmU0LCAweDEwMzU2M2RjLCAweDEwNDVhMWI5LCAweDFiOGRkMWVhLCAKKwkweDFiOGE5Zjc3LCAweDEwNGIwYTZjLCAweDEwNWI0MGMxLCAweDFiODEwMWJlLCAweDFiN2RjYjBjLCAweDEwNjBhNmVmLCAweDEwNzBkNWIxLCAweDFiNzQyMDliLCAKKwkweDFiNzBlNWFjLCAweDEwNzYzOTU4LCAweDEwODY2MDdlLCAweDFiNjcyZTg4LCAweDFiNjNlZjVmLCAweDEwOGJjMTlhLCAweDEwOWJlMTE5LCAweDFiNWEyYjhlLCAKKwkweDFiNTZlODJjLCAweDEwYTEzZmE2LCAweDEwYjE1Nzc1LCAweDFiNGQxN2I0LCAweDFiNDlkMDFjLCAweDEwYjZiMzcxLCAweDEwYzZjMzg1LCAweDFiM2ZmMzA0LCAKKwkweDFiM2NhNzM3LCAweDEwY2MxY2VjLCAweDEwZGMyNTNjLCAweDFiMzJiZDg0LCAweDFiMmY2ZDg1LCAweDEwZTE3YzBiLCAweDEwZjE3YzhkLCAweDFiMjU3NzNkLCAKKwkweDFiMjIyMzBlLCAweDEwZjZkMGMwLCAweDExMDZjOTZhLCAweDFiMTgyMDM4LCAweDFiMTRjN2RhLCAweDExMGMxYWZlLCAweDExMWMwYmM2LCAweDFiMGFiODdjLCAKKwkweDFiMDc1YmYxLCAweDExMjE1YWI4LCAweDExMzE0Mzk1LCAweDFhZmQ0MDEyLCAweDFhZjlkZjVkLCAweDExMzY4ZmUxLCAweDExNDY3MGM4LCAweDFhZWZiNzAyLCAKKwkweDFhZWM1MjI1LCAweDExNGJiYTZiLCAweDExNWI5MzU0LCAweDFhZTIxZDU0LCAweDFhZGViNDUxLCAweDExNjBkYTRiLCAweDExNzBhYjJhLCAweDFhZDQ3MzExLCAKKwkweDFhZDEwNWU5LCAweDExNzVlZjcyLCAweDExODViODNmLCAweDFhYzZiODQxLCAweDFhYzM0NmY4LCAweDExOGFmOWQ0LCAweDExOWFiYTg0LCAweDFhYjhlY2VjLCAKKwkweDFhYjU3Nzg0LCAweDExOWZmOTY0LCAweDExYWZiMWVlLCAweDFhYWIxMTFjLCAweDFhYTc5Nzk2LCAweDExYjRlZTE0LCAweDExYzQ5ZTZmLCAweDFhOWQyNGQ5LCAKKwkweDFhOTlhNzM3LCAweDExYzlkN2Q5LCAweDExZDk3ZmY5LCAweDFhOGYyODJiLCAweDFhOGJhNjcwLCAweDExZGViNmE0LCAweDExZWU1NjgyLCAweDFhODExYjFiLCAKKwkweDFhN2Q5NTQ5LCAweDExZjM4YTZhLCAweDEyMDMyMWZhLCAweDFhNzJmZGIyLCAweDFhNmY3M2NhLCAweDEyMDg1MzFjLCAweDEyMTdlMjU2LCAweDFhNjRjZmY4LCAKKwkweDFhNjE0MWZkLCAweDEyMWQxMGFmLCAweDEyMmM5Nzg5LCAweDFhNTY5MWY1LCAweDFhNTJmZmViLCAweDEyMzFjMzE2LCAweDEyNDE0MTg2LCAweDFhNDg0M2I0LCAKKwkweDFhNDRhZDliLCAweDEyNDY2YTQ0LCAweDEyNTVlMDQxLCAweDFhMzllNTNkLCAweDFhMzY0YjE3LCAweDEyNWIwNjJiLCAweDEyNmE3M2FjLCAweDFhMmI3Njk4LCAKKwkweDFhMjdkODY4LCAweDEyNmY5NmMxLCAweDEyN2VmYmJiLCAweDFhMWNmN2NlLCAweDFhMTk1NTk3LCAweDEyODQxYmY2LCAweDEyOTM3ODYxLCAweDFhMGU2OGU5LCAKKwkweDFhMGFjMmFjLCAweDEyOTg5NWMwLCAweDEyYTdlOTkxLCAweDE5ZmZjOWYxLCAweDE5ZmMxZmIxLCAweDEyYWQwNDEyLCAweDEyYmM0ZjQwLCAweDE5ZjExYWYwLCAKKwkweDE5ZWQ2Y2FmLCAweDEyYzE2NmRlLCAweDEyZDBhOTYwLCAweDE5ZTI1YmVlLCAweDE5ZGVhOWFlLCAweDEyZDViZTE4LCAweDEyZTRmN2U1LCAweDE5ZDM4Y2Y0LCAKKwkweDE5Y2ZkNmI4LCAweDEyZWEwOWI0LCAweDEyZjkzYWMyLCAweDE5YzRhZTBjLCAweDE5YzBmM2Q2LCAweDEyZmU0OWE2LCAweDEzMGQ3MWViLCAweDE5YjViZjNmLCAKKwkweDE5YjIwMTExLCAweDEzMTI3ZGUwLCAweDEzMjE5ZDUzLCAweDE5YTZjMDk2LCAweDE5YTJmZTczLCAweDEzMjZhNjU2LCAweDEzMzViY2VmLCAweDE5OTdiMjFiLCAKKwkweDE5OTNlYzA0LCAweDEzM2FjMmZjLCAweDEzNDlkMGIwLCAweDE5ODg5M2Q2LCAweDE5ODRjOWNlLCAweDEzNGVkM2M1LCAweDEzNWRkODhjLCAweDE5Nzk2NWQwLCAKKwkweDE5NzU5N2RhLCAweDEzNjJkOGE2LCAweDEzNzFkNDc2LCAweDE5NmEyODE1LCAweDE5NjY1NjMyLCAweDEzNzZkMTkxLCAweDEzODVjNDYxLCAweDE5NWFkYWFiLCAKKwkweDE5NTcwNGRmLCAweDEzOGFiZTdiLCAweDEzOTlhODQxLCAweDE5NGI3ZDllLCAweDE5NDdhM2ViLCAweDEzOWU5ZjU2LCAweDEzYWQ4MDBhLCAweDE5M2MxMGY3LCAKKwkweDE5MzgzMzVlLCAweDEzYjI3NDE3LCAweDEzYzE0YmIwLCAweDE5MmM5NGJmLCAweDE5MjhiMzQzLCAweDEzYzYzY2IyLCAweDEzZDUwYjI2LCAweDE5MWQwOGZmLCAKKwkweDE5MTkyM2EzLCAweDEzZDlmOTFiLCAweDEzZThiZTYwLCAweDE5MGQ2ZGMxLCAweDE5MDk4NDg4LCAweDEzZWRhOTQ0LCAweDEzZmM2NTUzLCAweDE4ZmRjMzEwLCAKKwkweDE4ZjlkNWZhLCAweDE0MDE0ZDIzLCAweDE0MGZmZmYxLCAweDE4ZWUwOGY0LCAweDE4ZWExODA1LCAweDE0MTRlNGFhLCAweDE0MjM4ZTJmLCAweDE4ZGUzZjc3LCAKKwkweDE4ZGE0YWIyLCAweDE0Mjg2ZmNlLCAweDE0MzcxMDAxLCAweDE4Y2U2NmEzLCAweDE4Y2E2ZTBhLCAweDE0M2JlZTgzLCAweDE0NGE4NTViLCAweDE4YmU3ZTgyLCAKKwkweDE4YmE4MjE3LCAweDE0NGY2MGJkLCAweDE0NWRlZTMwLCAweDE4YWU4NzFlLCAweDE4YWE4NmUzLCAweDE0NjJjNjcwLCAweDE0NzE0YTc2LCAweDE4OWU4MDgwLCAKKwkweDE4OWE3Yzc4LCAweDE0NzYxZjhmLCAweDE0ODQ5YTFmLCAweDE4OGU2YWIyLCAweDE4OGE2MmUwLCAweDE0ODk2YzBmLCAweDE0OTdkZDIwLCAweDE4N2U0NWJlLCAKKwkweDE4N2EzYTI1LCAweDE0OWNhYmU0LCAweDE0YWIxMzZkLCAweDE4NmUxMWFmLCAweDE4NmEwMjUwLCAweDE0YWZkZjAzLCAweDE0YmUzY2ZhLCAweDE4NWRjZThlLCAKKwkweDE4NTliYjZjLCAweDE0YzMwNTVlLCAweDE0ZDE1OWJjLCAweDE4NGQ3YzY1LCAweDE4NDk2NTgzLCAweDE0ZDYxZWViLCAweDE0ZTQ2OWE2LCAweDE4M2QxYjNlLCAKKwkweDE4MzkwMDllLCAweDE0ZTkyYjllLCAweDE0Zjc2Y2FkLCAweDE4MmNhYjI0LCAweDE4Mjg4Y2M4LCAweDE0ZmMyYjZhLCAweDE1MGE2MmM2LCAweDE4MWMyYzIwLCAKKwkweDE4MTgwYTBjLCAweDE1MGYxZTQ1LCAweDE1MWQ0YmUzLCAweDE4MGI5ZTNkLCAweDE4MDc3ODczLCAweDE1MjIwNDIyLCAweDE1MzAyN2ZiLCAweDE3ZmIwMTg1LCAKKwkweDE3ZjZkODA3LCAweDE1MzRkY2Y2LCAweDE1NDJmNzAwLCAweDE3ZWE1NjAyLCAweDE3ZTYyOGQzLCAweDE1NDdhOGI1LCAweDE1NTViOGU4LCAweDE3ZDk5YmJlLCAKKwkweDE3ZDU2YWUwLCAweDE1NWE2NzU0LCAweDE1Njg2ZGE3LCAweDE3YzhkMmM0LCAweDE3YzQ5ZTNiLCAweDE1NmQxOGM3LCAweDE1N2IxNTMyLCAweDE3YjdmYjFmLCAKKwkweDE3YjNjMmVjLCAweDE1N2ZiZDAzLCAweDE1OGRhZjdjLCAweDE3YTcxNGQ3LCAweDE3YTJkOGZlLCAweDE1OTI1M2ZiLCAweDE1YTAzYzdhLCAweDE3OTYxZmY5LCAKKwkweDE3OTFlMDdiLCAweDE1YTRkZGE1LCAweDE1YjJiYzIyLCAweDE3ODUxYzhlLCAweDE3ODBkOTZmLCAweDE1Yjc1OWY1LCAweDE1YzUyZTY3LCAweDE3NzQwYWExLCAKKwkweDE3NmZjM2UzLCAweDE1YzljOGUwLCAweDE1ZDc5MzNmLCAweDE3NjJlYTNkLCAweDE3NWU5ZmUyLCAweDE1ZGMyYTVhLCAweDE1ZTllYTlkLCAweDE3NTFiYjZiLCAKKwkweDE3NGQ2ZDc3LCAweDE1ZWU3ZTU4LCAweDE1ZmMzNDc3LCAweDE3NDA3ZTM3LCAweDE3M2MyY2FjLCAweDE2MDBjNGNmLCAweDE2MGU3MGMxLCAweDE3MmYzMmFiLCAKKwkweDE3MmFkZDhjLCAweDE2MTJmZGIzLCAweDE2MjA5ZjcwLCAweDE3MWRkOGQyLCAweDE3MTk4MDIxLCAweDE2MjUyOGZhLCAweDE2MzJjMDc4LCAweDE3MGM3MGI3LCAKKwkweDE3MDgxNDc3LCAweDE2Mzc0Njk3LCAweDE2NDRkM2QwLCAweDE2ZmFmYTY0LCAweDE2ZjY5YTk3LCAweDE2NDk1NjgwLCAweDE2NTZkOTZhLCAweDE2ZTk3NWU0LCAKKwkweDE2ZTUxMjhlLCAweDE2NWI1OGFhLCAweDE2NjhkMTNlLCAweDE2ZDdlMzQxLCAweDE2ZDM3YzY1LCAweDE2NmQ0ZDBhLCAweDE2N2FiYjNlLCAweDE2YzY0Mjg4LCAKIAkweDE2YzFkODI3LCAweDE2N2YzMzk0LCAweDE2OGM5NzYwLCAweDE2YjQ5M2MyLCAweDE2YjAyNWUwLCAweDE2OTEwYzNkLCAweDE2OWU2NTlhLCAweDE2YTJkNmZiCiB9OwogCiBjb25zdCBpbnQgdHdpZFRhYjUxMls4KjYgKyAzMio2ICsgMTI4KjZdID0gewotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIAorCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIAogCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LAotCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsCi0JMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsCi0JMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LAotCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIDB4ZTBmNTgxMDQsIDB4ZjgzOTgxYTEsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLAotCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTQ4ZDdjYmIsIDB4ZWY4Yzc4NjcsIDB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZWE4Mjk2Y2IsIDB4ZTg0YTIwZGUsCi0JMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLAotCTB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZjI1MTc3ZmIsIDB4ZTMxMjg1MGMsIDB4ZjZiNWZjZTksIDB4ZTE2MGJlYTksIDB4ZmI0ZGZiZTQsIDB4ZTA1OGFhODEsCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgCisJMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYjcyODM0NSwgMHgxMDczODc5OSwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgCisJMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgCisJMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgCisJMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwgCisJMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgCisJMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgMHhlMGY1ODEwNCwgMHhmODM5ODFhMSwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgCisJMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlNDhkN2NiYiwgMHhlZjhjNzg2NywgMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlYTgyOTZjYiwgMHhlODRhMjBkZSwgCisJMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwgCisJMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgCisJMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhmMjUxNzdmYiwgMHhlMzEyODUwYywgMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOSwgMHhmYjRkZmJlNCwgMHhlMDU4YWE4MSwgCiAKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZTljZGFkLCAweDAyNWFhNDEyLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmZjYyMTcsIDB4MDA2NDg3NDgsIDB4MWZmZDg4NjEsIDB4MDBjOTBhYjAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZhNzJmMCwgMHgwMTJkODY1NywgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwgMHgxZmNlMTVmZCwgMHgwMzg2ZjBiOSwKLQkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLAotCTB4MWZmNjIxZTMsIDB4MDE5MWY2NWYsIDB4MWZmMDk1NjYsIDB4MDFmNjU2ZTgsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZlMWNhZmQsIDB4MDJiZWRhMDEsCi0JMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjc1OTlhNCwgMHgwNWRiNzY3OCwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZWYxNzhhNCwgMHgwODI3ZGMwNywKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLAotCTB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksIDB4MWZjMjY0NzEsIDB4MDNlYWM5Y2IsIDB4MWZiNTc5NzIsIDB4MDQ0ZTdjMzQsCi0JMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTQyNmE0YiwgMHgwYTY4ZjEyMSwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwgMHgxZDY5NjE3NCwgMHgwYzliOTUzMiwKLQkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LAotCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY5N2Y5MjUsIDB4MDUxNTVkYWMsIDB4MWY4NzY0ZmEsIDB4MDU3ODg1MTEsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsCi0JMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzY3OGIzNSwgMHgwZWJjYmJhZSwgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjNlNGQzZiwgMHgxMGM5NzA0ZCwKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLAotCTB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWY0ZTYwM2IsIDB4MDZhMGE4MDksIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWYyMjUyZjcsIDB4MDc2NGQzZjksCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWVmNDNlZiwgMHgxMmJlZGIyNiwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwgMHgxODdjNDAxMCwgMHgxNDlhNDQ5YywKLQkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiMDkwYTU4LCAweDExMWViMzU0LAotCTB4MWYwYTdlZmMsIDB4MDdjNjdlNWYsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsIDB4MWVkNzQwZTcsIDB4MDg4OGU5MzEsIDB4MWViYmQ4YzksIDB4MDhlOWEyMjAsCi0JMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNmU3NDQ1NSwgMHgxNjU5MTkyNiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTMyODI5MywgMHgxN2Y4ZWNlMywKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LAotCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU4MTdiYWIsIDB4MDlhYTA4NjEsIDB4MWU2Mjg4ZWMsIDB4MGEwOWFlNGEsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsCi0JMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzYwNThiMSwgMHgxOTc3N2VmNSwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwgMHgxMTczNGQ2NCwgMHgxYWQyYmM5ZSwKLQkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3MmQwODM4LCAweDE2MTBiNzU1LAotCTB4MWUyMTIxMDUsIDB4MGFjN2NkM2IsIDB4MWRmZWFlNjIsIDB4MGIyNjNlZWYsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWRiNjUyNjIsIDB4MGJlMWQ0OTksCi0JMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjZlMGNhOSwgMHgxYzA4YzQyNiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZDUzNjQxNiwgMHgxZDE3ZTc3NCwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsIDB4MWQ0MTM0ZDEsIDB4MGNmN2JjYTIsIDB4MWQxN2U3NzQsIDB4MGQ1MzY0MTYsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjI2M2VlZiwgMHgxZGZlYWU2MiwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywgMHgwOGU5YTIyMCwgMHgxZWJiZDhjOSwKLQkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLAotCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWNjMWYwZjQsIDB4MGUwOTI0ZWMsIDB4MWM5NTRiMjEsIDB4MGU2MzM3NGQsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsCi0JMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNmEwYTgwOSwgMHgxZjRlNjAzYiwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNDRlN2MzNCwgMHgxZmI1Nzk3MiwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLAotCTB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWMwOGM0MjYsIDB4MGY2ZTBjYTksIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWJhNWFhNjcsIDB4MTAxY2ZjODcsCi0JMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMWY2NTZlOCwgMHgxZmYwOTU2NiwgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwgMHhmZjliNzhiOCwgMHgxZmZmNjIxNywKLQkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLAotCTB4MWI3MjgzNDUsIDB4MTA3Mzg3OTksIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsIDB4MWIwOTBhNTgsIDB4MTExZWIzNTQsIDB4MWFkMmJjOWUsIDB4MTE3MzRkNjQsCi0JMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZDQxMjVmZiwgMHgxZmUxY2FmZCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYWVhYTI1NCwgMHgxZjk3ZjkyNSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MWE2MzA5MWIsIDB4MTIxYTc5OTksIDB4MWEyOWE3YTAsIDB4MTI2ZDA1NGQsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsCi0JMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmODliMmMwNywgMHgxZjIyNTJmNywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywgMHhmNjU1Zjc5ZiwgMHgxZTgxN2JhYiwKLQkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3MDJlMDliLCAweDFmMzhmM2FjLAotCTB4MTliM2UwNDgsIDB4MTMwZmY3ZmQsIDB4MTk3NzdlZjUsIDB4MTM2MDU4YjEsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MThmYmNjYTQsIDB4MTNmZWQ5NTMsCi0JMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDFlMmI2NywgMHgxZGI2NTI2MiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMWY2ZGIxNCwgMHgxY2MxZjBmNCwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLAotCTB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsIDB4MTgzYjBlMGMsIDB4MTRlNmNhYmMsIDB4MTdmOGVjZTMsIDB4MTUzMjgyOTMsCi0JMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZmUzMDM3OSwgMHgxYmE1YWE2NywgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwgMHhlZGU1ODY2NywgMHgxYTYzMDkxYiwKLQkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLAotCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTc3MWU3NWYsIDB4MTVjNzdiYmUsIDB4MTcyZDA4MzgsIDB4MTYxMGI3NTUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsCi0JMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzAxMjZhZCwgMHgxOGZiY2NhNCwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTM4ODQ0MiwgMHgxNzcxZTc1ZiwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGZmMzZmNTUwLCAweDFmZmQ4ODYxLCAweGZlNmUwOWExLCAweDFmZjYyMWUzLCAweGZkYTU1YmVlLCAweDFmZTljZGFkLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTY1OTE5MjYsIDB4MTZlNzQ0NTUsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTVjNzdiYmUsIDB4MTc3MWU3NWYsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlODhlMThhMSwgMHgxNWM3N2JiZSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywgMHhlNzA0MzM1YywgMHgxM2ZlZDk1MywKLQkweGZjZGQwYjI4LCAweDFmZDg4ZGE0LCAweGZjMTUzNjM1LCAweDFmYzI2NDcxLCAweGZiNGRmYmU0LCAweDFmYTc1NTdmLCAweGZhODc3YWVmLCAweDFmODc2NGZhLAotCTB4MTU3ZDY5MzUsIDB4MTdiNWRmMjIsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsIDB4MTRlNmNhYmMsIDB4MTgzYjBlMGMsIDB4MTQ5YTQ0OWMsIDB4MTg3YzQwMTAsCi0JMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNTljZjZlNSwgMHgxMjFhNzk5OSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDVhNTU5OSwgMHgxMDFjZmM4NywKLQkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY4ZmQxZjY1LCAweDFmMzhmM2FjLCAweGY4Mzk4MWExLCAweDFmMGE3ZWZjLCAweGY3NzcxNmNmLCAweDFlZDc0MGU3LAotCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTNmZWQ5NTMsIDB4MThmYmNjYTQsIDB4MTNhZmZhMjksIDB4MTkzYTIyNGEsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsCi0JMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzNlMGYwYywgMHgwZTA5MjRlYywgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwgMHhlMjQ5YWQ5ZSwgMHgwYmUxZDQ5OSwKLQkweGY2YjVmY2U5LCAweDFlOWY0MTU3LCAweGY1ZjY1MWI2LCAweDFlNjI4OGVjLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGY0N2JiZDY4LCAweDFkZGIxM2I3LAotCTB4MTMwZmY3ZmQsIDB4MTliM2UwNDgsIDB4MTJiZWRiMjYsIDB4MTllZjQzZWYsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTIxYTc5OTksIDB4MWE2MzA5MWIsCi0JMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTdlODQ1NSwgMHgwOWFhMDg2MSwgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGRkYWQwOSwgMHgwNzY0ZDNmOSwKLQkweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGYzMDg0MzVlLCAweDFkNDEzNGQxLCAweGYyNTE3N2ZiLCAweDFjZWQ3YWY0LCAweGYxOWNjOGIzLCAweDFjOTU0YjIxLAotCTB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsIDB4MTExZWIzNTQsIDB4MWIwOTBhNTgsIDB4MTBjOTcwNGQsIDB4MWIzZTRkM2YsCi0JMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDY4MDZkYiwgMHgwNTE1NWRhYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwgMHhlMDFlMzUwMywgMHgwMmJlZGEwMSwKLQkweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGYwM2EyZDkyLCAweDFiZDdjMGFjLCAweGVmOGM3ODY3LCAweDFiNzI4MzQ1LCAweGVlZTE0Y2FjLCAweDFiMDkwYTU4LAotCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MTAxY2ZjODcsIDB4MWJhNWFhNjcsIDB4MGZjNWQyNmUsIDB4MWJkN2MwYWMsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsCi0JMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAwOWRlOSwgMHgwMDY0ODc0OCwgMHhlMDAyNzc5ZiwgMHhmZjM2ZjU1MCwgMHhlMDBmNmE5YSwgMHhmZTA5YTkxOCwKLQkweGVlMzhjNGM2LCAweDFhOWI2NjI5LCAweGVkOTJmYWIzLCAweDFhMjlhN2EwLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LCAweGVjNTAwNWQ3LCAweDE5M2EyMjRhLAotCTB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsIDB4MGViY2JiYWUsIDB4MWM2NzhiMzUsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGUwOTI0ZWMsIDB4MWNjMWYwZjQsCi0JMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgMHhlMDRhODY4ZSwgMHhmYmIxODNjYywgMHhlMDc4OWIwNiwgMHhmYTg3N2FlZiwgMHhlMGIxOWZjNSwgMHhmOTVmNTdmNywKLQkweGViYjMwY2RiLCAweDE4YmM4MDZiLCAweGViMTkzNTQ0LCAweDE4M2IwZTBjLCAweGVhODI5NmNiLCAweDE3YjVkZjIyLCAweGU5ZWY0OGFiLCAweDE3MmQwODM4LAotCTB4MGRhZTg4MDUsIDB4MWNlZDdhZjQsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsIDB4MGNmN2JjYTIsIDB4MWQ0MTM0ZDEsIDB4MGM5Yjk1MzIsIDB4MWQ2OTYxNzQsCi0JMHhlMGY1ODEwNCwgMHhmODM5ODFhMSwgMHhlMTQ0MjczNywgMHhmNzE2NWRlMCwgMHhlMTlkNzcxNCwgMHhmNWY2NTFiNiwgMHhlMjAxNTE5ZSwgMHhmNGQ5YzExMSwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU4ZDJmN2M4LCAweDE2MTBiNzU1LCAweGU4NGEyMGRlLCAweDE1N2Q2OTM1LCAweGU3YzRmMWY0LCAweDE0ZTZjYWJjLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGJlMWQ0OTksIDB4MWRiNjUyNjIsIDB4MGI4NDQyOTgsIDB4MWRkYjEzYjcsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsCi0JMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlMmU4MTg4YywgMHhmMmFjOWJlYSwgMHhlMzZhYjRkZiwgMHhmMTljYzhiMywgMHhlM2Y3M2JkYSwgMHhmMDkxZjM1NywKLQkweGU3NDM3Zjk1LCAweDE0NGNmMzI1LCAweGU2YzVkZGI2LCAweDEzYWZmYTI5LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGU1ZDY1ODYwLCAweDEyNmQwNTRkLAotCTB4MGFjN2NkM2IsIDB4MWUyMTIxMDUsIDB4MGE2OGYxMjEsIDB4MWU0MjZhNGIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDlhYTA4NjEsIDB4MWU4MTdiYWIsCi0JMHhlNDhkN2NiYiwgMHhlZjhjNzg2NywgMHhlNTJkNDM2MiwgMHhlZThjYjI5YywgMHhlNWQ2NTg2MCwgMHhlZDkyZmFiMywgMHhlNjg4ODEwYiwgMHhlYzlmYTc0ZiwKLQkweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGU0ZjZmNWE4LCAweDExMWViMzU0LCAweGU0OGQ3Y2JiLCAweDEwNzM4Nzk5LCAweGU0MjgzZjU0LCAweDBmYzVkMjZlLAotCTB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksIDB4MDg4OGU5MzEsIDB4MWVkNzQwZTcsIDB4MDgyN2RjMDcsIDB4MWVmMTc4YTQsCi0JMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlODA3MTMxZCwgMHhlYWNkN2Q2ZCwgMHhlOGQyZjdjOCwgMHhlOWVmNDhhYiwgMHhlOWE2ZTZkYSwgMHhlOTE4YmJhYiwKLQkweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUzNmFiNGRmLCAweDBlNjMzNzRkLCAweGUzMTI4NTBjLCAweDBkYWU4ODA1LCAweGUyYmVjYjJmLCAweDBjZjdiY2EyLAotCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDc2NGQzZjksIDB4MWYyMjUyZjcsIDB4MDcwMmUwOWIsIDB4MWYzOGYzYWMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsCi0JMHhlYTgyOTZjYiwgMHhlODRhMjBkZSwgMHhlYjY1YmI2NCwgMHhlNzgzYmZmMCwgMHhlYzUwMDVkNywgMHhlNmM1ZGRiNiwgMHhlZDQxMjRkYSwgMHhlNjEwYmMxMSwKLQkweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUyMjRlYzQ5LCAweDBiODQ0Mjk4LCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLCAweGUxOWQ3NzE0LCAweDBhMDlhZTRhLAotCTB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDVkYjc2NzgsIDB4MWY3NTk5YTQsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDUxNTVkYWMsIDB4MWY5N2Y5MjUsCi0JMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhlZjM2OGZiMywgMHhlNGMxYjJjMSwgMHhmMDNhMmQ5MiwgMHhlNDI4M2Y1NCwgMHhmMTQzNDQ1MiwgMHhlMzk4NzRjYiwKLQkweGUxNjBiZWE5LCAweDA5NGEwMzE3LCAweGUxMjhiZjE5LCAweDA4ODhlOTMxLCAweGUwZjU4MTA0LCAweDA3YzY3ZTVmLCAweGUwYzcwYzU0LCAweDA3MDJlMDliLAotCTB4MDRiMjA0MWMsIDB4MWZhNzU1N2YsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsIDB4MDNlYWM5Y2IsIDB4MWZjMjY0NzEsIDB4MDM4NmYwYjksIDB4MWZjZTE1ZmQsCi0JMHhmMjUxNzdmYiwgMHhlMzEyODUwYywgMHhmMzY0NmFjZSwgMHhlMjk2OWU4YywgMHhmNDdiYmQ2OCwgMHhlMjI0ZWM0OSwgMHhmNTk3MGVkZiwgMHhlMWJkOTViNSwKLQkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwNzg5YjA2LCAweDA1Nzg4NTExLCAweGUwNThhYTgxLCAweDA0YjIwNDFjLCAweGUwM2Q5YjhmLCAweDAzZWFjOWNiLAotCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDJiZWRhMDEsIDB4MWZlMWNhZmQsIDB4MDI1YWE0MTIsIDB4MWZlOWNkYWQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsCi0JMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOSwgMHhmN2Q4MjNmOSwgMHhlMTBlODc1YywgMHhmOGZkMWY2NSwgMHhlMGM3MGM1NCwgMHhmYTI0ODk4OCwgMHhlMDhhNjY1YywKLQkweGUwMjc3MjVjLCAweDAzMjJmNGQ4LCAweGUwMTYzMjUzLCAweDAyNWFhNDEyLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMDI3NzlmLCAweDAwYzkwYWIwLAotCTB4MDE5MWY2NWYsIDB4MWZmNjIxZTMsIDB4MDEyZDg2NTcsIDB4MWZmYTcyZjAsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4MDA2NDg3NDgsIDB4MWZmZjYyMTcsCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZkODg2MSwgMHgwMGM5MGFiMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZmNjIxNywgMHgwMDY0ODc0OCwgMHgxZmZkODg2MSwgMHgwMGM5MGFiMCwgMHgxZmZhNzJmMCwgMHgwMTJkODY1NywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZhNzJmMCwgMHgwMTJkODY1NywgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwgMHgxZmNlMTVmZCwgMHgwMzg2ZjBiOSwgCisJMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmMyNjQ3MSwgMHgwM2VhYzljYiwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjg3NjRmYSwgMHgwNTc4ODUxMSwgCisJMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmYwOTU2NiwgMHgwMWY2NTZlOCwgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwgMHgxZmUxY2FmZCwgMHgwMmJlZGEwMSwgCisJMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjc1OTlhNCwgMHgwNWRiNzY3OCwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZWYxNzhhNCwgMHgwODI3ZGMwNywgCisJMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZWQ3NDBlNywgMHgwODg4ZTkzMSwgCisJMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmNlMTVmZCwgMHgwMzg2ZjBiOSwgMHgxZmMyNjQ3MSwgMHgwM2VhYzljYiwgMHgxZmI1Nzk3MiwgMHgwNDRlN2MzNCwgCisJMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTQyNmE0YiwgMHgwYTY4ZjEyMSwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwgMHgxZDY5NjE3NCwgMHgwYzliOTUzMiwgCisJMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTYyODhlYywgMHgwYTA5YWU0YSwgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwgCisJMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjk3ZjkyNSwgMHgwNTE1NWRhYywgMHgxZjg3NjRmYSwgMHgwNTc4ODUxMSwgMHgxZjc1OTlhNCwgMHgwNWRiNzY3OCwgCisJMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzY3OGIzNSwgMHgwZWJjYmJhZSwgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjNlNGQzZiwgMHgxMGM5NzA0ZCwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxZDQxMzRkMSwgMHgwY2Y3YmNhMiwgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzk1NGIyMSwgMHgwZTYzMzc0ZCwgCisJMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjRlNjAzYiwgMHgwNmEwYTgwOSwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZjIyNTJmNywgMHgwNzY0ZDNmOSwgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWVmNDNlZiwgMHgxMmJlZGIyNiwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwgMHgxODdjNDAxMCwgMHgxNDlhNDQ5YywgCisJMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjcyODM0NSwgMHgxMDczODc5OSwgMHgxYjA5MGE1OCwgMHgxMTFlYjM1NCwgCisJMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZWYxNzhhNCwgMHgwODI3ZGMwNywgMHgxZWQ3NDBlNywgMHgwODg4ZTkzMSwgMHgxZWJiZDhjOSwgMHgwOGU5YTIyMCwgCisJMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNmU3NDQ1NSwgMHgxNjU5MTkyNiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTMyODI5MywgMHgxN2Y4ZWNlMywgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxYTI5YTdhMCwgMHgxMjZkMDU0ZCwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwgCisJMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTgxN2JhYiwgMHgwOWFhMDg2MSwgMHgxZTYyODhlYywgMHgwYTA5YWU0YSwgMHgxZTQyNmE0YiwgMHgwYTY4ZjEyMSwgCisJMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzYwNThiMSwgMHgxOTc3N2VmNSwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwgMHgxMTczNGQ2NCwgMHgxYWQyYmM5ZSwgCisJMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxODNiMGUwYywgMHgxNGU2Y2FiYywgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNzJkMDgzOCwgMHgxNjEwYjc1NSwgCisJMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgMHgxZGZlYWU2MiwgMHgwYjI2M2VlZiwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwgMHgxZGI2NTI2MiwgMHgwYmUxZDQ5OSwgCisJMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjZlMGNhOSwgMHgxYzA4YzQyNiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZDUzNjQxNiwgMHgxZDE3ZTc3NCwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNGU2Y2FiYywgMHgxODNiMGUwYywgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxZDY5NjE3NCwgMHgwYzliOTUzMiwgMHgxZDQxMzRkMSwgMHgwY2Y3YmNhMiwgMHgxZDE3ZTc3NCwgMHgwZDUzNjQxNiwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjI2M2VlZiwgMHgxZGZlYWU2MiwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywgMHgwOGU5YTIyMCwgMHgxZWJiZDhjOSwgCisJMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxM2FmZmEyOSwgMHgxOTNhMjI0YSwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwgCisJMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxY2MxZjBmNCwgMHgwZTA5MjRlYywgMHgxYzk1NGIyMSwgMHgwZTYzMzc0ZCwgMHgxYzY3OGIzNSwgMHgwZWJjYmJhZSwgCisJMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNmEwYTgwOSwgMHgxZjRlNjAzYiwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNDRlN2MzNCwgMHgxZmI1Nzk3MiwgCisJMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMTFlYjM1NCwgMHgxYjA5MGE1OCwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZmM1ZDI2ZSwgMHgxYmQ3YzBhYywgCisJMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYzA4YzQyNiwgMHgwZjZlMGNhOSwgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYmE1YWE2NywgMHgxMDFjZmM4NywgCisJMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMWY2NTZlOCwgMHgxZmYwOTU2NiwgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwgMHhmZjliNzhiOCwgMHgxZmZmNjIxNywgCisJMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgMHgwY2Y3YmNhMiwgMHgxZDQxMzRkMSwgCisJMHgxYjcyODM0NSwgMHgxMDczODc5OSwgMHgxYjNlNGQzZiwgMHgxMGM5NzA0ZCwgMHgxYjA5MGE1OCwgMHgxMTFlYjM1NCwgMHgxYWQyYmM5ZSwgMHgxMTczNGQ2NCwgCisJMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZDQxMjVmZiwgMHgxZmUxY2FmZCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYWVhYTI1NCwgMHgxZjk3ZjkyNSwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjg0NDI5OCwgMHgxZGRiMTNiNywgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxYTYzMDkxYiwgMHgxMjFhNzk5OSwgMHgxYTI5YTdhMCwgMHgxMjZkMDU0ZCwgMHgxOWVmNDNlZiwgMHgxMmJlZGIyNiwgCisJMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmODliMmMwNywgMHgxZjIyNTJmNywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywgMHhmNjU1Zjc5ZiwgMHgxZTgxN2JhYiwgCisJMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwODg4ZTkzMSwgMHgxZWQ3NDBlNywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNzAyZTA5YiwgMHgxZjM4ZjNhYywgCisJMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOTc3N2VmNSwgMHgxMzYwNThiMSwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwgMHgxOGZiY2NhNCwgMHgxM2ZlZDk1MywgCisJMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDFlMmI2NywgMHgxZGI2NTI2MiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMWY2ZGIxNCwgMHgxY2MxZjBmNCwgCisJMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwM2VhYzljYiwgMHgxZmMyNjQ3MSwgCisJMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxODdjNDAxMCwgMHgxNDlhNDQ5YywgMHgxODNiMGUwYywgMHgxNGU2Y2FiYywgMHgxN2Y4ZWNlMywgMHgxNTMyODI5MywgCisJMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZmUzMDM3OSwgMHgxYmE1YWE2NywgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwgMHhlZGU1ODY2NywgMHgxYTYzMDkxYiwgCisJMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMjVhYTQxMiwgMHgxZmU5Y2RhZCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwgCisJMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNzcxZTc1ZiwgMHgxNWM3N2JiZSwgMHgxNzJkMDgzOCwgMHgxNjEwYjc1NSwgMHgxNmU3NDQ1NSwgMHgxNjU5MTkyNiwgCisJMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzAxMjZhZCwgMHgxOGZiY2NhNCwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTM4ODQ0MiwgMHgxNzcxZTc1ZiwgCisJMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmZjM2ZjU1MCwgMHgxZmZkODg2MSwgMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZGE1NWJlZSwgMHgxZmU5Y2RhZCwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNjU5MTkyNiwgMHgxNmU3NDQ1NSwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNWM3N2JiZSwgMHgxNzcxZTc1ZiwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlODhlMThhMSwgMHgxNWM3N2JiZSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywgMHhlNzA0MzM1YywgMHgxM2ZlZDk1MywgCisJMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYjRkZmJlNCwgMHgxZmE3NTU3ZiwgMHhmYTg3N2FlZiwgMHgxZjg3NjRmYSwgCisJMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNTMyODI5MywgMHgxN2Y4ZWNlMywgMHgxNGU2Y2FiYywgMHgxODNiMGUwYywgMHgxNDlhNDQ5YywgMHgxODdjNDAxMCwgCisJMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNTljZjZlNSwgMHgxMjFhNzk5OSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDVhNTU5OSwgMHgxMDFjZmM4NywgCisJMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmOGZkMWY2NSwgMHgxZjM4ZjNhYywgMHhmODM5ODFhMSwgMHgxZjBhN2VmYywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywgCisJMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxM2ZlZDk1MywgMHgxOGZiY2NhNCwgMHgxM2FmZmEyOSwgMHgxOTNhMjI0YSwgMHgxMzYwNThiMSwgMHgxOTc3N2VmNSwgCisJMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzNlMGYwYywgMHgwZTA5MjRlYywgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwgMHhlMjQ5YWQ5ZSwgMHgwYmUxZDQ5OSwgCisJMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywgMHhmNWY2NTFiNiwgMHgxZTYyODhlYywgMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDdiYmQ2OCwgMHgxZGRiMTNiNywgCisJMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgMHgxMmJlZGIyNiwgMHgxOWVmNDNlZiwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwgMHgxMjFhNzk5OSwgMHgxYTYzMDkxYiwgCisJMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTdlODQ1NSwgMHgwOWFhMDg2MSwgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGRkYWQwOSwgMHgwNzY0ZDNmOSwgCisJMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMjUxNzdmYiwgMHgxY2VkN2FmNCwgMHhmMTljYzhiMywgMHgxYzk1NGIyMSwgCisJMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMTczNGQ2NCwgMHgxYWQyYmM5ZSwgMHgxMTFlYjM1NCwgMHgxYjA5MGE1OCwgMHgxMGM5NzA0ZCwgMHgxYjNlNGQzZiwgCisJMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDY4MDZkYiwgMHgwNTE1NWRhYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwgMHhlMDFlMzUwMywgMHgwMmJlZGEwMSwgCisJMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhmMDNhMmQ5MiwgMHgxYmQ3YzBhYywgMHhlZjhjNzg2NywgMHgxYjcyODM0NSwgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwgCisJMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgxMDFjZmM4NywgMHgxYmE1YWE2NywgMHgwZmM1ZDI2ZSwgMHgxYmQ3YzBhYywgMHgwZjZlMGNhOSwgMHgxYzA4YzQyNiwgCisJMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAwOWRlOSwgMHgwMDY0ODc0OCwgMHhlMDAyNzc5ZiwgMHhmZjM2ZjU1MCwgMHhlMDBmNmE5YSwgMHhmZTA5YTkxOCwgCisJMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlZDkyZmFiMywgMHgxYTI5YTdhMCwgMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzUwMDVkNywgMHgxOTNhMjI0YSwgCisJMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZWJjYmJhZSwgMHgxYzY3OGIzNSwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZTA5MjRlYywgMHgxY2MxZjBmNCwgCisJMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgMHhlMDRhODY4ZSwgMHhmYmIxODNjYywgMHhlMDc4OWIwNiwgMHhmYTg3N2FlZiwgMHhlMGIxOWZjNSwgMHhmOTVmNTdmNywgCisJMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTgyOTZjYiwgMHgxN2I1ZGYyMiwgMHhlOWVmNDhhYiwgMHgxNzJkMDgzOCwgCisJMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgMHgwZDUzNjQxNiwgMHgxZDE3ZTc3NCwgMHgwY2Y3YmNhMiwgMHgxZDQxMzRkMSwgMHgwYzliOTUzMiwgMHgxZDY5NjE3NCwgCisJMHhlMGY1ODEwNCwgMHhmODM5ODFhMSwgMHhlMTQ0MjczNywgMHhmNzE2NWRlMCwgMHhlMTlkNzcxNCwgMHhmNWY2NTFiNiwgMHhlMjAxNTE5ZSwgMHhmNGQ5YzExMSwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlOGQyZjdjOCwgMHgxNjEwYjc1NSwgMHhlODRhMjBkZSwgMHgxNTdkNjkzNSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYmUxZDQ5OSwgMHgxZGI2NTI2MiwgMHgwYjg0NDI5OCwgMHgxZGRiMTNiNywgMHgwYjI2M2VlZiwgMHgxZGZlYWU2MiwgCisJMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlMmU4MTg4YywgMHhmMmFjOWJlYSwgMHhlMzZhYjRkZiwgMHhmMTljYzhiMywgMHhlM2Y3M2JkYSwgMHhmMDkxZjM1NywgCisJMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNmM1ZGRiNiwgMHgxM2FmZmEyOSwgMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNWQ2NTg2MCwgMHgxMjZkMDU0ZCwgCisJMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwYTY4ZjEyMSwgMHgxZTQyNmE0YiwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywgMHgwOWFhMDg2MSwgMHgxZTgxN2JhYiwgCisJMHhlNDhkN2NiYiwgMHhlZjhjNzg2NywgMHhlNTJkNDM2MiwgMHhlZThjYjI5YywgMHhlNWQ2NTg2MCwgMHhlZDkyZmFiMywgMHhlNjg4ODEwYiwgMHhlYzlmYTc0ZiwgCisJMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDhkN2NiYiwgMHgxMDczODc5OSwgMHhlNDI4M2Y1NCwgMHgwZmM1ZDI2ZSwgCisJMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwOGU5YTIyMCwgMHgxZWJiZDhjOSwgMHgwODg4ZTkzMSwgMHgxZWQ3NDBlNywgMHgwODI3ZGMwNywgMHgxZWYxNzhhNCwgCisJMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlODA3MTMxZCwgMHhlYWNkN2Q2ZCwgMHhlOGQyZjdjOCwgMHhlOWVmNDhhYiwgMHhlOWE2ZTZkYSwgMHhlOTE4YmJhYiwgCisJMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzZhYjRkZiwgMHgwZTYzMzc0ZCwgMHhlMzEyODUwYywgMHgwZGFlODgwNSwgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwgCisJMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNzY0ZDNmOSwgMHgxZjIyNTJmNywgMHgwNzAyZTA5YiwgMHgxZjM4ZjNhYywgMHgwNmEwYTgwOSwgMHgxZjRlNjAzYiwgCisJMHhlYTgyOTZjYiwgMHhlODRhMjBkZSwgMHhlYjY1YmI2NCwgMHhlNzgzYmZmMCwgMHhlYzUwMDVkNywgMHhlNmM1ZGRiNiwgMHhlZDQxMjRkYSwgMHhlNjEwYmMxMSwgCisJMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMjI0ZWM0OSwgMHgwYjg0NDI5OCwgMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTlkNzcxNCwgMHgwYTA5YWU0YSwgCisJMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNWRiNzY3OCwgMHgxZjc1OTlhNCwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNTE1NWRhYywgMHgxZjk3ZjkyNSwgCisJMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhlZjM2OGZiMywgMHhlNGMxYjJjMSwgMHhmMDNhMmQ5MiwgMHhlNDI4M2Y1NCwgMHhmMTQzNDQ1MiwgMHhlMzk4NzRjYiwgCisJMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGY1ODEwNCwgMHgwN2M2N2U1ZiwgMHhlMGM3MGM1NCwgMHgwNzAyZTA5YiwgCisJMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwNDRlN2MzNCwgMHgxZmI1Nzk3MiwgMHgwM2VhYzljYiwgMHgxZmMyNjQ3MSwgMHgwMzg2ZjBiOSwgMHgxZmNlMTVmZCwgCisJMHhmMjUxNzdmYiwgMHhlMzEyODUwYywgMHhmMzY0NmFjZSwgMHhlMjk2OWU4YywgMHhmNDdiYmQ2OCwgMHhlMjI0ZWM0OSwgMHhmNTk3MGVkZiwgMHhlMWJkOTViNSwgCisJMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDc4OWIwNiwgMHgwNTc4ODUxMSwgMHhlMDU4YWE4MSwgMHgwNGIyMDQxYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwgCisJMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMmJlZGEwMSwgMHgxZmUxY2FmZCwgMHgwMjVhYTQxMiwgMHgxZmU5Y2RhZCwgMHgwMWY2NTZlOCwgMHgxZmYwOTU2NiwgCisJMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOSwgMHhmN2Q4MjNmOSwgMHhlMTBlODc1YywgMHhmOGZkMWY2NSwgMHhlMGM3MGM1NCwgMHhmYTI0ODk4OCwgMHhlMDhhNjY1YywgCisJMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwgMHhlMDE2MzI1MywgMHgwMjVhYTQxMiwgMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAyNzc5ZiwgMHgwMGM5MGFiMCwgCisJMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgMHgwMTJkODY1NywgMHgxZmZhNzJmMCwgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwgMHgwMDY0ODc0OCwgMHgxZmZmNjIxNywgCiAJMHhmYjRkZmJlNCwgMHhlMDU4YWE4MSwgMHhmYzc5MGY0NywgMHhlMDMxZWEwMywgMHhmZGE1NWJlZSwgMHhlMDE2MzI1MywgMHhmZWQyNzlhOSwgMHhlMDA1OGQxMAogfTsKIAogY29uc3QgaW50IHR3aWRUYWI2NFs0KjYgKyAxNio2XSA9IHsKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAKIAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAKKwkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAKKwkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGVlMzhjNGM2LCAweDFhOWI2NjI5LCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDBmMTVhZTljLCAweDFjMzhiMmYyLCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAKIAkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGY2YjVmY2U5LCAweGUxNjBiZWE5CiB9OwogCiAjZWxzZQogCi0vKgotICogIFEzMCBmb3IgMTI4IGFuZCAxMDI0CisvKiAKKyAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNCAKICAqCiAgKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgewogICogICBhbmdsZSA9IChpICsgMC4xMjUpICogTV9QSSAvIG51bTsKICAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7CiAgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICoKKyAqIAogICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKICAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7CiAgKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwpAQCAtNjY3LDM3OSArNjY3LDM3OSBAQAogICovCiBjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewogCS8qIDEyOCAqLwotCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsCi0JMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwKLQkweDNmYWMxYTViLCAweDA2NzdlZGJiLCAweDA3YTNhZGZmLCAweDNmOGFkYzc3LCAweDNmN2U4ZTFlLCAweDA4MDc3NDU3LCAweDA5MzI0Y2E3LCAweDNmNTVmNzk2LAotCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsCi0JMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwKLQkweDNlMDhiNDJhLCAweDBmYmRiYTQwLCAweDEwZTE1YjRlLCAweDNkYmJkNmQ0LCAweDNkYTEwNmJkLCAweDExNDIzZWYwLCAweDEyNjNlNjk5LCAweDNkNGQwNzI4LAotCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsCi0JMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwKLQkweDNiMGQ4OTA5LCAweDE4YWM0Yjg3LCAweDE5YzE3ZDQ0LCAweDNhOTZiNjM2LCAweDNhNmRmOGY4LCAweDFhMWQ2NTQ0LCAweDFiMmY5NzFlLCAweDM5ZjA2MWQyLAotCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsCi0JMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwKLQkweDM2Y2IxZTJhLCAweDIxMTIyMjQwLCAweDIyMTJlNDkyLCAweDM2MmNlODU1LCAweDM1ZjcxZmIxLCAweDIyNjdkM2EwLCAweDIzNjRhMDJlLCAweDM1NTJhOGY0LAotCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsCi0JMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwKLQkweDMxNTkwZTNlLCAweDI4YzBiNGQyLCAweDI5YTc3OGRiLCAweDMwOTZlMjIzLCAweDMwNTUzODI4LCAweDI5ZjM5ODRjLCAweDJhZDU4NmEzLCAweDJmOGQ3MTNhLAotCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsCisJMHgzZmZmZWM0MywgMHgwMDMyNDNmMSwgMHgwMTVmZDRkMiwgMHgzZmZjMzhkMSwgMHgzZmY5YzEzYSwgMHgwMWM0NTRmNSwgMHgwMmYxYjc1NSwgMHgzZmVlYTc3NiwgCisJMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwgCisJMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwgCisJMHgzZjQ3Mzc1OSwgMHgwOTk1YmRmZCwgMHgwYWJmODA0MywgMHgzZjE3NGU3MCwgMHgzZjA2MWU5NSwgMHgwYjIyOGQ0MiwgMHgwYzRiMGI5NCwgMHgzZWNlZWFhZCwgCisJMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwgCisJMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwgCisJMHgzZDJmZDg2YywgMHgxMmM0MWE0ZiwgMHgxM2UzOWJlOSwgMHgzY2Q0YzM4YiwgMHgzY2I1M2FhYSwgMHgxNDQzMTBkZCwgMHgxNTYwNDAxMywgMHgzYzUzMWU4OCwgCisJMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwgCisJMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwgCisJMHgzOWM1NjY0ZiwgMHgxYjhhNzgxNSwgMHgxYzk5N2ZjNCwgMHgzOTQxMWUzMywgMHgzOTEzZWIwZSwgMHgxY2YzNGJhZiwgMHgxZGZlZmY2NywgMHgzODg5MDY2MywgCisJMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwgCisJMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwgCisJMHgzNTFhY2VkZCwgMHgyM2I4MzZjYSwgMHgyNGIwZTY5OSwgMHgzNDcwMzA5NSwgMHgzNDM2NGRhNiwgMHgyNTAzMTdkZiwgMHgyNWY3ODQ5NywgMHgzMzg1YTIyMiwgCisJMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwgCisJMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwgCisJMHgyZjQ5ZWUwZiwgMHgyYjIwMDNhYywgMHgyYmZjZjk3YywgMHgyZTdjYWIxYywgMHgyZTM3NTkyYywgMHgyYzQ1YzhhMCwgMHgyZDFkYTNkNSwgMHgyZDY0YjlkYSwgCiAJLyogMTAyNCAqLwotCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsCi0JMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwKLQkweDNmZmViMDIxLCAweDAwY2Y1NmVmLCAweDAwZjUwOGZjLCAweDNmZmUyYWU1LCAweDNmZmRmOThjLCAweDAxMDE5OTk4LCAweDAxMjc0YjMxLCAweDNmZmQ1NmI1LAotCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsCi0JMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwKLQkweDNmZjgxODk2LCAweDAxZmNkYjJlLCAweDAyMjI4OTI0LCAweDNmZjZlMWJmLCAweDNmZjY3NTM0LCAweDAyMmYxODRkLCAweDAyNTRjNTQ0LCAweDNmZjUyMGM1LAotCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsCi0JMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwKLQkweDNmZWJmNDhiLCAweDAzMmEzMzQ5LCAweDAzNGZkOWU1LCAweDNmZWEwYzM1LCAweDNmZTk2NDgwLCAweDAzNWM2NjgyLCAweDAzODIwYjkzLCAweDNmZTc1ZTk4LAotCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsCi0JMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwKLQkweDNmZGE0NTBmLCAweDA0NTc0NTFkLCAweDA0N2NlMTFhLCAweDNmZDdhYjY0LCAweDNmZDZjODk0LCAweDA0ODk2YTE2LCAweDA0YWYwM2ZjLCAweDNmZDQxMTVmLAotCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsCi0JMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywKLQkweDNmYzMwYmFhLCAweDA1ODNmNjhjLCAweDA1YTk4NGE2LCAweDNmYmZjMGUzLCAweDNmYmVhMzBjLCAweDA1YjYwOGViLCAweDA1ZGI5NDYzLCAweDNmYmIzYWM3LAotCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsCi0JMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwKLQkweDNmYTY0YTVmLCAweDA2YjAyZDgxLCAweDA2ZDVhYTc3LCAweDNmYTI0ZWM2LCAweDNmYTBmNjAwLCAweDA2ZTIyOGVlLCAweDA3MDdhMmI3LCAweDNmOWNkY2Y3LAotCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsCi0JMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwKLQkweDNmODQwM2FlLCAweDA3ZGJjZmYyLCAweDA4MDEzODgzLCAweDNmN2Y1NzliLCAweDNmN2RjNDA1LCAweDA4MGRiMDE2LCAweDA4MzMxNGYxLCAweDNmNzhmYTkyLAotCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsCi0JMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwKLQkweDNmNWMzYThmLCAweDA5MDZjM2UwLCAweDA5MmMxNGNlLCAweDNmNTZkZTZhLCAweDNmNTUxMDI2LCAweDA5Mzg4NDY5LCAweDA5NWRkMTE2LCAweDNmNGY5NmI0LAotCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsCi0JMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwKLQkweDNmMmVmMjc2LCAweDBhMzBlZjVlLCAweDBhNTYyNTZjLCAweDNmMjhlNmI2LCAweDNmMjZkZGVjLCAweDBhNjI4YmZhLCAweDBhODdiZDNkLCAweDNmMjBiNGY1LAotCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsCi0JMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywKLQkweDNlZmMyZjUwLCAweDBiNWEzODhkLCAweDBiN2Y1MDgxLCAweDNlZjU3NDdiLCAweDNlZjMzMTVhLCAweDBiOGJhY2YwLCAweDBiYjBiZjhmLCAweDNlZWM1OTY1LAotCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsCi0JMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwKLQkweDNlYzNmNTg1LCAweDBjODI4NWE1LCAweDBjYTc3YzQ3LCAweDNlYmM4YzMxLCAweDNlYmEwZWU5LCAweDBjYjNjZDg0LCAweDBjZDhiZTQ3LCAweDNlYjI4ODhmLAotCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsCi0JMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwKLQkweDNlODY0OWY1LCAweDBkYTliY2YyLCAweDBkY2U4ZjBkLCAweDNlN2UzMmM2LCAweDNlN2I3YjkwLCAweDBkZGFkNDA2LCAweDBkZmY5ZmJhLCAweDNlNzM0Nzc4LAotCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsCi0JMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwKLQkweDNlNDMzMWZhLCAweDBlY2ZjNGQ5LCAweDBlZjQ2ZjNiLCAweDNlM2E2ZGE0LCAweDNlMzc3Y2JiLCAweDBmMDBhNmRmLCAweDBmMjU0YTUzLCAweDNlMmU5YjljLAotCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsCi0JMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwKLQkweDNkZmFiMzY1LCAweDBmZjQ4M2Q3LCAweDEwMTkwMzUyLCAweDNkZjE0MmFiLCAweDNkZWUxODUxLCAweDEwMjUyYzk0LCAweDEwNDlhNDlhLCAweDNkZTQ4YWVmLAotCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsCi0JMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwKLQkweDNkYWNkNDgxLCAweDExMTdlMDg4LCAweDExM2MzMWYzLCAweDNkYTJiODM0LCAweDNkOWY1NGFmLCAweDExNDg0YmMyLCAweDExNmM5NTMxLCAweDNkOTUxYmRlLAotCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsCi0JMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwKLQkweDNkNTk5YzBlLCAweDEyMzljMWE3LCAweDEyNWRlMWRhLCAweDNkNGVkNTBmLCAweDNkNGIzOGFhLCAweDEyNjllYjJiLCAweDEyOGUwMmRjLCAweDNkNDA1NTRlLAotCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsCi0JMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwKLQkweDNkMDExMTQ1LCAweDEzNWEwZTBlLCAweDEzN2RmOWU3LCAweDNjZjVhMDgyLCAweDNjZjFjYjhlLCAweDEzODlmMWFmLCAweDEzYWRkNDgxLCAweDNjZTYzZTk4LAotCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsCi0JMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwKLQkweDNjYTMzYmQzLCAweDE0NzhhY2JjLCAweDE0OWM2MTFkLCAweDNjOTcyMjRjLCAweDNjOTMxNTFkLCAweDE0YTg0NjUyLCAweDE0Y2JmMTI3LCAweDNjODZkZjhlLAotCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsCi0JMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwKLQkweDNjNDAyM2RkLCAweDE1OTU4NGQzLCAweDE1YjhmZWE0LCAweDNjMzM2MjlkLCAweDNjMmYxZDhlLCAweDE1YzRkMDNlLCAweDE1ZTgzZmZmLCAweDNjMjI0MDc1LAotCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsCi0JMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwKLQkweDNiZDdkMWZhLCAweDE2YjA3ZDlmLCAweDE2ZDNiOWNjLCAweDNiY2E2YTFkLCAweDNiYzVlZDhkLCAweDE2ZGY3NmMzLCAweDE3MDJhODVlLCAweDNiYjg2YTA4LAotCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsCi0JMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwKLQkweDNiNmE0ZjM4LCAweDE3Yzk3ZTkzLCAweDE3ZWM3YTBkLCAweDNiNWM0MWU4LCAweDNiNTc4ZTM5LCAweDE3ZjgyMTVlLCAweDE4MWIxMWM0LCAweDNiNDk2NTc0LAotCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsCi0JMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywKLQkweDNhZjdhNTE2LCAweDE4ZTA2ZjUwLCAweDE5MDMyNzBmLCAweDNhZThmMzhiLCAweDNhZTQwOTI2LCAweDE5MGViN2I3LCAweDE5MzE2M2UxLCAweDNhZDUzYzViLAotCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksCi0JMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwKLQkweDNhN2ZkZDg2LCAweDE5ZjUzN2E0LCAweDFhMTdhOGE1LCAweDNhNzA4OTA2LCAweDNhNmI2ODU5LCAweDFhMjMyMWEyLCAweDFhNDU4NjhlLCAweDNhNWJmOGQxLAotCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsCi0JMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwKLQkweDNhMDMwMmVkLCAweDFiMDdiZjhjLCAweDFiMjllNmQyLCAweDM5ZjMwY2NjLCAweDM5ZWRiNjQ5LCAweDFiMzU0NzI3LCAweDFiNTc2MWQ4LCAweDM5ZGRhNTVhLAotCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsCi0JMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwKLQkweDM5ODEyMDFlLCAweDFjMTdlZjM5LCAweDFjMzljOWNkLCAweDM5NzA4OWJmLCAweDM5NmFmZGRjLCAweDFjNDUxMDdjLCAweDFjNjZkZGZlLCAweDM5NWE0Y2ViLAotCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsCi0JMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwKLQkweDM4ZmE0MDVlLCAweDFkMjVhZjBkLCAweDFkNDczYTAwLCAweDM4ZTkwYjMxLCAweDM4ZTM0YTY5LCAweDFkNTI2NjBmLCAweDFkNzNlMzc0LCAweDM4ZDFmYWU5LAotCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsCi0JMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwKLQkweDM4NmU2ZjYwLCAweDFlMzBlN2E0LCAweDFlNTIyMDBjLCAweDM4NWM5Y2UzLCAweDM4NTZhN2I2LCAweDFlNWQzMDg0LCAweDFlN2U1YWUyLCAweDM4NDRiYjI4LAotCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsCi0JMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywKLQkweDM3ZGRiOTQ1LCAweDFmMzk4MWNlLCAweDFmNWE2NGNiLCAweDM3Y2I0YjA0LCAweDM3YzUyMWY2LCAweDFmNjU1OGI1LCAweDFmODYyZDJkLCAweDM3YjI5OWU3LAotCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsCi0JMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwKLQkweDM3NDgyYTlhLCAweDIwM2Y2Njk5LCAweDIwNWZmMTRmLCAweDM3MzUyMjJmLCAweDM3MmVjNWM5LCAweDIwNmFjN2I4LCAweDIwOGI0MzcyLCAweDM3MWJhM2Q0LAotCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsCi0JMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwKLQkweDM2YWRkMDU4LCAweDIxNDI3ZjRkLCAweDIxNjJhZWVhLCAweDM2OWEyZjY5LCAweDM2OTNhMDM4LCAweDIxNmQ2NmUyLCAweDIxOGQ4NzBiLCAweDM2N2ZlNjA4LAotCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsCi0JMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwKLQkweDM2MGViN2UzLCAweDIyNDJiNTZmLCAweDIyNjI4NzI5LCAweDM1ZmE4MDIzLCAweDM1ZjNiZWJhLCAweDIyNmQxZmMxLCAweDIyOGNlMTkxLCAweDM1ZGY2ZTAzLAotCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsCi0JMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwKLQkweDM1NmFlZjA4LCAweDIzM2ZmMmM4LCAweDIzNWY2M2RjLCAweDM1NTYyMjM5LCAweDM1NGYyZjJjLCAweDIzNjlkYzI5LCAweDIzODkzY2RkLCAweDM1M2E0OWIyLAotCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsCi0JMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwKLQkweDM0YzI4M2ZiLCAweDI0M2EyMTVmLCAweDI0NTkyZjEzLCAweDM0YWQyM2ViLCAweDM0YTVmZmQ1LCAweDI0NjM4NjJjLCAweDI0ODI4MzBkLCAweDM0OTA4NzY4LAotCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsCi0JMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwKLQkweDM0MTU4NTU5LCAweDI1MzEyYjgxLCAweDI1NGZkMzIzLCAweDMzZmY5M2UyLCAweDMzZjgzZjYyLCAweDI1NWEwODIzLCAweDI1Nzg5ZTgwLCAweDMzZTIzNWRmLAotCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsCi0JMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwKLQkweDMzNjQwMjIzLCAweDI2MjRmYmJmLCAweDI2NDMzYWE3LCAweDMzNGQ4MTJkLCAweDMzNDVmY2U2LCAweDI2NGQ0Y2FjLCAweDI2NmI3OWRkLCAweDMzMmY2NDM1LAotCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsCi0JMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywKLQkweDMyYWUwOWJlLCAweDI3MTU3Y2Y1LCAweDI3MzM1MDgyLCAweDMyOTZmYjNkLCAweDMyOGY0N2Q1LCAweDI3M2QzZWFjLCAweDI3NWIwMDE0LCAweDMyNzgyMWVlLAotCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsCi0JMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwKLQkweDMxZjNhYmY1LCAweDI4MDI5YTQ1LCAweDI4MWZmZmUyLCAweDMxZGMxMWU4LCAweDMxZDQzMDBiLCAweDI4MjljOTU0LCAweDI4NDcxYzVlLCAweDMxYmM3ZWVlLAotCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsCi0JMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwKLQkweDMxMzRmOGYxLCAweDI4ZWMzZjFlLCAweDI5MDkzNDNlLCAweDMxMWNkNTY0LCAweDMxMTRjNWMwLCAweDI5MTJkODFmLCAweDI5MmZiYTQwLCAweDMwZmM4YjdkLAotCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsCi0JMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywKLQkweDMwNzIwMTNjLCAweDI5ZDI1NzNjLCAweDI5ZWVkOTViLCAweDMwNTk1NjQ4LCAweDMwNTExOTkxLCAweDI5Zjg1NmQ1LCAweDJhMTRjNThiLCAweDMwMzg1ODQwLAotCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsCi0JMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywKLQkweDJmYWFkNWMxLCAweDJhYjRjZWE5LCAweDJhZDBkYjRlLCAweDJmOTFhNTg5LCAweDJmODkzYzc1LCAweDJhZGEzMThlLCAweDJhZjYyYTYzLCAweDJmNmZmNjNkLAotCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsCi0JMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywKLQkweDJlZGY4N2M2LCAweDJiOTM5MWMwLCAweDJiYWYyNjdkLCAweDJlYzVkNDc5LCAweDJlYmQzZmM0LCAweDJiYjg1NGI0LCAweDJiZDNkNTNhLCAweDJlYTM3NmQ2LAotCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsCi0JMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwKLQkweDJlMTAyOGVkLCAweDJjNmU4ZDJlLCAweDJjODlhNzlmLCAweDJkZjVmNGM3LCAweDJkZWQzNTJmLCAweDJjOTJhZDAxLCAweDJjYWRiMmQ1LCAweDJkZDJlYmM3LAotCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsCisJMHgzZmZmZmZiMSwgMHgwMDA2NDg3ZiwgMHgwMDJiZmI3NCwgMHgzZmZmZjBlMywgMHgzZmZmZTcwNSwgMHgwMDM4OGM2ZSwgMHgwMDVlM2Y0YywgMHgzZmZmYmE5YiwgCisJMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwgCisJMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwgCisJMHgzZmZkMWI3ZSwgMHgwMTMzZGJhMywgMHgwMTU5OGNiMSwgMHgzZmZjNWIwYywgMHgzZmZjMTVmNywgMHgwMTY2MWNmMCwgMHgwMThiY2Q1YiwgMHgzZmZiMzdlYywgCisJMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwgCisJMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwgCisJMHgzZmY0YWE1ZCwgMHgwMjYxNTQxNCwgMHgwMjg2ZmZmMywgMHgzZmYzMzg1OCwgMHgzZmYyYjgxMywgMHgwMjkzOGU2MiwgMHgwMmI5MzkxNCwgMHgzZmYxMjg3OCwgCisJMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwgCisJMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwgCisJMHgzZmU2YWQwOCwgMHgwMzhlOTdhOSwgMHgwM2I0M2IxNywgMHgzZmU0ODk5MCwgMHgzZmUzY2UyNiwgMHgwM2MwYzY5ZSwgMHgwM2U2Njg1MiwgMHgzZmUxOGQxZiwgCisJMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwgCisJMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwgCisJMHgzZmQzMjRiNywgMHgwNGJiOGM0MiwgMHgwNGUxMjNmYSwgMHgzZmQwNGZmYywgMHgzZmNmNTk3YywgMHgwNGVkYWI4MywgMHgwNTEzNDBmNiwgMHgzZmNjNjczYiwgCisJMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywgCisJMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywgCisJMHgzZmJhMTMxYiwgMHgwNWU4MTdjMywgMHgwNjBkYTA4MywgMHgzZmI2OGQ1YiwgMHgzZmI1NWJkYywgMHgwNjFhMjJmNywgMHgwNjNmYThlNywgMHgzZmIxYjhhMiwgCisJMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwgCisJMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywgCisJMHgzZjliN2E2MiwgMHgwNzE0MjAxYiwgMHgwNzM5OTZhMSwgMHgzZjk3NDNlYiwgMHgzZjk1ZDc4NywgMHgwNzQ2MTJlYiwgMHgwNzZiODYxNiwgMHgzZjkxODNhNSwgCisJMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwgCisJMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwgCisJMHgzZjc3NWQzMSwgMHgwODNmOGI0MywgMHgwODY0ZWM0ZiwgMHgzZjcyNzY2MSwgMHgzZjcwY2YzOCwgMHgwODcxNjE1OSwgMHgwODk2YmU4MCwgMHgzZjZiY2IwZSwgCisJMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwgCisJMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwgCisJMHgzZjRkYmVhYywgMHgwOTZhM2Y0MiwgMHgwOThmODc5NiwgMHgzZjQ4MjdmMCwgMHgzZjQ2NDYyNiwgMHgwOTliZjQ0YywgMHgwOWMxMzgzMSwgMHgzZjQwOTIyMywgCisJMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwgCisJMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwgCisJMHgzZjFlYTI2ZSwgMHgwYTk0MjIyZiwgMHgwYWI5NGU4ZiwgMHgzZjE4NWM0MywgMHgzZjE2NDAwMSwgMHgwYWM1YjFkYywgMHgwYWVhZDk0NCwgMHgzZjBmZGNhNSwgCisJMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywgCisJMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwgCisJMHgzZWVhMGM4ZSwgMHgwYmJkMWEzMywgMHgwYmUyMjc2NiwgMHgzZWUzMTc3ZSwgMHgzZWUwYzBmNCwgMHgwYmVlODAzOCwgMHgwYzEzODdlOSwgMHgzZWQ5YWVjYywgCisJMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwgCisJMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwgCisJMHgzZWIwMDE5YywgMHgwY2U1MGQ4YywgMHgwZDA5Zjg1YiwgMHgzZWE4NWU0MSwgMHgzZWE1Y2RhMywgMHgwZDE2NDVhMCwgMHgwZDNiMmE2NCwgMHgzZTllMGQ0YywgCisJMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwgCisJMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwgCisJMHgzZTcwODY5ZiwgMHgwZTBiZTI4ZSwgMHgwZTMwYTdjNSwgMHgzZTY4MzVhNCwgMHgzZTY1NmIyYiwgMHgwZTNjZTg2YiwgMHgwZTYxYTcwZiwgMHgzZTVjZmQ1MSwgCisJMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwgCisJMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywgCisJMHgzZTJiYTExYiwgMHgwZjMxN2ZhNSwgMHgwZjU2MWMxNSwgMHgzZTIyYTMzOCwgMHgzZTFmOWYyMSwgMHgwZjYyNGYwYywgMHgwZjg2ZTQ2MCwgMHgzZTE2ODQ4MCwgCisJMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwgCisJMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwgCisJMHgzZGUxNTcwOCwgMHgxMDU1Y2I1YiwgMHgxMDdhM2JkNSwgMHgzZGQ3YWQwNSwgMHgzZGQ0NmY5NCwgMHgxMDg2NjAwZSwgMHgxMGFhYzhlNiwgMHgzZGNhYThmNSwgCisJMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwgCisJMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwgCisJMHgzZDkxYWVkOSwgMHgxMTc4YWM1MywgMHgxMTljZWRhZiwgMHgzZDg3NTk4YywgMHgzZDgzZTMwOSwgMHgxMWE5MDIxZCwgMHgxMWNkM2I1MCwgMHgzZDc5NzE0NSwgCisJMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwgCisJMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwgCisJMHgzZDNjYWY3NiwgMHgxMjlhMDk1NCwgMHgxMmJlMTg2YywgMHgzZDMxYWZjNSwgMHgzZDJlMDA3YywgMHgxMmNhMWMwMywgMHgxMmVlMjI2YywgMHgzZDIyZTQ3YywgCisJMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwgCisJMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwgCisJMHgzY2UyNjAzZiwgMHgxM2I5Yzk0MywgMHgxM2RkYTJmNywgMHgzY2Q2YjcxZSwgMHgzY2QyY2Y2MiwgMHgxM2U5OTRhYiwgMHgxNDBkNjUyYywgMHgzY2M3MGExYywgCisJMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwgCisJMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwgCisJMHgzYzgyYzkwOSwgMHgxNGQ3ZDMyYSwgMHgxNGZiNzQ1ZSwgMHgzYzc2Nzc3YiwgMHgzYzcyNTdhMiwgMHgxNTA3NTMyNywgMHgxNTJhZWFhMywgMHgzYzY1ZWExYywgCisJMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwgCisJMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwgCisJMHgzYzFkZjIxZiwgMHgxNWY0MGUzYSwgMHgxNjE3NzNkNiwgMHgzYzEwZjkzNSwgMHgzYzBjYTE5YiwgMHgxNjIzM2VhYywgMHgxNjQ2OWEwZCwgMHgzYmZmOGNlOCwgCisJMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwgCisJMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwgCisJMHgzYmIzZTQ0MCwgMHgxNzBlNjFjYywgMHgxNzMxODhiZSwgMHgzYmE2NDUxYiwgMHgzYmExYjYyMCwgMHgxNzNkM2U5YiwgMHgxNzYwNWFkMCwgMHgzYjkzZmI2MywgCisJMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwgCisJMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwgCisJMHgzYjQ0YThhMCwgMHgxODI2YjU2MSwgMHgxODQ5OWE5ZCwgMHgzYjM2NjQ2ZSwgMHgzYjMxOWU3NywgMHgxODU1M2E3ZCwgMHgxODc4MTQ3YSwgMHgzYjIzM2VlMSwgCisJMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywgCisJMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwgCisJMHgzYWQwNDhlMywgMHgxOTNjZjBhOSwgMHgxOTVmOTEyOCwgMHgzYWMxNjBlMSwgMHgzYWJjNjQ1OCwgMHgxOTZiMWEwOSwgMHgxOThkYWVjOCwgMHgzYWFkNjEyOSwgCisJMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwgCisJMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwgCisJMHgzYTU2Y2YyMywgMHgxYTUwZmI4MSwgMHgxYTczNTQ0MiwgMHgzYTQ3NDQ5YywgMHgzYTQyMTFmMCwgMHgxYTdlYzUyNCwgMHgxYWExMTFhNiwgMHgzYTMyNmM3NCwgCisJMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwgCisJMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwgCisJMHgzOWQ4NDVlOSwgMHgxYjYyYmRmOCwgMHgxYjg0Y2MwMSwgMHgzOWM4MWEzNiwgMHgzOWMyYjFkYSwgMHgxYjkwMjNlNSwgMHgxYmIyMjUzMCwgMHgzOWIyNmI2ZCwgCisJMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwgCisJMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwgCisJMHgzOTU0YjgyZSwgMHgxYzcyMjA0ZiwgMHgxYzkzZTBhYiwgMHgzOTQzZWNiNiwgMHgzOTNlNGYyMywgMHgxYzlmMWU5NiwgMHgxY2MwZDFiNiwgMHgzOTJkNjkyZiwgCisJMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwgCisJMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwgCisJMHgzOGNjMzE1ZCwgMHgxZDdmMGFmYiwgMHgxZGEwN2FiYywgMHgzOGJhYzc5NSwgMHgzOGI0ZjU0NywgMHgxZGFiOWRiNSwgMHgxZGNjZmZiZiwgMHgzOGEzNzE0MiwgCisJMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwgCisJMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwgCisJMHgzODNlYmQ0YywgMHgxZTg5NjZhOCwgMHgxZWFhODJlOSwgMHgzODJjYjZiNywgMHgzODI2YjAzMCwgMHgxZWI1ODlmNywgMHgxZWQ2OTgwNSwgMHgzODE0OGY5ZiwgCisJMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywgCisJMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywgCisJMHgzN2FjNjg0MSwgMHgxZjkxMWMzZCwgMHgxZmIxZTIxZCwgMHgzNzk5YzY2ZiwgMHgzNzkzOGMzNCwgMHgxZmJjY2M0ZCwgMHgxZmRkODM4MSwgMHgzNzgwZDBhYSwgCisJMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwgCisJMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwgCisJMHgzNzE1M2VlZSwgMHgyMDk2MTRkOSwgMHgyMGI2ODE4MSwgMHgzNzAyMDM3YywgMHgzNmZiOTYxOCwgMHgyMGMxNGRkZiwgMHgyMGUxYWI2MywgMHgzNmU4NDEzNSwgCisJMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwgCisJMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwgCisJMHgzNjc5NGU2ZSwgMHgyMTk4MzlkOCwgMHgyMWI4NGE3OSwgMHgzNjY1N2IwOCwgMHgzNjVlZGIwOSwgMHgyMWMyZjgxNSwgMHgyMWUyZjkxYSwgMHgzNjRhZWU3YiwgCisJMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwgCisJMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywgCisJMHgzNWQ4YTQ0OSwgMHgyMjk3NzRkNywgMHgyMmI3MjZhOCwgMHgzNWM0M2FhNywgMHgzNWJkNjhhMSwgMHgyMmMxYjQ5NiwgMHgyMmUxNTY1NSwgMHgzNWE4ZTYyMSwgCisJMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwgCisJMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwgCisJMHgzNTMzNGU2ZiwgMHgyMzkzYWZiMiwgMHgyM2IyZmZmMywgMHgzNTFlNTA1NiwgMHgzNTE3NGNlMCwgMHgyM2JkNmQ0OCwgMHgyM2RjYWQwMywgMHgzNTAyMzYzNiwgCisJMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwgCisJMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwgCisJMHgzNDg5NWIzNiwgMHgyNDhjZDQ4NywgMHgyNGFiYzA4MiwgMHgzNDczY2E3OSwgMHgzNDZjOTYyZiwgMHgyNGI2MGM1NywgMHgyNGQ0ZTc1NywgMHgzNDU2ZWQyZiwgCisJMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwgCisJMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwgCisJMHgzM2RhZDk1ZSwgMHgyNTgyY2RiYywgMHgyNWExNTJjMCwgMHgzM2M0YjdkYiwgMHgzM2JkNTM1YywgMHgyNWFiN2MzMCwgMHgyNWM5ZWZjYSwgMHgzM2E3MTllOCwgCisJMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwgCisJMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwgCisJMHgzMzI3ZDgwOCwgMHgyNjc1ODVmOCwgMHgyNjkzYTE2MSwgMHgzMzExMjdhYiwgMHgzMzA5OTM5YywgMHgyNjlkYTc4YiwgMHgyNmJiYjExOSwgMHgzMmYyY2JhMSwgCisJMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywgCisJMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwgCisJMHgzMjcwNjZiYywgMHgyNzY0ZTgyZiwgMHgyNzgyOTc2MCwgMHgzMjU5Mjk3ZCwgMHgzMjUxNjY4NiwgMHgyNzhjNzk2NSwgMHgyN2FhMTY0YywgMHgzMjNhMTFmZSwgCisJMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwgCisJMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwgCisJMHgzMWI0OTU2NCwgMHgyODUwZGY5ZCwgMHgyODZlMjAwMiwgMHgzMTljY2Q0NiwgMHgzMTk0ZGMxNCwgMHgyODc3ZGQwNywgMHgyODk1MGFiNiwgMHgzMTdjZmQwNCwgCisJMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwgCisJMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwgCisJMHgzMGY0NzQ0OSwgMHgyOTM5NTdjOSwgMHgyOTU2MjZkYSwgMHgzMGRjMjM1ZSwgMHgzMGQ0MDRhMCwgMHgyOTVmYmUwNiwgMHgyOTdjNzlmNSwgMHgzMGJiOWQxYywgCisJMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywgCisJMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwgCisJMHgzMDMwMTQxOCwgMHgyYTFlM2M4YSwgMHgyYTNhOTdjNywgMHgzMDE3M2M3YSwgMHgzMDBlZjBlNSwgMHgyYTQ0MDg0NCwgMHgyYTYwNGZmNSwgMHgyZmY2MDMwYSwgCisJMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywgCisJMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwgCisJMHgyZjY3ODVkNywgMHgyYWZmN2EwNSwgMHgyYjFiNWVmOCwgMHgyZjRlMjlhZiwgMHgyZjQ1YjFmYiwgMHgyYjI0YTdmNiwgMHgyYjQwNzhmNSwgMHgyZjJjM2ZmMiwgCisJMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywgCisJMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwgCisJMHgyZTlhZGFlZSwgMHgyYmRjZmNiMCwgMHgyYmY4NjhlZCwgMHgyZTgwZmM2ZSwgMHgyZTc4NTk1OCwgMHgyYzAxODk5ZSwgMHgyYzFjZTE4MSwgMHgyZTVlNjU1NiwgCisJMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwgCisJMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywgCisJMHgyZGNhMjUxYywgMHgyY2I2YjE1NSwgMHgyY2QxYTI3YiwgMHgyZGFmYzY4MywgMHgyZGE2ZjhjYSwgMHgyY2RhOWExNCwgMHgyY2Y1NzY3YywgMHgyZDhjODUxMCwgCiAJMHgyZDgzYjA0ZiwgMHgyY2ZlNjcyOCwgMHgyZDE5MmVjMSwgMHgyZDY5Mjc4NCwgMHgyZDYwNGJjMCwgMHgyZDIyMTg3YSwgMHgyZDNjY2IzNCwgMHgyZDQ1YWRmNgogfTsKIAogY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsKLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LAotCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGU3ODIxZDVhLCAweDNiMjBkNzllLAotCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsCi0JMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwKKwkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAKKwkweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAKKwkweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCAKKwkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGU3ODIxZDVhLCAweDNiMjBkNzllLCAKKwkweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAKKwkweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGM0ZGYyODYyLCAweDE4N2RlMmE2LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweGRjNzE4OThkLCAweGNhYzkzM2FlLCAKIAotCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsCi0JMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwKLQkweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LAotCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsCi0JMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwKLQkweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLAotCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsCi0JMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwKLQkweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LAotCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsCi0JMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwKLQkweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLAotCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsCi0JMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweGVkNmJmOWQyLCAweDNkM2U4MmFkLCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LAotCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsCi0JMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywKLQkweGMwNGVlNGI5LCAweGY5YmExNjUxLCAweGQ3NjYxOWI2LCAweDMxNzkwMGQ2LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweGMxZWIwMjA5LCAweGYwNzMwMzQzLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsCi0JMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwKLQkweGNlODZmZjJhLCAweGQ3NjYxOWI2LCAweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweGQ1MDUyZDk3LCAweGQwOTQ0MWJjLAotCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsCi0JMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywKLQkweGVkNmJmOWQyLCAweGMyYzE3ZDUzLCAweGMwNGVlNGI5LCAweDA2NDVlOWFmLCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweGY2OWJmN2M5LCAweGMwYjE1NTAyLAorCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIAorCTB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIAorCTB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIAorCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIAorCTB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIAorCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIAorCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIAorCTB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIAorCTB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIAorCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIAorCTB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIAorCTB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIAorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsIAorCTB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIAorCTB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZWQ2YmY5ZDIsIDB4M2QzZTgyYWQsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIAorCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIAorCTB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIAorCTB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIDB4ZDc2NjE5YjYsIDB4MzE3OTAwZDYsIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4YzFlYjAyMDksIDB4ZjA3MzAzNDMsIAorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsIAorCTB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4YzkxYWY5NzYsIDB4ZGYxOGYwY2UsIDB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIAorCTB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4ZDUwNTJkOTcsIDB4ZDA5NDQxYmMsIAorCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsIAorCTB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4ZTRhMmVmZjcsIDB4YzYyNTBhMTgsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIAorCTB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMsIDB4YzA0ZWU0YjksIDB4MDY0NWU5YWYsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4ZjY5YmY3YzksIDB4YzBiMTU1MDIsIAogCi0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmZiMTBjMSwgMHgwMTkyMTU1ZiwKLQkweDNmZmVjNDJkLCAweDAwYzkwZThmLCAweDNmZjRlNWRmLCAweDAyNWIwY2FlLCAweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmZmIxMGMxLCAweDAxOTIxNTVmLAotCTB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsCi0JMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZjg0YzhlMSwgMHgwN2Q1OTM5NSwKLQkweDNmZTEyYWNiLCAweDAzZWNhZGNmLCAweDNlZWIzMzQ3LCAweDBiYjZlY2VmLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNmZDM5YjVhLCAweDA0YjU0ODI0LAotCTB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIDB4M2ZjMzk1ZjksIDB4MDU3ZGI0MDIsIDB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsCi0JMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwKLQkweDNmOWMyYmZhLCAweDA3MGRlMTcxLCAweDNjODRkNDk2LCAweDE0ZDFlMjQyLCAweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDNmODRjOGUxLCAweDA3ZDU5Mzk1LAotCTB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIDB4M2Y2YWYyZTMsIDB4MDg5Y2Y4NjcsIDB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsCi0JMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgzY2M1MTFkOCwgMHgxNDEzNWM5NCwKLQkweDNmMmZmMjQ5LCAweDBhMmFiYjU4LCAweDM4Y2YxNjY5LCAweDFkNzk3NzViLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDNmMGVjOWY0LCAweDBhZjEwYTIyLAotCTB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsCi0JMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzYTgyNjlhMiwgMHgxOWVmNzk0MywKLQkweDNlOWNjMDc2LCAweDBkNDE1MDEyLCAweDMzZGU4N2RlLCAweDI1N2RiNjRiLCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDNlNzFlNzU4LCAweDBlMDVjMTM1LAotCTB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIDB4M2U0NGE1ZWUsIDB4MGVjOWE3ZjIsIDB4MzBmODgwMWYsIDB4MjkzNDg5MzcsCi0JMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwKLQkweDNkZTJmMTQ3LCAweDEwNGZiODBlLCAweDJkY2U4OGE5LCAweDJjYjIzMjRiLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweDNkYWU4MWNlLCAweDExMTFkMjYyLAotCTB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIDB4M2Q3N2IxOTEsIDB4MTFkMzQ0M2YsIDB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzNDUzNGY0MCwgMHgyNGRhMGE5OSwKLQkweDNkMDJmNzU2LCAweDEzNTQxMGMyLCAweDI2YzBiMTYyLCAweDMyZWVmZGU5LCAweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweDNjYzUxMWQ4LCAweDE0MTM1Yzk0LAotCTB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsCi0JMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHgzYzQyNDIwOSwgMHgxNThmOWE3NSwgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHgzMDc2MWMxNywgMHgyOWNkOTU3NywKLQkweDNiZmQ1Y2M0LCAweDE2NGM3ZGRkLCAweDFlZGMxOTUyLCAweDM4MTE4ODRjLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDNiYjYyNzZkLCAweDE3MDg4NTMwLAotCTB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIDB4M2I2Y2E0YzQsIDB4MTdjM2E5MzEsIDB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsCi0JMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwKLQkweDNhZDJjMmU3LCAweDE5MzcyYTYzLCAweDE2NGM3ZGRkLCAweDNiZmQ1Y2M0LCAweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweDNhODI2OWEyLCAweDE5ZWY3OTQzLAotCTB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIDB4M2EyZmNlZTgsIDB4MWFhNmM4MmIsIDB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsCi0JMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyNzVmZjQ1MiwgMHgzMjc0NDQ5MywKLQkweDM5ODNlMWU3LCAweDFjMTI0OWQ4LCAweDBkNDE1MDEyLCAweDNlOWNjMDc2LCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweDM5MmE5NjQyLCAweDFjYzY2ZTk5LAotCTB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsCi0JMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyMjNkNjZhOCwgMHgzNjEyMTRiMCwKLQkweDM4MTE4ODRjLCAweDFlZGMxOTUyLCAweDAzZWNhZGNmLCAweDNmZTEyYWNiLCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweDM3YWY4MTU4LCAweDFmOGJhNGRiLAotCTB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIDB4Mzc0YjU0Y2UsIDB4MjAzOWY5MGUsIDB4ZmYzNmYxNzEsIDB4M2ZmZWM0MmQsCi0JMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHgzNmU1MDY4YSwgMHgyMGU3MGYzMiwgMHhmY2RjMTM0MiwgMHgzZmVjNDNjNiwgMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwKLQkweDM2N2M5YTdkLCAweDIxOTJlMDlhLCAweGZhODI0YmZlLCAweDNmYzM5NWY5LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweDM2MTIxNGIwLCAweDIyM2Q2NmE4LAotCTB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIDB4MzVhNTc5M2MsIDB4MjJlNjlhYzcsIDB4ZjVkNTQ0YTgsIDB4M2YyZmYyNDksCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxNzA4ODUzMCwgMHgzYmI2Mjc2ZCwKLQkweDM0YzYxMjM2LCAweDI0MzRmMzMyLCAweGYxMzY1ODBlLCAweDNlNDRhNWVlLCAweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweDM0NTM0ZjQwLCAweDI0ZGEwYTk5LAotCTB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4ZWNhYmVmM2UsIDB4M2QwMmY3NTYsCi0JMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgxMTExZDI2MiwgMHgzZGFlODFjZSwKLQkweDMyZWVmZGU5LCAweDI2YzBiMTYyLCAweGU4M2M1NmNmLCAweDNiNmNhNGM0LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDMyNzQ0NDkzLCAweDI3NWZmNDUyLAotCTB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIDB4MzFmNzk5NDcsIDB4MjdmZGIyYTYsIDB4ZTNlZGI2MjgsIDB4Mzk4M2UxZTcsCi0JMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwKLQkweDMwZjg4MDFmLCAweDI5MzQ4OTM3LCAweGRmYzYwNmYyLCAweDM3NGI1NGNlLCAweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweDMwNzYxYzE3LCAweDI5Y2Q5NTc3LAotCTB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIDB4MmZmMWQ5YzYsIDB4MmE2NTA1MjUsIDB4ZGJjYjBjY2UsIDB4MzRjNjEyMzYsCi0JMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHhkOWUwMTAwNywgMHgzMzY3YzA4ZiwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwKLQkweDJlZTNjZWJlLCAweDJiOGVmNzdjLCAweGQ4MDI0ZDVhLCAweDMxZjc5OTQ3LCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweDJlNWExMDZmLCAweDJjMjE2ZWFhLAotCTB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4ZDQ3MTA4ODQsIDB4MmVlM2NlYmUsCi0JMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmZTZkZWFhMSwgMHgzZmZiMTBjMSwKLQkweDJjYjIzMjRiLCAweDJkY2U4OGE5LCAweGQxMWMzMTQyLCAweDJiOGVmNzdjLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCAweDJjMjE2ZWFhLCAweDJlNWExMDZmLAotCTB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4ZmI0YWI3ZGMsIDB4M2ZkMzliNWEsIDB4MmI4ZWY3N2MsIDB4MmVlM2NlYmUsIDB4Y2UwODY2YjksIDB4MjdmZGIyYTYsCi0JMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywgMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwKLQkweDJhNjUwNTI1LCAweDJmZjFkOWM2LCAweGNiMzllZGNhLCAweDI0MzRmMzMyLCAweGY2OWJmN2M5LCAweDNmNGVhYWZlLCAweDI5Y2Q5NTc3LCAweDMwNzYxYzE3LAotCTB4YzllZGViNTAsIDB4MjIzZDY2YTgsIDB4ZjUwZWY1ZGUsIDB4M2YwZWM5ZjQsIDB4MjkzNDg5MzcsIDB4MzBmODgwMWYsIDB4YzhiNGFiMzIsIDB4MjAzOWY5MGUsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhmMWZhM2VjYiwgMHgzZTcxZTc1OCwKLQkweDI3ZmRiMmE2LCAweDMxZjc5OTQ3LCAweGM2N2MxZTE5LCAweDFjMTI0OWQ4LCAweGYwNzMwMzQzLCAweDNlMTRmZGY3LCAweDI3NWZmNDUyLCAweDMyNzQ0NDkzLAotCTB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4YzQ5MzViM2MsIDB4MTdjM2E5MzEsCi0JMHhlZDZiZjlkMiwgMHgzZDNlODJhZCwgMHgyNjFmZWZmOSwgMHgzMzY3YzA4ZiwgMHhjM2JkYmRmNywgMHgxNThmOWE3NSwgMHhlYmVjYTM2YywgMHgzY2M1MTFkOCwKLQkweDI1N2RiNjRiLCAweDMzZGU4N2RlLCAweGMyZmQwOGFhLCAweDEzNTQxMGMyLCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLAotCTB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIDB4ZThmNzdhZDAsIDB4M2JiNjI3NmQsIDB4MjQzNGYzMzIsIDB4MzRjNjEyMzYsIDB4YzFiYjVhMTIsIDB4MGVjOWE3ZjIsCi0JMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwKLQkweDIyZTY5YWM3LCAweDM1YTU3OTNjLCAweGMwZDAwZGI3LCAweDBhMmFiYjU4LCAweGU0YTJlZmY3LCAweDM5ZGFmNWU4LCAweDIyM2Q2NmE4LCAweDM2MTIxNGIwLAotCTB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4ZTMzOTkxNjcsIDB4MzkyYTk2NDIsIDB4MjE5MmUwOWEsIDB4MzY3YzlhN2QsIDB4YzAzYzZhMDcsIDB4MDU3ZGI0MDIsCi0JMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhlMDc0NWIyNSwgMHgzN2FmODE1OCwKLQkweDIwMzlmOTBlLCAweDM3NGI1NGNlLCAweGMwMDEzYmQzLCAweDAwYzkwZThmLCAweGRmMThmMGNlLCAweDM2ZTUwNjhhLCAweDFmOGJhNGRiLCAweDM3YWY4MTU4LAotCTB4YzAwNGVmM2YsIDB4ZmU2ZGVhYTEsIDB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4YzAxZWQ1MzUsIDB4ZmMxMzUyMzEsCi0JMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwgMHhkYjI1ZjU2NywgMHgzNDUzNGY0MCwKLQkweDFkNzk3NzViLCAweDM4Y2YxNjY5LCAweGMwOTUwZDFkLCAweGY3NjMwNzk5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCAweDFjYzY2ZTk5LCAweDM5MmE5NjQyLAotCTB4YzBmMTM2MGMsIDB4ZjUwZWY1ZGUsIDB4ZDhhMDBiYWUsIDB4MzI3NDQ0OTMsIDB4MWMxMjQ5ZDgsIDB4Mzk4M2UxZTcsIDB4YzE2MzNmOGEsIDB4ZjJiZWFmZWUsCi0JMHhkNzY2MTliNiwgMHgzMTc5MDBkNiwgMHgxYjVkMTAwOSwgMHgzOWRhZjVlOCwgMHhjMWViMDIwOSwgMHhmMDczMDM0MywgMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywKLQkweDFhYTZjODJiLCAweDNhMmZjZWU4LCAweGMyODg0ZTZmLCAweGVlMmNiYmMxLCAweGQ1MDUyZDk3LCAweDJmNmJiZTQ0LCAweDE5ZWY3OTQzLCAweDNhODI2OWEyLAotCTB4YzMzYWVlMjgsIDB4ZWJlY2EzNmMsIDB4ZDNkZTkxNTYsIDB4MmU1YTEwNmYsIDB4MTkzNzJhNjMsIDB4M2FkMmMyZTcsIDB4YzQwMmEzM2MsIDB4ZTliMzgyMjMsCi0JMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhkMWE1ZWY5MSwgMHgyYzIxNmVhYSwKLQkweDE3YzNhOTMxLCAweDNiNmNhNGM0LCAweGM1ZDAzMTE4LCAweGU1NTkzN2Q1LCAweGQwOTQ0MWJjLCAweDJhZmFkMjY5LCAweDE3MDg4NTMwLCAweDNiYjYyNzZkLAotCTB4YzZkNTY5YmUsIDB4ZTMzOTkxNjcsIDB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4YzdlZTc3YjQsIDB4ZTEyM2U2YWUsCi0JMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwgMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjZDhiYmI2ZCwgMHgyNzVmZjQ1MiwKLQkweDE0ZDFlMjQyLCAweDNjODRkNDk2LCAweGNhNWE4NmM0LCAweGRkMTk2NTM5LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LAotCTB4Y2JhY2IwYzAsIDB4ZGIyNWY1NjcsIDB4Y2JhY2IwYzAsIDB4MjRkYTBhOTksIDB4MTM1NDEwYzIsIDB4M2QwMmY3NTYsIDB4Y2QxMTAyMTcsIDB4ZDkzZjRlOWUsCi0JMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwKLQkweDExZDM0NDNmLCAweDNkNzdiMTkxLCAweGQwMGUyNjNhLCAweGQ1OWFmYWRiLCAweGM5MWFmOTc2LCAweDIwZTcwZjMyLCAweDExMTFkMjYyLCAweDNkYWU4MWNlLAotCTB4ZDFhNWVmOTEsIDB4ZDNkZTkxNTYsIDB4Yzg1MDdlYTgsIDB4MWY4YmE0ZGIsIDB4MTA0ZmI4MGUsIDB4M2RlMmYxNDcsIDB4ZDM0ZGNkYjUsIDB4ZDIzMTc3NTcsCi0JMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHhkNTA1MmQ5NywgMHhkMDk0NDFiYywgMHhjNmQ1NjliZSwgMHgxY2M2NmU5OSwKLQkweDBlYzlhN2YyLCAweDNlNDRhNWVlLCAweGQ2Y2I3NmM5LCAweGNmMDc3ZmUxLCAweGM2MjUwYTE4LCAweDFiNWQxMDA5LCAweDBlMDVjMTM1LCAweDNlNzFlNzU4LAotCTB4ZDhhMDBiYWUsIDB4Y2Q4YmJiNmQsIDB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4ZGE4MjQ5YjUsIDB4Y2MyMTc4MjIsCi0JMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjNDQ5ZDg5MywgMHgxNzA4ODUzMCwKLQkweDBiYjZlY2VmLCAweDNlZWIzMzQ3LCAweGRlNmQxZjY2LCAweGM5ODM2NTgzLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCAweDBhZjEwYTIyLCAweDNmMGVjOWY0LAotCTB4ZTA3NDViMjUsIDB4Yzg1MDdlYTgsIDB4YzMzYWVlMjgsIDB4MTQxMzVjOTQsIDB4MGEyYWJiNTgsIDB4M2YyZmYyNDksIDB4ZTI4Njg4YTUsIDB4YzczMGU5OTcsCi0JMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwgMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwKLQkweDA4OWNmODY3LCAweDNmNmFmMmUzLCAweGU2YzhkNTlkLCAweGM1MmQzZDE5LCAweGMxZWIwMjA5LCAweDBmOGNmY2JkLCAweDA3ZDU5Mzk1LCAweDNmODRjOGUxLAotCTB4ZThmNzdhZDAsIDB4YzQ0OWQ4OTMsIDB4YzE4ZTE4YTgsIDB4MGUwNWMxMzUsIDB4MDcwZGUxNzEsIDB4M2Y5YzJiZmEsIDB4ZWIyZTFkYmUsIDB4YzM3YjJiNmEsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MywgMHhjMGYxMzYwYywgMHgwYWYxMGEyMiwKLQkweDA1N2RiNDAyLCAweDNmYzM5NWY5LCAweGVmYjA0N2YyLCAweGMyMWQwZWI5LCAweGMwYjE1NTAyLCAweDA5NjQwODM3LCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLAotCTB4ZjFmYTNlY2IsIDB4YzE4ZTE4YTgsIDB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4ZjQ0OTEzMTEsIDB4YzExNGNjYjksCi0JMHhjMDRlZTRiOSwgMHgwNjQ1ZTlhZiwgMHgwMzIzZWNiZSwgMHgzZmVjNDNjNiwgMHhmNjliZjdjOSwgMHhjMGIxNTUwMiwgMHhjMDJjNjRhNiwgMHgwNGI1NDgyNCwKLQkweDAyNWIwY2FlLCAweDNmZjRlNWRmLCAweGY4ZjIxZThmLCAweGMwNjNkNDA2LCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweDAxOTIxNTVmLCAweDNmZmIxMGMxLAorCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZmYjEwYzEsIDB4MDE5MjE1NWYsIAorCTB4M2ZmZWM0MmQsIDB4MDBjOTBlOGYsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2ZmYjEwYzEsIDB4MDE5MjE1NWYsIAorCTB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsIAorCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2Y4NGM4ZTEsIDB4MDdkNTkzOTUsIAorCTB4M2ZlMTJhY2IsIDB4MDNlY2FkY2YsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIAorCTB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIDB4M2ZjMzk1ZjksIDB4MDU3ZGI0MDIsIDB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsIAorCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIAorCTB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4M2Y4NGM4ZTEsIDB4MDdkNTkzOTUsIAorCTB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIDB4M2Y2YWYyZTMsIDB4MDg5Y2Y4NjcsIDB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsIAorCTB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4M2NjNTExZDgsIDB4MTQxMzVjOTQsIAorCTB4M2YyZmYyNDksIDB4MGEyYWJiNTgsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIAorCTB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsIAorCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2E4MjY5YTIsIDB4MTllZjc5NDMsIAorCTB4M2U5Y2MwNzYsIDB4MGQ0MTUwMTIsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIAorCTB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIDB4M2U0NGE1ZWUsIDB4MGVjOWE3ZjIsIDB4MzBmODgwMWYsIDB4MjkzNDg5MzcsIAorCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIAorCTB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIAorCTB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIDB4M2Q3N2IxOTEsIDB4MTFkMzQ0M2YsIDB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsIAorCTB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzQ1MzRmNDAsIDB4MjRkYTBhOTksIAorCTB4M2QwMmY3NTYsIDB4MTM1NDEwYzIsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4M2NjNTExZDgsIDB4MTQxMzVjOTQsIAorCTB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsIAorCTB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4MzA3NjFjMTcsIDB4MjljZDk1NzcsIAorCTB4M2JmZDVjYzQsIDB4MTY0YzdkZGQsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIAorCTB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIDB4M2I2Y2E0YzQsIDB4MTdjM2E5MzEsIDB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsIAorCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIAorCTB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4M2E4MjY5YTIsIDB4MTllZjc5NDMsIAorCTB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIDB4M2EyZmNlZTgsIDB4MWFhNmM4MmIsIDB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsIAorCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4Mjc1ZmY0NTIsIDB4MzI3NDQ0OTMsIAorCTB4Mzk4M2UxZTcsIDB4MWMxMjQ5ZDgsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIAorCTB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsIAorCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MjIzZDY2YTgsIDB4MzYxMjE0YjAsIAorCTB4MzgxMTg4NGMsIDB4MWVkYzE5NTIsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIAorCTB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIDB4Mzc0YjU0Y2UsIDB4MjAzOWY5MGUsIDB4ZmYzNmYxNzEsIDB4M2ZmZWM0MmQsIAorCTB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIDB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIAorCTB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsIDB4ZmE4MjRiZmUsIDB4M2ZjMzk1ZjksIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIAorCTB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIDB4MzVhNTc5M2MsIDB4MjJlNjlhYzcsIDB4ZjVkNTQ0YTgsIDB4M2YyZmYyNDksIAorCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTcwODg1MzAsIDB4M2JiNjI3NmQsIAorCTB4MzRjNjEyMzYsIDB4MjQzNGYzMzIsIDB4ZjEzNjU4MGUsIDB4M2U0NGE1ZWUsIDB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4MzQ1MzRmNDAsIDB4MjRkYTBhOTksIAorCTB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4ZWNhYmVmM2UsIDB4M2QwMmY3NTYsIAorCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MTExMWQyNjIsIDB4M2RhZTgxY2UsIAorCTB4MzJlZWZkZTksIDB4MjZjMGIxNjIsIDB4ZTgzYzU2Y2YsIDB4M2I2Y2E0YzQsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIAorCTB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIDB4MzFmNzk5NDcsIDB4MjdmZGIyYTYsIDB4ZTNlZGI2MjgsIDB4Mzk4M2UxZTcsIAorCTB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIAorCTB4MzBmODgwMWYsIDB4MjkzNDg5MzcsIDB4ZGZjNjA2ZjIsIDB4Mzc0YjU0Y2UsIDB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4MzA3NjFjMTcsIDB4MjljZDk1NzcsIAorCTB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIDB4MmZmMWQ5YzYsIDB4MmE2NTA1MjUsIDB4ZGJjYjBjY2UsIDB4MzRjNjEyMzYsIAorCTB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIAorCTB4MmVlM2NlYmUsIDB4MmI4ZWY3N2MsIDB4ZDgwMjRkNWEsIDB4MzFmNzk5NDcsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIAorCTB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4ZDQ3MTA4ODQsIDB4MmVlM2NlYmUsIAorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZmU2ZGVhYTEsIDB4M2ZmYjEwYzEsIAorCTB4MmNiMjMyNGIsIDB4MmRjZTg4YTksIDB4ZDExYzMxNDIsIDB4MmI4ZWY3N2MsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIDB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIAorCTB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4ZmI0YWI3ZGMsIDB4M2ZkMzliNWEsIDB4MmI4ZWY3N2MsIDB4MmVlM2NlYmUsIDB4Y2UwODY2YjksIDB4MjdmZGIyYTYsIAorCTB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsIDB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIAorCTB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsIDB4Y2IzOWVkY2EsIDB4MjQzNGYzMzIsIDB4ZjY5YmY3YzksIDB4M2Y0ZWFhZmUsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIAorCTB4YzllZGViNTAsIDB4MjIzZDY2YTgsIDB4ZjUwZWY1ZGUsIDB4M2YwZWM5ZjQsIDB4MjkzNDg5MzcsIDB4MzBmODgwMWYsIDB4YzhiNGFiMzIsIDB4MjAzOWY5MGUsIAorCTB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZjFmYTNlY2IsIDB4M2U3MWU3NTgsIAorCTB4MjdmZGIyYTYsIDB4MzFmNzk5NDcsIDB4YzY3YzFlMTksIDB4MWMxMjQ5ZDgsIDB4ZjA3MzAzNDMsIDB4M2UxNGZkZjcsIDB4Mjc1ZmY0NTIsIDB4MzI3NDQ0OTMsIAorCTB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4YzQ5MzViM2MsIDB4MTdjM2E5MzEsIAorCTB4ZWQ2YmY5ZDIsIDB4M2QzZTgyYWQsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIDB4ZWJlY2EzNmMsIDB4M2NjNTExZDgsIAorCTB4MjU3ZGI2NGIsIDB4MzNkZTg3ZGUsIDB4YzJmZDA4YWEsIDB4MTM1NDEwYzIsIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIAorCTB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIDB4ZThmNzdhZDAsIDB4M2JiNjI3NmQsIDB4MjQzNGYzMzIsIDB4MzRjNjEyMzYsIDB4YzFiYjVhMTIsIDB4MGVjOWE3ZjIsIAorCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIAorCTB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsIDB4YzBkMDBkYjcsIDB4MGEyYWJiNTgsIDB4ZTRhMmVmZjcsIDB4MzlkYWY1ZTgsIDB4MjIzZDY2YTgsIDB4MzYxMjE0YjAsIAorCTB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4ZTMzOTkxNjcsIDB4MzkyYTk2NDIsIDB4MjE5MmUwOWEsIDB4MzY3YzlhN2QsIDB4YzAzYzZhMDcsIDB4MDU3ZGI0MDIsIAorCTB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4ZTA3NDViMjUsIDB4MzdhZjgxNTgsIAorCTB4MjAzOWY5MGUsIDB4Mzc0YjU0Y2UsIDB4YzAwMTNiZDMsIDB4MDBjOTBlOGYsIDB4ZGYxOGYwY2UsIDB4MzZlNTA2OGEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIAorCTB4YzAwNGVmM2YsIDB4ZmU2ZGVhYTEsIDB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4YzAxZWQ1MzUsIDB4ZmMxMzUyMzEsIAorCTB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIDB4ZGIyNWY1NjcsIDB4MzQ1MzRmNDAsIAorCTB4MWQ3OTc3NWIsIDB4MzhjZjE2NjksIDB4YzA5NTBkMWQsIDB4Zjc2MzA3OTksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIDB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIAorCTB4YzBmMTM2MGMsIDB4ZjUwZWY1ZGUsIDB4ZDhhMDBiYWUsIDB4MzI3NDQ0OTMsIDB4MWMxMjQ5ZDgsIDB4Mzk4M2UxZTcsIDB4YzE2MzNmOGEsIDB4ZjJiZWFmZWUsIAorCTB4ZDc2NjE5YjYsIDB4MzE3OTAwZDYsIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4YzFlYjAyMDksIDB4ZjA3MzAzNDMsIDB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIAorCTB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsIDB4YzI4ODRlNmYsIDB4ZWUyY2JiYzEsIDB4ZDUwNTJkOTcsIDB4MmY2YmJlNDQsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIAorCTB4YzMzYWVlMjgsIDB4ZWJlY2EzNmMsIDB4ZDNkZTkxNTYsIDB4MmU1YTEwNmYsIDB4MTkzNzJhNjMsIDB4M2FkMmMyZTcsIDB4YzQwMmEzM2MsIDB4ZTliMzgyMjMsIAorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4ZDFhNWVmOTEsIDB4MmMyMTZlYWEsIAorCTB4MTdjM2E5MzEsIDB4M2I2Y2E0YzQsIDB4YzVkMDMxMTgsIDB4ZTU1OTM3ZDUsIDB4ZDA5NDQxYmMsIDB4MmFmYWQyNjksIDB4MTcwODg1MzAsIDB4M2JiNjI3NmQsIAorCTB4YzZkNTY5YmUsIDB4ZTMzOTkxNjcsIDB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4YzdlZTc3YjQsIDB4ZTEyM2U2YWUsIAorCTB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsIDB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4YzkxYWY5NzYsIDB4ZGYxOGYwY2UsIDB4Y2Q4YmJiNmQsIDB4Mjc1ZmY0NTIsIAorCTB4MTRkMWUyNDIsIDB4M2M4NGQ0OTYsIDB4Y2E1YTg2YzQsIDB4ZGQxOTY1MzksIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIAorCTB4Y2JhY2IwYzAsIDB4ZGIyNWY1NjcsIDB4Y2JhY2IwYzAsIDB4MjRkYTBhOTksIDB4MTM1NDEwYzIsIDB4M2QwMmY3NTYsIDB4Y2QxMTAyMTcsIDB4ZDkzZjRlOWUsIAorCTB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzllZGViNTAsIDB4MjIzZDY2YTgsIAorCTB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsIDB4ZDAwZTI2M2EsIDB4ZDU5YWZhZGIsIDB4YzkxYWY5NzYsIDB4MjBlNzBmMzIsIDB4MTExMWQyNjIsIDB4M2RhZTgxY2UsIAorCTB4ZDFhNWVmOTEsIDB4ZDNkZTkxNTYsIDB4Yzg1MDdlYTgsIDB4MWY4YmE0ZGIsIDB4MTA0ZmI4MGUsIDB4M2RlMmYxNDcsIDB4ZDM0ZGNkYjUsIDB4ZDIzMTc3NTcsIAorCTB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4ZDUwNTJkOTcsIDB4ZDA5NDQxYmMsIDB4YzZkNTY5YmUsIDB4MWNjNjZlOTksIAorCTB4MGVjOWE3ZjIsIDB4M2U0NGE1ZWUsIDB4ZDZjYjc2YzksIDB4Y2YwNzdmZTEsIDB4YzYyNTBhMTgsIDB4MWI1ZDEwMDksIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIAorCTB4ZDhhMDBiYWUsIDB4Y2Q4YmJiNmQsIDB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4ZGE4MjQ5YjUsIDB4Y2MyMTc4MjIsIAorCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzQ0OWQ4OTMsIDB4MTcwODg1MzAsIAorCTB4MGJiNmVjZWYsIDB4M2VlYjMzNDcsIDB4ZGU2ZDFmNjYsIDB4Yzk4MzY1ODMsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIDB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIAorCTB4ZTA3NDViMjUsIDB4Yzg1MDdlYTgsIDB4YzMzYWVlMjgsIDB4MTQxMzVjOTQsIDB4MGEyYWJiNTgsIDB4M2YyZmYyNDksIDB4ZTI4Njg4YTUsIDB4YzczMGU5OTcsIAorCTB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsIDB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4ZTRhMmVmZjcsIDB4YzYyNTBhMTgsIDB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIAorCTB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsIDB4ZTZjOGQ1OWQsIDB4YzUyZDNkMTksIDB4YzFlYjAyMDksIDB4MGY4Y2ZjYmQsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIAorCTB4ZThmNzdhZDAsIDB4YzQ0OWQ4OTMsIDB4YzE4ZTE4YTgsIDB4MGUwNWMxMzUsIDB4MDcwZGUxNzEsIDB4M2Y5YzJiZmEsIDB4ZWIyZTFkYmUsIDB4YzM3YjJiNmEsIAorCTB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMsIDB4YzBmMTM2MGMsIDB4MGFmMTBhMjIsIAorCTB4MDU3ZGI0MDIsIDB4M2ZjMzk1ZjksIDB4ZWZiMDQ3ZjIsIDB4YzIxZDBlYjksIDB4YzBiMTU1MDIsIDB4MDk2NDA4MzcsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIAorCTB4ZjFmYTNlY2IsIDB4YzE4ZTE4YTgsIDB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4ZjQ0OTEzMTEsIDB4YzExNGNjYjksIAorCTB4YzA0ZWU0YjksIDB4MDY0NWU5YWYsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4ZjY5YmY3YzksIDB4YzBiMTU1MDIsIDB4YzAyYzY0YTYsIDB4MDRiNTQ4MjQsIAorCTB4MDI1YjBjYWUsIDB4M2ZmNGU1ZGYsIDB4ZjhmMjFlOGYsIDB4YzA2M2Q0MDYsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIAogCTB4ZmI0YWI3ZGMsIDB4YzAyYzY0YTYsIDB4YzAwNGVmM2YsIDB4MDE5MjE1NWYsIDB4MDBjOTBlOGYsIDB4M2ZmZWM0MmQsIDB4ZmRhNGYzNTIsIDB4YzAwYjFhMjEKIH07CiAKIGNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywKLQkweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgCisJMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgCisJMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgCiAKLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLAotCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLAotCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLAotCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwKLQkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLAotCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsCi0JMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MworCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIAorCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIAorCTB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIAorCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIAorCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIAorCTB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIAorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIAorCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIAorCTB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIAorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsIAorCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIAorCTB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMgCiB9OwogI2VuZGlmICAvL0FSTVY1RQogCi1jb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXSA9ewotCTB4MDBjOTdmZmYsIDB4MDI1YjdmZmEsIDB4MDNlZDdmZjEsIDB4MDU3ZjdmZTIsIDB4MDcxMTdmY2UsIDB4MDhhMjdmYjUsIDB4MGEzMzdmOTgsIDB4MGJjNDdmNzUsCi0JMHgwZDU0N2Y0ZSwgMHgwZWU0N2YyMiwgMHgxMDczN2VmMCwgMHgxMjAxN2ViYSwgMHgxMzhmN2U3ZiwgMHgxNTFjN2UzZiwgMHgxNmE4N2RmYiwgMHgxODMzN2RiMSwKLQkweDE5YmU3ZDYzLCAweDFiNDc3ZDBmLCAweDFjZDA3Y2I3LCAweDFlNTc3YzVhLCAweDFmZGQ3YmY5LCAweDIxNjI3YjkyLCAweDIyZTU3YjI3LCAweDI0Njc3YWI3LAotCTB4MjVlODdhNDIsIDB4Mjc2ODc5YzksIDB4MjhlNTc5NGEsIDB4MmE2Mjc4YzgsIDB4MmJkYzc4NDAsIDB4MmQ1NTc3YjQsIDB4MmVjYzc3MjMsIDB4MzA0Mjc2OGUsCi0JMHgzMWI1NzVmNCwgMHgzMzI3NzU1NiwgMHgzNDk3NzRiMywgMHgzNjA0NzQwYiwgMHgzNzcwNzM1ZiwgMHgzOGQ5NzJhZiwgMHgzYTQwNzFmYSwgMHgzYmE1NzE0MSwKLQkweDNkMDg3MDgzLCAweDNlNjg2ZmMyLCAweDNmYzY2ZWZiLCAweDQxMjE2ZTMxLCAweDQyN2E2ZDYyLCAweDQzZDE2YzhmLCAweDQ1MjQ2YmI4LCAweDQ2NzU2YWRkLAotCTB4NDdjNDY5ZmQsIDB4NDkwZjY5MWEsIDB4NGE1ODY4MzIsIDB4NGI5ZTY3NDcsIDB4NGNlMTY2NTcsIDB4NGUyMTY1NjQsIDB4NGY1ZTY0NmMsIDB4NTA5ODYzNzEsCitjb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXSA9eyAgCisJMHgwMGM5N2ZmZiwgMHgwMjViN2ZmYSwgMHgwM2VkN2ZmMSwgMHgwNTdmN2ZlMiwgMHgwNzExN2ZjZSwgMHgwOGEyN2ZiNSwgMHgwYTMzN2Y5OCwgMHgwYmM0N2Y3NSwgCisJMHgwZDU0N2Y0ZSwgMHgwZWU0N2YyMiwgMHgxMDczN2VmMCwgMHgxMjAxN2ViYSwgMHgxMzhmN2U3ZiwgMHgxNTFjN2UzZiwgMHgxNmE4N2RmYiwgMHgxODMzN2RiMSwgCisJMHgxOWJlN2Q2MywgMHgxYjQ3N2QwZiwgMHgxY2QwN2NiNywgMHgxZTU3N2M1YSwgMHgxZmRkN2JmOSwgMHgyMTYyN2I5MiwgMHgyMmU1N2IyNywgMHgyNDY3N2FiNywgCisJMHgyNWU4N2E0MiwgMHgyNzY4NzljOSwgMHgyOGU1Nzk0YSwgMHgyYTYyNzhjOCwgMHgyYmRjNzg0MCwgMHgyZDU1NzdiNCwgMHgyZWNjNzcyMywgMHgzMDQyNzY4ZSwgCisJMHgzMWI1NzVmNCwgMHgzMzI3NzU1NiwgMHgzNDk3NzRiMywgMHgzNjA0NzQwYiwgMHgzNzcwNzM1ZiwgMHgzOGQ5NzJhZiwgMHgzYTQwNzFmYSwgMHgzYmE1NzE0MSwgCisJMHgzZDA4NzA4MywgMHgzZTY4NmZjMiwgMHgzZmM2NmVmYiwgMHg0MTIxNmUzMSwgMHg0MjdhNmQ2MiwgMHg0M2QxNmM4ZiwgMHg0NTI0NmJiOCwgMHg0Njc1NmFkZCwgCisJMHg0N2M0NjlmZCwgMHg0OTBmNjkxYSwgMHg0YTU4NjgzMiwgMHg0YjllNjc0NywgMHg0Y2UxNjY1NywgMHg0ZTIxNjU2NCwgMHg0ZjVlNjQ2YywgMHg1MDk4NjM3MSwgCiAJMHg1MWNmNjI3MiwgMHg1MzAzNjE2ZiwgMHg1NDMzNjA2OCwgMHg1NTYwNWY1ZSwgMHg1NjhhNWU1MCwgMHg1N2IxNWQzZSwgMHg1OGQ0NWMyOSwgMHg1OWY0NWIxMAogfTsKIAotY29uc3QgaW50IExvbmdXaW5kb3dLQkRbRlJBTUVfTEVOX0xPTkcvMl09ewotCTB4MDAwYTdmZmYsIDB4MDAwZTdmZmYsIDB4MDAxMjdmZmYsIDB4MDAxNTdmZmYsIDB4MDAxOTdmZmYsIDB4MDAxYzdmZmYsIDB4MDAyMDdmZmYsIDB4MDAyMzdmZmYsCi0JMHgwMDI2N2ZmZiwgMHgwMDJhN2ZmZiwgMHgwMDJkN2ZmZiwgMHgwMDMwN2ZmZiwgMHgwMDM0N2ZmZiwgMHgwMDM4N2ZmZiwgMHgwMDNiN2ZmZiwgMHgwMDNmN2ZmZiwKLQkweDAwNDM3ZmZmLCAweDAwNDc3ZmZmLCAweDAwNGI3ZmZmLCAweDAwNGY3ZmZmLCAweDAwNTM3ZmZmLCAweDAwNTc3ZmZmLCAweDAwNWI3ZmZmLCAweDAwNjA3ZmZmLAotCTB4MDA2NDdmZmYsIDB4MDA2OTdmZmYsIDB4MDA2ZDdmZmYsIDB4MDA3MjdmZmYsIDB4MDA3NzdmZmYsIDB4MDA3YzdmZmYsIDB4MDA4MTdmZmYsIDB4MDA4NjdmZmYsCi0JMHgwMDhiN2ZmZiwgMHgwMDkxN2ZmZiwgMHgwMDk2N2ZmZiwgMHgwMDljN2ZmZiwgMHgwMGExN2ZmZiwgMHgwMGE3N2ZmZiwgMHgwMGFkN2ZmZiwgMHgwMGIzN2ZmZiwKLQkweDAwYjk3ZmZmLCAweDAwYmY3ZmZmLCAweDAwYzY3ZmZmLCAweDAwY2M3ZmZmLCAweDAwZDM3ZmZmLCAweDAwZGE3ZmZmLCAweDAwZTA3ZmZmLCAweDAwZTc3ZmZmLAotCTB4MDBlZTdmZmYsIDB4MDBmNTdmZmYsIDB4MDBmZDdmZmYsIDB4MDEwNDdmZmYsIDB4MDEwYzdmZmYsIDB4MDExMzdmZmYsIDB4MDExYjdmZmYsIDB4MDEyMzdmZmYsCi0JMHgwMTJiN2ZmZiwgMHgwMTMzN2ZmZiwgMHgwMTNjN2ZmZSwgMHgwMTQ0N2ZmZSwgMHgwMTRkN2ZmZSwgMHgwMTU2N2ZmZSwgMHgwMTVmN2ZmZSwgMHgwMTY4N2ZmZSwKLQkweDAxNzE3ZmZlLCAweDAxN2E3ZmZlLCAweDAxODM3ZmZlLCAweDAxOGQ3ZmZlLCAweDAxOTc3ZmZkLCAweDAxYTE3ZmZkLCAweDAxYWI3ZmZkLCAweDAxYjU3ZmZkLAotCTB4MDFiZjdmZmQsIDB4MDFjYTdmZmQsIDB4MDFkNDdmZmQsIDB4MDFkZjdmZmMsIDB4MDFlYTdmZmMsIDB4MDFmNTdmZmMsIDB4MDIwMDdmZmMsIDB4MDIwYzdmZmMsCi0JMHgwMjE3N2ZmYywgMHgwMjIzN2ZmYiwgMHgwMjJmN2ZmYiwgMHgwMjNiN2ZmYiwgMHgwMjQ3N2ZmYiwgMHgwMjUzN2ZmYiwgMHgwMjYwN2ZmYSwgMHgwMjZkN2ZmYSwKLQkweDAyN2E3ZmZhLCAweDAyODc3ZmZhLCAweDAyOTQ3ZmY5LCAweDAyYTE3ZmY5LCAweDAyYWY3ZmY5LCAweDAyYmM3ZmY5LCAweDAyY2E3ZmY4LCAweDAyZDg3ZmY4LAotCTB4MDJlNzdmZjgsIDB4MDJmNTdmZjcsIDB4MDMwNDdmZjcsIDB4MDMxMjdmZjcsIDB4MDMyMTdmZjYsIDB4MDMzMTdmZjYsIDB4MDM0MDdmZjUsIDB4MDM0ZjdmZjUsCi0JMHgwMzVmN2ZmNSwgMHgwMzZmN2ZmNCwgMHgwMzdmN2ZmNCwgMHgwMzhmN2ZmMywgMHgwM2EwN2ZmMywgMHgwM2IwN2ZmMiwgMHgwM2MxN2ZmMiwgMHgwM2QyN2ZmMSwKLQkweDAzZTM3ZmYxLCAweDAzZjU3ZmYwLCAweDA0MDY3ZmYwLCAweDA0MTg3ZmVmLCAweDA0MmE3ZmVmLCAweDA0M2M3ZmVlLCAweDA0NGY3ZmVkLCAweDA0NjE3ZmVkLAotCTB4MDQ3NDdmZWMsIDB4MDQ4NzdmZWIsIDB4MDQ5YTdmZWIsIDB4MDRhZTdmZWEsIDB4MDRjMTdmZTksIDB4MDRkNTdmZTksIDB4MDRlOTdmZTgsIDB4MDRmZDdmZTcsCi0JMHgwNTEyN2ZlNiwgMHgwNTI3N2ZlNSwgMHgwNTNiN2ZlNSwgMHgwNTUwN2ZlNCwgMHgwNTY2N2ZlMywgMHgwNTdiN2ZlMiwgMHgwNTkxN2ZlMSwgMHgwNWE3N2ZlMCwKLQkweDA1YmQ3ZmRmLCAweDA1ZDM3ZmRlLCAweDA1ZWE3ZmRkLCAweDA2MDE3ZmRjLCAweDA2MTg3ZmRiLCAweDA2MmY3ZmRhLCAweDA2NDY3ZmQ5LCAweDA2NWU3ZmQ3LAotCTB4MDY3NjdmZDYsIDB4MDY4ZTdmZDUsIDB4MDZhNjdmZDQsIDB4MDZiZjdmZDIsIDB4MDZkODdmZDEsIDB4MDZmMTdmZDAsIDB4MDcwYTdmY2UsIDB4MDcyMzdmY2QsCi0JMHgwNzNkN2ZjYywgMHgwNzU3N2ZjYSwgMHgwNzcxN2ZjOSwgMHgwNzhjN2ZjNywgMHgwN2E2N2ZjNSwgMHgwN2MxN2ZjNCwgMHgwN2RjN2ZjMiwgMHgwN2Y3N2ZjMCwKLQkweDA4MTM3ZmJmLCAweDA4MmY3ZmJkLCAweDA4NGI3ZmJiLCAweDA4Njc3ZmI5LCAweDA4ODQ3ZmI3LCAweDA4YTA3ZmI2LCAweDA4YmQ3ZmI0LCAweDA4ZGE3ZmIyLAotCTB4MDhmODdmYWYsIDB4MDkxNjdmYWQsIDB4MDkzNDdmYWIsIDB4MDk1MjdmYTksIDB4MDk3MDdmYTcsIDB4MDk4ZjdmYTUsIDB4MDlhZTdmYTIsIDB4MDljZDdmYTAsCi0JMHgwOWVjN2Y5ZCwgMHgwYTBjN2Y5YiwgMHgwYTJjN2Y5OCwgMHgwYTRjN2Y5NiwgMHgwYTZjN2Y5MywgMHgwYThkN2Y5MSwgMHgwYWFlN2Y4ZSwgMHgwYWNmN2Y4YiwKLQkweDBhZjA3Zjg4LCAweDBiMTI3Zjg1LCAweDBiMzM3ZjgyLCAweDBiNTU3ZjdmLCAweDBiNzg3ZjdjLCAweDBiOWE3Zjc5LCAweDBiYmQ3Zjc2LCAweDBiZTA3ZjczLAotCTB4MGMwNDdmNmYsIDB4MGMyNzdmNmMsIDB4MGM0YjdmNjksIDB4MGM2ZjdmNjUsIDB4MGM5MzdmNjEsIDB4MGNiODdmNWUsIDB4MGNkZDdmNWEsIDB4MGQwMjdmNTYsCi0JMHgwZDI3N2Y1MywgMHgwZDRkN2Y0ZiwgMHgwZDczN2Y0YiwgMHgwZDk5N2Y0NywgMHgwZGJmN2Y0MywgMHgwZGU2N2YzZSwgMHgwZTBjN2YzYSwgMHgwZTM0N2YzNiwKLQkweDBlNWI3ZjMxLCAweDBlODM3ZjJkLCAweDBlYWE3ZjI4LCAweDBlZDM3ZjI0LCAweDBlZmI3ZjFmLCAweDBmMjM3ZjFhLCAweDBmNGM3ZjE1LCAweDBmNzU3ZjEwLAotCTB4MGY5ZjdmMGIsIDB4MGZjODdmMDYsIDB4MGZmMjdmMDEsIDB4MTAxYzdlZmIsIDB4MTA0NzdlZjYsIDB4MTA3MTdlZjAsIDB4MTA5YzdlZWIsIDB4MTBjODdlZTUsCi0JMHgxMGYzN2VkZiwgMHgxMTFmN2VkYSwgMHgxMTRhN2VkNCwgMHgxMTc3N2VjZSwgMHgxMWEzN2VjNywgMHgxMWQwN2VjMSwgMHgxMWZkN2ViYiwgMHgxMjJhN2ViNCwKLQkweDEyNTc3ZWFlLCAweDEyODU3ZWE3LCAweDEyYjM3ZWEwLCAweDEyZTE3ZTlhLCAweDEzMGY3ZTkzLCAweDEzM2U3ZThjLCAweDEzNmQ3ZTg0LCAweDEzOWM3ZTdkLAotCTB4MTNjYzdlNzYsIDB4MTNmYjdlNmUsIDB4MTQyYjdlNjcsIDB4MTQ1YjdlNWYsIDB4MTQ4YzdlNTcsIDB4MTRiYzdlNGYsIDB4MTRlZDdlNDcsIDB4MTUxZTdlM2YsCi0JMHgxNTUwN2UzNywgMHgxNTgxN2UyZSwgMHgxNWIzN2UyNiwgMHgxNWU1N2UxZCwgMHgxNjE4N2UxNCwgMHgxNjRhN2UwYiwgMHgxNjdkN2UwMiwgMHgxNmIwN2RmOSwKLQkweDE2ZTQ3ZGYwLCAweDE3MTc3ZGU2LCAweDE3NGI3ZGRkLCAweDE3N2Y3ZGQzLCAweDE3YjM3ZGM5LCAweDE3ZTg3ZGJmLCAweDE4MWQ3ZGI1LCAweDE4NTI3ZGFiLAotCTB4MTg4NzdkYTEsIDB4MThiYzdkOTYsIDB4MThmMjdkOGMsIDB4MTkyODdkODEsIDB4MTk1ZTdkNzYsIDB4MTk5NTdkNmIsIDB4MTljYjdkNjAsIDB4MWEwMjdkNTQsCi0JMHgxYTM5N2Q0OSwgMHgxYTcxN2QzZCwgMHgxYWE4N2QzMSwgMHgxYWUwN2QyNiwgMHgxYjE4N2QxOSwgMHgxYjUwN2QwZCwgMHgxYjg5N2QwMSwgMHgxYmMyN2NmNCwKLQkweDFiZmI3Y2U4LCAweDFjMzQ3Y2RiLCAweDFjNmQ3Y2NlLCAweDFjYTc3Y2MxLCAweDFjZTE3Y2IzLCAweDFkMWI3Y2E2LCAweDFkNTU3Yzk4LCAweDFkOGY3YzhhLAotCTB4MWRjYTdjN2MsIDB4MWUwNTdjNmUsIDB4MWU0MDdjNjAsIDB4MWU3YjdjNTEsIDB4MWViNzdjNDMsIDB4MWVmMzdjMzQsIDB4MWYyZjdjMjUsIDB4MWY2YjdjMTYsCi0JMHgxZmE3N2MwNiwgMHgxZmU0N2JmNywgMHgyMDIxN2JlNywgMHgyMDVlN2JkNywgMHgyMDliN2JjNywgMHgyMGQ4N2JiNywgMHgyMTE2N2JhNiwgMHgyMTU0N2I5NiwKLQkweDIxOTI3Yjg1LCAweDIxZDA3Yjc0LCAweDIyMGU3YjYzLCAweDIyNGQ3YjUyLCAweDIyOGM3YjQwLCAweDIyY2I3YjJlLCAweDIzMGE3YjFjLCAweDIzNDk3YjBhLAotCTB4MjM4OTdhZjgsIDB4MjNjODdhZTYsIDB4MjQwODdhZDMsIDB4MjQ0ODdhYzAsIDB4MjQ4OTdhYWQsIDB4MjRjOTdhOWEsIDB4MjUwYTdhODYsIDB4MjU0YjdhNzMsCi0JMHgyNThjN2E1ZiwgMHgyNWNkN2E0YiwgMHgyNjBlN2EzNiwgMHgyNjUwN2EyMiwgMHgyNjkxN2EwZCwgMHgyNmQzNzlmOCwgMHgyNzE1NzllMywgMHgyNzU3NzljZSwKLQkweDI3OWE3OWI4LCAweDI3ZGM3OWEzLCAweDI4MWY3OThkLCAweDI4NjI3OTc3LCAweDI4YTU3OTYwLCAweDI4ZTg3OTRhLCAweDI5MmI3OTMzLCAweDI5NmY3OTFjLAotCTB4MjliMjc5MDUsIDB4MjlmNjc4ZWQsIDB4MmEzYTc4ZDYsIDB4MmE3ZTc4YmUsIDB4MmFjMjc4YTYsIDB4MmIwNzc4OGQsIDB4MmI0Yjc4NzUsIDB4MmI5MDc4NWMsCi0JMHgyYmQ0Nzg0MywgMHgyYzE5NzgyYSwgMHgyYzVlNzgxMCwgMHgyY2E0NzdmNywgMHgyY2U5NzdkZCwgMHgyZDJlNzdjMywgMHgyZDc0NzdhOCwgMHgyZGJhNzc4ZSwKLQkweDJkZmY3NzczLCAweDJlNDU3NzU4LCAweDJlOGI3NzNkLCAweDJlZDI3NzIxLCAweDJmMTg3NzA2LCAweDJmNWU3NmVhLCAweDJmYTU3NmNkLCAweDJmZWM3NmIxLAotCTB4MzAzMjc2OTQsIDB4MzA3OTc2NzcsIDB4MzBjMDc2NWEsIDB4MzEwNzc2M2QsIDB4MzE0ZTc2MWYsIDB4MzE5Njc2MDEsIDB4MzFkZDc1ZTMsIDB4MzIyNTc1YzUsCi0JMHgzMjZjNzVhNiwgMHgzMmI0NzU4OCwgMHgzMmZjNzU2OSwgMHgzMzQ0NzU0OSwgMHgzMzhjNzUyYSwgMHgzM2Q0NzUwYSwgMHgzNDFjNzRlYSwgMHgzNDY0NzRjYSwKLQkweDM0YWM3NGE5LCAweDM0ZjU3NDg4LCAweDM1M2Q3NDY3LCAweDM1ODU3NDQ2LCAweDM1Y2U3NDI0LCAweDM2MTc3NDAzLCAweDM2NWY3M2UxLCAweDM2YTg3M2JlLAotCTB4MzZmMTczOWMsIDB4MzczYTczNzksIDB4Mzc4MzczNTYsIDB4MzdjYzczMzMsIDB4MzgxNTczMGYsIDB4Mzg1ZTcyZWMsIDB4MzhhNzcyYzgsIDB4MzhmMTcyYTMsCi0JMHgzOTNhNzI3ZiwgMHgzOTgzNzI1YSwgMHgzOWNkNzIzNSwgMHgzYTE2NzIxMCwgMHgzYTYwNzFlYSwgMHgzYWE5NzFjNCwgMHgzYWYzNzE5ZSwgMHgzYjNjNzE3OCwKLQkweDNiODY3MTUxLCAweDNiZDA3MTJiLCAweDNjMTk3MTA0LCAweDNjNjM3MGRjLCAweDNjYWQ3MGI1LCAweDNjZjc3MDhkLCAweDNkNDA3MDY1LCAweDNkOGE3MDNjLAotCTB4M2RkNDcwMTQsIDB4M2UxZTZmZWIsIDB4M2U2ODZmYzIsIDB4M2ViMTZmOTgsIDB4M2VmYjZmNmYsIDB4M2Y0NTZmNDUsIDB4M2Y4ZjZmMWIsIDB4M2ZkOTZlZjAsCi0JMHg0MDIzNmVjNiwgMHg0MDZkNmU5YiwgMHg0MGI2NmU3MCwgMHg0MTAwNmU0NCwgMHg0MTRhNmUxOSwgMHg0MTk0NmRlZCwgMHg0MWRlNmRjMSwgMHg0MjI4NmQ5NCwKLQkweDQyNzE2ZDY4LCAweDQyYmI2ZDNiLCAweDQzMDU2ZDBkLCAweDQzNGY2Y2UwLCAweDQzOTg2Y2IyLCAweDQzZTI2Yzg0LCAweDQ0MmM2YzU2LCAweDQ0NzU2YzI4LAotCTB4NDRiZjZiZjksIDB4NDUwODZiY2EsIDB4NDU1MjZiOWIsIDB4NDU5YjZiNmIsIDB4NDVlNTZiM2MsIDB4NDYyZTZiMGMsIDB4NDY3ODZhZGIsIDB4NDZjMTZhYWIsCi0JMHg0NzBhNmE3YSwgMHg0NzUzNmE0OSwgMHg0NzljNmExOCwgMHg0N2U1NjllNywgMHg0ODJlNjliNSwgMHg0ODc3Njk4MywgMHg0OGMwNjk1MSwgMHg0OTA5NjkxZSwKLQkweDQ5NTI2OGVjLCAweDQ5OWI2OGI5LCAweDQ5ZTM2ODg1LCAweDRhMmM2ODUyLCAweDRhNzQ2ODFlLCAweDRhYmQ2N2VhLCAweDRiMDU2N2I2LCAweDRiNGQ2NzgyLAotCTB4NGI5NTY3NGQsIDB4NGJkZTY3MTgsIDB4NGMyNjY2ZTMsIDB4NGM2ZDY2YWUsIDB4NGNiNTY2NzgsIDB4NGNmZDY2NDIsIDB4NGQ0NTY2MGMsIDB4NGQ4YzY1ZDYsCi0JMHg0ZGQ0NjU5ZiwgMHg0ZTFiNjU2OCwgMHg0ZTYyNjUzMSwgMHg0ZWE5NjRmYSwgMHg0ZWYwNjRjMywgMHg0ZjM3NjQ4YiwgMHg0ZjdlNjQ1MywgMHg0ZmM1NjQxYiwKLQkweDUwMGI2M2UyLCAweDUwNTI2M2FhLCAweDUwOTg2MzcxLCAweDUwZGY2MzM4LCAweDUxMjU2MmZlLCAweDUxNmI2MmM1LCAweDUxYjE2MjhiLCAweDUxZjY2MjUxLAotCTB4NTIzYzYyMTcsIDB4NTI4MTYxZGMsIDB4NTJjNzYxYTIsIDB4NTMwYzYxNjcsIDB4NTM1MTYxMmMsIDB4NTM5NjYwZjEsIDB4NTNkYjYwYjUsIDB4NTQyMDYwNzksCi0JMHg1NDY0NjAzZCwgMHg1NGE5NjAwMSwgMHg1NGVkNWZjNSwgMHg1NTMxNWY4OCwgMHg1NTc1NWY0YiwgMHg1NWI5NWYwZSwgMHg1NWZjNWVkMSwgMHg1NjQwNWU5NCwKLQkweDU2ODM1ZTU2LCAweDU2Yzc1ZTE4LCAweDU3MGE1ZGRhLCAweDU3NGQ1ZDljLCAweDU3OGY1ZDVlLCAweDU3ZDI1ZDFmLCAweDU4MTQ1Y2UwLCAweDU4NTY1Y2ExLAorY29uc3QgaW50IExvbmdXaW5kb3dLQkRbRlJBTUVfTEVOX0xPTkcvMl09eyAgCisJMHgwMDBhN2ZmZiwgMHgwMDBlN2ZmZiwgMHgwMDEyN2ZmZiwgMHgwMDE1N2ZmZiwgMHgwMDE5N2ZmZiwgMHgwMDFjN2ZmZiwgMHgwMDIwN2ZmZiwgMHgwMDIzN2ZmZiwgCisJMHgwMDI2N2ZmZiwgMHgwMDJhN2ZmZiwgMHgwMDJkN2ZmZiwgMHgwMDMwN2ZmZiwgMHgwMDM0N2ZmZiwgMHgwMDM4N2ZmZiwgMHgwMDNiN2ZmZiwgMHgwMDNmN2ZmZiwgCisJMHgwMDQzN2ZmZiwgMHgwMDQ3N2ZmZiwgMHgwMDRiN2ZmZiwgMHgwMDRmN2ZmZiwgMHgwMDUzN2ZmZiwgMHgwMDU3N2ZmZiwgMHgwMDViN2ZmZiwgMHgwMDYwN2ZmZiwgCisJMHgwMDY0N2ZmZiwgMHgwMDY5N2ZmZiwgMHgwMDZkN2ZmZiwgMHgwMDcyN2ZmZiwgMHgwMDc3N2ZmZiwgMHgwMDdjN2ZmZiwgMHgwMDgxN2ZmZiwgMHgwMDg2N2ZmZiwgCisJMHgwMDhiN2ZmZiwgMHgwMDkxN2ZmZiwgMHgwMDk2N2ZmZiwgMHgwMDljN2ZmZiwgMHgwMGExN2ZmZiwgMHgwMGE3N2ZmZiwgMHgwMGFkN2ZmZiwgMHgwMGIzN2ZmZiwgCisJMHgwMGI5N2ZmZiwgMHgwMGJmN2ZmZiwgMHgwMGM2N2ZmZiwgMHgwMGNjN2ZmZiwgMHgwMGQzN2ZmZiwgMHgwMGRhN2ZmZiwgMHgwMGUwN2ZmZiwgMHgwMGU3N2ZmZiwgCisJMHgwMGVlN2ZmZiwgMHgwMGY1N2ZmZiwgMHgwMGZkN2ZmZiwgMHgwMTA0N2ZmZiwgMHgwMTBjN2ZmZiwgMHgwMTEzN2ZmZiwgMHgwMTFiN2ZmZiwgMHgwMTIzN2ZmZiwgCisJMHgwMTJiN2ZmZiwgMHgwMTMzN2ZmZiwgMHgwMTNjN2ZmZSwgMHgwMTQ0N2ZmZSwgMHgwMTRkN2ZmZSwgMHgwMTU2N2ZmZSwgMHgwMTVmN2ZmZSwgMHgwMTY4N2ZmZSwgCisJMHgwMTcxN2ZmZSwgMHgwMTdhN2ZmZSwgMHgwMTgzN2ZmZSwgMHgwMThkN2ZmZSwgMHgwMTk3N2ZmZCwgMHgwMWExN2ZmZCwgMHgwMWFiN2ZmZCwgMHgwMWI1N2ZmZCwgCisJMHgwMWJmN2ZmZCwgMHgwMWNhN2ZmZCwgMHgwMWQ0N2ZmZCwgMHgwMWRmN2ZmYywgMHgwMWVhN2ZmYywgMHgwMWY1N2ZmYywgMHgwMjAwN2ZmYywgMHgwMjBjN2ZmYywgCisJMHgwMjE3N2ZmYywgMHgwMjIzN2ZmYiwgMHgwMjJmN2ZmYiwgMHgwMjNiN2ZmYiwgMHgwMjQ3N2ZmYiwgMHgwMjUzN2ZmYiwgMHgwMjYwN2ZmYSwgMHgwMjZkN2ZmYSwgCisJMHgwMjdhN2ZmYSwgMHgwMjg3N2ZmYSwgMHgwMjk0N2ZmOSwgMHgwMmExN2ZmOSwgMHgwMmFmN2ZmOSwgMHgwMmJjN2ZmOSwgMHgwMmNhN2ZmOCwgMHgwMmQ4N2ZmOCwgCisJMHgwMmU3N2ZmOCwgMHgwMmY1N2ZmNywgMHgwMzA0N2ZmNywgMHgwMzEyN2ZmNywgMHgwMzIxN2ZmNiwgMHgwMzMxN2ZmNiwgMHgwMzQwN2ZmNSwgMHgwMzRmN2ZmNSwgCisJMHgwMzVmN2ZmNSwgMHgwMzZmN2ZmNCwgMHgwMzdmN2ZmNCwgMHgwMzhmN2ZmMywgMHgwM2EwN2ZmMywgMHgwM2IwN2ZmMiwgMHgwM2MxN2ZmMiwgMHgwM2QyN2ZmMSwgCisJMHgwM2UzN2ZmMSwgMHgwM2Y1N2ZmMCwgMHgwNDA2N2ZmMCwgMHgwNDE4N2ZlZiwgMHgwNDJhN2ZlZiwgMHgwNDNjN2ZlZSwgMHgwNDRmN2ZlZCwgMHgwNDYxN2ZlZCwgCisJMHgwNDc0N2ZlYywgMHgwNDg3N2ZlYiwgMHgwNDlhN2ZlYiwgMHgwNGFlN2ZlYSwgMHgwNGMxN2ZlOSwgMHgwNGQ1N2ZlOSwgMHgwNGU5N2ZlOCwgMHgwNGZkN2ZlNywgCisJMHgwNTEyN2ZlNiwgMHgwNTI3N2ZlNSwgMHgwNTNiN2ZlNSwgMHgwNTUwN2ZlNCwgMHgwNTY2N2ZlMywgMHgwNTdiN2ZlMiwgMHgwNTkxN2ZlMSwgMHgwNWE3N2ZlMCwgCisJMHgwNWJkN2ZkZiwgMHgwNWQzN2ZkZSwgMHgwNWVhN2ZkZCwgMHgwNjAxN2ZkYywgMHgwNjE4N2ZkYiwgMHgwNjJmN2ZkYSwgMHgwNjQ2N2ZkOSwgMHgwNjVlN2ZkNywgCisJMHgwNjc2N2ZkNiwgMHgwNjhlN2ZkNSwgMHgwNmE2N2ZkNCwgMHgwNmJmN2ZkMiwgMHgwNmQ4N2ZkMSwgMHgwNmYxN2ZkMCwgMHgwNzBhN2ZjZSwgMHgwNzIzN2ZjZCwgCisJMHgwNzNkN2ZjYywgMHgwNzU3N2ZjYSwgMHgwNzcxN2ZjOSwgMHgwNzhjN2ZjNywgMHgwN2E2N2ZjNSwgMHgwN2MxN2ZjNCwgMHgwN2RjN2ZjMiwgMHgwN2Y3N2ZjMCwgCisJMHgwODEzN2ZiZiwgMHgwODJmN2ZiZCwgMHgwODRiN2ZiYiwgMHgwODY3N2ZiOSwgMHgwODg0N2ZiNywgMHgwOGEwN2ZiNiwgMHgwOGJkN2ZiNCwgMHgwOGRhN2ZiMiwgCisJMHgwOGY4N2ZhZiwgMHgwOTE2N2ZhZCwgMHgwOTM0N2ZhYiwgMHgwOTUyN2ZhOSwgMHgwOTcwN2ZhNywgMHgwOThmN2ZhNSwgMHgwOWFlN2ZhMiwgMHgwOWNkN2ZhMCwgCisJMHgwOWVjN2Y5ZCwgMHgwYTBjN2Y5YiwgMHgwYTJjN2Y5OCwgMHgwYTRjN2Y5NiwgMHgwYTZjN2Y5MywgMHgwYThkN2Y5MSwgMHgwYWFlN2Y4ZSwgMHgwYWNmN2Y4YiwgCisJMHgwYWYwN2Y4OCwgMHgwYjEyN2Y4NSwgMHgwYjMzN2Y4MiwgMHgwYjU1N2Y3ZiwgMHgwYjc4N2Y3YywgMHgwYjlhN2Y3OSwgMHgwYmJkN2Y3NiwgMHgwYmUwN2Y3MywgCisJMHgwYzA0N2Y2ZiwgMHgwYzI3N2Y2YywgMHgwYzRiN2Y2OSwgMHgwYzZmN2Y2NSwgMHgwYzkzN2Y2MSwgMHgwY2I4N2Y1ZSwgMHgwY2RkN2Y1YSwgMHgwZDAyN2Y1NiwgCisJMHgwZDI3N2Y1MywgMHgwZDRkN2Y0ZiwgMHgwZDczN2Y0YiwgMHgwZDk5N2Y0NywgMHgwZGJmN2Y0MywgMHgwZGU2N2YzZSwgMHgwZTBjN2YzYSwgMHgwZTM0N2YzNiwgCisJMHgwZTViN2YzMSwgMHgwZTgzN2YyZCwgMHgwZWFhN2YyOCwgMHgwZWQzN2YyNCwgMHgwZWZiN2YxZiwgMHgwZjIzN2YxYSwgMHgwZjRjN2YxNSwgMHgwZjc1N2YxMCwgCisJMHgwZjlmN2YwYiwgMHgwZmM4N2YwNiwgMHgwZmYyN2YwMSwgMHgxMDFjN2VmYiwgMHgxMDQ3N2VmNiwgMHgxMDcxN2VmMCwgMHgxMDljN2VlYiwgMHgxMGM4N2VlNSwgCisJMHgxMGYzN2VkZiwgMHgxMTFmN2VkYSwgMHgxMTRhN2VkNCwgMHgxMTc3N2VjZSwgMHgxMWEzN2VjNywgMHgxMWQwN2VjMSwgMHgxMWZkN2ViYiwgMHgxMjJhN2ViNCwgCisJMHgxMjU3N2VhZSwgMHgxMjg1N2VhNywgMHgxMmIzN2VhMCwgMHgxMmUxN2U5YSwgMHgxMzBmN2U5MywgMHgxMzNlN2U4YywgMHgxMzZkN2U4NCwgMHgxMzljN2U3ZCwgCisJMHgxM2NjN2U3NiwgMHgxM2ZiN2U2ZSwgMHgxNDJiN2U2NywgMHgxNDViN2U1ZiwgMHgxNDhjN2U1NywgMHgxNGJjN2U0ZiwgMHgxNGVkN2U0NywgMHgxNTFlN2UzZiwgCisJMHgxNTUwN2UzNywgMHgxNTgxN2UyZSwgMHgxNWIzN2UyNiwgMHgxNWU1N2UxZCwgMHgxNjE4N2UxNCwgMHgxNjRhN2UwYiwgMHgxNjdkN2UwMiwgMHgxNmIwN2RmOSwgCisJMHgxNmU0N2RmMCwgMHgxNzE3N2RlNiwgMHgxNzRiN2RkZCwgMHgxNzdmN2RkMywgMHgxN2IzN2RjOSwgMHgxN2U4N2RiZiwgMHgxODFkN2RiNSwgMHgxODUyN2RhYiwgCisJMHgxODg3N2RhMSwgMHgxOGJjN2Q5NiwgMHgxOGYyN2Q4YywgMHgxOTI4N2Q4MSwgMHgxOTVlN2Q3NiwgMHgxOTk1N2Q2YiwgMHgxOWNiN2Q2MCwgMHgxYTAyN2Q1NCwgCisJMHgxYTM5N2Q0OSwgMHgxYTcxN2QzZCwgMHgxYWE4N2QzMSwgMHgxYWUwN2QyNiwgMHgxYjE4N2QxOSwgMHgxYjUwN2QwZCwgMHgxYjg5N2QwMSwgMHgxYmMyN2NmNCwgCisJMHgxYmZiN2NlOCwgMHgxYzM0N2NkYiwgMHgxYzZkN2NjZSwgMHgxY2E3N2NjMSwgMHgxY2UxN2NiMywgMHgxZDFiN2NhNiwgMHgxZDU1N2M5OCwgMHgxZDhmN2M4YSwgCisJMHgxZGNhN2M3YywgMHgxZTA1N2M2ZSwgMHgxZTQwN2M2MCwgMHgxZTdiN2M1MSwgMHgxZWI3N2M0MywgMHgxZWYzN2MzNCwgMHgxZjJmN2MyNSwgMHgxZjZiN2MxNiwgCisJMHgxZmE3N2MwNiwgMHgxZmU0N2JmNywgMHgyMDIxN2JlNywgMHgyMDVlN2JkNywgMHgyMDliN2JjNywgMHgyMGQ4N2JiNywgMHgyMTE2N2JhNiwgMHgyMTU0N2I5NiwgCisJMHgyMTkyN2I4NSwgMHgyMWQwN2I3NCwgMHgyMjBlN2I2MywgMHgyMjRkN2I1MiwgMHgyMjhjN2I0MCwgMHgyMmNiN2IyZSwgMHgyMzBhN2IxYywgMHgyMzQ5N2IwYSwgCisJMHgyMzg5N2FmOCwgMHgyM2M4N2FlNiwgMHgyNDA4N2FkMywgMHgyNDQ4N2FjMCwgMHgyNDg5N2FhZCwgMHgyNGM5N2E5YSwgMHgyNTBhN2E4NiwgMHgyNTRiN2E3MywgCisJMHgyNThjN2E1ZiwgMHgyNWNkN2E0YiwgMHgyNjBlN2EzNiwgMHgyNjUwN2EyMiwgMHgyNjkxN2EwZCwgMHgyNmQzNzlmOCwgMHgyNzE1NzllMywgMHgyNzU3NzljZSwgCisJMHgyNzlhNzliOCwgMHgyN2RjNzlhMywgMHgyODFmNzk4ZCwgMHgyODYyNzk3NywgMHgyOGE1Nzk2MCwgMHgyOGU4Nzk0YSwgMHgyOTJiNzkzMywgMHgyOTZmNzkxYywgCisJMHgyOWIyNzkwNSwgMHgyOWY2NzhlZCwgMHgyYTNhNzhkNiwgMHgyYTdlNzhiZSwgMHgyYWMyNzhhNiwgMHgyYjA3Nzg4ZCwgMHgyYjRiNzg3NSwgMHgyYjkwNzg1YywgCisJMHgyYmQ0Nzg0MywgMHgyYzE5NzgyYSwgMHgyYzVlNzgxMCwgMHgyY2E0NzdmNywgMHgyY2U5NzdkZCwgMHgyZDJlNzdjMywgMHgyZDc0NzdhOCwgMHgyZGJhNzc4ZSwgCisJMHgyZGZmNzc3MywgMHgyZTQ1Nzc1OCwgMHgyZThiNzczZCwgMHgyZWQyNzcyMSwgMHgyZjE4NzcwNiwgMHgyZjVlNzZlYSwgMHgyZmE1NzZjZCwgMHgyZmVjNzZiMSwgCisJMHgzMDMyNzY5NCwgMHgzMDc5NzY3NywgMHgzMGMwNzY1YSwgMHgzMTA3NzYzZCwgMHgzMTRlNzYxZiwgMHgzMTk2NzYwMSwgMHgzMWRkNzVlMywgMHgzMjI1NzVjNSwgCisJMHgzMjZjNzVhNiwgMHgzMmI0NzU4OCwgMHgzMmZjNzU2OSwgMHgzMzQ0NzU0OSwgMHgzMzhjNzUyYSwgMHgzM2Q0NzUwYSwgMHgzNDFjNzRlYSwgMHgzNDY0NzRjYSwgCisJMHgzNGFjNzRhOSwgMHgzNGY1NzQ4OCwgMHgzNTNkNzQ2NywgMHgzNTg1NzQ0NiwgMHgzNWNlNzQyNCwgMHgzNjE3NzQwMywgMHgzNjVmNzNlMSwgMHgzNmE4NzNiZSwgCisJMHgzNmYxNzM5YywgMHgzNzNhNzM3OSwgMHgzNzgzNzM1NiwgMHgzN2NjNzMzMywgMHgzODE1NzMwZiwgMHgzODVlNzJlYywgMHgzOGE3NzJjOCwgMHgzOGYxNzJhMywgCisJMHgzOTNhNzI3ZiwgMHgzOTgzNzI1YSwgMHgzOWNkNzIzNSwgMHgzYTE2NzIxMCwgMHgzYTYwNzFlYSwgMHgzYWE5NzFjNCwgMHgzYWYzNzE5ZSwgMHgzYjNjNzE3OCwgCisJMHgzYjg2NzE1MSwgMHgzYmQwNzEyYiwgMHgzYzE5NzEwNCwgMHgzYzYzNzBkYywgMHgzY2FkNzBiNSwgMHgzY2Y3NzA4ZCwgMHgzZDQwNzA2NSwgMHgzZDhhNzAzYywgCisJMHgzZGQ0NzAxNCwgMHgzZTFlNmZlYiwgMHgzZTY4NmZjMiwgMHgzZWIxNmY5OCwgMHgzZWZiNmY2ZiwgMHgzZjQ1NmY0NSwgMHgzZjhmNmYxYiwgMHgzZmQ5NmVmMCwgCisJMHg0MDIzNmVjNiwgMHg0MDZkNmU5YiwgMHg0MGI2NmU3MCwgMHg0MTAwNmU0NCwgMHg0MTRhNmUxOSwgMHg0MTk0NmRlZCwgMHg0MWRlNmRjMSwgMHg0MjI4NmQ5NCwgCisJMHg0MjcxNmQ2OCwgMHg0MmJiNmQzYiwgMHg0MzA1NmQwZCwgMHg0MzRmNmNlMCwgMHg0Mzk4NmNiMiwgMHg0M2UyNmM4NCwgMHg0NDJjNmM1NiwgMHg0NDc1NmMyOCwgCisJMHg0NGJmNmJmOSwgMHg0NTA4NmJjYSwgMHg0NTUyNmI5YiwgMHg0NTliNmI2YiwgMHg0NWU1NmIzYywgMHg0NjJlNmIwYywgMHg0Njc4NmFkYiwgMHg0NmMxNmFhYiwgCisJMHg0NzBhNmE3YSwgMHg0NzUzNmE0OSwgMHg0NzljNmExOCwgMHg0N2U1NjllNywgMHg0ODJlNjliNSwgMHg0ODc3Njk4MywgMHg0OGMwNjk1MSwgMHg0OTA5NjkxZSwgCisJMHg0OTUyNjhlYywgMHg0OTliNjhiOSwgMHg0OWUzNjg4NSwgMHg0YTJjNjg1MiwgMHg0YTc0NjgxZSwgMHg0YWJkNjdlYSwgMHg0YjA1NjdiNiwgMHg0YjRkNjc4MiwgCisJMHg0Yjk1Njc0ZCwgMHg0YmRlNjcxOCwgMHg0YzI2NjZlMywgMHg0YzZkNjZhZSwgMHg0Y2I1NjY3OCwgMHg0Y2ZkNjY0MiwgMHg0ZDQ1NjYwYywgMHg0ZDhjNjVkNiwgCisJMHg0ZGQ0NjU5ZiwgMHg0ZTFiNjU2OCwgMHg0ZTYyNjUzMSwgMHg0ZWE5NjRmYSwgMHg0ZWYwNjRjMywgMHg0ZjM3NjQ4YiwgMHg0ZjdlNjQ1MywgMHg0ZmM1NjQxYiwgCisJMHg1MDBiNjNlMiwgMHg1MDUyNjNhYSwgMHg1MDk4NjM3MSwgMHg1MGRmNjMzOCwgMHg1MTI1NjJmZSwgMHg1MTZiNjJjNSwgMHg1MWIxNjI4YiwgMHg1MWY2NjI1MSwgCisJMHg1MjNjNjIxNywgMHg1MjgxNjFkYywgMHg1MmM3NjFhMiwgMHg1MzBjNjE2NywgMHg1MzUxNjEyYywgMHg1Mzk2NjBmMSwgMHg1M2RiNjBiNSwgMHg1NDIwNjA3OSwgCisJMHg1NDY0NjAzZCwgMHg1NGE5NjAwMSwgMHg1NGVkNWZjNSwgMHg1NTMxNWY4OCwgMHg1NTc1NWY0YiwgMHg1NWI5NWYwZSwgMHg1NWZjNWVkMSwgMHg1NjQwNWU5NCwgCisJMHg1NjgzNWU1NiwgMHg1NmM3NWUxOCwgMHg1NzBhNWRkYSwgMHg1NzRkNWQ5YywgMHg1NzhmNWQ1ZSwgMHg1N2QyNWQxZiwgMHg1ODE0NWNlMCwgMHg1ODU2NWNhMSwgCiAJMHg1ODk5NWM2MiwgMHg1OGRhNWMyMywgMHg1OTFjNWJlMywgMHg1OTVlNWJhNCwgMHg1OTlmNWI2NCwgMHg1OWUwNWIyNCwgMHg1YTIxNWFlMywgMHg1YTYyNWFhMwogfTsKIApAQCAtMTA3MCwyNzcgKzEwNzAsMjc3IEBACiAKICAgXGJyaWVmICAgdGhlc2UgdGFibGVzIGFyZSB1c2VkIGZvciB0aGUgbm9uCiAgICAgICAgICAgIGxpbmVhciBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyCi0KKyAgICAgICAgICAgCiAqLwogY29uc3QgV29yZDMyIG1UYWJfM180WzUxMl0gPSB7Ci0JMHg0YzFiZjgyOSwgMHg0YzM4ODBkZSwgMHg0YzU1MDYwMywgMHg0YzcxODc5YywKLQkweDRjOGUwNWFhLCAweDRjYWE4MDMwLCAweDRjYzZmNzJmLCAweDRjZTM2YWFiLAotCTB4NGNmZmRhYTQsIDB4NGQxYzQ3MWQsIDB4NGQzOGIwMTksIDB4NGQ1NTE1OWEsCi0JMHg0ZDcxNzdhMSwgMHg0ZDhkZDYzMSwgMHg0ZGFhMzE0YiwgMHg0ZGM2ODhmMywKLQkweDRkZTJkZDJhLCAweDRkZmYyZGYyLCAweDRlMWI3YjRkLCAweDRlMzdjNTNkLAotCTB4NGU1NDBiYzUsIDB4NGU3MDRlZTYsIDB4NGU4YzhlYTMsIDB4NGVhOGNhZmQsCi0JMHg0ZWM1MDNmNywgMHg0ZWUxMzk5MiwgMHg0ZWZkNmJkMCwgMHg0ZjE5OWFiNCwKLQkweDRmMzVjNjQwLCAweDRmNTFlZTc1LCAweDRmNmUxMzU2LCAweDRmOGEzNGU0LAotCTB4NGZhNjUzMjEsIDB4NGZjMjZlMTAsIDB4NGZkZTg1YjIsIDB4NGZmYTlhMGEsCi0JMHg1MDE2YWIxOCwgMHg1MDMyYjhlMCwgMHg1MDRlYzM2MiwgMHg1MDZhY2FhMSwKLQkweDUwODZjZWEwLCAweDUwYTJjZjVlLCAweDUwYmVjY2UwLCAweDUwZGFjNzI1LAotCTB4NTBmNmJlMzEsIDB4NTExMmIyMDUsIDB4NTEyZWEyYTMsIDB4NTE0YTkwMGQsCi0JMHg1MTY2N2E0NSwgMHg1MTgyNjE0YywgMHg1MTllNDUyNCwgMHg1MWJhMjVjZiwKLQkweDUxZDYwMzUwLCAweDUxZjFkZGE3LCAweDUyMGRiNGQ2LCAweDUyMjk4OGUwLAotCTB4NTI0NTU5YzYsIDB4NTI2MTI3ODksIDB4NTI3Y2YyMmQsIDB4NTI5OGI5YjEsCi0JMHg1MmI0N2UxOSwgMHg1MmQwM2Y2NSwgMHg1MmViZmQ5OCwgMHg1MzA3YjhiNCwKLQkweDUzMjM3MGI5LCAweDUzM2YyNWFhLCAweDUzNWFkNzg5LCAweDUzNzY4NjU2LAotCTB4NTM5MjMyMTUsIDB4NTNhZGRhYzYsIDB4NTNjOTgwNmIsIDB4NTNlNTIzMDYsCi0JMHg1NDAwYzI5OCwgMHg1NDFjNWYyNCwgMHg1NDM3ZjhhYiwgMHg1NDUzOGYyZSwKLQkweDU0NmYyMmFmLCAweDU0OGFiMzMwLCAweDU0YTY0MGIzLCAweDU0YzFjYjM4LAotCTB4NTRkZDUyYzIsIDB4NTRmOGQ3NTMsIDB4NTUxNDU4ZWIsIDB4NTUyZmQ3OGQsCi0JMHg1NTRiNTMzOSwgMHg1NTY2Y2JmMywgMHg1NTgyNDFiYiwgMHg1NTlkYjQ5MiwKLQkweDU1YjkyNDdiLCAweDU1ZDQ5MTc3LCAweDU1ZWZmYjg3LCAweDU2MGI2MmFkLAotCTB4NTYyNmM2ZWIsIDB4NTY0MjI4NDIsIDB4NTY1ZDg2YjQsIDB4NTY3OGUyNDIsCi0JMHg1Njk0M2FlZSwgMHg1NmFmOTBiOSwgMHg1NmNhZTNhNCwgMHg1NmU2MzNiMiwKLQkweDU3MDE4MGU0LCAweDU3MWNjYjNiLCAweDU3MzgxMmI4LCAweDU3NTM1NzVlLAotCTB4NTc2ZTk5MmUsIDB4NTc4OWQ4MjksIDB4NTdhNTE0NTAsIDB4NTdjMDRkYTYsCi0JMHg1N2RiODQyYiwgMHg1N2Y2YjdlMSwgMHg1ODExZThjOSwgMHg1ODJkMTZlNiwKLQkweDU4NDg0MjM4LCAweDU4NjM2YWMwLCAweDU4N2U5MDgxLCAweDU4OTliMzdjLAotCTB4NThiNGQzYjEsIDB4NThjZmYxMjMsIDB4NThlYjBiZDMsIDB4NTkwNjIzYzIsCi0JMHg1OTIxMzhmMiwgMHg1OTNjNGI2MywgMHg1OTU3NWIxOSwgMHg1OTcyNjgxMiwKLQkweDU5OGQ3MjUzLCAweDU5YTg3OWRhLCAweDU5YzM3ZWFiLCAweDU5ZGU4MGM2LAotCTB4NTlmOTgwMmQsIDB4NWExNDdjZTAsIDB4NWEyZjc2ZTIsIDB4NWE0YTZlMzQsCi0JMHg1YTY1NjJkNiwgMHg1YTgwNTRjYiwgMHg1YTliNDQxNCwgMHg1YWI2MzBiMiwKLQkweDVhZDExYWE2LCAweDVhZWMwMWYxLCAweDViMDZlNjk2LCAweDViMjFjODk1LAotCTB4NWIzY2E3ZWYsIDB4NWI1Nzg0YTYsIDB4NWI3MjVlYmMsIDB4NWI4ZDM2MzEsCi0JMHg1YmE4MGIwNiwgMHg1YmMyZGQzZSwgMHg1YmRkYWNkOSwgMHg1YmY4NzlkOCwKLQkweDVjMTM0NDNkLCAweDVjMmUwYzA5LCAweDVjNDhkMTNlLCAweDVjNjM5M2RjLAotCTB4NWM3ZTUzZTUsIDB4NWM5OTExNWEsIDB4NWNiM2NjM2MsIDB4NWNjZTg0OGQsCi0JMHg1Y2U5M2E0ZSwgMHg1ZDAzZWQ4MCwgMHg1ZDFlOWUyNCwgMHg1ZDM5NGMzYiwKLQkweDVkNTNmN2M3LCAweDVkNmVhMGM5LCAweDVkODk0NzQyLCAweDVkYTNlYjMzLAotCTB4NWRiZThjOWUsIDB4NWRkOTJiODQsIDB4NWRmM2M3ZTUsIDB4NWUwZTYxYzMsCi0JMHg1ZTI4ZjkyMCwgMHg1ZTQzOGRmYywgMHg1ZTVlMjA1OSwgMHg1ZTc4YjAzNywKLQkweDVlOTMzZDk5LCAweDVlYWRjODdlLCAweDVlYzg1MGU5LCAweDVlZTJkNmRhLAotCTB4NWVmZDVhNTMsIDB4NWYxN2RiNTQsIDB4NWYzMjU5ZTAsIDB4NWY0Y2Q1ZjYsCi0JMHg1ZjY3NGY5OSwgMHg1ZjgxYzZjOCwgMHg1ZjljM2I4NywgMHg1ZmI2YWRkNCwKLQkweDVmZDExZGIzLCAweDVmZWI4YjIzLCAweDYwMDVmNjI2LCAweDYwMjA1ZWJkLAotCTB4NjAzYWM0ZTksIDB4NjA1NTI4YWMsIDB4NjA2ZjhhMDUsIDB4NjA4OWU4ZjcsCi0JMHg2MGE0NDU4MywgMHg2MGJlOWZhOSwgMHg2MGQ4Zjc2YiwgMHg2MGYzNGNjYSwKLQkweDYxMGQ5ZmM3LCAweDYxMjdmMDYyLCAweDYxNDIzZTllLCAweDYxNWM4YTdhLAotCTB4NjE3NmQzZjksIDB4NjE5MTFiMWIsIDB4NjFhYjVmZTEsIDB4NjFjNWEyNGQsCi0JMHg2MWRmZTI1ZiwgMHg2MWZhMjAxOCwgMHg2MjE0NWI3YSwgMHg2MjJlOTQ4NSwKLQkweDYyNDhjYjNiLCAweDYyNjJmZjlkLCAweDYyN2QzMWFiLCAweDYyOTc2MTY3LAotCTB4NjJiMThlZDEsIDB4NjJjYmI5ZWIsIDB4NjJlNWUyYjYsIDB4NjMwMDA5MzMsCi0JMHg2MzFhMmQ2MiwgMHg2MzM0NGY0NSwgMHg2MzRlNmVkZCwgMHg2MzY4OGMyYiwKLQkweDYzODJhNzMwLCAweDYzOWNiZmVjLCAweDYzYjZkNjYxLCAweDYzZDBlYTkwLAotCTB4NjNlYWZjN2EsIDB4NjQwNTBjMWYsIDB4NjQxZjE5ODIsIDB4NjQzOTI0YTIsCi0JMHg2NDUzMmQ4MCwgMHg2NDZkMzQxZiwgMHg2NDg3Mzg3ZSwgMHg2NGExM2E5ZSwKLQkweDY0YmIzYTgxLCAweDY0ZDUzODI4LCAweDY0ZWYzMzkzLCAweDY1MDkyY2M0LAotCTB4NjUyMzIzYmIsIDB4NjUzZDE4NzksIDB4NjU1NzBiMDAsIDB4NjU3MGZiNTAsCi0JMHg2NThhZTk2YiwgMHg2NWE0ZDU1MCwgMHg2NWJlYmYwMSwgMHg2NWQ4YTY4MCwKLQkweDY1ZjI4YmNjLCAweDY2MGM2ZWU4LCAweDY2MjY0ZmQzLCAweDY2NDAyZThmLAotCTB4NjY1YTBiMWMsIDB4NjY3M2U1N2QsIDB4NjY4ZGJkYjAsIDB4NjZhNzkzYjgsCi0JMHg2NmMxNjc5NSwgMHg2NmRiMzk0OSwgMHg2NmY1MDhkNCwgMHg2NzBlZDYzNiwKLQkweDY3MjhhMTcyLCAweDY3NDI2YTg3LCAweDY3NWMzMTc3LCAweDY3NzVmNjQzLAotCTB4Njc4ZmI4ZWIsIDB4NjdhOTc5NzEsIDB4NjdjMzM3ZDUsIDB4NjdkY2Y0MTgsCi0JMHg2N2Y2YWUzYiwgMHg2ODEwNjYzZiwgMHg2ODJhMWMyNSwgMHg2ODQzY2ZlZCwKLQkweDY4NWQ4MTk5LCAweDY4NzczMTI5LCAweDY4OTBkZTlmLCAweDY4YWE4OWZhLAotCTB4NjhjNDMzM2QsIDB4NjhkZGRhNjcsIDB4NjhmNzdmN2EsIDB4NjkxMTIyNzcsCi0JMHg2OTJhYzM1ZSwgMHg2OTQ0NjIzMCwgMHg2OTVkZmVlZSwgMHg2OTc3OTk5YSwKLQkweDY5OTEzMjMyLCAweDY5YWFjOGJhLCAweDY5YzQ1ZDMxLCAweDY5ZGRlZjk4LAotCTB4NjlmNzdmZjAsIDB4NmExMTBlM2EsIDB4NmEyYTlhNzcsIDB4NmE0NDI0YTgsCi0JMHg2YTVkYWNjYywgMHg2YTc3MzJlNiwgMHg2YTkwYjZmNiwgMHg2YWFhMzhmZCwKLQkweDZhYzNiOGZiLCAweDZhZGQzNmYyLCAweDZhZjZiMmUyLCAweDZiMTAyY2NkLAotCTB4NmIyOWE0YjIsIDB4NmI0MzFhOTIsIDB4NmI1YzhlNmYsIDB4NmI3NjAwNGEsCi0JMHg2YjhmNzAyMiwgMHg2YmE4ZGRmOSwgMHg2YmMyNDlkMCwgMHg2YmRiYjNhNywKLQkweDZiZjUxYjgwLCAweDZjMGU4MTVhLCAweDZjMjdlNTM3LCAweDZjNDE0NzE4LAotCTB4NmM1YWE2ZmQsIDB4NmM3NDA0ZTcsIDB4NmM4ZDYwZDcsIDB4NmNhNmJhY2UsCi0JMHg2Y2MwMTJjYywgMHg2Y2Q5NjhkMiwgMHg2Y2YyYmNlMSwgMHg2ZDBjMGVmOSwKLQkweDZkMjU1ZjFkLCAweDZkM2VhZDRiLCAweDZkNTdmOTg1LCAweDZkNzE0M2NjLAotCTB4NmQ4YThjMjEsIDB4NmRhM2QyODMsIDB4NmRiZDE2ZjUsIDB4NmRkNjU5NzYsCi0JMHg2ZGVmOWEwOCwgMHg2ZTA4ZDhhYiwgMHg2ZTIyMTU2MCwgMHg2ZTNiNTAyNywKLQkweDZlNTQ4OTAyLCAweDZlNmRiZmYxLCAweDZlODZmNGY1LCAweDZlYTAyODBlLAotCTB4NmViOTU5M2UsIDB4NmVkMjg4ODUsIDB4NmVlYmI1ZTMsIDB4NmYwNGUxNWEsCi0JMHg2ZjFlMGFlYSwgMHg2ZjM3MzI5NCwgMHg2ZjUwNTg1OSwgMHg2ZjY5N2MzOSwKLQkweDZmODI5ZTM1LCAweDZmOWJiZTRlLCAweDZmYjRkYzg1LCAweDZmY2RmOGQ5LAotCTB4NmZlNzEzNGQsIDB4NzAwMDJiZTAsIDB4NzAxOTQyOTMsIDB4NzAzMjU3NjcsCi0JMHg3MDRiNmE1ZCwgMHg3MDY0N2I3NiwgMHg3MDdkOGFiMSwgMHg3MDk2OTgxMSwKLQkweDcwYWZhMzk0LCAweDcwYzhhZDNkLCAweDcwZTFiNTBjLCAweDcwZmFiYjAxLAotCTB4NzExM2JmMWQsIDB4NzEyY2MxNjEsIDB4NzE0NWMxY2UsIDB4NzE1ZWMwNjQsCi0JMHg3MTc3YmQyNCwgMHg3MTkwYjgwZiwgMHg3MWE5YjEyNCwgMHg3MWMyYTg2NiwKLQkweDcxZGI5ZGQ0LCAweDcxZjQ5MTcwLCAweDcyMGQ4MzM5LCAweDcyMjY3MzMxLAotCTB4NzIzZjYxNTksIDB4NzI1ODRkYjAsIDB4NzI3MTM4MzgsIDB4NzI4YTIwZjEsCi0JMHg3MmEzMDdkYiwgMHg3MmJiZWNmOSwgMHg3MmQ0ZDA0OSwgMHg3MmVkYjFjZSwKLQkweDczMDY5MTg3LCAweDczMWY2Zjc1LCAweDczMzg0Yjk4LCAweDczNTEyNWYzLAotCTB4NzM2OWZlODQsIDB4NzM4MmQ1NGQsIDB4NzM5YmFhNGUsIDB4NzNiNDdkODksCi0JMHg3M2NkNGVmZCwgMHg3M2U2MWVhYiwgMHg3M2ZlZWM5NCwgMHg3NDE3YjhiOCwKLQkweDc0MzA4MzE5LCAweDc0NDk0YmI2LCAweDc0NjIxMjkxLCAweDc0N2FkN2FhLAotCTB4NzQ5MzliMDIsIDB4NzRhYzVjOTgsIDB4NzRjNTFjNmYsIDB4NzRkZGRhODYsCi0JMHg3NGY2OTZkZSwgMHg3NTBmNTE3OCwgMHg3NTI4MGE1NCwgMHg3NTQwYzE3NCwKLQkweDc1NTk3NmQ3LCAweDc1NzIyYTdlLCAweDc1OGFkYzY5LCAweDc1YTM4YzliLAotCTB4NzViYzNiMTIsIDB4NzVkNGU3Y2YsIDB4NzVlZDkyZDQsIDB4NzYwNjNjMjEsCi0JMHg3NjFlZTNiNiwgMHg3NjM3ODk5NCwgMHg3NjUwMmRiYywgMHg3NjY4ZDAyZSwKLQkweDc2ODE3MGViLCAweDc2OWEwZmYzLCAweDc2YjJhZDQ3LCAweDc2Y2I0OGU3LAotCTB4NzZlM2UyZDUsIDB4NzZmYzdiMTAsIDB4NzcxNTExOWEsIDB4NzcyZGE2NzMsCi0JMHg3NzQ2Mzk5YiwgMHg3NzVlY2IxMywgMHg3Nzc3NWFkYywgMHg3NzhmZThmNiwKLQkweDc3YTg3NTYxLCAweDc3YzEwMDFmLCAweDc3ZDk4OTMwLCAweDc3ZjIxMDk1LAotCTB4NzgwYTk2NGQsIDB4NzgyMzFhNWIsIDB4NzgzYjljYmQsIDB4Nzg1NDFkNzUsCi0JMHg3ODZjOWM4NCwgMHg3ODg1MTllOSwgMHg3ODlkOTVhNiwgMHg3OGI2MGZiYiwKLQkweDc4Y2U4ODI4LCAweDc4ZTZmZWVmLCAweDc4ZmY3NDBmLCAweDc5MTdlNzhhLAotCTB4NzkzMDU5NWYsIDB4Nzk0OGM5OTAsIDB4Nzk2MTM4MWQsIDB4Nzk3OWE1MDYsCi0JMHg3OTkyMTA0YywgMHg3OWFhNzlmMCwgMHg3OWMyZTFmMSwgMHg3OWRiNDg1MiwKLQkweDc5ZjNhZDExLCAweDdhMGMxMDMxLCAweDdhMjQ3MWIwLCAweDdhM2NkMTkxLAotCTB4N2E1NTJmZDMsIDB4N2E2ZDhjNzYsIDB4N2E4NWU3N2QsIDB4N2E5ZTQwZTYsCi0JMHg3YWI2OThiMiwgMHg3YWNlZWVlMywgMHg3YWU3NDM3OCwgMHg3YWZmOTY3MywKLQkweDdiMTdlN2QyLCAweDdiMzAzNzk5LCAweDdiNDg4NWM1LCAweDdiNjBkMjU5LAotCTB4N2I3OTFkNTUsIDB4N2I5MTY2YjksIDB4N2JhOWFlODYsIDB4N2JjMWY0YmMsCi0JMHg3YmRhMzk1YywgMHg3YmYyN2M2NiwgMHg3YzBhYmRkYiwgMHg3YzIyZmRiYiwKLQkweDdjM2IzYzA3LCAweDdjNTM3OGMwLCAweDdjNmJiM2U1LCAweDdjODNlZDc4LAotCTB4N2M5YzI1NzksIDB4N2NiNDViZTksIDB4N2NjYzkwYzcsIDB4N2NlNGM0MTQsCi0JMHg3Y2ZjZjVkMiwgMHg3ZDE1MjYwMCwgMHg3ZDJkNTQ5ZiwgMHg3ZDQ1ODFiMCwKLQkweDdkNWRhZDMyLCAweDdkNzVkNzI3LCAweDdkOGRmZjhmLCAweDdkYTYyNjZhLAotCTB4N2RiZTRiYmEsIDB4N2RkNjZmN2QsIDB4N2RlZTkxYjYsIDB4N2UwNmIyNjQsCi0JMHg3ZTFlZDE4OCwgMHg3ZTM2ZWYyMiwgMHg3ZTRmMGIzNCwgMHg3ZTY3MjViZCwKLQkweDdlN2YzZWJkLCAweDdlOTc1NjM2LCAweDdlYWY2YzI4LCAweDdlYzc4MDkzLAotCTB4N2VkZjkzNzgsIDB4N2VmN2E0ZDcsIDB4N2YwZmI0YjEsIDB4N2YyN2MzMDcsCi0JMHg3ZjNmY2ZkOCwgMHg3ZjU3ZGIyNSwgMHg3ZjZmZTRlZiwgMHg3Zjg3ZWQzNiwKKwkweDRjMWJmODI5LCAweDRjMzg4MGRlLCAweDRjNTUwNjAzLCAweDRjNzE4NzljLCAKKwkweDRjOGUwNWFhLCAweDRjYWE4MDMwLCAweDRjYzZmNzJmLCAweDRjZTM2YWFiLCAKKwkweDRjZmZkYWE0LCAweDRkMWM0NzFkLCAweDRkMzhiMDE5LCAweDRkNTUxNTlhLCAKKwkweDRkNzE3N2ExLCAweDRkOGRkNjMxLCAweDRkYWEzMTRiLCAweDRkYzY4OGYzLCAKKwkweDRkZTJkZDJhLCAweDRkZmYyZGYyLCAweDRlMWI3YjRkLCAweDRlMzdjNTNkLCAKKwkweDRlNTQwYmM1LCAweDRlNzA0ZWU2LCAweDRlOGM4ZWEzLCAweDRlYThjYWZkLCAKKwkweDRlYzUwM2Y3LCAweDRlZTEzOTkyLCAweDRlZmQ2YmQwLCAweDRmMTk5YWI0LCAKKwkweDRmMzVjNjQwLCAweDRmNTFlZTc1LCAweDRmNmUxMzU2LCAweDRmOGEzNGU0LCAKKwkweDRmYTY1MzIxLCAweDRmYzI2ZTEwLCAweDRmZGU4NWIyLCAweDRmZmE5YTBhLCAKKwkweDUwMTZhYjE4LCAweDUwMzJiOGUwLCAweDUwNGVjMzYyLCAweDUwNmFjYWExLCAKKwkweDUwODZjZWEwLCAweDUwYTJjZjVlLCAweDUwYmVjY2UwLCAweDUwZGFjNzI1LCAKKwkweDUwZjZiZTMxLCAweDUxMTJiMjA1LCAweDUxMmVhMmEzLCAweDUxNGE5MDBkLCAKKwkweDUxNjY3YTQ1LCAweDUxODI2MTRjLCAweDUxOWU0NTI0LCAweDUxYmEyNWNmLCAKKwkweDUxZDYwMzUwLCAweDUxZjFkZGE3LCAweDUyMGRiNGQ2LCAweDUyMjk4OGUwLCAKKwkweDUyNDU1OWM2LCAweDUyNjEyNzg5LCAweDUyN2NmMjJkLCAweDUyOThiOWIxLCAKKwkweDUyYjQ3ZTE5LCAweDUyZDAzZjY1LCAweDUyZWJmZDk4LCAweDUzMDdiOGI0LCAKKwkweDUzMjM3MGI5LCAweDUzM2YyNWFhLCAweDUzNWFkNzg5LCAweDUzNzY4NjU2LCAKKwkweDUzOTIzMjE1LCAweDUzYWRkYWM2LCAweDUzYzk4MDZiLCAweDUzZTUyMzA2LCAKKwkweDU0MDBjMjk4LCAweDU0MWM1ZjI0LCAweDU0MzdmOGFiLCAweDU0NTM4ZjJlLCAKKwkweDU0NmYyMmFmLCAweDU0OGFiMzMwLCAweDU0YTY0MGIzLCAweDU0YzFjYjM4LCAKKwkweDU0ZGQ1MmMyLCAweDU0ZjhkNzUzLCAweDU1MTQ1OGViLCAweDU1MmZkNzhkLCAKKwkweDU1NGI1MzM5LCAweDU1NjZjYmYzLCAweDU1ODI0MWJiLCAweDU1OWRiNDkyLCAKKwkweDU1YjkyNDdiLCAweDU1ZDQ5MTc3LCAweDU1ZWZmYjg3LCAweDU2MGI2MmFkLCAKKwkweDU2MjZjNmViLCAweDU2NDIyODQyLCAweDU2NWQ4NmI0LCAweDU2NzhlMjQyLCAKKwkweDU2OTQzYWVlLCAweDU2YWY5MGI5LCAweDU2Y2FlM2E0LCAweDU2ZTYzM2IyLCAKKwkweDU3MDE4MGU0LCAweDU3MWNjYjNiLCAweDU3MzgxMmI4LCAweDU3NTM1NzVlLCAKKwkweDU3NmU5OTJlLCAweDU3ODlkODI5LCAweDU3YTUxNDUwLCAweDU3YzA0ZGE2LCAKKwkweDU3ZGI4NDJiLCAweDU3ZjZiN2UxLCAweDU4MTFlOGM5LCAweDU4MmQxNmU2LCAKKwkweDU4NDg0MjM4LCAweDU4NjM2YWMwLCAweDU4N2U5MDgxLCAweDU4OTliMzdjLCAKKwkweDU4YjRkM2IxLCAweDU4Y2ZmMTIzLCAweDU4ZWIwYmQzLCAweDU5MDYyM2MyLCAKKwkweDU5MjEzOGYyLCAweDU5M2M0YjYzLCAweDU5NTc1YjE5LCAweDU5NzI2ODEyLCAKKwkweDU5OGQ3MjUzLCAweDU5YTg3OWRhLCAweDU5YzM3ZWFiLCAweDU5ZGU4MGM2LCAKKwkweDU5Zjk4MDJkLCAweDVhMTQ3Y2UwLCAweDVhMmY3NmUyLCAweDVhNGE2ZTM0LCAKKwkweDVhNjU2MmQ2LCAweDVhODA1NGNiLCAweDVhOWI0NDE0LCAweDVhYjYzMGIyLCAKKwkweDVhZDExYWE2LCAweDVhZWMwMWYxLCAweDViMDZlNjk2LCAweDViMjFjODk1LCAKKwkweDViM2NhN2VmLCAweDViNTc4NGE2LCAweDViNzI1ZWJjLCAweDViOGQzNjMxLCAKKwkweDViYTgwYjA2LCAweDViYzJkZDNlLCAweDViZGRhY2Q5LCAweDViZjg3OWQ4LCAKKwkweDVjMTM0NDNkLCAweDVjMmUwYzA5LCAweDVjNDhkMTNlLCAweDVjNjM5M2RjLCAKKwkweDVjN2U1M2U1LCAweDVjOTkxMTVhLCAweDVjYjNjYzNjLCAweDVjY2U4NDhkLCAKKwkweDVjZTkzYTRlLCAweDVkMDNlZDgwLCAweDVkMWU5ZTI0LCAweDVkMzk0YzNiLCAKKwkweDVkNTNmN2M3LCAweDVkNmVhMGM5LCAweDVkODk0NzQyLCAweDVkYTNlYjMzLCAKKwkweDVkYmU4YzllLCAweDVkZDkyYjg0LCAweDVkZjNjN2U1LCAweDVlMGU2MWMzLCAKKwkweDVlMjhmOTIwLCAweDVlNDM4ZGZjLCAweDVlNWUyMDU5LCAweDVlNzhiMDM3LCAKKwkweDVlOTMzZDk5LCAweDVlYWRjODdlLCAweDVlYzg1MGU5LCAweDVlZTJkNmRhLCAKKwkweDVlZmQ1YTUzLCAweDVmMTdkYjU0LCAweDVmMzI1OWUwLCAweDVmNGNkNWY2LCAKKwkweDVmNjc0Zjk5LCAweDVmODFjNmM4LCAweDVmOWMzYjg3LCAweDVmYjZhZGQ0LCAKKwkweDVmZDExZGIzLCAweDVmZWI4YjIzLCAweDYwMDVmNjI2LCAweDYwMjA1ZWJkLCAKKwkweDYwM2FjNGU5LCAweDYwNTUyOGFjLCAweDYwNmY4YTA1LCAweDYwODllOGY3LCAKKwkweDYwYTQ0NTgzLCAweDYwYmU5ZmE5LCAweDYwZDhmNzZiLCAweDYwZjM0Y2NhLCAKKwkweDYxMGQ5ZmM3LCAweDYxMjdmMDYyLCAweDYxNDIzZTllLCAweDYxNWM4YTdhLCAKKwkweDYxNzZkM2Y5LCAweDYxOTExYjFiLCAweDYxYWI1ZmUxLCAweDYxYzVhMjRkLCAKKwkweDYxZGZlMjVmLCAweDYxZmEyMDE4LCAweDYyMTQ1YjdhLCAweDYyMmU5NDg1LCAKKwkweDYyNDhjYjNiLCAweDYyNjJmZjlkLCAweDYyN2QzMWFiLCAweDYyOTc2MTY3LCAKKwkweDYyYjE4ZWQxLCAweDYyY2JiOWViLCAweDYyZTVlMmI2LCAweDYzMDAwOTMzLCAKKwkweDYzMWEyZDYyLCAweDYzMzQ0ZjQ1LCAweDYzNGU2ZWRkLCAweDYzNjg4YzJiLCAKKwkweDYzODJhNzMwLCAweDYzOWNiZmVjLCAweDYzYjZkNjYxLCAweDYzZDBlYTkwLCAKKwkweDYzZWFmYzdhLCAweDY0MDUwYzFmLCAweDY0MWYxOTgyLCAweDY0MzkyNGEyLCAKKwkweDY0NTMyZDgwLCAweDY0NmQzNDFmLCAweDY0ODczODdlLCAweDY0YTEzYTllLCAKKwkweDY0YmIzYTgxLCAweDY0ZDUzODI4LCAweDY0ZWYzMzkzLCAweDY1MDkyY2M0LCAKKwkweDY1MjMyM2JiLCAweDY1M2QxODc5LCAweDY1NTcwYjAwLCAweDY1NzBmYjUwLCAKKwkweDY1OGFlOTZiLCAweDY1YTRkNTUwLCAweDY1YmViZjAxLCAweDY1ZDhhNjgwLCAKKwkweDY1ZjI4YmNjLCAweDY2MGM2ZWU4LCAweDY2MjY0ZmQzLCAweDY2NDAyZThmLCAKKwkweDY2NWEwYjFjLCAweDY2NzNlNTdkLCAweDY2OGRiZGIwLCAweDY2YTc5M2I4LCAKKwkweDY2YzE2Nzk1LCAweDY2ZGIzOTQ5LCAweDY2ZjUwOGQ0LCAweDY3MGVkNjM2LCAKKwkweDY3MjhhMTcyLCAweDY3NDI2YTg3LCAweDY3NWMzMTc3LCAweDY3NzVmNjQzLCAKKwkweDY3OGZiOGViLCAweDY3YTk3OTcxLCAweDY3YzMzN2Q1LCAweDY3ZGNmNDE4LCAKKwkweDY3ZjZhZTNiLCAweDY4MTA2NjNmLCAweDY4MmExYzI1LCAweDY4NDNjZmVkLCAKKwkweDY4NWQ4MTk5LCAweDY4NzczMTI5LCAweDY4OTBkZTlmLCAweDY4YWE4OWZhLCAKKwkweDY4YzQzMzNkLCAweDY4ZGRkYTY3LCAweDY4Zjc3ZjdhLCAweDY5MTEyMjc3LCAKKwkweDY5MmFjMzVlLCAweDY5NDQ2MjMwLCAweDY5NWRmZWVlLCAweDY5Nzc5OTlhLCAKKwkweDY5OTEzMjMyLCAweDY5YWFjOGJhLCAweDY5YzQ1ZDMxLCAweDY5ZGRlZjk4LCAKKwkweDY5Zjc3ZmYwLCAweDZhMTEwZTNhLCAweDZhMmE5YTc3LCAweDZhNDQyNGE4LCAKKwkweDZhNWRhY2NjLCAweDZhNzczMmU2LCAweDZhOTBiNmY2LCAweDZhYWEzOGZkLCAKKwkweDZhYzNiOGZiLCAweDZhZGQzNmYyLCAweDZhZjZiMmUyLCAweDZiMTAyY2NkLCAKKwkweDZiMjlhNGIyLCAweDZiNDMxYTkyLCAweDZiNWM4ZTZmLCAweDZiNzYwMDRhLCAKKwkweDZiOGY3MDIyLCAweDZiYThkZGY5LCAweDZiYzI0OWQwLCAweDZiZGJiM2E3LCAKKwkweDZiZjUxYjgwLCAweDZjMGU4MTVhLCAweDZjMjdlNTM3LCAweDZjNDE0NzE4LCAKKwkweDZjNWFhNmZkLCAweDZjNzQwNGU3LCAweDZjOGQ2MGQ3LCAweDZjYTZiYWNlLCAKKwkweDZjYzAxMmNjLCAweDZjZDk2OGQyLCAweDZjZjJiY2UxLCAweDZkMGMwZWY5LCAKKwkweDZkMjU1ZjFkLCAweDZkM2VhZDRiLCAweDZkNTdmOTg1LCAweDZkNzE0M2NjLCAKKwkweDZkOGE4YzIxLCAweDZkYTNkMjgzLCAweDZkYmQxNmY1LCAweDZkZDY1OTc2LCAKKwkweDZkZWY5YTA4LCAweDZlMDhkOGFiLCAweDZlMjIxNTYwLCAweDZlM2I1MDI3LCAKKwkweDZlNTQ4OTAyLCAweDZlNmRiZmYxLCAweDZlODZmNGY1LCAweDZlYTAyODBlLCAKKwkweDZlYjk1OTNlLCAweDZlZDI4ODg1LCAweDZlZWJiNWUzLCAweDZmMDRlMTVhLCAKKwkweDZmMWUwYWVhLCAweDZmMzczMjk0LCAweDZmNTA1ODU5LCAweDZmNjk3YzM5LCAKKwkweDZmODI5ZTM1LCAweDZmOWJiZTRlLCAweDZmYjRkYzg1LCAweDZmY2RmOGQ5LCAKKwkweDZmZTcxMzRkLCAweDcwMDAyYmUwLCAweDcwMTk0MjkzLCAweDcwMzI1NzY3LCAKKwkweDcwNGI2YTVkLCAweDcwNjQ3Yjc2LCAweDcwN2Q4YWIxLCAweDcwOTY5ODExLCAKKwkweDcwYWZhMzk0LCAweDcwYzhhZDNkLCAweDcwZTFiNTBjLCAweDcwZmFiYjAxLCAKKwkweDcxMTNiZjFkLCAweDcxMmNjMTYxLCAweDcxNDVjMWNlLCAweDcxNWVjMDY0LCAKKwkweDcxNzdiZDI0LCAweDcxOTBiODBmLCAweDcxYTliMTI0LCAweDcxYzJhODY2LCAKKwkweDcxZGI5ZGQ0LCAweDcxZjQ5MTcwLCAweDcyMGQ4MzM5LCAweDcyMjY3MzMxLCAKKwkweDcyM2Y2MTU5LCAweDcyNTg0ZGIwLCAweDcyNzEzODM4LCAweDcyOGEyMGYxLCAKKwkweDcyYTMwN2RiLCAweDcyYmJlY2Y5LCAweDcyZDRkMDQ5LCAweDcyZWRiMWNlLCAKKwkweDczMDY5MTg3LCAweDczMWY2Zjc1LCAweDczMzg0Yjk4LCAweDczNTEyNWYzLCAKKwkweDczNjlmZTg0LCAweDczODJkNTRkLCAweDczOWJhYTRlLCAweDczYjQ3ZDg5LCAKKwkweDczY2Q0ZWZkLCAweDczZTYxZWFiLCAweDczZmVlYzk0LCAweDc0MTdiOGI4LCAKKwkweDc0MzA4MzE5LCAweDc0NDk0YmI2LCAweDc0NjIxMjkxLCAweDc0N2FkN2FhLCAKKwkweDc0OTM5YjAyLCAweDc0YWM1Yzk4LCAweDc0YzUxYzZmLCAweDc0ZGRkYTg2LCAKKwkweDc0ZjY5NmRlLCAweDc1MGY1MTc4LCAweDc1MjgwYTU0LCAweDc1NDBjMTc0LCAKKwkweDc1NTk3NmQ3LCAweDc1NzIyYTdlLCAweDc1OGFkYzY5LCAweDc1YTM4YzliLCAKKwkweDc1YmMzYjEyLCAweDc1ZDRlN2NmLCAweDc1ZWQ5MmQ0LCAweDc2MDYzYzIxLCAKKwkweDc2MWVlM2I2LCAweDc2Mzc4OTk0LCAweDc2NTAyZGJjLCAweDc2NjhkMDJlLCAKKwkweDc2ODE3MGViLCAweDc2OWEwZmYzLCAweDc2YjJhZDQ3LCAweDc2Y2I0OGU3LCAKKwkweDc2ZTNlMmQ1LCAweDc2ZmM3YjEwLCAweDc3MTUxMTlhLCAweDc3MmRhNjczLCAKKwkweDc3NDYzOTliLCAweDc3NWVjYjEzLCAweDc3Nzc1YWRjLCAweDc3OGZlOGY2LCAKKwkweDc3YTg3NTYxLCAweDc3YzEwMDFmLCAweDc3ZDk4OTMwLCAweDc3ZjIxMDk1LCAKKwkweDc4MGE5NjRkLCAweDc4MjMxYTViLCAweDc4M2I5Y2JkLCAweDc4NTQxZDc1LCAKKwkweDc4NmM5Yzg0LCAweDc4ODUxOWU5LCAweDc4OWQ5NWE2LCAweDc4YjYwZmJiLCAKKwkweDc4Y2U4ODI4LCAweDc4ZTZmZWVmLCAweDc4ZmY3NDBmLCAweDc5MTdlNzhhLCAKKwkweDc5MzA1OTVmLCAweDc5NDhjOTkwLCAweDc5NjEzODFkLCAweDc5NzlhNTA2LCAKKwkweDc5OTIxMDRjLCAweDc5YWE3OWYwLCAweDc5YzJlMWYxLCAweDc5ZGI0ODUyLCAKKwkweDc5ZjNhZDExLCAweDdhMGMxMDMxLCAweDdhMjQ3MWIwLCAweDdhM2NkMTkxLCAKKwkweDdhNTUyZmQzLCAweDdhNmQ4Yzc2LCAweDdhODVlNzdkLCAweDdhOWU0MGU2LCAKKwkweDdhYjY5OGIyLCAweDdhY2VlZWUzLCAweDdhZTc0Mzc4LCAweDdhZmY5NjczLCAKKwkweDdiMTdlN2QyLCAweDdiMzAzNzk5LCAweDdiNDg4NWM1LCAweDdiNjBkMjU5LCAKKwkweDdiNzkxZDU1LCAweDdiOTE2NmI5LCAweDdiYTlhZTg2LCAweDdiYzFmNGJjLCAKKwkweDdiZGEzOTVjLCAweDdiZjI3YzY2LCAweDdjMGFiZGRiLCAweDdjMjJmZGJiLCAKKwkweDdjM2IzYzA3LCAweDdjNTM3OGMwLCAweDdjNmJiM2U1LCAweDdjODNlZDc4LCAKKwkweDdjOWMyNTc5LCAweDdjYjQ1YmU5LCAweDdjY2M5MGM3LCAweDdjZTRjNDE0LCAKKwkweDdjZmNmNWQyLCAweDdkMTUyNjAwLCAweDdkMmQ1NDlmLCAweDdkNDU4MWIwLCAKKwkweDdkNWRhZDMyLCAweDdkNzVkNzI3LCAweDdkOGRmZjhmLCAweDdkYTYyNjZhLCAKKwkweDdkYmU0YmJhLCAweDdkZDY2ZjdkLCAweDdkZWU5MWI2LCAweDdlMDZiMjY0LCAKKwkweDdlMWVkMTg4LCAweDdlMzZlZjIyLCAweDdlNGYwYjM0LCAweDdlNjcyNWJkLCAKKwkweDdlN2YzZWJkLCAweDdlOTc1NjM2LCAweDdlYWY2YzI4LCAweDdlYzc4MDkzLCAKKwkweDdlZGY5Mzc4LCAweDdlZjdhNGQ3LCAweDdmMGZiNGIxLCAweDdmMjdjMzA3LCAKKwkweDdmM2ZjZmQ4LCAweDdmNTdkYjI1LCAweDdmNmZlNGVmLCAweDdmODdlZDM2LCAKIAkweDdmOWZmM2ZiLCAweDdmYjdmOTNlLCAweDdmY2ZmY2ZmLCAweDdmZTdmZjQwCiB9OwogCiBjb25zdCBXb3JkMzIgbVRhYl80XzNbNTEyXT17Ci0JMHgzMmNiZmQ0YSwgMHgzMmVkZGQ3MCwgMHgzMzBmYzMzOSwgMHgzMzMxYWVhMywKLQkweDMzNTM5ZmFjLCAweDMzNzU5NjUyLCAweDMzOTc5Mjk0LCAweDMzYjk5NDcwLAotCTB4MzNkYjliZTQsIDB4MzNmZGE4ZWQsIDB4MzQxZmJiOGIsIDB4MzQ0MWQzYmIsCi0JMHgzNDYzZjE3YywgMHgzNDg2MTRjYywgMHgzNGE4M2RhOCwgMHgzNGNhNmMxMCwKLQkweDM0ZWNhMDAxLCAweDM1MGVkOTc5LCAweDM1MzExODc3LCAweDM1NTM1Y2ZhLAotCTB4MzU3NWE2ZmUsIDB4MzU5N2Y2ODMsIDB4MzViYTRiODcsIDB4MzVkY2E2MDcsCi0JMHgzNWZmMDYwMywgMHgzNjIxNmI3OCwgMHgzNjQzZDY2NSwgMHgzNjY2NDZjNywKLQkweDM2ODhiYzllLCAweDM2YWIzN2U4LCAweDM2Y2RiOGEyLCAweDM2ZjAzZWNiLAotCTB4MzcxMmNhNjIsIDB4MzczNTViNjQsIDB4Mzc1N2YxZDEsIDB4Mzc3YThkYTUsCi0JMHgzNzlkMmVlMCwgMHgzN2JmZDU4MCwgMHgzN2UyODE4NCwgMHgzODA1MzJlOCwKLQkweDM4MjdlOWFkLCAweDM4NGFhNWQwLCAweDM4NmQ2NzRmLCAweDM4OTAyZTJhLAotCTB4MzhiMmZhNWQsIDB4MzhkNWNiZTksIDB4MzhmOGEyY2EsIDB4MzkxYjdlZmYsCi0JMHgzOTNlNjA4OCwgMHgzOTYxNDc2MSwgMHgzOTg0MzM4YSwgMHgzOWE3MjUwMSwKLQkweDM5Y2ExYmM0LCAweDM5ZWQxN2QxLCAweDNhMTAxOTI4LCAweDNhMzMxZmM2LAotCTB4M2E1NjJiYWEsIDB4M2E3OTNjZDIsIDB4M2E5YzUzM2QsIDB4M2FiZjZlZTksCi0JMHgzYWUyOGZkNSwgMHgzYjA1YjVmZiwgMHgzYjI4ZTE2NSwgMHgzYjRjMTIwNiwKLQkweDNiNmY0N2UwLCAweDNiOTI4MmYyLCAweDNiYjVjMzNhLCAweDNiZDkwOGI3LAotCTB4M2JmYzUzNjgsIDB4M2MxZmEzNDksIDB4M2M0MmY4NWIsIDB4M2M2NjUyOWMsCi0JMHgzYzg5YjIwOSwgMHgzY2FkMTZhMiwgMHgzY2QwODA2NSwgMHgzY2YzZWY1MSwKLQkweDNkMTc2MzY0LCAweDNkM2FkYzljLCAweDNkNWU1YWY4LCAweDNkODFkZTc3LAotCTB4M2RhNTY3MTcsIDB4M2RjOGY0ZDYsIDB4M2RlYzg3YjQsIDB4M2UxMDFmYWUsCi0JMHgzZTMzYmNjMywgMHgzZTU3NWVmMiwgMHgzZTdiMDYzYSwgMHgzZTllYjI5OCwKLQkweDNlYzI2NDBjLCAweDNlZTYxYTkzLCAweDNmMDlkNjJkLCAweDNmMmQ5NmQ4LAotCTB4M2Y1MTVjOTMsIDB4M2Y3NTI3NWIsIDB4M2Y5OGY3MzEsIDB4M2ZiY2NjMTEsCi0JMHgzZmUwYTVmYywgMHg0MDA0ODRlZiwgMHg0MDI4NjhlYSwgMHg0MDRjNTFlOSwKLQkweDQwNzAzZmVlLCAweDQwOTQzMmY1LCAweDQwYjgyYWZkLCAweDQwZGMyODA2LAotCTB4NDEwMDJhMGQsIDB4NDEyNDMxMTEsIDB4NDE0ODNkMTIsIDB4NDE2YzRlMGQsCi0JMHg0MTkwNjQwMSwgMHg0MWI0N2VlZCwgMHg0MWQ4OWVjZiwgMHg0MWZjYzNhNywKLQkweDQyMjBlZDcyLCAweDQyNDUxYzMwLCAweDQyNjk0ZmRlLCAweDQyOGQ4ODdkLAotCTB4NDJiMWM2MDksIDB4NDJkNjA4ODMsIDB4NDJmYTRmZTgsIDB4NDMxZTljMzcsCi0JMHg0MzQyZWQ3MCwgMHg0MzY3NDM5MCwgMHg0MzhiOWU5NiwgMHg0M2FmZmU4MiwKLQkweDQzZDQ2MzUxLCAweDQzZjhjZDAzLCAweDQ0MWQzYjk1LCAweDQ0NDFhZjA4LAotCTB4NDQ2NjI3NTgsIDB4NDQ4YWE0ODcsIDB4NDRhZjI2OTAsIDB4NDRkM2FkNzUsCi0JMHg0NGY4MzkzMywgMHg0NTFjYzljOCwgMHg0NTQxNWYzNSwgMHg0NTY1Zjk3NywKLQkweDQ1OGE5ODhkLCAweDQ1YWYzYzc2LCAweDQ1ZDNlNTMxLCAweDQ1Zjg5MmJjLAotCTB4NDYxZDQ1MTYsIDB4NDY0MWZjM2UsIDB4NDY2NmI4MzIsIDB4NDY4Yjc4ZjIsCi0JMHg0NmIwM2U3YywgMHg0NmQ1MDhjZiwgMHg0NmY5ZDdlOSwgMHg0NzFlYWJjYSwKLQkweDQ3NDM4NDcwLCAweDQ3Njg2MWQ5LCAweDQ3OGQ0NDA2LCAweDQ3YjIyYWYzLAotCTB4NDdkNzE2YTEsIDB4NDdmYzA3MGUsIDB4NDgyMGZjMzksIDB4NDg0NWY2MjAsCi0JMHg0ODZhZjRjMywgMHg0ODhmZjgyMCwgMHg0OGI1MDAzNSwgMHg0OGRhMGQwMywKLQkweDQ4ZmYxZTg3LCAweDQ5MjQzNGMwLCAweDQ5NDk0ZmFkLCAweDQ5NmU2ZjRkLAotCTB4NDk5MzkzOWYsIDB4NDliOGJjYTIsIDB4NDlkZGVhNTQsIDB4NGEwMzFjYjQsCi0JMHg0YTI4NTNjMSwgMHg0YTRkOGY3YSwgMHg0YTcyY2ZkZSwgMHg0YTk4MTRlYiwKLQkweDRhYmQ1ZWExLCAweDRhZTJhY2ZkLCAweDRiMDgwMDAwLCAweDRiMmQ1N2E4LAotCTB4NGI1MmIzZjMsIDB4NGI3ODE0ZTEsIDB4NGI5ZDdhNzAsIDB4NGJjMmU0OWYsCi0JMHg0YmU4NTM2ZSwgMHg0YzBkYzZkYiwgMHg0YzMzM2VlNCwgMHg0YzU4YmI4OSwKLQkweDRjN2UzY2M5LCAweDRjYTNjMmEyLCAweDRjYzk0ZDE0LCAweDRjZWVkYzFjLAotCTB4NGQxNDZmYmIsIDB4NGQzYTA3ZWYsIDB4NGQ1ZmE0YjYsIDB4NGQ4NTQ2MTEsCi0JMHg0ZGFhZWJmZCwgMHg0ZGQwOTY3OSwgMHg0ZGY2NDU4NSwgMHg0ZTFiZjkxZiwKLQkweDRlNDFiMTQ2LCAweDRlNjc2ZGZhLCAweDRlOGQyZjM4LCAweDRlYjJmNTAxLAotCTB4NGVkOGJmNTIsIDB4NGVmZThlMmIsIDB4NGYyNDYxOGEsIDB4NGY0YTM5NzAsCi0JMHg0ZjcwMTVkOSwgMHg0Zjk1ZjZjNiwgMHg0ZmJiZGMzNiwgMHg0ZmUxYzYyNiwKLQkweDUwMDdiNDk3LCAweDUwMmRhNzg3LCAweDUwNTM5ZWY1LCAweDUwNzk5YWUxLAotCTB4NTA5ZjliNDgsIDB4NTBjNWEwMmEsIDB4NTBlYmE5ODUsIDB4NTExMWI3NWEsCi0JMHg1MTM3YzlhNiwgMHg1MTVkZTA2OSwgMHg1MTgzZmJhMiwgMHg1MWFhMWI0ZiwKLQkweDUxZDAzZjcwLCAweDUxZjY2ODAzLCAweDUyMWM5NTA4LCAweDUyNDJjNjdkLAotCTB4NTI2OGZjNjIsIDB4NTI4ZjM2YjUsIDB4NTJiNTc1NzUsIDB4NTJkYmI4YTIsCi0JMHg1MzAyMDAzYSwgMHg1MzI4NGMzYywgMHg1MzRlOWNhOCwgMHg1Mzc0ZjE3YywKLQkweDUzOWI0YWI3LCAweDUzYzFhODU4LCAweDUzZTgwYTVmLCAweDU0MGU3MGNhLAotCTB4NTQzNGRiOTgsIDB4NTQ1YjRhYzgsIDB4NTQ4MWJlNWEsIDB4NTRhODM2NGIsCi0JMHg1NGNlYjI5YywgMHg1NGY1MzM0YywgMHg1NTFiYjg1OCwgMHg1NTQyNDFjMSwKLQkweDU1NjhjZjg1LCAweDU1OGY2MWEzLCAweDU1YjVmODFiLCAweDU1ZGM5MmViLAotCTB4NTYwMzMyMTIsIDB4NTYyOWQ1OTAsIDB4NTY1MDdkNjMsIDB4NTY3NzI5OGEsCi0JMHg1NjlkZGEwNSwgMHg1NmM0OGVkMywgMHg1NmViNDdmMiwgMHg1NzEyMDU2MiwKLQkweDU3MzhjNzIxLCAweDU3NWY4ZDJmLCAweDU3ODY1NzhhLCAweDU3YWQyNjMzLAotCTB4NTdkM2Y5MjcsIDB4NTdmYWQwNjYsIDB4NTgyMWFiZWYsIDB4NTg0ODhiYzAsCi0JMHg1ODZmNmZkYSwgMHg1ODk2NTgzYiwgMHg1OGJkNDRlMiwgMHg1OGU0MzVjZSwKLQkweDU5MGIyYWZmLCAweDU5MzIyNDczLCAweDU5NTkyMjI5LCAweDU5ODAyNDIwLAotCTB4NTlhNzJhNTksIDB4NTljZTM0ZDAsIDB4NTlmNTQzODcsIDB4NWExYzU2N2IsCi0JMHg1YTQzNmRhYywgMHg1YTZhODkxOSwgMHg1YTkxYThjMSwgMHg1YWI4Y2NhMywKLQkweDVhZGZmNGJlLCAweDViMDcyMTExLCAweDViMmU1MTljLCAweDViNTU4NjVlLAotCTB4NWI3Y2JmNTQsIDB4NWJhM2ZjODAsIDB4NWJjYjNkZGYsIDB4NWJmMjgzNzEsCi0JMHg1YzE5Y2QzNSwgMHg1YzQxMWIyYSwgMHg1YzY4NmQ0ZiwgMHg1YzhmYzNhNCwKLQkweDVjYjcxZTI3LCAweDVjZGU3Y2Q3LCAweDVkMDVkZmI0LCAweDVkMmQ0NmJkLAotCTB4NWQ1NGIxZjAsIDB4NWQ3YzIxNGUsIDB4NWRhMzk0ZDQsIDB4NWRjYjBjODMsCi0JMHg1ZGYyODg1OSwgMHg1ZTFhMDg1NiwgMHg1ZTQxOGM3OCwgMHg1ZTY5MTRiZSwKLQkweDVlOTBhMTI5LCAweDVlYjgzMWI3LCAweDVlZGZjNjY3LCAweDVmMDc1ZjM4LAotCTB4NWYyZWZjMjksIDB4NWY1NjlkM2EsIDB4NWY3ZTQyNmEsIDB4NWZhNWViYjcsCi0JMHg1ZmNkOTkyMSwgMHg1ZmY1NGFhOCwgMHg2MDFkMDA0YSwgMHg2MDQ0YmEwNiwKLQkweDYwNmM3N2RjLCAweDYwOTQzOWNhLCAweDYwYmJmZmQwLCAweDYwZTNjOWVlLAotCTB4NjEwYjk4MjEsIDB4NjEzMzZhNmEsIDB4NjE1YjQwYzgsIDB4NjE4MzFiMzksCi0JMHg2MWFhZjliZCwgMHg2MWQyZGM1MywgMHg2MWZhYzJmYSwgMHg2MjIyYWRiMiwKLQkweDYyNGE5Yzc5LCAweDYyNzI4ZjRmLCAweDYyOWE4NjMzLCAweDYyYzI4MTIzLAotCTB4NjJlYTgwMjAsIDB4NjMxMjgzMjksIDB4NjMzYThhM2MsIDB4NjM2Mjk1NTksCi0JMHg2MzhhYTQ3ZiwgMHg2M2IyYjdhZCwgMHg2M2RhY2VlMiwgMHg2NDAyZWExZSwKLQkweDY0MmIwOTYwLCAweDY0NTMyY2E2LCAweDY0N2I1M2YxLCAweDY0YTM3ZjNmLAotCTB4NjRjYmFlOGYsIDB4NjRmM2UxZTIsIDB4NjUxYzE5MzUsIDB4NjU0NDU0ODgsCi0JMHg2NTZjOTNkYiwgMHg2NTk0ZDcyYywgMHg2NWJkMWU3YiwgMHg2NWU1NjljNywKLQkweDY2MGRiOTBmLCAweDY2MzYwYzUzLCAweDY2NWU2MzkxLCAweDY2ODZiZWM5LAotCTB4NjZhZjFkZmEsIDB4NjZkNzgxMjMsIDB4NjZmZmU4NDQsIDB4NjcyODUzNWIsCi0JMHg2NzUwYzI2OCwgMHg2Nzc5MzU2YiwgMHg2N2ExYWM2MiwgMHg2N2NhMjc0YywKLQkweDY3ZjJhNjI5LCAweDY4MWIyOGY5LCAweDY4NDNhZmI5LCAweDY4NmMzYTZhLAotCTB4Njg5NGM5MGIsIDB4NjhiZDViOWIsIDB4NjhlNWYyMTksIDB4NjkwZThjODQsCi0JMHg2OTM3MmFkZCwgMHg2OTVmY2QyMSwgMHg2OTg4NzM1MCwgMHg2OWIxMWQ2YSwKLQkweDY5ZDljYjZkLCAweDZhMDI3ZDVhLCAweDZhMmIzMzJmLCAweDZhNTNlY2ViLAotCTB4NmE3Y2FhOGQsIDB4NmFhNTZjMTYsIDB4NmFjZTMxODQsIDB4NmFmNmZhZDYsCi0JMHg2YjFmYzgwYywgMHg2YjQ4OTkyNSwgMHg2YjcxNmUyMCwgMHg2YjlhNDZmZCwKLQkweDZiYzMyM2JiLCAweDZiZWMwNDU4LCAweDZjMTRlOGQ1LCAweDZjM2RkMTMwLAotCTB4NmM2NmJkNjksIDB4NmM4ZmFkODAsIDB4NmNiOGExNzIsIDB4NmNlMTk5NDAsCi0JMHg2ZDBhOTRlOSwgMHg2ZDMzOTQ2ZCwgMHg2ZDVjOTdjYSwgMHg2ZDg1OWVmZiwKLQkweDZkYWVhYTBkLCAweDZkZDdiOGYxLCAweDZlMDBjYmFkLCAweDZlMjllMjNlLAotCTB4NmU1MmZjYTQsIDB4NmU3YzFhZGYsIDB4NmVhNTNjZWUsIDB4NmVjZTYyY2YsCi0JMHg2ZWY3OGM4MywgMHg2ZjIwYmEwOSwgMHg2ZjQ5ZWI1ZiwgMHg2ZjczMjA4NSwKLQkweDZmOWM1OTdiLCAweDZmYzU5NjQwLCAweDZmZWVkNmQzLCAweDcwMTgxYjMzLAotCTB4NzA0MTYzNjAsIDB4NzA2YWFmNTksIDB4NzA5M2ZmMWQsIDB4NzBiZDUyYWIsCi0JMHg3MGU2YWEwNCwgMHg3MTEwMDUyNSwgMHg3MTM5NjQwZiwgMHg3MTYyYzZjMSwKLQkweDcxOGMyZDNhLCAweDcxYjU5NzdhLCAweDcxZGYwNTdmLCAweDcyMDg3NzQ5LAotCTB4NzIzMWVjZDgsIDB4NzI1YjY2MmEsIDB4NzI4NGUzM2YsIDB4NzJhZTY0MTcsCi0JMHg3MmQ3ZThiMCwgMHg3MzAxNzEwYSwgMHg3MzJhZmQyNCwgMHg3MzU0OGNmZSwKLQkweDczN2UyMDk3LCAweDczYTdiN2VlLCAweDczZDE1MzAzLCAweDczZmFmMWQ1LAotCTB4NzQyNDk0NjIsIDB4NzQ0ZTNhYWMsIDB4NzQ3N2U0YjAsIDB4NzRhMTkyNmUsCi0JMHg3NGNiNDNlNiwgMHg3NGY0ZjkxNywgMHg3NTFlYjIwMSwgMHg3NTQ4NmVhMSwKLQkweDc1NzIyZWY5LCAweDc1OWJmMzA3LCAweDc1YzViYWNhLCAweDc1ZWY4NjQyLAotCTB4NzYxOTU1NmYsIDB4NzY0MzI4NGYsIDB4NzY2Y2ZlZTIsIDB4NzY5NmQ5MjgsCi0JMHg3NmMwYjcxZiwgMHg3NmVhOThjNywgMHg3NzE0N2UyMCwgMHg3NzNlNjcyOCwKLQkweDc3Njg1M2RmLCAweDc3OTI0NDQ1LCAweDc3YmMzODU4LCAweDc3ZTYzMDE5LAotCTB4NzgxMDJiODUsIDB4NzgzYTJhOWUsIDB4Nzg2NDJkNjIsIDB4Nzg4ZTMzZDEsCi0JMHg3OGI4M2RlOSwgMHg3OGUyNGJhYiwgMHg3OTBjNWQxNSwgMHg3OTM2NzIyOCwKLQkweDc5NjA4YWUxLCAweDc5OGFhNzQyLCAweDc5YjRjNzQ4LCAweDc5ZGVlYWY0LAotCTB4N2EwOTEyNDUsIDB4N2EzMzNkM2EsIDB4N2E1ZDZiZDIsIDB4N2E4NzllMGUsCi0JMHg3YWIxZDNlYywgMHg3YWRjMGQ2YiwgMHg3YjA2NGE4YywgMHg3YjMwOGI0ZCwKLQkweDdiNWFjZmFlLCAweDdiODUxN2FlLCAweDdiYWY2MzRjLCAweDdiZDliMjg5LAotCTB4N2MwNDA1NjMsIDB4N2MyZTViZGEsIDB4N2M1OGI1ZWMsIDB4N2M4MzEzOWIsCi0JMHg3Y2FkNzRlNCwgMHg3Y2Q3ZDljNywgMHg3ZDAyNDI0NCwgMHg3ZDJjYWU1YSwKLQkweDdkNTcxZTA5LCAweDdkODE5MTRmLCAweDdkYWMwODJkLCAweDdkZDY4MmExLAotCTB4N2UwMTAwYWMsIDB4N2UyYjgyNGIsIDB4N2U1NjA3ODAsIDB4N2U4MDkwNDgsCi0JMHg3ZWFiMWNhNSwgMHg3ZWQ1YWM5NCwgMHg3ZjAwNDAxNSwgMHg3ZjJhZDcyOSwKKwkweDMyY2JmZDRhLCAweDMyZWRkZDcwLCAweDMzMGZjMzM5LCAweDMzMzFhZWEzLCAKKwkweDMzNTM5ZmFjLCAweDMzNzU5NjUyLCAweDMzOTc5Mjk0LCAweDMzYjk5NDcwLCAKKwkweDMzZGI5YmU0LCAweDMzZmRhOGVkLCAweDM0MWZiYjhiLCAweDM0NDFkM2JiLCAKKwkweDM0NjNmMTdjLCAweDM0ODYxNGNjLCAweDM0YTgzZGE4LCAweDM0Y2E2YzEwLCAKKwkweDM0ZWNhMDAxLCAweDM1MGVkOTc5LCAweDM1MzExODc3LCAweDM1NTM1Y2ZhLCAKKwkweDM1NzVhNmZlLCAweDM1OTdmNjgzLCAweDM1YmE0Yjg3LCAweDM1ZGNhNjA3LCAKKwkweDM1ZmYwNjAzLCAweDM2MjE2Yjc4LCAweDM2NDNkNjY1LCAweDM2NjY0NmM3LCAKKwkweDM2ODhiYzllLCAweDM2YWIzN2U4LCAweDM2Y2RiOGEyLCAweDM2ZjAzZWNiLCAKKwkweDM3MTJjYTYyLCAweDM3MzU1YjY0LCAweDM3NTdmMWQxLCAweDM3N2E4ZGE1LCAKKwkweDM3OWQyZWUwLCAweDM3YmZkNTgwLCAweDM3ZTI4MTg0LCAweDM4MDUzMmU4LCAKKwkweDM4MjdlOWFkLCAweDM4NGFhNWQwLCAweDM4NmQ2NzRmLCAweDM4OTAyZTJhLCAKKwkweDM4YjJmYTVkLCAweDM4ZDVjYmU5LCAweDM4ZjhhMmNhLCAweDM5MWI3ZWZmLCAKKwkweDM5M2U2MDg4LCAweDM5NjE0NzYxLCAweDM5ODQzMzhhLCAweDM5YTcyNTAxLCAKKwkweDM5Y2ExYmM0LCAweDM5ZWQxN2QxLCAweDNhMTAxOTI4LCAweDNhMzMxZmM2LCAKKwkweDNhNTYyYmFhLCAweDNhNzkzY2QyLCAweDNhOWM1MzNkLCAweDNhYmY2ZWU5LCAKKwkweDNhZTI4ZmQ1LCAweDNiMDViNWZmLCAweDNiMjhlMTY1LCAweDNiNGMxMjA2LCAKKwkweDNiNmY0N2UwLCAweDNiOTI4MmYyLCAweDNiYjVjMzNhLCAweDNiZDkwOGI3LCAKKwkweDNiZmM1MzY4LCAweDNjMWZhMzQ5LCAweDNjNDJmODViLCAweDNjNjY1MjljLCAKKwkweDNjODliMjA5LCAweDNjYWQxNmEyLCAweDNjZDA4MDY1LCAweDNjZjNlZjUxLCAKKwkweDNkMTc2MzY0LCAweDNkM2FkYzljLCAweDNkNWU1YWY4LCAweDNkODFkZTc3LCAKKwkweDNkYTU2NzE3LCAweDNkYzhmNGQ2LCAweDNkZWM4N2I0LCAweDNlMTAxZmFlLCAKKwkweDNlMzNiY2MzLCAweDNlNTc1ZWYyLCAweDNlN2IwNjNhLCAweDNlOWViMjk4LCAKKwkweDNlYzI2NDBjLCAweDNlZTYxYTkzLCAweDNmMDlkNjJkLCAweDNmMmQ5NmQ4LCAKKwkweDNmNTE1YzkzLCAweDNmNzUyNzViLCAweDNmOThmNzMxLCAweDNmYmNjYzExLCAKKwkweDNmZTBhNWZjLCAweDQwMDQ4NGVmLCAweDQwMjg2OGVhLCAweDQwNGM1MWU5LCAKKwkweDQwNzAzZmVlLCAweDQwOTQzMmY1LCAweDQwYjgyYWZkLCAweDQwZGMyODA2LCAKKwkweDQxMDAyYTBkLCAweDQxMjQzMTExLCAweDQxNDgzZDEyLCAweDQxNmM0ZTBkLCAKKwkweDQxOTA2NDAxLCAweDQxYjQ3ZWVkLCAweDQxZDg5ZWNmLCAweDQxZmNjM2E3LCAKKwkweDQyMjBlZDcyLCAweDQyNDUxYzMwLCAweDQyNjk0ZmRlLCAweDQyOGQ4ODdkLCAKKwkweDQyYjFjNjA5LCAweDQyZDYwODgzLCAweDQyZmE0ZmU4LCAweDQzMWU5YzM3LCAKKwkweDQzNDJlZDcwLCAweDQzNjc0MzkwLCAweDQzOGI5ZTk2LCAweDQzYWZmZTgyLCAKKwkweDQzZDQ2MzUxLCAweDQzZjhjZDAzLCAweDQ0MWQzYjk1LCAweDQ0NDFhZjA4LCAKKwkweDQ0NjYyNzU4LCAweDQ0OGFhNDg3LCAweDQ0YWYyNjkwLCAweDQ0ZDNhZDc1LCAKKwkweDQ0ZjgzOTMzLCAweDQ1MWNjOWM4LCAweDQ1NDE1ZjM1LCAweDQ1NjVmOTc3LCAKKwkweDQ1OGE5ODhkLCAweDQ1YWYzYzc2LCAweDQ1ZDNlNTMxLCAweDQ1Zjg5MmJjLCAKKwkweDQ2MWQ0NTE2LCAweDQ2NDFmYzNlLCAweDQ2NjZiODMyLCAweDQ2OGI3OGYyLCAKKwkweDQ2YjAzZTdjLCAweDQ2ZDUwOGNmLCAweDQ2ZjlkN2U5LCAweDQ3MWVhYmNhLCAKKwkweDQ3NDM4NDcwLCAweDQ3Njg2MWQ5LCAweDQ3OGQ0NDA2LCAweDQ3YjIyYWYzLCAKKwkweDQ3ZDcxNmExLCAweDQ3ZmMwNzBlLCAweDQ4MjBmYzM5LCAweDQ4NDVmNjIwLCAKKwkweDQ4NmFmNGMzLCAweDQ4OGZmODIwLCAweDQ4YjUwMDM1LCAweDQ4ZGEwZDAzLCAKKwkweDQ4ZmYxZTg3LCAweDQ5MjQzNGMwLCAweDQ5NDk0ZmFkLCAweDQ5NmU2ZjRkLCAKKwkweDQ5OTM5MzlmLCAweDQ5YjhiY2EyLCAweDQ5ZGRlYTU0LCAweDRhMDMxY2I0LCAKKwkweDRhMjg1M2MxLCAweDRhNGQ4ZjdhLCAweDRhNzJjZmRlLCAweDRhOTgxNGViLCAKKwkweDRhYmQ1ZWExLCAweDRhZTJhY2ZkLCAweDRiMDgwMDAwLCAweDRiMmQ1N2E4LCAKKwkweDRiNTJiM2YzLCAweDRiNzgxNGUxLCAweDRiOWQ3YTcwLCAweDRiYzJlNDlmLCAKKwkweDRiZTg1MzZlLCAweDRjMGRjNmRiLCAweDRjMzMzZWU0LCAweDRjNThiYjg5LCAKKwkweDRjN2UzY2M5LCAweDRjYTNjMmEyLCAweDRjYzk0ZDE0LCAweDRjZWVkYzFjLCAKKwkweDRkMTQ2ZmJiLCAweDRkM2EwN2VmLCAweDRkNWZhNGI2LCAweDRkODU0NjExLCAKKwkweDRkYWFlYmZkLCAweDRkZDA5Njc5LCAweDRkZjY0NTg1LCAweDRlMWJmOTFmLCAKKwkweDRlNDFiMTQ2LCAweDRlNjc2ZGZhLCAweDRlOGQyZjM4LCAweDRlYjJmNTAxLCAKKwkweDRlZDhiZjUyLCAweDRlZmU4ZTJiLCAweDRmMjQ2MThhLCAweDRmNGEzOTcwLCAKKwkweDRmNzAxNWQ5LCAweDRmOTVmNmM2LCAweDRmYmJkYzM2LCAweDRmZTFjNjI2LCAKKwkweDUwMDdiNDk3LCAweDUwMmRhNzg3LCAweDUwNTM5ZWY1LCAweDUwNzk5YWUxLCAKKwkweDUwOWY5YjQ4LCAweDUwYzVhMDJhLCAweDUwZWJhOTg1LCAweDUxMTFiNzVhLCAKKwkweDUxMzdjOWE2LCAweDUxNWRlMDY5LCAweDUxODNmYmEyLCAweDUxYWExYjRmLCAKKwkweDUxZDAzZjcwLCAweDUxZjY2ODAzLCAweDUyMWM5NTA4LCAweDUyNDJjNjdkLCAKKwkweDUyNjhmYzYyLCAweDUyOGYzNmI1LCAweDUyYjU3NTc1LCAweDUyZGJiOGEyLCAKKwkweDUzMDIwMDNhLCAweDUzMjg0YzNjLCAweDUzNGU5Y2E4LCAweDUzNzRmMTdjLCAKKwkweDUzOWI0YWI3LCAweDUzYzFhODU4LCAweDUzZTgwYTVmLCAweDU0MGU3MGNhLCAKKwkweDU0MzRkYjk4LCAweDU0NWI0YWM4LCAweDU0ODFiZTVhLCAweDU0YTgzNjRiLCAKKwkweDU0Y2ViMjljLCAweDU0ZjUzMzRjLCAweDU1MWJiODU4LCAweDU1NDI0MWMxLCAKKwkweDU1NjhjZjg1LCAweDU1OGY2MWEzLCAweDU1YjVmODFiLCAweDU1ZGM5MmViLCAKKwkweDU2MDMzMjEyLCAweDU2MjlkNTkwLCAweDU2NTA3ZDYzLCAweDU2NzcyOThhLCAKKwkweDU2OWRkYTA1LCAweDU2YzQ4ZWQzLCAweDU2ZWI0N2YyLCAweDU3MTIwNTYyLCAKKwkweDU3MzhjNzIxLCAweDU3NWY4ZDJmLCAweDU3ODY1NzhhLCAweDU3YWQyNjMzLCAKKwkweDU3ZDNmOTI3LCAweDU3ZmFkMDY2LCAweDU4MjFhYmVmLCAweDU4NDg4YmMwLCAKKwkweDU4NmY2ZmRhLCAweDU4OTY1ODNiLCAweDU4YmQ0NGUyLCAweDU4ZTQzNWNlLCAKKwkweDU5MGIyYWZmLCAweDU5MzIyNDczLCAweDU5NTkyMjI5LCAweDU5ODAyNDIwLCAKKwkweDU5YTcyYTU5LCAweDU5Y2UzNGQwLCAweDU5ZjU0Mzg3LCAweDVhMWM1NjdiLCAKKwkweDVhNDM2ZGFjLCAweDVhNmE4OTE5LCAweDVhOTFhOGMxLCAweDVhYjhjY2EzLCAKKwkweDVhZGZmNGJlLCAweDViMDcyMTExLCAweDViMmU1MTljLCAweDViNTU4NjVlLCAKKwkweDViN2NiZjU0LCAweDViYTNmYzgwLCAweDViY2IzZGRmLCAweDViZjI4MzcxLCAKKwkweDVjMTljZDM1LCAweDVjNDExYjJhLCAweDVjNjg2ZDRmLCAweDVjOGZjM2E0LCAKKwkweDVjYjcxZTI3LCAweDVjZGU3Y2Q3LCAweDVkMDVkZmI0LCAweDVkMmQ0NmJkLCAKKwkweDVkNTRiMWYwLCAweDVkN2MyMTRlLCAweDVkYTM5NGQ0LCAweDVkY2IwYzgzLCAKKwkweDVkZjI4ODU5LCAweDVlMWEwODU2LCAweDVlNDE4Yzc4LCAweDVlNjkxNGJlLCAKKwkweDVlOTBhMTI5LCAweDVlYjgzMWI3LCAweDVlZGZjNjY3LCAweDVmMDc1ZjM4LCAKKwkweDVmMmVmYzI5LCAweDVmNTY5ZDNhLCAweDVmN2U0MjZhLCAweDVmYTVlYmI3LCAKKwkweDVmY2Q5OTIxLCAweDVmZjU0YWE4LCAweDYwMWQwMDRhLCAweDYwNDRiYTA2LCAKKwkweDYwNmM3N2RjLCAweDYwOTQzOWNhLCAweDYwYmJmZmQwLCAweDYwZTNjOWVlLCAKKwkweDYxMGI5ODIxLCAweDYxMzM2YTZhLCAweDYxNWI0MGM4LCAweDYxODMxYjM5LCAKKwkweDYxYWFmOWJkLCAweDYxZDJkYzUzLCAweDYxZmFjMmZhLCAweDYyMjJhZGIyLCAKKwkweDYyNGE5Yzc5LCAweDYyNzI4ZjRmLCAweDYyOWE4NjMzLCAweDYyYzI4MTIzLCAKKwkweDYyZWE4MDIwLCAweDYzMTI4MzI5LCAweDYzM2E4YTNjLCAweDYzNjI5NTU5LCAKKwkweDYzOGFhNDdmLCAweDYzYjJiN2FkLCAweDYzZGFjZWUyLCAweDY0MDJlYTFlLCAKKwkweDY0MmIwOTYwLCAweDY0NTMyY2E2LCAweDY0N2I1M2YxLCAweDY0YTM3ZjNmLCAKKwkweDY0Y2JhZThmLCAweDY0ZjNlMWUyLCAweDY1MWMxOTM1LCAweDY1NDQ1NDg4LCAKKwkweDY1NmM5M2RiLCAweDY1OTRkNzJjLCAweDY1YmQxZTdiLCAweDY1ZTU2OWM3LCAKKwkweDY2MGRiOTBmLCAweDY2MzYwYzUzLCAweDY2NWU2MzkxLCAweDY2ODZiZWM5LCAKKwkweDY2YWYxZGZhLCAweDY2ZDc4MTIzLCAweDY2ZmZlODQ0LCAweDY3Mjg1MzViLCAKKwkweDY3NTBjMjY4LCAweDY3NzkzNTZiLCAweDY3YTFhYzYyLCAweDY3Y2EyNzRjLCAKKwkweDY3ZjJhNjI5LCAweDY4MWIyOGY5LCAweDY4NDNhZmI5LCAweDY4NmMzYTZhLCAKKwkweDY4OTRjOTBiLCAweDY4YmQ1YjliLCAweDY4ZTVmMjE5LCAweDY5MGU4Yzg0LCAKKwkweDY5MzcyYWRkLCAweDY5NWZjZDIxLCAweDY5ODg3MzUwLCAweDY5YjExZDZhLCAKKwkweDY5ZDljYjZkLCAweDZhMDI3ZDVhLCAweDZhMmIzMzJmLCAweDZhNTNlY2ViLCAKKwkweDZhN2NhYThkLCAweDZhYTU2YzE2LCAweDZhY2UzMTg0LCAweDZhZjZmYWQ2LCAKKwkweDZiMWZjODBjLCAweDZiNDg5OTI1LCAweDZiNzE2ZTIwLCAweDZiOWE0NmZkLCAKKwkweDZiYzMyM2JiLCAweDZiZWMwNDU4LCAweDZjMTRlOGQ1LCAweDZjM2RkMTMwLCAKKwkweDZjNjZiZDY5LCAweDZjOGZhZDgwLCAweDZjYjhhMTcyLCAweDZjZTE5OTQwLCAKKwkweDZkMGE5NGU5LCAweDZkMzM5NDZkLCAweDZkNWM5N2NhLCAweDZkODU5ZWZmLCAKKwkweDZkYWVhYTBkLCAweDZkZDdiOGYxLCAweDZlMDBjYmFkLCAweDZlMjllMjNlLCAKKwkweDZlNTJmY2E0LCAweDZlN2MxYWRmLCAweDZlYTUzY2VlLCAweDZlY2U2MmNmLCAKKwkweDZlZjc4YzgzLCAweDZmMjBiYTA5LCAweDZmNDllYjVmLCAweDZmNzMyMDg1LCAKKwkweDZmOWM1OTdiLCAweDZmYzU5NjQwLCAweDZmZWVkNmQzLCAweDcwMTgxYjMzLCAKKwkweDcwNDE2MzYwLCAweDcwNmFhZjU5LCAweDcwOTNmZjFkLCAweDcwYmQ1MmFiLCAKKwkweDcwZTZhYTA0LCAweDcxMTAwNTI1LCAweDcxMzk2NDBmLCAweDcxNjJjNmMxLCAKKwkweDcxOGMyZDNhLCAweDcxYjU5NzdhLCAweDcxZGYwNTdmLCAweDcyMDg3NzQ5LCAKKwkweDcyMzFlY2Q4LCAweDcyNWI2NjJhLCAweDcyODRlMzNmLCAweDcyYWU2NDE3LCAKKwkweDcyZDdlOGIwLCAweDczMDE3MTBhLCAweDczMmFmZDI0LCAweDczNTQ4Y2ZlLCAKKwkweDczN2UyMDk3LCAweDczYTdiN2VlLCAweDczZDE1MzAzLCAweDczZmFmMWQ1LCAKKwkweDc0MjQ5NDYyLCAweDc0NGUzYWFjLCAweDc0NzdlNGIwLCAweDc0YTE5MjZlLCAKKwkweDc0Y2I0M2U2LCAweDc0ZjRmOTE3LCAweDc1MWViMjAxLCAweDc1NDg2ZWExLCAKKwkweDc1NzIyZWY5LCAweDc1OWJmMzA3LCAweDc1YzViYWNhLCAweDc1ZWY4NjQyLCAKKwkweDc2MTk1NTZmLCAweDc2NDMyODRmLCAweDc2NmNmZWUyLCAweDc2OTZkOTI4LCAKKwkweDc2YzBiNzFmLCAweDc2ZWE5OGM3LCAweDc3MTQ3ZTIwLCAweDc3M2U2NzI4LCAKKwkweDc3Njg1M2RmLCAweDc3OTI0NDQ1LCAweDc3YmMzODU4LCAweDc3ZTYzMDE5LCAKKwkweDc4MTAyYjg1LCAweDc4M2EyYTllLCAweDc4NjQyZDYyLCAweDc4OGUzM2QxLCAKKwkweDc4YjgzZGU5LCAweDc4ZTI0YmFiLCAweDc5MGM1ZDE1LCAweDc5MzY3MjI4LCAKKwkweDc5NjA4YWUxLCAweDc5OGFhNzQyLCAweDc5YjRjNzQ4LCAweDc5ZGVlYWY0LCAKKwkweDdhMDkxMjQ1LCAweDdhMzMzZDNhLCAweDdhNWQ2YmQyLCAweDdhODc5ZTBlLCAKKwkweDdhYjFkM2VjLCAweDdhZGMwZDZiLCAweDdiMDY0YThjLCAweDdiMzA4YjRkLCAKKwkweDdiNWFjZmFlLCAweDdiODUxN2FlLCAweDdiYWY2MzRjLCAweDdiZDliMjg5LCAKKwkweDdjMDQwNTYzLCAweDdjMmU1YmRhLCAweDdjNThiNWVjLCAweDdjODMxMzliLCAKKwkweDdjYWQ3NGU0LCAweDdjZDdkOWM3LCAweDdkMDI0MjQ0LCAweDdkMmNhZTVhLCAKKwkweDdkNTcxZTA5LCAweDdkODE5MTRmLCAweDdkYWMwODJkLCAweDdkZDY4MmExLCAKKwkweDdlMDEwMGFjLCAweDdlMmI4MjRiLCAweDdlNTYwNzgwLCAweDdlODA5MDQ4LCAKKwkweDdlYWIxY2E1LCAweDdlZDVhYzk0LCAweDdmMDA0MDE1LCAweDdmMmFkNzI5LCAKIAkweDdmNTU3MWNkLCAweDdmODAxMDAzLCAweDdmYWFiMWM4LCAweDdmZDU1NzFkCiB9OwogCiAKIGNvbnN0IFdvcmQzMiBpbnZTQkZbMjRdID0gewotICAweDNGRkQzNEZDLCAweDJEM0Y4MDAwLCAweDI0RjE4QzdFLCAweDFGRkU5QTdFLAotICAweDFDOURGMTBDLCAweDFBMUY4NTFBLCAweDE4MkZFOTk0LCAweDE2OUZDMDAwLAotICAweDE1NTQyQUFBLCAweDE0M0MzMUMyLCAweDEzNEIxQjZDLCAweDEyNzkyMEJFLAotICAweDExQkYyRkNDLCAweDExMUE3NDlFLCAweDEwODVGQzQyLCAweDBGRkZBN0JFLAotICAweDBGODU1ODE4LCAweDBGMTRFRTU2LCAweDBFQUU2QTc4LCAweDBFNEVGODg2LAorICAweDNGRkQzNEZDLCAweDJEM0Y4MDAwLCAweDI0RjE4QzdFLCAweDFGRkU5QTdFLCAKKyAgMHgxQzlERjEwQywgMHgxQTFGODUxQSwgMHgxODJGRTk5NCwgMHgxNjlGQzAwMCwgCisgIDB4MTU1NDJBQUEsIDB4MTQzQzMxQzIsIDB4MTM0QjFCNkMsIDB4MTI3OTIwQkUsIAorICAweDExQkYyRkNDLCAweDExMUE3NDlFLCAweDEwODVGQzQyLCAweDBGRkZBN0JFLCAKKyAgMHgwRjg1NTgxOCwgMHgwRjE0RUU1NiwgMHgwRUFFNkE3OCwgMHgwRTRFRjg4NiwgCiAgIDB4MERGNjk4ODAsIDB4MERBNDk1NjgsIDB4MEQ1Nzg1NDIsIDB4MEQxMDFEMEMKIH07CiAKQEAgLTEzNTMsNDAgKzEzNTMsNDAgQEAKIH07CiAKIGNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYkxvbmdbTUFYX1NGQl9MT05HICsgMV0gPSB7Ci0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDE0LCAxNCwgMTQsIDE0LAotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgIDksIDksIDksIDksIDksIDksIDksIDksIDksIAorICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCAKKyAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgCisgIDksIDksIDksIDksIDE0LCAxNCwgMTQsIDE0LCAKKyAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIAorICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgCiAgIDE0LCAxNCwgMTQKIH07CiAKIGNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9IHsKLSAgNywgNywgNywgNywgNywgNywgNywgMTAsIDEwLAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCAxMCwgMTAsIAogICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEzLCAxMwogfTsKIAogV29yZDMyIHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1s0XVsxNF0gPQogewotICB7MHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwKLSAgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsCi0gICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LAotICAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTZ9LAorICB7MHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgCisgICAweDUwYTI4YmU2LCAgMHg2NTk3ZmE5NSwgIDB4NDAwMDAwMDAsICAweDUwYTI4YmU2LCAKKyAgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsIAorICAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTZ9LCAKIAotICB7MHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwKLSAgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsCi0gICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLAotICAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWV9LAorICB7MHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwgCisgICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlLCAKKyAgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsIAorICAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWV9LCAKIAotICB7MHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwKLSAgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsCi0gICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLAotICAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWR9LAorICB7MHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgCisgICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAKKyAgIDB4NDdkNjZiMGYsICAweDVhODI3OTlhLCAgMHg3MjA4ZjgxZCwgIDB4NDdkNjZiMGYsIAorICAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWR9LCAKIAotICB7MHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwKLSAgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsCi0gICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LAorICB7MHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgCisgICAweDQzY2UzZTRiLCAgMHg1NTZlMDQyNCwgIDB4NmJhMjdlNjUsICAweDQzY2UzZTRiLCAKKyAgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsIAogICAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGJ9CiB9OwogCkBAIC0xNDE3LDEyICsxNDE3LDEyIEBACiB9OwogCiBjb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKKyAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAKIAkyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsICA4MDAwCiB9OwogCiAKLWNvbnN0IGludAlyYXRlc1s4XSA9IHsKK2NvbnN0IGludAlyYXRlc1s4XSA9IHsJCQogCTE2MCwgMjQwLCAzMjAsIDQwMCwgNDgwLCA1NjAsIDY0MCwgMAogfTsKIApAQCAtMTUwNyw3ICsxNTA3LDcgQEAKIH07CiAKIC8qCi0gIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBvbmx5IGZvciBjb3VudGluZyBhbmQKKyAgdGhlc2UgdGFibGVzIGFyZSB1c2VkIG9ubHkgZm9yIGNvdW50aW5nIGFuZCAKICAgYXJlIHN0b3JlZCBpbiBwYWNrZWQgZm9ybWF0CiAqLwogY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxXzJbM11bM11bM11bM109CkBAIC0yMjYwLDEyICsyMjYwLDEyIEBACiB9OwogCiBjb25zdCBXb3JkMzIgbV9sb2cyX3RhYmxlW0lOVF9CSVRTXSA9IHsKLSAgMHgwMDAwMDAwMCwweDRhZTAwZDAwLDB4MjkzNGYwODAsMHgxNWMwMWEzZiwKLSAgMHgwYjMxZmI4MCwweDA1YWViNGUwLDB4MDJkY2YyZDAsMHgwMTZmZTUwYywKKyAgMHgwMDAwMDAwMCwweDRhZTAwZDAwLDB4MjkzNGYwODAsMHgxNWMwMWEzZiwgCisgIDB4MGIzMWZiODAsMHgwNWFlYjRlMCwweDAyZGNmMmQwLDB4MDE2ZmU1MGMsIAogICAweDAwYjg0ZTIzLDB4MDA1YzNlMTAsMHgwMDJlMjRjYSwweDAwMTcxM2Q2LAogICAweDAwMGI4YTQ3LDB4MDAwNWM1M2IsMHgwMDAyZTJhMywweDAwMDE3MTUzLAogICAweDAwMDBiOGFhLDB4MDAwMDVjNTUsMHgwMDAwMmUyYiwweDAwMDAxNzE1LAotICAweDAwMDAwYjhiLDB4MDAwMDA1YzUsMHgwMDAwMDJlMywweDAwMDAwMTcxLAorICAweDAwMDAwYjhiLDB4MDAwMDA1YzUsMHgwMDAwMDJlMywweDAwMDAwMTcxLCAKICAgMHgwMDAwMDBiOSwweDAwMDAwMDVjLDB4MDAwMDAwMmUsMHgwMDAwMDAxNywKICAgMHgwMDAwMDAwYywweDAwMDAwMDA2LDB4MDAwMDAwMDMsMHgwMDAwMDAwMQogfTsKQEAgLTIzNDQsNyArMjM0NCw3IEBACiB9OwogCiAKLWNvbnN0IHVuc2lnbmVkIGNoYXIgYml0cmV2VGFiWzE3ICsgMTI5XSA9Citjb25zdCB1bnNpZ25lZCBjaGFyIGJpdHJldlRhYlsxNyArIDEyOV0gPSAKIHsKIC8qIDY0ICovCiAweDAxLCAweDA4LCAweDAyLCAweDA0LCAweDAzLCAweDBjLCAweDA1LCAweDBhLCAweDA3LCAweDBlLCAweDBiLCAweDBkLCAweDAwLCAweDA2LCAweDA5LCAweDBmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwppbmRleCBiNWU4YTljLi45NzVmNTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAJaW50ZXJNZW0gPSAwOwogCWVycm9yID0gMDsKLQorCQogCS8qIGluaXQgdGhlIG1lbW9yeSBvcGVyYXRvciAqLwogCWlmKHBVc2VyRGF0YSA9PSBOVUxMIHx8IHBVc2VyRGF0YS0+bWVtZmxhZyAhPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SIHx8IHBVc2VyRGF0YS0+bWVtRGF0YSA9PSBOVUxMICkKIAl7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJewogCQkJbWVtX2ZyZWUocE1lbU9QLCBoQWFjRW5jLCBWT19JTkRFWF9FTkNfQUFDKTsKIAkJCWhBYWNFbmMgPSBOVUxMOwotCQl9CisJCX0JCQogCQkqcGhDb2RlYyA9IE5VTEw7CiAJCXJldHVybiBWT19FUlJfT1VUT0ZfTUVNT1JZOwogCX0KQEAgLTE2OCw5ICsxNjgsOSBAQAogCXsKIAkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKIAl9Ci0KKwkKIAloQWFjRW5jID0gKEFBQ19FTkNPREVSICopaENvZGVjOwotCisJCiAJLyogaW5pdCBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwogCWhBYWNFbmMtPmluYnVmID0gKHNob3J0ICopcElucHV0LT5CdWZmZXI7CiAJaEFhY0VuYy0+aW5sZW4gPSBwSW5wdXQtPkxlbmd0aCAvIHNpemVvZihzaG9ydCk7CkBAIC0xNzgsMTIgKzE3OCwxMiBAQAogCiAJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW5idWY7CiAJaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+aW5sZW47Ci0KKwkKIAkvKiByZWJ1aWxkIGludHJhIHBjbSBidWZmZXIgYW5kIGxlbmd0aCovCiAJaWYoaEFhY0VuYy0+aW50bGVuKQogCXsKIAkJbGVuZ3RoID0gbWluKGhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNJbipBQUNFTkNfQkxPQ0tTSVpFIC0gaEFhY0VuYy0+aW50bGVuLCBoQWFjRW5jLT5pbmxlbik7Ci0JCWhBYWNFbmMtPnZvTWVtb3AtPkNvcHkoVk9fSU5ERVhfRU5DX0FBQywgaEFhY0VuYy0+aW50YnVmICsgaEFhY0VuYy0+aW50bGVuLAorCQloQWFjRW5jLT52b01lbW9wLT5Db3B5KFZPX0lOREVYX0VOQ19BQUMsIGhBYWNFbmMtPmludGJ1ZiArIGhBYWNFbmMtPmludGxlbiwgCiAJCQloQWFjRW5jLT5pbmJ1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwogCiAJCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmludGJ1ZjsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQloQWFjRW5jLT5pbmJ1ZiArPSBsZW5ndGg7CiAJCWhBYWNFbmMtPmlubGVuIC09IGxlbmd0aDsKIAl9Ci0KKwkKIAlyZXR1cm4gVk9fRVJSX05PTkU7CiB9CiAKQEAgLTIxOSwxMSArMjE5LDExIEBACiAJIC8qIGNoZWNrIHRoZSBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwogCSBpZihOVUxMID09IGhBYWNFbmMtPmVuY2J1ZiB8fCBoQWFjRW5jLT5lbmNsZW4gPCBpbmJ1ZmxlbikKIAkgewotCQlsZW5ndGggPSBoQWFjRW5jLT5lbmNsZW47CisJCWxlbmd0aCA9IGhBYWNFbmMtPmVuY2xlbjsJCQogCQlpZihoQWFjRW5jLT5pbnRsZW4gPT0gMCkKLQkJewotCQkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYsCi0JCQkJaEFhY0VuYy0+ZW5jYnVmLCBsZW5ndGgqc2l6ZW9mKHNob3J0KSk7CisJCXsJCisJCQloQWFjRW5jLT52b01lbW9wLT5Db3B5KFZPX0lOREVYX0VOQ19BQUMsIGhBYWNFbmMtPmludGJ1ZiwgCisJCQkJaEFhY0VuYy0+ZW5jYnVmLCBsZW5ndGgqc2l6ZW9mKHNob3J0KSk7CQkKIAkJCWhBYWNFbmMtPnVzZWxlbmd0aCArPSBsZW5ndGgqc2l6ZW9mKHNob3J0KTsKIAkJfQogCQllbHNlCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJcE91dHB1dC0+TGVuZ3RoID0gMDsKIAkJaWYocE91dEluZm8pCiAJCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOwotCQlyZXR1cm4gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTDsKKwkJcmV0dXJuIFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEw7CQogCSB9CiAKIAkgLyogY2hlY2sgdGhlIG91dHB1dCBhYWMgYnVmZmVyIGFuZCBsZW5ndGgqLwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJIC8qIHVwZGF0ZSB0aGUgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KIAkgaWYoaEFhY0VuYy0+aW50bGVuKQogCSB7Ci0JCWxlbmd0aCA9IGluYnVmbGVuIC0gaEFhY0VuYy0+aW50bGVuOworCQlsZW5ndGggPSBpbmJ1ZmxlbiAtIGhBYWNFbmMtPmludGxlbjsJCQogCQloQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5pbmJ1ZjsKIAkJaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+aW5sZW47CiAJCWhBYWNFbmMtPnVzZWxlbmd0aCArPSBsZW5ndGgqc2l6ZW9mKHNob3J0KTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQkgaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+ZW5jYnVmICsgaW5idWZsZW47CiAJCSBoQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5lbmNsZW4gLSBpbmJ1ZmxlbjsKIAkJIGhBYWNFbmMtPnVzZWxlbmd0aCArPSBpbmJ1ZmxlbipzaXplb2Yoc2hvcnQpOwotCSB9CisJIH0JIAogCiAJIC8qIHVwZGF0ZSB0aGUgb3V0cHV0IGFhYyBpbmZvcm1hdGlvbiAqLwogCWlmKHBPdXRJbmZvKQpAQCAtMjg3LDcgKzI4Nyw3IEBACiBWT19VMzIgVk9fQVBJIHZvQUFDRW5jVW5pbml0KFZPX0hBTkRMRSBoQ29kZWMpCiB7CiAJQUFDX0VOQ09ERVIqIGhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKWhDb2RlYzsKLQorCQogCWlmKE5VTEwgIT0gaEFhY0VuYykKIAl7CiAJCS8qIGNsb3NlIHRoZSBhYWMgZW5jb2RlciAqLwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJCS8qIGZyZWUgdGhlIGFhYyBlbmNvZGVyIGhhbmRsZSovCiAJCW1lbV9mcmVlKGhBYWNFbmMtPnZvTWVtb3AsIGhBYWNFbmMsIFZPX0lOREVYX0VOQ19BQUMpOwogCQloQWFjRW5jID0gTlVMTDsKLQl9CisJfQkKIAogCXJldHVybiBWT19FUlJfTk9ORTsKIH0KQEAgLTMxOSw3ICszMTksNyBAQAogCiAJaWYoTlVMTCA9PSBoQWFjRW5jKQogCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCisJCiAJc3dpdGNoKHVQYXJhbUlEKQogCXsKIAljYXNlIFZPX1BJRF9BQUNfRU5DUEFSQU06ICAvKiBpbml0IGFhYyBlbmNvZGVyIHBhcmFtZXRlciovCkBAIC0zNTQsMTEgKzM1NCwxMSBAQAogCQlTYW1wbGVSYXRlSWR4ID0gaTsKIAogCQl0bXAgPSA0NDE7Ci0JCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkKKwkJaWYoY29uZmlnLnNhbXBsZVJhdGUlODAwMCA9PSAwKSAKIAkJCXRtcCA9NDgwOwogCQkvKiBjaGVjayB0aGUgYml0cmF0ZSAqLwogCQlpZihjb25maWcuYml0UmF0ZSE9MCAmJiAoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA8IDQwMDApIHx8Ci0gICAgICAgICAgIChjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKSB8fAorICAgICAgICAgICAoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkgfHwgCiAJCSAgIChjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkpCiAJCXsKIAkJCWNvbmZpZy5iaXRSYXRlID0gNjQwKmNvbmZpZy5zYW1wbGVSYXRlL3RtcCpjb25maWcubkNoYW5uZWxzT3V0OwpAQCAtMzg1LDcgKzM4NSw3IEBACiAKIAkJLyogaW5pdCBhYWMgZW5jb2RlciBjb3JlICovCiAJCXJldCA9IEFhY0VuY09wZW4oaEFhY0VuYywgY29uZmlnKTsKLQkJaWYocmV0KQorCQlpZihyZXQpIAogCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNGRUFUVVJFOwogCQlicmVhazsKIAljYXNlIFZPX1BJRF9BVURJT19GT1JNQVQ6CS8qIGluaXQgcGNtIGNoYW5uZWwgYW5kIHNhbXBsZXJhdGUqLwpAQCAtNDI2LDcgKzQyNiw3IEBACiAKIAkJLyogdXBkYXRlIHRoZSBiaXRyYXRlcyAqLwogCQl0bXAgPSA0NDE7Ci0JCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkKKwkJaWYoY29uZmlnLnNhbXBsZVJhdGUlODAwMCA9PSAwKSAKIAkJCXRtcCA9NDgwOwogCiAJCWNvbmZpZy5iaXRSYXRlID0gNjQwKmNvbmZpZy5zYW1wbGVSYXRlL3RtcCpjb25maWcubkNoYW5uZWxzT3V0OwpAQCAtNDQ5LDEwICs0NDksMTAgQEAKIAkJfQogCiAJCWNvbmZpZy5iYW5kV2lkdGggPSBCYW5kd2l0aENvZWZUYWJbaV1bU2FtcGxlUmF0ZUlkeF07Ci0KKwkJCiAJCS8qIGluaXQgYWFjIGVuY29kZXIgY29yZSAqLwogCQlyZXQgPSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7Ci0JCWlmKHJldCkKKwkJaWYocmV0KSAKIAkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQ4Myw3ICs0ODMsNyBAQAogewogCWlmKHBEZWNIYW5kbGUgPT0gTlVMTCkKIAkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQorCQkKIAlwRGVjSGFuZGxlLT5Jbml0ID0gdm9BQUNFbmNJbml0OwogCXBEZWNIYW5kbGUtPlNldElucHV0RGF0YSA9IHZvQUFDRW5jU2V0SW5wdXREYXRhOwogCXBEZWNIYW5kbGUtPkdldE91dHB1dERhdGEgPSB2b0FBQ0VuY0dldE91dHB1dERhdGE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwppbmRleCAyYjNiZDQ4Li5iNjlhMDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuY19jb3JlLmMKQEAgLTQzLDggKzQzLDggQEAKICAgY29uZmlnLT5hZHRzVXNlZCAgICAgICAgPSAxOwogICBjb25maWctPm5DaGFubmVsc0luICAgICA9IDI7CiAgIGNvbmZpZy0+bkNoYW5uZWxzT3V0ICAgID0gMjsKLSAgY29uZmlnLT5iaXRSYXRlICAgICAgICAgPSAxMjgwMDA7Ci0gIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsKKyAgY29uZmlnLT5iaXRSYXRlICAgICAgICAgPSAxMjgwMDA7ICAgICAgICAgICAgICAgICAgICAgIAorICBjb25maWctPmJhbmRXaWR0aCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjMsMTEgKzYzLDExIEBACiAgIFdvcmQxNiBwcm9maWxlID0gMTsKIAogICBFTEVNRU5UX0lORk8gKmVsSW5mbyA9IE5VTEw7Ci0KKyAgIAogICBpZiAoaEFhY0VuYz09MCkgewotICAgIGVycm9yPTE7CisgICAgZXJyb3I9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KLQorICAgCiAgIGlmICghZXJyb3IpIHsKICAgICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7CiAgIH0KQEAgLTgzLDcgKzgzLDcgQEAKIAogICBpZiAoIWVycm9yKSB7CiAgICAgLyogdXNlIG9yIG5vdCB0bnMgdG9vbCBmb3IgbG9uZyBhbmQgc2hvcnQgYmxvY2sgKi8KLQkgV29yZDE2IHRuc01hc2s9MzsKKwkgV29yZDE2IHRuc01hc2s9MzsgICAgICAKIAogCS8qIGluaXQgZW5jb2RlciBwc3ljaG9hY291c3RpYyAqLwogICAgIGVycm9yID0gcHN5TWFpbkluaXQoJmhBYWNFbmMtPnBzeUtlcm5lbCwKQEAgLTEwNywxMCArMTA3LDEwIEBACiAgICAgcWNJbml0LmVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87CiAKICAgICBxY0luaXQubWF4Qml0cyA9IChXb3JkMTYpIChNQVhCSVRTX0NPRUYqZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsKLSAgICBxY0luaXQuYml0UmVzID0gcWNJbml0Lm1heEJpdHM7CisgICAgcWNJbml0LmJpdFJlcyA9IHFjSW5pdC5tYXhCaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgcWNJbml0LmF2ZXJhZ2VCaXRzID0gKFdvcmQxNikgKChjb25maWcuYml0UmF0ZSAqIEZSQU1FX0xFTl9MT05HKSAvIGNvbmZpZy5zYW1wbGVSYXRlKTsKIAotICAgIHFjSW5pdC5wYWRkaW5nLnBhZGRpbmdSZXN0ID0gY29uZmlnLnNhbXBsZVJhdGU7CisgICAgcWNJbml0LnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBjb25maWcuc2FtcGxlUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgcWNJbml0Lm1lYW5QZSA9IChXb3JkMTYpICgoMTAgKiBGUkFNRV9MRU5fTE9ORyAqIGhBYWNFbmMtPmNvbmZpZy5iYW5kV2lkdGgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLnNhbXBsZVJhdGU+PjEpKTsKQEAgLTExOCwxNyArMTE4LDE3IEBACiAgICAgcWNJbml0Lm1heEJpdEZhYyA9IChXb3JkMTYpICgoMTAwICogKE1BWEJJVFNfQ09FRi1NSU5CSVRTX0NPRUYpKiBlbEluZm8tPm5DaGFubmVsc0luRWwpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY0luaXQuYXZlcmFnZUJpdHM/cWNJbml0LmF2ZXJhZ2VCaXRzOjEpKTsKIAotICAgIHFjSW5pdC5iaXRyYXRlID0gY29uZmlnLmJpdFJhdGU7CisgICAgcWNJbml0LmJpdHJhdGUgPSBjb25maWcuYml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICBlcnJvciA9IFFDSW5pdCgmaEFhY0VuYy0+cWNLZXJuZWwsICZxY0luaXQpOwogICB9CiAKICAgLyogaW5pdCBiaXRzdHJlYW0gZW5jb2RlciAqLwogICBpZiAoIWVycm9yKSB7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5uQ2hhbm5lbHMgICA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsKLSAgICBoQWFjRW5jLT5ic2VJbml0LmJpdHJhdGUgICAgID0gY29uZmlnLmJpdFJhdGU7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5zYW1wbGVSYXRlICA9IGNvbmZpZy5zYW1wbGVSYXRlOwotICAgIGhBYWNFbmMtPmJzZUluaXQucHJvZmlsZSAgICAgPSBwcm9maWxlOworICAgIGhBYWNFbmMtPmJzZUluaXQubkNoYW5uZWxzICAgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7ICAgICAgICAgICAgICAgIAorICAgIGhBYWNFbmMtPmJzZUluaXQuYml0cmF0ZSAgICAgPSBjb25maWcuYml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGhBYWNFbmMtPmJzZUluaXQuc2FtcGxlUmF0ZSAgPSBjb25maWcuc2FtcGxlUmF0ZTsgICAgICAgICAgICAgICAgICAgIAorICAgIGhBYWNFbmMtPmJzZUluaXQucHJvZmlsZSAgICAgPSBwcm9maWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAKICAgcmV0dXJuIGVycm9yOwpAQCAtMTUyLDE0ICsxNTIsMTQgQEAKICAgRUxFTUVOVF9JTkZPICplbEluZm8gPSAmYWFjRW5jLT5lbEluZm87CiAgIFdvcmQxNiBnbG9iVXNlZEJpdHM7CiAgIFdvcmQxNiBhbmNEYXRhQnl0ZXMsIGFuY0RhdGFCeXRlc0xlZnQ7Ci0KLSAgYW5jRGF0YUJ5dGVzID0gYW5jRGF0YUJ5dGVzTGVmdCA9ICpudW1BbmNCeXRlczsKKyAgCisgIGFuY0RhdGFCeXRlcyA9IGFuY0RhdGFCeXRlc0xlZnQgPSAqbnVtQW5jQnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAvKiBpbml0IG91dHB1dCBhYWMgZGF0YSBidWZmZXIgYW5kIGxlbmd0aCAqLwogICBhYWNFbmMtPmhCaXRTdHJlYW0gPSBDcmVhdGVCaXRCdWZmZXIoJmFhY0VuYy0+Yml0U3RyZWFtLCBvdXRCeXRlcywgKm51bU91dEJ5dGVzKTsKIAogICAvKiBwc3ljaG9hY291c3RpYyBwcm9jZXNzICovCi0gIHBzeU1haW4oYWFjRW5jLT5jb25maWcubkNoYW5uZWxzT3V0LAorICBwc3lNYWluKGFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dCwgICAgCiAgICAgICAgICAgZWxJbmZvLAogICAgICAgICAgIHRpbWVTaWduYWwsCiAgICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeURhdGFbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLApAQCAtMTc1LDkgKzE3NSw5IEBACiAgIEFkanVzdEJpdHJhdGUoJmFhY0VuYy0+cWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgYWFjRW5jLT5jb25maWcuYml0UmF0ZSwKICAgICAgICAgICAgICAgICBhYWNFbmMtPmNvbmZpZy5zYW1wbGVSYXRlKTsKLQorICAgIAogICAvKiBxdWFudGl6YXRpb24gYW5kIGNvZGluZyBwcm9jZXNzICovCi0gIFFDTWFpbigmYWFjRW5jLT5xY0tlcm5lbCwKKyAgUUNNYWluKCZhYWNFbmMtPnFjS2VybmVsLCAgICAgICAgIAogICAgICAgICAgJmFhY0VuYy0+cWNLZXJuZWwuZWxlbWVudEJpdHMsCiAgICAgICAgICAmYWFjRW5jLT5xY0tlcm5lbC5hZGpUaHIuYWRqVGhyU3RhdGVFbGVtLAogICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLApAQCAtMTkzLDExICsxOTMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7CiAKICAgLyogd3JpdGUgYml0c3RyZWFtIHByb2Nlc3MgKi8KLSAgV3JpdGVCaXRzdHJlYW0oYWFjRW5jLT5oQml0U3RyZWFtLAorICBXcml0ZUJpdHN0cmVhbShhYWNFbmMtPmhCaXRTdHJlYW0sCQkJCSAKICAgICAgICAgICAgICAgICAgKmVsSW5mbywKICAgICAgICAgICAgICAgICAgJmFhY0VuYy0+cWNPdXQsCiAgICAgICAgICAgICAgICAgICZhYWNFbmMtPnBzeU91dCwKLSAgICAgICAgICAgICAgICAgJmdsb2JVc2VkQml0cywKKyAgICAgICAgICAgICAgICAgJmdsb2JVc2VkQml0cywJCQkJIAogICAgICAgICAgICAgICAgICBhbmNCeXRlcywKIAkJCQkgYWFjRW5jLT5wc3lLZXJuZWwuc2FtcGxlUmF0ZUlkeCk7CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKIHsKLSAgaWYgKGhBYWNFbmMpIHsKKyAgaWYgKGhBYWNFbmMpIHsgIAogICAgIFFDRGVsZXRlKCZoQWFjRW5jLT5xY0tlcm5lbCwgcE1lbU9QKTsKIAogICAgIFFDT3V0RGVsZXRlKCZoQWFjRW5jLT5xY091dCwgcE1lbU9QKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwppbmRleCBjNjU2ZjY1Li44M2I0M2ExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCkBAIC03MSw3ICs3MSw3IEBACiAgIFdvcmQzMiAqcHRockV4cCwgKnBzZmJUaHJlOwogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCisJIGZvcihzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKQkgCiAJICBwdGhyRXhwID0gJih0aHJFeHBbY2hdW3NmYkdycF0pOwogCSAgcHNmYlRocmUgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7CiAJICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CkBAIC05NiwyMSArOTYsMjEgQEAKICAgV29yZDMyIG5TZmIsIGF2Z0VuOwogICBXb3JkMTYgbG9nX2F2Z0VuID0gMDsKICAgV29yZDMyIHN0YXJ0UmF0aW9feF9hdmdFbiA9IDA7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwogCiAgICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLwotICAgIGF2Z0VuID0gMDsKLSAgICBuU2ZiID0gMDsKKyAgICBhdmdFbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBuU2ZiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CiAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgIGF2Z0VuID0gTF9hZGQoYXZnRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJPZmZzK3NmYl0pOwogICAgICAgICBuU2ZiID0gblNmYiArIDE7CiAgICAgICB9CiAgICAgfQotCisgICAgIAogICAgIGlmIChuU2ZiID4gMCkgewogCSAgYXZnRW4gPSBhdmdFbiAvIG5TZmI7CiAKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAgc3RhcnRSYXRpb194X2F2Z0VuID0gZml4bXVsKG1zYVBhcmFtLT5zdGFydFJhdGlvLCBhdmdFbik7CiAgICAgfQogCi0KKyAgICAKICAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCiAgICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgewogICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewpAQCAtMTI2LDIyICsxMjYsMjIgQEAKICAgICAgICAgICBXb3JkMTYgZGJSYXRpbywgbWluU25yUmVkOwogICAgICAgICAgIFdvcmQzMiBzbnJSZWQ7CiAgICAgICAgICAgV29yZDE2IG5ld01pblNucjsKLQorICAgICAgICAgIAogICAgICAgICAgIGRiUmF0aW8gPSBsb2dfYXZnRW4gLSBsb2dTZmJFbmVyZ3lbY2hdW3NmYk9mZnMrc2ZiXTsKICAgICAgICAgICBkYlJhdGlvID0gZGJSYXRpbyArIChkYlJhdGlvIDw8IDEpOwogCiAgICAgICAgICAgbWluU25yUmVkID0gMTEwIC0gKChkYlJhdGlvICsgKGRiUmF0aW8gPDwgMSkpID4+IDIpOwotICAgICAgICAgIG1pblNuclJlZCA9IG1heChtaW5TbnJSZWQsIDIwKTsgLyogMTEwOiAoMC4zNzUocmVkT2ZmcykrMSkqODAsCisgICAgICAgICAgbWluU25yUmVkID0gbWF4KG1pblNuclJlZCwgMjApOyAvKiAxMTA6ICgwLjM3NShyZWRPZmZzKSsxKSo4MCwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiAwLjAwMzc1KHJlZFJhdGlvRmFjKSo4MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDogMC4yNShtYXhSZWQpICogODAgKi8KIAotICAgICAgICAgIHNuclJlZCA9IG1pblNuclJlZCAqIGlMb2c0KChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiT2ZmcytzZmJdIDw8IDE2KSk7Ci0gICAgICAgICAgLyoKKyAgICAgICAgICBzbnJSZWQgPSBtaW5TbnJSZWQgKiBpTG9nNCgocHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA8PCAxNikpOyAKKyAgICAgICAgICAvKiAKICAgICAgICAgICAgICBzbnJSZWRJIHNpIG5vdyBzY2FsZWQgYnkgODAgKG1pblNuclJlZCkgYW5kIDQgKGZmcl9pTG9nNCkKICAgICAgICAgICAqLwotCisgICAgICAgIAogICAgICAgICAgIG5ld01pblNuciA9IHJvdW5kMTYocG93Ml94eShzbnJSZWQsODAqNCkpOwotCisgICAgICAgICAKICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiT2ZmcytzZmJdID0gbWluKG5ld01pblNuciwgbWluU25yTGltaXQpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNjksNyArMTY5LDcgQEAKIAogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQorICAgICAKICAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewogICAgICAgICAgcHNmYlNwcmVhZEVuID0gcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3kgKyBzZmJHcnA7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgaWYgKGFoUGFyYW0tPm1vZGlmeU1pblNucikgewogICAgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQorICAgICAgICAgCiAgICAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgICAgICB0aHJlc2hvbGQgPSBIT0xFX1RIUl9MT05HOwogICAgICAgZWxzZQpAQCAtMjA0LDM5ICsyMDQsMzkgQEAKICAgICAgICAgV29yZDE2ICpwc2ZiTWluU25yID0gcHN5T3V0Q2hhbi0+c2ZiTWluU25yICsgc2ZiR3JwOwogCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgICAgV29yZDMyIHNmYkVuLCBzZmJFbm0xLCBzZmJFbnAxLCBhdmdFbjsKLQorICAgICAgICAgICAgIAogICAgICAgICAgIGlmIChzZmIgPiAwKQogICAgICAgICAgICAgc2ZiRW5tMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiLTFdOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHNmYkVubTEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwXTsKLQorICAgICAgICAgICAgIAogICAgICAgICAgIGlmIChzZmIgPCAocHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXAtMSkpCiAgICAgICAgICAgICBzZmJFbnAxID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmIrMV07CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgc2ZiRW5wMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKICAgICAgICAgICBhdmdFbiA9IChzZmJFbm0xICsgc2ZiRW5wMSkgPj4gMTsKLSAgICAgICAgICBzZmJFbiA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLQorICAgICAgICAgIHNmYkVuID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4gJiYgYXZnRW4gPiAwKSB7CiAgICAgICAgICAgICBXb3JkMzIgdG1wTWluU25yOwogICAgICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW4pOwogCQkJdG1wTWluU25yID0gRGl2XzMyKExfbXB5X2xzKGF2Z0VuLCBtaW5TbnJMaW1pdCkgPDwgc2hpZnQsIHNmYkVuIDw8IHNoaWZ0ICk7Ci0gICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCBIT0xFX1RIUl9MT05HKTsKKyAgICAgICAgICAgIHRtcE1pblNuciA9IG1heCh0bXBNaW5TbnIsIEhPTEVfVEhSX0xPTkcpOyAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgdG1wTWluU25yID0gbWF4KHRtcE1pblNuciwgdGhyZXNob2xkKTsKICAgICAgICAgICAgICpwc2ZiTWluU25yID0gbWluKCpwc2ZiTWluU25yLCB0bXBNaW5TbnIpOwogICAgICAgICAgIH0KICAgICAgICAgICAvKiB2YWxsZXkgPyAqLwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKChzZmJFbiA8IChhdmdFbiA+PiAxKSkgJiYgKHNmYkVuID4gMCkpIHsKICAgICAgICAgICAgIFdvcmQzMiB0bXBNaW5TbnI7Ci0gICAgICAgICAgICBXb3JkMzIgbWluU25yRW4gPSBMX21weV93eChhdmdFbiwgKnBzZmJNaW5TbnIpOwotCisgICAgICAgICAgICBXb3JkMzIgbWluU25yRW4gPSBMX21weV93eChhdmdFbiwgKnBzZmJNaW5TbnIpOyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgCiAgICAgICAgICAgICBpZihtaW5TbnJFbiA8IHNmYkVuKSB7CiAJCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuKTsKICAgICAgICAgICAgICAgdG1wTWluU25yID0gRGl2XzMyKCBtaW5TbnJFbiA8PCBzaGlmdCwgc2ZiRW48PHNoaWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB0bXBNaW5TbnIgPSBNQVhfMTY7CisgICAgICAgICAgICAgIHRtcE1pblNuciA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcE1pblNuciA9IG1pbihtaW5TbnJMaW1pdCwgdG1wTWluU25yKTsKIApAQCAtMjUxLDcgKzI1MSw3IEBACiAKICAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKICAgICAgc2lkZSBjaGFubmVscyAqLwotCisgICAKICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuTSA9ICZwc3lPdXRDaGFubmVsWzBdOwogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhblMgPSAmcHN5T3V0Q2hhbm5lbFsxXTsKQEAgLTI2MCwzMCArMjYwLDMwIEBACiAgICAgICAgIFdvcmQzMiBzZmJFbk0gPSBwc3lPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYl07CiAgICAgICAgIFdvcmQzMiBzZmJFblMgPSBwc3lPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYl07CiAgICAgICAgIFdvcmQzMiBtYXhTZmJFbiA9IG1heChzZmJFbk0sIHNmYkVuUyk7Ci0gICAgICAgIFdvcmQzMiBtYXhUaHIgPSBMX21weV93eChtYXhTZmJFbiwgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdKSA+PiAxOwotCisgICAgICAgIFdvcmQzMiBtYXhUaHIgPSBMX21weV93eChtYXhTZmJFbiwgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdKSA+PiAxOyAgICAgICAgCisgICAgICAgICAKICAgICAgICAgaWYobWF4VGhyID49IHNmYkVuTSkgewotICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSA9IE1BWF8xNjsKKyAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW5NKTsKLQkJICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSwKKyAgICAgICAgICBzaGlmdCA9IG5vcm1fbChzZmJFbk0pOyAKKwkJICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSwgCiAJCQkgIHJvdW5kMTYoRGl2XzMyKG1heFRocjw8c2hpZnQsIHNmYkVuTSA8PCBzaGlmdCkpKSwgbWluU25yTGltaXQpOwogICAgICAgICB9Ci0KKyAgICAgICAgIAogICAgICAgICBpZihtYXhUaHIgPj0gc2ZiRW5TKSB7CiAgICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gTUFYXzE2OwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuUyk7Ci0gICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0sCisgICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0sIAogCQkJICByb3VuZDE2KERpdl8zMihtYXhUaHIgPDwgc2hpZnQsIHNmYkVuUyA8PCBzaGlmdCkpKSwgbWluU25yTGltaXQpOwogICAgICAgICB9CiAKLQorICAgICAgICAgCiAgICAgICAgIGlmIChzZmJFbk0gPiBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKICAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuUywgTVNfVEhSU1BSRUFEX0NPRUYpOwotCisgICAgICAgICAKICAgICAgICAgaWYgKHNmYkVuUyA+IHBzeU91dENoYW5TLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdKQogICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJTcHJlYWRlZEVuZXJneVtzZmJdID0gTF9tcHlfbHMoc2ZiRW5NLCBNU19USFJTUFJFQURfQ09FRik7CiAgICAgICB9CkBAIC0yOTcsNyArMjk3LDcgQEAKICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewogICAgICAgV29yZDE2ICpwYWhGbGFnID0gYWhGbGFnW2NoXSArIHNmYkdycDsKIAkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQorICAgICAgICAgICAgICAgCiAgICAgICAgIGlmICgocHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0pIHx8CiAgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdIDw9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXSkgfHwKICAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0gPT0gTUFYXzE2KSkgewpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGZvciAoc2ZiPXBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKKyAgICAgICAgKnBhaEZsYWcrKyA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTMzMSwxNSArMzMxLDE1IEBACiAgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7CiAgIGludCBpcGUsIGljb25zdFBhcnQsIGluQWN0aXZlTGluZXM7CiAKLSAgaXBlID0gMDsKLSAgaWNvbnN0UGFydCA9IDA7Ci0gIGluQWN0aXZlTGluZXMgPSAwOworICBpcGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWNvbnN0UGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGluQWN0aXZlTGluZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwogICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwogICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CiAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KKyAgICAgICAgIAogICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgewogICAgICAgICAgIGlwZSA9IGlwZSArIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOwogICAgICAgICAgIGljb25zdFBhcnQgPSBpY29uc3RQYXJ0ICsgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOwpAQCAtMzQ5LDkgKzM0OSw5IEBACiAgICAgfQogICB9CiAKLSAgKnBlID0gc2F0dXJhdGUoaXBlKTsKLSAgKmNvbnN0UGFydCA9IHNhdHVyYXRlKGljb25zdFBhcnQpOwotICAqbkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUoaW5BY3RpdmVMaW5lcyk7CisgICpwZSA9IHNhdHVyYXRlKGlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqY29uc3RQYXJ0ID0gc2F0dXJhdGUoaWNvbnN0UGFydCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICpuQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShpbkFjdGl2ZUxpbmVzKTsgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM2NywxNiArMzY3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgcmVkVmFsKQogewogICBXb3JkMzIgc2ZiVGhyUmVkdWNlZDsKLSAgV29yZDMyICpwc2ZiRW4sICpwc2ZiVGhyOworICBXb3JkMzIgKnBzZmJFbiwgKnBzZmJUaHI7ICAgICAKICAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsKIAogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwogICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgewotIAkgIHBzZmJFbiAgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3kgKyBzZmJHcnA7CisgCSAgcHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneSArIHNmYkdycDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgcHNmYlRociA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZCArIHNmYkdycDsKIAkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKLQorICAgICAgICAgCiAgICAgICAgIGlmICgqcHNmYkVuID4gKnBzZmJUaHIpIHsKICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KICAgICAgICAgICBXb3JkMzIgdG1wID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbDsKQEAgLTM4NCwxMSArMzg0LDExIEBACiAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IGZpeG11bCh0bXAsIHRtcCk7CiAgICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KICAgICAgICAgICB0bXAgPSBMX21weV9scygqcHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOwotCi0gICAgICAgICAgaWYgKChzZmJUaHJSZWR1Y2VkID4gdG1wKSAmJgorICAgICAgICAgICAgIAorICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZCA+IHRtcCkgJiYgCiAgICAgICAgICAgICAgIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdICE9IE5PX0FIKSl7CiAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHRtcCwgKnBzZmJUaHIpOwotICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA9IEFIX0FDVElWRTsKKyAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgfQogCQkgICpwc2ZiVGhyID0gc2ZiVGhyUmVkdWNlZDsKICAgICAgICAgfQpAQCAtNDI2LDcgKzQyNiw3IEBACiAgIFdvcmQzMiBzZmJUaHJSZWR1Y2VkOwogCiAgIC8qIGZvciBlYWNoIHNmYiBjYWxjIHJlbGF0aXZlIGZhY3RvcnMgZm9yIHBlIGNoYW5nZXMgKi8KLSAgbm9ybUZhY3RvciA9IDE7CisgIG5vcm1GYWN0b3IgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKICAgICBwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CkBAIC00MzYsMjIgKzQzNiwyMiBAQAogCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7CiAJICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CiAgICAgICAgIFdvcmQzMiByZWRUaHJFeHAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsOwotCisgICAgICAgICAgICAgCiAgICAgICAgIGlmICgoKCpwYWhGbGFnIDwgQUhfQUNUSVZFKSB8fCAoZGVsdGFQZSA+IDApKSAmJiAocmVkVGhyRXhwID4gMCkgKSB7Ci0KKyAgICAgICAgICAgIAogICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gKCpwc2ZiTkFjdGl2ZUxpbmVzKSAqICgweDdmZmZmZmZmIC8gcmVkVGhyRXhwKTsKICAgICAgICAgICBub3JtRmFjdG9yID0gTF9hZGQobm9ybUZhY3RvciwgKnBzZmJQZUZhY3RvcnMpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICpwc2ZiUGVGYWN0b3JzID0gMDsKKyAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB9Ci0JCXBzZmJQZUZhY3RvcnMrKzsKKwkJcHNmYlBlRmFjdG9ycysrOyAKIAkJcGFoRmxhZysrOyBwc2ZiTkFjdGl2ZUxpbmVzKys7CiAgICAgICB9CiAgICAgfQogICB9CiAKLQorIAogICAvKiBjYWxjdWxhdGUgbmV3IHRocmVzaG9sZHMgKi8KICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CkBAIC00NjQsNyArNDY0LDcgQEAKICAgICAgICAgLyogcGUgZGlmZmVyZW5jZSBmb3IgdGhpcyBzZmIgKi8KICAgICAgICAgZGVsdGFTZmJQZSA9ICpwc2ZiUGVGYWN0b3JzICogZGVsdGFQZTsKIAotCQkvKiB0aHIzKG4pID0gdGhyMihuKSoyXmRlbHRhU2ZiUGUvYihuKSAqLworCQkvKiB0aHIzKG4pID0gdGhyMihuKSoyXmRlbHRhU2ZiUGUvYihuKSAqLyAgICAgICAgIAogICAgICAgICBpZiAoKnBzZmJOQWN0aXZlTGluZXMgPiAwKSB7CiAgICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLwogICAgICAgICAgIFdvcmQzMiB0aHJGYWN0b3I7CkBAIC00NzYsNyArNDc2LDcgQEAKICAgICAgICAgICAgICAgcmVkdWNlIHRocmVzaG9sZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoTF9uZWdhdGUoZGVsdGFTZmJQZSksIChub3JtRmFjdG9yKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7Ci0KKyAgICAgICAgICAgICAgCiAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTF9tcHlfbHMoc2ZiVGhyLCByb3VuZDE2KHRockZhY3RvcikpOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIHsKQEAgLTQ4NCwyOCArNDg0LDI4IEBACiAgICAgICAgICAgICAgIGluY3JlYXNlIHRocmVzaG9sZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoZGVsdGFTZmJQZSwgKG5vcm1GYWN0b3IgKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7Ci0KLQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmKHRockZhY3RvciA+IHNmYlRocikgewogICAgICAgICAgICAgICBzaGlmdCA9IG5vcm1fbCh0aHJGYWN0b3IpOwogCQkJICBzZmJUaHJSZWR1Y2VkID0gRGl2XzMyKCBzZmJUaHIgPDwgc2hpZnQsIHRockZhY3Rvcjw8c2hpZnQgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTUFYXzMyOworICAgICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgIH0KLQorICAgICAgICAgICAgCiAgICAgICAgICAgLyogYXZvaWQgaG9sZSAqLwogICAgICAgICAgIHNmYkVuID0gTF9tcHlfbHMoc2ZiRW4sIHBzeU91dENoYW4tPnNmYk1pblNucltzZmJHcnArc2ZiXSk7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWQgPiBzZmJFbikgJiYKICAgICAgICAgICAgICAgKCpwYWhGbGFnID09IEFIX0lOQUNUSVZFKSkgewogICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IG1heChzZmJFbiwgc2ZiVGhyKTsKLSAgICAgICAgICAgICpwYWhGbGFnID0gQUhfQUNUSVZFOworICAgICAgICAgICAgKnBhaEZsYWcgPSBBSF9BQ1RJVkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgfQogCi0gICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZDsKKyAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl0gPSBzZmJUaHJSZWR1Y2VkOyAgCiAgICAgICAgIH0KIAogCQlwYWhGbGFnKys7IHBzZmJOQWN0aXZlTGluZXMrKzsgcHNmYlBlRmFjdG9ycysrOwpAQCAtNTIxLDggKzUyMSw4IEBACiAqIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWR1Y2VNaW5TbnIoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCitzdGF0aWMgdm9pZCByZWR1Y2VNaW5TbnIoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sIAorICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBkZXNpcmVkUGUpCkBAIC01MzEsOSArNTMxLDkgQEAKICAgV29yZDE2IGRlbHRhUGU7CiAKICAgLyogc3RhcnQgYXQgaGlnaGVzdCBmcmVxIGRvd24gdG8gMCAqLwotICBzZmJTdWJXaW4gPSBwc3lPdXRDaGFubmVsWzBdLm1heFNmYlBlckdyb3VwOworICBzZmJTdWJXaW4gPSBwc3lPdXRDaGFubmVsWzBdLm1heFNmYlBlckdyb3VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgd2hpbGUgKHBlRGF0YS0+cGUgPiBkZXNpcmVkUGUgJiYgc2ZiU3ViV2luID4gMCkgewotCisgICAgICAgCiAgICAgc2ZiU3ViV2luID0gc2ZiU3ViV2luIC0gMTsKICAgICAvKiBsb29wIG92ZXIgYWxsIHN1YndpbmRvd3MgKi8KICAgICBmb3IgKHNmYj1zZmJTdWJXaW47IHNmYjxwc3lPdXRDaGFubmVsWzBdLnNmYkNudDsKQEAgLTU0MSwxMCArNTQxLDEwIEBACiAgICAgICAvKiBsb29wIG92ZXIgYWxsIGNoYW5uZWxzICovCiAJCVBFX0NIQU5ORUxfREFUQSogcGVDaGFuID0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhOwogCQlQU1lfT1VUX0NIQU5ORUwqIHBzeU91dENoID0gcHN5T3V0Q2hhbm5lbDsKLQkJZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKwkJZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsgICAgICAgICAgIAogICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIICYmCiAgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiTWluU25yW3NmYl0gPCBtaW5TbnJMaW1pdCkgewotICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA9IG1pblNuckxpbWl0OworICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA9IG1pblNuckxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgcHN5T3V0Q2gtPnNmYlRocmVzaG9sZFtzZmJdID0KICAgICAgICAgICAgIExfbXB5X2xzKHBzeU91dENoLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdKTsKIApAQCAtNTUyLDEyICs1NTIsMTIgQEAKICAgICAgICAgICBkZWx0YVBlID0gKChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSArIChwZUNoYW4tPnNmYk5MaW5lczRbc2ZiXSA+PiAxKSkgPj4gMikgLQogICAgICAgICAgICAgICBwZUNoYW4tPnNmYlBlW3NmYl07CiAgICAgICAgICAgcGVEYXRhLT5wZSA9IHBlRGF0YS0+cGUgKyBkZWx0YVBlOwotICAgICAgICAgIHBlQ2hhbi0+cGUgPSBwZUNoYW4tPnBlICsgZGVsdGFQZTsKKyAgICAgICAgICBwZUNoYW4tPnBlID0gcGVDaGFuLT5wZSArIGRlbHRhUGU7CQkgIAogICAgICAgICB9CiAJCXBlQ2hhbiArPSAxOyBwc3lPdXRDaCArPSAxOwogICAgICAgfQogICAgICAgLyogc3RvcCBpZiBlbm91Z2ggaGFzIGJlZW4gc2F2ZWQgKi8KLQorICAgICAgIAogICAgICAgaWYgKHBlRGF0YS0+cGUgPD0gZGVzaXJlZFBlKQogICAgICAgICBicmVhazsKICAgICB9CkBAIC01NjcsMTMgKzU2NywxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGZ1bmN0aW9uIG5hbWU6YWxsb3dNb3JlSG9sZXMKLSogZGVzY3JpcHRpb246IGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgc29tZSBtb3JlIHNjYWxlZmFjdG9yIGJhbmRzCisqIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHNvbWUgbW9yZSBzY2FsZWZhY3RvciBiYW5kcyAgCiAqICAgICAgICAgICAgICBoYXZlIHRvIGJlIHF1YW50aXplZCB0byB6ZXJvCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWxsb3dNb3JlSG9sZXMoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCitzdGF0aWMgdm9pZCBhbGxvd01vcmVIb2xlcyhQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgKnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFIX1BBUkFNICAqYWhQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLApAQCAtNTgyLDQ2ICs1ODIsNDYgQEAKICAgV29yZDE2IGNoLCBzZmI7CiAgIFdvcmQxNiBhY3RQZSwgc2hpZnQ7CiAKLSAgYWN0UGUgPSBwZURhdGEtPnBlOworICBhY3RQZSA9IHBlRGF0YS0+cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAvKiBmb3IgTVMgYWxsb3cgaG9sZSBpbiB0aGUgY2hhbm5lbCB3aXRoIGxlc3MgZW5lcmd5ICovCi0KKyAgICAgCiAgIGlmIChuQ2hhbm5lbHM9PTIgJiYKICAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U9PXBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UpIHsKICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5MID0gJnBzeU91dENoYW5uZWxbMF07CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuUiA9ICZwc3lPdXRDaGFubmVsWzFdOwogICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuTC0+c2ZiQ250OyBzZmIrKykgewogICAgICAgV29yZDMyIG1pbkVuOwotCisgICAgICAgCiAgICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7CiAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gc2lkZSBjaGFubmVsID8gKi8KICAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5MLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOwotCisgICAgICAgICAgIAogICAgICAgICBpZiAoYWhGbGFnWzFdW3NmYl0gIT0gTk9fQUggJiYKICAgICAgICAgICAgIG1pbkVuID4gcHN5T3V0Q2hhblItPnNmYkVuZXJneVtzZmJdKSB7Ci0gICAgICAgICAgYWhGbGFnWzFdW3NmYl0gPSBOT19BSDsKKyAgICAgICAgICBhaEZsYWdbMV1bc2ZiXSA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBwc3lPdXRDaGFuUi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSk7CiAgICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJdOwogICAgICAgICB9CiAgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLwogICAgICAgICBlbHNlIHsKICAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5SLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOwotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYgKGFoRmxhZ1swXVtzZmJdIT0gTk9fQUggJiYKICAgICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0pIHsKLSAgICAgICAgICAgIGFoRmxhZ1swXVtzZmJdID0gTk9fQUg7CisgICAgICAgICAgICBhaEZsYWdbMF1bc2ZiXSA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBwc3lPdXRDaGFuTC0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSk7CiAgICAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYl07CiAgICAgICAgICAgfQogICAgICAgICB9Ci0KKyAgICAgICAgIAogICAgICAgICBpZiAoYWN0UGUgPCBkZXNpcmVkUGUpCiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgLyogc3Vic2VxdWVudGx5IGVyYXNlIGJhbmRzICovCisgIC8qIHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcyAqLyAgIAogICBpZiAoYWN0UGUgPiBkZXNpcmVkUGUpIHsKICAgICBXb3JkMTYgc3RhcnRTZmJbMl07CiAgICAgV29yZDMyIGF2Z0VuLCBtaW5FbjsKQEAgLTYzNCwyMCArNjM0LDIwIEBACiAKICAgICAvKiBkbyBub3QgZ28gYmVsb3cgc3RhcnRTZmIgKi8KICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotCisgICAgICAgICAKICAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IGFoUGFyYW0tPnN0YXJ0U2ZiTDsKICAgICAgIGVsc2UKICAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJTOwogICAgIH0KIAotICAgIGF2Z0VuID0gMDsKLSAgICBtaW5FbiA9IE1BWF8zMjsKLSAgICBhaENudCA9IDA7CisgICAgYXZnRW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgbWluRW4gPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYWhDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKICAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiW2NoXTsgc2ZiPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiKyspIHsKLQorICAgICAgICAgICAKICAgICAgICAgaWYgKChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUgpICYmCiAgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiXSkpIHsKICAgICAgICAgICBtaW5FbiA9IG1pbihtaW5FbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOwpAQCAtNjU2LDcgKzY1Niw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KKyAgICAgCiAgICAgaWYoYWhDbnQpIHsKICAgICAgIFdvcmQzMiBpYWhDbnQ7CiAgICAgICBzaGlmdCA9IG5vcm1fbChhaENudCk7CkBAIC02NzQsNDYgKzY3NCw0NiBAQAogCiAgICAgLyogc3RhcnQgd2l0aCBsb3dlc3QgZW5lcmd5IGJvcmRlciBhdCBoaWdoZXN0IHNmYiAqLwogICAgIG1heFNmYiA9IHBzeU91dENoYW5uZWxbMF0uc2ZiQ250IC0gMTsKLSAgICBtaW5TZmIgPSBzdGFydFNmYlswXTsKLQorICAgIG1pblNmYiA9IHN0YXJ0U2ZiWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgCiAgICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CiAgICAgICBtYXhTZmIgPSBtYXgobWF4U2ZiLCAocHN5T3V0Q2hhbm5lbFsxXS5zZmJDbnQgLSAxKSk7CiAgICAgICBtaW5TZmIgPSBtaW4obWluU2ZiLCBzdGFydFNmYlsxXSk7CiAgICAgfQogCi0gICAgc2ZiID0gbWF4U2ZiOwotICAgIGVuSWR4ID0gMDsKLSAgICBkb25lID0gMDsKKyAgICBzZmIgPSBtYXhTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZW5JZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGRvbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB3aGlsZSAoIWRvbmUpIHsKLQorICAgICAgIAogICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCisgICAgICAgICAgIAogICAgICAgICBpZiAoc2ZiPj1zdGFydFNmYltjaF0gJiYgc2ZiPHBzeU91dENoYW4tPnNmYkNudCkgewogICAgICAgICAgIC8qIHNmYiBlbmVyZ3kgYmVsb3cgYm9yZGVyID8gKi8KLQorICAgICAgICAgICAgIAogICAgICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUggJiYgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0gPCBlbltlbklkeF0pewogICAgICAgICAgICAgLyogYWxsb3cgaG9sZSAqLwotICAgICAgICAgICAgYWhGbGFnW2NoXVtzZmJdID0gTk9fQUg7CisgICAgICAgICAgICBhaEZsYWdbY2hdW3NmYl0gPSBOT19BSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOwogICAgICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF0uc2ZiUGVbc2ZiXTsKICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgCiAgICAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKSB7Ci0gICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgIGRvbmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHNmYiA9IHNmYiAtIDE7Ci0KKyAgICAgICAKICAgICAgIGlmIChzZmIgPCBtaW5TZmIpIHsKICAgICAgICAgLyogcmVzdGFydCB3aXRoIG5leHQgZW5lcmd5IGJvcmRlciAqLwotICAgICAgICBzZmIgPSBtYXhTZmI7CisgICAgICAgIHNmYiA9IG1heFNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBlbklkeCA9IGVuSWR4ICsgMTsKLQorICAgICAgICAgCiAgICAgICAgIGlmIChlbklkeCAtIDQgPj0gMCkKLSAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICBkb25lID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB9CiAgICAgfQogICB9CkBAIC03NDgsMTMgKzc0OCwxMyBAQAogCiAgIGluaXRBdm9pZEhvbGVGbGFnKHBlRGF0YS0+YWhGbGFnLCBwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBuQ2hhbm5lbHMsIGFoUGFyYW0pOwogCi0gIG5vUmVkUGUgPSBwZURhdGEtPnBlOwotICBjb25zdFBhcnQgPSBwZURhdGEtPmNvbnN0UGFydDsKLSAgbkFjdGl2ZUxpbmVzID0gcGVEYXRhLT5uQWN0aXZlTGluZXM7CisgIG5vUmVkUGUgPSBwZURhdGEtPnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgY29uc3RQYXJ0ID0gcGVEYXRhLT5jb25zdFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBuQWN0aXZlTGluZXMgPSBwZURhdGEtPm5BY3RpdmVMaW5lczsgICAgICAgCiAKICAgLyogZmlyc3QgZ3Vlc3Mgb2YgcmVkdWN0aW9uIHZhbHVlIHReMC4yNSA9IDJeKChhLXBlbikvNCpiKSAqLwogICBhdmdUaHJFeHAgPSBwb3cyX3h5KChjb25zdFBhcnQgLSBub1JlZFBlKSwgKG5BY3RpdmVMaW5lcyA8PCAyKSk7Ci0KKyAgCiAgIC8qIHIxID0gMl4oKGEtcGVyKS80KmIpIC0gdF4wLjI1ICovCiAgIHJlZFZhbCA9IHBvdzJfeHkoKGNvbnN0UGFydCAtIGRlc2lyZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpIC0gYXZnVGhyRXhwOwogCkBAIC03NjMsNDAgKzc2Myw0MCBAQAogCiAgIC8qIHBlIGFmdGVyIGZpcnN0IGd1ZXNzICovCiAgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0gIHJlZFBlID0gcGVEYXRhLT5wZTsKKyAgcmVkUGUgPSBwZURhdGEtPnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIGl0ZXIgPSAwOworICBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGRvIHsKICAgICAvKiBwZSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZSAqLwogICAgIGNhbGNQZU5vQUgoJnJlZFBlTm9BSCwgJmNvbnN0UGFydE5vQUgsICZuQWN0aXZlTGluZXNOb0FILAogICAgICAgICAgICAgICAgcGVEYXRhLCBwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKIAogICAgIGRlc2lyZWRQZU5vQUggPSBkZXNpcmVkUGUgLShyZWRQZSAtIHJlZFBlTm9BSCk7Ci0KKyAgICAgCiAgICAgaWYgKGRlc2lyZWRQZU5vQUggPCAwKSB7Ci0gICAgICBkZXNpcmVkUGVOb0FIID0gMDsKKyAgICAgIGRlc2lyZWRQZU5vQUggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KIAogICAgIC8qIHNlY29uZCBndWVzcyAqLwotCisgICAgIAogICAgIGlmIChuQWN0aXZlTGluZXNOb0FIID4gMCkgewotCisJCQogCQlhdmdUaHJFeHAgPSBwb3cyX3h5KChjb25zdFBhcnROb0FIIC0gcmVkUGVOb0FIKSwgKG5BY3RpdmVMaW5lc05vQUggPDwgMikpOwotCisJCQogCQlyZWRWYWwgPSAocmVkVmFsICsgcG93Ml94eSgoY29uc3RQYXJ0Tm9BSCAtIGRlc2lyZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSkpIC0gYXZnVGhyRXhwOwotCisJCQogCQkvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwogCQlyZWR1Y2VUaHJlc2hvbGRzKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEtPnRockV4cCwgbkNoYW5uZWxzLCByZWRWYWwpOwogICAgIH0KIAogICAgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0gICAgcmVkUGUgPSBwZURhdGEtPnBlOworICAgIHJlZFBlID0gcGVEYXRhLT5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICBpdGVyID0gaXRlcisxOwotCisgICAgICAgCiAgIH0gd2hpbGUgKCgyMCAqIGFic19zKHJlZFBlIC0gZGVzaXJlZFBlKSA+IGRlc2lyZWRQZSkgJiYgKGl0ZXIgPCAyKSk7CiAKLQorICAgCiAgIGlmICgoMTAwICogcmVkUGUgPCAxMTUgKiBkZXNpcmVkUGUpKSB7CiAgICAgY29ycmVjdFRocmVzaChwc3lPdXRDaGFubmVsLCBwZURhdGEtPmFoRmxhZywgcGVEYXRhLCBwZURhdGEtPnRockV4cCwgcmVkVmFsLAogICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBkZXNpcmVkUGUgLSByZWRQZSk7CkBAIC04NjMsNyArODYzLDcgQEAKICAgaWYoY2xpcEhpZ2gtY2xpcExvdykKICAgYml0c3BlbmQgPSAobWluQml0U3BlbmQgKyAoKG1heEJpdFNwZW5kIC0gbWluQml0U3BlbmQpKihmaWxsTGV2ZWwgLSBjbGlwTG93KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlwSGlnaC1jbGlwTG93KSkpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIHJldHVybiAoYml0c3BlbmQpOwogfQogCkBAIC04ODQsMTkgKzg4NCwxOSBAQAogICBXb3JkMTYgbWluRmFjSGksIG1heEZhY0hpLCBtaW5GYWNMbywgbWF4RmFjTG87CiAgIFdvcmQxNiBkaWZmOwogICBXb3JkMTYgbWluRGlmZiA9IGV4dHJhY3RfbChjdXJyUGUgLyA2KTsKLSAgbWluRmFjSGkgPSAzMDsKLSAgbWF4RmFjSGkgPSAxMDA7Ci0gIG1pbkZhY0xvID0gMTQ7Ci0gIG1heEZhY0xvID0gNzsKKyAgbWluRmFjSGkgPSAzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbWF4RmFjSGkgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbWluRmFjTG8gPSAxNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbWF4RmFjTG8gPSA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBkaWZmID0gY3VyclBlIC0gKnBlTWF4IDsKLQorICAgCiAgIGlmIChkaWZmID4gMCkgewogICAgICpwZU1pbiA9ICpwZU1pbiArICgoZGlmZiAqIG1pbkZhY0hpKSAvIDEwMCk7CiAgICAgKnBlTWF4ID0gKnBlTWF4ICsgKChkaWZmICogbWF4RmFjSGkpIC8gMTAwKTsKICAgfSBlbHNlIHsKICAgICBkaWZmID0gKnBlTWluIC0gY3VyclBlOwotCisgICAgIAogICAgIGlmIChkaWZmID4gMCkgewogICAgICAgKnBlTWluID0gKnBlTWluIC0gKChkaWZmICogbWluRmFjTG8pIC8gMTAwKTsKICAgICAgICpwZU1heCA9ICpwZU1heCAtICgoZGlmZiAqIG1heEZhY0xvKSAvIDEwMCk7CkBAIC05MDYsNyArOTA2LDcgQEAKICAgICB9CiAgIH0KIAotCisgICAKICAgaWYgKCgqcGVNYXggLSAqcGVNaW4pIDwgbWluRGlmZikgewogICAgIFdvcmQxNiBwYXJ0TG8sIHBhcnRIaTsKIApAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIChhZGpUaHJDaGFuLT5wZU1heCAtIGFkalRockNoYW4tPnBlTWluKSk7CiAgIGVsc2UKIAliaXRyZXNGYWMgPSAweDdmZmY7Ci0KKyAgICAgICAgICAgICAgIAogICBiaXRyZXNGYWMgPSBtaW4oYml0cmVzRmFjLAogICAgICAgICAgICAgICAgICAgICAoMTAwLTMwICsgZXh0cmFjdF9sKCgxMDAgKiBiaXRyZXNCaXRzKSAvIGF2Z0JpdHMpKSk7CiAKQEAgLTk5NSwyMyArOTk1LDIzIEBACiAKICAgLyogY29tbW9uIGZvciBhbGwgZWxlbWVudHM6ICovCiAgIC8qIHBhcmFtZXRlcnMgZm9yIGJpdHJlcyBjb250cm9sICovCi0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVMb3cgICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gIDk1OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNhdmUgICAgPSAgLTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U2F2ZSAgICA9ICAzMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTcGVuZEhpZ2ggPSAgOTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U3BlbmQgICA9IC0xMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gIDQwOworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAgMjA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gIDk1OyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSAgICA9ICAtNTsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAgMzA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gIDIwOyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kSGlnaCA9ICA5NTsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAtMTA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gIDQwOyAgICAgICAgICAgICAgICAgICAgCiAKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVMb3cgICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoICA9ICA3NTsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U2F2ZSAgICA9ICAgMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kSGlnaCA9ICA3NTsKLSAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U3BlbmQgICA9IC01OwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTcGVuZCAgID0gIDUwOworICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gIDIwOyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVIaWdoICA9ICA3NTsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1pbkJpdFNhdmUgICAgPSAgIDA7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlICAgID0gIDIwOyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNwZW5kTG93ICA9ICAyMDsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZEhpZ2ggPSAgNzU7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCAgID0gLTU7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U3BlbmQgICA9ICA1MDsgICAgICAgICAgICAgICAgICAgCiAKICAgLyogc3BlY2lmaWMgZm9yIGVhY2ggZWxlbWVudDogKi8KIApAQCAtMTAyMCw3ICsxMDIwLDcgQEAKICAgYXRzRWxlbS0+cGVNYXggPSBleHRyYWN0X2woKCgxMjAqbWVhblBlKSAvIDEwMCkpOwogCiAgIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCi0gIGF0c0VsZW0tPnBlT2Zmc2V0ID0gMDsKKyAgYXRzRWxlbS0+cGVPZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGlmIChjaEJpdHJhdGUgPCAzMjAwMCkgewogICAgIGF0c0VsZW0tPnBlT2Zmc2V0ID0gbWF4KDUwLCAoMTAwIC0gZXh0cmFjdF9sKCgxMDAgKiBjaEJpdHJhdGUpIC8gMzIwMDApKSk7CiAgIH0KQEAgLTEwMzksMjQgKzEwMzksMjQgQEAKIAogICAvKiBtaW5TbnIgYWRhcHRhdGlvbiAqLwogICAvKiBtYXhpbXVtIHJlZHVjdGlvbiBvZiBtaW5TbnIgZ29lcyBkb3duIHRvIG1pblNucl5tYXhSZWQgKi8KLSAgbXNhUGFyYW0tPm1heFJlZCA9IDB4MjAwMDAwMDA7ICAgICAvKiAqMC4yNWYgLworICBtc2FQYXJhbS0+bWF4UmVkID0gMHgyMDAwMDAwMDsgICAgIC8qICowLjI1ZiAvICAgICAgICAgICAgICAgICAgICAgICAgCiAgIC8qIHN0YXJ0IGFkYXB0YXRpb24gb2YgbWluU25yIGZvciBhdmdFbi9zZmJFbiA+IHN0YXJ0UmF0aW8gKi8KLSAgbXNhUGFyYW0tPnN0YXJ0UmF0aW8gPSAweDBjY2NjY2NkOyAvKiAxMCAqLworICBtc2FQYXJhbS0+c3RhcnRSYXRpbyA9IDB4MGNjY2NjY2Q7IC8qIDEwICovICAgICAgICAgICAgICAgICAgICAgICAgCiAgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCiAgICAgIGF2Z0VuL3NmYkVuID49IG1heFJhdGlvICovCi0gIG1zYVBhcmFtLT5tYXhSYXRpbyA9ICAweDAwMjBjNDljOyAvKiAxMDAwICovCisgIG1zYVBhcmFtLT5tYXhSYXRpbyA9ICAweDAwMjBjNDljOyAvKiAxMDAwICovICAgICAgICAgICAgICAgICAgICAgICAgIAogICAvKiBoZWxwZXIgdmFyaWFibGVzIHRvIGludGVycG9sYXRlIG1pblNuciByZWR1Y3Rpb24gZm9yCiAgICAgIGF2Z0VuL3NmYkVuIGJldHdlZW4gc3RhcnRSYXRpbyBhbmQgbWF4UmF0aW8gKi8KIAotICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAweGZiMzMzMzMzOyAvKiAtMC43NS8yMCAqLworICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAweGZiMzMzMzMzOyAvKiAtMC43NS8yMCAqLyAgICAgICAgIAogCi0gIG1zYVBhcmFtLT5yZWRPZmZzID0gMHgzMDAwMDAwMDsgIC8qIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyAqIDEwKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvKSAqLworICBtc2FQYXJhbS0+cmVkT2ZmcyA9IDB4MzAwMDAwMDA7ICAvKiBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgKiAxMCpsb2cxMChtc2FQYXJhbS0+c3RhcnRSYXRpbykgKi8gIAogCi0KKyAgICAgICAKICAgLyogcGUgY29ycmVjdGlvbiAqLwotICBhdHNFbGVtLT5wZUxhc3QgPSAwOwotICBhdHNFbGVtLT5keW5CaXRzTGFzdCA9IDA7Ci0gIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3RvciA9IDEwMDsgLyogMS4wICovCisgIGF0c0VsZW0tPnBlTGFzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBhdHNFbGVtLT5keW5CaXRzTGFzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYXRzRWxlbS0+cGVDb3JyZWN0aW9uRmFjdG9yID0gMTAwOyAvKiAxLjAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgCiAKIH0KIApAQCAtMTA2OSwyMCArMTA2OSwyMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBjYWxjUGVDb3JyZWN0aW9uKFdvcmQxNiAqY29ycmVjdGlvbkZhYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlQWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYml0c0xhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZUxhc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYml0c0xhc3QpIAogewogICBXb3JkMzIgcGVBY3QxMDAgPSAxMDAgKiBwZUFjdDsKICAgV29yZDMyIHBlTGFzdDEwMCA9IDEwMCAqIHBlTGFzdDsKICAgV29yZDE2IHBlQml0c0xhc3QgPSBiaXRzMnBlKGJpdHNMYXN0KTsKLQorICAgICAgICAgICAKICAgaWYgKChiaXRzTGFzdCA+IDApICYmCiAgICAgICAocGVBY3QxMDAgPCAoMTUwICogcGVMYXN0KSkgJiYgIChwZUFjdDEwMCA+ICg3MCAqIHBlTGFzdCkpICYmCiAgICAgICAoKDEyMCAqIHBlQml0c0xhc3QpID4gcGVMYXN0MTAwICkgJiYgKCggNjUgKiBwZUJpdHNMYXN0KSA8IHBlTGFzdDEwMCkpCiAgICAgewogICAgICAgV29yZDE2IG5ld0ZhYyA9ICgxMDAgKiBwZUxhc3QpIC8gcGVCaXRzTGFzdDsKICAgICAgIC8qIGRlYWQgem9uZSAqLwotCisgICAgICAgCiAgICAgICBpZiAobmV3RmFjIDwgMTAwKSB7CiAgICAgICAgIG5ld0ZhYyA9IG1pbigoKDExMCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOwogICAgICAgICBuZXdGYWMgPSBtYXgobmV3RmFjLCA4NSk7CkBAIC0xMDkxLDEzICsxMDkxLDEzIEBACiAgICAgICAgIG5ld0ZhYyA9IG1heCgoKDkwICogbmV3RmFjKSAvIDEwMCksIDEwMCk7CiAgICAgICAgIG5ld0ZhYyA9IG1pbihuZXdGYWMsIDExNSk7CiAgICAgICB9Ci0KKyAgICAgICAgIAogICAgICAgaWYgKChuZXdGYWMgPiAxMDAgJiYgKmNvcnJlY3Rpb25GYWMgPCAxMDApIHx8CiAgICAgICAgICAgKG5ld0ZhYyA8IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA+IDEwMCkpIHsKLSAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7CisgICAgICAgICpjb3JyZWN0aW9uRmFjID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICAgICAgIC8qIGZhc3RlciBhZGFwdGF0aW9uIHRvd2FyZHMgMS4wLCBzbG93ZXIgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLwotCisgICAgICAgICAgICAgCiAgICAgICBpZiAoKCpjb3JyZWN0aW9uRmFjIDwgMTAwICYmIG5ld0ZhYyA8ICpjb3JyZWN0aW9uRmFjKSB8fAogICAgICAgICAgICgqY29ycmVjdGlvbkZhYyA+IDEwMCAmJiBuZXdGYWMgPiAqY29ycmVjdGlvbkZhYykpCiAgICAgICAgICpjb3JyZWN0aW9uRmFjID0gKDg1ICogKmNvcnJlY3Rpb25GYWMgKyAxNSAqIG5ld0ZhYykgLyAxMDA7CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogICAgICAgKmNvcnJlY3Rpb25GYWMgPSBtYXgoKmNvcnJlY3Rpb25GYWMsIDg1KTsKICAgICB9CiAgIGVsc2UgewotICAgICpjb3JyZWN0aW9uRmFjID0gMTAwOworICAgICpjb3JyZWN0aW9uRmFjID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIH0KIApAQCAtMTEyMyw0MCArMTEyMyw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmNoQml0RGlzdHJpYnV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQgICpxY09FLAogCQkJCQkgIEVMRU1FTlRfQklUUwkgICplbEJpdHMsCiAJCQkJCSAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBtYXhCaXRGYWMpCiB7Ci0gIFBFX0RBVEEgcGVEYXRhOworICBQRV9EQVRBIHBlRGF0YTsgIAogICBXb3JkMTYgbm9SZWRQZSwgZ3JhbnRlZFBlLCBncmFudGVkUGVDb3JyOwogICBXb3JkMTYgY3VyV2luZG93U2VxdWVuY2U7CiAgIFdvcmQxNiBiaXRGYWN0b3I7CiAgIFdvcmQxNiBhdmdCaXRzID0gKGVsQml0cy0+YXZlcmFnZUJpdHMgLSAocWNPRS0+c3RhdGljQml0c1VzZWQgKyBxY09FLT5hbmNCaXRzVXNlZCkpOwotICBXb3JkMTYgYml0cmVzQml0cyA9IGVsQml0cy0+Yml0UmVzTGV2ZWw7CisgIFdvcmQxNiBiaXRyZXNCaXRzID0gZWxCaXRzLT5iaXRSZXNMZXZlbDsgCiAgIFdvcmQxNiBtYXhCaXRyZXNCaXRzID0gZWxCaXRzLT5tYXhCaXRzOwogICBXb3JkMTYgc2lkZUluZm9CaXRzID0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpOwogICBXb3JkMTYgY2g7Ci0KKyAgIAogICBwcmVwYXJlU2ZiUGUoJnBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbG9nU2ZiRW5lcmd5LCBzZmJOUmVsZXZhbnRMaW5lcywgbkNoYW5uZWxzLCBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlT2Zmc2V0KTsKLQorICAgCiAgIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCiAgIGNhbGNTZmJQZSgmcGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwotICBub1JlZFBlID0gcGVEYXRhLnBlOworICBub1JlZFBlID0gcGVEYXRhLnBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAKLSAgY3VyV2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKLQorICBjdXJXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgCiAgIGlmIChuQ2hhbm5lbHMgPT0gMikgewotCisgICAgICAgCiAgICAgaWYgKChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgfHwKICAgICAgICAgKHBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSkgewotICAgICAgY3VyV2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CisgICAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICB9CiAgIGVsc2UgewotICAgIGN1cldpbmRvd1NlcXVlbmNlID0gcHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZTsKKyAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U7ICAgICAgICAgICAgICAgICAKICAgfQogCiAKQEAgLTExNzAsMTMgKzExNzAsMTMgQEAKICAgZ3JhbnRlZFBlID0gKChiaXRGYWN0b3IgKiBiaXRzMnBlKGF2Z0JpdHMpKSAvIDEwMCk7CiAKICAgLyogY29ycmVjdGlvbiBvZiBwZSB2YWx1ZSAqLwotICBjYWxjUGVDb3JyZWN0aW9uKCYoQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpLAorICBjYWxjUGVDb3JyZWN0aW9uKCYoQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpLCAKICAgICAgICAgICAgICAgICAgICBtaW4oZ3JhbnRlZFBlLCBub1JlZFBlKSwKLSAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKKyAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwgCiAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCk7CiAgIGdyYW50ZWRQZUNvcnIgPSAoZ3JhbnRlZFBlICogQWRqVGhyU3RhdGVFbGVtZW50LT5wZUNvcnJlY3Rpb25GYWN0b3IpIC8gMTAwOwogCi0KKyAgICAgCiAgIGlmIChncmFudGVkUGVDb3JyIDwgbm9SZWRQZSAmJiBub1JlZFBlID4gcGVEYXRhLm9mZnNldCkgewogICAgIC8qIGNhbGMgdGhyZXNob2xkIG5lY2Vzc2FyeSBmb3IgZGVzaXJlZCBwZSAqLwogICAgIGFkYXB0VGhyZXNob2xkc1RvUGUocHN5T3V0Q2hhbm5lbCwKQEAgLTExOTIsOCArMTE5Miw4IEBACiAgIC8qIGNhbGN1bGF0ZSByZWxhdGl2ZSBkaXN0cmlidXRpb24gKi8KICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICBXb3JkMTYgcGVPZmZzRGlmZiA9IHBlRGF0YS5wZSAtIHBlRGF0YS5vZmZzZXQ7Ci0gICAgY2hCaXREaXN0cmlidXRpb25bY2hdID0gMjAwOwotCisgICAgY2hCaXREaXN0cmlidXRpb25bY2hdID0gMjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgCiAgICAgaWYgKHBlT2Zmc0RpZmYgPiAwKSB7CiAgICAgICBXb3JkMzIgdGVtcCA9IDEwMDAgLSAobkNoYW5uZWxzICogMjAwKTsKICAgICAgIGNoQml0RGlzdHJpYnV0aW9uW2NoXSA9IGNoQml0RGlzdHJpYnV0aW9uW2NoXSArCkBAIC0xMjAyLDEwICsxMjAyLDEwIEBACiAgIH0KIAogICAvKiBzdG9yZSBwZSAqLwotICBxY09FLT5wZSA9IG5vUmVkUGU7CisgIHFjT0UtPnBlID0gbm9SZWRQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAvKiB1cGRhdGUgbGFzdCBwZSAqLwotICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCA9IGdyYW50ZWRQZTsKKyAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QgPSBncmFudGVkUGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMTcsNyArMTIxNyw3IEBACiB2b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAogICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKQogewotICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0ID0gZHluQml0c1VzZWQ7CisgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QgPSBkeW5CaXRzVXNlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIH0KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucwppbmRleCBlNzA1MTk3Li5lMDg4NWYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKQEAgLTIyLDM0ICsyMiwzNCBAQAogQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKIAogCi0JLnNlY3Rpb24gLnRleHQKKwkuc2VjdGlvbiAudGV4dAkKIAkuZ2xvYmFsCUF1dG9Db3JyZWxhdGlvbgogCiBBdXRvQ29ycmVsYXRpb246CiAJc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KIAotICBzdWIgICAgIHIxMywgcjEzLCAjMjAKKyAgc3ViICAgICByMTMsIHIxMywgIzIwICAgICAgICAgICAgICAgICAgICAgCiAKLSAgbW92ICAgICByNSwgcjAKLSAgbW92ICAgICByNywgcjEKLSAgbW92ICAgICByOSwgcjMKLSAgbW92ICAgICByMiwgcjIsIGxzbCAjMTYKLSAgbW92ICAgICByMCwgIzAKLSAgbW92ICAgICByNCwgcjIsIGFzciAjMTYKLSAgbW92ICAgICByOCwgIzAKLSAgY21wICAgICByNCwgIzAKLSAgYmxlICAgICBMMTM2CisgIG1vdiAgICAgcjUsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHI3LCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbW92ICAgICByOSwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1vdiAgICAgcjIsIHIyLCBsc2wgIzE2ICAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIwLCAjMCAgICAgICAgICAKKyAgbW92ICAgICByNCwgcjIsIGFzciAjMTYgICAgICAgICAgICAgICAgICAgCisgIG1vdiAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBjbXAgICAgIHI0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmxlICAgICBMMTM2ICAgICAgICAKKwkKKwljbXAgICAgIHI0LCAjOCAKKwltb3YJCSAgcjIsICMwIAorICBibHQgICAgIEwxMzMgICAKIAotCWNtcCAgICAgcjQsICM4Ci0JbW92CQkgIHIyLCAjMAotICBibHQgICAgIEwxMzMKLQotCXN1YiAgICAgcjEyLCByNCwgIzgKLUwxMzI6Ci0gIGxkciAgICAgcjYsIFtyNSwgcjJdCisJc3ViICAgICByMTIsIHI0LCAjOCAgICAgICAgICAgICAgICAKK0wxMzI6ICAKKyAgbGRyICAgICByNiwgW3I1LCByMl0gIAogCWFkZAkJICByMiwgcjIsICM0CiAJc211bGJiICByMywgcjYsIHI2Ci0JbGRyICAgICByMSwgW3I1LCByMl0KKwlsZHIgICAgIHIxLCBbcjUsIHIyXSAKIAlzbXVsdHQJcjEwLCByNiwgcjYKIAltb3YJCSAgcjMsIHIzLCBhc3IgIzkKIAlzbXVsYmIJcjYsIHIxLCByMQpAQCAtNzIsOTUgKzcyLDk1IEBACiAJYWRkICAgICByOCwgcjgsICM2CiAKIAlxYWRkCSAgcjAsIHIwLCByNgotCWNtcCAgICAgcjgsIHIxMgotICBibHQgICAgIEwxMzIKLUwxMzM6Ci0gIGxkcnNoICAgcjYsIFtyNSwgcjJdCi0gIG11bCAgICAgcjEwLCByNiwgcjYKLQlhZGQgICAgIHIyLCByMiwgIzIKLSAgbW92ICAgICByMSwgcjEwLCBhc3IgIzkKKwljbXAgICAgIHI4LCByMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJsdCAgICAgTDEzMgkgICAgICAgICAgICAgICAgICAKK0wxMzM6ICAgICAgICAgICAgICAgICAgICAgICAgIAorICBsZHJzaCAgIHI2LCBbcjUsIHIyXSAgICAgICAgICAgICAgICAgICAgICAKKyAgbXVsICAgICByMTAsIHI2LCByNiAgIAorCWFkZCAgICAgcjIsIHIyLCAjMiAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIxLCByMTAsIGFzciAjOSAgICAgICAgICAgICAgICAgICAgCiAgIHFhZGQgICAgcjAsIHIwLCByMQotTDEzNDoKLSAgYWRkICAgICByOCwgcjgsICMxCi0gIGNtcCAgICAgcjgsIHI0Ci0gIGJsdCAgICAgTDEzMwotTDEzNToKLUwxMzY6Ci0gIHN0ciAgICAgcjAsIFtyNywgIzBdCi0gIGNtcCAgICAgcjAsICMwCi0gIGJlcSAgICAgTDEzMjAKLUwxMzc6Ci0gIG1vdiAgICAgcjIsIHI5LCBsc2wgIzE2Ci0JbW92ICAgICByOCwgIzEKLSAgbW92ICAgICByMiwgcjIsIGFzciAjMTYKLSAgY21wICAgICByMiwgIzEKLSAgYmxlICAgICBMMTMxOQotTDEzODoKLUwxMzk6Ci0gIHN1YiAgICAgcjQsIHI0LCAjMQotICBtb3YgICAgIHIxNCwgIzAKLSAgbW92ICAgICByMywgIzAKLSAgY21wICAgICByNCwgIzAKLSAgYmxlICAgICBMMTMxNwotTDEzMTA6Ci0gIGNtcCAgICAgcjQsICM2Ci0gIGFkZGx0ICAgcjYsIHI1LCByOCwgbHNsICMxCi0gIGJsdCAgICAgTDEzMTQKLUwxMzExOgotICBhZGQgICAgIHI2LCByNSwgcjgsIGxzbCAjMQotICBzdWIgICAgIHIxMiwgcjQsICM2Ci0gIHN0ciAgICAgcjgsIFtyMTMsICM4XQotICBzdHIgICAgIHI3LCBbcjEzLCAjNF0KLUwxMzEyOgotICBtb3YgICAgIHIxLCByMywgbHNsICMxCi0gIGxkcnNoICAgcjcsIFtyNiwgcjFdCi0gIGxkcnNoICAgcjEwLCBbcjUsIHIxXQotICBhZGQgICAgIHI4LCByMSwgcjYKLQlhZGQgICAgIHI5LCByNSwgcjEKK0wxMzQ6ICAgICAgICAgICAgICAgICAgICAgICAgIAorICBhZGQgICAgIHI4LCByOCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAKKyAgY21wICAgICByOCwgcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJsdCAgICAgTDEzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0wxMzU6ICAgICAgICAgICAgICAgICAgICAgICAgCitMMTM2OiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RyICAgICByMCwgW3I3LCAjMF0gICAgICAgICAgICAgICAgICAgICAgCisgIGNtcCAgICAgcjAsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiZXEgICAgIEwxMzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgCitMMTM3OiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbW92ICAgICByMiwgcjksIGxzbCAjMTYgICAgICAgICAgICAgICAgICAgCisJbW92ICAgICByOCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIyLCByMiwgYXNyICMxNiAgICAgICAgICAgICAgICAgICAKKyAgY21wICAgICByMiwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJsZSAgICAgTDEzMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0wxMzg6ICAgICAgICAgICAgICAgICAgICAgICAgCitMMTM5OiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1vdiAgICAgcjE0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIzLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgY21wICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJsZSAgICAgTDEzMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0wxMzEwOiAgICAgICAgICAgICAgICAgICAgICAgCisgIGNtcCAgICAgcjQsICM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBhZGRsdCAgIHI2LCByNSwgcjgsIGxzbCAjMSAgICAgICAgICAgICAgICAKKyAgYmx0ICAgICBMMTMxNCAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTDEzMTE6ICAgICAgICAgICAgICAgICAgICAgICAgCisgIGFkZCAgICAgcjYsIHI1LCByOCwgbHNsICMxICAgICAgICAgICAgICAgIAorICBzdWIgICAgIHIxMiwgcjQsICM2ICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RyICAgICByOCwgW3IxMywgIzhdICAgICAgICAgICAgICAgICAgICAgCisgIHN0ciAgICAgcjcsIFtyMTMsICM0XSAgICAgICAgICAgICAgICAgICAgIAorTDEzMTI6ICAgICAgICAgICAgICAgICAgICAgICAgCisgIG1vdiAgICAgcjEsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICAgIAorICBsZHJzaCAgIHI3LCBbcjYsIHIxXSAgICAgICAgICAgICAgICAgICAgICAKKyAgbGRyc2ggICByMTAsIFtyNSwgcjFdICAKKyAgYWRkICAgICByOCwgcjEsIHI2IAorCWFkZCAgICAgcjksIHI1LCByMSAgICAgICAgICAgICAgICAgICAgICAgCiAJbXVsICAgICByNywgcjEwLCByNwotICBsZHJzaCAgIHIxLCBbcjgsICMyXQotCWxkcnNoICAgcjEwLCBbcjgsICM0XQotICBhZGQgICAgIHI3LCByMTQsIHI3LCBhc3IgIzkKLSAgbGRyc2ggICByMCwgW3I5LCAjMl0KLSAgbGRyc2ggICByMTEsIFtyOSwgIzRdCi0gIG11bCAgICAgcjEsIHIwLCByMQotICBsZHJzaCAgIHIxNCwgW3I4LCAjNl0KLSAgbXVsICAgICByMTAsIHIxMSwgcjEwCi0JYWRkICAgICByNywgcjcsIHIxLCBhc3IgIzkKLSAgbGRyc2ggICByOCwgW3I4LCAjOF0KKyAgbGRyc2ggICByMSwgW3I4LCAjMl0gCisJbGRyc2ggICByMTAsIFtyOCwgIzRdICAgCisgIGFkZCAgICAgcjcsIHIxNCwgcjcsIGFzciAjOSAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBsZHJzaCAgIHIwLCBbcjksICMyXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGxkcnNoICAgcjExLCBbcjksICM0XSAgICAgICAgICAgICAgICAgICAKKyAgbXVsICAgICByMSwgcjAsIHIxICAgICAgICAgICAgICAgICAgICAgICAgCisgIGxkcnNoICAgcjE0LCBbcjgsICM2XSAgICAgICAgICAgICAgICAgICAgIAorICBtdWwgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgCisJYWRkICAgICByNywgcjcsIHIxLCBhc3IgIzkgICAgICAgICAgICAKKyAgbGRyc2ggICByOCwgW3I4LCAjOF0gCiAJYWRkICAgICByMywgcjMsICM1Ci0JbGRyc2ggICByMTEsIFtyOSwgIzZdCi0gIGxkcnNoICAgcjEsIFtyOSwgIzhdCi0gIG11bCAgICAgcjE0LCByMTEsIHIxNAotICBhZGQgICAgIHI3LCByNywgcjEwLCBhc3IgIzkKLSAgbXVsICAgICByMSwgcjEsIHI4Ci0gIGFkZCAgICAgcjE0LCByNywgcjE0LCBhc3IgIzkKLQljbXAgICAgIHIzLCByMTIKLSAgYWRkICAgICByMTQsIHIxNCwgcjEsIGFzciAjOQotICBibGUgICAgIEwxMzEyCi1MMTMxMzoKLSAgbGRyICAgICByOCwgW3IxMywgIzhdCi0gIGxkciAgICAgcjcsIFtyMTMsICM0XQotTDEzMTQ6Ci1MMTMxNToKLSAgbW92ICAgICByMTIsIHIzLCBsc2wgIzEKLSAgbGRyc2ggICByOSwgW3I2LCByMTJdCi0gIGxkcnNoICAgcjEyLCBbcjUsIHIxMl0KLSAgYWRkICAgICByMywgcjMsICMxCi0gIGNtcCAgICAgcjMsIHI0Ci0gIG11bCAgICAgcjEyLCByMTIsIHI5Ci0gIGFkZCAgICAgcjE0LCByMTQsIHIxMiwgYXNyICM5Ci0gIGJsdCAgICAgTDEzMTUKLUwxMzE2OgotTDEzMTc6Ci0gIHN0ciAgICAgcjE0LCBbcjcsICtyOCwgbHNsICMyXQotICBhZGQgICAgIHI4LCByOCwgIzEKLSAgY21wICAgICByOCwgcjIKLSAgYmx0ICAgICBMMTM5Ci0KKwlsZHJzaCAgIHIxMSwgW3I5LCAjNl0gICAgICAgICAgICAgICAgICAKKyAgbGRyc2ggICByMSwgW3I5LCAjOF0gICAgICAgICAgICAgICAgICAgICAgCisgIG11bCAgICAgcjE0LCByMTEsIHIxNCAgICAgICAgICAgICAgICAgICAgIAorICBhZGQgICAgIHI3LCByNywgcjEwLCBhc3IgIzkgICAgICAgCisgIG11bCAgICAgcjEsIHIxLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGFkZCAgICAgcjE0LCByNywgcjE0LCBhc3IgIzkgICAgICAgICAgICAgIAorCWNtcCAgICAgcjMsIHIxMiAKKyAgYWRkICAgICByMTQsIHIxNCwgcjEsIGFzciAjOSAgICAgICAgICAgICAgCisgIGJsZSAgICAgTDEzMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0wxMzEzOiAgICAgICAgICAgICAgICAgICAgICAgIAorICBsZHIgICAgIHI4LCBbcjEzLCAjOF0gICAgICAgICAgICAgICAgICAgICAKKyAgbGRyICAgICByNywgW3IxMywgIzRdICAgICAgICAgICAgICAgICAgICAgCitMMTMxNDogICAgICAgICAgICAgICAgICAgICAgICAKK0wxMzE1OiAgICAgICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIxMiwgcjMsIGxzbCAjMSAgICAgICAgICAgICAgICAgICAKKyAgbGRyc2ggICByOSwgW3I2LCByMTJdICAgICAgICAgICAgICAgICAgICAgCisgIGxkcnNoICAgcjEyLCBbcjUsIHIxMl0gICAgICAgICAgICAgICAgICAgIAorICBhZGQgICAgIHIzLCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICAKKyAgY21wICAgICByMywgcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG11bCAgICAgcjEyLCByMTIsIHI5ICAgICAgICAgICAgICAgICAgICAgIAorICBhZGQgICAgIHIxNCwgcjE0LCByMTIsIGFzciAjOSAgICAgICAgICAgICAKKyAgYmx0ICAgICBMMTMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTDEzMTY6ICAgICAgICAgICAgICAgICAgICAgICAgCitMMTMxNzogICAgICAgICAgICAgICAgICAgICAgICAKKyAgc3RyICAgICByMTQsIFtyNywgK3I4LCBsc2wgIzJdICAgICAgICAgICAgCisgIGFkZCAgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIAorICBjbXAgICAgIHI4LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmx0ICAgICBMMTM5ICAgCisJICAgICAgICAgICAgICAgICAgICAgICAgIAogTDEzMTk6CiBMMTMyMDoKLQlhZGQgICAgIHIxMywgcjEzLCAjMjAKKwlhZGQgICAgIHIxMywgcjEzLCAjMjAgICAgICAgICAgICAgICAgICAgIAogCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQogCiAJQEVORFAgIEAgfEF1dG9Db3JyZWxhdGlvbnwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKaW5kZXggYjMwZThjYi4uNzViOTE2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKQEAgLTIyLDkxICsyMiw5MSBAQAogQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKIAogCS5zZWN0aW9uIC50ZXh0Ci0KKwkKIAkuZ2xvYmFsCUNhbGNXaW5kb3dFbmVyZ3kKIAogQ2FsY1dpbmRvd0VuZXJneToKIAlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgIHIxMywgcjEzLCAjMjAKKwlzdWIgICAgIHIxMywgcjEzLCAjMjAgCiAKLSAgbW92ICAgICByMywgcjMsIGxzbCAjMTYKKyAgbW92ICAgICByMywgcjMsIGxzbCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgCiAJbGRyICAgICByMTAsIFtyMCwgIzE2OF0gICAgICAgICAgICAgICAgICAgIEAgc3RhdGVzMCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOwotICBtb3YgICAgIHIzLCByMywgYXNyICMxNgorICBtb3YgICAgIHIzLCByMywgYXNyICMxNiAKIAlsZHIgICAgIHIxMSwgW3IwLCAjMTcyXSAgICAgICAgICAgICAgICAgICAgQCBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07CiAKIAltb3YgICAgIHIyLCByMiwgbHNsICMxNgotCWxkciAgICAgcjEyLCBoaVBhc3NDb2VmZiAgICAgICAgICAgICAgICAgICBAIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOworCWxkciAgICAgcjEyLCBoaVBhc3NDb2VmZiAgICAgICAgICAgICAgICAgICBAIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOyAgICAgIAogICBtb3YgICAgIHIyLCByMiwgYXNyICMxNgogCWxkciAgICAgcjE0LCBoaVBhc3NDb2VmZiArIDQJCQkgICAgICAgICBAIENvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOwotCisJCiAJbW92CQkJcjgsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgdz0wCiAJbW92CQkJcjUsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgd09mZnNldCA9IDA7Ci0KKwkKIEJMT0NLX0JFR0lOOgotCW1vdgkJCXI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1VUUgPSAwOwotCW1vdgkJCXI3LCAjMAkJCQkJCQkJICAgICAgICAgICAgIEAgYWNjdUZFID0gMDsKKwltb3YJCQlyNiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgYWNjdVVFID0gMDsgCisJbW92CQkJcjcsICMwCQkJCQkJCQkgICAgICAgICAgICAgQCBhY2N1RkUgPSAwOyAKIAltb3YJCQlyNCwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCBpPTAKLQotCXN0cgkJCXI4LCBbcjEzLCAjNF0KLQlzdHIJCQlyMCwgW3IxMywgIzhdCisJCSAgICAgICAgICAgICAgICAgICAKKwlzdHIJCQlyOCwgW3IxMywgIzRdCQorCXN0cgkJCXIwLCBbcjEzLCAjOF0JCiAJc3RyCQkJcjMsIFtyMTMsICMxMl0KLQotRU5FUkdZX0JFRzoKLQltb3YgICAgIHI5LCByNSwgbHNsICMxCisJCitFTkVSR1lfQkVHOgkKKwltb3YgICAgIHI5LCByNSwgbHNsICMxICAKIAlsZHJzaCAgIHI5LCBbcjEsIHI5XQkJCQkJCQkJCQkJQCB0ZW1wVW5maWx0ZXJlZCA9IHRpbWVTaWduYWxbdGlkeF07CiAKIAlhZGQJCQlyNSwgcjUsIHIyCQkJCQkJCQkJCQkJQCB0aWR4ID0gdGlkeCArIGNoSW5jcmVtZW50OwotCi0Jc211bHdiCXIzLCByMTQsIHI5CQkJCQkJCQkJCQkJQCBhY2N1MSA9IExfbXB5X2xzKENvZWZmMSwgdGVtcFVuZmlsdGVyZWQpOworCQorCXNtdWx3YglyMywgcjE0LCByOQkJCQkJCQkJCQkJCUAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsJCiAJc211bGwJCXIwLCByOCwgcjEyLCByMTEJCQkJCQkJCQlAIGFjY3UyID0gZml4bXVsKCBDb2VmZjAsIHN0YXRlczEgKTsKLQorCQogCW1vdgkJCXIzLCByMywgbHNsICMxCiAJbW92CQkJcjgsIHI4LCBsc2wgIzEKIAotCXN1YgkJCXIwLCByMywgcjEwCQkJCQkJCQkJCQkJQCBhY2N1MyA9IGFjY3UxIC0gc3RhdGVzMDsKKwlzdWIJCQlyMCwgcjMsIHIxMAkJCQkJCQkJCQkJCUAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlczA7CQogCXN1YgkJCXI4LAlyMCwgcjgJCQkJCQkJCQkJCQlAIG91dCA9IGFjY3UzIC0gYWNjdTI7CiAKIAltb3YJCSAgcjEwLCByMwkJCQkJCQkJCQkJCQkJQCBzdGF0ZXMwID0gYWNjdTE7Ci0JbW92CQkgIHIxMSwgcjgJCQkJCQkJCQkJCQkJCUAgc3RhdGVzMSA9IG91dDsKLQotCW11bAkJICByMywgcjksIHI5CisJbW92CQkgIHIxMSwgcjgJCQkJCQkJCQkJCQkJCUAgc3RhdGVzMSA9IG91dDsgIAorCQorCW11bAkJICByMywgcjksIHI5CQogCW1vdiAgICAgcjgsIHI4LCBhc3IgIzE2Ci0KKwkKIAlhZGQJCSAgcjQsIHI0LCAjMQogCWFkZCAgICAgcjYsIHI2LCByMywgYXNyICM3CiAKLQltdWwJCSAgcjksIHI4LCByOAorCW11bAkJICByOSwgcjgsIHI4CQogCWxkcgkJICByMywgW3IxMywgIzEyXQogCiAJYWRkCQkgIHI3LCByNywgcjksIGFzciAjNwotCi0JY21wICAgICByNCwgcjMKLSAgYmx0ICAgICBFTkVSR1lfQkVHCi0KKwkJCisJY21wICAgICByNCwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJsdCAgICAgRU5FUkdZX0JFRyAgICAgICAKKwkKIAlsZHIJCSAgcjAsIFtyMTMsICM4XQogCWxkcgkJICByOCwgW3IxMywgIzRdCi0KKwkKIEVORVJHWV9FTkQ6CiAJYWRkCQkgIHI0LCByMCwgcjgsIGxzbCAjMgogCi0Jc3RyICAgICByNiwgW3I0LCAjNzJdCi0JYWRkCQkgIHI4LCByOCwgIzEKLSAgc3RyICAgICByNywgW3I0LCAjMTM2XQorCXN0ciAgICAgcjYsIFtyNCwgIzcyXSAgICAgICAgIAorCWFkZAkJICByOCwgcjgsICMxCSAgICAgICAgICAgCisgIHN0ciAgICAgcjcsIFtyNCwgIzEzNl0gICAgICAgICAgICAgICAgICAgCiAKIAljbXAJCSAgcjgsICM4Ci0JYmx0CQkgIEJMT0NLX0JFR0lOCisJYmx0CQkgIEJMT0NLX0JFR0lOICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIAogCiBCTE9DS19FTkQ6Ci0Jc3RyICAgICByMTAsIFtyMCwgIzE2OF0KLSAgc3RyICAgICByMTEsIFtyMCwgIzE3Ml0KLSAgbW92ICAgICByMCwgIzEKLQotICBhZGQgICAgIHIxMywgcjEzLCAjMjAKLQlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30KKwlzdHIgICAgIHIxMCwgW3IwLCAjMTY4XSAgICAgICAgICAgICAgICAgICAgCisgIHN0ciAgICAgcjExLCBbcjAsICMxNzJdICAgICAgICAgICAgICAgICAgICAKKyAgbW92ICAgICByMCwgIzEgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgCisgIGFkZCAgICAgcjEzLCByMTMsICMyMCAgIAorCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfSAgICAgICAgICAgICAgICAgIAogCiBoaVBhc3NDb2VmZjoKIAkud29yZCAweGJlYzhiNDM5CiAJLndvcmQJMHg2MDlkNDk1MgotCisJCQogCUBFTkRQCiAJLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zCmluZGV4IDEwM2NjOTEuLjM4ZmUwOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMKQEAgLTI2LDQ2ICsyNiw0NiBAQAogCiBQcmVNRENUOgogCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQorCQogCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgogCXN1YiAgICAgICAgIHIzLCByOSwgIzgKIAogCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCiAJYmVxICAgICAgICAgUHJlTURDVF9FTkQKLQorCQogUHJlTURDVF9MT09QOgogCWxkcgkJCQkJcjgsIFtyMl0sICM0CiAJbGRyCQkJCQlyOSwgW3IyXSwgIzQKLQorCQogCWxkcmQJCQkJcjQsIFtyMF0KIAlsZHJkCQkJCXI2LCBbcjNdCi0KKwkKIAlzbXVsbAkJCQlyMTQsIHIxMSwgcjQsIHI4CQkJCQlAIE1VTEhJR0godHIxLCBjb3NhKQogCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNywgcjgJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpCi0KKwkJCiAJc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMSwgc2luYSkKLQlzbXVsbAkJCQlyNywgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQotCi0JYWRkCQkJCQlyMTEsIHIxMSwgcjgJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKKwlzbXVsbAkJCQlyNywgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQkKKwkJCisJYWRkCQkJCQlyMTEsIHIxMSwgcjgJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAJCiAJc3ViCQkJCQlyNywgcjEyLCByMTAJCQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKSAtIE1VTEhJR0godHIxLCBzaW5hKQotCisJCiAJbGRyCQkJCQlyOCwgW3IyXSwgIzQKIAlsZHIJCQkJCXI5LCBbcjJdLCAjNAotCisJCiAJc211bGwJCQkJcjE0LCByNCwgcjYsIHI4CQkJCQkJQCBNVUxISUdIKHRyMiwgY29zYSkKIAlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjUsIHI4CQkJCQlAIE1VTEhJR0godGkyLCBjb3NhKQotCisJCQogCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTIsIHNpbmEpCiAJc211bGwJCQkJcjUsIHIxMCwgcjYsIHI5CQkJCQkJQCBNVUxISUdIKHRyMiwgc2luYSkKLQorCQogCWFkZAkJCQkJcjgsIHI4LCByNAogCXN1YgkJCQkJcjksIHIxMiwgcjEwCisJCisJbW92CQkJCQlyNiwgcjExCQkKIAotCW1vdgkJCQkJcjYsIHIxMQotCi0Jc3RyZAkJCQlyNiwgW3IwXQorCXN0cmQJCQkJcjYsIFtyMF0JCiAJc3RyZAkJCQlyOCwgW3IzXQotCisJCiAJc3VicwkJCQlyMSwgcjEsICMxCiAJc3ViCQkJCQlyMywgcjMsICM4CiAJYWRkIAkJCQlyMCwgcjAsICM4CkBAIC03NCw1MiArNzQsNTIgQEAKIFByZU1EQ1RfRU5EOgogCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KIAlARU5EUCAgQCB8UHJlTURDVHwKLQorCQogCS5zZWN0aW9uIC50ZXh0CiAJLmdsb2JhbAlQb3N0TURDVAogCiBQb3N0TURDVDoKIAlzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KKwkKIAlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzIKIAlzdWIgICAgICAgICByMywgcjksICM4CiAKIAltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgogCWJlcSAgICAgICAgIFBvc3RNRENUX0VORAotCisJCiBQb3N0TURDVF9MT09QOgotCWxkcgkJCQkJcjgsIFtyMl0sICM0CisJbGRyCQkJCQlyOCwgW3IyXSwgIzQJCQkJCQogCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KKwkKIAlsZHJkCQkJCXI0LCBbcjBdCiAJbGRyZAkJCQlyNiwgW3IzXQotCisJCiAJc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkKIAlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjUsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQotCisJCQogCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTEsIHNpbmEpCi0Jc211bGwJCQkJcjUsIHIxMCwgcjQsIHI5CQkJCQkJQCBNVUxISUdIKHRyMSwgc2luYSkKLQotCWFkZAkJCQkJcjQsIHIxMSwgcjgJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACisJc211bGwJCQkJcjUsIHIxMCwgcjQsIHI5CQkJCQkJQCBNVUxISUdIKHRyMSwgc2luYSkJCisJCQorCWFkZAkJCQkJcjQsIHIxMSwgcjgJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACQogCXN1YgkJCQkJcjExLCByMTAsIHIxMgkJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpIC0gTVVMSElHSCh0cjEsIHNpbmEpQAotCisJCiAJbGRyCQkJCQlyOCwgW3IyXSwgIzQJCQkJCQlACiAJbGRyCQkJCQlyOSwgW3IyXSwgIzQKLQorCQogCXNtdWxsCQkJCXIxNCwgcjUsIHI2LCByOAkJCQkJCUAgTVVMSElHSCh0cjIsIGNvc2EpCiAJc211bGwgICAgCQkJcjEwLCByMTIsIHI3LCByOAkJCQkJQCBNVUxISUdIKHRpMiwgY29zYSkKLQorCQkKIAlzbXVsbAkJCQlyMTQsIHI4LCByNywgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQogCXNtdWxsCQkJCXI3LCByMTAsIHI2LCByOQkJCQkJCUAgTVVMSElHSCh0cjIsIHNpbmEpCi0KKwkKIAlhZGQJCQkJCXI2LCByOCwgcjUJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMilACiAJc3ViCQkJCQlyNSwgcjEwLCByMTIJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKSAtIE1VTEhJR0goY29zYiwgdGkyKUAKLQotCW1vdgkJCQkJcjcsIHIxMQorCQorCW1vdgkJCQkJcjcsIHIxMQkJCQkKIAogCXN0cmQJCQkJcjQsIFtyMF0KIAlzdHJkCQkJCXI2LCBbcjNdCi0KKwkKIAlzdWJzCQkJCXIxLCByMSwgIzEKIAlzdWIJCQkJCXIzLCByMywgIzgKIAlhZGQgCQkJCXIwLCByMCwgIzgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zCmluZGV4IDcyY2I5YTMuLmIzMDg4MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucwpAQCAtMjYsNDYgKzI2LDQ2IEBACiAKIFJhZGl4NEZpcnN0OgogCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQorCQogCW1vdnMJCQkJcjEwLCByMQogCW1vdgkJCQkJcjExLCByMAogCWJlcQkJCQkJUmFkaXg0Rmlyc3RfRU5ECi0KKwkJCiBSYWRpeDRGaXJzdF9MT09QOgogCWxkcmQJCQkJcjAsIFtyMTFdCiAJbGRyZAkJCQlyMiwgW3IxMSwgIzhdCiAJbGRyZAkJCQlyNCwgW3IxMSwgIzE2XQogCWxkcmQJCQkJcjYsIFtyMTEsICMyNF0KLQorCQogCWFkZAkJCQkJcjgsIHIwLCByMgogCWFkZAkJCQkJcjksIHIxLCByMwotCisJCiAJc3ViCQkJCQlyMCwgcjAsIHIyCiAJc3ViCQkJCQlyMSwgcjEsIHIzCi0KKwkKIAlhZGQJCQkJCXIyLCByNCwgcjYKIAlhZGQJCQkJCXIzLCByNSwgcjcKLQorCQogCXN1YgkJCQkJcjQsIHI0LCByNgogCXN1YgkJCQkJcjUsIHI1LCByNwotCisJCiAJYWRkCQkJCQlyNiwgcjgsIHIyCiAJYWRkCQkJCQlyNywgcjksIHIzCi0KKwkKIAlzdWIJCQkJCXI4LCByOCwgcjIKIAlzdWIJCQkJCXI5LCByOSwgcjMKLQorCQogCWFkZAkJCQkJcjIsIHIwLCByNQogCXN1YgkJCQkJcjMsIHIxLCByNAotCisJCiAJc3ViCQkJCQlyMCwgcjAsIHI1CiAJYWRkCQkJCQlyMSwgcjEsIHI0Ci0KKwkKIAlzdHJkCQkJCXI2LCBbcjExXQogCXN0cmQJCQkJcjIsIFtyMTEsICM4XQogCXN0cmQJCQkJcjgsIFtyMTEsICMxNl0KIAlzdHJkCQkJCXIwLCBbcjExLCAjMjRdCi0KKwkKIAlzdWJzCQkJCXIxMCwgcjEwLCAjMQogCWFkZAkJCQkJcjExLCByMTEsICMzMgogCWJuZQkJCQkJUmFkaXg0Rmlyc3RfTE9PUApAQCAtNzMsMTgwICs3MywxODAgQEAKIFJhZGl4NEZpcnN0X0VORDoKIAlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CiAJQEVORFAgIEAgfFJhZGl4NEZpcnN0fAotCisJCiAJLnNlY3Rpb24gLnRleHQKIAkuZ2xvYmFsCVJhZGl4OEZpcnN0CiAKIFJhZGl4OEZpcnN0OgogCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KIAlzdWIgICAgICAgICBzcCwgc3AsICMweDI0Ci0KKwkKIAltb3YJCQkJICByMTIsIHIxCiAJbW92CQkJCQlyMTQsIHIwCiAJY21wCQkJCQlyMTIsICMwCiAJYmVxCQkJCQlSYWRpeDhGaXJzdF9FTkQKLQorCQogUmFkaXg4Rmlyc3RfTE9PUDoKLQlsZHJkCQkJCXIwLCBbcjE0XQorCWxkcmQJCQkJcjAsIFtyMTRdCQkKIAlsZHJkCQkJCXIyLCBbcjE0LCAjOF0KIAlsZHJkCQkJCXI0LCBbcjE0LCAjMTZdCiAJbGRyZAkJCQlyNiwgW3IxNCwgIzI0XQotCisJCiAJYWRkCQkJCQlyOCwgcjAsIHIyCQkJCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQAogCWFkZAkJCQkJcjksIHIxLCByMwkJCQkJQCBpMCA9IGJ1ZlsxXSArIGJ1ZlszXUAKLQorCQogCXN1YgkJCQkJcjAsIHIwLCByMgkJCQkJQCByMSA9IGJ1ZlswXSAtIGJ1ZlsyXUAKIAlzdWIJCQkJCXIxLCByMSwgcjMJCQkJCUAgaTEgPSBidWZbMV0gLSBidWZbM11ACi0KKwkKIAlhZGQJCQkJCXIyLCByNCwgcjYJCQkJCUAJcjIgPSBidWZbNF0gKyBidWZbNl1ACiAJYWRkCQkJCQlyMywgcjUsIHI3CQkJCQlAIGkyID0gYnVmWzVdICsgYnVmWzddQAotCisJCiAJc3ViCQkJCQlyNCwgcjQsIHI2CQkJCQlACXIzID0gYnVmWzRdIC0gYnVmWzZdQAogCXN1YgkJCQkJcjUsIHI1LCByNwkJCQkJQCBpMyA9IGJ1Zls1XSAtIGJ1Zls3XUAKLQorCQogCWFkZAkJCQkJcjYsIHI4LCByMgkJCQkJQCByNCA9IChyMCArIHIyKSA+PiAxQAogCWFkZAkJCQkJcjcsIHI5LCByMwkJCQkJQCBpNCA9IChpMCArIGkyKSA+PiAxQAotCisJCiAJc3ViCQkJCQlyOCwgcjgsIHIyCQkJCQlACXI1ID0gKHIwIC0gcjIpID4+IDFACiAJc3ViCQkJCQlyOSwgcjksIHIzCQkJCQlAIGk1ID0gKGkwIC0gaTIpID4+IDFACi0KKwkKIAlzdWIJCQkJCXIyLCByMCwgcjUJCQkJCUAgcjYgPSAocjEgLSBpMykgPj4gMUAKIAlhZGQJCQkJCXIzLCByMSwgcjQJCQkJCUAgaTYgPSAoaTEgKyByMykgPj4gMUAKLQorCQogCWFkZAkJCQkJcjAsIHIwLCByNQkJCQkJQCByNyA9IChyMSArIGkzKSA+PiAxQAogCXN1YgkJCQkJcjEsIHIxLCByNAkJCQkJQCBpNyA9IChpMSAtIHIzKSA+PiAxQAotCisJCiAJbW92CQkJCQlyNiwgcjYsIGFzciAjMQkJCUAKIAltb3YJCQkJCXI3LCByNywgYXNyICMxCQkJQAotCisJCiAJbW92CQkJCQlyOCwgcjgsIGFzciAjMQogCW1vdgkJCQkJcjksIHI5LCBhc3IgIzEKLQorCQogCW1vdgkJCQkJcjIsIHIyLCBhc3IgIzEKIAltb3YJCQkJCXIzLCByMywgYXNyICMxCi0KKwkKIAltb3YJCQkJCXIwLCByMCwgYXNyICMxCi0JbW92CQkJCQlyMSwgcjEsIGFzciAjMQotCisJbW92CQkJCQlyMSwgcjEsIGFzciAjMQkKKwkKIAlzdHIJCQkJCXI2LCBbc3BdCiAJc3RyCQkJCQlyNywgW3NwLCAjNF0KLQorCQogCXN0cgkJCQkJcjgsIFtzcCwgIzhdCiAJc3RyCQkJCQlyOSwgW3NwLCAjMTJdCi0KKwkKIAlzdHIJCQkJCXIyLCBbc3AsICMxNl0KLQlzdHIJCQkJCXIzLCBbc3AsICMyMF0KLQorCXN0cgkJCQkJcjMsIFtzcCwgIzIwXQkKKwkKIAlzdHIJCQkJCXIwLCBbc3AsICMyNF0KLQlzdHIJCQkJCXIxLCBbc3AsICMyOF0KLQotCWxkcmQJCQkJcjIsIFtyMTQsICMzMl0KKwlzdHIJCQkJCXIxLCBbc3AsICMyOF0JCisJCisJbGRyZAkJCQlyMiwgW3IxNCwgIzMyXQkJCiAJbGRyZAkJCQlyNCwgW3IxNCwgIzQwXQogCWxkcmQJCQkJcjYsIFtyMTQsICM0OF0KIAlsZHJkCQkJCXI4LCBbcjE0LCAjNTZdCi0KKwkKIAlhZGQJCQkJCXIwLCByMiwgcjQJCQkJCUAgcjAgPSBidWZbIDhdICsgYnVmWzEwXUAKIAlhZGQJCQkJCXIxLCByMywgcjUJCQkJCUAgaTAgPSBidWZbIDldICsgYnVmWzExXUAKLQorCQogCXN1YgkJCQkJcjIsIHIyLCByNAkJCQkJQCByMSA9IGJ1ZlsgOF0gLSBidWZbMTBdQAogCXN1YgkJCQkJcjMsIHIzLCByNQkJCQkJQCBpMSA9IGJ1ZlsgOV0gLSBidWZbMTFdQAotCisJCiAJYWRkCQkJCQlyNCwgcjYsIHI4CQkJCQlAIHIyID0gYnVmWzEyXSArIGJ1ZlsxNF1ACiAJYWRkCQkJCQlyNSwgcjcsIHI5CQkJCQlAIGkyID0gYnVmWzEzXSArIGJ1ZlsxNV1ACi0KKwkKIAlzdWIJCQkJCXI2LCByNiwgcjgJCQkJCUAgcjMgPSBidWZbMTJdIC0gYnVmWzE0XUAKIAlzdWIJCQkJCXI3LCByNywgcjkJCQkJCUAJaTMgPSBidWZbMTNdIC0gYnVmWzE1XUAKLQorCQogCWFkZAkJCQkJcjgsIHIwLCByNAkJCQkJQCB0MCA9IChyMCArIHIyKQogCWFkZAkJCQkJcjksIHIxLCByNQkJCQkJQCB0MSA9IChpMCArIGkyKQotCisJCiAJc3ViCQkJCQlyMCwgcjAsIHI0CQkJCQlAIHQyID0gKHIwIC0gcjIpCiAJc3ViCQkJCQlyMSwgcjEsIHI1CQkJCQlAIHQzID0gKGkwIC0gaTIpCi0KKwkKIAltb3YJCQkJCXI4LCByOCwgYXNyICMxCiAJbGRyCQkJCQlyNCwgW3NwXQotCisJCiAJbW92CQkJCQlyOSwgcjksIGFzciAjMQogCWxkcgkJCQkJcjUsIFtzcCwgIzRdCi0KLQltb3YJCQkJCXIwLCByMCwgYXNyICMxCisJCisJbW92CQkJCQlyMCwgcjAsIGFzciAjMQkJCiAJbW92CQkJCQlyMSwgcjEsIGFzciAjMQotCisJCiAJYWRkCQkJCQlyMTAsIHI0LCByOAkJCQkJQCBidWZbIDBdID0gcjQgKyB0MEAKIAlhZGQJCQkJCXIxMSwgcjUsIHI5CQkJCQlAIGJ1ZlsgMV0gPSBpNCArIHQxQAotCisJCiAJc3ViCQkJCQlyNCwgIHI0LCByOAkJCQkJQCBidWZbIDhdID0gcjQgLSB0MEAKIAlzdWIJCQkJCXI1LCAgcjUsIHI5CQkJCQlACWJ1ZlsgOV0gPSBpNCAtIHQxQAotCisJCiAgCXN0cmQJCQkJcjEwLCBbcjE0XQogIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzMyXQotCisgCQogIAlsZHIJCQkJCXIxMCwgW3NwLCAjOF0KICAJbGRyCQkJCQlyMTEsIFtzcCwgIzEyXQotCisgCQogIAlhZGQJCQkJCXI0LCByMTAsIHIxCQkJCQlAIGJ1ZlsgNF0gPSByNSArIHQzQAogIAlzdWIJCQkJCXI1LCByMTEsIHIwCQkJCQlACWJ1ZlsgNV0gPSBpNSAtIHQyQAotCisgCQogIAlzdWIJCQkJCXIxMCwgcjEwLCByMQkJCQlAIGJ1ZlsxMl0gPSByNSAtIHQzQAogIAlhZGQJCQkJCXIxMSwgcjExLCByMAkJCQlAIGJ1ZlsxM10gPSBpNSArIHQyQAotCisgCQogIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzE2XQogIAlzdHJkCQkJCXIxMCwgW3IxNCwgIzQ4XQotCisgCQogIAlzdWIJCQkJCXIwLCByMiwgcjcJCQkJCUAgcjAgPSByMSAtIGkzQAogIAlhZGQJCQkJCXIxLCByMywgcjYJCQkJCUAgaTAgPSBpMSArIHIzQAotCisgCiAgIGxkcgkJCQkJcjExLCBEQVRBVGFiCi0KKyAJCiAgCWFkZAkJCQkJcjIsIHIyLCByNwkJCQkJQCByMiA9IHIxICsgaTNACiAgCXN1YgkJCQkJcjMsIHIzLCByNgkJCQkJQCBpMiA9IGkxIC0gcjNACi0KKyAJCiAJc3ViCQkJCQlyNCwgcjAsIHIxCQkJCQlAIHIwIC0gaTAKIAlhZGQJCQkJCXI1LCByMCwgcjEJCQkJCUAgcjAgKyBpMAotCisJCiAJc3ViCQkJCQlyMCwgcjIsIHIzCQkJCQlAIHIyIC0gaTIKIAlhZGQJCQkJCXIxLCByMiwgcjMJCQkJCUAgcjIgKyBpMgotCi0Jc211bGwJCQkJcjgsIHI2LCByNCwgcjExCi0Jc211bGwJCQkJcjksIHI3LCByNSwgcjExCi0KKwkKKwlzbXVsbAkJCQlyOCwgcjYsIHI0LCByMTEJCQkJCQkJCQorCXNtdWxsCQkJCXI5LCByNywgcjUsIHIxMQkJCQkJCQkJCisJCiAJbGRyCQkJCQlyMiwgW3NwLCAjMTZdCiAJbGRyCQkJCQlyMywgW3NwLCAjMjBdCi0KLQlzbXVsbAkJCQlyOCwgcjQsIHIwLCByMTEKLQlzbXVsbAkJCQlyOSwgcjUsIHIxLCByMTEKLQorCQorCXNtdWxsCQkJCXI4LCByNCwgcjAsIHIxMQkJCQkJCQkJCisJc211bGwJCQkJcjksIHI1LCByMSwgcjExCQkJCQkJCQkKKwkKIAlsZHIJCQkJCXIxMCwgW3NwLCAjMjRdCiAJbGRyCQkJCQlyMTEsIFtzcCwgIzI4XQotCisJCiAJc3ViCQkJCQlyOCwgcjIsIHI2CiAJc3ViCQkJCQlyOSwgcjMsIHI3Ci0KKwkKIAlhZGQJCQkJCXIyLCByMiwgcjYKIAlhZGQJCQkJCXIzLCByMywgcjcKLQorCQogCWFkZAkJCQkJcjYsIHIxMCwgcjUKIAlzdWIJCQkJCXI3LCByMTEsIHI0Ci0KKwkKIAlzdWIJCQkJCXIwLCByMTAsIHI1CiAJYWRkCQkJCQlyMSwgcjExLCByNAotCisJCiAJc3RyZAkJCQlyNiwgW3IxNCwgIzhdCiAJc3RyZAkJCQlyOCwgW3IxNCwgIzI0XQogCXN0cmQJCQkJcjAsIFtyMTQsICM0MF0KIAlzdHJkCQkJCXIyLCBbcjE0LCAjNTZdCi0KKwkKIAlzdWJzCQkJCXIxMiwgcjEyLCAjMQogCWFkZAkJCQkJcjE0LCByMTQsICM2NAotCisJCiAJYm5lCQkJCQlSYWRpeDhGaXJzdF9MT09QCi0KKwkKIFJhZGl4OEZpcnN0X0VORDoKIAlhZGQgICAgICAgICBzcCwgc3AsICMweDI0CiAJbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCisJCiBEQVRBVGFiOgogCS53b3JkICAgICAgIDB4NWE4Mjc5OWEKLQorCQogCUBFTkRQICBAIHxSYWRpeDhGaXJzdHwKIAkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMKaW5kZXggZTgxYzgyZS4uYmMwNjliNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zCkBAIC0yNSwxNDUgKzI1LDE0NSBAQAogCiBSYWRpeDRGRlQ6CiAJc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgICAgc3AsIHNwLCAjMzIKKwlzdWIgICAgICAgc3AsIHNwLCAjMzIgICAgICAgICAgICAgICAgICAgICAKIAogCW1vdgkJCXIxLCByMSwgYXNyICMyCi0JY21wICAgICByMSwgIzAKLQliZXEgICAgIFJhZGl4NEZGVF9FTkQKLQotUmFkaXg0RkZUX0xPT1AxOgotCW1vdiAgICAgcjE0LCByMCAgICAgICAgICAJCQkJCQkJQCB4cHRyID0gYnVmQAorCWNtcCAgICAgcjEsICMwICAgICAgIAorCWJlcSAgICAgUmFkaXg0RkZUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCitSYWRpeDRGRlRfTE9PUDE6ICAgICAgICAgIAorCW1vdiAgICAgcjE0LCByMCAgICAgICAgICAJCQkJCQkJQCB4cHRyID0gYnVmQCAgICAgICAgICAKIAltb3YJCXIxMCwgcjEgCQkJCQkJCQkJCQkJQCBpID0gbnVtQAogCW1vdiAgICAgcjksIHIyLCBsc2wgIzMgIAkJCQkJCQlAIHN0ZXAgPSAyKmJnbkAKLQljbXAgICAgIHIxMCwgIzAKLQlzdHIJCXIwLCBbc3BdCi0Jc3RyCQlyMSwgW3NwLCAjNF0KKwljbXAgICAgIHIxMCwgIzAgIAorCXN0cgkJcjAsIFtzcF0gCisJc3RyCQlyMSwgW3NwLCAjNF0gICAgICAKIAlzdHIJCXIyLCBbc3AsICM4XQotCXN0cgkJcjMsIFtzcCwgIzEyXQotCWJlcSAgICAgUmFkaXg0RkZUX0xPT1AxX0VORAotCi1SYWRpeDRGRlRfTE9PUDI6CisJc3RyCQlyMywgW3NwLCAjMTJdICAKKwliZXEgICAgIFJhZGl4NEZGVF9MT09QMV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgCitSYWRpeDRGRlRfTE9PUDI6ICAgICAgICAgICAgICAgICAgICAgICAKIAltb3YgICAgIHIxMiwgcjMJCQkJICAgICAgICAJCQkJQCBjc3B0ciA9IHR3aWRUYWJACiAJbW92CQlyMTEsIHIyCQkJCQkJCQkJCQkJQCBqID0gYmduCi0JY21wICAgICByMTEsICMwCisJY21wICAgICByMTEsICMwICAgICAgICAKIAlzdHIJCXIxMCwgW3NwLCAjMTZdCi0JYmVxICAgICBSYWRpeDRGRlRfTE9PUDJfRU5ECi0KLVJhZGl4NEZGVF9MT09QMzoKLQlzdHIJCQlyMTEsIFtzcCwgIzIwXQotCisJYmVxICAgICBSYWRpeDRGRlRfTE9PUDJfRU5EICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAKK1JhZGl4NEZGVF9MT09QMzogICAgICAgICAgICAgICAgICAgICAgICAgIAorCXN0cgkJCXIxMSwgW3NwLCAjMjBdCSAKKwkKIAlsZHJkCQlyMCwgW3IxNCwgIzBdCQkJCQkJCQkJQCByMCA9IHhwdHJbMF1AIHIxID0geHB0clsxXUAKIAlhZGQJCQlyMTQsIHIxNCwgcjkgCSAJCQkJCQkJCUAgeHB0ciArPSBzdGVwQAotCi0JbGRyZAkJcjEwLAlbcjE0LCAjMF0gIAkJCQkJIAkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACisJCisJbGRyZAkJcjEwLAlbcjE0LCAjMF0gIAkJCQkJIAkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACQogCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMF1ACi0KKwkKIAlzbXVsd3QJcjQsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKIAlzbXVsd3QJcjMsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQorCQogCXNtbGF3YglyMiwgcjExLCByOCwgcjQJCQkJCQkJCUAgcjIgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACiAJc211bHdiCXI1LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KKwkKIAltb3YJCQlyMTAsIHIwLCBhc3IgIzIJCQkJCQkJCUAgdDAgPSByMCA+PiAyQAogCW1vdgkJCXIxMSwgcjEsIGFzciAjMgkJCQkJCQkJQAl0MSA9IHIxID4+IDJACi0KKwkJCiAJc3ViCQkJcjMsIHIzLCByNQkJCQkJCQkJCQlAIHIzID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQAogCWFkZCAgICAgcjE0LCByMTQsIHI5IAkgCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKLQorCQogCXN1YgkJCXIwLCByMTAsIHIyCQkJCQkJCQkJCUAgcjAgPSB0MCAtIHIyQAogCXN1YgkJCXIxLCByMTEsIHIzCQkJCQkJCQkJICBAIHIxID0gdDEgLSByM0AKLQorCQogCWFkZAkJCXIyLCByMTAsIHIyCQkJCQkJCQkJCUAgcjIgPSB0MCArIHIyQAogCWFkZAkJCXIzLCByMTEsIHIzCQkJCQkJCQkJCUAgcjMgPSB0MSArIHIzQAotCisJCiAJc3RyCQkJcjIsIFtzcCwgIzI0XQogCXN0cgkJCXIzLCBbc3AsICMyOF0KLQorCQogCWxkcmQJCXIxMCwgW3IxNCwgIzBdCQkJCQkJCQlAIHI0ID0geHB0clswXUAgcjUgPSB4cHRyWzFdQAogCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ACi0KKwkKIAlzbXVsd3QJcjYsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKIAlzbXVsd3QJcjUsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQorCQogCXNtbGF3YglyNCwgcjExLCByOCwgcjYJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACiAJc211bHdiCXI3LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KKwkKIAlhZGQJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKIAlzdWIJCQlyNSwgcjUsIHI3CQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClACi0KKwkJCiAJbGRyZAkJcjEwLCBbcjE0XQkJCQkJCQkJCQlAIHI2ID0geHB0clswXUAgcjcgPSB4cHRyWzFdQAogCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ACi0KKwkKIAlzbXVsd3QJcjIsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKIAlzbXVsd3QJcjcsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQorCQogCXNtbGF3YglyNiwgcjExLCByOCwgcjIJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACiAJc211bHdiCXIzLCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KKwkKIAltb3YJCQlyMTAsIHI0CQkJCQkJCQkJCQkJQCB0MCA9IHI0QAotCW1vdgkJCXIxMSwgcjUJCQkJCQkJCQkJCQlAIHQxID0gcjVACi0KKwltb3YJCQlyMTEsIHI1CQkJCQkJCQkJCQkJQCB0MSA9IHI1QAkKKwkKIAlzdWIJCQlyNywgcjcsIHIzCQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClACisJCiAKLQotCWFkZAkJCXI0LCAgcjEwLCByNgkJCQkJCQkJCUAJcjQgPSB0MCArIHI2QAorCWFkZAkJCXI0LCAgcjEwLCByNgkJCQkJCQkJCUAJcjQgPSB0MCArIHI2QAkKIAlzdWIJCQlyNSwgcjcsIHIxMQkJCQkJCQkJCQlAIHI1ID0gcjcgLSB0MUAKLQorCQogCXN1YgkJCXI2LCByMTAsIHI2CQkJCQkJCQkJCUAgcjYgPSB0MCAtIHI2QAogCWFkZAkJCXI3LCByNywgcjExCQkJCQkJCQkJCUAgcjcgPSByNyArIHQxQAotCisJCiAJbGRyCQkJcjIsIFtzcCwgIzI0XQogCWxkcgkJCXIzLCBbc3AsICMyOF0KLQorCQogCWFkZAkJCXIxMCwgcjAsIHI1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwICsgcjVACiAJYWRkCQkJcjExLCByMSwgcjYJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjEgKyByNgotCi0Jc3RyZAkJcjEwLCBbcjE0XQorCQorCXN0cmQJCXIxMCwgW3IxNF0JCQkJCQkJCQkJCiAJc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KKwkKIAlzdWIJCQlyMTAsIHIyLCByNAkJCQkJCQkJCQlACXhwdHJbMF0gPSByMiAtIHI0QAogCXN1YgkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdACi0KLQlzdHJkCQlyMTAsIFtyMTRdCisJCisJc3RyZAkJcjEwLCBbcjE0XQkJCQkKIAlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQorCQogCXN1YgkJCXIxMCwgcjAsIHI1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwIC0gcjVACiAJc3ViCQkJcjExLCByMSwgcjYJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjEgLSByNgotCi0Jc3RyZAkJcjEwLCBbcjE0XQorCQorCXN0cmQJCXIxMCwgW3IxNF0JCQkJCQkJCQkJCiAJc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KKwkKIAlhZGQJCQlyMTAsIHIyLCByNAkJCQkJCQkJCQlACXhwdHJbMF0gPSByMiAtIHI0QAogCWFkZAkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdACi0KLQlzdHJkCQlyMTAsIFtyMTRdCisJCisJc3RyZAkJcjEwLCBbcjE0XQkJCQkKIAlhZGQJCQlyMTQsIHIxNCwgIzgJCQkJCQkJCQlAIHhwdHIgKz0gMkAKLQorCQogCWxkcgkJCXIxMSwgW3NwLCAjMjBdCiAJc3VicwkJcjExLCByMTEsICMxCi0JYm5lCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6CisJYm5lCQkJUmFkaXg0RkZUX0xPT1AzCQorCSAKK1JhZGl4NEZGVF9MT09QMl9FTkQ6ICAgICAgICAgICAKIAlsZHIJCQlyMTAsIFtzcCwgIzE2XQogCWxkcgkJCXIzLCBbc3AsICMxMl0KIAlsZHIJCQlyMiwgW3NwLCAjOF0KLQlyc2IJCQlyOCwgcjksIHI5LCBsc2wgIzIKKwlyc2IJCQlyOCwgcjksIHI5LCBsc2wgIzIgICAKIAlzdWIJCQlyMTAsIHIxMCwgIzEKLQlhZGQJCQlyMTQsIHIxNCwgcjgKLQljbXAJCQlyMTAsICMwCi0JYmhpICAgICBSYWRpeDRGRlRfTE9PUDIKLQotUmFkaXg0RkZUX0xPT1AxX0VORDoKLQlsZHIgICAgIHIwLCBbc3BdCisJYWRkCQkJcjE0LCByMTQsIHI4CQkgICAgICAKKwljbXAJCQlyMTAsICMwICAKKwliaGkgICAgIFJhZGl4NEZGVF9MT09QMiAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKK1JhZGl4NEZGVF9MT09QMV9FTkQ6ICAgICAgICAgICAgICAgCisJbGRyICAgICByMCwgW3NwXSAgICAKIAlsZHIJCXIxLCBbc3AsICM0XQogCWFkZCAgICAgcjMsIHIzLCByOCwgYXNyICMxCi0JbW92ICAgICByMiwgcjIsIGxzbCAjMgotCW1vdnMgICAgcjEsIHIxLCBhc3IgIzIKLQlibmUgICAgIFJhZGl4NEZGVF9MT09QMQotCi1SYWRpeDRGRlRfRU5EOgotCWFkZCAgICAgc3AsIHNwLCAjMzIKKwltb3YgICAgIHIyLCByMiwgbHNsICMyIAorCW1vdnMgICAgcjEsIHIxLCBhc3IgIzIgCisJYm5lICAgICBSYWRpeDRGRlRfTE9PUDEgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKK1JhZGl4NEZGVF9FTkQ6ICAgICAgICAgICAgICAgICAgICAgICAgCisJYWRkICAgICBzcCwgc3AsICMzMiAgICAgICAgICAgICAgICAgIAogCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCisJCQogCUBFTkRQICBAIHxSYWRpeDRGRlR8CiAJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucwppbmRleCA0Nzg5ZjZkLi4zYjg4ODEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zCkBAIC0yNiwzMSArMjYsMzEgQEAKIAkuZ2xvYmFsCUNhbGNCYW5kRW5lcmd5CiAKIENhbGNCYW5kRW5lcmd5OgotCXN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCi0gIG1vdiAgICAgcjIsIHIyLCBsc2wgIzE2CisJc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CQorICAgICAgICAgICAgICAgICAgIAorICBtb3YgICAgIHIyLCByMiwgbHNsICMxNiAgICAgICAgICAgICAgICAgICAKIAlsZHIgICAgIHIxMiwgW3IxMywgIzM2XQogCW1vdgkJCXI5LCAjMAotICBtb3YgICAgIHI1LCByMiwgYXNyICMxNgotCW1vdgkJCXI0LCAjMAotICBjbXAgICAgIHI1LCAjMAotCWJsZSAgICAgTDIxMgorICBtb3YgICAgIHI1LCByMiwgYXNyICMxNiAgICAKKwltb3YJCQlyNCwgIzAgICAgICAgICAgICAgICAKKyAgY21wICAgICByNSwgIzAJCisJYmxlICAgICBMMjEyIAogCiBMMjI6Ci0gIG1vdiAgICAgcjIsIHI0LCBsc2wgIzEKLSAgbGRyc2ggICByMTAsIFtyMSwgcjJdCi0gIGFkZCAgICAgcjExLCByMSwgcjIKLSAgbGRyc2ggICByMiwgW3IxMSwgIzJdCi0JbW92ICAgICByMTQsICMwCi0gIGNtcCAgICAgcjEwLCByMgotICBiZ2UgICAgIEwyOAotCisgIG1vdiAgICAgcjIsIHI0LCBsc2wgIzEgICAgICAgICAgICAgICAgICAgIAorICBsZHJzaCAgIHIxMCwgW3IxLCByMl0gICAgICAgICAgICAgICAgICAgICAKKyAgYWRkICAgICByMTEsIHIxLCByMiAgICAgICAgICAgICAgICAgICAgICAgCisgIGxkcnNoICAgcjIsIFtyMTEsICMyXSAgICAKKwltb3YgICAgIHIxNCwgIzAgICAgICAgICAgICAgICAgIAorICBjbXAgICAgIHIxMCwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmdlICAgICBMMjggCisJCiBMMjM6Ci0JbGRyICAgICByMTEsIFtyMCwgK3IxMCwgbHNsICMyXQotICBhZGQgICAgIHIxMCwgcjEwLCAjMQotCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQorCWxkciAgICAgcjExLCBbcjAsICtyMTAsIGxzbCAjMl0JCisgIGFkZCAgICAgcjEwLCByMTAsICMxICAgIAorCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQkKIAlzbXVsbCAgIHIxMSwgcjcsIHIxMSwgcjExCi0JYWRkICAgICByMTAsIHIxMCwgIzEKKwlhZGQgICAgIHIxMCwgcjEwLCAjMSAKIAlzbXVsbAkgIHI2LCByOCwgcjYsIHI2CiAJbGRyICAgICByMTEsIFtyMCwgK3IxMCwgbHNsICMyXQogCXFhZGQJICByMTQsIHIxNCwgcjcKQEAgLTU5LDcxICs1OSw3MSBAQAogCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQogCXFhZGQJICByMTQsIHIxNCwgcjgKIAlzbXVsbAkgIHI2LCByOCwgcjYsIHI2Ci0gIGFkZCAgICAgcjEwLCByMTAsICMxCisgIGFkZCAgICAgcjEwLCByMTAsICMxIAogCXFhZGQJICByMTQsIHIxNCwgcjcKIAljbXAgICAgIHIxMCwgcjIKIAlxYWRkCSAgcjE0LCByMTQsIHI4Ci0JYmx0ICAgICBMMjMKKwlibHQgICAgIEwyMyAgIAogCi1MMjg6CitMMjg6CQogCXFhZGQJICByMTQsIHIxNCwgcjE0CiAJc3RyICAgICByMTQsIFtyMywgK3I0LCBsc2wgIzJdCi0JYWRkICAgICByNCwgcjQsICMxCisJYWRkICAgICByNCwgcjQsICMxIAogCXFhZGQJICByOSwgcjksIHIxNAotCWNtcCAgICAgcjQsIHI1CisJY21wICAgICByNCwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIGJsdCAgICAgTDIyCisgIGJsdCAgICAgTDIyICAgICAgIAkKIAotTDIxMjoKLQlzdHIgICAgIHI5LCBbcjEyLCAjMF0KK0wyMTI6CQorCXN0ciAgICAgcjksIFtyMTIsICMwXSAgICAgICAgICAgICAgICAgICAgIAogCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCisJCiAJQEVORFAgIDsgfENhbGNCYW5kRW5lcmd5fAotCisJCiAJLmdsb2JhbAlDYWxjQmFuZEVuZXJneU1TCiAKIENhbGNCYW5kRW5lcmd5TVM6CiAJc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CiAJc3ViICAgICByMTMsIHIxMywgIzI0Ci0KLQltb3YgICAgIHIxMiwgIzAKLSAgbW92ICAgICByMywgcjMsIGxzbCAjMTYKLSAgbW92ICAgICByMTQsICMwCi0JbW92ICAgICByMywgcjMsIGFzciAjMTYKLQljbXAgICAgIHIzLCAjMAotCW1vdgkJICByNCwgIzAKLSAgYmxlICAgICBMMzE1Ci0KLUwzMjoKKwkKKwltb3YgICAgIHIxMiwgIzAgCisgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzE2ICAKKyAgbW92ICAgICByMTQsICMwIAorCW1vdiAgICAgcjMsIHIzLCBhc3IgIzE2ICAgICAgCisJY21wICAgICByMywgIzAgICAgICAgICAgCisJbW92CQkgIHI0LCAjMCAgICAgICAgICAgICAgICAgIAorICBibGUgICAgIEwzMTUgICAgCisJCitMMzI6CQogCW1vdgkJICByNSwgcjQsIGxzbCAjMQogCW1vdgkJICByNiwgIzAKIAlsZHJzaCAgIHIxMCwgW3IyLCByNV0KIAlhZGQgICAgIHI1LCByMiwgcjUKIAltb3YJCSAgcjcsICMwCi0JbGRyc2gJICByMTEsIFtyNSwgIzJdCi0JY21wICAgICByMTAsIHIxMQotICBiZ2UgICAgIEwzOQorCWxkcnNoCSAgcjExLCBbcjUsICMyXSAgICAgICAgICAgICAgICAgICAgICAgIAorCWNtcCAgICAgcjEwLCByMTEgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiZ2UgICAgIEwzOSAgICAKIAogCXN0cgkJICByMywgW3IxMywgIzRdCiAJc3RyCQkgIHI0LCBbcjEzLCAjOF0KIAlzdHIJCSAgcjEyLCBbcjEzLCAjMTJdCiAJc3RyCQkgIHIxNCwgW3IxMywgIzE2XQogCi1MMzM6Ci0JbGRyICAgICByOCwgW3IwLCArcjEwLCBsc2wgIzJdCitMMzM6CQorCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICAgICAgICAgICAgCiAJbGRyICAgICByOSwgW3IxLCArcjEwLCBsc2wgIzJdCiAJbW92CQkgIHI4LCByOCwgYXNyICMxCiAJYWRkCQkgIHIxMCwgcjEwLCAjMQogCW1vdgkJICByOSwgcjksIGFzciAjMQogCi0JbGRyICAgICByMTIsIFtyMCwgK3IxMCwgbHNsICMyXQotCWFkZAkJICByNSwgcjgsIHI5CisJbGRyICAgICByMTIsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICAKKwlhZGQJCSAgcjUsIHI4LCByOQkgICAgICAgICAgCiAJbGRyICAgICByMTQsIFtyMSwgK3IxMCwgbHNsICMyXQogCXN1YgkJICByOCwgcjgsIHI5CiAKLQlzbXVsbCAgIHI1LCByMywgcjUsIHI1CisJc211bGwgICByNSwgcjMsIHI1LCByNSAKIAltb3YJCSAgcjEyLCByMTIsIGFzciAjMQotCXNtdWxsICAgcjgsIHI0LCByOCwgcjgKKwlzbXVsbCAgIHI4LCByNCwgcjgsIHI4IAogCW1vdgkJICByMTQsIHIxNCwgYXNyICMxCiAKIAlxYWRkCSAgcjYsIHI2LCByMwpAQCAtMTMxLDI3ICsxMzEsMjcgQEAKIAlxYWRkCSAgcjcsIHI3LCByNAogCXN1YgkJICByOCwgcjEyLCByMTQKIAotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKKwlzbXVsbCAgIHI1LCByMywgcjUsIHI1IAogCWFkZAkJICByMTAsIHIxMCwgIzEKLQlzbXVsbCAgIHI4LCByNCwgcjgsIHI4Ci0KKwlzbXVsbCAgIHI4LCByNCwgcjgsIHI4IAorCQkKIAlxYWRkCSAgcjYsIHI2LCByMwogCXFhZGQJICByNywgcjcsIHI0CiAKLQlsZHIgICAgIHI4LCBbcjAsICtyMTAsIGxzbCAjMl0KKwlsZHIgICAgIHI4LCBbcjAsICtyMTAsIGxzbCAjMl0gICAgICAgICAgICAgICAgICAgIAogCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQogCW1vdgkJICByOCwgcjgsIGFzciAjMQogCWFkZAkJICByMTAsIHIxMCwgIzEKIAltb3YJCSAgcjksIHI5LCBhc3IgIzEKIAotCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0KLQlhZGQJCSAgcjUsIHI4LCByOQorCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0gICAgICAgICAgCisJYWRkCQkgIHI1LCByOCwgcjkJICAgICAgICAgIAogCWxkciAgICAgcjE0LCBbcjEsICtyMTAsIGxzbCAjMl0KIAlzdWIJCSAgcjgsIHI4LCByOQogCi0Jc211bGwgICByNSwgcjMsIHI1LCByNQorCXNtdWxsICAgcjUsIHIzLCByNSwgcjUgCiAJbW92CQkgIHIxMiwgcjEyLCBhc3IgIzEKLQlzbXVsbCAgIHI4LCByNCwgcjgsIHI4CisJc211bGwgICByOCwgcjQsIHI4LCByOCAKIAltb3YJCSAgcjE0LCByMTQsIGFzciAjMQogCiAJcWFkZAkgIHI2LCByNiwgcjMKQEAgLTE1OSwzNyArMTU5LDM3IEBACiAJcWFkZAkgIHI3LCByNywgcjQKIAlzdWIJCSAgcjgsIHIxMiwgcjE0CiAKLQlzbXVsbCAgIHI1LCByMywgcjUsIHI1CisJc211bGwgICByNSwgcjMsIHI1LCByNSAKIAlhZGQJCSAgcjEwLCByMTAsICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCisJc211bGwgICByOCwgcjQsIHI4LCByOCAKKwkJCiAJcWFkZAkgIHI2LCByNiwgcjMKIAlxYWRkCSAgcjcsIHI3LCByNAogCiAJY21wICAgICByMTAsIHIxMQotCisJCiAJYmx0CQkgIEwzMwogCiAJbGRyCQkgIHIzLCBbcjEzLCAjNF0KLQlsZHIJCSAgcjQsIFtyMTMsICM4XQorCWxkcgkJICByNCwgW3IxMywgIzhdCQogCWxkcgkJICByMTIsIFtyMTMsICMxMl0KIAlsZHIJCSAgcjE0LCBbcjEzLCAjMTZdCi1MMzk6CitMMzk6CQogCXFhZGQJICByNiwgcjYsIHI2Ci0JcWFkZAkgIHI3LCByNywgcjcKLQorCXFhZGQJICByNywgcjcsIHI3CQorCQogCWxkcgkJICByOCwgW3IxMywgIzYwXQogCWxkcgkJICByOSwgW3IxMywgIzY4XQogCiAJcWFkZAkgIHIxMiwgcjEyLCByNgogCXFhZGQJICByMTQsIHIxNCwgcjcKLQotCXN0cgkJICByNiwgW3I4LCArcjQsIGxzbCAjMl0KLQlzdHIgICAgIHI3LCBbcjksICtyNCwgbHNsICMyXQotCisJCisJc3RyCQkgIHI2LCBbcjgsICtyNCwgbHNsICMyXSAgICAgICAKKwlzdHIgICAgIHI3LCBbcjksICtyNCwgbHNsICMyXSAgICAKKwkKIAlhZGQJCSAgcjQsIHI0LCAjMQogCWNtcAkJICByNCwgcjMKLQlibHQgICAgIEwzMgorCWJsdCAgICAgTDMyICAgICAgICAgICAgCiAKIEwzMTU6CiAJbGRyCQkgIHI4LCBbcjEzLCAjNjRdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCmluZGV4IDY0ZDc2N2EuLmEwNGMxMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9QcmVQb3N0TURDVF92Ny5zCkBAIC0yNiw1MyArMjYsNTMgQEAKIAogUHJlTURDVDoKIAlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCisJCiAJYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyCiAJc3ViICAgICAgICAgcjMsIHI5LCAjMzIKIAogCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUHJlTURDVF9FTkQKLQorCWJlcSAgICAgICAgIFByZU1EQ1RfRU5ECQorCQogUHJlTURDVF9MT09QOgogCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKIAlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACiAJVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooYnVmMCArIDApQCB0aTIgPSAqKGJ1ZjAgKyAxKUAKIAlWTEQyLkkzMgkJCXtkMTMsIGQxNX0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKIAlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKLQotCVZSRVY2NC4zMgkJCVE4LCBRNworCQkKKwlWUkVWNjQuMzIJCQlROCwgUTcJCiAJVlJFVjY0LjMyCQkJUTksIFE2CiAKLQorCQogCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkKIAlWUURNVUxILlMzMgkJUTExLCBRMSwgUTgJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0aTEpCiAJVlFETVVMSC5TMzIJCVExMiwgUTAsIFE4CQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQogCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJQCBNVUxISUdIKHNpbmEsIHRyMSkKLQorCQkKIAlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKIAlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKUAKLQorCQogCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSEKIAlzdWIJCQkJCQlyMywgcjMsICMzMgotCisJCiAJVlFETVVMSC5TMzIJCVExMCwgUTIsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpCiAJVlFETVVMSC5TMzIJCVExMSwgUTMsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpCiAJVlFETVVMSC5TMzIJCVExMiwgUTIsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpCiAJVlFETVVMSC5TMzIJCVExMywgUTMsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0cjIpCi0KKwkJCiAJVkFERC5TMzIJCQlRMCwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIyKSArIE1VTEhJR0goc2luYSwgdGkyKUAKIAlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0aTIpIC0gTVVMSElHSChzaW5hLCB0cjIpQAotCisJCiAJVlJFVjY0LjMyCQkJUTMsIFExCiAJVlJFVjY0LjMyCQkJUTIsIFEwCi0KLQlWU1QyLkkzMgkJe2Q1LCBkN30sIFtyM10hCi0JVlNUMi5JMzIJCXtkNCwgZDZ9LCBbcjNdIQotCisJCQorCVZTVDIuSTMyCQl7ZDUsIGQ3fSwgW3IzXSEJCisJVlNUMi5JMzIJCXtkNCwgZDZ9LCBbcjNdISAKKwkKIAlzdWJzICAgICAJCXIxLCByMSwgIzQKLQlzdWIJCSAgCQlyMywgcjMsICM2NAorCXN1YgkJICAJCXIzLCByMywgIzY0CQogCWJuZSAgICAgICAJUHJlTURDVF9MT09QCi0KKwkKIFByZU1EQ1RfRU5EOgogCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CiAJQEVORFAgIEAgfFByZU1EQ1R8CkBAIC04Miw1MCArODIsNTAgQEAKIAogUG9zdE1EQ1Q6CiAJc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQorCQogCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgogCXN1YiAgICAgICAgIHIzLCByOSwgIzMyCiAKIAltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgogCWJlcSAgICAgICAgIFBvc3RNRENUX0VORAotCisJCiBQb3N0TURDVF9MT09QOgogCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKIAlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACiAJVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooemJ1ZjEgKyAwKUAgdGkxID0gKih6YnVmMSArIDEpQAogCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUAKLQlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQkJCUAgdHIyID0gKih6YnVmMiAtIDEpQCB0aTIgPSAqKHpidWYyICsgMClACisJVkxEMi5JMzIJCQl7ZDEyLCBkMTR9LCBbcjNdIQkJCQkJCQlAIHRyMiA9ICooemJ1ZjIgLSAxKUAgdGkyID0gKih6YnVmMiArIDApQAkKIAotCVZSRVY2NC4zMgkJCVE4LCBRNgotCVZSRVY2NC4zMgkJCVE5LCBRNwotCisJVlJFVjY0LjMyCQkJUTgsIFE2CQorCVZSRVY2NC4zMgkJCVE5LCBRNwkJCQorCQogCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKQogCVZRRE1VTEguUzMyCQlRMTEsIFExLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQogCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQogCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdHIxKQotCisJCQogCVZBREQuUzMyCQkJUTAsIFExMCwgUTExCQkJCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQAogCVZTVUIuUzMyCQkJUTUsIFExMywgUTEyCQkJCQkJCQkJQCAqYnVmMS0tID0gTVVMSElHSChzaW5hLCB0cjEpIC0gTVVMSElHSChjb3NhLCB0aTEpQAotCisJCiAJVlFETVVMSC5TMzIJCVExMCwgUTIsIFE4CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpCiAJVlFETVVMSC5TMzIJCVExMSwgUTMsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpCiAJVlFETVVMSC5TMzIJCVExMiwgUTIsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpCiAJVlFETVVMSC5TMzIJCVExMywgUTMsIFE4CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0cjIpCi0KKwkJCiAJVkFERC5TMzIJCQlRNCwgUTEwLCBRMTEJCQkJCQkJCQlAICpidWYxLS0gPSBNVUxISUdIKGNvc2EsIHRyMikgKyBNVUxISUdIKHNpbmEsIHRpMilACi0JVlNVQi5TMzIJCQlRMSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKHNpbmEsIHRyMikgLSBNVUxISUdIKGNvc2EsIHRpMilACi0KKwlWU1VCLlMzMgkJCVExLCBRMTMsIFExMgkJCQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goc2luYSwgdHIyKSAtIE1VTEhJR0goY29zYSwgdGkyKUAJCisJCiAJVlJFVjY0LjMyCQkJUTIsIFE0Ci0JVlJFVjY0LjMyCQkJUTMsIFE1Ci0KLQlzdWIJCQkJCQlyMywgcjMsICMzMgorCVZSRVY2NC4zMgkJCVEzLCBRNQkKKwkKKwlzdWIJCQkJCQlyMywgcjMsICMzMgkKIAlWU1QyLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sIFtyMF0hCi0KLQlWU1QyLkkzMgkJCXtkNSwgZDd9LCBbcjNdIQotCVZTVDIuSTMyCQkJe2Q0LCBkNn0sIFtyM10hCi0KKwkJCisJVlNUMi5JMzIJCQl7ZDUsIGQ3fSwgW3IzXSEJCisJVlNUMi5JMzIJCQl7ZDQsIGQ2fSwgW3IzXSEgCisJCiAJc3VicyAgICAgCQkJcjEsIHIxLCAjNAotCXN1YgkJICAJCQlyMywgcjMsICM2NAorCXN1YgkJICAJCQlyMywgcjMsICM2NAkJCiAJYm5lICAgICAgIAlQb3N0TURDVF9MT09QCiAKIFBvc3RNRENUX0VORDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucwppbmRleCA3ZmM1NTIwLi5kZWZkNDVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zCkBAIC0yOSw4NiArMjksODYgQEAKIAogCWxkciAgICAgICAJCXIzLCBTUVJUMV8yCiAJY21wICAgICAgIAkJcjEsICMwCi0KLQlWRFVQLkkzMiAgCQlRMTUsIHIzCisJCisJVkRVUC5JMzIgIAkJUTE1LCByMwkKIAliZXEgICAgICAgCQlSYWRpeDhGaXJzdF9FTkQKLQorCQogUmFkaXg4Rmlyc3RfTE9PUDoKIAlWTEQxLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sCVtyMF0hCiAJVkxEMS5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sCVtyMF0hCi0KKwkJCiAJVkFERC5TMzIJCQlkNCwgZDAsIGQxCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQGkwID0gYnVmWzFdICsgYnVmWzNdQAotCVZTVUIuUzMyCQkJZDUsIGQwLCBkMQkJQCByMSA9IGJ1ZlswXSAtIGJ1ZlsyXUBpMSA9IGJ1ZlsxXSAtIGJ1ZlszXUAKLQlWU1VCLlMzMgkJCWQ3LCBkMiwgZDMJCUAgcjIgPSBidWZbNF0gLSBidWZbNl1AaTIgPSBidWZbNV0gLSBidWZbN11ACisJVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQlAIHIxID0gYnVmWzBdIC0gYnVmWzJdQGkxID0gYnVmWzFdIC0gYnVmWzNdQAkKKwlWU1VCLlMzMgkJCWQ3LCBkMiwgZDMJCUAgcjIgPSBidWZbNF0gLSBidWZbNl1AaTIgPSBidWZbNV0gLSBidWZbN11ACQogCVZBREQuUzMyCQkJZDYsIGQyLCBkMwkJQCByMyA9IGJ1Zls0XSArIGJ1Zls2XUBpMyA9IGJ1Zls1XSArIGJ1Zls3XUAKLQlWUkVWNjQuSTMyCQkJZDcsIGQ3Ci0KKwlWUkVWNjQuSTMyCQkJZDcsIGQ3CQorCQogCVZBREQuUzMyCQkJUTAsIFEyLCBRMwkJQCByNCA9IChyMCArIHIyKUBpNCA9IChpMCArIGkyKUBpNiA9IChpMSArIHIzKUByNyA9IChyMSArIGkzKQogCVZTVUIuUzMyCQkJUTEsIFEyLCBRMwkJQCByNSA9IChyMCAtIHIyKUBpNSA9IChpMCAtIGkyKUByNiA9IChyMSAtIGkzKUBpNyA9IChpMSAtIHIzKUAKIAotCVZSRVY2NC5JMzIJCQlkMywgZDMKKwlWUkVWNjQuSTMyCQkJZDMsIGQzCQogCiAJVkFERC5TMzIJCQlkNCwgZDgsIGQ5CQlAIHIwID0gYnVmWyA4XSArIGJ1ZlsxMF1AaTAgPSBidWZbIDldICsgYnVmWzExXUAKLQlWU1VCLlMzMgkJCWQ3LCBkMTAsIGQxMQlAIHIxID0gYnVmWzEyXSAtIGJ1ZlsxNF1AaTEgPSBidWZbMTNdIC0gYnVmWzE1XUAKKwlWU1VCLlMzMgkJCWQ3LCBkMTAsIGQxMQlAIHIxID0gYnVmWzEyXSAtIGJ1ZlsxNF1AaTEgPSBidWZbMTNdIC0gYnVmWzE1XUAJCiAJVkFERC5TMzIJCQlkNiwgZDEwLCBkMTEJQCByMiA9IGJ1ZlsxMl0gKyBidWZbMTRdQGkyID0gYnVmWzEzXSArIGJ1ZlsxNV1ACi0JVlJFVjY0LkkzMgkJCWQ3LCBkNworCVZSRVY2NC5JMzIJCQlkNywgZDcJCiAJVlNVQi5TMzIJCQlkNSwgZDgsIGQ5CQlAIHIzID0gYnVmWyA4XSAtIGJ1ZlsxMF1AaTMgPSBidWZbIDldIC0gYnVmWzExXUAKLQotCVZUUk4uMzIJCQkJZDEsIGQzCi0KKwkKKwlWVFJOLjMyCQkJCWQxLCBkMwkKKwkKIAlWQURELlMzMgkJCVE0LCBRMiwgUTMJCUAgdDAgPSAocjAgKyByMikgPj4gMUB0MSA9IChpMCArIGkyKSA+PiAxQGkwID0gaTEgKyByM0ByMiA9IHIxICsgaTNACiAJVlNVQi5TMzIJCQlRNSwgUTIsIFEzCQlAIHQyID0gKHIwIC0gcjIpID4+IDFAdDMgPSAoaTAgLSBpMikgPj4gMUByMCA9IHIxIC0gaTNAaTIgPSBpMSAtIHIzQAotCisJCiAJVlJFVjY0LkkzMgkJCWQzLCBkMwotCi0JVlNIUi5TMzIJCQlkOCwgZDgsICMxCisJCisJVlNIUi5TMzIJCQlkOCwgZDgsICMxCQkgCiAJVlNIUi5TMzIJCQlRMCwgUTAsICMxCiAJVlJFVjY0LkkzMgkJCWQxMCwgZDEwCiAJVlRSTi4zMgkJCQlkMTEsIGQ5CiAJVlNIUi5TMzIJCQlRMSwgUTEsICMxCiAJVlNIUi5TMzIJCQlkMTAsIGQxMCwgIzEKIAlWUkVWNjQuSTMyCQkJZDksIGQ5Ci0KKwkKIAlzdWIgICAgICAgCQkJcjAsIHIwLCAjMHg0MAotCisJCiAJVkFERC5TMzIJCQlkMTIsIGQwLCBkOAotCVZTVUIuUzMyCQkJZDE2LCBkMCwgZDgKKwlWU1VCLlMzMgkJCWQxNiwgZDAsIGQ4CQogCVZBREQuUzMyCQkJZDE0LCBkMiwgZDEwCiAJVlNVQi5TMzIJCQlkMTgsIGQyLCBkMTAKLQorCQogCVZTVUIuUzMyCQkJZDQsIGQxMSwgZDkKIAlWQURELlMzMgkJCWQ1LCBkMTEsIGQ5Ci0KKwkKIAlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQorCQogCVZRRE1VTEguUzMyCQkJUTMsIFEyLCBRMTUKIAlWVFJOLjMyCQkJCWQxNCwgZDE4CiAJVlRSTi4zMgkJCQlkNiwgZDcKLQlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQorCVZSRVY2NC5JMzIJCQlkMTgsIGQxOAkKKwkKIAlWU1VCLlMzMgkJCWQxNSwgZDMsIGQ2CiAJVlJFVjY0LkkzMgkJCWQ3LCBkNwogCVZBREQuUzMyCQkJZDE5LCBkMywgZDYKIAlWQURELlMzMgkJCWQxMywgZDEsIGQ3CiAJVlNVQi5TMzIJCQlkMTcsIGQxLCBkNwotCisJCiAJVlJFVjY0LkkzMgkJCWQxNywgZDE3CiAJVlRSTi4zMgkJCQlkMTMsIGQxNwogCVZSRVY2NC5JMzIJCQlkMTcsIGQxNwotCi0Jc3VicyAgICAgICAJCQlyMSwgcjEsICMxCi0KKwkKKwlzdWJzICAgICAgIAkJCXIxLCByMSwgIzEJCisJCiAJVlNUMS5JMzIJCQl7ZDEyLCBkMTMsIGQxNCwgZDE1fSwgW3IwXSEKLQlWU1QxLkkzMgkJCXtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdIQorCVZTVDEuSTMyCQkJe2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyMF0hCQogCWJuZSAgICAgICAJCQlSYWRpeDhGaXJzdF9MT09QCi0KKwkKIFJhZGl4OEZpcnN0X0VORDoKLQlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQorCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9CQogU1FSVDFfMjoKIAkud29yZCAgICAgIDB4MmQ0MTNjY2QKLQorCQogCUBFTkRQICBAIHxSYWRpeDhGaXJzdHwKLQorCQogCS5zZWN0aW9uIC50ZXh0CiAJLmdsb2JhbAlSYWRpeDRGaXJzdAogCkBAIC0xMTcsMjggKzExNywyOCBAQAogCiAJY21wICAgICAgIAlyMSwgIzAKIAliZXEgICAgICAgCVJhZGl4NEZpcnN0X0VORAotCisJCiBSYWRpeDRGaXJzdF9MT09QOgotCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXQotCi0JVkFERC5TMzIJCQlkNCwgZDAsIGQxCQkJCQkJCUAgcjAgPSBidWZbMF0gKyBidWZbMl1AIHIxID0gYnVmWzFdICsgYnVmWzNdQAorCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXQkJCQkJCisJCisJVkFERC5TMzIJCQlkNCwgZDAsIGQxCQkJCQkJCUAgcjAgPSBidWZbMF0gKyBidWZbMl1AIHIxID0gYnVmWzFdICsgYnVmWzNdQAkJCiAJVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQkJCQkJCUAgcjIgPSBidWZbMF0gLSBidWZbMl1AIHIzID0gYnVmWzFdIC0gYnVmWzNdQAogCVZTVUIuUzMyCQkJZDcsIGQyLCBkMwkJCQkJCQlAIHI0ID0gYnVmWzRdICsgYnVmWzZdQCByNSA9IGJ1Zls1XSArIGJ1Zls3XUAKIAlWQURELlMzMgkJCWQ2LCBkMiwgZDMJCQkJCQkJQCByNiA9IGJ1Zls0XSAtIGJ1Zls2XUAgcjcgPSBidWZbNV0gLSBidWZbN11ACi0KLQlWUkVWNjQuSTMyCQlkNywgZDcJCQkJCQkJCQlACi0KKwkKKwlWUkVWNjQuSTMyCQlkNywgZDcJCQkJCQkJCQlAIAorCQogCVZBREQuUzMyCQkJUTQsIFEyLCBRMwogCVZTVUIuUzMyCQkJUTUsIFEyLCBRMwotCisJCiAJVlJFVjY0LkkzMgkJZDExLCBkMTEKIAlWVFJOLjMyCQkJCWQ5LCBkMTEKLQlzdWJzICAgICAgIAkJcjEsIHIxLCAjMQorCXN1YnMgICAgICAgCQlyMSwgcjEsICMxCQogCVZSRVY2NC5JMzIJCWQxMSwgZDExCiAJVlNUMS5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0hCiAKIAlibmUgICAgICAgCQlSYWRpeDRGaXJzdF9MT09QCi0KKwkKIFJhZGl4NEZpcnN0X0VORDoKIAlsZG1pYSAgICAJCXNwISwge3I0IC0gcjExLCBwY30KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCmluZGV4IGI4NjU1YWUuLjg0YTRhODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMKQEAgLTI4LDExNiArMjgsMTE2IEBACiAJc3RtZGIgICAgc3AhLCB7cjQgLSByMTEsIGxyfQogCiAJbW92CQkJcjEsIHIxLCBhc3IgIzIKLQljbXAgICAgIAlyMSwgIzAKLQliZXEgICAgIAlSYWRpeDRGRlRfRU5ECi0KLVJhZGl4NEZGVF9MT09QMToKLQltb3YgICAgIAlyNSwgcjIsIGxzbCAjMQotCW1vdiAgICAgCXI4LCByMAotCW1vdiAgICAgCXI3LCByMQotCW1vdiAgICAgCXI1LCByNSwgbHNsICMyCi0JY21wICAgICAJcjEsICMwCi0JcnNiZXEgICAJcjEyLCByNSwgcjUsIGxzbCAjMgotCWJlcSAgICAgCVJhZGl4NEZGVF9MT09QMV9FTkQKLQotCXJzYiAgICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIKLQotUmFkaXg0RkZUX0xPT1AyOgotCW1vdiAgICAgCXI2LCByMwotCW1vdiAgICAgCXI0LCByMgotCWNtcCAgICAgCXIyLCAjMAotCWJlcSAgICAgCVJhZGl4NEZGVF9MT09QMl9FTkQKLQotUmFkaXg0RkZUX0xPT1AzOgorCWNtcCAgICAgCXIxLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwliZXEgICAgIAlSYWRpeDRGRlRfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCitSYWRpeDRGRlRfTE9PUDE6ICAgICAgICAgICAgICAgICAgICAgICAgIAorCW1vdiAgICAgCXI1LCByMiwgbHNsICMxICAKKwltb3YgICAgIAlyOCwgcjAgICAgICAgICAgCisJbW92ICAgICAJcjcsIHIxICAKKwltb3YgICAgIAlyNSwgcjUsIGxzbCAjMiAgIAorCWNtcCAgICAgCXIxLCAjMCAgICAgICAgICAKKwlyc2JlcSAgIAlyMTIsIHI1LCByNSwgbHNsICMyIAorCWJlcSAgICAgCVJhZGl4NEZGVF9MT09QMV9FTkQgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJzYiAgICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIgICAKKwkgCitSYWRpeDRGRlRfTE9PUDI6ICAgICAgICAgICAgICAgICAgICAgICAgCisJbW92ICAgICAJcjYsIHIzIAorCW1vdiAgICAgCXI0LCByMiAgCisJY21wICAgICAJcjIsICMwICAgICAgICAKKwliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDJfRU5EICAgICAgICAgCisgIAorUmFkaXg0RkZUX0xPT1AzOiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJQHIwID0geHB0clswXUAKIAlAcjEgPSB4cHRyWzFdQAotCVZMRDIuSTMyCQkJe0QwLCBEMSwgRDIsIEQzfSwgW3I4XQorCVZMRDIuSTMyCQkJe0QwLCBEMSwgRDIsIEQzfSwgW3I4XQkJCQkKIAlWTEQyLkkzMgkJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQkJQCBjb3N4ID0gY3NwdHJbMF1AIHNpbnggPSBjc3B0clsxXUAKLQotCWFkZAkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEAKKwkKKwlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACQogCVZMRDIuSTMyCQkJe0Q0LCBENSwgRDYsRDd9LCBbcjhdCQkJCQlAIHIyID0geHB0clswXUAgcjMgPSB4cHRyWzFdQAotCisJCiAJVlFETVVMSC5TMzIJCVExMCwgUTIsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKIAlWUURNVUxILlMzMgkJUTExLCBRMywgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQogCVZRRE1VTEguUzMyCQlRMTIsIFEzLCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCiAJVlFETVVMSC5TMzIJCVExMywgUTIsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQorCQkKIAlWQURELlMzMgkJCVEyLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQogCVZTVUIuUzMyCQkJUTMsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KKwkKIAlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACiAJVlNIUi5TMzIJCQlRMTAsIFEwLCAjMgkJCQkJCQkJCQlAIHQwID0gcjAgPj4gMkAKIAlWU0hSLlMzMgkJCVExMSwgUTEsICMyCQkJCQkJCQkJCUAgdDEgPSByMSA+PiAyQAotCisJCiAJVlNVQi5TMzIJCQlRMCwJUTEwLCBRMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkAKIAlWU1VCLlMzMgkJCVExLAlRMTEsIFEzCQkJCQkJCQkJCUAgcjEgPSB0MSAtIHIzQAogCVZBREQuUzMyCQkJUTIsIFExMCwgUTIJCQkJCQkJCQkJQCByMiA9IHQwICsgcjJACiAJVkFERC5TMzIJCQlRMywgUTExLCBRMwkJCQkJCQkJCQlAIHIzID0gdDEgKyByM0AKLQotCVZMRDIuSTMyCQkJe0Q4LCBEOSwgRDEwLCBEMTF9LCBbcjhdCi0JVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEKKwkJCisJVkxEMi5JMzIJCQl7RDgsIEQ5LCBEMTAsIEQxMX0sIFtyOF0JCisJVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEJCiAJYWRkCQkJCQkJcjgsIHI4LCByNQogCiAJVlFETVVMSC5TMzIJCVExMCwgUTQsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKIAlWUURNVUxILlMzMgkJUTExLCBRNSwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQogCVZRRE1VTEguUzMyCQlRMTIsIFE1LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCiAJVlFETVVMSC5TMzIJCVExMywgUTQsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQorCQkKIAlWQURELlMzMgkJCVE4LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQotCVZTVUIuUzMyCQkJUTksIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KLQlWTEQyLkkzMgkJe0QxMiwgRDEzLCBEMTQsIEQxNX0sIFtyOF0KKwlWU1VCLlMzMgkJCVE5LCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQkKKwkKKwlWTEQyLkkzMgkJe0QxMiwgRDEzLCBEMTQsIEQxNX0sIFtyOF0JCiAJVkxEMi5JMzIJCXtEMjgsIEQyOSwgRDMwLCBEMzF9LCBbcjZdIQotCisJCiAJVlFETVVMSC5TMzIJCVExMCwgUTYsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKIAlWUURNVUxILlMzMgkJUTExLCBRNywgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQogCVZRRE1VTEguUzMyCQlRMTIsIFE3LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCiAJVlFETVVMSC5TMzIJCVExMywgUTYsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQorCQkKIAlWQURELlMzMgkJCVE2LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQotCVZTVUIuUzMyCQkJUTcsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KKwlWU1VCLlMzMgkJCVE3LCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQkJCisJCiAJVkFERC5TMzIJCQlRNCwgUTgsIFE2CQkJCQkJCQkJCUAgcjQgPSB0MCArIHI2QAogCVZTVUIuUzMyCQkJUTUsIFE3LCBROQkJCQkJCQkJCQlAIHI1ID0gcjcgLSB0MUAKIAlWU1VCLlMzMgkJCVE2LCBROCwgUTYJCQkJCQkJCQkJQCByNiA9IHQwIC0gcjZACiAJVkFERC5TMzIJCQlRNywgUTcsIFE5CQkJCQkJCQkJCUAgcjcgPSByNyArIHQxQAotCisJCiAJVkFERC5TMzIJCQlROCwgUTAsIFE1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwICsgcjVACiAJVkFERC5TMzIJCQlROSwgUTEsIFE2CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIxICsgcjZACiAJVlNUMi5JMzIJCQl7RDE2LCBEMTcsIEQxOCwgRDE5fSwgW3I4XQotCisJCiAJVlNVQi5TMzIJCQlRMTAsIFEyLCBRNAkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMiAtIHI0QAogCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKIAlWU1VCLlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdACiAJVlNUMi5JMzIJCQl7RDIwLCBEMjEsIEQyMiwgRDIzfSwgW3I4XQotCisJCQogCVZTVUIuUzMyCQkJUTgsIFEwLCBRNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCAtIHI1QAogCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKIAlWU1VCLlMzMgkJCVE5LCBRMSwgUTYJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjEgLSByNkAKIAlWU1QyLkkzMgkJCXtEMTYsIEQxNywgRDE4LCBEMTl9LCBbcjhdCi0KKwkJCiAJVkFERC5TMzIJCQlRMTAsIFEyLCBRNAkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMiArIHI0QAogCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKIAlWQURELlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzICsgcjdACiAJVlNUMi5JMzIJCQl7RDIwLCBEMjEsIEQyMiwgRDIzfSwgW3I4XSEKLQotCXN1YnMgICAgCQkJcjQsIHI0LCAjNAotCWJuZSAgICAgCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6Ci0JYWRkICAgICAJCQlyOCwgcjgsIHIxMgotCXN1YiAgICAJCQkJcjcsIHI3LCAjMQorCQkKKwlzdWJzICAgIAkJCXI0LCByNCwgIzQgCisJYm5lICAgICAJCQlSYWRpeDRGRlRfTE9PUDMgCisJICAgICAgICAgICAgICAgICAgICAgICAgIAorUmFkaXg0RkZUX0xPT1AyX0VORDogICAgICAgICAgICAgICAgICAgICAgICAgCisJYWRkICAgICAJCQlyOCwgcjgsIHIxMiAgICAKKwlzdWIgICAgCQkJCXI3LCByNywgIzEgICAgIAogCWNtcAkJCQkJcjcsICMwCi0JYmhpICAgICAJCQlSYWRpeDRGRlRfTE9PUDIKLQotUmFkaXg0RkZUX0xPT1AxX0VORDoKLQlhZGQgICAgIAkJCXIzLCByMTIsIHIzCi0JbW92ICAgICAJCQlyMiwgcjIsIGxzbCAjMgotCW1vdnMgICAgCQkJcjEsIHIxLCBhc3IgIzIKLQlibmUgICAgIAkJCVJhZGl4NEZGVF9MT09QMQotCi1SYWRpeDRGRlRfRU5EOgorCWJoaSAgICAgCQkJUmFkaXg0RkZUX0xPT1AyICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorUmFkaXg0RkZUX0xPT1AxX0VORDogICAgICAgICAgICAgICAgICAgICAgICAKKwlhZGQgICAgIAkJCXIzLCByMTIsIHIzICAgIAorCW1vdiAgICAgCQkJcjIsIHIyLCBsc2wgIzIgCisJbW92cyAgICAJCQlyMSwgcjEsIGFzciAjMiAKKwlibmUgICAgIAkJCVJhZGl4NEZGVF9MT09QMSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorUmFkaXg0RkZUX0VORDogICAgICAgIAogCWxkbWlhICAgCQkJc3AhLCB7cjQgLSByMTEsIHBjfQotCisJCQogCUBFTkRQICBAIHxSYWRpeDRGRlR8CiAJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCmluZGV4IDc1MDFhZjEuLjg5YzM5YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmFuZF9ucmcuYwpAQCAtMzcsMTggKzM3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVN1bSkKIHsKICAgV29yZDMyIGksIGo7Ci0gIFdvcmQzMiBhY2N1U3VtID0gMDsKKyAgV29yZDMyIGFjY3VTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgZm9yIChpPTA7IGk8bnVtQmFuZHM7IGkrKykgewotICAgIFdvcmQzMiBhY2N1ID0gMDsKKyAgICBXb3JkMzIgYWNjdSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspCiAgICAgICBhY2N1ID0gTF9hZGQoYWNjdSwgTVVMSElHSChtZGN0U3BlY3RydW1bal0sIG1kY3RTcGVjdHJ1bVtqXSkpOwogCiAJYWNjdSA9IExfYWRkKGFjY3UsIGFjY3UpOwogICAgIGFjY3VTdW0gPSBMX2FkZChhY2N1U3VtLCBhY2N1KTsKLSAgICBiYW5kRW5lcmd5W2ldID0gYWNjdTsKKyAgICBiYW5kRW5lcmd5W2ldID0gYWNjdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KLSAgKmJhbmRFbmVyZ3lTdW0gPSBhY2N1U3VtOworICAqYmFuZEVuZXJneVN1bSA9IGFjY3VTdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02OCwxNSArNjgsMTUgQEAKIHsKIAogICBXb3JkMzIgaSwgajsKLSAgV29yZDMyIGFjY3VNaWRTdW0gPSAwOwotICBXb3JkMzIgYWNjdVNpZGVTdW0gPSAwOwotCisgIFdvcmQzMiBhY2N1TWlkU3VtID0gMDsgICAgICAgIAorICBXb3JkMzIgYWNjdVNpZGVTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIAogCiAgIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykgewogICAgIFdvcmQzMiBhY2N1TWlkID0gMDsKLSAgICBXb3JkMzIgYWNjdVNpZGUgPSAwOworICAgIFdvcmQzMiBhY2N1U2lkZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKSB7Ci0gICAgICBXb3JkMzIgc3BlY20sIHNwZWNzOworICAgICAgV29yZDMyIHNwZWNtLCBzcGVjczsgCiAgICAgICBXb3JkMzIgbCwgcjsKIAogICAgICAgbCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKQEAgLTg2LDE3ICs4NiwxNyBAQAogICAgICAgYWNjdU1pZCA9IExfYWRkKGFjY3VNaWQsIE1VTEhJR0goc3BlY20sIHNwZWNtKSk7CiAgICAgICBhY2N1U2lkZSA9IExfYWRkKGFjY3VTaWRlLCBNVUxISUdIKHNwZWNzLCBzcGVjcykpOwogICAgIH0KLQorICAgIAogCWFjY3VNaWQgPSBMX2FkZChhY2N1TWlkLCBhY2N1TWlkKTsKIAlhY2N1U2lkZSA9IExfYWRkKGFjY3VTaWRlLCBhY2N1U2lkZSk7Ci0JYmFuZEVuZXJneU1pZFtpXSA9IGFjY3VNaWQ7CisJYmFuZEVuZXJneU1pZFtpXSA9IGFjY3VNaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIGFjY3VNaWRTdW0gPSBMX2FkZChhY2N1TWlkU3VtLCBhY2N1TWlkKTsKLSAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IGFjY3VTaWRlOworICAgIGJhbmRFbmVyZ3lTaWRlW2ldID0gYWNjdVNpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBhY2N1U2lkZVN1bSA9IExfYWRkKGFjY3VTaWRlU3VtLCBhY2N1U2lkZSk7Ci0KKyAgICAKICAgfQotICAqYmFuZEVuZXJneU1pZFN1bSA9IGFjY3VNaWRTdW07Ci0gICpiYW5kRW5lcmd5U2lkZVN1bSA9IGFjY3VTaWRlU3VtOworICAqYmFuZEVuZXJneU1pZFN1bSA9IGFjY3VNaWRTdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKmJhbmRFbmVyZ3lTaWRlU3VtID0gYWNjdVNpZGVTdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiB9CiAKICNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYwppbmRleCA5ZmU1MTFjLi44ODUzZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0X2NudC5jCkBAIC0yNiwxNCArMjYsMTQgQEAKICNkZWZpbmUgSElfTFRBQihhKSAoYT4+OCkKICNkZWZpbmUgTE9fTFRBQihhKSAoYSAmIDB4ZmYpCiAKLSNkZWZpbmUgRVhQQU5EKGEpICAoKCgoV29yZDMyKShhJjB4ZmYwMCkpIDw8IDgpfChXb3JkMzIpKGEmMHhmZikpCisjZGVmaW5lIEVYUEFORChhKSAgKCgoKFdvcmQzMikoYSYweGZmMDApKSA8PCA4KXwoV29yZDMyKShhJjB4ZmYpKSAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMS0xMQotKiByZXR1cm5zOgorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMS0xMSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDEtMTEKICoKQEAgLTQ2LDUxICs0Niw1MSBAQAogICBXb3JkMzIgdDAsdDEsdDIsdDMsaTsKICAgV29yZDMyIGJjMV8yLGJjM180LGJjNV82LGJjN184LGJjOV8xMDsKICAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmMxXzI9MDsKLSAgYmMzXzQ9MDsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgCisgIGJjMV8yPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzNfND0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM1XzY9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjN184PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKLQotICAgIHQwPSB2YWx1ZXNbaSswXTsKLSAgICB0MT0gdmFsdWVzW2krMV07Ci0gICAgdDI9IHZhbHVlc1tpKzJdOwotICAgIHQzPSB2YWx1ZXNbaSszXTsKLQorICAgIAorICAgIHQwPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0MT0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDI9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQzPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAKKyAgCiAgICAgLyogMSwyICovCiAKLSAgICBiYzFfMiA9IGJjMV8yICsgRVhQQU5EKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7CisgICAgYmMxXzIgPSBiYzFfMiArIEVYUEFORChodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOyAgICAgICAgICAgICAgCiAKICAgICAvKiA1LDYgKi8KLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDIrNF1bdDMrNF0pOworICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgdDA9QUJTKHQwKTsKICAgICB0MT1BQlModDEpOwogICAgIHQyPUFCUyh0Mik7CiAgICAgdDM9QUJTKHQzKTsKIAotCi0gICAgYmMzXzQgPSBiYzNfNCArIEVYUEFORChodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLQotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOwotCi0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7Ci0KKyAgICAKKyAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKICAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07CiAgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0Ml1bdDNdOwotCi0KKyAgIAorICAgICAgICAgICAKICAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOwogICB9Ci0KKyAgCiAgIGJpdENvdW50WzFdPWV4dHJhY3RfaChiYzFfMik7CiAgIGJpdENvdW50WzJdPWV4dHJhY3RfbChiYzFfMik7CiAgIGJpdENvdW50WzNdPWV4dHJhY3RfaChiYzNfNCkgKyBzYzsKQEAgLTEwOCw4ICsxMDgsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGZ1bmN0aW9uIG5hbWU6IGNvdW50M180XzVfNl83XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMy0xMQotKiByZXR1cm5zOgorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMy0xMSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDMtMTEKICoKQEAgLTEyMiwyNiArMTIyLDI2IEBACiAgIFdvcmQzMiB0MCx0MSx0Mix0MywgaTsKICAgV29yZDMyIGJjM180LGJjNV82LGJjN184LGJjOV8xMDsKICAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmMzXzQ9MDsKLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgICAKKyAgYmMzXzQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjNV82PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzdfOD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM5XzEwPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wO2k8d2lkdGg7aSs9NCl7CiAKLSAgICB0MD0gdmFsdWVzW2krMF07Ci0gICAgdDE9IHZhbHVlc1tpKzFdOwotICAgIHQyPSB2YWx1ZXNbaSsyXTsKLSAgICB0Mz0gdmFsdWVzW2krM107Ci0KKyAgICB0MD0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDE9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQyPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0Mz0gdmFsdWVzW2krM107ICAgICAgICAgICAgICAgICAgICAgCisgICAgCiAgICAgLyoKICAgICAgIDUsNgogICAgICovCi0gICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOwotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QyKzRdW3QzKzRdKTsKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgIHQwPUFCUyh0MCk7CiAgICAgdDE9QUJTKHQxKTsKQEAgLTE0OSwyMyArMTQ5LDIzIEBACiAgICAgdDM9QUJTKHQzKTsKIAogCi0gICAgYmMzXzQgPSBiYzNfNCArIEVYUEFORChodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLQotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOwotCi0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7Ci0KKyAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07CiAgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0Ml1bdDNdOwogCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOworICAgICAgICAgICAKKyAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOyAgIAogICB9Ci0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgCisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBiaXRDb3VudFszXT1leHRyYWN0X2goYmMzXzQpICsgc2M7CiAgIGJpdENvdW50WzRdPWV4dHJhY3RfbChiYzNfNCkgKyBzYzsKICAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKQEAgLTE3NSw3ICsxNzUsNyBAQAogICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwogICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKICAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLQorICAKIH0KIAogCkBAIC0xODMsOCArMTgzLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBjb3VudDVfNl83XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMQotKiByZXR1cm5zOgorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDUtMTEKICoKQEAgLTE5OCwzMyArMTk4LDMzIEBACiAgIFdvcmQzMiBiYzVfNixiYzdfOCxiYzlfMTA7CiAgIFdvcmQxNiBiYzExLHNjOwogCi0gIGJjNV82PTA7Ci0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7CisgIGJjNV82PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzdfOD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM5XzEwPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CiAKLSAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgIHQxID0gdmFsdWVzW2krMV07CisgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgIAorICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAKIAotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgCiAKICAgICB0MD1BQlModDApOwogICAgIHQxPUFCUyh0MSk7Ci0KLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKKyAgICAgCisgICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAKICAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQorICAgIAorICAgICAgIAogICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CiAgIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOwogICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOwogICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7CkBAIC0yMzIsMTUgKzIzMiwxNSBAQAogICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwogICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKICAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLQorICAKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogY291bnQ3XzhfOV8xMF8xMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNy0xMQotKiByZXR1cm5zOgorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNy0xMSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDctMTEKICoKQEAgLTI1Myw0MyArMjUzLDQzIEBACiAgIFdvcmQzMiB0MCx0MSwgaTsKICAgV29yZDMyIGJjN184LGJjOV8xMDsKICAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKKyAgICAKKyAgYmM3Xzg9MDsgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgc2M9MDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKIAogICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7CiAgICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKIAotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOworICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgCiAgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotCi0KKyAgIAorICAgICAgIAogICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CiAgIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKICAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwogICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7CiAgIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7CiAgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwogICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCisgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogY291bnQ5XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA5LTExCi0qIHJldHVybnM6CisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA5LTExIAorKiByZXR1cm5zOiAgICAgIAogKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQogKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgOS0xMQogKgpAQCAtMjk5LDQ1ICsyOTksNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQogewogCi0gIFdvcmQzMiB0MCx0MSxpOworICBXb3JkMzIgdDAsdDEsaTsgIAogICBXb3JkMzIgYmM5XzEwOwogICBXb3JkMTYgYmMxMSxzYzsKIAotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOworICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKIAogICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7CiAgICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKKyAgICAKIAotCi0gICAgYmM5XzEwICs9IEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOworICAgIGJjOV8xMCArPSBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgIAogICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKIAotCisgICAgICAgCiAgICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKTsKICAgfQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIAorICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCisgIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIAorICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCiAgIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7CiAgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwogICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCisgIAogfQotCisgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogY291bnQxMQotKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMQotKiByZXR1cm5zOgorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGUgMTEKICoKQEAgLTM0NywzNyArMzQ3LDM3IEBACiAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmJpdENvdW50KQogewogICBXb3JkMzIgdDAsdDEsaTsKLSAgV29yZDE2IGJjMTEsc2M7CisgIFdvcmQxNiBiYzExLHNjOyAgCiAKLSAgYmMxMT0wOwotICBzYz0wOworICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewogICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7CiAgICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKICAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07CiAKLQorICAgICAgIAogICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CiAgIH0KIAotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKKyAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbN109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbOV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMTBdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAKICAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGZ1bmN0aW9uIG5hbWU6IGNvdW50RXNjCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExICh3aXRoIEVzYykKLSogcmV0dXJuczoKKyogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGUgMTEgKHdpdGggRXNjKSAKKyogcmV0dXJuczogICAgICAKICogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KICogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDExICh3aXRoIEVzYykKICoKQEAgLTM4OCwzMSArMzg4LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQogewogICBXb3JkMzIgdDAsdDEsdDAwLHQwMSxpOwotICBXb3JkMTYgYmMxMSxlYyxzYzsKKyAgV29yZDE2IGJjMTEsZWMsc2M7ICAKIAotICBiYzExPTA7Ci0gIHNjPTA7Ci0gIGVjPTA7CisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZWM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKICAgICB0MD1BQlModmFsdWVzW2krMF0pOwogICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7Ci0KLQorICAgIAorICAgICAgIAogICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7CiAKICAgICB0MDAgPSBtaW4odDAsMTYpOwogICAgIHQwMSA9IG1pbih0MSwxNik7CiAgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MDBdW3QwMV07Ci0KLQorICAgIAorICAgICAKICAgICBpZih0MCA+PSAxNil7CiAgICAgICBlYyA9IGVjICsgNTsKICAgICAgIHdoaWxlKHN1Yih0MD0odDAgPj4gMSksIDE2KSA+PSAwKSB7CiAgICAgICAgIGVjID0gZWMgKyAyOwogICAgICAgfQogICAgIH0KLQotCisgICAgCisgICAgIAogICAgIGlmKHQxID49IDE2KXsKICAgICAgIGVjID0gZWMgKyA1OwogICAgICAgd2hpbGUoc3ViKHQxPSh0MSA+PiAxKSwgMTYpID49IDApIHsKQEAgLTQyMCwxNiArNDIwLDE2IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOworICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIAorICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCisgIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIAorICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAKKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgCisgIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIAorICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAKICAgYml0Q291bnRbMTFdPWJjMTEgKyBzYyArIGVjOwogfQogCkBAIC00NjMsNyArNDYzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBiaXRDb3VudAotKiBkZXNjcmlwdGlvbjogIGNvdW50IGJpdHMKKyogZGVzY3JpcHRpb246ICBjb3VudCBiaXRzIAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBXb3JkMTYgYml0Q291bnQoY29uc3QgV29yZDE2ICp2YWx1ZXMsCkBAIC00NzQsNyArNDc0LDcgQEAKICAgLyoKICAgICBjaGVjayBpZiB3ZSBjYW4gdXNlIGNvZGVib29rIDAKICAgKi8KLQorICAgICAKICAgaWYobWF4VmFsID09IDApCiAgICAgYml0Q291bnRbMF0gPSAwOwogICBlbHNlCkBAIC00ODksNyArNDg5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBjb2RlVmFsdWVzCi0qIGRlc2NyaXB0aW9uOiAgd3JpdGUgaHVmZnVtIGJpdHMKKyogZGVzY3JpcHRpb246ICB3cml0ZSBodWZmdW0gYml0cyAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQpAQCAtNDk5LDg1ICs0OTksODUgQEAKICAgVVdvcmQxNiBjb2RlV29yZCwgY29kZUxlbmd0aDsKICAgV29yZDE2IHNpZ24sIHNpZ25MZW5ndGg7CiAKLQorICAgCiAgIHN3aXRjaCAoY29kZUJvb2spIHsKICAgICBjYXNlIENPREVfQk9PS19aRVJPX05POgogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIENPREVfQk9PS18xX05POgogICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdOwotICAgICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM107Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwgY29kZVdvcmQsIGNvZGVMZW5ndGgpOworICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MyAgICAgICAgID0gdmFsdWVzW2krM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMVt0MCsxXVt0MSsxXVt0MisxXVt0MysxXTsgICAgICAgICAgICAgICAgIAorICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOyAgICAgIAorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwgY29kZVdvcmQsIGNvZGVMZW5ndGgpOyAgICAgICAgCiAgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgQ09ERV9CT09LXzJfTk86CiAgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7CisgICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQyICAgICAgICAgPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIyW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdOyAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7ICAgICAgCiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIENPREVfQk9PS18zX05POgogICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCiAgICAgICAgIGlmKHQwICE9IDApewogICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgCisgICAgICAgICAgIAogICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOworICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgdDA9LXQwOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKICAgICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAKKyAgICAgICAgICAgCiAgICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB0MT0tdDE7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0KKyAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAogICAgICAgICBpZih0MiAhPSAwKXsKICAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IAorICAgICAgICAgICAKICAgICAgICAgICBpZih0MiA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIHQyPS10MjsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsKKyAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgaWYodDMgIT0gMCl7CiAgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAKKyAgICAgICAgICAgCiAgICAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB0Mz0tdDM7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjNbdDBdW3QxXVt0Ml1bdDNdOwotICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjNbdDBdW3QxXVt0Ml1bdDNdOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICAgICB9CkBAIC01ODUsMTA3ICs1ODUsMTA3IEBACiAKICAgICBjYXNlIENPREVfQk9PS180X05POgogICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBpZih0MCAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7CisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHQwPS10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBpZih0MSAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLQotICAgICAgICBpZih0MiAhPSAwKXsKKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAKKyAgICAgICAgICAgCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MiA9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgIGlmKHQyICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDI9LXQyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOwotCi0gICAgICAgIGlmKHQzICE9IDApeworICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IAorICAgICAgICAgICAKKyAgICAgICAgICBpZih0MiA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdDI9LXQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQzID0gdmFsdWVzW2krM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgaWYodDMgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0Mz0tdDM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI0W3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS181X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjVbdDArNF1bdDErNF07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7CisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgCisgICAgICAgICAgIAorICAgICAgICAgIGlmKHQzIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0Mz0tdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjRbdDBdW3QxXVt0Ml1bdDNdOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICAKKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgY2FzZSBDT0RFX0JPT0tfNV9OTzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjVbdDArNF1bdDErNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgQ09ERV9CT09LXzZfTk86CiAgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiNlt0MCs0XVt0MSs0XTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKKyAgICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjZbdDArNF1bdDErNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgQ09ERV9CT09LXzdfTk86CiAgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKXsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAogICAgICAgICBpZih0MCAhPSAwKXsKICAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IAorICAgICAgICAgICAKICAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIHQwPS10MDsKICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKICAgICAgICAgaWYodDEgIT0gMCl7CiAgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAKKyAgICAgICAgICAgCiAgICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7CisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB0MT0tdDE7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI3W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjdbdDBdW3QxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICAgICB9CkBAIC02OTMsMzMgKzY5MywzMyBAQAogCiAgICAgY2FzZSBDT0RFX0JPT0tfOF9OTzoKICAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI4W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZih0MCAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdDA9LXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYodDEgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjhbdDBdW3QxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7CiAgICAgICB9CkBAIC03MjcsMzMgKzcyNywzMyBAQAogCiAgICAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKICAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI5W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYodDAgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHQwPS10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmKHQxICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0MT0tdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI5W3QwXVt0MV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwogICAgICAgfQpAQCAtNzYxLDMzICs3NjEsMzMgQEAKIAogICAgIGNhc2UgQ09ERV9CT09LXzEwX05POgogICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjEwW3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7CisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYodDAgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHQwPS10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmKHQxICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0MT0tdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMFt0MF1bdDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwogICAgICAgfQpAQCAtNzk1LDQ1ICs3OTUsNDUgQEAKIAogICAgIGNhc2UgQ09ERV9CT09LX0VTQ19OTzoKICAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmKHQwICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBpZih0MCA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0MD0tdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHQxID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZih0MSAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgaWYodDEgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdDE9LXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB0MDAgPSBtaW4odDAsMTYpOwogICAgICAgICB0MDEgPSBtaW4odDEsMTYpOwogCi0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMVt0MDBdW3QwMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBodWZmX2x0YWIxMVt0MDBdW3QwMV07CisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMVt0MDBdW3QwMV07ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFiMTFbdDAwXVt0MDFdOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CiAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7Ci0KKyAgICAgICAgIAogICAgICAgICBpZih0MCA+PSAxNil7CiAgICAgICAgICAgV29yZDE2IG4sIHA7Ci0gICAgICAgICAgbj0wOwotICAgICAgICAgIHA9dDA7CisgICAgICAgICAgbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHA9dDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB3aGlsZShzdWIocD0ocCA+PiAxKSwgMTYpID49IDApewotCisgICAgICAgICAgICAgCiAgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwxLDEpOwogICAgICAgICAgICAgbiA9IG4gKyAxOwogICAgICAgICAgIH0KQEAgLTg0MSwxMyArODQxLDEzIEBACiAgICAgICAgICAgbiA9IG4gKyA0OwogICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCh0MCAtICgxIDw8IG4pKSxuKTsKICAgICAgICAgfQotCisgICAgICAgICAKICAgICAgICAgaWYodDEgPj0gMTYpewogICAgICAgICAgIFdvcmQxNiBuLCBwOwotICAgICAgICAgIG49MDsKLSAgICAgICAgICBwPXQxOworICAgICAgICAgIG49MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBwPXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsKLQorICAgICAgICAgICAgIAogICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKICAgICAgICAgICAgIG4gPSBuICsgMTsKICAgICAgICAgICB9CkBAIC04NzEsMTUgKzg3MSwxNSBAQAogCiBXb3JkMTYgY29kZVNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQogewotICBXb3JkMzIgY29kZVdvcmQ7CisgIFdvcmQzMiBjb2RlV29yZDsgCiAgIFdvcmQxNiBjb2RlTGVuZ3RoOwotCi0KKyAgCisgICAKICAgaWYoZGVsdGEgPiBDT0RFX0JPT0tfU0NGX0xBViB8fCBkZWx0YSA8IC1DT0RFX0JPT0tfU0NGX0xBVikKICAgICByZXR1cm4oMSk7Ci0KLSAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKLSAgY29kZUxlbmd0aCA9IGh1ZmZfbHRhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKKyAgCisgIGNvZGVXb3JkICAgPSBodWZmX2N0YWJzY2ZbZGVsdGEgKyBDT0RFX0JPT0tfU0NGX0xBVl07ICAgICAgICAgICAgCisgIGNvZGVMZW5ndGggPSBodWZmX2x0YWJzY2ZbZGVsdGEgKyBDT0RFX0JPT0tfU0NGX0xBVl07ICAgICAgICAgICAgCiAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwogICByZXR1cm4oMCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRidWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCmluZGV4IDU2MTVhYzMuLmVmMTNjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCkBAIC0zMiwxNSArMzIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICoqcEJpdEJ1ZldvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIGNudCkKIHsKLSAgKnBCaXRCdWZXb3JkICs9IGNudDsKKyAgKnBCaXRCdWZXb3JkICs9IGNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGlmKCpwQml0QnVmV29yZCA+IGhCaXRCdWYtPnBCaXRCdWZFbmQpIHsKLSAgICAqcEJpdEJ1ZldvcmQgLT0gKGhCaXRCdWYtPnBCaXRCdWZFbmQgLSBoQml0QnVmLT5wQml0QnVmQmFzZSArIDEpOworICAgICpwQml0QnVmV29yZCAtPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7ICAgICAgICAgICAgICAgICAgIAogICB9Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgaWYoKnBCaXRCdWZXb3JkIDwgaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UpIHsKLSAgICAqcEJpdEJ1ZldvcmQgKz0gKGhCaXRCdWYtPnBCaXRCdWZFbmQgLSBoQml0QnVmLT5wQml0QnVmQmFzZSArIDEpOworICAgICpwQml0QnVmV29yZCArPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7ICAgICAgICAgICAgICAgICAgIAogICB9CiB9CiAKQEAgLTU3LDE4ICs1NywxOCBAQAogewogICBhc3NlcnQoYml0QnVmU2l6ZSo4IDw9IDMyNzY4KTsKIAotICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOwotICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7CisgIGhCaXRCdWYtPnBCaXRCdWZCYXNlID0gcEJpdEJ1ZkJhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIGhCaXRCdWYtPnBXcml0ZU5leHQgID0gcEJpdEJ1ZkJhc2U7CisgIGhCaXRCdWYtPnBXcml0ZU5leHQgID0gcEJpdEJ1ZkJhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGhCaXRCdWYtPmNhY2hlICAgICAgID0gMDsKLQotICBoQml0QnVmLT53Qml0UG9zICAgICA9IDA7Ci0gIGhCaXRCdWYtPmNudEJpdHMgICAgID0gMDsKLQotICBoQml0QnVmLT5zaXplICAgICAgICA9IChiaXRCdWZTaXplIDw8IDMpOwotICBoQml0QnVmLT5pc1ZhbGlkICAgICA9IDE7CisgIAorICBoQml0QnVmLT53Qml0UG9zICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaEJpdEJ1Zi0+Y250Qml0cyAgICAgPSAwOyAgIAorICAKKyAgaEJpdEJ1Zi0+c2l6ZSAgICAgICAgPSAoYml0QnVmU2l6ZSA8PCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaEJpdEJ1Zi0+aXNWYWxpZCAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgcmV0dXJuIGhCaXRCdWY7CiB9CkBAIC04Miw4ICs4Miw4IEBACiB2b2lkIERlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiAqaEJpdEJ1ZikKIHsKICAgaWYoKmhCaXRCdWYpCi0JKCpoQml0QnVmKS0+aXNWYWxpZCA9IDA7Ci0gICpoQml0QnVmID0gTlVMTDsKKwkoKmhCaXRCdWYpLT5pc1ZhbGlkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKmhCaXRCdWYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTYsMTUgKzk2LDE1IEBACiAgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCiAgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSkKIHsKLSAgaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UgPSBwQml0QnVmQmFzZTsKLSAgaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAgPSBwQml0QnVmQmFzZSArIGJpdEJ1ZlNpemUgLSAxOworICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAgPSBwQml0QnVmQmFzZSArIGJpdEJ1ZlNpemUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOwotCi0gIGhCaXRCdWYtPndCaXRQb3MgICAgID0gMDsKLSAgaEJpdEJ1Zi0+Y250Qml0cyAgICAgPSAwOwotCisgIGhCaXRCdWYtPndCaXRQb3MgICAgID0gMDsgICAgCisgIGhCaXRCdWYtPmNudEJpdHMgICAgID0gMDsgICAgCisgIAogICBoQml0QnVmLT5jYWNoZQkgICA9IDA7CiB9CiAKQEAgLTExNyw3ICsxMTcsNyBAQAogdm9pZCBDb3B5Qml0QnVmKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWZTcmMsCiAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdEJ1ZkRzdCkKIHsKLSAgKmhCaXRCdWZEc3QgPSAqaEJpdEJ1ZlNyYzsKKyAgKmhCaXRCdWZEc3QgPSAqaEJpdEJ1ZlNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ4LDI1ICsxNDgsMjUgQEAKICAgaWYobm9CaXRzVG9Xcml0ZSA9PSAwKQogCSAgcmV0dXJuIG5vQml0c1RvV3JpdGU7CiAKLSAgaEJpdEJ1Zi0+Y250Qml0cyArPSBub0JpdHNUb1dyaXRlOworICBoQml0QnVmLT5jbnRCaXRzICs9IG5vQml0c1RvV3JpdGU7ICAgCiAKICAgd0JpdFBvcyA9IGhCaXRCdWYtPndCaXRQb3M7CiAgIHdCaXRQb3MgKz0gbm9CaXRzVG9Xcml0ZTsKLSAgd3JpdGVWYWx1ZSA8PD0gMzIgLSB3Qml0UG9zOworICB3cml0ZVZhbHVlIDw8PSAzMiAtIHdCaXRQb3M7CQogICB3cml0ZVZhbHVlIHw9IGhCaXRCdWYtPmNhY2hlOwotCi0gIHdoaWxlICh3Qml0UG9zID49IDgpCisgIAorICB3aGlsZSAod0JpdFBvcyA+PSA4KSAKICAgewogCSAgVVdvcmQ4IHRtcDsKIAkgIHRtcCA9IChVV29yZDgpKCh3cml0ZVZhbHVlID4+IDI0KSAmIDB4RkYpOwotCi0JICAqaEJpdEJ1Zi0+cFdyaXRlTmV4dCsrID0gdG1wOworCSAgCisJICAqaEJpdEJ1Zi0+cFdyaXRlTmV4dCsrID0gdG1wOwkJCiAJICB3cml0ZVZhbHVlIDw8PSA4OwogCSAgd0JpdFBvcyAtPSA4OwogICB9Ci0KKyAgCiAgIGhCaXRCdWYtPndCaXRQb3MgPSB3Qml0UG9zOwogICBoQml0QnVmLT5jYWNoZSA9IHdyaXRlVmFsdWU7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgcmV0dXJuIG5vQml0c1RvV3JpdGU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCmluZGV4IGZjYzEyZGQuLmVhMzQ0MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCkBAIC00Niw3ICs0Niw3IEBACiAgIFdvcmQxNiBpLHNmYjsKICAgV29yZDE2IGRiZ1ZhbDsKICAgU0VDVElPTl9JTkZPKiBwc2VjdGlvbmluZm87Ci0gIGRiZ1ZhbCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKKyAgZGJnVmFsID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgewogICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxibG9ja1R5cGUsMik7CiAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHdpbmRvd1NoYXBlLDEpOwogCi0KKyAgIAogICBzd2l0Y2goYmxvY2tUeXBlKXsKICAgICBjYXNlIExPTkdfV0lORE9XOgogICAgIGNhc2UgU1RBUlRfV0lORE9XOgpAQCAtMTM3LDMwICsxMzcsMzAgQEAKICAgV29yZDE2IHNlY3RMZW47CiAgIFdvcmQxNiBpOwogICBXb3JkMTYgZGJnVmFsPUdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKKyAgICAgICAKIAotCi0KKyAgIAogICBzd2l0Y2goc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSkKICAgewogICAgIGNhc2UgTE9OR19XSU5ET1c6CiAgICAgY2FzZSBTVEFSVF9XSU5ET1c6CiAgICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfTE9ORzsKKyAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsgICAgICAgICAgICAgICAgIAorICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19MT05HOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICBicmVhazsKIAogICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgc2VjdEVzY2FwZVZhbCA9IFNFQ1RfRVNDX1ZBTF9TSE9SVDsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfU0hPUlQ7CisgICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX1NIT1JUOyAgICAgICAgICAgICAgICAKKyAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfU0hPUlQ7ICAgICAgICAgICAgICAgICAgIAogICAgICAgYnJlYWs7CiAgIH0KIAogICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspIHsKICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0uY29kZUJvb2ssNCk7Ci0gICAgc2VjdExlbiA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXS5zZmJDbnQ7CisgICAgc2VjdExlbiA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXS5zZmJDbnQ7ICAgICAgICAKIAogICAgIHdoaWxlKHNlY3RMZW4gPj0gc2VjdEVzY2FwZVZhbCkgewotCisgICAgICAgCiAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0RXNjYXBlVmFsLHNlY3RMZW5CaXRzKTsKICAgICAgIHNlY3RMZW4gPSBzZWN0TGVuIC0gc2VjdEVzY2FwZVZhbDsKICAgICB9CkBAIC0xODMsMjQgKzE4MywyNCBAQAogewogICBXb3JkMTYgaSxqLGxhc3RWYWxTY2YsZGVsdGFTY2Y7CiAgIFdvcmQxNiBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOworICBTRUNUSU9OX0lORk8qIHBzZWN0aW9uaW5mbzsgCiAKLSAgbGFzdFZhbFNjZj1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOworICBsYXN0VmFsU2NmPXNjYWxlZmFjW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07ICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspewotICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsKKyAgICBwc2VjdGlvbmluZm8gPSAmKHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXSk7IAogICAgIGlmIChwc2VjdGlvbmluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKXsKICAgICAgIGZvciAoaj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OwogICAgICAgICAgICBqPHBzZWN0aW9uaW5mby0+c2ZiU3RhcnQrcHNlY3Rpb25pbmZvLT5zZmJDbnQ7IGorKyl7Ci0KKyAgICAgICAgIAogICAgICAgICBpZihtYXhWYWx1ZUluU2ZiW2pdID09IDApIHsKLSAgICAgICAgICBkZWx0YVNjZiA9IDA7CisgICAgICAgICAgZGVsdGFTY2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjW2pdOwotICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY1tqXTsKKyAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIH0KLQorICAgICAgICAgCiAgICAgICAgIGlmKGNvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmLGhCaXRTdHJlYW0pKXsKICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgIH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogewogICBXb3JkMTYgc2ZiLCBzZmJPZmY7CiAKLQorICAgCiAgIHN3aXRjaChtc0RpZ2VzdCkKICAgewogICAgIGNhc2UgTVNfTk9ORToKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19TT01FLDIpOwogICAgICAgZm9yKHNmYk9mZiA9IDA7IHNmYk9mZiA8IHNmYkNudDsgc2ZiT2ZmKz1ncnBTZmIpIHsKICAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiOyBzZmIrKykgewotCisgICAgICAgICAgICAgCiAgICAgICAgICAgaWYoanNGbGFnc1tzZmJPZmYrc2ZiXSAmIE1TX09OKSB7CiAgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOwogICAgICAgICAgIH0KQEAgLTI3Miw3ICsyNzIsNyBAQAogICBXb3JkMTYgY29lZkJpdHM7CiAgIEZsYWcgaXNTaG9ydDsKIAotCisgICAgICAgCiAgIGlmIChibG9ja1R5cGU9PTIpIHsKICAgICBpc1Nob3J0ID0gMTsKICAgICBudW1PZldpbmRvd3MgPSBUUkFOU19GQUM7CkBAIC0yODIsNTIgKzI4Miw1MiBAQAogICAgIG51bU9mV2luZG93cyA9IDE7CiAgIH0KIAotICB0bnNQcmVzZW50PTA7CisgIHRuc1ByZXNlbnQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgewotCisgICAgIAogICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgewotICAgICAgdG5zUHJlc2VudD0xOworICAgICAgdG5zUHJlc2VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KLQorICAgCiAgIGlmICh0bnNQcmVzZW50PT0wKSB7CiAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKICAgfQogICBlbHNleyAvKiB0aGVyZSBpcyBkYXRhIHRvIGJlIHdyaXR0ZW4qLwogICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7IC8qZGF0YV9wcmVzZW50ICovCiAgICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQorICAgICAgIAogICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby50bnNBY3RpdmVbaV0sKGlzU2hvcnQ/MToyKSk7Ci0KKyAgICAgICAKICAgICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgewotCisgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sKCh0bnNJbmZvLmNvZWZSZXNbaV0gLSA0KT09MD8xOjApLDEpOwotCisgICAgICAgICAKICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5sZW5ndGhbaV0sKGlzU2hvcnQ/NDo2KSk7Ci0KKyAgICAgICAgIAogICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLm9yZGVyW2ldLChpc1Nob3J0PzM6NSkpOwotCisgICAgICAgICAKICAgICAgICAgaWYgKHRuc0luZm8ub3JkZXJbaV0pewogICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCBGSUxURVJfRElSRUNUSU9OLCAxKTsKLQorICAgICAgICAgICAKICAgICAgICAgICBpZih0bnNJbmZvLmNvZWZSZXNbaV0gPT0gNCkgewotICAgICAgICAgICAgY29lZkJpdHMgPSAzOworICAgICAgICAgICAgY29lZkJpdHMgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKyspIHsKLQorICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgaWYgKHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPiAzIHx8CiAgICAgICAgICAgICAgICAgICB0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdIDwgLTQpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb2VmQml0cyA9IDI7CisgICAgICAgICAgICBjb2VmQml0cyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKykgewotCisgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBpZiAodG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA+IDEgfHwKICAgICAgICAgICAgICAgICAgIHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPCAtMikgewotICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKKyAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzM1LDcgKzMzNSw3IEBACiAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHRuc0luZm8uY29lZlJlc1tpXSAtIGNvZWZCaXRzLCAxKTsgLypjb2VmX2NvbXByZXMqLwogICAgICAgICAgIGZvciAoaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKyApIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBXb3JkMTYgcm1hc2tbXSA9IHswLDEsMyw3LDE1fTsKLQorICAgICAgICAgICAgIAogICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSAmIHJtYXNrW2NvZWZCaXRzXSxjb2VmQml0cyk7CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zOTcsNyArMzk3LDcgQEAKIAogICBlbmNvZGVHbG9iYWxHYWluKGdsb2JhbEdhaW4sIGxvZ05vcm0sc2NmW3NlY3Rpb25EYXRhLT5maXJzdFNjZl0sIGhCaXRTdHJlYW0pOwogCi0KKyAgIAogICBpZighY29tbW9uV2luZG93KSB7CiAgICAgZW5jb2RlSWNzSW5mbyhzZWN0aW9uRGF0YS0+YmxvY2tUeXBlLCB3aW5kb3dTaGFwZSwgZ3JvdXBpbmdNYXNrLCBzZWN0aW9uRGF0YSwgaEJpdFN0cmVhbSk7CiAgIH0KQEAgLTUzNiw3ICs1MzYsNyBAQAogICAgIFdyaXRlIGZpbGwgRWxlbWVudChzKToKICAgICBhbW91bnQgb2YgYSBmaWxsIGVsZW1lbnQgY2FuIGJlIDcrWCo4IEJpdHMsIFggZWxlbWVudCBvZiBbMC4uMjcwXQogICAqLwotCisgICAgCiAgIHdoaWxlKHRvdEZpbGxCaXRzID49ICgzKzQpKSB7CiAgICAgY250ID0gbWluKCgodG90RmlsbEJpdHMgLSAoMys0KSkgPj4gMyksICgoMTw8NCktMSkpOwogCkBAIC01NDUsNyArNTQ1LDcgQEAKIAogICAgIHRvdEZpbGxCaXRzID0gdG90RmlsbEJpdHMgLSAoMys0KTsKIAotCisgICAgIAogICAgIGlmICgoY250ID09ICgxPDw0KS0xKSkgewogCiAgICAgICBlc2NfY291bnQgPSBtaW4oICgodG90RmlsbEJpdHMgPj4gMykgLSAoKDE8PDQpLTEpKSwgKDE8PDgpLTEpOwpAQCAtNTU1LDcgKzU1NSw3IEBACiAgICAgfQogCiAgICAgZm9yKGk9MDtpPGNudDtpKyspIHsKLQorICAgICAgIAogICAgICAgaWYoYW5jQnl0ZXMpCiAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAqYW5jQnl0ZXMrKyw4KTsKICAgICAgIGVsc2UKQEAgLTU3Niw3ICs1NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICpwc3lPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZ2xvYlVzZWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmdsb2JVc2VkQml0cywJCQkJCSAgIAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLAogCQkJCQkgICBXb3JkMTYgc2FtcGluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICkgLyogcmV0dXJucyBlcnJvciBjb2RlICovCkBAIC01ODYsNyArNTg2LDcgQEAKICAgV29yZDE2IGZyYW1lQml0cz0wOwogCiAgIC8qICAgc3RydWN0IGJpdGJ1ZmZlciBic1dyaXRlQ29weTsgKi8KLSAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOworICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7IAogICBpZihxY091dC0+cWNFbGVtZW50LmFkdHNVc2VkKSAgLyogIHdyaXRlIGFkdHMgaGVhZGVyKi8KICAgewogCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4RkZGLCAxMik7IC8qIDEyIGJpdCBTeW5jd29yZCAqLwpAQCAtNjAxLDIzICs2MDEsMjMgQEAKIAkJCQkJCQkJCTYgY2hhbm5lbHMgb3IgbGVzcywgZWxzZSBhIGNoYW5uZWwKIAkJCQkJCQkJCWNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gKi8KIAkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogb3JpZ2luYWwvY29weSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBob21lICovCi0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogaG9tZSAqLwkgIAorCSAgCiAJICAvKiBWYXJpYWJsZSBBRFRTIGhlYWRlciAqLwogCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBjb3B5ci4gaWQuIGJpdCAqLwogCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBjb3B5ci4gaWQuIHN0YXJ0ICovCiAJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgKmdsb2JVc2VkQml0cyA+PiAzLCAxMyk7CiAJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMHg3RkYsIDExKTsgLyogYnVmZmVyIGZ1bGxuZXNzICgweDdGRiBmb3IgVkJSKSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDIpOyAvKiByYXcgZGF0YSBibG9ja3MgKDArMT0xKSAqLworCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDIpOyAvKiByYXcgZGF0YSBibG9ja3MgKDArMT0xKSAqLyAgCiAgIH0KIAotICAqZ2xvYlVzZWRCaXRzPTA7CisgICpnbG9iVXNlZEJpdHM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHsKIAogICAgIFdvcmQxNiAqc2ZiT2Zmc2V0WzJdOwogICAgIFROU19JTkZPIHRuc0luZm9bMl07Ci0gICAgZWxlbWVudFVzZWRCaXRzID0gMDsKKyAgICBlbGVtZW50VXNlZEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICBzd2l0Y2ggKGVsSW5mby5lbFR5cGUpIHsKIApAQCAtNjM2LDcgKzYzNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICBXb3JkMTYgbXNEaWdlc3Q7CiAgICAgICAgICAgV29yZDE2ICptc0ZsYWdzID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc01hc2s7Ci0gICAgICAgICAgbXNEaWdlc3QgPSBwc3lPdXQtPnBzeU91dEVsZW1lbnQudG9vbHNJbmZvLm1zRGlnZXN0OworICAgICAgICAgIG1zRGlnZXN0ID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc0RpZ2VzdDsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBzZmJPZmZzZXRbMF0gPQogICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnNmYk9mZnNldHM7CiAgICAgICAgICAgc2ZiT2Zmc2V0WzFdID0KQEAgLTY2OCwyMCArNjY4LDIwIEBACiAgIH0KIAogICB3cml0ZUZpbGxFbGVtZW50KE5VTEwsCi0gICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzLAorICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cywgCiAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CiAKICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfRU5ELDMpOwogCiAgIC8qIGJ5dGUgYWxpZ25lbWVudCAqLwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLCAoOCAtIChoQml0U3RyZWFtLT5jbnRCaXRzICYgNykpICYgNyk7Ci0KKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwgKDggLSAoaEJpdFN0cmVhbS0+Y250Qml0cyAmIDcpKSAmIDcpOyAgICAgICAgICAKKyAgCiAgICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzLSBiaXRNYXJrVXA7Ci0gIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKKyAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgKmdsb2JVc2VkQml0cyA9ICpnbG9iVXNlZEJpdHMgKyBiaXRNYXJrVXA7CiAgIGZyYW1lQml0cyA9IGZyYW1lQml0cyArICpnbG9iVXNlZEJpdHM7CiAKLQorICAgCiAgIGlmIChmcmFtZUJpdHMgIT0gIChxY091dC0+dG90U3RhdGljQml0c1VzZWQrcWNPdXQtPnRvdER5bkJpdHNVc2VkICsgcWNPdXQtPnRvdEFuY0JpdHNVc2VkICsKICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cyArIHFjT3V0LT5hbGlnbkJpdHMpKSB7CiAgICAgcmV0dXJuKC0xKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKaW5kZXggNDdmZDE1ZS4uZDU0ZTMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgSUlSIGhpZ2ggcGFzcyBjb2VmZnMKICovCiBXb3JkMzIgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0gewotICAweGJlYzhiNDM5LCAweDYwOWQ0OTUyICAvKiAtMC41MDk1ZiwgMC43NTQ4ZiAqLworICAweGJlYzhiNDM5LCAweDYwOWQ0OTUyICAvKiAtMC41MDk1ZiwgMC43NTQ4ZiAqLyAKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMzIgYWNjV2luZG93TnJnRmFjID0gMHgyNjY2NjY2NjsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzIDAuMyAqLwpAQCAtNzYsOCArNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0UmF0ZSwgY29uc3QgV29yZDE2IG5DaGFubmVscykKIHsKICAgLyogc2VsZWN0IGF0dGFja1JhdGlvICovCi0KLSAgaWYgKChzdWIobkNoYW5uZWxzLDEpPT0wICYmIExfc3ViKGJpdFJhdGUsIDI0MDAwKSA+IDApIHx8CisgICAgICAgICAgIAorICBpZiAoKHN1YihuQ2hhbm5lbHMsMSk9PTAgJiYgTF9zdWIoYml0UmF0ZSwgMjQwMDApID4gMCkgfHwgCiAgICAgICAoc3ViKG5DaGFubmVscywxKT4wICYmIGJpdFJhdGUgPiAobkNoYW5uZWxzICogMTYwMDApKSkgewogICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8gPSBpbnZBdHRhY2tSYXRpb0hpZ2hCcjsKICAgfQpAQCAtMTE2LDcgKzExNiw3IEBACiAKICAgLyogUmVzZXQgZ3JvdXBpbmcgaW5mbyAqLwogICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSAwOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogCkBAIC0xMjUsMjEgKzEyNSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSF9XSU5ET1dTKTsKIAotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXg7CisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleDsgICAKIAogICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSBNQVhfTk9fT0ZfR1JPVVBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgZm9yIChpPTA7IGk8TUFYX05PX09GX0dST1VQUzsgaSsrKSB7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbltpXSA9IHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleF1baV07CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbltpXSA9IHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleF1baV07ICAKICAgfQotCisJCiAgIC8qIGlmIHRoZSBzYW1wbGVyYXRlIGlzIGxlc3MgdGhhbiAxNjAwMCwgaXQgc2hvdWxkIGJlIGFsbCB0aGUgc2hvcnQgYmxvY2ssIGF2b2lkIHByZSZwb3N0IGVjaG8gKi8KICAgaWYoc2FtcGxlUmF0ZSA+PSAxNjAwMCkgewogCSAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCiAJICBmb3IgKHc9MDsgdzxCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XTsKLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd107CisJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XTsgICAgICAgICAgICAgCisJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW3ddID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOyAgICAgICAgICAgCiAJICB9CiAKIApAQCAtMTQ3LDEwICsxNDcsMTAgQEAKIAkgIENhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCB0aW1lU2lnbmFsLCBjaEluY3JlbWVudCwgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4pOwogCiAJICAvKiByZXNldCBhdHRhY2sgKi8KLQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7CisJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLQkgIGVuTWF4ID0gMDsKLQkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bQkxPQ0tfU1dJVENIX1dJTkRPV1MtMV07CisJICBlbk1heCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW0JMT0NLX1NXSVRDSF9XSU5ET1dTLTFdOyAgICAgICAgICAgCiAKIAkgIGZvciAodz0wOyB3PEJMT0NLX1NXSVRDSF9XSU5ET1dTOyB3KyspIHsKIAkJICBXb3JkMzIgZW5NMV9UbXAsIGFjY1dpbmRvd05yZ19UbXAsIHdpbmRvd05yZ0ZfVG1wOwpAQCAtMTcyLDE1ICsxNzIsMTUgQEAKIAkJICAvKiBpZiB0aGUgZW5lcmd5IHdpdGggdGhlIHJhdGlvIGlzIGJpZ2dlciB0aGFuIHRoZSBhdmVyYWdlLCBhbmQgdGhlIGF0dGFjayBhbmQgc2hvcnQgYmxvY2sgICovCiAJCSAgaWYgKChmaXhtdWwod2luZG93TnJnRl9UbXAsIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8pID4+IHdpbmRvd05yZ0ZfU2hmKSA+CiAJCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnICkgewotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSB3OworCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleCA9IHc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJICB9Ci0JCSAgZW5NMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XTsKKwkJICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkgIGVuTWF4ID0gbWF4KGVuTWF4LCBlbk0xKTsKIAkgIH0KIAogCSAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKKwkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCSAgfQogICB9CiAgIGVsc2UKQEAgLTE4OCwyMiArMTg4LDIyIEBACiAJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7CiAgIH0KIAotICAvKiBDaGVjayBpZiBhdHRhY2sgc3ByZWFkcyBvdmVyIGZyYW1lIGJvcmRlciAqLworICAvKiBDaGVjayBpZiBhdHRhY2sgc3ByZWFkcyBvdmVyIGZyYW1lIGJvcmRlciAqLyAgICAgCiAgIGlmICgoIWJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrKSAmJiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrKSkgewotCisgICAgIAogICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID09IFRSQU5TX0ZBQy0xKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBGQUxTRTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAgIGVsc2UgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrOyAgICAgICAgICAgCiAgIH0KIAotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlOworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlOyAgICAKIAotCisgICAgIAogICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spIHsKICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKICAgfQpAQCAtMjExLDI3ICsyMTEsMjcgQEAKICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwogICB9CiAKLSAgLyogdXBkYXRlIHNob3J0IGJsb2NrIGdyb3VwICovCisgIC8qIHVwZGF0ZSBzaG9ydCBibG9jayBncm91cCAqLyAKICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewotCisgICAgIAogICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlPT0gTE9OR19XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTVEFSVF9XSU5ET1c7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gU1RBUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAKICAgICB9Ci0KKyAgICAgCiAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSAzOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSA9IDM7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzFdID0gMzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMl0gPSAyOworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMF0gPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblsxXSA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzJdID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KIAotICAvKiB1cGRhdGUgYmxvY2sgdHlwZSAqLworICAvKiB1cGRhdGUgYmxvY2sgdHlwZSAqLyAgCiAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9PSBMT05HX1dJTkRPVykgewotCisgICAgIAogICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgewotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPSBTVE9QX1dJTkRPVzsKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID0gU1RPUF9XSU5ET1c7ICAgICAgICAgICAgICAgICAgIAogICAgIH0KICAgfQogCkBAIC0yNTIsMTcgKzI1MiwxNyBAQAogICBXb3JkMzIgaSwgaWR4OwogCiAgIC8qIFNlYXJjaCBtYXhpbXVtIHZhbHVlIGluIGFycmF5IGFuZCByZXR1cm4gaW5kZXggYW5kIHZhbHVlICovCi0gIG1heCA9IDA7Ci0gIGlkeCA9IDA7CisgIG1heCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0KKyAgICAgCiAgICAgaWYgKGluW2krMV0gID4gbWF4KSB7Ci0gICAgICBtYXggPSBpbltpKzFdOwotICAgICAgaWR4ID0gaTsKKyAgICAgIG1heCA9IGluW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpZHggPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KICAgfQotICAqaW5kZXggPSBpZHg7CisgICppbmRleCA9IGlkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHJldHVybihtYXgpOwogfQpAQCAtMjkyLDExICsyOTIsMTEgQEAKICAgc3RhdGVzMSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdOwogICBDb2VmZjAgPSBoaVBhc3NDb2VmZlswXTsKICAgQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07Ci0gIHRpZHggPSAwOworICB0aWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yICh3PTA7IHcgPCBCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7CiAKLSAgICBhY2N1VUUgPSAwOwotICAgIGFjY3VGRSA9IDA7CisgICAgYWNjdVVFID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGFjY3VGRSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgIGZvcihpPTA7IGk8d2luZG93TGVuOyBpKyspIHsKIAkgIFdvcmQzMiBhY2N1MSwgYWNjdTIsIGFjY3UzOwpAQCAtMzA5LDE2ICszMDksMTYgQEAKIAkgIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXMwOwogCSAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKIAotCSAgc3RhdGVzMCA9IGFjY3UxOwotCSAgc3RhdGVzMSA9IG91dDsKKwkgIHN0YXRlczAgPSBhY2N1MTsgICAgICAgICAgICAgCisJICBzdGF0ZXMxID0gb3V0OyAgICAgICAgICAgICAgIAogCi0gICAgICB0ZW1wRmlsdGVyZWQgPSBleHRyYWN0X2gob3V0KTsKKyAgICAgIHRlbXBGaWx0ZXJlZCA9IGV4dHJhY3RfaChvdXQpOwkgIAogICAgICAgYWNjdVVFICs9ICh0ZW1wVW5maWx0ZXJlZCAqIHRlbXBVbmZpbHRlcmVkKSA+PiBFTkVSR1lfU0hJRlQ7CiAgICAgICBhY2N1RkUgKz0gKHRlbXBGaWx0ZXJlZCAqIHRlbXBGaWx0ZXJlZCkgPj4gRU5FUkdZX1NISUZUOwogICAgIH0KIAotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzFdW3ddID0gYWNjdVVFOwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSA9IGFjY3VGRTsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XSA9IGFjY3VVRTsgICAgICAgICAgICAgCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gYWNjdUZFOyAgICAgICAgICAgIAogCiAgIH0KIApAQCAtMzQ2LDggKzM0Niw4IEBACiAgIGFjY3UyID0gZml4bXVsKCBjb2VmZlswXSwgc3RhdGVzWzFdICk7CiAgIG91dCA9IGFjY3UzIC0gYWNjdTI7CiAKLSAgc3RhdGVzWzBdID0gYWNjdTE7Ci0gIHN0YXRlc1sxXSA9IG91dDsKKyAgc3RhdGVzWzBdID0gYWNjdTE7ICAgICAgICAgICAgIAorICBzdGF0ZXNbMV0gPSBvdXQ7ICAgICAgICAgICAgICAgCiAKICAgcmV0dXJuIHJvdW5kMTYob3V0KTsKIH0KQEAgLTM3NCw1NCArMzc0LDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCiB7CiAgIFdvcmQxNiBpOwotICBXb3JkMTYgcGF0Y2hUeXBlID0gTE9OR19XSU5ET1c7CisgIFdvcmQxNiBwYXRjaFR5cGUgPSBMT05HX1dJTkRPVzsgICAgICAgICAgICAgICAgCiAKLQorICAgCiAgIGlmIChuQ2hhbm5lbHMgPT0gMSkgeyAvKiBNb25vICovCiAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgewotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgIGZvciAoaT0xOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICAgICB9CiAgIH0KICAgZWxzZSB7IC8qIFN0ZXJlbyBjb21tb24gV2luZG93ICovCi0gICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT53aW5kb3dTZXF1ZW5jZV07Ci0gICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2VxdWVuY2VdOworICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2VdOyAgICAgICAgCisgICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2VxdWVuY2VdOyAgICAgICAKIAogICAgIC8qIFNldCBzeW5jaHJvbml6ZWQgQmxvY2t0eXBlICovCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOyAgICAgICAgICAgICAgIAorICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsgICAgICAgICAgICAgIAogCi0gICAgLyogU3luY2hyb25pemUgZ3JvdXBpbmcgaW5mbyAqLworICAgIC8qIFN5bmNocm9uaXplIGdyb3VwaW5nIGluZm8gKi8gICAgIAogICAgIGlmKHBhdGNoVHlwZSAhPSBTSE9SVF9XSU5ET1cpIHsgLyogTG9uZyBCbG9ja3MgKi8KICAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCi0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlblswXSA9IDE7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgIGZvciAoaT0xOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0KKyAgICAgICAKICAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bWF4V2luZG93TnJnKSB7CiAgICAgICAgIC8qIExlZnQgQ2hhbm5lbCB3aW5zICovCi0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzOyAgICAgICAgICAKICAgICAgICAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsgICAgICAKICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwczsgICAgICAgICAgCiAgICAgICAgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV07CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV07ICAgICAgCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYwppbmRleCBmNjU1MmVkLi4yZDQxZjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2NoYW5uZWxfbWFwLmMKQEAgLTI5LDMyICsyOSwzMiBAQAogCiBzdGF0aWMgV29yZDE2IGluaXRFbGVtZW50KEVMRU1FTlRfSU5GTyogZWxJbmZvLCBFTEVNRU5UX1RZUEUgZWxUeXBlKQogewotICBXb3JkMTYgZXJyb3I9MDsKKyAgV29yZDE2IGVycm9yPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLSAgZWxJbmZvLT5lbFR5cGU9ZWxUeXBlOworICBlbEluZm8tPmVsVHlwZT1lbFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBzd2l0Y2goZWxJbmZvLT5lbFR5cGUpIHsKIAogICAgIGNhc2UgSURfU0NFOgotICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTE7CisgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MTsgICAgICAgICAgICAgICAgICAgICAgIAogCi0gICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT0wOworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsgICAgICAgICAgICAgICAgICAgICAKIAotICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBJRF9DUEU6CiAKLSAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0yOworICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTI7ICAgICAgICAgICAgICAgICAgICAgICAgCiAKLSAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7Ci0gICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0xOworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0xOyAgICAgICAgICAgICAgICAgICAgICAKIAotICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcj0xOworICAgICAgZXJyb3I9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICByZXR1cm4gZXJyb3I7CkBAIC02NCwxMSArNjQsMTEgQEAKIFdvcmQxNiBJbml0RWxlbWVudEluZm8gKFdvcmQxNiBuQ2hhbm5lbHMsIEVMRU1FTlRfSU5GTyogZWxJbmZvKQogewogICBXb3JkMTYgZXJyb3I7Ci0gIGVycm9yID0gMDsKKyAgZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBzd2l0Y2gobkNoYW5uZWxzKSB7CiAKLSAgICBjYXNlIDE6CisgICAgY2FzZSAxOiAKICAgICAgIGluaXRFbGVtZW50KGVsSW5mbywgSURfU0NFKTsKICAgICAgIGJyZWFrOwogCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcj00OworICAgICAgZXJyb3I9NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAKICAgcmV0dXJuIGVycm9yOwpAQCAtOTEsMTggKzkxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGF0aWNCaXRzVG90KQogewogICBXb3JkMTYgZXJyb3I7Ci0gIGVycm9yID0gMDsKKyAgZXJyb3IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICBzd2l0Y2goZWxJbmZvLm5DaGFubmVsc0luRWwpIHsKICAgICBjYXNlIDE6Ci0gICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlID0gYml0cmF0ZVRvdDsKKyAgICAgIGVsZW1lbnRCaXRzLT5jaEJpdHJhdGUgPSBiaXRyYXRlVG90OyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgZWxlbWVudEJpdHMtPmF2ZXJhZ2VCaXRzID0gYXZlcmFnZUJpdHNUb3QgLSBzdGF0aWNCaXRzVG90OwotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdHMgPSBtYXhDaGFubmVsQml0czsKKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzID0gbWF4Q2hhbm5lbEJpdHM7ICAgICAgICAgICAgICAgICAgIAogCiAgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IG1heENoYW5uZWxCaXRzIC0gYXZlcmFnZUJpdHNUb3Q7Ci0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzIC0gKGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzICYgNyk7Ci0gICAgICBlbGVtZW50Qml0cy0+Yml0UmVzTGV2ZWwgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0czsKLSAgICAgIGVsZW1lbnRCaXRzLT5yZWxhdGl2ZUJpdHMgID0gMHg0MDAwOyAvKiAxLjBmLzIgKi8KKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgLSAoZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgJiA3KTsgCisgICAgICBlbGVtZW50Qml0cy0+Yml0UmVzTGV2ZWwgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0czsgICAKKyAgICAgIGVsZW1lbnRCaXRzLT5yZWxhdGl2ZUJpdHMgID0gMHg0MDAwOyAvKiAxLjBmLzIgKi8gICAgICAgIAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDI6CkBAIC0xMTEsMTMgKzExMSwxMyBAQAogICAgICAgZWxlbWVudEJpdHMtPm1heEJpdHMgICAgID0gbWF4Q2hhbm5lbEJpdHMgPDwgMTsKIAogICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSAobWF4Q2hhbm5lbEJpdHMgPDwgMSkgLSBhdmVyYWdlQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgLSAoZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgJiA3KTsKLSAgICAgIGVsZW1lbnRCaXRzLT5iaXRSZXNMZXZlbCA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzOwotICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyA9IDB4NDAwMDsgLyogMS4wZi8yICovCisgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzIC0gKGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzICYgNyk7ICAgCisgICAgICBlbGVtZW50Qml0cy0+Yml0UmVzTGV2ZWwgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0czsgICAgIAorICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyA9IDB4NDAwMDsgLyogMS4wZi8yICovICAgICAgICAgICAKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gMTsKKyAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KICAgcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKaW5kZXggM2QyZWZkYy4uZjNiM2UwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCkBAIC00NSwxMiArNDUsMTIgQEAKICAgZm9yIChpPTA7IGk8bWF4U2ZiOyBpKyspIHsKICAgICBXb3JkMTYgc2ZiV2lkdGgsIG1heFZhbDsKIAotICAgIHNlY3Rpb25JbmZvW2ldLnNmYkNudCA9IDE7Ci0gICAgc2VjdGlvbkluZm9baV0uc2ZiU3RhcnQgPSBpOwotICAgIHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKLSAgICBzZWN0aW9uSW5mb1tpXS5jb2RlQm9vayA9IC0xOwotICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2kgKyAxXSAtIHNmYk9mZnNldFtpXTsKLSAgICBtYXhWYWwgPSBzZmJNYXhbaV07CisgICAgc2VjdGlvbkluZm9baV0uc2ZiQ250ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHNlY3Rpb25JbmZvW2ldLnNmYlN0YXJ0ID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IElOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgCisgICAgc2VjdGlvbkluZm9baV0uY29kZUJvb2sgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHNmYldpZHRoID0gc2ZiT2Zmc2V0W2kgKyAxXSAtIHNmYk9mZnNldFtpXTsgICAgICAgICAgICAgIAorICAgIG1heFZhbCA9IHNmYk1heFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBiaXRDb3VudChxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W2ldLCBzZmJXaWR0aCwgbWF4VmFsLCBiaXRMb29rVXBbaV0pOwogICB9CiB9CkBAIC02NiwxMyArNjYsMTMgQEAKIGZpbmRCZXN0Qm9vayhjb25zdCBXb3JkMTYgKmJjLCBXb3JkMTYgKmJvb2spCiB7CiAgIFdvcmQzMiBtaW5CaXRzLCBqOwotICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKKyAgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKLQorICAgICAKICAgICBpZiAoYmNbal0gPCBtaW5CaXRzKSB7Ci0gICAgICBtaW5CaXRzID0gYmNbal07Ci0gICAgICAqYm9vayA9IGo7CisgICAgICBtaW5CaXRzID0gYmNbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgKmJvb2sgPSBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KICAgcmV0dXJuIGV4dHJhY3RfbChtaW5CaXRzKTsKQEAgLTgyLDEyICs4MiwxMiBAQAogZmluZE1pbk1lcmdlQml0cyhjb25zdCBXb3JkMTYgKmJjMSwgY29uc3QgV29yZDE2ICpiYzIpCiB7CiAgIFdvcmQzMiBtaW5CaXRzLCBqLCBzdW07Ci0gIG1pbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOworICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgewogICAgIHN1bSA9IGJjMVtqXSArIGJjMltqXTsKICAgICBpZiAoc3VtIDwgbWluQml0cykgewotICAgICAgbWluQml0cyA9IHN1bTsKKyAgICAgIG1pbkJpdHMgPSBzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICB9CiAgIHJldHVybiBleHRyYWN0X2wobWluQml0cyk7CkBAIC0xMDksMTMgKzEwOSwxMyBAQAogICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsIFdvcmQxNiAqbWF4TmR4KQogewogICBXb3JkMzIgaSwgbWF4TWVyZ2VHYWluOwotICBtYXhNZXJnZUdhaW4gPSAwOworICBtYXhNZXJnZUdhaW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IgKGk9MDsgaStzZWN0aW9uSW5mb1tpXS5zZmJDbnQgPCBtYXhTZmI7IGkgKz0gc2VjdGlvbkluZm9baV0uc2ZiQ250KSB7Ci0KKyAgICAgCiAgICAgaWYgKG1lcmdlR2Fpbkxvb2tVcFtpXSA+IG1heE1lcmdlR2FpbikgewotICAgICAgbWF4TWVyZ2VHYWluID0gbWVyZ2VHYWluTG9va1VwW2ldOwotICAgICAgKm1heE5keCA9IGk7CisgICAgICBtYXhNZXJnZUdhaW4gPSBtZXJnZUdhaW5Mb29rVXBbaV07ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgKm1heE5keCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KICAgcmV0dXJuIGV4dHJhY3RfbChtYXhNZXJnZUdhaW4pOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKICAgZm9yIChpPTA7IGk8bWF4U2ZiOyBpKyspIHsKICAgICAvKiBTaWRlLUluZm8gYml0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgaW4gU3RhZ2UgMSEgICovCi0KKyAgICAgCiAgICAgaWYgKHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzID09IElOVkFMSURfQklUQ09VTlQpIHsKICAgICAgIHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzID0gZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihzZWN0aW9uSW5mb1tpXS5jb2RlQm9vaykpOwogICAgIH0KQEAgLTE4MCwxMyArMTgwLDEzIEBACiAgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvX3M7CiAgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvX2U7CiAgIFdvcmQzMiBtZXJnZVN0YXJ0LCBtZXJnZUVuZDsKLSAgbWVyZ2VTdGFydCA9IDA7CisgIG1lcmdlU3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgZG8gewogCiAgICAgc2VjdGlvbkluZm9fcyA9IHNlY3Rpb25JbmZvICsgbWVyZ2VTdGFydDsKIAlmb3IgKG1lcmdlRW5kPW1lcmdlU3RhcnQrMTsgbWVyZ2VFbmQ8bWF4U2ZiOyBtZXJnZUVuZCsrKSB7Ci0gICAgICBzZWN0aW9uSW5mb19lID0gc2VjdGlvbkluZm8gKyBtZXJnZUVuZDsKKyAgICAgIHNlY3Rpb25JbmZvX2UgPSBzZWN0aW9uSW5mbyArIG1lcmdlRW5kOyAKICAgICAgIGlmIChzZWN0aW9uSW5mb19zLT5jb2RlQm9vayAhPSBzZWN0aW9uSW5mb19lLT5jb2RlQm9vaykKICAgICAgICAgYnJlYWs7CiAgICAgICBzZWN0aW9uSW5mb19zLT5zZmJDbnQgKz0gMTsKQEAgLTE5NiwxMSArMTk2LDExIEBACiAgICAgfQogCiAgICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9fcy0+c2ZiQ250XTsKLSAgICBzZWN0aW9uSW5mb1ttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9fcy0+c2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8KKyAgICBzZWN0aW9uSW5mb1ttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9fcy0+c2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8gIAogCi0gICAgbWVyZ2VTdGFydCA9IG1lcmdlRW5kOworICAgIG1lcmdlU3RhcnQgPSBtZXJnZUVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0KKyAgICAgCiAgIH0gd2hpbGUgKG1lcmdlU3RhcnQgLSBtYXhTZmIgPCAwKTsKIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAKICAgICBtYXhNZXJnZUdhaW4gPSBmaW5kTWF4TWVyZ2UobWVyZ2VHYWluTG9va1VwLCBzZWN0aW9uSW5mbywgbWF4U2ZiLCAmbWF4TmR4KTsKIAotCisgICAgIAogICAgIGlmIChtYXhNZXJnZUdhaW4gPD0gMCkKICAgICAgIGJyZWFrOwogCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAogICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttYXhOZHhdLCBiaXRMb29rVXBbbWF4TmR4TmV4dF0pOwogCi0KKyAgICAgCiAgICAgaWYgKG1heE5keCAhPSAwKSB7CiAgICAgICBtYXhOZHhMYXN0ID0gc2VjdGlvbkluZm9bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7CiAgICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLApAQCAtMjU1LDkgKzI1NSw5IEBACiAgICAgfQogICAgIG1heE5keE5leHQgPSBtYXhOZHggKyBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudDsKIAotICAgIHNlY3Rpb25JbmZvW21heE5keE5leHQgLSAxXS5zZmJTdGFydCA9IHNlY3Rpb25JbmZvW21heE5keF0uc2ZiU3RhcnQ7CisgICAgc2VjdGlvbkluZm9bbWF4TmR4TmV4dCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJTdGFydDsgICAgICAgICAgICAgCiAKLQorICAgICAKICAgICBpZiAobWF4TmR4TmV4dCAtIG1heFNmYiA8IDApIHsKICAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhdID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCkBAIC0yODYsNyArMjg2LDcgQEAKIAogICAvKgogICAgIHVzZSBhcHByb3ByaWF0ZSBzaWRlIGluZm8gdGFibGUKLSAgKi8KKyAgKi8gICAKICAgc3dpdGNoIChibG9ja1R5cGUpCiAgIHsKICAgICBjYXNlIExPTkdfV0lORE9XOgpAQCAtMzAwLDExICszMDAsMTEgQEAKICAgfQogCiAKLSAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAwOworICBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0KKyAgIAogICBpZiAoc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID09IDApCiAgICAgcmV0dXJuOwogCkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICAgIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyAtIHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW2ldLnNmYkNudF0pKTsKICAgICAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAoc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArIHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW2ldLnNmYkNudF0pOwotICAgICAgc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW3NlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnNdID0gc2VjdGlvbkluZm9baV07CisgICAgICBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uc10gPSBzZWN0aW9uSW5mb1tpXTsgICAgICAgICAgICAgCiAgICAgICBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zID0gc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyArIDE7CiAgICAgfQogICB9CkBAIC0zODYsMjUgKzM4NiwyNSBAQAogICBXb3JkMzIgbGFzdFZhbFNjZiAgICAgPSAwOwogICBXb3JkMzIgZGVsdGFTY2YgICAgICAgPSAwOwogICBGbGFnIGZvdW5kICAgICAgICAgICAgPSAwOwotICBXb3JkMzIgc2NmU2tpcENvdW50ZXIgPSAwOworICBXb3JkMzIgc2NmU2tpcENvdW50ZXIgPSAwOyAgICAgICAgICAgCisgICAgICAgICAKIAorICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzID0gMDsKLQotCisgICAKICAgaWYgKHNjYWxlZmFjR2FpbiA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgbGFzdFZhbFNjZiA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7Ci0KKyAgbGFzdFZhbFNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7ICAgICAgICAKKyAgCiAgIHBzZWN0aW9uSW5mbyA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mbzsKICAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrKSB7Ci0KKyAgICAgCiAgICAgaWYgKHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pIHsKLSAgICAgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQ7Ci0gICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07CisgICAgICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0OyAgICAgIAorICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOyAgICAgICAgICAgICAgICAgIAogICAgICAgYnJlYWs7CiAgICAgfQogCXBzZWN0aW9uSW5mbyArPSAxOwpAQCAtNDEyLDM4ICs0MTIsMzggQEAKIAogICBwc2VjdGlvbkluZm8gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm87CiAgIGZvciAoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKywgcHNlY3Rpb25JbmZvICs9IDEpIHsKLQorICAgICAgIAogICAgIGlmIChwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PCiAgICAgICAgICYmIHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgewogICAgICAgZm9yIChqID0gcHNlY3Rpb25JbmZvLT5zZmJTdGFydDsKICAgICAgICAgICAgaiA8IChwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQpOyBqKyspIHsKICAgICAgICAgLyogY2hlY2sgaWYgd2UgY2FuIHJlcGVhdCB0aGUgbGFzdCB2YWx1ZSB0byBzYXZlIGJpdHMgKi8KLQorICAgICAgICAgCiAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2pdID09IDApIHsKLSAgICAgICAgICBmb3VuZCA9IDA7Ci0KKyAgICAgICAgICBmb3VuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgCiAgICAgICAgICAgaWYgKHNjZlNraXBDb3VudGVyID09IDApIHsKICAgICAgICAgICAgIC8qIGVuZCBvZiBzZWN0aW9uICovCi0KKyAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChqIC0gKChwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICBmb3VuZCA9IDA7CisgICAgICAgICAgICAgIGZvdW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgZm9yIChrID0gaiArIDE7IGsgPCBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQ7IGsrKykgewotCisgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2tdICE9IDApIHsKICAgICAgICAgICAgICAgICAgIGludCB0bXAgPSBMX2FicyhzY2FsZWZhY0dhaW5ba10gLSBsYXN0VmFsU2NmKTsKLQkJCQkgIGZvdW5kID0gMTsKLQorCQkJCSAgZm91bmQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgPCBDT0RFX0JPT0tfU0NGX0xBVikgewogICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOworICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NTEsMjYgKzQ1MSwyNiBAQAogICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KKwkJCQogCQkJcHNlY3Rpb25JbmZvbSA9IHBzZWN0aW9uSW5mbyArIDE7CiAgICAgICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBuZXh0IG1heFZhbHVlSW5TZmJbXSAhPSAwIGluIGFsbCBvdGhlciBzZWN0aW9ucyAqLwogICAgICAgICAgICAgZm9yIChtID0gaSArIDE7IChtIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucykgJiYgKGZvdW5kID09IDApOyBtKyspIHsKLQorICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgaWYgKChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKICAgICAgICAgICAgICAgICAgIChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkgewogICAgICAgICAgICAgICAgIGZvciAobiA9IHBzZWN0aW9uSW5mb20tPnNmYlN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgbiA8IChwc2VjdGlvbkluZm9tLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mb20tPnNmYkNudCk7IG4rKykgewotCisgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltuXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLQorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGlmICggKGFic19zKHNjYWxlZmFjR2FpbltuXSAtIGxhc3RWYWxTY2YpIDwgQ09ERV9CT09LX1NDRl9MQVYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOworICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gKGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal0pOwotICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgfQpAQCAtNDgxLDIwICs0ODEsMjAgQEAKIAogCQkJICBwc2VjdGlvbkluZm9tICs9IDE7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChmb3VuZCA9PSAwKSB7Ci0gICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSAwOworICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKKyAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgLSAxOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal07Ci0gICAgICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltqXTsKKyAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgfQogICAgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzICs9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZik7CiAgICAgICB9CkBAIC01MTcsMTQgKzUxNywxNCBAQAogICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiT2Zmc2V0LAogICAgICAgICAgICAgU0VDVElPTl9EQVRBICAqc2VjdGlvbkRhdGEpCiB7Ci0gIHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUgICAgICA9IGJsb2NrVHlwZTsKLSAgc2VjdGlvbkRhdGEtPnNmYkNudCAgICAgICAgID0gc2ZiQ250OwotICBzZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXAgICAgPSBzZmJQZXJHcm91cDsKKyAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5zZmJDbnQgICAgICAgICA9IHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXAgICAgPSBzZmJQZXJHcm91cDsgICAgICAgICAgIAogICBpZihzZmJQZXJHcm91cCkKLQlzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgID0gc2ZiQ250L3NmYlBlckdyb3VwOworCXNlY3Rpb25EYXRhLT5ub09mR3JvdXBzICAgPSBzZmJDbnQvc2ZiUGVyR3JvdXA7IAogICBlbHNlCiAJc2VjdGlvbkRhdGEtPm5vT2ZHcm91cHMgICA9IDB4N2ZmZjsKLSAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXA7CisgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9IG1heFNmYlBlckdyb3VwOyAgICAgICAgICAgICAgICAgIAogCiAgIG5vaXNlbGVzc0NvdW50ZXIoc2VjdGlvbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPm1lcmdlR2Fpbkxvb2tVcCwKQEAgLTUzOSw3ICs1MzksNyBAQAogICAgICAgICAgICBzZWN0aW9uRGF0YSk7CiAKIAotICByZXR1cm4gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKworICByZXR1cm4gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgKyAKIAkgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2dycF9kYXRhLmMKaW5kZXggNzg2MWUxYy4uZmI4ODY1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9ncnBfZGF0YS5jCkBAIC01NywyOSArNTcsMjkgQEAKIAogICAvKiBmb3Igc2hvcnQ6IHJlZ3JvdXAgYW5kICAqLwogICAvKiBjdW11bGF0ZSBlbmVyZ2llcyB1bmQgdGhyZXNob2xkcyBncm91cC13aXNlIC4gKi8KLQorICAKICAgLyogY2FsY3VsYXRlIHNmYkNudCAqLwotICBoaWdoZXN0U2ZiID0gMDsKKyAgaGlnaGVzdFNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IgKHduZD0wOyB3bmQ8VFJBTlNfRkFDOyB3bmQrKykgewogICAgIGZvciAoc2ZiPXNmYkNudCAtIDE7IHNmYj49aGlnaGVzdFNmYjsgc2ZiLS0pIHsKICAgICAgIGZvciAobGluZT0oc2ZiT2Zmc2V0W3NmYiArIDFdIC0gMSk7IGxpbmU+PXNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKLQotICAgICAgICBpZiAobWRjdFNwZWN0cnVtW3duZCpGUkFNRV9MRU5fU0hPUlQrbGluZV0gIT0gMCkgYnJlYWs7CisgICAgICAgIAorICAgICAgICBpZiAobWRjdFNwZWN0cnVtW3duZCpGUkFNRV9MRU5fU0hPUlQrbGluZV0gIT0gMCkgYnJlYWs7IAogICAgICAgfQotCisgICAgICAKICAgICAgIGlmIChsaW5lID49IHNmYk9mZnNldFtzZmJdKSBicmVhazsKICAgICB9CiAgICAgaGlnaGVzdFNmYiA9IG1heChoaWdoZXN0U2ZiLCBzZmIpOwogICB9Ci0KKyAgCiAgIGlmIChoaWdoZXN0U2ZiIDwgMCkgewotICAgIGhpZ2hlc3RTZmIgPSAwOworICAgIGhpZ2hlc3RTZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KICAgKm1heFNmYlBlckdyb3VwID0gaGlnaGVzdFNmYiArIDE7CiAKICAgLyogY2FsY3VsYXRlIHNmYk9mZnNldCAqLwotICBpID0gMDsKLSAgb2Zmc2V0ID0gMDsKKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBvZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKICAgICAgIGdyb3VwZWRTZmJPZmZzZXRbaV0gPSBvZmZzZXQgKyBzZmJPZmZzZXRbc2ZiXSAqIGdyb3VwTGVuW2dycF07CkBAIC04NywxNSArODcsMTUgQEAKICAgICB9CiAgICAgb2Zmc2V0ICs9IGdyb3VwTGVuW2dycF0gKiBGUkFNRV9MRU5fU0hPUlQ7CiAgIH0KLSAgZ3JvdXBlZFNmYk9mZnNldFtpXSA9IEZSQU1FX0xFTl9MT05HOworICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gRlJBTUVfTEVOX0xPTkc7ICAgICAgICAgICAgICAgICAgCiAgIGkgKz0gMTsKIAogICAvKiBjYWxjdWxhdGUgbWluU25yICovCi0gIGkgPSAwOwotICBvZmZzZXQgPSAwOworICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIG9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewogICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgZ3JvdXBlZFNmYk1pblNucltpXSA9IHNmYk1pblNucltzZmJdOworICAgICAgZ3JvdXBlZFNmYk1pblNucltpXSA9IHNmYk1pblNucltzZmJdOyAgICAgICAgICAgICAgCiAgICAgICBpICs9IDE7CiAgICAgfQogICAgIG9mZnNldCArPSBncm91cExlbltncnBdICogRlJBTUVfTEVOX1NIT1JUOwpAQCAtMTAzLDc0ICsxMDMsNzQgQEAKIAogCiAgIC8qIHN1bSB1cCBzZmJUaHJlc2hvbGRzICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOworICB3bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiB0aHJlc2ggPSBzZmJUaHJlc2hvbGQtPnNmYlNob3J0W3duZF1bc2ZiXTsKKyAgICAgIFdvcmQzMiB0aHJlc2ggPSBzZmJUaHJlc2hvbGQtPnNmYlNob3J0W3duZF1bc2ZiXTsgICAgICAgICAgCiAgICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKICAgICAgICAgdGhyZXNoID0gTF9hZGQodGhyZXNoLCBzZmJUaHJlc2hvbGQtPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKICAgICAgIH0KLSAgICAgIHNmYlRocmVzaG9sZC0+c2ZiTG9uZ1tpXSA9IHRocmVzaDsKKyAgICAgIHNmYlRocmVzaG9sZC0+c2ZiTG9uZ1tpXSA9IHRocmVzaDsgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICBpICs9IDE7CiAgICAgfQogICAgIHduZCArPSBncm91cExlbltncnBdOwogICB9CiAKICAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIGxlZnQvcmlnaHQgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7CisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewogICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kXVtzZmJdOworICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kXVtzZmJdOyAgICAgICAgICAgICAKICAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewogICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYkVuZXJneS0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwogICAgICAgfQotICAgICAgc2ZiRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OworICAgICAgc2ZiRW5lcmd5LT5zZmJMb25nW2ldID0gZW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIGkgKz0gMTsKICAgICB9CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAogICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbWlkL3NpZGUgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7CisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewogICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneU1TLT5zZmJTaG9ydFt3bmRdW3NmYl07CisgICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZF1bc2ZiXTsgICAgICAgICAgIAogICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CiAgICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKICAgICAgIH0KLSAgICAgIHNmYkVuZXJneU1TLT5zZmJMb25nW2ldID0gZW5lcmd5OworICAgICAgc2ZiRW5lcmd5TVMtPnNmYkxvbmdbaV0gPSBlbmVyZ3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIGkgKz0gMTsKICAgICB9CiAgICAgd25kICs9IGdyb3VwTGVuW2dycF07CiAgIH0KIAogICAvKiBzdW0gdXAgc2ZiU3ByZWFkZWRFbmVyZ2llcyAqLwotICB3bmQgPSAwOwotICBpID0gMDsKKyAgd25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsKKyAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiU2hvcnRbd25kXVtzZmJdOyAgICAgCiAgICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKICAgICAgICAgZW5lcmd5ID0gTF9hZGQoZW5lcmd5LCBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwogICAgICAgfQotICAgICAgc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYkxvbmdbaV0gPSBlbmVyZ3k7CisgICAgICBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgaSArPSAxOwogICAgIH0KICAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKICAgfQogCiAgIC8qIHJlLWdyb3VwIHNwZWN0cnVtICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOworICB3bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKICAgICAgIGZvciAoaiA9IDA7IGogPCBncm91cExlbltncnBdOyBqKyspIHsKICAgICAgICAgV29yZDE2IGxpbmVPZmZzZXQgPSBGUkFNRV9MRU5fU0hPUlQgKiAod25kICsgaik7CiAgICAgICAgIGZvciAobGluZSA9IGxpbmVPZmZzZXQgKyBzZmJPZmZzZXRbc2ZiXTsgbGluZSA8IGxpbmVPZmZzZXQgKyBzZmJPZmZzZXRbc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgICB0bXBTcGVjdHJ1bVtpXSA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKKyAgICAgICAgICB0bXBTcGVjdHJ1bVtpXSA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgaSA9IGkgKyAxOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNzksMTAgKzE3OSwxMCBAQAogICB9CiAKICAgZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HO2krPTQpIHsKLSAgICBtZGN0U3BlY3RydW1baV0gPSB0bXBTcGVjdHJ1bVtpXTsKLQltZGN0U3BlY3RydW1baSsxXSA9IHRtcFNwZWN0cnVtW2krMV07Ci0JbWRjdFNwZWN0cnVtW2krMl0gPSB0bXBTcGVjdHJ1bVtpKzJdOwotCW1kY3RTcGVjdHJ1bVtpKzNdID0gdG1wU3BlY3RydW1baSszXTsKKyAgICBtZGN0U3BlY3RydW1baV0gPSB0bXBTcGVjdHJ1bVtpXTsgIAorCW1kY3RTcGVjdHJ1bVtpKzFdID0gdG1wU3BlY3RydW1baSsxXTsgIAorCW1kY3RTcGVjdHJ1bVtpKzJdID0gdG1wU3BlY3RydW1baSsyXTsgIAorCW1kY3RTcGVjdHJ1bVtpKzNdID0gdG1wU3BlY3RydW1baSszXTsgIAkKICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCmluZGV4IGYyNDcyZDguLjM0ZmVlMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCkBAIC00OSw1NiArNDksNTYgQEAKICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAgICAgKnBzeU91dENoKQogewogICBXb3JkMzIgajsKLSAgV29yZDMyIGdycDsKKyAgV29yZDMyIGdycDsgCiAgIFdvcmQzMiBtYXNrOwogICBXb3JkMTYgKnRtcFY7CiAKICAgLyoKICAgY29weSB2YWx1ZXMgdG8gcHN5T3V0CiAgICovCi0gIHBzeU91dENoLT5tYXhTZmJQZXJHcm91cCAgICA9IG1heFNmYlBlckdyb3VwOwotICBwc3lPdXRDaC0+c2ZiQ250ICAgICAgICAgICAgPSBncm91cGVkU2ZiQ250OworICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lPdXRDaC0+c2ZiQ250ICAgICAgICAgICAgPSBncm91cGVkU2ZiQ250OyAgIAogICBpZihub09mR3JvdXBzKQogCXBzeU91dENoLT5zZmJQZXJHcm91cCAgICAgPSBncm91cGVkU2ZiQ250LyBub09mR3JvdXBzOwogICBlbHNlCiAJcHN5T3V0Q2gtPnNmYlBlckdyb3VwICAgICA9IDB4N2ZmZjsKLSAgcHN5T3V0Q2gtPndpbmRvd1NlcXVlbmNlICAgID0gd2luZG93U2VxdWVuY2U7Ci0gIHBzeU91dENoLT53aW5kb3dTaGFwZSAgICAgICA9IHdpbmRvd1NoYXBlOwotICBwc3lPdXRDaC0+bWRjdFNjYWxlICAgICAgICAgPSBtZGN0U2NhbGU7CisgIHBzeU91dENoLT53aW5kb3dTZXF1ZW5jZSAgICA9IHdpbmRvd1NlcXVlbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHBzeU91dENoLT53aW5kb3dTaGFwZSAgICAgICA9IHdpbmRvd1NoYXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHBzeU91dENoLT5tZGN0U2NhbGUgICAgICAgICA9IG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIHBzeU91dENoLT5tZGN0U3BlY3RydW0gICAgICA9IGdyb3VwZWRNZGN0U3BlY3RydW07CiAgIHBzeU91dENoLT5zZmJFbmVyZ3kgICAgICAgICA9IGdyb3VwZWRTZmJFbmVyZ3ktPnNmYkxvbmc7CiAgIHBzeU91dENoLT5zZmJUaHJlc2hvbGQgICAgICA9IGdyb3VwZWRTZmJUaHJlc2hvbGQtPnNmYkxvbmc7CiAgIHBzeU91dENoLT5zZmJTcHJlYWRlZEVuZXJneSA9IGdyb3VwZWRTZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZzsKLQorICAKICAgdG1wViA9IHBzeU91dENoLT5zZmJPZmZzZXRzOwogICBmb3Ioaj0wOyBqPGdyb3VwZWRTZmJDbnQgKyAxOyBqKyspIHsKICAgICAgICp0bXBWKysgPSBncm91cGVkU2ZiT2Zmc2V0W2pdOwogICB9Ci0KKyAgCiAgIHRtcFYgPSBwc3lPdXRDaC0+c2ZiTWluU25yOwogICBmb3Ioaj0wO2o8Z3JvdXBlZFNmYkNudDsgaisrKSB7CiAJICAqdG1wVisrID0gICBncm91cGVkU2ZiTWluU25yW2pdOwogICB9Ci0KKyAgCiAgIC8qIGdlbmVyYXRlIGdyb3VwaW5nIG1hc2sgKi8KLSAgbWFzayA9IDA7CisgIG1hc2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewogICAgIG1hc2sgPSBtYXNrIDw8IDE7CiAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CiAgICAgICBtYXNrID0gbWFzayA8PCAxOwotICAgICAgbWFzayB8PSAxOworICAgICAgbWFzayB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICB9Ci0gIHBzeU91dENoLT5ncm91cGluZ01hc2sgPSBtYXNrOwotCisgIHBzeU91dENoLT5ncm91cGluZ01hc2sgPSBtYXNrOyAKKyAgCiAgIGlmICh3aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICBwc3lPdXRDaC0+c2ZiRW5TdW1MUiA9ICBzZmJFbmVyZ3lTdW1MUi5zZmJMb25nOwotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gIHNmYkVuZXJneVN1bU1TLnNmYkxvbmc7CisgICAgcHN5T3V0Q2gtPnNmYkVuU3VtTFIgPSAgc2ZiRW5lcmd5U3VtTFIuc2ZiTG9uZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwc3lPdXRDaC0+c2ZiRW5TdW1NUyA9ICBzZmJFbmVyZ3lTdW1NUy5zZmJMb25nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAgIGVsc2UgewogICAgIFdvcmQzMiBpOwogICAgIFdvcmQzMiBhY2N1U3VtTVM9MDsKLSAgICBXb3JkMzIgYWNjdVN1bUxSPTA7CisgICAgV29yZDMyIGFjY3VTdW1MUj0wOyAgICAgICAgCiAJV29yZDMyICpwU3VtTVMgPSBzZmJFbmVyZ3lTdW1NUy5zZmJTaG9ydDsKIAlXb3JkMzIgKnBTdW1MUiA9IHNmYkVuZXJneVN1bUxSLnNmYlNob3J0OwogCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgIGFjY3VTdW1MUiA9IExfYWRkKGFjY3VTdW1MUiwgKnBTdW1MUik7IHBTdW1MUisrOwogICAgICAgYWNjdVN1bU1TID0gTF9hZGQoYWNjdVN1bU1TLCAqcFN1bU1TKTsgcFN1bU1TKys7CiAgICAgfQotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gYWNjdVN1bU1TOwotICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gYWNjdVN1bUxSOworICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gYWNjdVN1bU1TOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcHN5T3V0Q2gtPnNmYkVuU3VtTFIgPSBhY2N1U3VtTFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jCmluZGV4IDQ4MGRjMjguLjVlOTNjZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2xpbmVfcGUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMKQEAgLTQ1LDIwICs0NSwyMCBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlT2Zmc2V0KQogewogICBXb3JkMzIgc2ZiR3JwLCBzZmI7Ci0gIFdvcmQzMiBjaDsKKyAgV29yZDMyIGNoOyAgICAgCiAKICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKICAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGE9JnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CiAgICAgZm9yKHNmYkdycD0wO3NmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewogICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCSAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXM0W3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdOwotICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl0gPSBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl0gPj4gMjsKLQkgICAgcGVDaGFuRGF0YS0+c2ZiTGRFbmVyZ3lbc2ZiR3JwK3NmYl0gPSBsb2dTZmJFbmVyZ3lbY2hdW3NmYkdycCtzZmJdOworCSAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXM0W3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdOyAgICAgICAgICAKKyAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID4+IDI7ICAgIAorCSAgICBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXSA9IGxvZ1NmYkVuZXJneVtjaF1bc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsKKyAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiB9CiAKIApAQCAtNzgsMjMgKzc4LDIzIEBACiAgIFdvcmQzMiBsZFRociwgbGRSYXRpbzsKICAgV29yZDMyIHBlLCBjb25zdFBhcnQsIG5BY3RpdmVMaW5lczsKIAotICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7Ci0gIHBlRGF0YS0+Y29uc3RQYXJ0ID0gMDsKLSAgcGVEYXRhLT5uQWN0aXZlTGluZXMgPSAwOworICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwZURhdGEtPmNvbnN0UGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CiAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwogICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwogICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5ID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5OwogICAgIGNvbnN0IFdvcmQzMiAqc2ZiVGhyZXNob2xkID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkOwogCi0gICAgcGUgPSAwOwotICAgIGNvbnN0UGFydCA9IDA7Ci0gICAgbkFjdGl2ZUxpbmVzID0gMDsKKyAgICBwZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBjb25zdFBhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBuQWN0aXZlTGluZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgIGZvcihzZmJHcnA9MDsgc2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgewogICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBXb3JkMzIgbnJnID0gc2ZiRW5lcmd5W3NmYkdycCtzZmJdOwotICAgICAgICBXb3JkMzIgdGhyZXMgPSBzZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl07CisgICAgICAgIFdvcmQzMiBucmcgPSBzZmJFbmVyZ3lbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgV29yZDMyIHRocmVzID0gc2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBXb3JkMzIgc2ZiTERFbiA9IHBlQ2hhbkRhdGEtPnNmYkxkRW5lcmd5W3NmYkdycCtzZmJdOwogCiAgICAgICAgIGlmIChucmcgPiB0aHJlcykgewpAQCAtMTAyLDggKzEwMiw4IEBACiAKICAgICAgICAgICBsZFJhdGlvID0gc2ZiTERFbiAtIGxkVGhyOwogCi0gICAgICAgICAgbkxpbmVzNCA9IHBlQ2hhbkRhdGEtPnNmYk5MaW5lczRbc2ZiR3JwK3NmYl07Ci0KKyAgICAgICAgICBuTGluZXM0ID0gcGVDaGFuRGF0YS0+c2ZiTkxpbmVzNFtzZmJHcnArc2ZiXTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKICAgICAgICAgICAvKiBzZmJQZSA9IG5sKmxvZzIoZW4vdGhyKSovCiAJCSAgaWYgKGxkUmF0aW8gPj0gQzFfSSkgewogICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSAobkxpbmVzNCpsZFJhdGlvICsgOCkgPj4gNDsKQEAgLTEyMCwyNiArMTIwLDI2IEBACiAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gbkxpbmVzNCA+PiAyOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gMDsKLSAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9IDA7CisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgcGUgPSBwZSArIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOwogICAgICAgICBjb25zdFBhcnQgPSBjb25zdFBhcnQgKyBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07CiAgICAgICAgIG5BY3RpdmVMaW5lcyA9IG5BY3RpdmVMaW5lcyArIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXTsKICAgICAgIH0KICAgICB9CisJCisJcGVDaGFuRGF0YS0+cGUgPSBzYXR1cmF0ZShwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwZUNoYW5EYXRhLT5jb25zdFBhcnQgPSBzYXR1cmF0ZShjb25zdFBhcnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwZUNoYW5EYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotCXBlQ2hhbkRhdGEtPnBlID0gc2F0dXJhdGUocGUpOwotICAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7Ci0gICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsKLQotCisgICAgCiAJcGUgKz0gcGVEYXRhLT5wZTsKLQlwZURhdGEtPnBlID0gc2F0dXJhdGUocGUpOworCXBlRGF0YS0+cGUgPSBzYXR1cmF0ZShwZSk7IAogICAgIGNvbnN0UGFydCArPSBwZURhdGEtPmNvbnN0UGFydDsKLQlwZURhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7CisJcGVEYXRhLT5jb25zdFBhcnQgPSBzYXR1cmF0ZShjb25zdFBhcnQpOyAKICAgICBuQWN0aXZlTGluZXMgKz0gcGVEYXRhLT5uQWN0aXZlTGluZXM7CiAJcGVEYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOwotICB9CisgIH0gCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tZW1hbGlnbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYwppbmRleCBiYjI2NmRjLi40NGRkNGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tZW1hbGlnbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21lbWFsaWduLmMKQEAgLTMyLDcgKzMyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBtZW1fbWFsbG9jCi0qIGRlc2NyaXB0aW9uOiAgbWFsbG9jIHRoZSBhbGlnbm1lbnRzIG1lbW9yeQorKiBkZXNjcmlwdGlvbjogIG1hbGxvYyB0aGUgYWxpZ25tZW50cyBtZW1vcnkgCiAqIHJldHVybnM6ICAgICAgdGhlIHBvaW50IG9mIHRoZSBtZW1vcnkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9tc19zdGVyZW8uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCmluZGV4IDJlMzRmMTQuLjQ0ZDQ1Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCkBAIC0zMCw3ICszMCw3IEBACiAqCiAqIGZ1bmN0aW9uIG5hbWU6IE1zU3RlcmVvUHJvY2Vzc2luZwogKiBkZXNjcmlwdGlvbjogIGRldGVjdCB1c2UgbXMgc3RlcmVvIG9yIG5vdAotKgkJCQlpZiAoKG1pbih0aHJMbiwgdGhyUm4pKm1pbih0aHJMbiwgdGhyUm4pKS8oZW5NbiplblNuKSkKKyoJCQkJaWYgKChtaW4odGhyTG4sIHRoclJuKSptaW4odGhyTG4sIHRoclJuKSkvKGVuTW4qZW5TbikpIAogKgkJCQk+PSAoKHRockxuICp0aHJSbikvKGVuTG4qZW5SbikpIHRoZW4gbXMgc3RlcmVvCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBtYXhTZmJQZXJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0KSB7CiAgIFdvcmQzMiB0ZW1wOwotICBXb3JkMzIgc2ZiLHNmYm9mZnMsIGo7CisgIFdvcmQzMiBzZmIsc2Zib2ZmcywgajsgCiAgIFdvcmQzMiBtc01hc2tUcnVlU29tZXdoZXJlID0gMDsKICAgV29yZDMyIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMDsKIApAQCAtNjQsMTIgKzY0LDEyIEBACiAgICAgICBXb3JkMzIgdGhyTCwgdGhyUiwgbnJnTCwgbnJnUjsKICAgICAgIFdvcmQzMiBpZHgsIHNoaWZ0OwogCi0gICAgICBpZHggPSBzZmIgKyBzZmJvZmZzOworICAgICAgaWR4ID0gc2ZiICsgc2Zib2ZmczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gICAgICB0aHJMID0gc2ZiVGhyZXNob2xkTGVmdFtpZHhdOwotICAgICAgdGhyUiA9IHNmYlRocmVzaG9sZFJpZ2h0W2lkeF07Ci0gICAgICBucmdMID0gc2ZiRW5lcmd5TGVmdFtpZHhdOwotICAgICAgbnJnUiA9IHNmYkVuZXJneVJpZ2h0W2lkeF07CisgICAgICB0aHJMID0gc2ZiVGhyZXNob2xkTGVmdFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB0aHJSID0gc2ZiVGhyZXNob2xkUmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBucmdMID0gc2ZiRW5lcmd5TGVmdFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBucmdSID0gc2ZiRW5lcmd5UmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgIG1pblRocmVzaG9sZCA9IG1pbih0aHJMLCB0aHJSKTsKIApAQCAtODIsOCArODIsOCBAQAogCiAJICBwbmxyID0gZml4bXVsKG5yZ0wsIG5yZ1IpOwogCi0gICAgICBucmdMID0gc2ZiRW5lcmd5TWlkW2lkeF07Ci0gICAgICBucmdSID0gc2ZiRW5lcmd5U2lkZVtpZHhdOworICAgICAgbnJnTCA9IHNmYkVuZXJneU1pZFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbnJnUiA9IHNmYkVuZXJneVNpZGVbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgICBucmdMID0gbWF4KG5yZ0wsbWluVGhyZXNob2xkKSArIDE7CiAgICAgICBzaGlmdCA9IG5vcm1fbChucmdMKTsKQEAgLTk3LDQyICs5Nyw0MiBAQAogCiAgICAgICB0ZW1wID0gKHBubHIgKyAxKSAvICgocG5tcyA+PiA4KSArIDEpOwogCi0gICAgICB0ZW1wID0gcG5tcyAtIHBubHI7CisgICAgICB0ZW1wID0gcG5tcyAtIHBubHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICBpZiggdGVtcCA+IDAgKXsKIAotICAgICAgICBtc01hc2tbaWR4XSA9IDE7Ci0gICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAxOworICAgICAgICBtc01hc2tbaWR4XSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgICAgIGZvciAoaj1zZmJPZmZzZXRbaWR4XTsgajxzZmJPZmZzZXRbaWR4KzFdOyBqKyspIHsKICAgICAgICAgICBXb3JkMzIgbGVmdCwgcmlnaHQ7CiAgICAgICAgICAgbGVmdCAgPSAobWRjdFNwZWN0cnVtTGVmdFtqXSA+PiAgMSk7CiAgICAgICAgICAgcmlnaHQgPSAobWRjdFNwZWN0cnVtUmlnaHRbal0gPj4gMSk7Ci0gICAgICAgICAgbWRjdFNwZWN0cnVtTGVmdFtqXSA9ICBsZWZ0ICsgcmlnaHQ7Ci0gICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSAgbGVmdCAtIHJpZ2h0OworICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAgbGVmdCArIHJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgbWRjdFNwZWN0cnVtUmlnaHRbal0gPSAgbGVmdCAtIHJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2ZiVGhyZXNob2xkTGVmdFtpZHhdID0gbWluVGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbaWR4XSA9IG1pblRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiRW5lcmd5TGVmdFtpZHhdID0gc2ZiRW5lcmd5TWlkW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc2ZiRW5lcmd5UmlnaHRbaWR4XSA9IHNmYkVuZXJneVNpZGVbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotICAgICAgICBzZmJUaHJlc2hvbGRMZWZ0W2lkeF0gPSBtaW5UaHJlc2hvbGQ7Ci0gICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W2lkeF0gPSBtaW5UaHJlc2hvbGQ7Ci0gICAgICAgIHNmYkVuZXJneUxlZnRbaWR4XSA9IHNmYkVuZXJneU1pZFtpZHhdOwotICAgICAgICBzZmJFbmVyZ3lSaWdodFtpZHhdID0gc2ZiRW5lcmd5U2lkZVtpZHhdOwotCi0gICAgICAgIHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdID0gbWluKHNmYlNwcmVhZGVkRW5MZWZ0W2lkeF0sc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF0pID4+IDE7Ci0gICAgICAgIHNmYlNwcmVhZGVkRW5MZWZ0W2lkeF0gPSBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XTsKLQorICAgICAgICBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSA9IG1pbihzZmJTcHJlYWRlZEVuTGVmdFtpZHhdLHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdKSA+PiAxOyAgCisgICAgICAgIHNmYlNwcmVhZGVkRW5MZWZ0W2lkeF0gPSBzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgfQogICAgICAgZWxzZSB7Ci0gICAgICAgIG1zTWFza1tpZHhdICA9IDA7Ci0gICAgICAgIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMTsKKyAgICAgICAgbXNNYXNrW2lkeF0gID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbXNNYXNrRmFsc2VTb21ld2hlcmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCBtc01hc2tUcnVlU29tZXdoZXJlICkgeworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICggbXNNYXNrVHJ1ZVNvbWV3aGVyZSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgaWYobXNNYXNrRmFsc2VTb21ld2hlcmUgKSB7Ci0gICAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfU09NRTsKKyAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19TT01FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfQUxMOworICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX0FMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX05PTkU7CisgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX05PTkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYwppbmRleCAxNDA2ZTExLi4xZTgxOGEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wcmVfZWNob19jb250cm9sLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgotKiBmdW5jdGlvbiBuYW1lOkluaXRQcmVFY2hvQ29udHJvbAorKiBmdW5jdGlvbiBuYW1lOkluaXRQcmVFY2hvQ29udHJvbCAKICogZGVzY3JpcHRpb246IGluaXQgcHJlIGVjaG8gY29udHJvbCBwYXJhbWV0ZXIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDAsMTMgKzQwLDEzIEBACiAgIFdvcmQxNiBwYjsKIAogICBmb3IocGI9MDsgcGI8bnVtUGI7IHBiKyspIHsKLSAgICBwYlRocmVzaG9sZE5tMVtwYl0gPSBwYlRocmVzaG9sZFF1aWV0W3BiXTsKKyAgICBwYlRocmVzaG9sZE5tMVtwYl0gPSBwYlRocmVzaG9sZFF1aWV0W3BiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgotKiBmdW5jdGlvbiBuYW1lOlByZUVjaG9Db250cm9sCisqIGZ1bmN0aW9uIG5hbWU6UHJlRWNob0NvbnRyb2wgCiAqIGRlc2NyaXB0aW9uOiB1cGRhdGUgc2hyZXNob2xkIHRvIGF2b2lkIHByZSBlY2hvCiAqCQkJICAgdGhyKG4pID0gbWF4KHJwbWluKnRocnEobiksIG1pbih0aHJxKG4pLCBycGVsZXYqdGhycTEobikpKQogKgpAQCAtNjgsMjIgKzY4LDIyIEBACiAgICh2b2lkKW1heEFsbG93ZWRJbmNyZWFzZUZhY3RvcjsKIAogICBzY2FsaW5nID0gKChtZGN0U2NhbGUgLSBtZGN0U2NhbGVubTEpIDw8IDEpOwotCisgICAKICAgaWYgKCBzY2FsaW5nID4gMCApIHsKICAgICBmb3IoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7CiAgICAgICB0bXBUaHJlc2hvbGQxID0gcGJUaHJlc2hvbGRObTFbaV0gPj4gKHNjYWxpbmctMSk7CiAgICAgICB0bXBUaHJlc2hvbGQyID0gTF9tcHlfbHMocGJUaHJlc2hvbGRbaV0sIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3Rvcik7CiAKICAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KLSAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07CisgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotCisgICAgICAgCiAgICAgICBpZihwYlRocmVzaG9sZFtpXSA+IHRtcFRocmVzaG9sZDEpIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQxOworICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB9Ci0KKyAgICAgICAKICAgICAgIGlmKHRtcFRocmVzaG9sZDIgPiBwYlRocmVzaG9sZFtpXSkgewotICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDI7CisgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KIAogICAgIH0KQEAgLTk2LDE1ICs5NiwxNSBAQAogICAgICAgdG1wVGhyZXNob2xkMiA9IExfbXB5X2xzKHBiVGhyZXNob2xkW2ldLCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IpOwogCiAgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCi0gICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOworICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLQorICAgICAgIAogICAgICAgaWYoKChwYlRocmVzaG9sZFtpXSA+PiBzY2FsaW5nKSA+IHRtcFRocmVzaG9sZDEpKSB7CiAgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMSA8PCBzY2FsaW5nOwogICAgICAgfQotCisgICAgICAgCiAgICAgICBpZih0bXBUaHJlc2hvbGQyID4gcGJUaHJlc2hvbGRbaV0pIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQyOworICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYwppbmRleCAwMmQ5MmFiLi44ZTU5OWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmMKQEAgLTg4LDE3ICs4OCwxNyBAQAogKgogKiBmdW5jdGlvbiBuYW1lOiBhdGFuXzEwMDAKICogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIDEwMDAqYXRhbih4LzEwMDApCi0qICAgICAgICAgICAgICAgYmFzZWQgb24gYXRhbiBhcHByb3ggZm9yIHggPiAwCisqICAgICAgICAgICAgICAgYmFzZWQgb24gYXRhbiBhcHByb3ggZm9yIHggPiAwCQkJCQogKgkJCQlhdGFuKHgpID0geC8oKGZsb2F0KTEuMGYrKGZsb2F0KTAuMjgwODcyZip4KngpICBpZiB4IDwgMQogKgkJCQkJCT0gcGkvMiAtIHgvKChmbG9hdCkwLjI4MDg3MmYgK3gqeCkJICAgIGlmIHggPj0gMQogKiByZXR1cm46ICAgICAgIDEwMDAqYXRhbih4LzEwMDApCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBhdGFuXzEwMDAoV29yZDMyIHZhbCkKK3N0YXRpYyBXb3JkMTYgYXRhbl8xMDAwKFdvcmQzMiB2YWwpIAogewogICBXb3JkMzIgeTsKIAotCisgICAKICAgaWYoTF9zdWIodmFsLCAxMDAwKSA8IDApIHsKICAgICB5ID0gZXh0cmFjdF9sKCgoMTAwMCAqIHZhbCkgLyAoMTAwMCArICgodmFsICogdmFsKSAvIEFUQU5fQ09FRjEpKSkpOwogICB9CkBAIC0xMjYsOSArMTI2LDkgQEAKICAgLyogY2VudGVyIGZyZXF1ZW5jeSBvZiBmZnQgbGluZSAqLwogICBjZW50ZXJfZnJlcSA9IChmZnRMaW5lICogc2FtcGxpbmdGcmVxKSAvIChub09mTGluZXMgPDwgMSk7CiAgIHRlbXAgPSAgYXRhbl8xMDAwKChjZW50ZXJfZnJlcSA8PCAyKSAvICgzKjEwKSk7Ci0gIGJ2YWxGRlRMaW5lID0KKyAgYnZhbEZGVExpbmUgPSAKICAgICAoMjY2MDAgKiBhdGFuXzEwMDAoKGNlbnRlcl9mcmVxKjc2KSAvIDEwMCkgKyA3KnRlbXAqdGVtcCkgLyAoMioxMDAwKjEwMDAgLyBCQVJDX1NDQUxFKTsKLQorICAKICAgcmV0dXJuIHNhdHVyYXRlKGJ2YWxGRlRMaW5lKTsKIH0KIApAQCAtMTQ4LDE3ICsxNDgsMTcgQEAKICAgZm9yKGk9MDsgaTxudW1QYjsgaSsrKSB7CiAgICAgV29yZDE2IGJ2MSwgYnYyOwogCi0KKyAgICAgCiAgICAgaWYgKGk+MCkKICAgICAgIGJ2MSA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaS0xXSkgPj4gMTsKICAgICBlbHNlCiAgICAgICBidjEgPSBwYkJhcmNWYWxbaV0gPj4gMTsKIAotCisgICAgIAogICAgIGlmIChpIDwgKG51bVBiIC0gMSkpCiAgICAgICBidjIgPSAocGJCYXJjVmFsW2ldICsgcGJCYXJjVmFsW2krMV0pID4+IDE7CiAgICAgZWxzZSB7Ci0gICAgICBidjIgPSBwYkJhcmNWYWxbaV07CisgICAgICBidjIgPSBwYkJhcmNWYWxbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KIAogICAgIGJ2MSA9IG1pbigoYnYxIC8gQkFSQ19TQ0FMRSksIG1heF9iYXJrKTsKQEAgLTE2Niw5ICsxNjYsOSBAQAogCiAgICAgYmFyY1RoclF1aWV0ID0gbWluKEJBUkNfVEhSX1FVSUVUW2J2MV0sIEJBUkNfVEhSX1FVSUVUW2J2Ml0pOwogCi0KKyAgICAKICAgICAvKgotICAgICAgd2UgY2FsY3VsYXRlCisgICAgICB3ZSBjYWxjdWxhdGUgCiAgICAgICBwb3coMTAuMGYsKGZsb2F0KShiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSowLjEpKihmbG9hdClBQlNfTE9XKihwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pOwogICAgICovCiAKQEAgLTE5Niw0NyArMTk2LDQ3IEBACiAgIFdvcmQxNiBpOwogICBXb3JkMTYgbWFza0xvd1NwckVuLCBtYXNrSGlnaFNwckVuOwogCi0KKyAgIAogICBpZiAoc3ViKGJsb2NrVHlwZSwgU0hPUlRfV0lORE9XKSAhPSAwKSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuTG9uZzsKLQorICAgIG1hc2tMb3dTcHJFbiA9IG1hc2tMb3dTcHJFbkxvbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAogICAgIGlmIChiaXRyYXRlID4gMjIwMDApCiAgICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmc7CiAgICAgZWxzZQogICAgICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5Mb25nTG93QnI7CiAgIH0KICAgZWxzZSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuU2hvcnQ7Ci0gICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5TaG9ydDsKKyAgICBtYXNrTG93U3ByRW4gPSBtYXNrTG93U3ByRW5TaG9ydDsgICAgICAgICAgICAKKyAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFblNob3J0OyAgICAgICAgICAKICAgfQogCiAgIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgewotCisgICAgIAogICAgIGlmIChpID4gMCkgewogICAgICAgV29yZDMyIGRiVmFsOwogICAgICAgV29yZDE2IGRiYXJrID0gcGJCYXJjVmFsdWVbaV0gLSBwYkJhcmNWYWx1ZVtpLTFdOwogCiAgICAgICAvKgotICAgICAgICB3ZSBjYWx1bGF0ZSBwb3coMTAuMGYsIC0wLjEqZGJWYWwvQkFSQ19TQ0FMRSkKKyAgICAgICAgd2UgY2FsdWxhdGUgcG93KDEwLjBmLCAtMC4xKmRiVmFsL0JBUkNfU0NBTEUpIAogICAgICAgKi8KICAgICAgIGRiVmFsID0gKG1hc2tIaWdoICogZGJhcmspOwogICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLCAoV29yZDMyKUxPRzJfMTAwMCkpOyAgICAgICAgICAgICAvKiAwLjMwMSBsb2cxMCgyKSAqLwotCisgICAgICAgCiAgICAgICBkYlZhbCA9IChtYXNrTG93ICogZGJhcmspOwotICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKLQotCisgICAgICBwYk1hc2tMb0ZhY3RvcltpLTFdID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOyAKKyAgICAgICAKKyAgICAgIAogICAgICAgZGJWYWwgPSAobWFza0hpZ2hTcHJFbiAqIGRiYXJrKTsKLSAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAgcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOworICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9ICByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7IAogICAgICAgZGJWYWwgPSAobWFza0xvd1NwckVuICogZGJhcmspOwogICAgICAgcGJNYXNrTG9GYWN0b3JTcHJFbltpLTFdID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gMDsKLSAgICAgIHBiTWFza0xvRmFjdG9yW251bVBiLTFdID0gMDsKKyAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHBiTWFza0xvRmFjdG9yW251bVBiLTFdID0gMDsgICAgICAgICAgICAgICAKIAotICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9IDA7Ci0gICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW251bVBiLTFdID0gMDsKKyAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAwOyAgICAgICAgICAgICAgICAKKyAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5bbnVtUGItMV0gPSAwOyAgICAgICAgICAKICAgICB9CiAgIH0KIApAQCAtMjU4LDEyICsyNTgsMTIgQEAKICAgV29yZDE2IGk7CiAgIFdvcmQxNiBwYkJ2YWwwLCBwYkJ2YWwxOwogCi0gIHBiQnZhbDAgPSAwOworICBwYkJ2YWwwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wOyBpPG51bVBiOyBpKyspewogICAgIHBiQnZhbDEgPSBCYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpKzFdLCBzYW1wbGluZ0ZyZXF1ZW5jeSk7CiAgICAgcGJCdmFsW2ldID0gKHBiQnZhbDAgKyBwYkJ2YWwxKSA+PiAxOwotICAgIHBiQnZhbDAgPSBwYkJ2YWwxOworICAgIHBiQnZhbDAgPSBwYkJ2YWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiB9CiAKQEAgLTI5NSwzOCArMjk1LDM4IEBACiAKICAgcGVQZXJXaW5kb3cgPSBiaXRzMnBlKGV4dHJhY3RfbCgoYml0cmF0ZSAqIG51bUxpbmVzKSAvIHNhbXBsZXJhdGUpKTsKIAotICBwYlZhbDAgPSAwOworICBwYlZhbDAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IgKHNmYj0wOyBzZmI8c2ZiQWN0aXZlOyBzZmIrKykgewogCiAgICAgcGJWYWwxID0gKHBiQmFyY1ZhbFtzZmJdIDw8IDEpIC0gcGJWYWwwOwogICAgIGJhcmNXaWR0aCA9IHBiVmFsMSAtIHBiVmFsMDsKLSAgICBwYlZhbDAgPSBwYlZhbDE7CisgICAgcGJWYWwwID0gcGJWYWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgLyogYWxsb3cgYXQgbGVhc3QgMi40JSBvZiBwZSBmb3IgZWFjaCBhY3RpdmUgYmFyYyAqLwogCXBlUGFydCA9ICgocGVQZXJXaW5kb3cgKiAyNCkgKiAobWF4X2JhcmsgKiBiYXJjV2lkdGgpKSAvCiAgICAgICAgIChwYkJhcmNWYWxbc2ZiQWN0aXZlLTFdICogKHNmYk9mZnNldFtzZmIrMV0gLSBzZmJPZmZzZXRbc2ZiXSkpOwotCi0KLSAgICBwZVBhcnQgPSBtaW4ocGVQYXJ0LCA4NDAwKTsKKyAgIAorICAgICAgCisgICAgcGVQYXJ0ID0gbWluKHBlUGFydCwgODQwMCk7IAogICAgIHBlUGFydCA9IG1heChwZVBhcnQsIDE0MDApOwogCiAgICAgLyogbWluU25yKG4pID0gMS8oMl5zZmJQZW1pbihuKS93KG4pIC0gMS41KSovCiAJLyogd2UgYWRkIGFuIG9mZnNldCBvZiAyXjE2IHRvIHRoZSBwb3cgZnVuY3Rpb25zICovCiAJLyogMHhjMDAwID0gMS41KigxIDw8IDE1KSovCi0KKyAgICAgIAogICAgIHNuciA9IHBvdzJfeHkoKHBlUGFydCAtIDE2KjEwMDApLDEwMDApIC0gMHgwMDAwYzAwMDsKLQorICAgICAgCiAgICAgaWYoc25yID4gMHgwMDAwODAwMCkKIAl7CiAJCXNoaWZ0ID0gbm9ybV9sKHNucik7Ci0JCXNuciA9IERpdl8zMigweDAwMDA4MDAwIDw8IHNoaWZ0LCBzbnIgPDwgc2hpZnQpOworCQlzbnIgPSBEaXZfMzIoMHgwMDAwODAwMCA8PCBzaGlmdCwgc25yIDw8IHNoaWZ0KTsgIAogCX0KIAllbHNlCiAJewogCQlzbnIgPSAweDdmZmZmZmZmOwogCX0KLQorICAgICAgCiAgICAgLyogdXBwZXIgbGltaXQgaXMgLTEgZEIgKi8KICAgICBzbnIgPSBtaW4oc25yLCBjX21heHNucik7CiAgICAgLyogbG93ZXIgbGltaXQgaXMgLTI1IGRCICovCkBAIC0zNTQsNyArMzU0LDcgQEAKICAgLyoKICAgICBpbml0IHNmYiB0YWJsZQogICAqLwotICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOworICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOyAgCiAgIHBzeUNvbmYtPnNmYkNudCA9IHNmQmFuZFRvdGFsTG9uZ1tzYW1wbGVyYXRlaW5kZXhdOwogICBwc3lDb25mLT5zZmJPZmZzZXQgPSBzZkJhbmRUYWJMb25nICsgc2ZCYW5kVGFiTG9uZ09mZnNldFtzYW1wbGVyYXRlaW5kZXhdOwogICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKQEAgLTM5MSwxOSArMzkxLDE5IEBACiAgIC8qCiAgICAgaW5pdCByYXRpbwogICAqLwotICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87CisgIHBzeUNvbmYtPnJhdGlvID0gY19yYXRpbzsgICAgICAKIAotICBwc3lDb25mLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgPSAyOwotICBwc3lDb25mLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSBjX21pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsgICAgLyogMC4wMSAqKDEgPDwgMTUpKi8KKyAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsgICAgICAgICAgICAgIAorICBwc3lDb25mLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IgPSBjX21pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvcjsgICAgLyogMC4wMSAqKDEgPDwgMTUpKi8gIAogCi0gIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPSBjX21heENsaXBFbmVyZ3lMb25nOworICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gY19tYXhDbGlwRW5lcmd5TG9uZzsgICAgICAgICAgICAgICAgICAgCiAgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKChiYW5kd2lkdGg8PDEpICogRlJBTUVfTEVOX0xPTkcgLyBzYW1wbGVyYXRlKTsKIAogICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKICAgICBpZiAoc3ViKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdLCBwc3lDb25mLT5sb3dwYXNzTGluZSkgPj0gMCkKICAgICAgIGJyZWFrOwogICB9Ci0gIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKKyAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gc2ZiOyAgICAgICAgICAgICAgICAgCiAKICAgLyoKICAgICBjYWxjdWxhdGUgbWluU25yCkBAIC00MjksNyArNDI5LDcgQEAKIFdvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBzeUNvbmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZikgCiB7CiAgIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7CiAgIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfU0hPUlRdOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAgIC8qCiAgICAgaW5pdCBzZmIgdGFibGUKICAgKi8KLSAgc2FtcGxlcmF0ZWluZGV4ID0gR2V0U1JJbmRleChzYW1wbGVyYXRlKTsKKyAgc2FtcGxlcmF0ZWluZGV4ID0gR2V0U1JJbmRleChzYW1wbGVyYXRlKTsgIAogICBwc3lDb25mLT5zZmJDbnQgPSBzZkJhbmRUb3RhbFNob3J0W3NhbXBsZXJhdGVpbmRleF07CiAgIHBzeUNvbmYtPnNmYk9mZnNldCA9IHNmQmFuZFRhYlNob3J0ICsgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbc2FtcGxlcmF0ZWluZGV4XTsKICAgcHN5Q29uZi0+c2FtcFJhdGVJZHggPSBzYW1wbGVyYXRlaW5kZXg7CkBAIC00NzMsMjEgKzQ3MywyMSBAQAogICAvKgogICAgIGluaXQgcmF0aW8KICAgKi8KLSAgcHN5Q29uZi0+cmF0aW8gPSBjX3JhdGlvOworICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLSAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsKLSAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7CisgIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCiAKLSAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneVNob3J0OworICBwc3lDb25mLT5jbGlwRW5lcmd5ID0gY19tYXhDbGlwRW5lcmd5U2hvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgcHN5Q29uZi0+bG93cGFzc0xpbmUgPSBleHRyYWN0X2woKChiYW5kd2lkdGggPDwgMSkgKiBGUkFNRV9MRU5fU0hPUlQpIC8gc2FtcGxlcmF0ZSk7Ci0KKyAKICAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKSB7Ci0KKyAgICAgCiAgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKQogICAgICAgYnJlYWs7CiAgIH0KLSAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gc2ZiOworICBwc3lDb25mLT5zZmJBY3RpdmUgPSBzZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgLyoKICAgICBjYWxjdWxhdGUgbWluU25yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwppbmRleCAwODVhY2I4Li4zZDBhMzU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKQEAgLTgxLDcgKzgxLDcgQEAKICAgV29yZDMyICptZGN0U3BlY3RydW07CiAgIFdvcmQzMiAqc2NyYXRjaFROUzsKICAgV29yZDE2ICptZGN0RGVsYXlCdWZmZXI7Ci0KKyAgCiAgIG1kY3RTcGVjdHJ1bSA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7CiAgIGlmKE5VTEwgPT0gbWRjdFNwZWN0cnVtKQogCSAgcmV0dXJuIDE7CkBAIC05OSw3ICs5OSw3IEBACiAgIH0KIAogICBmb3IgKGk9MDsgaTxuQ2hhbjsgaSsrKXsKLSAgICBoUHN5LT5wc3lEYXRhW2ldLm1kY3REZWxheUJ1ZmZlciA9IG1kY3REZWxheUJ1ZmZlciArIGkqQkxPQ0tfU1dJVENISU5HX09GRlNFVDsKKyAgICBoUHN5LT5wc3lEYXRhW2ldLm1kY3REZWxheUJ1ZmZlciA9IG1kY3REZWxheUJ1ZmZlciArIGkqQkxPQ0tfU1dJVENISU5HX09GRlNFVDsgICAgICAKICAgICBoUHN5LT5wc3lEYXRhW2ldLm1kY3RTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bSArIGkqRlJBTUVfTEVOX0xPTkc7CiAgIH0KIApAQCAtMTI0LDEyICsxMjQsMTIgQEAKICAgewogCWlmKGhQc3ktPnBzeURhdGFbMF0ubWRjdERlbGF5QnVmZmVyKQogCQltZW1fZnJlZShwTWVtT1AsIGhQc3ktPnBzeURhdGFbMF0ubWRjdERlbGF5QnVmZmVyLCBWT19JTkRFWF9FTkNfQUFDKTsKLQorICAgICAgCiAgICAgaWYoaFBzeS0+cHN5RGF0YVswXS5tZGN0U3BlY3RydW0pCiAJCW1lbV9mcmVlKHBNZW1PUCwgaFBzeS0+cHN5RGF0YVswXS5tZGN0U3BlY3RydW0sIFZPX0lOREVYX0VOQ19BQUMpOwogCiAgICAgZm9yIChuY2g9MDsgbmNoPE1BWF9DSEFOTkVMUzsgbmNoKyspewotCSAgaFBzeS0+cHN5RGF0YVtuY2hdLm1kY3REZWxheUJ1ZmZlciA9IE5VTEw7CisJICBoUHN5LT5wc3lEYXRhW25jaF0ubWRjdERlbGF5QnVmZmVyID0gTlVMTDsgICAgICAKIAkgIGhQc3ktPnBzeURhdGFbbmNoXS5tZGN0U3BlY3RydW0gPSBOVUxMOwogCX0KIApAQCAtMjE2LDE0ICsyMTYsMTQgQEAKIAogICBpZiAoIWVycikKICAgICBmb3IoY2g9MDtjaCA8IGNoYW5uZWxzO2NoKyspewotCisgIAogICAgICAgSW5pdEJsb2NrU3dpdGNoaW5nKCZoUHN5LT5wc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSwgY2hhbm5lbHMpOwogCiAgICAgICBJbml0UHJlRWNob0NvbnRyb2woaFBzeS0+cHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkbm0xLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZMb25nLnNmYkNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mTG9uZy5zZmJUaHJlc2hvbGRRdWlldCk7Ci0gICAgICBoUHN5LT5wc3lEYXRhW2NoXS5tZGN0U2NhbGVubTEgPSAwOworICAgICAgaFBzeS0+cHN5RGF0YVtjaF0ubWRjdFNjYWxlbm0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KIAogCXJldHVybihlcnIpOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAKIFdvcmQxNiBwc3lNYWluKFdvcmQxNiAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gICAgICAgICAgICAqZWxlbUluZm8sCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgICAgICAqdGltZVNpZ25hbCwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLCAKICAgICAgICAgICAgICAgIFBTWV9EQVRBICAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU10sCiAgICAgICAgICAgICAgICBUTlNfREFUQSAgICAgICAgICAgICAgICAgdG5zRGF0YVtNQVhfQ0hBTk5FTFNdLAogICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAgKmhQc3lDb25mTG9uZywKQEAgLTI2MCw4ICsyNjAsOCBAQAogICBXb3JkMTYgY2hhbm5lbHM7CiAgIFdvcmQxNiBtYXhTY2FsZTsKIAotICBjaGFubmVscyA9IGVsZW1JbmZvLT5uQ2hhbm5lbHNJbkVsOwotICBtYXhTY2FsZSA9IDA7CisgIGNoYW5uZWxzID0gZWxlbUluZm8tPm5DaGFubmVsc0luRWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtYXhTY2FsZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAvKiBibG9jayBzd2l0Y2hpbmcgKi8KICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewpAQCAtMjkxLDcgKzI5MSw3IEBACiAgIC8qIGNvbW1vbiBzY2FsaW5nIGZvciBhbGwgY2hhbm5lbHMgKi8KICAgZm9yIChjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewogICAgIFdvcmQxNiBzY2FsZURpZmYgPSBtYXhTY2FsZSAtIG1kY3RTY2FsaW5nQXJyYXlbY2hdOwotCisgICAgIAogICAgIGlmIChzY2FsZURpZmYgPiAwKSB7CiAgICAgICBXb3JkMzIgKlNwZWN0cnVtID0gcHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtOwogCSAgZm9yKGxpbmU9MDsgbGluZTxGUkFNRV9MRU5fTE9ORzsgbGluZSsrKSB7CkBAIC0yOTksMTEgKzI5OSwxMSBAQAogCQlTcGVjdHJ1bSsrOwogICAgICAgfQogICAgIH0KLSAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUgPSBtYXhTY2FsZTsKKyAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUgPSBtYXhTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgfQogCiAgIGZvciAoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKLQorICAgICAKICAgICBpZihwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAvKiB1cGRhdGUgbG9uZyBibG9jayBwYXJhbWV0ZXIgKi8KIAkgIGFkdmFuY2VQc3ljaExvbmcoJnBzeURhdGFbY2hdLApAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAvKiBkZXRlcm1pbmUgbWF4U2ZiICovCiAgICAgICBmb3IgKHNmYj1oUHN5Q29uZkxvbmctPnNmYkNudC0xOyBzZmI+PTA7IHNmYi0tKSB7CiAgICAgICAgIGZvciAobGluZT1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmIrMV0gLSAxOyBsaW5lPj1oUHN5Q29uZkxvbmctPnNmYk9mZnNldFtzZmJdOyBsaW5lLS0pIHsKLQorICAgICAgICAgICAKICAgICAgICAgICBpZiAocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtW2xpbmVdICE9IDApIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAKICAgICAgIC8qIENhbGMgYmFuZHdpc2UgZW5lcmdpZXMgZm9yIG1pZCBhbmQgc2lkZSBjaGFubmVsCiAgICAgICAgICBEbyBpdCBvbmx5IGlmIDIgY2hhbm5lbHMgZXhpc3QgKi8KLQorICAgICAgIAogICAgICAgaWYgKGNoID09IDEpCiAgICAgICAgIGFkdmFuY2VQc3ljaExvbmdNUyhwc3lEYXRhLCBoUHN5Q29uZkxvbmcpOwogICAgIH0KQEAgLTM0MSw3ICszNDEsNyBAQAogCiAgICAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbAogICAgICAgICAgRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCi0KKyAgICAgICAKICAgICAgIGlmIChjaCA9PSAxKQogICAgICAgICBhZHZhbmNlUHN5Y2hTaG9ydE1TIChwc3lEYXRhLCBoUHN5Q29uZlNob3J0KTsKICAgICB9CkBAIC0zNDksNyArMzQ5LDcgQEAKIAogICAvKiBncm91cCBzaG9ydCBkYXRhICovCiAgIGZvcihjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotCisgICAgIAogICAgIGlmIChwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICBncm91cFNob3J0RGF0YShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKQEAgLTM3NCwxMCArMzc0LDEwIEBACiAgICAgc3RlcmVvIFByb2Nlc3NpbmcKICAgKi8KICAgaWYgKGNoYW5uZWxzID09IDIpIHsKLSAgICBwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QgPSBNU19OT05FOworICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7ICAgICAgICAgICAgICAgICAKICAgICBtYXhTZmJQZXJHcm91cFswXSA9IG1heFNmYlBlckdyb3VwWzFdID0gbWF4KG1heFNmYlBlckdyb3VwWzBdLCBtYXhTZmJQZXJHcm91cFsxXSk7CiAKLQorICAgICAKICAgICBpZiAocHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQogICAgICAgTXNTdGVyZW9Qcm9jZXNzaW5nKHBzeURhdGFbMF0uc2ZiRW5lcmd5LnNmYkxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgIGJ1aWxkIG91dHB1dAogICAqLwogICBmb3IoY2g9MDtjaDxjaGFubmVscztjaCsrKSB7Ci0KKyAgICAgCiAgICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCiAgICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCkBAIC00ODMsNyArNDgzLDcgQEAKICAgLyogbG93IHBhc3MgKi8KICAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOwogICBmb3IoaT1oUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9MT05HOyBpKyspIHsKLSAgICAqZGF0YTArKyA9IDA7CisgICAgKmRhdGEwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCkBAIC01MDUsNyArNTA1LDcgQEAKICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSwKICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nKTsKIAotICAvKiAgVG5zU3luYyAqLworICAvKiAgVG5zU3luYyAqLyAgIAogICBpZiAoY2ggPT0gMSkgewogICAgIFRuc1N5bmModG5zRGF0YSwKICAgICAgICAgICAgIHRuc0RhdGEyLApAQCAtNTE0LDcgKzUxNCw3IEBACiAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOwogICB9CiAKLSAgLyogIFRucyBFbmNvZGVyICovCisgIC8qICBUbnMgRW5jb2RlciAqLyAKICAgVG5zRW5jb2RlKCZwc3lPdXRDaGFubmVsLT50bnNJbmZvLAogICAgICAgICAgICAgdG5zRGF0YSwKICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LApAQCAtNTMyLDE1ICs1MzIsMTUgQEAKICAgICAqZGF0YTErKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7CiAgIH0KIAotICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluICovCisgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8gICAKICAgaWYgKHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlIT0wKSB7Ci0gICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQ7CisgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0K3Ruc1N0YXJ0QmFuZCwKICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQsCiAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nK3Ruc1N0YXJ0QmFuZCwKICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nKTsKLQorICAgIAogCWRhdGEwID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7CiAJdGRhdGEgPSBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZzsKIAlmb3IgKGk9MDsgaTx0bnNTdGFydEJhbmQ7IGkrKykKQEAgLTU2NSwxMyArNTY1LDEzIEBACiAJICBkYXRhMCsrOyBkYXRhMSsrOwogICB9CiAKLSAgLyogcHJlZWNobyBjb250cm9sICovCisgIC8qIHByZWVjaG8gY29udHJvbCAqLyAgIAogICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7CiAgICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7CiAJZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICAgICpkYXRhMCsrID0gTUFYXzMyOworICAgICAgKmRhdGEwKysgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQotICAgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IDA7CisgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICBQcmVFY2hvQ29udHJvbCggcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xLApAQCAtNTgxLDE1ICs1ODEsMTUgQEAKICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nLAogICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlLAogICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xKTsKLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOworICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSBwc3lEYXRhLT5tZGN0U2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0KKyAgIAogICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlPT0gU1RBUlRfV0lORE9XKSB7CiAgICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7CiAJZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICAgICpkYXRhMCsrID0gTUFYXzMyOworICAgICAgKmRhdGEwKysgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQotICAgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IDA7CisgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICAvKiBhcHBseSB0bnMgbXVsdCB0YWJsZSBvbiBjYiB0aHJlc2hvbGRzICovCkBAIC02MDMsMTMgKzYwMywxMyBAQAogICBkYXRhMCA9IHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmc7CiAgIGRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7CiAgIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7Ci0gICAgLy9wc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nW2ldID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmdbaV07CisgICAgLy9wc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nW2ldID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmdbaV07ICAgICAgIAogCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKICAgfQogCiAgIC8qIHNwcmVhZGluZyBlbmVyZ3kgKi8KICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwgCiAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCiAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nKTsKIApAQCAtNjE5LDcgKzYxOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZ01TCi0qIGRlc2NyaXB0aW9uOiAgIHVwZGF0ZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsCisqIGRlc2NyaXB0aW9uOiAgIHVwZGF0ZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFkZCBvciBtaW51cyByaWdodCBjaGFubmVsIAogKgkJCQlmb3IgbG9uZyBibG9jawogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NTcsNyArNjU3LDcgQEAKICAgV29yZDMyIHc7CiAgIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLwogICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mU2hvcnQtPmNsaXBFbmVyZ3kgPj4gbm9ybUVuZXJneVNoaWZ0OwotICBXb3JkMzIgd09mZnNldCA9IDA7CisgIFdvcmQzMiB3T2Zmc2V0ID0gMDsgICAgIAogICBXb3JkMzIgKmRhdGEwLCAqZGF0YTE7CiAKICAgZm9yKHcgPSAwOyB3IDwgVFJBTlNfRkFDOyB3KyspIHsKQEAgLTY2Niw3ICs2NjYsNyBAQAogICAgIC8qIGxvdyBwYXNzICovCiAgICAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyB3T2Zmc2V0ICsgaFBzeUNvbmZTaG9ydC0+bG93cGFzc0xpbmU7CiAJZm9yKGk9aFBzeUNvbmZTaG9ydC0+bG93cGFzc0xpbmU7IGk8RlJBTUVfTEVOX1NIT1JUOyBpKyspewotICAgICAgKmRhdGEwKysgPSAwOworICAgICAgKmRhdGEwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogCiAgICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCAqLwpAQCAtNzEzLDkgKzcxMyw5IEBACiAgICAgICAqZGF0YTArKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7CiAgICAgfQogCi0gICAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBhZ2FpbiAqLworICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8gICAgIAogICAgIGlmICh0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgIT0gMCkgewotICAgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kOworICAgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAogICAgICAgICAgICAgICAgICAgICAgIChoUHN5Q29uZlNob3J0LT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQpLApAQCAtNzQ4LDcgKzc0OCw3IEBACiAJfQogCiAKLSAgICAvKiBwcmVlY2hvICovCisgICAgLyogcHJlZWNobyAqLyAgICAgCiAgICAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAogICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCkBAIC03NzAsMTQgKzc3MCwxNCBAQAogCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKICAgICB9CiAgICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sIAogICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAogICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJTaG9ydFt3XSk7CiAKICAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKICAgfSAvKiBmb3IgVFJBTlNfRkFDICovCiAKLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOworICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSBwc3lEYXRhLT5tZGN0U2NhbGU7ICAgICAgICAgICAgICAKIAogICByZXR1cm4gMDsKIH0KQEAgLTc4NSw3ICs3ODUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaFNob3J0TVMKLSogZGVzY3JpcHRpb246ICAgdXBkYXRlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYWRkIG9yIG1pbnVzIHJpZ2h0IGNoYW5uZWwKKyogZGVzY3JpcHRpb246ICAgdXBkYXRlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYWRkIG9yIG1pbnVzIHJpZ2h0IGNoYW5uZWwgCiAqCQkJCWZvciBzaG9ydCBibG9jawogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03OTMsNyArNzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpCiB7CiAgIFdvcmQzMiB3LCB3T2Zmc2V0OwotICB3T2Zmc2V0ID0gMDsKKyAgd09mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgZm9yKHc9MDsgdzxUUkFOU19GQUM7IHcrKykgewogICAgIENhbGNCYW5kRW5lcmd5TVMocHN5RGF0YVswXS5tZGN0U3BlY3RydW0rd09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtK3dPZmZzZXQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKaW5kZXggZGY2ZDQ2ZS4uZThjMzllNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwpAQCAtNjgsMTIgKzY4LDEyIEBACiAgIHJlc3VsdCA9IChGUkFNRV9MRU5fTE9ORyA+PiAzKSAqIGJpdFJhdGU7CiAgIHF1b3QgPSByZXN1bHQgLyBzYW1wbGVSYXRlOwogCi0KKyAgIAogICBpZiAobW9kZSA9PSBGUkFNRV9MRU5fQllURVNfTU9EVUxPKSB7CiAgICAgcmVzdWx0IC09IHF1b3QgKiBzYW1wbGVSYXRlOwogICB9CiAgIGVsc2UgeyAvKiBGUkFNRV9MRU5fQllURVNfSU5UICovCi0gICAgcmVzdWx0ID0gcXVvdDsKKyAgICByZXN1bHQgPSBxdW90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICByZXR1cm4gcmVzdWx0OwpAQCAtODMsNyArODMsNyBAQAogKgogKiAgZnVuY3Rpb24gbmFtZTpmcmFtZVBhZGRpbmcKICogIGRlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIGlmIHBhZGRpbmcgaXMgbmVlZGVkIGZvciBhY3R1YWwgZnJhbWUKLSogIHJldHVybnM6IHBhZGRpbmdPbiBvciBub3QKKyogIHJldHVybnM6IHBhZGRpbmdPbiBvciBub3QgCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBXb3JkMTYgZnJhbWVQYWRkaW5nKFdvcmQzMiBiaXRSYXRlLApAQCAtOTMsMTYgKzkzLDE2IEBACiAgIFdvcmQxNiBwYWRkaW5nT247CiAgIFdvcmQxNiBkaWZmZXJlbmNlOwogCi0gIHBhZGRpbmdPbiA9IDA7CisgIHBhZGRpbmdPbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGRpZmZlcmVuY2UgPSBjYWxjRnJhbWVMZW4oIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gKTsKICAgKnBhZGRpbmdSZXN0ID0gKnBhZGRpbmdSZXN0IC0gZGlmZmVyZW5jZTsKIAotCisgICAKICAgaWYgKCpwYWRkaW5nUmVzdCA8PSAwICkgewotICAgIHBhZGRpbmdPbiA9IDE7CisgICAgcGFkZGluZ09uID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCArIHNhbXBsZVJhdGU7CiAgIH0KIApAQCAtMTIzLDEyICsxMjMsMTIgQEAKICAgV29yZDMyIGk7CiAgIFdvcmQxNiAqcXVhbnRTcGVjOwogICBXb3JkMTYgKnNjZjsKLSAgVVdvcmQxNiAqbWF4VmFsdWVJblNmYjsKLQorICBVV29yZDE2ICptYXhWYWx1ZUluU2ZiOwkKKwkKICAgcXVhbnRTcGVjID0gKFdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7CiAgIGlmKE5VTEwgPT0gcXVhbnRTcGVjKQogCSAgcmV0dXJuIDE7Ci0gIHNjZiA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKFdvcmQxNiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKKyAgc2NmID0gKFdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoV29yZDE2KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOyAgICAgCiAgIGlmKE5VTEwgPT0gc2NmKQogICB7CiAJICByZXR1cm4gMTsKQEAgLTE0MSwxMiArMTQxLDEyIEBACiAKICAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgICBoUUMtPnFjQ2hhbm5lbFtpXS5xdWFudFNwZWMgPSBxdWFudFNwZWMgKyBpKkZSQU1FX0xFTl9MT05HOwotCisgICAgCiAgICAgaFFDLT5xY0NoYW5uZWxbaV0ubWF4VmFsdWVJblNmYiA9IG1heFZhbHVlSW5TZmIgKyBpKk1BWF9HUk9VUEVEX1NGQjsKLQorICAgIAogICAgIGhRQy0+cWNDaGFubmVsW2ldLnNjZiA9IHNjZiArIGkqTUFYX0dST1VQRURfU0ZCOwogICB9Ci0KKyAKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2NSwyMSArMTY1LDIxIEBACiAgICB7CiAgICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMpOwogCQkgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMsIFZPX0lOREVYX0VOQ19BQUMpOwotCisgICAgCiAgICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiKQogCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KKyAgICAKIAkgIGlmKGhRQy0+cWNDaGFubmVsWzBdLnNjZikKIAkJICBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLnNjZiwgVk9fSU5ERVhfRU5DX0FBQyk7CiAKIAkgIGZvciAoaT0wOyBpPE1BWF9DSEFOTkVMUzsgaSsrKSB7CiAJCSAgaFFDLT5xY0NoYW5uZWxbaV0ucXVhbnRTcGVjID0gTlVMTDsKLQorCQkgIAogCQkgIGhRQy0+cWNDaGFubmVsW2ldLm1heFZhbHVlSW5TZmIgPSBOVUxMOwotCisJCSAgCiAJCSAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gTlVMTDsKIAkgIH0KLSAgIH0KKyAgIH0gCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIwNCw4ICsyMDQsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCiB7Ci0KLSAgLyoKKyAKKyAgLyogCiAgICAgIG5vdGhpbmcgdG8gZG8KICAgKi8KICAgaFFDPU5VTEw7CkBAIC0yMjEsMTUgKzIyMSwxNSBAQAogV29yZDE2IFFDSW5pdChRQ19TVEFURSAqaFFDLAogICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCkKIHsKLSAgaFFDLT5uQ2hhbm5lbHMgICAgICAgPSBpbml0LT5lbEluZm8tPm5DaGFubmVsc0luRWw7Ci0gIGhRQy0+bWF4Qml0c1RvdCAgICAgID0gaW5pdC0+bWF4Qml0czsKKyAgaFFDLT5uQ2hhbm5lbHMgICAgICAgPSBpbml0LT5lbEluZm8tPm5DaGFubmVsc0luRWw7ICAgICAgICAgICAgICAKKyAgaFFDLT5tYXhCaXRzVG90ICAgICAgPSBpbml0LT5tYXhCaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgaFFDLT5iaXRSZXNUb3QgICAgICAgPSBzdWIoaW5pdC0+Yml0UmVzLCBpbml0LT5hdmVyYWdlQml0cyk7Ci0gIGhRQy0+YXZlcmFnZUJpdHNUb3QgID0gaW5pdC0+YXZlcmFnZUJpdHM7Ci0gIGhRQy0+bWF4Qml0RmFjICAgICAgID0gaW5pdC0+bWF4Qml0RmFjOworICBoUUMtPmF2ZXJhZ2VCaXRzVG90ICA9IGluaXQtPmF2ZXJhZ2VCaXRzOyAgICAgICAgICAgICAgICAgICAgICAgIAorICBoUUMtPm1heEJpdEZhYyAgICAgICA9IGluaXQtPm1heEJpdEZhYzsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7CisgIGhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCA9IGluaXQtPnBhZGRpbmcucGFkZGluZ1Jlc3Q7ICAgICAgICAgICAgCiAKLSAgaFFDLT5nbG9iU3RhdEJpdHMgICAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIElEX0VORCAqLworICBoUUMtPmdsb2JTdGF0Qml0cyAgICA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgSURfRU5EICovIAogCiAgIC8qIGNoYW5uZWwgZWxlbWVudHMgaW5pdCAqLwogICBJbml0RWxlbWVudEJpdHMoJmhRQy0+ZWxlbWVudEJpdHMsCkBAIC0yNDgsMTMgKzI0OCwxMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKKyogCiAqIGZ1bmN0aW9uIG5hbWU6IFFDTWFpbgogKiBkZXNjcmlwdGlvbjogIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHRoZSBzcGVjdHJ1bQogKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ01haW4oUUNfU1RBVEUqIGhRQywKK1dvcmQxNiBRQ01haW4oUUNfU1RBVEUqIGhRQywgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBFTEVNRU5UX0JJVFMqIGVsQml0cywKICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQqIGFkalRoclN0YXRlRWxlbWVudCwKICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sICAvKiBtYXkgYmUgbW9kaWZpZWQgaW4tcGxhY2UgKi8KQEAgLTI2MiwzNCArMjYyLDM0IEBACiAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgICAgLyogb3V0ICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiBxY091dEVsZW1lbnQsCiAgICAgICAgICAgICAgIFdvcmQxNiBuQ2hhbm5lbHMsCi0JCQkgIFdvcmQxNiBhbmNpbGxhcnlEYXRhQnl0ZXMpCisJCQkgIFdvcmQxNiBhbmNpbGxhcnlEYXRhQnl0ZXMpICAgICAgCiB7CiAgIFdvcmQxNiBtYXhDaER5bkJpdHNbTUFYX0NIQU5ORUxTXTsKLSAgV29yZDE2IGNoQml0RGlzdHJpYnV0aW9uW01BWF9DSEFOTkVMU107CisgIFdvcmQxNiBjaEJpdERpc3RyaWJ1dGlvbltNQVhfQ0hBTk5FTFNdOyAgCiAgIFdvcmQzMiBjaDsKLQorICAgCiAgIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsIDwgMCkgewogICAgIHJldHVybiAtMTsKICAgfQotCisgICAKICAgaWYgKGVsQml0cy0+Yml0UmVzTGV2ZWwgPiBlbEJpdHMtPm1heEJpdFJlc0JpdHMpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KIAogICBxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkID0gY291bnRTdGF0aWNCaXRkZW1hbmQocHN5T3V0Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIAogCQkJCQkJCQkJCQkJCSAgcWNPdXRFbGVtZW50LT5hZHRzVXNlZCk7CiAKLQorICAgCiAgIGlmIChhbmNpbGxhcnlEYXRhQnl0ZXMpIHsKICAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gNyArIChhbmNpbGxhcnlEYXRhQnl0ZXMgPDwgMyk7Ci0KKyAgICAgCiAgICAgaWYgKGFuY2lsbGFyeURhdGFCeXRlcyA+PSAxNSkKICAgICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkICsgODsKICAgfQogICBlbHNlIHsKLSAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gMDsKKyAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gMDsgCiAgIH0KIAogICBDYWxjRm9ybUZhY3RvcihoUUMtPmxvZ1NmYkZvcm1GYWN0b3IsIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsIGhRQy0+bG9nU2ZiRW5lcmd5LCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBjaEJpdERpc3RyaWJ1dGlvbiwKICAgICAgICAgICAgICAgICAgICBoUUMtPmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICBoUUMtPnNmYk5SZWxldmFudExpbmVzLAorICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHFjT3V0RWxlbWVudCwKIAkJCQkgICBlbEJpdHMsCiAJCQkJICAgbkNoYW5uZWxzLApAQCAtMzIzLDE0ICszMjMsMTQgQEAKICAgICBtYXhDaER5bkJpdHNbY2hdID0gZXh0cmFjdF9sKGNoQml0RGlzdHJpYnV0aW9uW2NoXSAqIG1heER5bkJpdHMgLyAxMDAwKTsKICAgfQogCi0gIHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgPSAwOworICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKICAgICBXb3JkMzIgY2hEeW5CaXRzOwogICAgIEZsYWcgICBjb25zdHJhaW50c0Z1bGZpbGxlZDsKICAgICBXb3JkMzIgaXRlcjsKLSAgICBpdGVyID0gMDsKKyAgICBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgZG8gewotICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAxOworICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgICAgUXVhbnRpemVTcGVjdHJ1bShwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLApAQCAtMzQwLDE0ICszNDAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5nbG9iYWxHYWluLAogICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLnNjZiwKICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5xdWFudFNwZWMpOwotCisgICAgICAgCiAgICAgICBpZiAoY2FsY01heFZhbHVlSW5TZmIocHN5T3V0Q2hhbm5lbFtjaF0uc2ZiQ250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYk9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5xdWFudFNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkgewotICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDA7CisgICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB9CiAKICAgICAgIGNoRHluQml0cyA9IGR5bkJpdENvdW50KHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjLApAQCAtMzU5LDI0ICszNTksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLnNlY3Rpb25EYXRhKTsKLQorICAgICAgIAogICAgICAgaWYgKGNoRHluQml0cyA+PSBtYXhDaER5bkJpdHNbY2hdKSB7Ci0gICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsKKyAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KLQorICAgICAgIAogICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZCkgewogICAgICAgICBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gPSBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gKyAxOwogICAgICAgfQogCiAgICAgICBpdGVyID0gaXRlciArIDE7Ci0KKyAgICAgICAKICAgICB9IHdoaWxlKCFjb25zdHJhaW50c0Z1bGZpbGxlZCk7CiAKICAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIGNoRHluQml0czsKIAotICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrID0gcHN5T3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGUgID0gcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGU7CisgICAgcWNPdXRDaGFubmVsW2NoXS5tZGN0U2NhbGUgICAgPSBwc3lPdXRDaGFubmVsW2NoXS5tZGN0U2NhbGU7ICAgICAgICAgCisgICAgcWNPdXRDaGFubmVsW2NoXS5ncm91cGluZ01hc2sgPSBwc3lPdXRDaGFubmVsW2NoXS5ncm91cGluZ01hc2s7ICAgICAgCisgICAgcWNPdXRDaGFubmVsW2NoXS53aW5kb3dTaGFwZSAgPSBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTaGFwZTsgICAgICAgCiAgIH0KIAogICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KQEAgLTQxMSwxMyArNDExLDEzIEBACiAgIFdvcmQxNiBzZmJPZmZzLCBzZmI7CiAgIFdvcmQxNiBtYXhWYWx1ZUFsbDsKIAotICBtYXhWYWx1ZUFsbCA9IDA7CisgIG1heFZhbHVlQWxsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3Ioc2ZiT2Zmcz0wO3NmYk9mZnM8c2ZiQ250O3NmYk9mZnMrPXNmYlBlckdyb3VwKSB7CiAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBtYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKICAgICAgIFdvcmQxNiBsaW5lOwogICAgICAgV29yZDE2IG1heFRoaXNTZmI7Ci0gICAgICBtYXhUaGlzU2ZiID0gMDsKKyAgICAgIG1heFRoaXNTZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdOyBsaW5lIDwgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdOyBsaW5lKyspIHsKICAgICAgICAgV29yZDE2IGFic1ZhbDsKQEAgLTQyNSw3ICs0MjUsNyBAQAogICAgICAgICBtYXhUaGlzU2ZiID0gbWF4KG1heFRoaXNTZmIsIGFic1ZhbCk7CiAgICAgICB9CiAKLSAgICAgIG1heFZhbHVlW3NmYk9mZnMrc2ZiXSA9IG1heFRoaXNTZmI7CisgICAgICBtYXhWYWx1ZVtzZmJPZmZzK3NmYl0gPSBtYXhUaGlzU2ZiOyAgICAgICAgICAgICAgICAKICAgICAgIG1heFZhbHVlQWxsID0gbWF4KG1heFZhbHVlQWxsLCBtYXhUaGlzU2ZiKTsKICAgICB9CiAgIH0KQEAgLTQ0MSwxNSArNDQxLDE1IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgIHFjT3V0KQotCisgICAgICAgICAgICAgICAgICAKIHsKICAgRUxFTUVOVF9CSVRTICplbEJpdHM7Ci0KLSAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IDA7CisgCisgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBlbEJpdHMgPSAmcWNLZXJuZWwtPmVsZW1lbnRCaXRzOwogCi0KKyAgIAogICBpZiAoZWxCaXRzLT5hdmVyYWdlQml0cyA+IDApIHsKICAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCiAgICAgV29yZDE2IGJpdHNVc2VkOwpAQCAtNDYwLDggKzQ2MCw4IEBACiAgIH0KICAgZWxzZSB7CiAgICAgLyogdmFyaWFibGUgYml0cmF0ZSAqLwotICAgIGVsQml0cy0+Yml0UmVzTGV2ZWwgPSBlbEJpdHMtPm1heEJpdHM7Ci0gICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IHFjS2VybmVsLT5tYXhCaXRzVG90OworICAgIGVsQml0cy0+Yml0UmVzTGV2ZWwgPSBlbEJpdHMtPm1heEJpdHM7ICAgICAgICAgICAKKyAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gcWNLZXJuZWwtPm1heEJpdHNUb3Q7ICAgICAgCiAgIH0KIH0KIApAQCAtNDc2LDU1ICs0NzYsNTUgQEAKIHsKICAgV29yZDMyIG5GdWxsRmlsbEVsZW07CiAgIFdvcmQzMiB0b3RGaWxsQml0czsKLSAgV29yZDE2IGRpZmZCaXRzOworICBXb3JkMTYgZGlmZkJpdHM7ICAKICAgV29yZDE2IGJpdHNVc2VkOwogCi0gIHRvdEZpbGxCaXRzID0gMDsKKyAgdG90RmlsbEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCA9IHFjS2VybmVsLT5nbG9iU3RhdEJpdHM7CisgIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCA9IHFjS2VybmVsLT5nbG9iU3RhdEJpdHM7ICAgICAKICAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICs9IHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQ7CiAgIHFjT3V0LT50b3REeW5CaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQ7CiAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQ7CiAgIHFjT3V0LT50b3RGaWxsQml0cyAgICAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7Ci0KKyAgIAogICBpZiAocWNPdXQtPnFjRWxlbWVudC5maWxsQml0cykgewogICAgIHRvdEZpbGxCaXRzICs9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7CiAgIH0KIAogICBuRnVsbEZpbGxFbGVtID0gKG1heCgocWNPdXQtPnRvdEZpbGxCaXRzIC0gMSksIDApIC8gbWF4RmlsbEVsZW1CaXRzKSAqIG1heEZpbGxFbGVtQml0czsKLQorICAKICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzIC0gbkZ1bGxGaWxsRWxlbTsKIAogICAvKiBjaGVjayBmaWxsIGVsZW1lbnRzICovCi0KKyAgIAogICBpZiAocWNPdXQtPnRvdEZpbGxCaXRzID4gMCkgewogICAgIC8qIG1pbmltdW0gRmlsbGVsZW1lbnQgY29udGFpbnMgNyAoVEFHICsgYnl0ZSBjbnQpIGJpdHMgKi8KICAgICBxY091dC0+dG90RmlsbEJpdHMgPSBtYXgoNywgcWNPdXQtPnRvdEZpbGxCaXRzKTsKICAgICAvKiBmaWxsIGVsZW1lbnQgc2l6ZSBlcXVhbHMgbio4ICsgNyAqLwotICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyArICgoOCAtICgocWNPdXQtPnRvdEZpbGxCaXRzIC0gNykgJiAweDAwMDcpKSAmIDB4MDAwNyk7CisgICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgKCg4IC0gKChxY091dC0+dG90RmlsbEJpdHMgLSA3KSAmIDB4MDAwNykpICYgMHgwMDA3KTsgICAgIAogICB9CiAKICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgbkZ1bGxGaWxsRWxlbTsKIAogICAvKiBub3cgZGlzdHJpYnV0ZSBleHRyYSBmaWxsYml0cyBhbmQgYWxpZ25iaXRzIG92ZXIgY2hhbm5lbCBlbGVtZW50cyAqLwogICBxY091dC0+YWxpZ25CaXRzID0gNyAtICgocWNPdXQtPnRvdER5bkJpdHNVc2VkICsgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyAtIDEpICYgMHgwMDA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyAtIDEpICYgMHgwMDA3KTsgICAgICAgICAgICAgCiAKLQorICAgICAKICAgaWYgKCAocWNPdXQtPmFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzID09IDgpICYmCiAgICAgICAgKHFjT3V0LT50b3RGaWxsQml0cyA+IDgpKQogICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyAtIDg7CiAKLQorICAgCiAgIGRpZmZCaXRzID0gcWNPdXQtPmFsaWduQml0cyArIHFjT3V0LT50b3RGaWxsQml0cyAtIHRvdEZpbGxCaXRzOwotCisgICAKICAgaWYoZGlmZkJpdHM+PTApIHsKICAgICBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzICs9IGRpZmZCaXRzOwogICB9CiAKICAgYml0c1VzZWQgPSBxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQ7CiAgIGJpdHNVc2VkID0gYml0c1VzZWQgKyBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzOwotCisgICAKICAgaWYgKGJpdHNVc2VkID4gcWNLZXJuZWwtPm1heEJpdHNUb3QpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTU2NCw5ICs1NjQsOSBAQAogICBjb2RlQml0c0xhc3QgPSBoUUMtPmF2ZXJhZ2VCaXRzVG90IC0gaFFDLT5nbG9iU3RhdEJpdHM7CiAgIGNvZGVCaXRzICAgICA9IGZyYW1lTGVuIC0gaFFDLT5nbG9iU3RhdEJpdHM7CiAKLSAgLyogY2FsY3VsYXRlIGJpdHMgZm9yIGV2ZXJ5IGNoYW5uZWwgZWxlbWVudCAqLworICAvKiBjYWxjdWxhdGUgYml0cyBmb3IgZXZlcnkgY2hhbm5lbCBlbGVtZW50ICovICAgCiAgIGlmIChjb2RlQml0cyAhPSBjb2RlQml0c0xhc3QpIHsKLSAgICBXb3JkMTYgdG90YWxCaXRzID0gMDsKKyAgICBXb3JkMTYgdG90YWxCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAgIGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHMgPSAoaFFDLT5lbGVtZW50Qml0cy5yZWxhdGl2ZUJpdHMgKiBjb2RlQml0cykgPj4gMTY7IC8qIHJlbGF0aXZlQml0cyB3YXMgc2NhbGVkIGRvd24gYnkgMiAqLwogICAgIHRvdGFsQml0cyArPSBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzOwpAQCAtNTc0LDcgKzU3NCw3IEBACiAgICAgaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyA9IGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHMgKyAoY29kZUJpdHMgLSB0b3RhbEJpdHMpOwogICB9CiAKLSAgaFFDLT5hdmVyYWdlQml0c1RvdCA9IGZyYW1lTGVuOworICBoUUMtPmF2ZXJhZ2VCaXRzVG90ID0gZnJhbWVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcXVhbnRpemUuYwppbmRleCA1NGFkZDJmLi45NzM1NTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3F1YW50aXplLmMKQEAgLTM0LDMyICszNCwzMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKLSogZnVuY3Rpb24gbmFtZTpwb3czNAotKiBkZXNjcmlwdGlvbjogY2FsY3VsYXRlICR4XntcZnJhY3szfXs0fX0sIGZvciAwLjUgPCB4IDwgMS4wJC4KKyogZnVuY3Rpb24gbmFtZTpwb3czNCAKKyogZGVzY3JpcHRpb246IGNhbGN1bGF0ZSAkeF57XGZyYWN7M317NH19LCBmb3IgMC41IDwgeCA8IDEuMCQuICAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogX19pbmxpbmUgV29yZDMyIHBvdzM0KFdvcmQzMiB4KQogewogICAvKiBpbmRleCB0YWJsZSB1c2luZyBNQU5UX0RJR0lUUyBiaXRzLCBidXQgbWFzayBvdXQgdGhlIHNpZ24gYml0IGFuZCB0aGUgTVNCCi0gICAgIHdoaWNoIGlzIGFsd2F5cyBvbmUgKi8KKyAgICAgd2hpY2ggaXMgYWx3YXlzIG9uZSAqLyAgIAogICByZXR1cm4gbVRhYl8zXzRbKHggPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmIChNQU5UX1NJWkUtMSldOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgotKiBmdW5jdGlvbiBuYW1lOnF1YW50aXplU2luZ2xlTGluZQotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHNwZWN0cnVtCi0qICAgICAgICAgICAgICBxdWFTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bV4zLzQqMl4oLSgzLzE2KSpnYWluKQorKiBmdW5jdGlvbiBuYW1lOnF1YW50aXplU2luZ2xlTGluZSAKKyogZGVzY3JpcHRpb246IHF1YW50aXplcyBzcGVjdHJ1bSAgCisqICAgICAgICAgICAgICBxdWFTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bV4zLzQqMl4oLSgzLzE2KSpnYWluKSAgICAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIFdvcmQxNiBxdWFudGl6ZVNpbmdsZUxpbmUoY29uc3QgV29yZDE2IGdhaW4sIGNvbnN0IFdvcmQzMiBhYnNTcGVjdHJ1bSkKIHsKICAgV29yZDMyIGUsIG1pbnVzRmluYWxFeHAsIGZpbmFsU2hpZnQ7CiAgIFdvcmQzMiB4OwotICBXb3JkMTYgcXVhID0gMDsKKyAgV29yZDE2IHF1YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCiAKLQorICAgCiAgIGlmIChhYnNTcGVjdHJ1bSkgewogICAgIGUgPSBub3JtX2woYWJzU3BlY3RydW0pOwogICAgIHggPSBwb3czNChhYnNTcGVjdHJ1bSA8PCBlKTsKQEAgLTcxLDcgKzcxLDcgQEAKIAogICAgIC8qIHNlcGFyYXRlIHRoZSBleHBvbmVudCBpbnRvIGEgc2hpZnQsIGFuZCBhIG11bHRpcGx5ICovCiAgICAgZmluYWxTaGlmdCA9IG1pbnVzRmluYWxFeHAgPj4gNDsKLQorICAgICAKICAgICBpZiAoZmluYWxTaGlmdCA8IElOVF9CSVRTKSB7CiAgICAgICB4ID0gTF9tcHlfd3goeCwgcG93MnRvbWludXNOb3ZlcjE2W21pbnVzRmluYWxFeHAgJiAxNV0pOwogCkBAIC04NCw3ICs4NCw3IEBACiAJCSAgeCA+Pj0gZmluYWxTaGlmdDsKIAkgIGVsc2UKIAkJICB4IDw8PSAoLWZpbmFsU2hpZnQpOwotCisJCQogCSAgcXVhID0gc2F0dXJhdGUoeCk7CiAgICAgfQogICB9CkBAIC05NCwxMCArOTQsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCi0qIGZ1bmN0aW9uIG5hbWU6cXVhbnRpemVMaW5lcwotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHNwZWN0cnVtIGxpbmVzCi0qICAgICAgICAgICAgICBxdWFTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bV4zLzQqMl4oLSgzLzE2KSpnYWluKQotKiAgaW5wdXQ6IGdsb2JhbCBnYWluLCBudW1iZXIgb2YgbGluZXMgdG8gcHJvY2Vzcywgc3BlY3RyYWwgZGF0YQorKiBmdW5jdGlvbiBuYW1lOnF1YW50aXplTGluZXMgCisqIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMgIAorKiAgICAgICAgICAgICAgcXVhU3BlY3RydW0gPSBtZGN0U3BlY3RydW1eMy80KjJeKC0oMy8xNikqZ2FpbikgICAgCisqICBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLCBzcGVjdHJhbCBkYXRhICAgICAgICAgCiAqICBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTYsMTUgKzExNiwxNSBAQAogICBwcXVhdCA9IHF1YW50Qm9yZGVyc1ttXTsKIAogICBnICs9IDE2OwotCisgIAogICBpZihnID49IDApCiAgIHsKIAlmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewogCSAgV29yZDMyIHF1YTsKLQkgIHF1YSA9IDA7Ci0KKwkgIHF1YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKIAkgIG1kY3RTcGVMID0gbWRjdFNwZWN0cnVtW2xpbmVdOwotCisJCiAJICBpZiAobWRjdFNwZUwpIHsKIAkJV29yZDMyIHNhOwogCQlXb3JkMzIgc2FTaGZ0OwpAQCAtMTM0LDI3ICsxMzQsMjcgQEAKIAkgICAgc2FTaGZ0ID0gc2EgPj4gZzsKIAogICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKLQorICAgICAgICAgCiAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAxIDogLTE7CiAJCSAgfQogICAgICAgICAgIGVsc2UgewotCisgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0KKyAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMiA6IC0yOwogCQkJfQogICAgICAgICAgICAgZWxzZSB7Ci0KKyAgICAgICAgICAgICAKICAgICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7Ci0KKyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKIAkJCSAgfQogICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwogICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLwotCisgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAobWRjdFNwZUwgPCAwKQogICAgICAgICAgICAgICAgICAgcXVhID0gLXF1YTsKIAkJCSAgfQpAQCAtMTYyLDE3ICsxNjIsMTcgQEAKIAkJICB9CiAJCX0KIAkgIH0KLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsKKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAgIH0KICAgZWxzZQogICB7CiAJZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKIAkgIFdvcmQzMiBxdWE7Ci0JICBxdWEgPSAwOwotCisJICBxdWEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCiAJICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKLQorCQogCSAgaWYgKG1kY3RTcGVMKSB7CiAJCVdvcmQzMiBzYTsKIAkJV29yZDMyIHNhU2hmdDsKQEAgLTE4MSwyNyArMTgxLDI3IEBACiAgICAgICAgIHNhU2hmdCA9IHNhIDw8IGc7CiAKICAgICAgICAgaWYgKHNhU2hmdCA+IHBxdWF0WzBdKSB7Ci0KKyAgICAgICAgIAogICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCisgICAgICAgICAgICAgCiAgICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOwogCQkgIH0KICAgICAgICAgICBlbHNlIHsKLQorICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgewotCisgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKIAkJCX0KICAgICAgICAgICAgIGVsc2UgewotCisgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCisgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAzIDogLTM7CiAJCQkgIH0KICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsKICAgICAgICAgICAgICAgICAvKiBhZGp1c3QgdGhlIHNpZ24uIFNpbmNlIDAgPCBxdWEgPCAxLCB0aGlzIGNhbm5vdCBvdmVyZmxvdy4gKi8KLQorICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKICAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7CiAJCQkgIH0KQEAgLTIwOSw4ICsyMDksOCBAQAogCQkgIH0KIAkJfQogCSAgfQotICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSBxdWEgOwotCX0KKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl9CSAgCiAgIH0KIAogfQpAQCAtMjE4LDEwICsyMTgsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCi0qIGZ1bmN0aW9uIG5hbWU6aXF1YW50aXplTGluZXMKKyogZnVuY3Rpb24gbmFtZTppcXVhbnRpemVMaW5lcyAKICogZGVzY3JpcHRpb246IGlxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMgd2l0aG91dCBzaWduCi0qICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gPSBpcXVhU3BlY3RydW1eNC8zICoyXigwLjI1KmdhaW4pCi0qIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MscXVhbnRpemVkIHNwZWN0cnVtCisqICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gPSBpcXVhU3BlY3RydW1eNC8zICoyXigwLjI1KmdhaW4pIAorKiBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLHF1YW50aXplZCBzcGVjdHJ1bSAgICAgICAgCiAqIG91dHB1dDogc3BlY3RyYWwgZGF0YQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzQsMTEgKzIzNCwxMSBAQAogICBXb3JkMzIgICBpcXVhbnRpemVyc2hpZnQ7CiAgIFdvcmQzMiAgIGxpbmU7CiAKLSAgaXF1YW50aXplcm1vZCA9IGdhaW4gJiAzOworICBpcXVhbnRpemVybW9kID0gZ2FpbiAmIDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGlxdWFudGl6ZXJzaGlmdCA9IGdhaW4gPj4gMjsKIAogICBmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewotCisgICAgIAogICAgIGlmKCBxdWFudFNwZWN0cnVtW2xpbmVdICE9IDAgKSB7CiAgICAgICBXb3JkMzIgYWNjdTsKICAgICAgIFdvcmQzMiBleDsKQEAgLTI1MiwxOSArMjUyLDE5IEBACiAgICAgICBhY2N1ID0gYWNjdSA8PCBleDsKICAgICAgIHNwZWNFeHAgPSBJTlRfQklUUy0xIC0gZXg7CiAKLSAgICAgIHRhYkluZGV4ID0gKGFjY3UgPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsKKyAgICAgIHRhYkluZGV4ID0gKGFjY3UgPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsgICAgICAgIAogCiAgICAgICAvKiBjYWxjdWxhdGUgIm1hbnRpc3NhIiBeNC8zICovCi0gICAgICBzID0gbVRhYl80XzNbdGFiSW5kZXhdOworICAgICAgcyA9IG1UYWJfNF8zW3RhYkluZGV4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgbXVsdGlwbGllciBmb3Igc3BlY0V4cF4zLzQgY29tYmluZWQgd2l0aCBzY2ZNb2QgKi8KLSAgICAgIHQgPSBzcGVjRXhwTWFudFRhYmxlQ29tYl9lbmNbaXF1YW50aXplcm1vZF1bc3BlY0V4cF07CisgICAgICB0ID0gc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOyAgICAgICAgICAgICAgICAgICAgICAKIAogICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLwogICAgICAgYWNjdSA9IE1VTEhJR0gocywgdCk7CiAKICAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLwotICAgICAgc3BlY0V4cCA9IHNwZWNFeHBUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOworICAgICAgc3BlY0V4cCA9IHNwZWNFeHBUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOyAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgIHNwZWNFeHAgKz0gaXF1YW50aXplcnNoaWZ0ICsgMTsKIAkgIGlmKHNwZWNFeHAgPj0gMCkKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQkgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IGFjY3UgPj4gKC1zcGVjRXhwKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSAwOworICAgICAgbWRjdFNwZWN0cnVtW2xpbmVdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICB9CiB9CkBAIC0zMDEsNyArMzAxLDcgQEAKICAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgewogICAgIFdvcmQzMiBzZmJOZXh0IDsKICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIgPSBzZmJOZXh0KSB7Ci0gICAgICBXb3JkMTYgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJdOworICAgICAgV29yZDE2IHNjYWxlZmFjdG9yID0gc2NhbGVmYWN0b3JzW3NmYk9mZnMrc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgLyogY29hbGVzY2Ugc2ZicyB3aXRoIHRoZSBzYW1lIHNjYWxlZmFjdG9yICovCiAgICAgICBmb3IgKHNmYk5leHQgPSBzZmIrMTsKICAgICAgICAgICAgc2ZiTmV4dCA8IG1heFNmYlBlckdyb3VwICYmIHNjYWxlZmFjdG9yID09IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYk5leHRdOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgotKiBmdW5jdGlvbiBuYW1lOmNhbGNTZmJEaXN0CisqIGZ1bmN0aW9uIG5hbWU6Y2FsY1NmYkRpc3QgCiAqIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgYW5kIHJlcXVhbnRpemVzIGxpbmVzIHRvIGNhbGN1bGF0ZSBkaXN0b3J0aW9uCiAqIGlucHV0OiAgbnVtYmVyIG9mIGxpbmVzIHRvIGJlIHF1YW50aXplZCwgLi4uCiAqIG91dHB1dDogZGlzdG9ydGlvbgpAQCAtMzM4LDE0ICszMzgsMTQgQEAKIAogICBwcXVhdCA9IHF1YW50Qm9yZGVyc1ttXTsKICAgcmVwcXVhdCA9IHF1YW50UmVjb25bbV07Ci0KLSAgZGlzdCA9IDA7CisJCisgIGRpc3QgPSAwOyAgCiAgIGcgKz0gMTY7CiAgIGlmKGcyIDwgMCAmJiBnID49IDApCi0gIHsKKyAgewkgIAogCSAgZzIgPSAtZzI7Ci0JICBmb3IobGluZT0wOyBsaW5lPHNmYldpZHRoOyBsaW5lKyspIHsKLQkJICBpZiAoc3BlY1tsaW5lXSkgeworCSAgZm9yKGxpbmU9MDsgbGluZTxzZmJXaWR0aDsgbGluZSsrKSB7CQkgIAorCQkgIGlmIChzcGVjW2xpbmVdKSB7CQkJICAKIAkJCSAgV29yZDMyIGRpZmY7CiAJCQkgIFdvcmQzMiBkaXN0U2luZ2xlOwogCQkJICBXb3JkMzIgc2E7CkBAIC0zNTksMTkgKzM1OSwxOSBAQAogCQkJCSAgZGlzdFNpbmdsZSA9IChzYVNoZnQgKiBzYVNoZnQpID4+IGcyOwogCQkJICB9CiAJCQkgIGVsc2UgewotCisJCQkJICAKIAkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewogCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOwogCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwogCQkJCSAgfQogCQkJCSAgZWxzZSB7Ci0KKwkJCQkJICAKIAkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKIAkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMV07CiAJCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwogCQkJCQkgIH0KIAkJCQkJICBlbHNlIHsKLQorCQkJCQkJICAKIAkJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7CiAJCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsyXTsKIAkJCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwpAQCAtMzg3LDE1ICszODcsMTUgQEAKIAkJCQkJICB9CiAJCQkJICB9CiAJCQkgIH0KLQorCQkJICAKIAkJCSAgZGlzdCA9IExfYWRkKGRpc3QsIGRpc3RTaW5nbGUpOwogCQkgIH0KIAkgIH0KICAgfQogICBlbHNlCiAgIHsKLQkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewotCQkgIGlmIChzcGVjW2xpbmVdKSB7CisJICBmb3IobGluZT0wOyBsaW5lPHNmYldpZHRoOyBsaW5lKyspIHsJCSAgCisJCSAgaWYgKHNwZWNbbGluZV0pIHsJCQkgIAogCQkJICBXb3JkMzIgZGlmZjsKIAkJCSAgV29yZDMyIGRpc3RTaW5nbGU7CiAJCQkgIFdvcmQzMiBzYTsKQEAgLTQwOCwxOSArNDA4LDE5IEBACiAJCQkJICBkaXN0U2luZ2xlID0gTF9zaGwoKHNhU2hmdCAqIHNhU2hmdCksIGcyKTsKIAkJCSAgfQogCQkJICBlbHNlIHsKLQorCQkJCSAgCiAJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMV0pIHsKIAkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFswXTsKIAkJCQkJICBkaXN0U2luZ2xlID0gTF9zaGwoKGRpZmYgKiBkaWZmKSwgZzIpOwogCQkJCSAgfQogCQkJCSAgZWxzZSB7Ci0KKwkJCQkJICAKIAkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKIAkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMV07CiAJCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7CiAJCQkJCSAgfQogCQkJCQkgIGVsc2UgewotCisJCQkJCQkgIAogCQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbM10pIHsKIAkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOwogCQkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCQkJICB9CiAJCQkgIGRpc3QgPSBMX2FkZChkaXN0LCBkaXN0U2luZ2xlKTsKIAkJICB9Ci0JICB9CisJICB9CSAgCiAgIH0KIAogICByZXR1cm4gZGlzdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCmluZGV4IGZlNDAxMzcuLmZmZTJlODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYwpAQCAtMzAsMTcgKzMwLDE3IEBACiBzdGF0aWMgY29uc3QgV29yZDE2IE1BWF9TQ0ZfREVMVEEgPSA2MDsKIAogLyohCi1jb25zdGFudHMgcmVmZXJlbmNlIGluIGNvbW1lbnRzCitjb25zdGFudHMgcmVmZXJlbmNlIGluIGNvbW1lbnRzIAogCiAgQzAgPSA2Ljc1ZjsKLSBDMSA9IC02OS4zMzI5NWY7ICAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikKKyBDMSA9IC02OS4zMzI5NWY7ICAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikgCiAgQzIgPSA0LjBmOwogIEMzID0gMi42NjY2NjY2NmY7Ci0KLSAgUEVfQzEgPSAzLjBmOyAgICAgICAgbG9nKDguMCkvbG9nKDIpCi0gIFBFX0MyID0gMS4zMjE5MjgxZjsgIGxvZygyLjUpL2xvZygyKQotICBQRV9DMyA9IDAuNTU5MzU3M2Y7ICAxLUMyL0MxCi0KKyAKKyAgUEVfQzEgPSAzLjBmOyAgICAgICAgbG9nKDguMCkvbG9nKDIpIAorICBQRV9DMiA9IDEuMzIxOTI4MWY7ICBsb2coMi41KS9sb2coMikgCisgIFBFX0MzID0gMC41NTkzNTczZjsgIDEtQzIvQzEgCisgIAogKi8KIAogI2RlZmluZSBGRl9TUVJUX0JJVFMgICAgICAgICAgICAgICAgICAgIDcKQEAgLTU1LDE1ICs1NSwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBmb3JtZmFjX3NxcnQKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHNxcnQoeCkvMjU2CisqIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBzcXJ0KHgpLzI1NiAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBfX2lubGluZSBXb3JkMzIgZm9ybWZhY19zcXJ0KFdvcmQzMiB4KQogewogCVdvcmQzMiB5OwogCVdvcmQzMiBwcmVzaGlmdCwgcG9zdHNoaWZ0OwotCi0KKwkKKwkKIAlpZiAoeD09MCkgcmV0dXJuIDA7CiAJcHJlc2hpZnQgID0gbm9ybV9sKHgpIC0gKElOVF9CSVRTLTEtRkZfU1FSVF9CSVRTKTsKIAlwb3N0c2hpZnQgPSBwcmVzaGlmdCA+PiAxOwpAQCAtNzQsMTIgKzc0LDEyIEBACiAJZWxzZQogCQl5ID0geCA+PiAoLXByZXNoaWZ0KTsKIAl5ID0gZm9ybWZhY19zcXJ0dGFibGVbeS0zMl07Ci0KKwkKIAlpZihwb3N0c2hpZnQgPj0gMCkKIAkJeSA9IHkgPj4gcG9zdHNoaWZ0OwogCWVsc2UKIAkJeSA9IHkgPDwgKC1wb3N0c2hpZnQpOwotCisJCiAJcmV0dXJuIHk7CiB9CiAKQEAgLTEwMCwxOSArMTAwLDE5IEBACiAJV29yZDMyIHNmYncsIHNmYncxOwogCVdvcmQzMiBpLCBqOwogCVdvcmQzMiBzZmJPZmZzLCBzZmIsIHNoaWZ0OwotCisJCiAJc2ZidyA9IHNmYncxID0gMDsKIAlmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKIAkJZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCQkJaSA9IHNmYk9mZnMrc2ZiOwotCisJCQlpID0gc2ZiT2ZmcytzZmI7ICAgICAgCisJCQkKIAkJCWlmIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV0pIHsKIAkJCQlXb3JkMzIgYWNjdSwgYXZnRm9ybUZhY3RvcixpU2ZiV2lkdGg7CiAJCQkJV29yZDMyICptZGN0U3BlYzsKIAkJCQlzZmJ3ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKIAkJCQlpU2ZiV2lkdGggPSBpbnZTQkZbKHNmYncgPj4gMikgLSAxXTsKIAkJCQltZGN0U3BlYyA9IHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArIHBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07Ci0JCQkJYWNjdSA9IDA7CisJCQkJYWNjdSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQkvKiBjYWxjIHN1bSBvZiBzcXJ0KHNwZWMpICovCiAJCQkJZm9yIChqPXNmYnc7IGo7IGotLSkgewogCQkJCQlhY2N1ICs9IGZvcm1mYWNfc3FydChMX2FicygqbWRjdFNwZWMpKTsgbWRjdFNwZWMrKzsKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJfQogCQkJZWxzZSB7CiAJCQkJLyogc2V0IG51bWJlciBvZiBsaW5lcyB0byB6ZXJvICovCi0JCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAwOworCQkJCXNmYk5SZWxldmFudExpbmVzW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQl9CiAJCX0KIAl9CkBAIC0xNDEsNjggKzE0MSw2OCBAQAogKiBkZXNjcmlwdGlvbjogIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBpbXByb3ZlU2NmKFdvcmQzMiAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgdGhyZXNoLAorc3RhdGljIFdvcmQxNiBpbXByb3ZlU2NmKFdvcmQzMiAqc3BlYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBzZmJXaWR0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICB0aHJlc2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKmRpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCkKIHsKIAlXb3JkMzIgY250OwogCVdvcmQzMiBzZmJEaXN0OwogCVdvcmQzMiBzY2ZCZXN0OwogCVdvcmQzMiB0aHJlc2gxMjUgPSBMX2FkZCh0aHJlc2gsICh0aHJlc2ggPj4gMikpOwotCi0Jc2NmQmVzdCA9IHNjZjsKLQorCQorCXNjZkJlc3QgPSBzY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQogCS8qIGNhbGMgcmVhbCBkaXN0b3J0aW9uICovCiAJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOwotCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOworCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOyAgICAgCiAJaWYoIXNmYkRpc3QpCiAJICByZXR1cm4gc2NmQmVzdDsKLQorCQogCWlmIChzZmJEaXN0ID4gdGhyZXNoMTI1KSB7CiAJCVdvcmQzMiBzY2ZFc3RpbWF0ZWQ7CiAJCVdvcmQzMiBzZmJEaXN0QmVzdDsKLQkJc2NmRXN0aW1hdGVkID0gc2NmOwotCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7Ci0KLQkJY250ID0gMDsKKwkJc2NmRXN0aW1hdGVkID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkKKwkJY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCXdoaWxlIChzZmJEaXN0ID4gdGhyZXNoMTI1ICYmIChjbnQgPCAzKSkgewotCisJCQkKIAkJCXNjZiA9IHNjZiArIDE7CiAJCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KKwkJCQogCQkJaWYgKHNmYkRpc3QgPCBzZmJEaXN0QmVzdCkgewotCQkJCXNjZkJlc3QgPSBzY2Y7Ci0JCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OworCQkJCXNjZkJlc3QgPSBzY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJfQogCQkJY250ID0gY250ICsgMTsKIAkJfQotCQljbnQgPSAwOwotCQlzY2YgPSBzY2ZFc3RpbWF0ZWQ7Ci0JCXNmYkRpc3QgPSBzZmJEaXN0QmVzdDsKKwkJY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXNjZiA9IHNjZkVzdGltYXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlzZmJEaXN0ID0gc2ZiRGlzdEJlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJd2hpbGUgKChzZmJEaXN0ID4gdGhyZXNoMTI1KSAmJiAoY250IDwgMSkgJiYgKHNjZiA+IG1pblNjZikpIHsKLQorCQkJCiAJCQlzY2YgPSBzY2YgLSAxOwogCQkJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOwotCisJCQkKIAkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKKwkJCQlzY2ZCZXN0ID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCX0KLQkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOworCQkJKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQljbnQgPSBjbnQgKyAxOwogCQl9Ci0JCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7CisJCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAllbHNlIHsKLQkJV29yZDMyIHNmYkRpc3RCZXN0OworCQlXb3JkMzIgc2ZiRGlzdEJlc3Q7IAogCQlXb3JkMzIgc2ZiRGlzdEFsbG93ZWQ7CiAJCVdvcmQzMiB0aHJlc2gwOCA9IGZpeG11bChDT0VGMDhfMzEsIHRocmVzaCk7Ci0JCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQorCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCiAJCWlmIChzZmJEaXN0IDwgdGhyZXNoMDgpCiAJCQlzZmJEaXN0QWxsb3dlZCA9IHNmYkRpc3Q7CiAJCWVsc2UKQEAgLTIxMCwxNiArMjEwLDE2IEBACiAJCWZvciAoY250PTA7IGNudDwzOyBjbnQrKykgewogCQkJc2NmID0gc2NmICsgMTsKIAkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKLQorCQkJCiAJCQlpZiAoZml4bXVsKENPRUYwOF8zMSxzZmJEaXN0KSA8IHNmYkRpc3RBbGxvd2VkKSB7CiAJCQkJKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2ZCZXN0ICsgMTsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKKwkJCQlzY2ZCZXN0ID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCX0KIAkJfQotCQkqZGlzdCA9IHNmYkRpc3RCZXN0OworCQkqZGlzdCA9IHNmYkRpc3RCZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl9Ci0KKwkKIAkvKiByZXR1cm4gYmVzdCBzY2FsZWZhY3RvciAqLwogCXJldHVybiBzY2ZCZXN0OwogfQpAQCAtMjMzLDEwICsyMzMsMTAgQEAKIHN0YXRpYyBXb3JkMTYgY291bnRTaW5nbGVTY2ZCaXRzKFdvcmQxNiBzY2YsIFdvcmQxNiBzY2ZMZWZ0LCBXb3JkMTYgc2NmUmlnaHQpCiB7CiAJV29yZDE2IHNjZkJpdHM7Ci0KKwkKIAlzY2ZCaXRzID0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZkxlZnQgLSBzY2YpICsKIAkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZiAtIHNjZlJpZ2h0KTsKLQorCQogCXJldHVybiBzY2ZCaXRzOwogfQogCkBAIC0yNDUsNyArMjQ1LDcgQEAKICogZnVuY3Rpb24gbmFtZTogY2FsY1NpbmdsZVNwZWNQZQogKiBkZXNjcmlwdGlvbjogIGxkUmF0aW8gPSBsb2cyKGVuKG4pKSAtIDAsMzc1KnNjZkdhaW4obikKICoJCQkJbmJpdHMgPSAwLjcqbkxpbmVzKmxkUmF0aW9uIGZvciBsZFJhdGlvbiA+PSBjMQotKgkJCQluYml0cyA9IDAuNypuTGluZXMqKGMyICsgYzMqbGRSYXRpbykgZm9yIGxkUmF0aW9uIDwgYzEKKyoJCQkJbmJpdHMgPSAwLjcqbkxpbmVzKihjMiArIGMzKmxkUmF0aW8pIGZvciBsZFJhdGlvbiA8IGMxIAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBXb3JkMTYgY2FsY1NpbmdsZVNwZWNQZShXb3JkMTYgc2NmLCBXb3JkMTYgc2ZiQ29uc3RQZVBhcnQsIFdvcmQxNiBuTGluZXMpCkBAIC0yNTMsMTggKzI1MywxOCBAQAogCVdvcmQzMiBzcGVjUGU7CiAJV29yZDMyIGxkUmF0aW87CiAJV29yZDMyIHNjZjM7Ci0KKwkKIAlsZFJhdGlvID0gc2ZiQ29uc3RQZVBhcnQgPDwgMzsgLyogIChzZmJDb25zdFBlUGFydCAtMC4zNzUqc2NmKSo4ICovCiAJc2NmMyA9IHNjZiArIHNjZiArIHNjZjsKIAlsZFJhdGlvID0gbGRSYXRpbyAtIHNjZjM7Ci0KKyAgICAKIAlpZiAobGRSYXRpbyA8IFBFX0MxXzgpIHsKLQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KKwkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8gCiAJCWxkUmF0aW8gPSAobGRSYXRpbyArIFBFX0MyXzE2KSA+PiAxOwogCX0KIAlzcGVjUGUgPSBuTGluZXMgKiBsZFJhdGlvOwogCXNwZWNQZSA9IChzcGVjUGUgKiBQRV9TQ0FMRSkgPj4gMTQ7Ci0KKwkKIAlyZXR1cm4gc2F0dXJhdGUoc3BlY1BlKTsKIH0KIApAQCAtMjc1LDUzICsyNzUsNTMgQEAKICogZGVzY3JpcHRpb246ICBjb3VudCBkaWZmZXJlbnQgc2NmIGJpdHMgdXNlZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY291bnRTY2ZCaXRzRGlmZihXb3JkMTYgKnNjZk9sZCwgV29yZDE2ICpzY2ZOZXcsCitzdGF0aWMgV29yZDE2IGNvdW50U2NmQml0c0RpZmYoV29yZDE2ICpzY2ZPbGQsIFdvcmQxNiAqc2NmTmV3LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiQ250LCBXb3JkMTYgc3RhcnRTZmIsIFdvcmQxNiBzdG9wU2ZiKQogewogCVdvcmQzMiBzY2ZCaXRzRGlmZjsKIAlXb3JkMzIgc2ZiLCBzZmJMYXN0OwogCVdvcmQzMiBzZmJQcmV2LCBzZmJOZXh0OwotCi0Jc2NmQml0c0RpZmYgPSAwOwotCXNmYiA9IDA7Ci0KKwkKKwlzY2ZCaXRzRGlmZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJc2ZiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQogCS8qIHNlYXJjaCBmb3IgZmlyc3QgcmVsZXZhbnQgc2ZiICovCi0Jc2ZiTGFzdCA9IHN0YXJ0U2ZiOworCXNmYkxhc3QgPSBzdGFydFNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl3aGlsZSAoc2ZiTGFzdCA8IHN0b3BTZmIgJiYgc2NmT2xkW3NmYkxhc3RdID09IFZPQUFDX1NIUlRfTUlOKSB7Ci0KKwkJCiAJCXNmYkxhc3QgPSBzZmJMYXN0ICsgMTsKIAl9CiAJLyogc2VhcmNoIGZvciBwcmV2aW91cyByZWxldmFudCBzZmIgYW5kIGNvdW50IGRpZmYgKi8KIAlzZmJQcmV2ID0gc3RhcnRTZmIgLSAxOwogCXdoaWxlICgoc2ZiUHJldj49MCkgJiYgc2NmT2xkW3NmYlByZXZdID09IFZPQUFDX1NIUlRfTUlOKSB7Ci0KKwkJCiAJCXNmYlByZXYgPSBzZmJQcmV2IC0gMTsKIAl9Ci0KKwkKIAlpZiAoc2ZiUHJldj49MCkgewogCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYlByZXZdIC0gc2NmTmV3W3NmYkxhc3RdKSAtCiAJCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYlByZXZdIC0gc2NmT2xkW3NmYkxhc3RdKTsKIAl9CiAJLyogbm93IGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgZGlmZnMgb2YgcmVsZXZhbnQgc2ZicyAqLwogCWZvciAoc2ZiPXNmYkxhc3QrMTsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KKwkJCiAJCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewogCQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJdKSAtCiAJCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJdKTsKLQkJCXNmYkxhc3QgPSBzZmI7CisJCQlzZmJMYXN0ID0gc2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJfQogCX0KIAkvKiBzZWFyY2ggZm9yIG5leHQgcmVsZXZhbnQgc2ZiIGFuZCBjb3VudCBkaWZmICovCi0Jc2ZiTmV4dCA9IHN0b3BTZmI7CisJc2ZiTmV4dCA9IHN0b3BTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCXdoaWxlIChzZmJOZXh0IDwgc2ZiQ250ICYmIHNjZk9sZFtzZmJOZXh0XSA9PSBWT0FBQ19TSFJUX01JTikgewotCisJCQogCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7CiAJfQotCisJCiAJaWYgKHNmYk5leHQgPCBzZmJDbnQpCiAJCXNjZkJpdHNEaWZmICs9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZOZXdbc2ZiTGFzdF0gLSBzY2ZOZXdbc2ZiTmV4dF0pIC0KIAkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJOZXh0XSk7Ci0KKwkKIAlyZXR1cm4gc2F0dXJhdGUoc2NmQml0c0RpZmYpOwogfQogCkBAIC0zMzEsNTIgKzMzMSw1MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RhcnRTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGFydFNmYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wU2ZiKQogewogCVdvcmQzMiBzcGVjUGVEaWZmOwogCVdvcmQzMiBzZmI7Ci0KLQlzcGVjUGVEaWZmID0gMDsKLQorCQorCXNwZWNQZURpZmYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKIAkvKiBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IHBlIGRpZmZlcmVuY2UgKi8KIAlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQorCQkKKwkJCiAJCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewogCQkJV29yZDMyIGxkUmF0aW9PbGQsIGxkUmF0aW9OZXc7CiAJCQlXb3JkMzIgc2NmMzsKLQotCisJCQkKKwkJCQogCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYl0gPT0gTUlOXzE2KSB7CiAJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9ICgobG9nU2ZiRW5lcmd5W3NmYl0gLQogCQkJCQlsb2dTZmJGb3JtRmFjdG9yW3NmYl0pICsgMTEtOCo0KzMpID4+IDI7CiAJCQl9Ci0KLQorCQkJCisJCQkKIAkJCWxkUmF0aW9PbGQgPSBzZmJDb25zdFBlUGFydFtzZmJdIDw8IDM7CiAJCQlzY2YzID0gc2NmT2xkW3NmYl0gKyBzY2ZPbGRbc2ZiXSArIHNjZk9sZFtzZmJdOwogCQkJbGRSYXRpb09sZCA9IGxkUmF0aW9PbGQgLSBzY2YzOwogCQkJbGRSYXRpb05ldyA9IHNmYkNvbnN0UGVQYXJ0W3NmYl0gPDwgMzsKIAkJCXNjZjMgPSBzY2ZOZXdbc2ZiXSArIHNjZk5ld1tzZmJdICsgc2NmTmV3W3NmYl07CiAJCQlsZFJhdGlvTmV3ID0gbGRSYXRpb05ldyAtIHNjZjM7Ci0KKwkJCQogCQkJaWYgKGxkUmF0aW9PbGQgPCBQRV9DMV84KSB7CiAJCQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KIAkJCQlsZFJhdGlvT2xkID0gKGxkUmF0aW9PbGQgKyBQRV9DMl8xNikgPj4gMTsKIAkJCX0KLQorCQkJCiAJCQlpZiAobGRSYXRpb05ldyA8IFBFX0MxXzgpIHsKIAkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwogCQkJCWxkUmF0aW9OZXcgPSAobGRSYXRpb05ldyArIFBFX0MyXzE2KSA+PiAxOwogCQkJfQotCisJCQkKIAkJCXNwZWNQZURpZmYgKz0gIHNmYk5SZWxldmFudExpbmVzW3NmYl0gKiAobGRSYXRpb05ldyAtIGxkUmF0aW9PbGQpOwogCQl9CiAJfQotCisJCiAJc3BlY1BlRGlmZiA9IChzcGVjUGVEaWZmICogUEVfU0NBTEUpID4+IDE0OwotCisJCiAJcmV0dXJuIHNhdHVyYXRlKHNwZWNQZURpZmYpOwogfQogCkBAIC0zOTAsOSArMzkwLDkgQEAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBhc3NpbWlsYXRlU2luZ2xlU2NmKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJDb25zdFBlUGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJFbmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKQEAgLTQxMSw5NCArNDExLDk0IEBACiAJV29yZDE2ICpwcmV2U2NmTmV4dCA9IHBzeU91dENoYW4tPnByZXZTY2ZOZXh0OwogCVdvcmQxNiAqZGVsdGFQZUxhc3QgPSBwc3lPdXRDaGFuLT5kZWx0YVBlTGFzdDsKIAlGbGFnICAgdXBkYXRlTWluU2NmQ2FsY3VsYXRlZDsKLQotCXN1Y2Nlc3MgPSAwOwotCWRlbHRhUGUgPSAwOwotCisJCisJc3VjY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJZGVsdGFQZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCiAJZm9yKGo9MDtqPHBzeU91dENoYW4tPnNmYkNudDtqKyspewotCQlwcmV2U2NmTGFzdFtqXSA9IE1BWF8xNjsKLQkJcHJldlNjZk5leHRbal0gPSBNQVhfMTY7Ci0JCWRlbHRhUGVMYXN0W2pdID0gTUFYXzE2OworCQlwcmV2U2NmTGFzdFtqXSA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXByZXZTY2ZOZXh0W2pdID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZGVsdGFQZUxhc3Rbal0gPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KLQotCXNmYkxhc3QgPSAtMTsKLQlzZmJBY3QgPSAtMTsKLQlzZmJOZXh0ID0gLTE7CisJCisJc2ZiTGFzdCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJc2ZiQWN0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJc2ZiTmV4dCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJc2NmTGFzdCA9IDA7CiAJc2NmTmV4dCA9IDA7Ci0Jc2NmTWluID0gTUFYXzE2OworCXNjZk1pbiA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWRvIHsKIAkJLyogc2VhcmNoIGZvciBuZXcgcmVsZXZhbnQgc2ZiICovCiAJCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKIAkJd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQgJiYgc2NmW3NmYk5leHRdID09IE1JTl8xNikgewotCisJCQkKIAkJCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKIAkJfQotCisJCQogCQlpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKIAkJCS8qIHJlbGV2YW50IHNjZnMgdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCAqLwotCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOworCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OwogCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7CiAJCQlzY2ZNaW4gID0gbWluKCpzY2ZMYXN0LCAqc2NmTmV4dCk7CiAJCX0KIAkJZWxzZSB7Ci0KKwkJCQogCQkJaWYgKHNmYkxhc3QgPT0gLTEgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgewogCQkJCS8qIGZpcnN0IHJlbGV2YW50IHNjZiAqLwotCQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKKwkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQlzY2ZMYXN0ID0gJnNjZkFjdDsKIAkJCQlzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKLQkJCQlzY2ZNaW4gID0gKnNjZk5leHQ7CisJCQkJc2NmTWluICA9ICpzY2ZOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQl9CiAJCQllbHNlIHsKLQorCQkJCQogCQkJCWlmICgoc2ZiTGFzdD49MCkgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA9PSBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKIAkJCQkJLyogbGFzdCByZWxldmFudCBzY2YgKi8KLQkJCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOworCQkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OwogCQkJCQlzY2ZOZXh0ID0gJnNjZkFjdDsKLQkJCQkJc2NmTWluICA9ICpzY2ZMYXN0OworCQkJCQlzY2ZNaW4gID0gKnNjZkxhc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJfQogCQkJfQogCQl9Ci0KKwkJCiAJCWlmIChzZmJBY3Q+PTApCiAJCQlzY2ZNaW4gPSBtYXgoc2NmTWluLCBtaW5TY2Zbc2ZiQWN0XSk7Ci0KLQkJaWYgKChzZmJBY3QgPj0gMCkgJiYKLQkJCShzZmJMYXN0Pj0wIHx8IHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpICYmCi0JCQlzY2ZBY3QgPiBzY2ZNaW4gJiYKLQkJCSgqc2NmTGFzdCAhPSBwcmV2U2NmTGFzdFtzZmJBY3RdIHx8Ci0JCQkqc2NmTmV4dCAhPSBwcmV2U2NmTmV4dFtzZmJBY3RdIHx8CisJCQorCQlpZiAoKHNmYkFjdCA+PSAwKSAmJiAKKwkJCShzZmJMYXN0Pj0wIHx8IHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpICYmIAorCQkJc2NmQWN0ID4gc2NmTWluICYmIAorCQkJKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwgCisJCQkqc2NmTmV4dCAhPSBwcmV2U2NmTmV4dFtzZmJBY3RdIHx8IAogCQkJZGVsdGFQZSA8IGRlbHRhUGVMYXN0W3NmYkFjdF0pKSB7Ci0JCQlzdWNjZXNzID0gMDsKLQotCQkJLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3IgYWN0dWFsIHNjZiAqLworCQkJc3VjY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQorCQkJLyogZXN0aW1hdGUgcmVxdWlyZWQgYml0cyBmb3IgYWN0dWFsIHNjZiAqLwkJCQogCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPT0gTUlOXzE2KSB7CiAJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IGxvZ1NmYkVuZXJneVtzZmJBY3RdIC0KIAkJCQkJbG9nU2ZiRm9ybUZhY3RvcltzZmJBY3RdICsgMTEtOCo0OyAvKiA0KmxvZzIoNi43NSkgLSAzMiAqLwotCisJCQkJCiAJCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPCAwKQogCQkJCQlzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSArIDM7CiAJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPj4gMjsKIAkJCX0KLQorCQkJCiAJCQlzZmJQZU9sZCA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCiAJCQkJY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwgKnNjZkxhc3QsICpzY2ZOZXh0KTsKLQkJCWRlbHRhUGVOZXcgPSBkZWx0YVBlOwotCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDE7CisJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCWRvIHsKIAkJCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOwogCQkJCS8qIGNoZWNrIG9ubHkgaWYgdGhlIHNhbWUgY2hlY2sgd2FzIG5vdCBkb25lIGJlZm9yZSAqLwotCisJCQkJCiAJCQkJaWYgKHNjZkFjdCA8IG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSkgewogCQkJCQlzZmJQZU5ldyA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCiAJCQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwotCQkJCQkvKiB1c2UgbmV3IHNjZiBpZiBubyBpbmNyZWFzZSBpbiBwZSBhbmQKKwkJCQkJLyogdXNlIG5ldyBzY2YgaWYgbm8gaW5jcmVhc2UgaW4gcGUgYW5kIAogCQkJCQlxdWFudGl6YXRpb24gZXJyb3IgaXMgc21hbGxlciAqLwogCQkJCQlkZWx0YVBlVG1wID0gZGVsdGFQZSArIHNmYlBlTmV3IC0gc2ZiUGVPbGQ7Ci0KKwkJCQkJCiAJCQkJCWlmIChkZWx0YVBlVG1wIDwgMTApIHsKIAkJCQkJCXNmYkRpc3ROZXcgPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rCiAJCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdLApAQCAtNTA2LDQ2ICs1MDYsNDYgQEAKIAkJCQkJCQlzY2ZBY3QpOwogCQkJCQkJaWYgKHNmYkRpc3ROZXcgPCBzZmJEaXN0W3NmYkFjdF0pIHsKIAkJCQkJCQkvKiBzdWNjZXNzLCByZXBsYWNlIHNjZiBieSBuZXcgb25lICovCi0JCQkJCQkJc2NmW3NmYkFjdF0gPSBzY2ZBY3Q7Ci0JCQkJCQkJc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsKLQkJCQkJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZVRtcDsKLQkJCQkJCQlzdWNjZXNzID0gMTsKKwkJCQkJCQlzY2Zbc2ZiQWN0XSA9IHNjZkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCWRlbHRhUGVOZXcgPSBkZWx0YVBlVG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQlzdWNjZXNzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJCQl9CiAJCQkJCQkvKiBtYXJrIGFzIGFscmVhZHkgY2hlY2tlZCAqLwotCisJCQkJCQkKIAkJCQkJCWlmICh1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkKSB7Ci0JCQkJCQkJbWluU2NmQ2FsY3VsYXRlZFtzZmJBY3RdID0gc2NmQWN0OworCQkJCQkJCW1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSA9IHNjZkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOworCQkJCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJCX0KIAkJCQl9Ci0KKwkJCQkKIAkJCX0gd2hpbGUgKHNjZkFjdCA+IHNjZk1pbik7Ci0JCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsKKwkJCWRlbHRhUGUgPSBkZWx0YVBlTmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJLyogc2F2ZSBwYXJhbWV0ZXJzIHRvIGF2b2lkIG11bHRpcGxlIGNvbXB1dGF0aW9ucyBvZiB0aGUgc2FtZSBzZmIgKi8KLQkJCXByZXZTY2ZMYXN0W3NmYkFjdF0gPSAqc2NmTGFzdDsKLQkJCXByZXZTY2ZOZXh0W3NmYkFjdF0gPSAqc2NmTmV4dDsKLQkJCWRlbHRhUGVMYXN0W3NmYkFjdF0gPSBkZWx0YVBlOworCQkJcHJldlNjZkxhc3Rbc2ZiQWN0XSA9ICpzY2ZMYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwcmV2U2NmTmV4dFtzZmJBY3RdID0gKnNjZk5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRlbHRhUGVMYXN0W3NmYkFjdF0gPSBkZWx0YVBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9Ci0KKwkJCiAJCWlmIChzdWNjZXNzICYmIHJlc3RhcnRPblN1Y2Nlc3MpIHsKIAkJCS8qIHN0YXJ0IGFnYWluIGF0IGZpcnN0IHNmYiAqLwotCQkJc2ZiTGFzdCA9IC0xOwotCQkJc2ZiQWN0ICA9IC0xOwotCQkJc2ZiTmV4dCA9IC0xOworCQkJc2ZiTGFzdCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzZmJBY3QgID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXNmYk5leHQgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJc2NmTGFzdCA9IDA7CiAJCQlzY2ZOZXh0ID0gMDsKLQkJCXNjZk1pbiAgPSBNQVhfMTY7Ci0JCQlzdWNjZXNzID0gMDsKKwkJCXNjZk1pbiAgPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc3VjY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCX0KIAkJZWxzZSB7CiAJCQkvKiBzaGlmdCBzZmJzIGZvciBuZXh0IGJhbmQgKi8KLQkJCXNmYkxhc3QgPSBzZmJBY3Q7Ci0JCQlzZmJBY3QgID0gc2ZiTmV4dDsKKwkJCXNmYkxhc3QgPSBzZmJBY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc2ZiQWN0ICA9IHNmYk5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCX0KLQorCQkKICAgfSB3aGlsZSAoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCk7CiB9CiAKQEAgLTU1Nyw5ICs1NTcsOSBAQAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGFzc2ltaWxhdGVNdWx0aXBsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnNmYkRpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJFbmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLApAQCAtNTc0LDk1ICs1NzQsOTUgQEAKIAlXb3JkMzIgKnNmYkRpc3ROZXcgPSBwc3lPdXRDaGFuLT5zZmJEaXN0TmV3OwogCVdvcmQxNiAqc2NmVG1wID0gcHN5T3V0Q2hhbi0+cHJldlNjZkxhc3Q7CiAKLQlkZWx0YVBlID0gMDsKLQlzZmJDbnQgPSBwc3lPdXRDaGFuLT5zZmJDbnQ7Ci0KKwlkZWx0YVBlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJc2ZiQ250ID0gcHN5T3V0Q2hhbi0+c2ZiQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQogCS8qIGNhbGMgbWluIGFuZCBtYXggc2NhbGZhY3RvcnMgKi8KLQlzY2ZNaW4gPSBNQVhfMTY7Ci0Jc2NmTWF4ID0gTUlOXzE2OworCXNjZk1pbiA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzY2ZNYXggPSBNSU5fMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKLQorCQkKIAkJaWYgKHNjZltzZmJdICE9IE1JTl8xNikgewogCQkJc2NmTWluID0gbWluKHNjZk1pbiwgc2NmW3NmYl0pOwogCQkJc2NmTWF4ID0gbWF4KHNjZk1heCwgc2NmW3NmYl0pOwogCQl9CiAJfQotCisJCiAJaWYgKHNjZk1heCAhPSAgTUlOXzE2KSB7Ci0KLQkJc2NmQWN0ID0gc2NmTWF4OwotCisJCQorCQlzY2ZBY3QgPSBzY2ZNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQogCQlkbyB7CiAJCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOwogCQkJZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKLQkJCQlzY2ZUbXBbc2ZiXSA9IHNjZltzZmJdOworCQkJCXNjZlRtcFtzZmJdID0gc2NmW3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCX0KLQkJCXN0b3BTZmIgPSAwOworCQkJc3RvcFNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQlkbyB7Ci0JCQkJc2ZiID0gc3RvcFNmYjsKLQorCQkJCXNmYiA9IHN0b3BTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkKIAkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkgewogCQkJCQlzZmIgPSBzZmIgKyAxOwogCQkJCX0KLQkJCQlzdGFydFNmYiA9IHNmYjsKKwkJCQlzdGFydFNmYiA9IHNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJc2ZiID0gc2ZiICsgMTsKLQorCQkJCQogCQkJCXdoaWxlIChzZmIgPCBzZmJDbnQgJiYgKHNjZltzZmJdID09IE1JTl8xNiB8fCBzY2Zbc2ZiXSA+IHNjZkFjdCkpIHsKIAkJCQkJc2ZiID0gc2ZiICsgMTsKIAkJCQl9Ci0JCQkJc3RvcFNmYiA9IHNmYjsKLQotCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOwotCisJCQkJc3RvcFNmYiA9IHNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQorCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkKIAkJCQlpZiAoc3RhcnRTZmIgPCBzZmJDbnQpIHsKLQkJCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDE7CisJCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQorCQkJCQkJCiAJCQkJCQlpZiAoc2NmW3NmYl0hPU1JTl8xNikgewotCisJCQkJCQkJCiAJCQkJCQkJaWYgKHNjZkFjdCA8IG1pblNjZltzZmJdKSB7Ci0JCQkJCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAwOworCQkJCQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9Ci0KLQorCQkJCQorCQkJCQogCQkJCWlmIChwb3NzaWJsZVJlZ2lvbkZvdW5kKSB7IC8qIHJlZ2lvbiBmb3VuZCAqLwotCisJCQkJCQogCQkJCQkvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLwogCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KKwkJCQkJCQogCQkJCQkJaWYgKHNjZlRtcFtzZmJdIT1NSU5fMTYpCi0JCQkJCQkJc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7CisJCQkJCQkJc2NmVG1wW3NmYl0gPSBzY2ZBY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJCQl9Ci0KKwkJCQkJCiAJCQkJCS8qIGVzdGltYXRlIGNoYW5nZSBpbiBiaXQgZGVtYW5kIGZvciBuZXcgc2NmcyAqLwogCQkJCQlkZWx0YVNjZkJpdHMgPSBjb3VudFNjZkJpdHNEaWZmKHNjZixzY2ZUbXAsc2ZiQ250LHN0YXJ0U2ZiLHN0b3BTZmIpOwogCQkJCQlkZWx0YVNwZWNQZSA9IGNhbGNTcGVjUGVEaWZmKHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKLQkJCQkJCWxvZ1NmYkVuZXJneSwgbG9nU2ZiRm9ybUZhY3Rvciwgc2ZiTlJlbGV2YW50TGluZXMsCisJCQkJCQlsb2dTZmJFbmVyZ3ksIGxvZ1NmYkZvcm1GYWN0b3IsIHNmYk5SZWxldmFudExpbmVzLCAKIAkJCQkJCXN0YXJ0U2ZiLCBzdG9wU2ZiKTsKIAkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyBkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKLQotCisJCQkJCQorCQkJCQkKIAkJCQkJaWYgKGRlbHRhUGVOZXcgPCAxMCkgewogCQkJCQkJV29yZDMyIGRpc3RPbGRTdW0sIGRpc3ROZXdTdW07Ci0KKwkJCQkJCQogCQkJCQkJLyogcXVhbnRpemUgYW5kIGNhbGMgc3VtIG9mIG5ldyBkaXN0b3J0aW9uICovCi0JCQkJCQlkaXN0T2xkU3VtID0gMDsKLQkJCQkJCWRpc3ROZXdTdW0gPSAwOworCQkJCQkJZGlzdE9sZFN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCWRpc3ROZXdTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KKwkJCQkJCQkKIAkJCQkJCQlpZiAoc2NmVG1wW3NmYl0gIT0gTUlOXzE2KSB7CiAJCQkJCQkJCWRpc3RPbGRTdW0gPSBMX2FkZChkaXN0T2xkU3VtLCBzZmJEaXN0W3NmYl0pOwotCisJCQkJCQkJCQogCQkJCQkJCQlzZmJEaXN0TmV3W3NmYl0gPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gKwotCQkJCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdLAorCQkJCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdLCAKIAkJCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYisxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXSksCiAJCQkJCQkJCQlzY2ZBY3QpOwotCi0KKwkJCQkJCQkJCisJCQkJCQkJCQogCQkJCQkJCQlpZiAoc2ZiRGlzdE5ld1tzZmJdID4gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYl0pIHsKIAkJCQkJCQkJCWRpc3ROZXdTdW0gPSBkaXN0T2xkU3VtIDw8IDE7CiAJCQkJCQkJCQlicmVhazsKQEAgLTY3MCwyMCArNjcwLDIwIEBACiAJCQkJCQkJCWRpc3ROZXdTdW0gPSBMX2FkZChkaXN0TmV3U3VtLCBzZmJEaXN0TmV3W3NmYl0pOwogCQkJCQkJCX0KIAkJCQkJCX0KLQorCQkJCQkJCiAJCQkJCQlpZiAoZGlzdE5ld1N1bSA8IGRpc3RPbGRTdW0pIHsKLQkJCQkJCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsKKwkJCQkJCQlkZWx0YVBlID0gZGVsdGFQZU5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KKwkJCQkJCQkJCiAJCQkJCQkJCWlmIChzY2Zbc2ZiXSE9TUlOXzE2KSB7Ci0JCQkJCQkJCQlzY2Zbc2ZiXSA9IHNjZkFjdDsKLQkJCQkJCQkJCXNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKKwkJCQkJCQkJCXNjZltzZmJdID0gc2NmQWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJCQlzZmJEaXN0W3NmYl0gPSBzZmJEaXN0TmV3W3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoc3RvcFNmYiA8PSBzZmJDbnQpOworCQkJCX0gICAgICAgIAorCQkJfSB3aGlsZSAoc3RvcFNmYiA8PSBzZmJDbnQpOyAgICAgIAogCQl9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOwogCX0KIH0KQEAgLTcxMCwxMjUgKzcxMCwxMjUgQEAKIAlXb3JkMzIgKnNmYkRpc3QgPSBwc3lPdXRDaGFuLT5zZmJEaXN0OwogCVdvcmQxNiAqbWluU2ZNYXhRdWFudCA9IHBzeU91dENoYW4tPm1pblNmTWF4UXVhbnQ7CiAJV29yZDE2ICptaW5TY2ZDYWxjdWxhdGVkID0gcHN5T3V0Q2hhbi0+bWluU2NmQ2FsY3VsYXRlZDsKLQotCisJCisJCiAJZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKIAkJV29yZDMyIHNiZndpdGgsIHNiZlN0YXJ0OwogCQlXb3JkMzIgKm1kY3RTcGVjOwotCQl0aHJlc2ggPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV07Ci0JCWVuZXJneSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtpXTsKLQorCQl0aHJlc2ggPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCWVuZXJneSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCiAJCXNiZlN0YXJ0ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKIAkJc2Jmd2l0aCA9IHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXSAtIHNiZlN0YXJ0OwogCQltZGN0U3BlYyA9IHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bStzYmZTdGFydDsKLQotCQltYXhTcGVjID0gMDsKKwkJCisJCW1heFNwZWMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJLyogbWF4aW11bSBvZiBzcGVjdHJ1bSAqLwogCQlmb3IgKGo9c2Jmd2l0aDsgajsgai0tICkgewogCQkJV29yZDMyIGFic1NwZWMgPSBMX2FicygqbWRjdFNwZWMpOyBtZGN0U3BlYysrOwotCQkJbWF4U3BlYyB8PSBhYnNTcGVjOworCQkJbWF4U3BlYyB8PSBhYnNTcGVjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJfQotCisJCQogCQkvKiBzY2ZzIHdpdGhvdXQgZW5lcmd5IG9yIHdpdGggdGhyZXNoPmVuZXJneSBhcmUgbWFya2VkIHdpdGggTUlOXzE2ICovCi0JCXNjZltpXSA9IE1JTl8xNjsKLQkJbWluU2ZNYXhRdWFudFtpXSA9IE1JTl8xNjsKLQorCQlzY2ZbaV0gPSBNSU5fMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCW1pblNmTWF4UXVhbnRbaV0gPSBNSU5fMTY7ICAgIAorCQkKIAkJaWYgKChtYXhTcGVjID4gMCkgJiYgKGVuZXJneSA+IHRocmVzaCkpIHsKLQotCQkJZW5lcmd5UGFydCA9IGxvZ1NmYkZvcm1GYWN0b3JbaV07Ci0JCQl0aHJlc2hvbGRQYXJ0ID0gaUxvZzQodGhyZXNoKTsKKwkJCQorCQkJZW5lcmd5UGFydCA9IGxvZ1NmYkZvcm1GYWN0b3JbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXRocmVzaG9sZFBhcnQgPSBpTG9nNCh0aHJlc2gpOyAgCiAJCQkvKiAtMjAgPSA0KmxvZzIoNi43NSkgLSAzMiAqLwogCQkJc2NmSW50ID0gKCh0aHJlc2hvbGRQYXJ0IC0gZW5lcmd5UGFydCAtIDIwKSAqIFNDQUxFX0VTVElNQVRFX0NPRUYpID4+IDE1OwotCisJCQkKIAkJCW1pblNmTWF4UXVhbnRbaV0gPSBpTG9nNChtYXhTcGVjKSAtIDY4OyAvKiA2OCAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikgKyAxICovCi0KLQorCQkJCisJCQkKIAkJCWlmIChtaW5TZk1heFF1YW50W2ldID4gc2NmSW50KSB7Ci0JCQkJc2NmSW50ID0gbWluU2ZNYXhRdWFudFtpXTsKKwkJCQlzY2ZJbnQgPSBtaW5TZk1heFF1YW50W2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCX0KLQorCQkJCiAJCQkvKiBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyAqLwogCQkJc2NmSW50ID0gaW1wcm92ZVNjZihwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rc2JmU3RhcnQsCiAJCQkJc2Jmd2l0aCwKLQkJCQl0aHJlc2gsIHNjZkludCwgbWluU2ZNYXhRdWFudFtpXSwKKwkJCQl0aHJlc2gsIHNjZkludCwgbWluU2ZNYXhRdWFudFtpXSwgCiAJCQkJJnNmYkRpc3RbaV0sICZtaW5TY2ZDYWxjdWxhdGVkW2ldKTsKLQotCQkJc2NmW2ldID0gc2NmSW50OworCQkJCisJCQlzY2ZbaV0gPSBzY2ZJbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQotCi0KKwkKKwkKIAkvKiBzY2FsZWZhY3RvciBkaWZmZXJlY2UgcmVkdWN0aW9uICAqLwogCXsKIAkJV29yZDE2IHNmYkNvbnN0UGVQYXJ0W01BWF9HUk9VUEVEX1NGQl07CiAJCWZvcihpPTA7aTxwc3lPdXRDaGFuLT5zZmJDbnQ7aSsrKSB7Ci0JCQlzZmJDb25zdFBlUGFydFtpXSA9IE1JTl8xNjsKKwkJCXNmYkNvbnN0UGVQYXJ0W2ldID0gTUlOXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCX0KLQotCQlhc3NpbWlsYXRlU2luZ2xlU2NmKHBzeU91dENoYW4sIHNjZiwKKwkJCisJCWFzc2ltaWxhdGVTaW5nbGVTY2YocHN5T3V0Q2hhbiwgc2NmLCAKIAkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCiAJCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywgbWluU2NmQ2FsY3VsYXRlZCwgMSk7Ci0KLQkJYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW4sIHNjZiwKKwkJCisJCWFzc2ltaWxhdGVNdWx0aXBsZVNjZihwc3lPdXRDaGFuLCBzY2YsIAogCQkJbWluU2ZNYXhRdWFudCwgc2ZiRGlzdCwgc2ZiQ29uc3RQZVBhcnQsIGxvZ1NmYkVuZXJneSwKIAkJCWxvZ1NmYkZvcm1GYWN0b3IsIHNmYk5SZWxldmFudExpbmVzKTsKIAl9CiAKIAkvKiBnZXQgbWF4IHNjYWxlZmFjIGZvciBnbG9iYWwgZ2FpbiAqLwotCW1heFNjZiA9IE1JTl8xNjsKLQltaW5TY2YgPSBNQVhfMTY7CisJbWF4U2NmID0gTUlOXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJbWluU2NmID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQorCQkKIAkJaWYgKG1heFNjZiA8IHNjZltpXSkgewotCQkJbWF4U2NmID0gc2NmW2ldOworCQkJbWF4U2NmID0gc2NmW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJfQotCisJCQogCQlpZiAoKHNjZltpXSAhPSBNSU5fMTYpICYmIChtaW5TY2YgPiBzY2ZbaV0pKSB7Ci0JCQltaW5TY2YgPSBzY2ZbaV07CisJCQltaW5TY2YgPSBzY2ZbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCS8qIGxpbWl0IHNjZiBkZWx0YSAqLwogCW1heEFsbG93ZWRTY2YgPSBtaW5TY2YgKyBNQVhfU0NGX0RFTFRBOwogCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQorCQkKIAkJaWYgKChzY2ZbaV0gIT0gTUlOXzE2KSAmJiAobWF4QWxsb3dlZFNjZiA8IHNjZltpXSkpIHsKLQkJCXNjZltpXSA9IG1heEFsbG93ZWRTY2Y7CisJCQlzY2ZbaV0gPSBtYXhBbGxvd2VkU2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCS8qIG5ldyBtYXhTY2YgaWYgYW55IHNjZiBoYXMgYmVlbiBsaW1pdGVkICovCi0KKwkKIAlpZiAobWF4QWxsb3dlZFNjZiA8IG1heFNjZikgewotCQltYXhTY2YgPSBtYXhBbGxvd2VkU2NmOworCQltYXhTY2YgPSBtYXhBbGxvd2VkU2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJfQotCisJCiAJLyogY2FsYyBsb29wIHNjYWxlZmFjdG9ycyAqLwotCisJCiAJaWYgKG1heFNjZiA+IE1JTl8xNikgewotCQkqZ2xvYmFsR2FpbiA9IG1heFNjZjsKLQkJbGFzdFNmID0gMDsKLQorCQkqZ2xvYmFsR2FpbiA9IG1heFNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCWxhc3RTZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCiAJCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQorCQkJCiAJCQlpZiAoc2NmW2ldID09IE1JTl8xNikgewotCQkJCXNjZltpXSA9IGxhc3RTZjsKKwkJCQlzY2ZbaV0gPSBsYXN0U2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQkvKiBzZXQgYmFuZCBleHBsaWNpdGVseSB0byB6ZXJvICovCiAJCQkJZm9yIChqPXBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07IGo8cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdOyBqKyspIHsKLQkJCQkJcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdID0gMDsKKwkJCQkJcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJCX0KIAkJCX0KIAkJCWVsc2UgewogCQkJCXNjZltpXSA9IG1heFNjZiAtIHNjZltpXTsKLQkJCQlsYXN0U2YgPSBzY2ZbaV07CisJCQkJbGFzdFNmID0gc2NmW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQl9CiAJCX0KIAl9CiAJZWxzZXsKLQkJKmdsb2JhbEdhaW4gPSAwOworCQkqZ2xvYmFsR2FpbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCS8qIHNldCBzcGVjdHJ1bSBleHBsaWNpdGVseSB0byB6ZXJvICovCiAJCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQkJCXNjZltpXSA9IDA7CisJCQlzY2ZbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJZm9yIChqPXBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07IGo8cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdOyBqKyspIHsKLQkJCQlwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0gPSAwOworCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJfQogCQl9CiAJfQpAQCAtODQ4LDcgKzg0OCw3IEBACiAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQogewogCVdvcmQxNiBqOwotCisJCiAJZm9yIChqPTA7IGo8bkNoYW5uZWxzOyBqKyspIHsKIAkJQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKGxvZ1NmYkZvcm1GYWN0b3Jbal0sIHNmYk5SZWxldmFudExpbmVzW2pdLCBsb2dTZmJFbmVyZ3lbal0sICZwc3lPdXRDaGFubmVsW2pdKTsKIAl9CkBAIC04NjksNyArODY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpCiB7CiAJV29yZDE2IGo7Ci0KKwkKIAlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgewogCQlFc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoJnBzeU91dENoYW5uZWxbal0sCiAJCQlxY091dENoYW5uZWxbal0uc2NmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYwppbmRleCBjMmJkOGJkLi5iYWEyODljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYwpAQCAtNTIsOSArNTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvKQogewogICBXb3JkMTYgbXNCaXRzLCBzZmJPZmYsIHNmYjsKLSAgbXNCaXRzID0gMDsKKyAgbXNCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0KKyAgIAogICBzd2l0Y2godG9vbHNJbmZvLT5tc0RpZ2VzdCkgewogICAgIGNhc2UgTVNfTk9ORToKICAgICBjYXNlIE1TX0FMTDoKQEAgLTg1LDM0ICs4NSwzNCBAQAogICBXb3JkMzIgY29lZkJpdHM7CiAgIFdvcmQxNiAqcHRjb2VmOwogCi0gIGNvdW50ID0gMDsKLQorICBjb3VudCA9IDA7ICAgICAgIAorICAKICAgaWYgKGJsb2NrVHlwZSA9PSAyKQogICAgIG51bU9mV2luZG93cyA9IDg7CiAgIGVsc2UKICAgICBudW1PZldpbmRvd3MgPSAxOwotICB0bnNQcmVzZW50ID0gMDsKKyAgdG5zUHJlc2VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KKyAgICAgCiAgICAgaWYgKHRuc0luZm8tPnRuc0FjdGl2ZVtpXSE9MCkgewotICAgICAgdG5zUHJlc2VudCA9IDE7CisgICAgICB0bnNQcmVzZW50ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KLQorICAgCiAgIGlmICh0bnNQcmVzZW50KSB7CiAgICAgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KICAgICAvKmNvdW50ICs9IDE7ICovCiAgICAgZm9yIChpPTA7IGk8bnVtT2ZXaW5kb3dzOyBpKyspIHsKLQorICAgICAgIAogICAgICAgaWYgKGJsb2NrVHlwZSA9PSAyKQogICAgICAgICBjb3VudCArPSAxOwogICAgICAgZWxzZQogICAgICAgICBjb3VudCArPSAyOwotCisgICAgICAgCiAgICAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldKSB7CiAgICAgICAgIGNvdW50ICs9IDE7Ci0KKyAgICAgICAgIAogICAgICAgICBpZiAoYmxvY2tUeXBlID09IDIpIHsKICAgICAgICAgICBjb3VudCArPSA0OwogICAgICAgICAgIGNvdW50ICs9IDM7CkBAIC0xMjEsMjkgKzEyMSwyOSBAQAogICAgICAgICAgIGNvdW50ICs9IDY7CiAgICAgICAgICAgY291bnQgKz0gNTsKICAgICAgICAgfQotCisgICAgICAgICAKICAgICAgICAgaWYgKHRuc0luZm8tPm9yZGVyW2ldKSB7CiAgICAgICAgICAgY291bnQgKz0gMTsgLypkaXJlY3Rpb24qLwotICAgICAgICAgIGNvdW50ICs9IDE7IC8qY29lZl9jb21wcmVzc2lvbiAqLwotCisgICAgICAgICAgY291bnQgKz0gMTsgLypjb2VmX2NvbXByZXNzaW9uICovCQorICAgICAgICAgICAKICAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7CiAgICAgICAgICAgICBwdGNvZWYgPSB0bnNJbmZvLT5jb2VmICsgaSpUTlNfTUFYX09SREVSX1NIT1JUOwotCQkJY29lZkJpdHMgPSAzOworCQkJY29lZkJpdHMgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV07IGsrKykgewotCisgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBpZiAoKHB0Y29lZltrXSA+IDMpIHx8IChwdGNvZWZba10gPCAtNCkpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29lZkJpdHMgPSAyOworICAgICAgICAgICAgY29lZkJpdHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIHB0Y29lZiA9IHRuc0luZm8tPmNvZWYgKyBpKlROU19NQVhfT1JERVJfU0hPUlQ7CiAJCQlmb3Ioaz0wOyBrPHRuc0luZm8tPm9yZGVyW2ldOyBrKyspIHsKLQorICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgaWYgKChwdGNvZWZba10gPiAxKSB8fCAocHRjb2VmW2tdIDwgLTIpKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOworICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLQorICAKICAgcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBjb3VudFRuc0JpdHMKLSogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQKKyogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQgIAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBXb3JkMTYgY291bnRUbnNCaXRzKFROU19JTkZPICp0bnNJbmZvLFdvcmQxNiBibG9ja1R5cGUpCkBAIC0xNzMsMjkgKzE3MywyOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBjb3VudFN0YXRpY0JpdGRlbWFuZAotKiBkZXNjcmlwdGlvbjogICBjb3VudCBzdGF0aWMgYml0IGRlbWFuZCBpbmNsdWRlIHRucworKiBkZXNjcmlwdGlvbjogICBjb3VudCBzdGF0aWMgYml0IGRlbWFuZCBpbmNsdWRlIHRucyAgCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogV29yZDE2IGNvdW50U3RhdGljQml0ZGVtYW5kKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsIAogCQkJCQkJCVdvcmQxNiBhZHRzVXNlZCkKIHsKICAgV29yZDMyIHN0YXRCaXRzOwogICBXb3JkMzIgY2g7Ci0KLSAgc3RhdEJpdHMgPSAwOworICAKKyAgc3RhdEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgLyogaWYgYWR0cyB1c2VkLCBhZGQgNTYgYml0cyAqLwogICBpZihhZHRzVXNlZCkgc3RhdEJpdHMgKz0gNTY7CiAKLQorICAgCiAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKICAgICBjYXNlIDE6CiAgICAgICBzdGF0Qml0cyArPSBTSV9JRF9CSVRTK1NJX1NDRV9CSVRTK1NJX0lDU19CSVRTOwogICAgICAgc3RhdEJpdHMgKz0gY291bnRUbnNCaXRzKCYocHN5T3V0Q2hhbm5lbFswXS50bnNJbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKTsKLQorICAgICAgIAogICAgICAgc3dpdGNoKHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2UpewogICAgICAgICBjYXNlIExPTkdfV0lORE9XOgogICAgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKQEAgLTIxNSw3ICsyMTUsNyBAQAogCQkJCQkJCQkgIHBzeU91dENoYW5uZWxbMF0uc2ZiUGVyR3JvdXAsCiAJCQkJCQkJCSAgcHN5T3V0Q2hhbm5lbFswXS5tYXhTZmJQZXJHcm91cCwKIAkJCQkJCQkJICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvKTsKLQorICAgICAgIAogICAgICAgc3dpdGNoIChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKSB7CiAgICAgICAgIGNhc2UgTE9OR19XSU5ET1c6CiAgICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwppbmRleCA0NTVhODY0Li40NzNlMGEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpAQCAtMTAwLDIwICsxMDAsMjAgQEAKICAgLyogIGFzc2VydChmcmVxID49IDApOyAgKi8KICAgc2hpZnQgPSBub3JtX2woZnMpOwogICBsaW5lTnVtYmVyID0gKGV4dHJhY3RfbChmaXhtdWwoKGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSA8PCAyKSxEaXZfMzIoZnJlcSA8PCBzaGlmdCxmcyA8PCBzaGlmdCkpKSArIDEpID4+IDE7Ci0KKyAKICAgLyogZnJlcSA+IGZzLzIgKi8KLSAgdGVtcCA9IGxpbmVOdW1iZXIgLSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10gOworICB0ZW1wID0gbGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgaWYgKHRlbXAgPj0gMCkKICAgICByZXR1cm4gbnVtT2ZCYW5kczsKIAogICAvKiBmaW5kIGJhbmQgdGhlIGxpbmUgbnVtYmVyIGxpZXMgaW4gKi8KICAgZm9yIChiYW5kPTA7IGJhbmQ8bnVtT2ZCYW5kczsgYmFuZCsrKSB7Ci0gICAgdGVtcCA9IGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyOworICAgIHRlbXAgPSBiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgaWYgKHRlbXAgPiAwKSBicmVhazsKICAgfQogCiAgIHRlbXAgPSAobGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtiYW5kXSk7Ci0gIHRlbXAgPSAodGVtcCAtIChiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcikpOworICB0ZW1wID0gKHRlbXAgLSAoYmFuZFN0YXJ0T2Zmc2V0W2JhbmQgKyAxXSAtIGxpbmVOdW1iZXIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBpZiAoIHRlbXAgPiAwICkKICAgewogICAgIGJhbmQgPSBiYW5kICsgMTsKQEAgLTEzOSwyNSArMTM5LDI1IEBACiB7CiAKICAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsOwotICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUjsKKyAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB0Qy0+dG5zU3RhcnRGcmVxID0gMTI3NTsKLSAgdEMtPmNvZWZSZXMgICAgICA9IDQ7Ci0KKyAgdEMtPmNvZWZSZXMgICAgICA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAogICAvKiB0byBhdm9pZCBpbnRlZ2VyIGRpdmlzaW9uICovCi0gIGlmICggc3ViKGNoYW5uZWxzLDIpID09IDAgKSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlID4+IDE7CisgIGlmICggc3ViKGNoYW5uZWxzLDIpID09IDAgKSB7IAorICAgIGJpdHJhdGVQZXJDaGFubmVsID0gYml0UmF0ZSA+PiAxOyAgICAKICAgfQogICBlbHNlIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGU7CisgICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICB0Qy0+dG5zTWF4U2ZiID0gdG5zTWF4QmFuZHNMb25nTWFpbkxvd1twQy0+c2FtcFJhdGVJZHhdOwogCi0gIHRDLT50bnNBY3RpdmUgPSBhY3RpdmU7CisgIHRDLT50bnNBY3RpdmUgPSBhY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgLyogbm93IGNhbGMgYmFuZCBhbmQgbGluZSBib3JkZXJzICovCiAgIHRDLT50bnNTdG9wQmFuZCA9IG1pbihwQy0+c2ZiQ250LCB0Qy0+dG5zTWF4U2ZiKTsKLSAgdEMtPnRuc1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RvcEJhbmRdOworICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHRDLT50bnNTdGFydEJhbmQgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOwpAQCAtMTczLDE4ICsxNzMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CiAKIAotICB0Qy0+dG5zU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RhcnRCYW5kXTsKKyAgdEMtPnRuc1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0YXJ0QmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKICAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7CiAKLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwotCisgIHRDLT5scGNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0b3BCYW5kXTsgICAKKyAgCiAgIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyTG9uZ1twQy0+c2FtcFJhdGVJZHhdOwogCi0gIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOworICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCi0gIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7CisgIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAKICAgcmV0dXJuKDApOwpAQCAtMjA3LDIzICsyMDcsMjMgQEAKICAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsOwogICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUl9TSE9SVDsKICAgdEMtPnRuc1N0YXJ0RnJlcSA9IDI3NTA7Ci0gIHRDLT5jb2VmUmVzICAgICAgPSAzOwotCisgIHRDLT5jb2VmUmVzICAgICAgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKICAgLyogdG8gYXZvaWQgaW50ZWdlciBkaXZpc2lvbiAqLwogICBpZiAoIHN1YihjaGFubmVscywyKSA9PSAwICkgewotICAgIGJpdHJhdGVQZXJDaGFubmVsID0gTF9zaHIoYml0UmF0ZSwxKTsKKyAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IExfc2hyKGJpdFJhdGUsMSk7ICAgIAogICB9CiAgIGVsc2UgewotICAgIGJpdHJhdGVQZXJDaGFubmVsID0gYml0UmF0ZTsKKyAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgfQogCiAgIHRDLT50bnNNYXhTZmIgPSB0bnNNYXhCYW5kc1Nob3J0TWFpbkxvd1twQy0+c2FtcFJhdGVJZHhdOwogCi0gIHRDLT50bnNBY3RpdmUgPSBhY3RpdmU7CisgIHRDLT50bnNBY3RpdmUgPSBhY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgLyogbm93IGNhbGMgYmFuZCBhbmQgbGluZSBib3JkZXJzICovCiAgIHRDLT50bnNTdG9wQmFuZCA9IG1pbihwQy0+c2ZiQ250LCB0Qy0+dG5zTWF4U2ZiKTsKLSAgdEMtPnRuc1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RvcEJhbmRdOworICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHRDLT50bnNTdGFydEJhbmQ9RnJlcVRvQmFuZFdpdGhSb3VuZGluZyh0Qy0+dG5zU3RhcnRGcmVxLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CkBAIC0yMzksMTkgKzIzOSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKIAogCi0gIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOworICB0Qy0+dG5zU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07CiAKICAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7CiAKLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOworICB0Qy0+bHBjU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdG9wQmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyU2hvcnRbcEMtPnNhbXBSYXRlSWR4XTsKIAotICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsKKyAgdEMtPmxwY1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0YXJ0QmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotICB0Qy0+dGhyZXNob2xkID0gVE5TX0dBSU5fVEhSRVNIOworICB0Qy0+dGhyZXNob2xkID0gVE5TX0dBSU5fVEhSRVNIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICByZXR1cm4oMCk7CiB9CkBAIC0yNTksNyArMjU5LDcgQEAKIC8qKgogKgogKiBmdW5jdGlvbiBuYW1lOiBUbnNEZXRlY3QKLSogZGVzY3JpcHRpb246ICBDYWxjdWxhdGUgVE5TIGZpbHRlciBhbmQgZGVjaWRlIG9uIFROUyB1c2FnZQorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBUTlMgZmlsdGVyIGFuZCBkZWNpZGUgb24gVE5TIHVzYWdlIAogKiByZXR1cm5zOgkJMCBpZiBzdWNjZXNzCiAqCiAqLwpAQCAtMjc4LDcgKzI3OCw3IEBACiAgIFdvcmQzMiogcFdvcmszMiA9ICZwU2NyYXRjaFRuc1tzdWJCbG9ja051bWJlciA+PiA4XTsKICAgV29yZDE2KiBwV2VpZ2h0ZWRTcGVjdHJ1bSA9IChXb3JkMTYgKikmcFNjcmF0Y2hUbnNbc3ViQmxvY2tOdW1iZXIgPj4gOF07CiAKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBpZiAodEMudG5zQWN0aXZlKSB7CiAgICAgQ2FsY1dlaWdodGVkU3BlY3RydW0oc3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcFdlaWdodGVkU3BlY3RydW0sCkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdG9wQmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yazMyKTsKIAotICAgIHRlbXAgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7CisgICAgdGVtcCA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgaWYgKCB0ZW1wICE9IDAgKSB7CiAgICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LApAQCAtMjk5LDE1ICsyOTksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnBhcmNvcik7CiAKIAotICAgICAgICB0ZW1wID0gcHJlZGljdGlvbkdhaW4gLSB0Qy50aHJlc2hvbGQ7CisgICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoIHRlbXAgPiAwICkgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMTsKKyAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDA7CisgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIH0KIAotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47CisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4gPSBwcmVkaWN0aW9uR2FpbjsgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICAgIGVsc2V7CiAKQEAgLTMxNywyOCArMzE3LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnBhcmNvcik7CiAKLSAgICAgICAgdGVtcCA9IHByZWRpY3Rpb25HYWluIC0gdEMudGhyZXNob2xkOworICAgICAgICB0ZW1wID0gcHJlZGljdGlvbkdhaW4gLSB0Qy50aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoIHRlbXAgPiAwICkgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAxOworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAxOyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAwOworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB9CiAKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47CisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOyAgICAgCiAgICAgfQogCiAgIH0KICAgZWxzZXsKIAotICAgIHRlbXAgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7CisgICAgdGVtcCA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgaWYgKCB0ZW1wICE9IDAgKSB7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMDsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IDA7CisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMDsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gMDsKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gMDsgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KIApAQCAtMzYyLDIxICszNjIsMjEgQEAKICAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7CiAgICBXb3JkMzIgaSwgdGVtcDsKIAotICAgdGVtcCA9ICBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7CisgICB0ZW1wID0gIGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgaWYgKCB0ZW1wICE9IDAgKSB7Ci0gICAgICBzYkluZm9EZXN0ID0gJnRuc0RhdGFEZXN0LT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvOwotICAgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvOworICAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgfQogICAgZWxzZSB7Ci0gICAgICBzYkluZm9EZXN0ID0gJnRuc0RhdGFEZXN0LT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07Ci0gICAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsKKyAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOyAgICAgICAgICAgICAgICAgICAgICAKICAgIH0KIAogICAgaWYgKDEwMCphYnNfcyhzYkluZm9EZXN0LT5wcmVkaWN0aW9uR2FpbiAtIHNiSW5mb1NyYy0+cHJlZGljdGlvbkdhaW4pIDwKICAgICAgICAoMyAqIHNiSW5mb0Rlc3QtPnByZWRpY3Rpb25HYWluKSkgewotICAgICAgc2JJbmZvRGVzdC0+dG5zQWN0aXZlID0gc2JJbmZvU3JjLT50bnNBY3RpdmU7CisgICAgICBzYkluZm9EZXN0LT50bnNBY3RpdmUgPSBzYkluZm9TcmMtPnRuc0FjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICBmb3IgKCBpPTA7IGk8IHRDLm1heE9yZGVyOyBpKyspIHsKLSAgICAgICAgc2JJbmZvRGVzdC0+cGFyY29yW2ldID0gc2JJbmZvU3JjLT5wYXJjb3JbaV07CisgICAgICAgIHNiSW5mb0Rlc3QtPnBhcmNvcltpXSA9IHNiSW5mb1NyYy0+cGFyY29yW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICB9CiAgICB9CiB9CkBAIC00MDIsMTEgKzQwMiwxMSBAQAogICBXb3JkMzIgdGVtcDsKICAgVE5TX1NVQkJMT0NLX0lORk8gKnBzdWJCbG9ja0luZm87CiAKLSAgdGVtcF9zID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOwotICBpZiAoIHRlbXBfcyAhPSAwKSB7CisgIHRlbXBfcyA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmICggdGVtcF9zICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgcHN1YkJsb2NrSW5mbyA9ICZ0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvOwogCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgewotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7CisgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICByZXR1cm4oMCk7CiAgICAgfQogICAgIGVsc2UgewpAQCAtNDIyLDIyICs0MjIsMjIgQEAKICAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKIAogICAgICAgZm9yIChpPXRDLm1heE9yZGVyIC0gMTsgaT49MDsgaS0tKSAgewotICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldIC0gVE5TX1BBUkNPUl9USFJFU0g7CisgICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsgICAgICAgICAKICAgICAgICAgaWYgKCB0ZW1wID4gMCApCiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsKKyAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSArIFROU19QQVJDT1JfVEhSRVNIOyAgICAgICAgIAogICAgICAgICBpZiAoIHRlbXAgPCAwICkKICAgICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSA9IGkgKyAxOworICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdID0gaSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAKLSAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAxOworICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgZm9yIChpPXN1YkJsb2NrTnVtYmVyKzE7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW2ldID0gMDsKKyAgICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0KLSAgICAgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMuY29lZlJlczsKLSAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl0gPSBudW1PZlNmYiAtIHRDLnRuc1N0YXJ0QmFuZDsKKyAgICAgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMuY29lZlJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl0gPSBudW1PZlNmYiAtIHRDLnRuc1N0YXJ0QmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogCiAgICAgICBBbmFseXNpc0ZpbHRlckxhdHRpY2UoJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSwKQEAgLTQ0OCwxMCArNDQ4LDEwIEBACiAKICAgICB9CiAgIH0gICAgIC8qIGlmIChibG9ja1R5cGUhPVNIT1JUX1dJTkRPVykgKi8KLSAgZWxzZSAvKnNob3J0IGJsb2NrKi8geworICBlbHNlIC8qc2hvcnQgYmxvY2sqLyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIHBzdWJCbG9ja0luZm8gPSAmdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwogCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgewotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7CisgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICByZXR1cm4oMCk7CiAgICAgfQogICAgIGVsc2UgewpAQCAtNDY2LDE5ICs0NjYsMTkgQEAKICAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKICAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKICAgICAgIGZvciAoaT0odEMubWF4T3JkZXIgLSAxKTsgaT49MDsgaS0tKSAgewotICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldIC0gVE5TX1BBUkNPUl9USFJFU0g7CisgICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsgICAgCiAgICAgICAgICBpZiAoIHRlbXAgPiAwICkKICAgICAgICAgICBicmVhazsKIAotICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldICsgVE5TX1BBUkNPUl9USFJFU0g7CisgICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsgICAgCiAgICAgICAgIGlmICggdGVtcCA8IDAgKQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdID0gaSArIDE7CisgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLSAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAxOwotICAgICAgdG5zSW5mby0+Y29lZlJlc1tzdWJCbG9ja051bWJlcl0gPSB0Qy5jb2VmUmVzOwotICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXSA9IG51bU9mU2ZiIC0gdEMudG5zU3RhcnRCYW5kOworICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdG5zSW5mby0+Y29lZlJlc1tzdWJCbG9ja051bWJlcl0gPSB0Qy5jb2VmUmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXSA9IG51bU9mU2ZiIC0gdEMudG5zU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAogICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksICh0Qy50bnNTdG9wTGluZSAtIHRDLnRuc1N0YXJ0TGluZSksCkBAIC01MDcsMTQgKzUwNywxNCBAQAogewogICBXb3JkMzIgazsKIAotICBXb3JkMzIgYWNjdV95ID0gMHg0MDAwMDAwMDsKKyAgV29yZDMyIGFjY3VfeSA9IDB4NDAwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIGFjY3VfeSA9IExfc2hyKGFjY3VfeSxzY2FsZSk7CiAKICAgZm9yKGs9MTsgazxJTlRfQklUUzsgaysrKSB7Ci0gICAgY29uc3QgV29yZDMyIHogPSBtX2xvZzJfdGFibGVba107CisgICAgY29uc3QgV29yZDMyIHogPSBtX2xvZzJfdGFibGVba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgd2hpbGUoTF9zdWIoeCx6KSA+PSAwKSB7Ci0KKyAgICAgICAKICAgICAgIHggPSBMX3N1Yih4LCB6KTsKICAgICAgIGFjY3VfeSA9IExfYWRkKGFjY3VfeSwgKGFjY3VfeSA+PiBrKSk7CiAgICAgfQpAQCAtNTQ4LDQzICs1NDgsNDMgQEAKICAgICBXb3JkMzIgbWF4V1M7CiAgICAgV29yZDMyIHRuc1NmYk1lYW5bTUFYX1NGQl07ICAgIC8qIGxlbmd0aCBbbHBjU3RvcEJhbmQtbHBjU3RhcnRCYW5kXSBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlICovCiAKLSAgICBtYXhXUyA9IDA7Ci0KKyAgICBtYXhXUyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCiAgICAgLyogY2FsYyAxLjAqMl4tSU5UX0JJVFMvMi9zcXJ0KGVuKSAqLwogICAgIGZvciggc2ZiID0gbHBjU3RhcnRCYW5kOyBzZmIgPCBscGNTdG9wQmFuZDsgc2ZiKyspIHsKIAotICAgICAgdG1wMiA9IHNmYkVuZXJneVtzZmJdIC0gMjsKKyAgICAgIHRtcDIgPSBzZmJFbmVyZ3lbc2ZiXSAtIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICBpZiggdG1wMiA+IDApIHsKICAgICAgICAgdG1wID0gcnNxcnQoc2ZiRW5lcmd5W3NmYl0sIElOVF9CSVRTKTsKLQkJaWYodG1wID4gSU5UX0JJVFNfU0NBTCkKKwkJaWYodG1wID4gSU5UX0JJVFNfU0NBTCkgCiAJCXsKIAkJCXNoaWZ0ID0gIG5vcm1fbCh0bXApOwotCQkJdG1wID0gRGl2XzMyKCBJTlRfQklUU19TQ0FMIDw8IHNoaWZ0LCB0bXAgPDwgc2hpZnQgKTsKKwkJCXRtcCA9IERpdl8zMiggSU5UX0JJVFNfU0NBTCA8PCBzaGlmdCwgdG1wIDw8IHNoaWZ0ICk7IAogCQl9CiAJCWVsc2UKIAkJewotCQkJdG1wID0gMHg3ZmZmZmZmZjsKKwkJCXRtcCA9IDB4N2ZmZmZmZmY7IAogCQl9CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIHRuc1NmYk1lYW5bc2ZiXSA9IHRtcDsKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0gCisgICAgICB0bnNTZmJNZWFuW3NmYl0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogCiAgICAgLyogc3ByZWFkIG5vcm1hbGl6ZWQgdmFsdWVzIGZyb20gc2ZicyB0byBsaW5lcyAqLwotICAgIHNmYiA9IGxwY1N0YXJ0QmFuZDsKLSAgICB0bXAgPSB0bnNTZmJNZWFuW3NmYl07CisgICAgc2ZiID0gbHBjU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgdG1wID0gdG5zU2ZiTWVhbltzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgZm9yICggaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0gICAgICB0bXBfcyA9IHNmYk9mZnNldFtzZmIgKyAxXSAtIGk7CisgICAgICB0bXBfcyA9IHNmYk9mZnNldFtzZmIgKyAxXSAtIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICBpZiAoIHRtcF9zID09IDAgKSB7CiAgICAgICAgIHNmYiA9IHNmYiArIDE7Ci0gICAgICAgIHRtcDJfcyA9IHNmYiArIDEgLSBscGNTdG9wQmFuZDsKKyAgICAgICAgdG1wMl9zID0gc2ZiICsgMSAtIGxwY1N0b3BCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgaWYgKHRtcDJfcyA8PSAwKSB7Ci0gICAgICAgICAgdG1wID0gdG5zU2ZiTWVhbltzZmJdOworICAgICAgICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBwV29yazMyW2ldID0gdG1wOworICAgICAgcFdvcmszMltpXSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KICAgICAvKmZpbHRlciBkb3duKi8KICAgICBmb3IgKGk9KGxwY1N0b3BMaW5lIC0gMik7IGk+PWxwY1N0YXJ0TGluZTsgaS0tKXsKQEAgLTU5Nyw4ICs1OTcsOCBAQAogCiAgICAgLyogd2VpZ2h0IGFuZCBub3JtYWxpemUgKi8KICAgICBmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspewotICAgICAgcFdvcmszMltpXSA9IE1VTEhJR0gocFdvcmszMltpXSwgc3BlY3RydW1baV0pOwotICAgICAgbWF4V1MgfD0gTF9hYnMocFdvcmszMltpXSk7CisgICAgICBwV29yazMyW2ldID0gTVVMSElHSChwV29yazMyW2ldLCBzcGVjdHJ1bVtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbWF4V1MgfD0gTF9hYnMocFdvcmszMltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KICAgICBtYXhTaGlmdCA9IG5vcm1fbChtYXhXUyk7CiAKQEAgLTY0Niw3ICs2NDYsNyBAQAogICBhc3NlcnQodG5zT3JkZXIgPD0gVE5TX01BWF9PUkRFUik7ICAgICAgLyogcmVtb3ZlIGFzc2VydHMgbGF0ZXI/IChidGcpICovCiAKICAgZm9yKGk9MDtpPHRuc09yZGVyO2krKykgewotICAgIHBhcmNvcltpXSA9IDA7CisgICAgcGFyY29yW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KIAogICBBdXRvQ29ycmVsYXRpb24oc2lnbmFsLCBwYXJjb3JXb3JrQnVmZmVyLCBudW1PZkxpbmVzLCB0bnNPcmRlclBsdXMxKTsKQEAgLTY3OCwxNSArNjc4LDE1IEBACiAgIFdvcmQzMiBhY2N1OwogICBXb3JkMzIgc2NmOwogCi0gIHNjZiA9IDEwIC0gMTsKKyAgc2NmID0gMTAgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgaXNhbXBsZXMgPSBzYW1wbGVzOwogICAvKiBjYWxjIGZpcnN0IGNvcnJDb2VmOiAgUlswXSA9IHN1bSB7IHRbaV0gKiB0W2ldIH0gOyBpID0gMC4uTi0xICovCi0gIGFjY3UgPSAwOworICBhY2N1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKICAgICBhY2N1ID0gTF9hZGQoYWNjdSwgKChpbnB1dFtqXSAqIGlucHV0W2pdKSA+PiBzY2YpKTsKICAgfQotICBjb3JyWzBdID0gYWNjdTsKKyAgY29yclswXSA9IGFjY3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICAvKiBlYXJseSB0ZXJtaW5hdGlvbiBpZiBhbGwgY29yciBjb2VmZnMgYXJlIGxpa2VseSBnb2luZyB0byBiZSB6ZXJvICovCiAgIGlmKGNvcnJbMF0gPT0gMCkgcmV0dXJuIDsKQEAgLTY5NCwxMyArNjk0LDEzIEBACiAgIC8qIGNhbGMgYWxsIG90aGVyIGNvcnJDb2VmOiAgUltqXSA9IHN1bSB7IHRbaV0gKiB0W2kral0gfSA7IGkgPSAwLi4oTi1qLTEpLCBqPTEuLnAgKi8KICAgZm9yKGk9MTsgaTxjb3JyQ29lZmY7IGkrKykgewogICAgIGlzYW1wbGVzID0gaXNhbXBsZXMgLSAxOwotICAgIGFjY3UgPSAwOworICAgIGFjY3UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIGZvcihqPTA7IGo8aXNhbXBsZXM7IGorKykgewogICAgICAgYWNjdSA9IExfYWRkKGFjY3UsICgoaW5wdXRbal0gKiBpbnB1dFtqK2ldKSA+PiBzY2YpKTsKICAgICB9Ci0gICAgY29ycltpXSA9IGFjY3U7CisgICAgY29ycltpXSA9IGFjY3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIH0KLX0KK30gICAgCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MjAsMjAgKzcyMCwyMCBAQAogICBXb3JkMzIgcHJlZGljdGlvbkdhaW4gPSAwOwogICBXb3JkMzIgbnVtLCBkZW5vbTsKICAgV29yZDMyIHRlbXAsIHdvcmtCdWZmZXIwOworICAgCiAKLQotICBudW0gPSB3b3JrQnVmZmVyWzBdOwotICB0ZW1wID0gd29ya0J1ZmZlcltudW1PZkNvZWZmXTsKKyAgbnVtID0gd29ya0J1ZmZlclswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgdGVtcCA9IHdvcmtCdWZmZXJbbnVtT2ZDb2VmZl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogICBmb3IoaT0wOyBpPG51bU9mQ29lZmYtMTsgaSsrKSB7Ci0gICAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB3b3JrQnVmZmVyW2kgKyAxXTsKKyAgICB3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSA9IHdvcmtCdWZmZXJbaSArIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgfQotICB3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSA9IHRlbXA7Ci0KKyAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAKICAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKICAgICBXb3JkMzIgcmVmYzsKIAotCisgICAgIAogICAgIGlmICh3b3JrQnVmZmVyWzBdIDwgTF9hYnMod29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0pKSB7CiAgICAgICByZXR1cm4gMCA7CiAgICAgfQpAQCAtNzQyLDIxICs3NDIsMjEgQEAKICAgICAvKiBjYWxjdWxhdGUgcmVmYyA9IC13b3JrQnVmZmVyW251bU9mQ29lZmYraV0gLyB3b3JrQnVmZmVyWzBdOyAtMSA8PSByZWZjIDwgMSAqLwogCXJlZmMgPSBMX25lZ2F0ZShmaXhtdWwod29ya0J1ZmZlcltudW1PZkNvZWZmICsgaV0sIHdvcmtCdWZmZXIwKSk7CiAKLSAgICByZWZsQ29lZmZbaV0gPSByZWZjOworICAgIHJlZmxDb2VmZltpXSA9IHJlZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKLSAgICBwV29ya0J1ZmZlciA9ICYod29ya0J1ZmZlcltudW1PZkNvZWZmXSk7CisgICAgcFdvcmtCdWZmZXIgPSAmKHdvcmtCdWZmZXJbbnVtT2ZDb2VmZl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgICBmb3Ioaj1pOyBqPG51bU9mQ29lZmY7IGorKykgewogICAgICAgV29yZDMyIGFjY3UxLCBhY2N1MjsKICAgICAgIGFjY3UxID0gTF9hZGQocFdvcmtCdWZmZXJbal0sIGZpeG11bChyZWZjLCB3b3JrQnVmZmVyW2ogLSBpXSkpOwogICAgICAgYWNjdTIgPSBMX2FkZCh3b3JrQnVmZmVyW2ogLSBpXSwgZml4bXVsKHJlZmMsIHBXb3JrQnVmZmVyW2pdKSk7Ci0gICAgICBwV29ya0J1ZmZlcltqXSA9IGFjY3UxOwotICAgICAgd29ya0J1ZmZlcltqIC0gaV0gPSBhY2N1MjsKKyAgICAgIHBXb3JrQnVmZmVyW2pdID0gYWNjdTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHdvcmtCdWZmZXJbaiAtIGldID0gYWNjdTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KIAogICBkZW5vbSA9IE1VTEhJR0god29ya0J1ZmZlclswXSwgTk9STV9DT0VGKTsKLQorICAgCiAgIGlmIChkZW5vbSAhPSAwKSB7CiAgICAgV29yZDMyIHRlbXA7CiAJc2hpZnQgPSBub3JtX2woZGVub20pOwpAQCAtNzc0LDExICs3NzQsMTEgQEAKICAgV29yZDMyIGluZGV4ID0gMDsKICAgV29yZDMyIGk7CiAgIFdvcmQzMiB0ZW1wOwotCisgICAKICAgZm9yIChpPTA7aTw4O2krKykgewotICAgIHRlbXAgPSBMX3N1YiggcGFyY29yLCB0bnNDb2VmZjNCb3JkZXJzW2ldKTsKKyAgICB0ZW1wID0gTF9zdWIoIHBhcmNvciwgdG5zQ29lZmYzQm9yZGVyc1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBpZiAodGVtcCA+IDApCi0gICAgICBpbmRleD1pOworICAgICAgaW5kZXg9aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAgIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA0KTsKIH0KQEAgLTc4OCwxMiArNzg4LDEyIEBACiAgIFdvcmQzMiBpbmRleCA9IDA7CiAgIFdvcmQzMiBpOwogICBXb3JkMzIgdGVtcDsKLQorICAgCiAKICAgZm9yIChpPTA7aTwxNjtpKyspIHsKLSAgICB0ZW1wID0gTF9zdWIocGFyY29yLCB0bnNDb2VmZjRCb3JkZXJzW2ldKTsKKyAgICB0ZW1wID0gTF9zdWIocGFyY29yLCB0bnNDb2VmZjRCb3JkZXJzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBpZiAodGVtcCA+IDApCi0gICAgICBpbmRleD1pOworICAgICAgaW5kZXg9aTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAgIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA4KTsKIH0KQEAgLTgxNCwxMiArODE0LDEyIEBACiAgIFdvcmQzMiB0ZW1wOwogCiAgIGZvcihpPTA7IGk8b3JkZXI7IGkrKykgewotICAgIHRlbXAgPSBiaXRzUGVyQ29lZmYgLSAzOworICAgIHRlbXAgPSBiaXRzUGVyQ29lZmYgLSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgaWYgKHRlbXAgPT0gMCkgewotICAgICAgaW5kZXhbaV0gPSBTZWFyY2gzKHBhcmNvcltpXSk7Ci0gICAgfQorICAgICAgaW5kZXhbaV0gPSBTZWFyY2gzKHBhcmNvcltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0gCiAgICAgZWxzZSB7Ci0gICAgICBpbmRleFtpXSA9IFNlYXJjaDQocGFyY29yW2ldKTsKKyAgICAgIGluZGV4W2ldID0gU2VhcmNoNChwYXJjb3JbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KIH0KQEAgLTgzOSwxMiArODM5LDEyIEBACiAgIFdvcmQzMiB0ZW1wOwogCiAgIGZvciAoaT0wOyBpPG9yZGVyOyBpKyspIHsKLSAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gNDsKKyAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBpZiAoIHRlbXAgPT0gMCApIHsKLSAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmY0W2luZGV4W2ldICsgOF07CisgICAgICAgIHBhcmNvcltpXSA9IHRuc0NvZWZmNFtpbmRleFtpXSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBwYXJjb3JbaV0gPSB0bnNDb2VmZjNbaW5kZXhbaV0gKyA0XTsKKyAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmYzW2luZGV4W2ldICsgNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB9CiAgIH0KIH0KQEAgLTg2NSwyMCArODY1LDIwIEBACiAgICBXb3JkMzIgYWNjdSx0bXAsdG1wU2F2ZTsKIAogICAgeCA9IHggPj4gMTsKLSAgIHRtcFNhdmUgPSB4OworICAgdG1wU2F2ZSA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICBmb3IgKGk9MDsgaTwob3JkZXIgLSAxKTsgaSsrKSB7CiAKICAgICAgdG1wID0gTF9hZGQoZml4bXVsKGNvZWZfcGFyW2ldLCB4KSwgc3RhdGVfcGFyW2ldKTsKICAgICAgeCAgID0gTF9hZGQoZml4bXVsKGNvZWZfcGFyW2ldLCBzdGF0ZV9wYXJbaV0pLCB4KTsKIAotICAgICBzdGF0ZV9wYXJbaV0gPSB0bXBTYXZlOwotICAgICB0bXBTYXZlID0gdG1wOworICAgICBzdGF0ZV9wYXJbaV0gPSB0bXBTYXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICB0bXBTYXZlID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAKICAgLyogbGFzdCBzdGFnZTogb25seSBuZWVkIGhhbGYgb3BlcmF0aW9ucyAqLwogICBhY2N1ID0gZml4bXVsKHN0YXRlX3BhcltvcmRlciAtIDFdLCBjb2VmX3Bhclsob3JkZXIgLSAxKV0pOwotICBzdGF0ZV9wYXJbKG9yZGVyIC0gMSldID0gdG1wU2F2ZTsKKyAgc3RhdGVfcGFyWyhvcmRlciAtIDEpXSA9IHRtcFNhdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgIHggPSBMX2FkZChhY2N1LCB4KTsKICAgeCA9IExfYWRkKHgsIHgpOwpAQCAtOTAzLDExICs5MDMsMTEgQEAKICAgV29yZDMyIGo7CiAKICAgZm9yICggaj0wOyBqPFROU19NQVhfT1JERVI7IGorKyApIHsKLSAgICBzdGF0ZV9wYXJbal0gPSAwOworICAgIHN0YXRlX3BhcltqXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiAKICAgZm9yKGo9MDsgajxudW1PZkxpbmVzOyBqKyspIHsKLSAgICBvdXRwdXRbal0gPSBGSVJMYXR0aWNlKG9yZGVyLHNpZ25hbFtqXSxzdGF0ZV9wYXIscGFyQ29lZmYpOworICAgIG91dHB1dFtqXSA9IEZJUkxhdHRpY2Uob3JkZXIsc2lnbmFsW2pdLHN0YXRlX3BhcixwYXJDb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICB9CiB9CiAKQEAgLTkyMiwxMSArOTIyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywgLyohPCBUTlMgc3ViYmxvY2sgaW5mbyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqdGhyZXNob2xkcykgICAgICAgIC8qITwgdGhyZXNob2xkcyAobW9kaWZpZWQpICovCiB7Ci0gIFdvcmQzMiBpOworICBXb3JkMzIgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICBpZiAoc3ViSW5mby50bnNBY3RpdmUpIHsKICAgICBmb3IoaT1zdGFydENiOyBpPHN0b3BDYjsgaSsrKSB7CiAgICAgICAvKiB0aHJlc2hvbGRzW2ldICogMC4yNSAqLwotICAgICAgdGhyZXNob2xkc1tpXSA9ICh0aHJlc2hvbGRzW2ldID4+IDIpOworICAgICAgdGhyZXNob2xkc1tpXSA9ICh0aHJlc2hvbGRzW2ldID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwppbmRleCBhMTU0YTJmLi40ZDExZjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwpAQCAtMzEsNyArMzEsNyBAQAogI2RlZmluZSBzd2FwMihwMCxwMSkgXAogCXQgPSBwMDsgdDEgPSAqKCYocDApKzEpOwlcCiAJcDAgPSBwMTsgKigmKHAwKSsxKSA9ICooJihwMSkrMSk7CVwKLQlwMSA9IHQ7ICooJihwMSkrMSkgPSB0MQorCXAxID0gdDsgKigmKHAxKSsxKSA9IHQxCQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCkBAIC00NywxOCArNDcsMTggQEAKIAogCXBhcnQwID0gYnVmOwogICAgIHBhcnQxID0gYnVmICsgbnVtOwotCisJCiAJd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKSB7CiAgICAgICAgIGogPSAqYml0VGFiKys7CiAKLSAgICAgICAgc3dhcDIocGFydDBbNCppKzBdLCBwYXJ0MFs0KmorMF0pOwotICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaiswXSk7Ci0gICAgICAgIHN3YXAyKHBhcnQxWzQqaSswXSwgcGFydDBbNCpqKzJdKTsKLSAgICAgICAgc3dhcDIocGFydDFbNCppKzJdLCBwYXJ0MVs0KmorMl0pOworICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMF0sIHBhcnQwWzQqaiswXSk7CQorICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaiswXSk7CQorICAgICAgICBzd2FwMihwYXJ0MVs0KmkrMF0sIHBhcnQwWzQqaisyXSk7CQorICAgICAgICBzd2FwMihwYXJ0MVs0KmkrMl0sIHBhcnQxWzQqaisyXSk7CQogICAgIH0KIAogICAgIGRvIHsKLSAgICAgICAgc3dhcDIocGFydDBbNCppKzJdLCBwYXJ0MVs0KmkrMF0pOworICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaSswXSk7CQogICAgIH0gd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKTsKIH0KIApAQCAtNzQsOCArNzQsOCBAQAogewogICAgIGludCByMCwgcjEsIHIyLCByMzsKIAlpbnQgcjQsIHI1LCByNiwgcjc7Ci0KLQlmb3IgKDsgbnVtICE9IDA7IG51bS0tKQorCQorCWZvciAoOyBudW0gIT0gMDsgbnVtLS0pIAogCXsKIAkJcjAgPSBidWZbMF0gKyBidWZbMl07CiAJCXIxID0gYnVmWzFdICsgYnVmWzNdOwpAQCAtMTEzLDcgKzExMyw3IEBACiAgICBpbnQgaTQsIGk1LCBpNiwgaTc7CiAgICBpbnQgdDAsIHQxLCB0MiwgdDM7CiAKLQlmb3IgKCA7IG51bSAhPSAwOyBudW0tLSkKKwlmb3IgKCA7IG51bSAhPSAwOyBudW0tLSkgCiAJewogCQlyMCA9IGJ1ZlswXSArIGJ1ZlsyXTsKIAkJaTAgPSBidWZbMV0gKyBidWZbM107CkBAIC0xOTQsMjMgKzE5NCwyMyBAQAogCWludCBpLCBqLCBzdGVwOwogCWludCAqeHB0ciwgKmNzcHRyOwogCi0JZm9yIChudW0gPj49IDI7IG51bSAhPSAwOyBudW0gPj49IDIpCisJZm9yIChudW0gPj49IDI7IG51bSAhPSAwOyBudW0gPj49IDIpIAogCXsKIAkJc3RlcCA9IDIqYmduOwogCQl4cHRyID0gYnVmOwogCi0gICAgCWZvciAoaSA9IG51bTsgaSAhPSAwOyBpLS0pCisgICAgCWZvciAoaSA9IG51bTsgaSAhPSAwOyBpLS0pIAogCQl7CiAJCQljc3B0ciA9IHR3aWRUYWI7CiAKLQkJCWZvciAoaiA9IGJnbjsgaiAhPSAwOyBqLS0pCisJCQlmb3IgKGogPSBiZ247IGogIT0gMDsgai0tKSAKIAkJCXsKIAkJCQlyMCA9IHhwdHJbMF07CiAJCQkJcjEgPSB4cHRyWzFdOwogCQkJCXhwdHIgKz0gc3RlcDsKLQorCQkJCQogCQkJCXQwID0geHB0clswXTsKLQkJCQl0MSA9IHhwdHJbMV07CisJCQkJdDEgPSB4cHRyWzFdOwkJCQkKIAkJCQljb3N4ID0gY3NwdHJbMF07CiAJCQkJc2lueCA9IGNzcHRyWzFdOwogCQkJCXIyID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypiciArIHNpbipiaSAqLwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJCQkJcjEgPSB0MSAtIHIzOwogCQkJCXIyID0gdDAgKyByMjsKIAkJCQlyMyA9IHQxICsgcjM7Ci0KKwkJCQkKIAkJCQl0MCA9IHhwdHJbMF07CiAJCQkJdDEgPSB4cHRyWzFdOwogCQkJCWNvc3ggPSBjc3B0clsyXTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCQkJCXI0ID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypjciArIHNpbipjaSAqLwogCQkJCXI1ID0gTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKTsJCS8qIGNvcypjaSAtIHNpbipjciAqLwogCQkJCXhwdHIgKz0gc3RlcDsKLQorCQkJCQogCQkJCXQwID0geHB0clswXTsKIAkJCQl0MSA9IHhwdHJbMV07CiAJCQkJY29zeCA9IGNzcHRyWzRdOwpAQCAtMjgyLDI1ICsyODIsMjUgQEAKIAlpbnQgdHIxLCB0aTEsIHRyMiwgdGkyOwogCWludCBjb3NhLCBzaW5hLCBjb3NiLCBzaW5iOwogCWludCAqYnVmMTsKLQorCQogCWJ1ZjEgPSBidWYwICsgbnVtIC0gMTsKIAogCWZvcihpID0gbnVtID4+IDI7IGkgIT0gMDsgaS0tKQogCXsKLQkJY29zYSA9ICpjc3B0cisrOwotCQlzaW5hID0gKmNzcHRyKys7Ci0JCWNvc2IgPSAqY3NwdHIrKzsKLQkJc2luYiA9ICpjc3B0cisrOworCQljb3NhID0gKmNzcHRyKys7CQorCQlzaW5hID0gKmNzcHRyKys7CQorCQljb3NiID0gKmNzcHRyKys7CQorCQlzaW5iID0gKmNzcHRyKys7CQkKIAogCQl0cjEgPSAqKGJ1ZjAgKyAwKTsKIAkJdGkyID0gKihidWYwICsgMSk7CiAJCXRyMiA9ICooYnVmMSAtIDEpOwogCQl0aTEgPSAqKGJ1ZjEgKyAwKTsKLQorCQkKIAkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKTsKLQkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKTsKLQotCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0aTIpIC0gTVVMSElHSChzaW5iLCB0cjIpOworCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0aTEpIC0gTVVMSElHSChzaW5hLCB0cjEpOwkJCisJCQorCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0aTIpIC0gTVVMSElHSChzaW5iLCB0cjIpOwkJCiAJCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMik7CiAJfQogfQpAQCAtMzE5LDEyICszMTksMTIgQEAKIAlpbnQgKmJ1ZjE7CiAKIAlidWYxID0gYnVmMCArIG51bSAtIDE7Ci0KKwkKIAlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkKIAl7Ci0JCWNvc2EgPSAqY3NwdHIrKzsKLQkJc2luYSA9ICpjc3B0cisrOwotCQljb3NiID0gKmNzcHRyKys7CisJCWNvc2EgPSAqY3NwdHIrKzsJCisJCXNpbmEgPSAqY3NwdHIrKzsJCisJCWNvc2IgPSAqY3NwdHIrKzsJCiAJCXNpbmIgPSAqY3NwdHIrKzsKIAogCQl0cjEgPSAqKGJ1ZjAgKyAwKTsKQEAgLTMzMywxMCArMzMzLDEwIEBACiAJCXRyMiA9ICooYnVmMSAtIDEpOwogCiAJCSpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSk7Ci0JCSpidWYxLS0gPSBNVUxISUdIKHNpbmEsIHRyMSkgLSBNVUxISUdIKGNvc2EsIHRpMSk7Ci0KKwkJKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKTsJCQorCQkKIAkJKmJ1ZjArKyA9IE1VTEhJR0goc2luYiwgdHIyKSAtIE1VTEhJR0goY29zYiwgdGkyKTsKLQkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKTsKKwkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKTsJCiAJfQogfQogI2VuZGlmCkBAIC0zNTMsMTcgKzM1MywxNyBAQAogCVByZU1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOwogCiAJU2h1ZmZsZShidWYsIDUxMiwgYml0cmV2VGFiICsgMTcpOwotCVJhZGl4OEZpcnN0KGJ1ZiwgNTEyID4+IDMpOworCVJhZGl4OEZpcnN0KGJ1ZiwgNTEyID4+IDMpOwkJCQkJCQogCVJhZGl4NEZGVChidWYsIDUxMiA+PiAzLCA4LCAoaW50ICopdHdpZFRhYjUxMik7CiAKLQlQb3N0TURDVChidWYsIDEwMjQsIGNvc3NpbnRhYiArIDEyOCk7CisJUG9zdE1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOwkKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBmdW5jdGlvbiBuYW1lOiBNZGN0X1Nob3J0Ci0qIGRlc2NyaXB0aW9uOiAgdGhlIHNob3J0IGJsb2NrIG1kY3QKKyogZGVzY3JpcHRpb246ICB0aGUgc2hvcnQgYmxvY2sgbWRjdCAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIE1kY3RfU2hvcnQoaW50ICpidWYpCkBAIC0zNzEsMTAgKzM3MSwxMCBAQAogCVByZU1EQ1QoYnVmLCAxMjgsIGNvc3NpbnRhYik7CiAKIAlTaHVmZmxlKGJ1ZiwgNjQsIGJpdHJldlRhYik7Ci0JUmFkaXg0Rmlyc3QoYnVmLCA2NCA+PiAyKTsKLQlSYWRpeDRGRlQoYnVmLCA2NCA+PiAyLCA0LCAoaW50ICopdHdpZFRhYjY0KTsKKwlSYWRpeDRGaXJzdChidWYsIDY0ID4+IDIpOwkJCQkJCQorCVJhZGl4NEZGVChidWYsIDY0ID4+IDIsIDQsIChpbnQgKil0d2lkVGFiNjQpOwkKIAotCVBvc3RNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOworCVBvc3RNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOwkKIH0KIAogCkBAIC0zODIsNyArMzgyLDcgQEAKICoKICogZnVuY3Rpb24gbmFtZTogc2hpZnRNZGN0RGVsYXlCdWZmZXIKICogZGVzY3JpcHRpb246ICAgIHRoZSBtZGN0IGRlbGF5IGJ1ZmZlciBoYXMgYSBzaXplIG9mIDE2MDAsCi0qICBzbyB0aGUgY2FsY3VsYXRpb24gb2YgTE9ORyxTVE9QIG11c3QgYmUgIHNwaWx0IGluIHR3bworKiAgc28gdGhlIGNhbGN1bGF0aW9uIG9mIExPTkcsU1RPUCBtdXN0IGJlICBzcGlsdCBpbiB0d28gCiAqICBwYXNzZXMgd2l0aCAxMDI0IHNhbXBsZXMgYW5kIGEgbWlkIHNoaWZ0LAogKiAgdGhlIFNIT1JUIHRyYW5zZm9ybXMgY2FuIGJlIGNvbXBsZXRlZCBpbiB0aGUgZGVsYXkgYnVmZmVyLAogKiAgYW5kIGFmdGVyd2FyZHMgYSBzaGlmdApAQCAtNDA5LDcgKzQwOSw3IEBACiAJZHNCdWYgPSB0aW1lU2lnbmFsOwogCiAJZm9yKGk9MDsgaTxGUkFNRV9MRU5fTE9ORzsgaSs9OCkKLQl7CisJeyAgIAogCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CiAJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKIAkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwpAQCAtNDcwLDEwICs0NzAsMTAgQEAKIAogCVdvcmQzMiBkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZixtaW5TZjsKIAlXb3JkMzIgaGVhZFJvb209MDsKLQorCQogCXN3aXRjaChibG9ja1R5cGUpewotCi0KKwkJCisJCQogCWNhc2UgTE9OR19XSU5ET1c6CiAJCS8qCiAJCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyA0NDggbmV3IHRpbWVTaWduYWwgc2FtcGxlcwpAQCAtNDgzLDE1ICs0ODMsMTUgQEAKIAkJdGltZVNpZ25hbFNmICA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZSh0aW1lU2lnbmFsLDIqRlJBTUVfTEVOX0xPTkctQkxPQ0tfU1dJVENISU5HX09GRlNFVCxjaEluY3JlbWVudCk7CiAJCW1pblNmID0gbWluKGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmKTsKIAkJbWluU2YgPSBtaW4obWluU2YsMTQpOwotCisJCQogCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7CiAJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKIAkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMjsKLQorCQkKIAkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLwogCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKIAkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsgCiAJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwogCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwogCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKQEAgLTQ5OSwzMCArNDk5LDMwIEBACiAJCQkvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KIAkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7CiAJCX0KLQorCQkKIAkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCisJCQogCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBuZXcgYnVmZmVyKi8KIAkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwogCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxOworCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsgCiAJCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspeworCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspeyAgICAKIAkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKIAkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CiAJCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7CiAJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwogCQkJd2luUHRyKys7CiAJCQkvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJCSpvdXREYXRhMC0tID0gLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7CisJCQkqb3V0RGF0YTAtLSA9IC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAKIAkJfQogCiAJCU1kY3RfTG9uZyhyZWFsT3V0KTsKIAkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwogCQltaW5TZiA9IDE0IC0gbWluU2Y7Ci0JCSptZGN0U2NhbGU9bWluU2Y7CisJCSptZGN0U2NhbGU9bWluU2Y7IAogCQlicmVhazsKLQorCQkKIAljYXNlIFNUQVJUX1dJTkRPVzoKIAkJLyoKIAkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQgKDE2MDAgKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIG5vIHRpbWVTaWduYWwgc2FtcGxlcwpAQCAtNTMzLDcgKzUzMyw3IEBACiAKIAkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwogCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7IAkJCiAJCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwogCiAJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KQEAgLTU0NSwxOCArNTQ1LDE4IEBACiAJCQl3aW5QdHIgKys7CiAJCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCiAJCX0KLQorCQkKIAkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCi0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxOworCQkKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7IAogCQlmb3IoaT0wO2k8TFNfVFJBTlM7aSsrKXsKLQkJCSpvdXREYXRhMC0tID0gLW1kY3REZWxheUJ1ZmZlcltpXSA8PCAoMTUgLSAyICsgbWluU2YpOworCQkJKm91dERhdGEwLS0gPSAtbWRjdERlbGF5QnVmZmVyW2ldIDw8ICgxNSAtIDIgKyBtaW5TZik7ICAKIAkJfQotCisJCQogCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBuZXcgYnVmZmVyKi8KIAkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyICsgTFNfVFJBTlM7CiAJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMSAtIExTX1RSQU5TOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMSAtTFNfVFJBTlM7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxIC1MU19UUkFOUzsgCiAJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CiAJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspewogCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjArKykgPDwgbWluU2Y7CkBAIC01NzIsNyArNTcyLDcgQEAKIAkJbWluU2YgPSAxNCAtIG1pblNmOwogCQkqbWRjdFNjYWxlPSBtaW5TZjsKIAkJYnJlYWs7Ci0KKwkJCiAJY2FzZSBTVE9QX1dJTkRPVzoKIAkJLyoKIAkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQtTFNfVFJBTlMgKDE2MDAtNDQ4ICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyA0NDggbmV3IHRpbWVTaWduYWwgc2FtcGxlcwpAQCAtNTgwLDE5ICs1ODAsMTkgQEAKIAkJKi8KIAkJZGVsYXlCdWZmZXJTZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrTFNfVFJBTlMsQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUywxKTsKIAkJdGltZVNpZ25hbFNmICA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZSh0aW1lU2lnbmFsLDIqRlJBTUVfTEVOX0xPTkctQkxPQ0tfU1dJVENISU5HX09GRlNFVCxjaEluY3JlbWVudCk7Ci0JCW1pblNmID0gbWluKGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmKTsKKwkJbWluU2YgPSBtaW4oZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YpOyAgICAKIAkJbWluU2YgPSBtaW4obWluU2YsMTMpOwotCisJCQogCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yOwogCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7CiAJCWZvcihpPTA7aTxMU19UUkFOUztpKyspewotCQkJKm91dERhdGEwKysgPSAtKCpkY3RJbjEtLSkgPDwgKDE1IC0gMiArIG1pblNmKTsKKwkJCSpvdXREYXRhMCsrID0gLSgqZGN0SW4xLS0pIDw8ICgxNSAtIDIgKyBtaW5TZik7ICAgIAogCQl9Ci0KKwkJCiAJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KIAkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyICsgTFNfVFJBTlM7CiAJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMSAtIExTX1RSQU5TOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yICsgTFNfVFJBTlM7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgKyBMU19UUkFOUzsgCiAJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CiAJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspewogCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOwpAQCAtNjAyLDEzICs2MDIsMTMgQEAKIAkJCXdpblB0cisrOwogCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwogCQl9Ci0KKwkJCiAJCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQorCQkKIAkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCiAJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKIAkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7IAogCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKIAkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKIAkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4wKyspIDw8IG1pblNmOwpAQCAtNjE4LDI2ICs2MTgsMjYgQEAKIAkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCiAJCQl3aW5QdHIrKzsKIAkJfQotCisJCQogCQlNZGN0X0xvbmcocmVhbE91dCk7CiAJCW1pblNmID0gMTQgLSBtaW5TZjsKIAkJKm1kY3RTY2FsZT0gbWluU2Y7IC8qIHVwZGF0ZSBzY2FsZSBmYWN0b3IgKi8KIAkJYnJlYWs7Ci0KKwkJCiAJY2FzZSBTSE9SVF9XSU5ET1c6CiAJCS8qCiAJCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyBubyBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCiAJCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKLQkJKi8KKwkJKi8JCQogCQltaW5TZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrVFJBTlNGT1JNX09GRlNFVF9TSE9SVCw5KkZSQU1FX0xFTl9TSE9SVCwxKTsKIAkJbWluU2YgPSBtaW4obWluU2YsMTApOwotCi0KKwkJCisJCQogCQlmb3Iodz0wO3c8VFJBTlNfRkFDO3crKyl7CiAJCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIrdypGUkFNRV9MRU5fU0hPUlQrVFJBTlNGT1JNX09GRlNFVF9TSE9SVDsKIAkJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlcit3KkZSQU1FX0xFTl9TSE9SVCtUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICsgRlJBTUVfTEVOX1NIT1JULTE7Ci0JCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fU0hPUlQvMjsKLQkJCW91dERhdGExID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yIC0gMTsKKwkJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yOyAKKwkJCW91dERhdGExID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yIC0gMTsgCiAKIAkJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CiAJCQlmb3IoaT0wO2k8RlJBTUVfTEVOX1NIT1JULzI7aSsrKXsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCQkJCXRpbWVTaWduYWxTYW1wbGU9ICpkY3RJbjEgPDwgbWluU2Y7CiAJCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKIAkJCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0KKwkJCQkKIAkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMCArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7CiAJCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKIAkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqKGRjdEluMSArIEZSQU1FX0xFTl9TSE9SVCkgPDwgbWluU2Y7CkBAIC02NjEsMTAgKzY2MSwxMCBAQAogCQkJTWRjdF9TaG9ydChyZWFsT3V0KTsKIAkJCXJlYWxPdXQgKz0gRlJBTUVfTEVOX1NIT1JUOwogCQl9Ci0KKwkJCiAJCW1pblNmID0gMTEgLSBtaW5TZjsKIAkJKm1kY3RTY2FsZSA9IG1pblNmOyAvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCi0KKwkJCiAJCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKIAkJYnJlYWs7CiAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMDBkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJBTVJOQkRlY29kZXIuaCIKLQotI2luY2x1ZGUgImdzbWFtcl9kZWMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxNjA7Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IDgwMDA7Ci0KLUFNUk5CRGVjb2Rlcjo6QU1STkJEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAotICAgICAgbVN0YXRlKE5VTEwpLAotICAgICAgbUFuY2hvclRpbWVVcygwKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAotICAgICAgbUlucHV0QnVmZmVyKE5VTEwpIHsKLX0KLQotQU1STkJEZWNvZGVyOjp+QU1STkJEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBTVJOQkRlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKAotICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyKGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIENIRUNLX0VRKEdTTUluaXREZWNvZGUoJm1TdGF0ZSwgKFdvcmQ4ICopIkFNUk5CRGVjb2RlciIpLCAwKTsKLQotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICBtQW5jaG9yVGltZVVzID0gMDsKLSAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTVJOQkRlY29kZXI6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlcikgewotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7Ci0KLSAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1TdGF0ZSk7Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gQU1STkJEZWNvZGVyOjpnZXRGb3JtYXQoKSB7Ci0gICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0KLSAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKLSAgICBDSEVDS19FUShudW1DaGFubmVscywgMSk7Ci0KLSAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKLSAgICBDSEVDS19FUShzYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBTVJOQkRlY29kZXIiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBBTVJOQkRlY29kZXI6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHN0YXR1c190IGVycjsKLQotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7Ci0KLSAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlZWtUaW1lVXMgPSAtMTsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIGEgbmV3IHRpbWVzdGFtcCBhZnRlciBzZWVraW5nLgotICAgICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA8IDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpLCBPSyk7Ci0KLSAgICBjb25zdCB1aW50OF90ICppbnB1dFB0ciA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopbUlucHV0QnVmZmVyLT5kYXRhKCkgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9Ci0gICAgICAgIEFNUkRlY29kZShtU3RhdGUsCi0gICAgICAgICAgKEZyYW1lX1R5cGVfM0dQUCkoKGlucHV0UHRyWzBdID4+IDMpICYgMHgwZiksCi0gICAgICAgICAgKFVXb3JkOCAqKSZpbnB1dFB0clsxXSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90ICo+KGJ1ZmZlci0+ZGF0YSgpKSwKLSAgICAgICAgICBNSU1FX0lFVEYpOwotCi0gICAgKytudW1CeXRlc1JlYWQ7ICAvLyBJbmNsdWRlIHRoZSBmcmFtZSB0eXBlIGhlYWRlciBieXRlLgotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSk7Ci0KLSAgICBpZiAobnVtQnl0ZXNSZWFkID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAvLyBUaGlzIGlzIGJhZCwgc2hvdWxkIG5ldmVyIGhhdmUgaGFwcGVuZWQsIGJ1dCBkaWQuIEFib3J0IG5vdy4KLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBudW1CeXRlc1JlYWQpOwotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLAotICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMCkgLyBrU2FtcGxlUmF0ZSk7Ci0KLSAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCBhNTQ1NzYyLi4yM2EyMmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC0yLDcgKzIsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgICAgIEFNUk5CRGVjb2Rlci5jcHAgXAogIAlzcmMvYV9yZWZsLmNwcCBcCiAgCXNyYy9hZ2MuY3BwIFwKICAJc3JjL2FtcmRlY29kZS5jcHAgXApAQCAtNTIsMyArNTEsMzMgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0QU1SLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24gXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbgorCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9hbXJkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTU4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QU1SIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdEFNUi5oIgorCisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0QU1SOjpTb2Z0QU1SKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1Nb2RlKE1PREVfTkFSUk9XKSwKKyAgICAgIG1TdGF0ZShOVUxMKSwKKyAgICAgIG1EZWNvZGVyQnVmKE5VTEwpLAorICAgICAgbURlY29kZXJDb29raWUoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1BbmNob3JUaW1lVXMoMCksCisgICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIikpIHsKKyAgICAgICAgbU1vZGUgPSBNT0RFX1dJREU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIikpOworICAgIH0KKworICAgIGluaXRQb3J0cygpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRBTVI6On5Tb2Z0QU1SKCkgeworICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgeworICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1TdGF0ZSk7CisgICAgICAgIG1TdGF0ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIG1EZWNvZGVyQnVmID0gTlVMTDsKKworICAgICAgICBtU3RhdGUgPSBOVUxMOworICAgICAgICBtRGVjb2RlckNvb2tpZSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIFNvZnRBTVI6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA4MTkyOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0KKyAgICAgICAgbU1vZGUgPT0gTU9ERV9OQVJST1cKKyAgICAgICAgICAgID8gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9hbXIiKQorICAgICAgICAgICAgOiBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL2FtcndiIik7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ0FNUjsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworCisgICAgZGVmLm5CdWZmZXJTaXplID0KKyAgICAgICAgKG1Nb2RlID09IE1PREVfTkFSUk9XID8ga051bVNhbXBsZXNQZXJGcmFtZU5CIDoga051bVNhbXBsZXNQZXJGcmFtZVdCKQorICAgICAgICAgICAgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRBTVI6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgeworICAgICAgICBXb3JkMTYgZXJyID0gR1NNSW5pdERlY29kZSgmbVN0YXRlLCAoV29yZDggKikiQU1STkJEZWNvZGVyIik7CisKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3QgbWVtUmVxID0gcHZEZWNvZGVyX0FtcldiTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcSk7CisKKyAgICAgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJm1TdGF0ZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBTVI6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChhbXJQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFtclBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIGFtclBhcmFtcy0+ZUFNUkRUWE1vZGUgPSBPTVhfQVVESU9fQU1SRFRYTW9kZU9mZjsKKyAgICAgICAgICAgIGFtclBhcmFtcy0+ZUFNUkZyYW1lRm9ybWF0ID0gT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0Q29uZm9ybWFuY2U7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBhbXJQYXJhbXMtPm5CaXRSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBhbXJQYXJhbXMtPmVBTVJCYW5kTW9kZSA9IE9NWF9BVURJT19BTVJCYW5kTW9kZVVudXNlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW1yUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgYW1yUGFyYW1zLT5lQU1SQmFuZE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBtTW9kZSA9PSBNT0RFX05BUlJPVworICAgICAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAgOiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKworICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0KKyAgICAgICAgICAgICAgICAobU1vZGUgPT0gTU9ERV9OQVJST1cpID8ga1NhbXBsZVJhdGVOQiA6IGtTYW1wbGVSYXRlV0I7CisKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QU1SOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfTkFSUk9XKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hbXJuYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hbXJ3YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICphYWNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0QU1SOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID4gMDsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUodW5zaWduZWQgRlQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVXQls5XSA9IHsKKyAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NworICAgIH07CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0ga0ZyYW1lU2l6ZVdCW0ZUXTsKKworICAgIC8vIFJvdW5kIHVwIGJpdHMgdG8gYnl0ZXMgYW5kIGFkZCAxIGZvciB0aGUgaGVhZGVyIGJ5dGUuCisgICAgZnJhbWVTaXplID0gKGZyYW1lU2l6ZSArIDcpIC8gOCArIDE7CisKKyAgICByZXR1cm4gZnJhbWVTaXplOworfQorCit2b2lkIFNvZnRBTVI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dFB0ciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGludDMyX3QgbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgeworICAgICAgICAgICAgbnVtQnl0ZXNSZWFkID0KKyAgICAgICAgICAgICAgICBBTVJEZWNvZGUobVN0YXRlLAorICAgICAgICAgICAgICAgICAgKEZyYW1lX1R5cGVfM0dQUCkoKGlucHV0UHRyWzBdID4+IDMpICYgMHgwZiksCisgICAgICAgICAgICAgICAgICAoVVdvcmQ4ICopJmlucHV0UHRyWzFdLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG91dEhlYWRlci0+cEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICBNSU1FX0lFVEYpOworCisgICAgICAgICAgICBpZiAobnVtQnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUFYgQU1SIGRlY29kZXIgQU1SRGVjb2RlKCkgY2FsbCBmYWlsZWQiKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK251bUJ5dGVzUmVhZDsgIC8vIEluY2x1ZGUgdGhlIGZyYW1lIHR5cGUgaGVhZGVyIGJ5dGUuCisKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bUJ5dGVzUmVhZCkgPiBpbkhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmFkLCBzaG91bGQgbmV2ZXIgaGF2ZSBoYXBwZW5lZCwgYnV0IGRpZC4gQWJvcnQgbm93LgorCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQxNiBtb2RlID0gKChpbnB1dFB0clswXSA+PiAzKSAmIDB4MGYpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtb2RlKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBmcmFtZVNpemUpOworCisgICAgICAgICAgICBpbnQxNiBmcmFtZVR5cGU7CisgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgIG1pbWVfdW5zb3J0aW5nKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0UHRyWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0U2FtcGxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAmZnJhbWVUeXBlLCAmbW9kZSwgMSwgJnJ4X3N0YXRlKTsKKworICAgICAgICAgICAgaW50MTZfdCAqb3V0UHRyID0gKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXI7CisKKyAgICAgICAgICAgIGludDE2X3QgbnVtU2FtcGxlc091dHB1dDsKKyAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYigKKyAgICAgICAgICAgICAgICAgICAgbW9kZSwgbUlucHV0U2FtcGxlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBvdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICZudW1TYW1wbGVzT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgZnJhbWVUeXBlLCBtRGVjb2RlckNvb2tpZSk7CisKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbnVtU2FtcGxlc091dHB1dCwgKGludClrTnVtU2FtcGxlc1BlckZyYW1lV0IpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzUGVyRnJhbWVXQjsgKytpKSB7CisgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRoZSAyIExTQnMgKDE0LWJpdCBvdXRwdXQpICovCisgICAgICAgICAgICAgICAgb3V0UHRyW2ldICY9IDB4ZmZmQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtQnl0ZXNSZWFkID0gZnJhbWVTaXplOworICAgICAgICB9CisKKyAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbnVtQnl0ZXNSZWFkOworICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworCisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgeworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga051bVNhbXBsZXNQZXJGcmFtZU5CICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQorICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKKyAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8ga1NhbXBsZVJhdGVOQjsKKworICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgKz0ga051bVNhbXBsZXNQZXJGcmFtZU5COworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga051bVNhbXBsZXNQZXJGcmFtZVdCICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQorICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKKyAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8ga1NhbXBsZVJhdGVXQjsKKworICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgKz0ga051bVNhbXBsZXNQZXJGcmFtZVdCOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgIH0KK30KKwordm9pZCBTb2Z0QU1SOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworfQorCit2b2lkIFNvZnRBTVI6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QU1SKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU5NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9BTVJfSF8KKworI2RlZmluZSBTT0ZUX0FNUl9IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QU1SIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBTVIoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBTVIoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzICAgICAgICAgICAgID0gNCwKKyAgICAgICAga1NhbXBsZVJhdGVOQiAgICAgICAgICAgPSA4MDAwLAorICAgICAgICBrU2FtcGxlUmF0ZVdCICAgICAgICAgICA9IDE2MDAwLAorICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lTkIgICA9IDE2MCwKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZVdCICAgPSAzMjAsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBNT0RFX05BUlJPVywKKyAgICAgICAgTU9ERV9XSURFCisKKyAgICB9IG1Nb2RlOworCisgICAgdm9pZCAqbVN0YXRlOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworICAgIGludDE2X3QgKm1EZWNvZGVyQ29va2llOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QU1SKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9BTVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FNUldCRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQU1SV0JEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyMTQ3Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQU1SV0JEZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkFNUldCRGVjb2Rlci5oIgotCi0jaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOwotc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGUgPSAxNjAwMDsKLQotQU1SV0JEZWNvZGVyOjpBTVJXQkRlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCi0gICAgICBtU3RhdGUoTlVMTCksCi0gICAgICBtRGVjb2RlckJ1ZihOVUxMKSwKLSAgICAgIG1EZWNvZGVyQ29va2llKE5VTEwpLAotICAgICAgbUFuY2hvclRpbWVVcygwKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAotICAgICAgbUlucHV0QnVmZmVyKE5VTEwpIHsKLX0KLQotQU1SV0JEZWNvZGVyOjp+QU1SV0JEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBTVJXQkRlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKAotICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyKGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIGludDMyX3QgbWVtUmVxID0gcHZEZWNvZGVyX0FtcldiTWVtUmVxdWlyZW1lbnRzKCk7Ci0gICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKLQotICAgIHB2RGVjb2Rlcl9BbXJXYl9Jbml0KCZtU3RhdGUsIG1EZWNvZGVyQnVmLCAmbURlY29kZXJDb29raWUpOwotCi0gICAgbVNvdXJjZS0+c3RhcnQoKTsKLQotICAgIG1BbmNob3JUaW1lVXMgPSAwOwotICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFNUldCRGVjb2Rlcjo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIGZyZWUobURlY29kZXJCdWYpOwotICAgIG1EZWNvZGVyQnVmID0gTlVMTDsKLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBTVJXQkRlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLQotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwotICAgIENIRUNLX0VRKG51bUNoYW5uZWxzLCAxKTsKLQotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgIENIRUNLX0VRKHNhbXBsZVJhdGUsIGtTYW1wbGVSYXRlKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFNUldCRGVjb2RlciIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKHVuc2lnbmVkIEZUKSB7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbOV0gPSB7Ci0gICAgICAgIDEzMiwgMTc3LCAyNTMsIDI4NSwgMzE3LCAzNjUsIDM5NywgNDYxLCA0NzcKLSAgICB9OwotCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGtGcmFtZVNpemVXQltGVF07Ci0KLSAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgotICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOwotCi0gICAgcmV0dXJuIGZyYW1lU2l6ZTsKLX0KLQotc3RhdHVzX3QgQU1SV0JEZWNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7Ci0KLSAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlZWtUaW1lVXMgPSAtMTsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBoYXZlIGEgbmV3IHRpbWVzdGFtcCBhZnRlciBzZWVraW5nLgotICAgICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA8IDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpLCBPSyk7Ci0KLSAgICBjb25zdCB1aW50OF90ICppbnB1dFB0ciA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopbUlucHV0QnVmZmVyLT5kYXRhKCkgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgaW50MTYgbW9kZSA9ICgoaW5wdXRQdHJbMF0gPj4gMykgJiAweDBmKTsKLSAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1vZGUpOwotICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gZnJhbWVTaXplKTsKLQotICAgIGludDE2IGZyYW1lVHlwZTsKLSAgICBSWF9TdGF0ZSByeF9zdGF0ZTsKLSAgICBtaW1lX3Vuc29ydGluZygKLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPigmaW5wdXRQdHJbMV0pLAotICAgICAgICAgICAgbUlucHV0U2FtcGxlQnVmZmVyLAotICAgICAgICAgICAgJmZyYW1lVHlwZSwgJm1vZGUsIDEsICZyeF9zdGF0ZSk7Ci0KLSAgICBpbnQxNl90ICpvdXRQdHIgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotCi0gICAgaW50MTZfdCBudW1TYW1wbGVzT3V0cHV0OwotICAgIHB2RGVjb2Rlcl9BbXJXYigKLSAgICAgICAgICAgIG1vZGUsIG1JbnB1dFNhbXBsZUJ1ZmZlciwKLSAgICAgICAgICAgIG91dFB0ciwKLSAgICAgICAgICAgICZudW1TYW1wbGVzT3V0cHV0LAotICAgICAgICAgICAgbURlY29kZXJCdWYsIGZyYW1lVHlwZSwgbURlY29kZXJDb29raWUpOwotCi0gICAgQ0hFQ0tfRVEobnVtU2FtcGxlc091dHB1dCwga051bVNhbXBsZXNQZXJGcmFtZSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzUGVyRnJhbWU7ICsraSkgewotICAgICAgICAvKiBEZWxldGUgdGhlIDIgTFNCcyAoMTQtYml0IG91dHB1dCkgKi8KLSAgICAgICAgb3V0UHRyW2ldICY9IDB4ZmZmQzsKLSAgICB9Ci0KLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBudW1TYW1wbGVzT3V0cHV0ICogc2l6ZW9mKGludDE2X3QpKTsKLQotICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZVNpemUpOwotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLAotICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMCkgLyBrU2FtcGxlUmF0ZSk7Ci0KLSAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKaW5kZXggYWI1OTFkNy4uYzllMWMyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgQU1SV0JEZWNvZGVyLmNwcCBcCiAJc3JjL2FnYzJfYW1yX3diLmNwcCBcCiAgCXNyYy9iYW5kX3Bhc3NfNmtfN2suY3BwIFwKICAJc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5jcHAKaW5kZXggOWZmODgxNi4uZTE5NjZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21pbWVfaW8uY3BwCkBAIC01MzEsNyArNTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50MTYgKiBmcmFtZV90eXBlLAogICAgICAgICAgICAgICAgICAgICBpbnQxNiAqIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgIFJYX1N0YXRlICpzdCkKKyAgICAgICAgICAgICAgICAgICAgUlhfU3RhdGVfd2IgKnN0KQogewogCiAgICAgaW50MTYgaTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaAppbmRleCA0MzNmYzkyLi5jNDBiYzEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIHsKICAgICBpbnQxNiBwcmV2X2Z0OwogICAgIGludDE2IHByZXZfbW9kZTsKLX0gUlhfU3RhdGU7Cit9IFJYX1N0YXRlX3diOwogCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBFTlVNRVJBVEVEIFRZUEVERUYnUwpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqZnJhbWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2ICptb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDggcSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJYX1N0YXRlICpzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiAqc3QpOwogCiAKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKaW5kZXggNzE0MWNiYS4uNTE3OTM4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKQEAgLTIsOCArMiw4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIGluY2x1ZGUgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCiAKKyAJCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUFNUldCRW5jb2Rlci5jcHAgXAogCXNyYy9hdXRvY29yci5jIFwKQEAgLTkxLDcgKzkxLDcgQEAKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKaW5kZXggYzA5NGQ0MS4uNGZmNWYxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAl1c2VEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSgmbW9wZXIpOwogCiAjaWZkZWYgTElOVVgKLQloYW5kbGUgPSBkbG9wZW4oIi9kYXRhL2xvY2FsL3RtcC92b0FNUldCRW5jLnNvIiwgUlRMRF9OT1cpOworCWhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHQuc28iLCBSVExEX05PVyk7CiAJaWYoaGFuZGxlID09IDApCiAJewogCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tawppbmRleCAxNDllNTkxLi44NWRkY2ViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQubWsKQEAgLTEsMjUgKzEsMjUgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVMgOj0gCUFNUldCX0VfU0FNUExFLmMKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQU1SV0JfRV9TQU1QTEUuYyBcCisgICAgLi4vLi4vY29tbW9uL2Ntbk1lbW9yeS5jCiAKLUxPQ0FMX1NSQ19GSUxFUyArPSAJXAotCS4uLy4uLy4uL0NvbW1vbi9jbW5NZW1vcnkuYwotCi1MT0NBTF9NT0RVTEUgOj0gVGVzdHZvQU1SV0JFbmMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCitMT0NBTF9NT0RVTEUgOj0gQU1SV0JFbmNUZXN0CiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidm9BTVJXQkVuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYmRsCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoTE9DQUxfUEFUSCkvIFwKLQkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL0NvbW1vbiBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9JbmNsdWRlIFwKLQotTE9DQUxfQ0ZMQUdTIDo9ICQoVk9fQ0ZMQUdTKQorICAgICQoTE9DQUxfUEFUSCkvIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uLy4uL2NvbW1vbiBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi9jb21tb24vaW5jbHVkZQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhiOTQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi0jIHRhcmdldDYKLSMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQotVk9UVDo9IHY2Ci0KLQotIyBtb2R1bGUgdHlwZQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQotVk9NVDo9IGV4ZQotCi0KLSMgbW9kdWxlIG1hY3JvcwotIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4KLSMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZQotVk9NTTo9ICNBUk1WNUUKLQotCi0KLSMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUKLVZPVEFSR0VUOj0gdm9BTVJXQkVuY19UZXN0Ci0KLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tawotCi0jIGRlcGVuZGVudCBsaWJyYXJpZXMuCi1WT0RFUExJQlM6PS1sZGwKLQotCi0jIG1vZHVsZSBzb3VyY2UKLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlCi1pbmNsdWRlIC4uL21zLm1rCi0KLQotIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkCi1WT1JFTERJUjo9Li4vCi0KLQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsKLWluY2x1ZGUgLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tawotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL21zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTUwY2VlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL21zLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIy8qCi0jICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jICoqCi0jICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAqKgotIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICoqCi0jICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jICovCi0jIHBsZWFzZSBsaXN0IGFsbCBvYmplY3RzIG5lZWRlZCBieSB5b3VyIHRhcmdldCBoZXJlCi1PQkpTOj1BTVJXQl9FX1NBTVBMRS5vIGNtbk1lbW9yeS5vCi0KLSMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZQotVk9TUkNESVI6PS4uLyBcCi0gICAgICAgICAgLi4vLi4vLi4vLi4vQ29tbW9uIFwKLQkgIC4uLy4uLy4uLy4uL0luY2x1ZGUKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2VjNzRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIy8qCi0jICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jICoqCi0jICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAqKgotIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICoqCi0jICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jICovCi0KLSMgdGFyZ2V0IHR5cGUKLSMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQotVk9UVDo9IHY1Ci0KLQotIyBtb2R1bGUgdHlwZQotIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQotVk9NVDo9IGxpYgotCi0KLSMgbW9kdWxlIG1hY3JvcwotIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4KLWlmZXEgKCQoVk9UVCksIHY1KQotVk9NTTo9LURBUk0gLURBU01fT1BUCi1lbmRpZgotCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlCi1WT1RBUkdFVDo9IGxpYnZvQU1SV0JFbmN2NQotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5tawotaW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsKLQotIyBkZXBlbmRlbnQgbGlicmFyaWVzLgotVk9ERVBMSUJTOj0tbGRsIC1sc3RkYysrIC1sY3V0aWxzCi0KLSMgbW9kdWxlIHNvdXJjZQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUKLWluY2x1ZGUgLi4vbXMubWsKLQotCi0jIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQKLVZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi8uLi9SZWxlYXNlCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDM2YTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotCi0jIHRhcmdldCB0eXBlCi0jIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikKLVZPVFQ6PSB2NwotCi0KLSMgbW9kdWxlIHR5cGUKLSMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUKLVZPTVQ6PSBsaWIKLQotCi0jIG1vZHVsZSBtYWNyb3MKLSMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuCi1pZmVxICgkKFZPVFQpLCB2NykKLVZPTU06PS1EQVJNIC1EQVJNVjcgLURBU01fT1BUCi1lbmRpZgotCi0jIHBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlCi1WT1RBUkdFVDo9IGxpYnZvQU1SV0JFbmN2NwotCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5tawotaW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsKLQotIyBkZXBlbmRlbnQgbGlicmFyaWVzLgotVk9ERVBMSUJTOj0tbGRsIC1sc3RkYysrIC1sY3V0aWxzCi0KLSMgbW9kdWxlIHNvdXJjZQotIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUKLWluY2x1ZGUgLi4vbXMubWsKLQotCi0jIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQKLVZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi8uLi9SZWxlYXNlCi0KLSMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rCi1pbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTgxZmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMvKgotIyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotIyAqKgotIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgKioKLSMgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAqKgotIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAqLwotIyBKdXN0IGFjdGluZyBhcyBGYXRoZXIgTWFrZWZpbGUgb2YgTW9kdWxlcwotIyBwbGVhc2Uga2VlcCB0aGUgbmFtZSAnbWFrZWZpbGUnIHVuY2hhbmdlZAotCi0jIE1vZHVsZSBTdWJkaXJzCi1WT01TRDo9JChkaXIgJChzaGVsbCBmaW5kIC4gLW5hbWUgJ01ha2VmaWxlJykpCi0KLWFsbDoKLQlmb3IgZGlyIGluICQoVk9NU0QpOyBcCi0JCWRvIFwKLQkJCSQoTUFLRSkgLUMgJCRkaXI7IFwKLQkJZG9uZQotCi0uUEhPTlk6Y2xlYW4gZGV2ZWwKLWNsZWFuOgotCWZvciBkaXIgaW4gJChWT01TRCk7IFwKLQkJZG8gXAotCQkJJChNQUtFKSAtQyAkJGRpciBjbGVhbjsgXAotCQlkb25lCi0KLWRldmVsOgotCWZvciBkaXIgaW4gJChWT01TRCk7IFwKLQkJZG8gXAotCQkJJChNQUtFKSAtQyAkJGRpciBkZXZlbDsgXAotCQlkb25lCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21zLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tcy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyZWM5YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21zLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIy8qCi0jICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0jICoqCi0jICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAqKgotIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICoqCi0jICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jICovCi0jIHBsZWFzZSBsaXN0IGFsbCBkaXJlY3RvcmllcyB0aGF0IGFsbCBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgd2l0aCB5b3VyIG1vZHVsZSguaCAuYyAuY3BwKSBsb2NhdGUKLVZPU1JDRElSOj0uLi8uLi8uLi9pbmMgXAotICAgICAgICAgIC4uLy4uLy4uL3NyYyBcCi0JICAuLi8uLi8uLi8uLi8uLi9JbmNsdWRlCi0KLSMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUKLU9CSlM6PSBhdXRvY29yci5vIGF6X2lzcC5vIGJpdHMubyBjMnQ2NGZ4Lm8gYzR0NjRmeC5vIGNvbnZvbHZlLm8gY29yX2hfeC5vIGRlY2ltNTQubyBcCi0gICAgICAgZGVlbXBoLm8gZHR4Lm8gZ19waXRjaC5vIGdwY2xpcC5vIGhvbWluZy5vIGhwNDAwLm8gaHA1MC5vIGhwNmsubyBocF93c3AubyBcCi0gICAgICAgaW50X2xwYy5vIGlzcF9hei5vIGlzcF9pc2YubyBsYWdfd2luZC5vIGxldmluc29uLm8gbG9nMi5vIGxwX2RlYzIubyBtYXRoX29wLm8gbWVtX2FsaWduLm8gXAotICAgICAgIG9wZXJfMzJiLm8gcF9tZWRfb2wubyBwaXRfc2hycC5vIHBpdGNoX2Y0Lm8gcHJlZF9sdDQubyBwcmVlbXBoLm8gcV9nYWluMi5vIHFfcHVsc2UubyBcCi0gICAgICAgcWlzZl9ucy5vIHFwaXNmXzJzLm8gcmFuZG9tLm8gcmVzaWR1Lm8gc2NhbGUubyBzdHJlYW0ubyBzeW5fZmlsdC5vIHVwZHRfdGFyLm8gdXRpbC5vIFwKLSAgICAgICB2b0FNUldCRW5jLm8gdm9pY2VmYWMubyB3Yl92YWQubyB3ZWlnaHRfYS5vCi0KLQotaWZlcSAoJChWT1RUKSwgdjUpCi1PQkpTICs9IGNvcl9oX3ZlY19vcHQubyBEZWVtcGhfMzJfb3B0Lm8gRG90X3Bfb3B0Lm8gRmlsdF82a183a19vcHQubyByZXNpZHVfYXNtX29wdC5vIFwKLSAgICAgICBzY2FsZV9zaWdfb3B0Lm8gU3luX2ZpbHRfMzJfb3B0Lm8gc3luX2ZpbHRfb3B0Lm8gcHJlZF9sdDRfMV9vcHQubyBjb252b2x2ZV9vcHQubyBcCi0gICAgICAgTm9ybV9Db3JyX29wdC5vCi1WT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFCi1lbmRpZgotCi1pZmVxICgkKFZPVFQpLCB2NykKLU9CSlMrPSBjb3JfaF92ZWNfbmVvbi5vIERlZW1waF8zMl9uZW9uLm8gRG90X3BfbmVvbi5vIEZpbHRfNmtfN2tfbmVvbi5vIHJlc2lkdV9hc21fbmVvbi5vIFwKLSAgICAgICBzY2FsZV9zaWdfbmVvbi5vIFN5bl9maWx0XzMyX25lb24ubyBzeW5fZmlsdF9uZW9uLm8gcHJlZF9sdDRfMV9uZW9uLm8gY29udm9sdmVfbmVvbi5vIFwKLSAgICAgICBOb3JtX0NvcnJfbmVvbi5vCi1WT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjcKLWVuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaAppbmRleCBjMjNkY2U2Li43NzM0OTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Jhc2ljX29wLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iYXNpY19vcC5oCkBAIC0zMyw3ICszMyw3IEBACiAjZGVmaW5lICBzdGF0aWNfdm8gIHN0YXRpYyBfX2lubGluZV9fCiAjZWxzZQogI2RlZmluZSAgc3RhdGljX3ZvICBzdGF0aWMgX19pbmxpbmUKLSNlbmRpZgorI2VuZGlmIAogCiAjZGVmaW5lIHNhdHVyYXRlKExfdmFyMSkgKCgoTF92YXIxKSA+IDBYMDAwMDdmZmZMKSA/IChNQVhfMTYpOiAoKChMX3ZhcjEpIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpID8gKE1JTl8xNik6ICgoTF92YXIxKSAmIDB4ZmZmZikpKQogCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWNfdm8gV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsgCQkJCS8qIExvbmcgc2hpZnQgcmlnaHQgd2l0aCByb3VuZCwgIDMgICAqLwogc3RhdGljX3ZvIFdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsgICAgICAgICAgICAgCQkJCS8qIFNob3J0IG5vcm0sICAgICAgICAgICAxNSAgKi8KIHN0YXRpY192byBXb3JkMTYgZGl2X3MgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7IAkJCQkvKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovCi1zdGF0aWNfdm8gV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSk7ICAgICAgICAgICAJCQkJLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLworc3RhdGljX3ZvIFdvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpOyAgICAgICAgICAgCQkJCS8qIExvbmcgbm9ybSwgICAgICAgICAgICAzMCAgKi8gICAKIAogLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CkBAIC0xMDMwLDggKzEwMzAsOCBAQAogCQkJCUxfbnVtIDw8PSAxOwogCQkJCWlmIChMX251bSA+PSBMX2Rlbm9tKQogCQkJCXsKLQkJCQkJTF9udW0gLT0gTF9kZW5vbTsKLQkJCQkJdmFyX291dCArPSAxOworCQkJCQlMX251bSAtPSBMX2Rlbm9tOyAgICAgIAorCQkJCQl2YXJfb3V0ICs9IDE7ICAgICAgICAgIAogCQkJCX0KIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ob21pbmcudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ob21pbmcudGFiCmluZGV4IGUzOTlmYjguLmVkY2NjZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaG9taW5nLnRhYgorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIKQEAgLTMzLDg5ICszMyw4OSBAQAogCiBzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NN2tbUFJNTl83a10gPQogewotICAzMTY4LCAyOTk1NCwgMjkyMTMsIDE2MTIxLAotCTY0LCAxMzQ0MCwgMzA2MjQsIDE2NDMwLAorICAzMTY4LCAyOTk1NCwgMjkyMTMsIDE2MTIxLCAKKwk2NCwgMTM0NDAsIDMwNjI0LCAxNjQzMCwgCiAgMTkwMDgKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMTYgZGZoX005a1tQUk1OXzlrXSA9CiB7Ci0gICAzMTY4LCAzMTY2NSwgIDk5NDMsIDkxMjMsCi0gIDE1NTk5LCAgNDM1OCwgMjAyNDgsIDIwNDgsCisgICAzMTY4LCAzMTY2NSwgIDk5NDMsIDkxMjMsIAorICAxNTU5OSwgIDQzNTgsIDIwMjQ4LCAyMDQ4LCAKICAgMTcwNDAsIDI3Nzg3LCAxNjgxNiwgMTM4ODgKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00xMmtbUFJNTl8xMmtdID0KIHsKLSAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEyOCwKLSAgMzY0NywgIDgxMjksIDMwOTMwLCAyNzkyNiwKLSAxODg4MCwgMTIzMTksICAgNDk2LCAgMTA0MiwKLSAgNDA2MSwgMjA0NDYsIDI1NjI5LCAyODA2OSwKKyAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEyOCwgCisgIDM2NDcsICA4MTI5LCAzMDkzMCwgMjc5MjYsIAorIDE4ODgwLCAxMjMxOSwgICA0OTYsICAxMDQyLCAKKyAgNDA2MSwgMjA0NDYsIDI1NjI5LCAyODA2OSwgCiAgMTM5NDgKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00xNGtbUFJNTl8xNGtdID0KIHsKLSAgICAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTMxLAotICAgMjQ4MTUsICAgNjU1LCAyNjYxNiwgMjY3NjQsCi0gICAgNzIzOCwgMTkxMzYsICA2MTQ0LCAgICA4OCwKLQk0MTU4LCAyNTczMywgMzA1NjcsIDMwNDk0LAorICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzEsIAorICAgMjQ4MTUsICAgNjU1LCAyNjYxNiwgMjY3NjQsIAorICAgIDcyMzgsIDE5MTM2LCAgNjE0NCwgICAgODgsIAorCTQxNTgsIDI1NzMzLCAzMDU2NywgMzA0OTQsIAogCTIyMSwgMjAzMjEsIDE3ODIzCiB9OwogCiBzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMTZrW1BSTU5fMTZrXSA9CiB7Ci0gICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMSwKLSAgIDI0ODE1LCAgIDcwMCwgIDM4MjQsICA3MjcxLAotICAgMjY0MDAsICA5NTI4LCAgNjU5NCwgMjYxMTIsCi0gICAgIDEwOCwgIDIwNjgsIDEyODY3LCAxNjMxNywKLSAgIDIzMDM1LCAyNDYzMiwgIDc1MjgsICAxNzUyLAorICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzEsIAorICAgMjQ4MTUsICAgNzAwLCAgMzgyNCwgIDcyNzEsIAorICAgMjY0MDAsICA5NTI4LCAgNjU5NCwgMjYxMTIsIAorICAgICAxMDgsICAyMDY4LCAxMjg2NywgMTYzMTcsIAorICAgMjMwMzUsIDI0NjMyLCAgNzUyOCwgIDE3NTIsIAogICAgIDY3NTksIDI0NTc2CiB9OwogCiBzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMThrW1BSTU5fMThrXSA9CiB7Ci0gICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzUsCi0JMTQ3ODcsIDE0NDIzLCAzMDQ3NywgMjQ5MjcsCi0JMjUzNDUsIDMwMTU0LCAgIDkxNiwgIDU3MjgsCi0JMTg5NzgsICAyMDQ4LCAgIDUyOCwgMTY0NDksCi0JIDI0MzYsICAzNTgxLCAyMzUyNywgMjk0NzksCi0JIDgyMzcsIDE2ODEwLCAyNzA5MSwgMTkwNTIsCisgICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMzUsIAorCTE0Nzg3LCAxNDQyMywgMzA0NzcsIDI0OTI3LCAKKwkyNTM0NSwgMzAxNTQsICAgOTE2LCAgNTcyOCwgCisJMTg5NzgsICAyMDQ4LCAgIDUyOCwgMTY0NDksIAorCSAyNDM2LCAgMzU4MSwgMjM1MjcsIDI5NDc5LCAKKwkgODIzNywgMTY4MTAsIDI3MDkxLCAxOTA1MiwgCiAJICAgIDAKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00yMGtbUFJNTl8yMGtdID0KIHsKLSAgICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEyOSwKLQkgODYzNywgMzE4MDcsIDI0NjQ2LCAgIDczNiwKLQkyODY0MywgIDI5NzcsICAyNTY2LCAyNTU2NCwKLQkxMjkzMCwgMTM5NjAsICAyMDQ4LCAgIDgzNCwKLQkgMzI3MCwgIDQxMDAsIDI2OTIwLCAxNjIzNywKLQkzMTIyNywgMTc2NjcsIDE1MDU5LCAyMDU4OSwKKyAgICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEyOSwgCisJIDg2MzcsIDMxODA3LCAyNDY0NiwgICA3MzYsIAorCTI4NjQzLCAgMjk3NywgIDI1NjYsIDI1NTY0LCAKKwkxMjkzMCwgMTM5NjAsICAyMDQ4LCAgIDgzNCwgCisJIDMyNzAsICA0MTAwLCAyNjkyMCwgMTYyMzcsIAorCTMxMjI3LCAxNzY2NywgMTUwNTksIDIwNTg5LCAKIAkzMDI0OSwgMjkxMjMsIDAKIH07CiAKIHN0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00yM2tbUFJNTl8yM2tdID0KIHsKLQkgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMiwKLQkxNjc0OCwgIDMyMDIsIDI4MTc5LCAxNjMxNywKLQkzMDU5MCwgMTU4NTcsIDE5OTYwLCAgODgxOCwKLQkyMTcxMSwgMjE1MzgsICA0MjYwLCAxNjY5MCwKLQkyMDIyNCwgIDM2NjYsICA0MTk0LCAgOTQ5NywKLQkxNjMyMCwgMTUzODgsICA1NzU1LCAzMTU1MSwKLQkxNDA4MCwgIDM1NzQsIDE1OTMyLCAgICA1MCwKKwkgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMiwgCisJMTY3NDgsICAzMjAyLCAyODE3OSwgMTYzMTcsIAorCTMwNTkwLCAxNTg1NywgMTk5NjAsICA4ODE4LCAKKwkyMTcxMSwgMjE1MzgsICA0MjYwLCAxNjY5MCwgCisJMjAyMjQsICAzNjY2LCAgNDE5NCwgIDk0OTcsIAorCTE2MzIwLCAxNTM4OCwgIDU3NTUsIDMxNTUxLCAKKwkxNDA4MCwgIDM1NzQsIDE1OTMyLCAgICA1MCwgCiAJMjMzOTIsIDI2MDUzLCAzMTIxNgogfTsKIAogc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTI0a1tQUk1OXzI0a10gPQogewotCSAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTM0LAotCTI0Nzc2LCAgNTg1NywgMTg0NzUsIDI4NTM1LAotCTI5NjYyLCAxNDMyMSwgMTY3MjUsICA0Mzk2LAotCTI5MzUzLCAxMDAwMywgMTcwNjgsIDIwNTA0LAotCSAgNzIwLCAgICAgMCwgIDg0NjUsIDEyNTgxLAotCTI4ODYzLCAyNDc3NCwgIDk3MDksIDI2MDQzLAotCSA3OTQxLCAyNzY0OSwgMTM5NjUsIDE1MjM2LAorCSAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTM0LCAKKwkyNDc3NiwgIDU4NTcsIDE4NDc1LCAyODUzNSwgCisJMjk2NjIsIDE0MzIxLCAxNjcyNSwgIDQzOTYsIAorCTI5MzUzLCAxMDAwMywgMTcwNjgsIDIwNTA0LCAKKwkgIDcyMCwgICAgIDAsICA4NDY1LCAxMjU4MSwgCisJMjg4NjMsIDI0Nzc0LCAgOTcwOSwgMjYwNDMsIAorCSA3OTQxLCAyNzY0OSwgMTM5NjUsIDE1MjM2LCAKIAkxODAyNiwgMjIwNDcsIDE2NjgxLCAgMzk2OAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaXNwX2lzZi50YWIKaW5kZXggOTdjM2I2OC4uMjMyMjg0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYgorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2lzcF9pc2YudGFiCkBAIC00Miw3ICs0Miw3IEBACiAKIC8qIHNsb3BlIGluIFExMSB1c2VkIHRvIGNvbXB1dGUgeSA9IGFjb3MoeCkgKi8KIAotY29uc3Qgc3RhdGljIFdvcmQxNiBzbG9wZVsxMjhdID0geworY29uc3Qgc3RhdGljIFdvcmQxNiBzbG9wZVsxMjhdID0geyAKICAtMjYyMTQsIC05MDM5LCAtNTI0MywgLTM3OTksIC0yOTc5LCAtMjQwNSwgLTIwNjQsIC0xNzcxLAogIC0xNTc5LCAtMTQwOSwgLTEyNzksIC0xMTcwLCAtMTA3OSwgLTEwMDQsIC05MzMsIC04ODAsCiAgLTgyNywgLTc4MywgLTc0MywgLTcwOCwgLTY3NiwgLTY0NywgLTYyMSwgLTU5OSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKaW5kZXggYjA2NWViNC4uNmEzNTAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKQEAgLTI1LDIwICsyNSwyMCBAQAogKi8KICNpZm5kZWYgX19MT0cyX0hfXwogI2RlZmluZSBfX0xPRzJfSF9fCi0KKyAKIC8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KICNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KKyAKIC8qCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIERBVEEgVFlQRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwotCisgCiAvKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgREVDTEFSQVRJT04gT0YgUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWltZV9pby50YWIKaW5kZXggN2I0ODVlYS4uNWY4NWRkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYgorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21pbWVfaW8udGFiCkBAIC05OCw3ICs5OCw3IEBACiAgICAyNDQsICA2MSwgMTExLCAxNjQsIDIxNCwgIDY1LCAxMTUsIDE2OCwgMjE4LCAgNzAsCiAgICAxMjAsIDE3MywgMjIzLCAgNzQsIDEyNCwgMTc3LCAyMjcsICA3OSwgMTI5LCAxODIsCiAgICAyMzIsICA4MywgMTMzLCAxODYsIDIzNiwgIDg4LCAxMzgsIDE5MSwgMjQxLCAgOTIsCi0gICAxNDIsIDE5NSwgMjQ1CisgICAxNDIsIDE5NSwgMjQ1ICAgICAgICAgICAgICAgICAgICAgICAgIAogfTsKIAogc3RhdGljIFdvcmQxNiBzb3J0XzE0MjVbMjg1XSA9IHsKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgMjU3LCAyNDMsIDIyOSwgMzU2LCAxNTksIDExOSwgIDY3LCAxODcsIDE3MywgMTQ1LAogICAgMjQwLCAgNzcsIDMwNCwgMzMyLCAzMTQsIDM0MiwgMTA5LCAyNTQsICA4MSwgMjc4LAogICAgMTA1LCAgOTEsIDM0NiwgMzE4LCAxODMsIDI1MCwgMTk3LCAzMjgsICA5NSwgMTU1LAotICAgMTY5LCAyNjgsIDIyNiwgMjM2LCAyNjQKKyAgIDE2OSwgMjY4LCAyMjYsIDIzNiwgMjY0ICAgICAgICAgICAgICAgICAKIH07CiAKIHN0YXRpYyBXb3JkMTYgc29ydF8xOTg1WzM5N10gPSB7CkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgIDEyOCwgMTE4LCAzMDMsIDEwNCwgMzc5LCAxODIsIDExNCwgMzc1LCAyMDAsICA5NiwKICAgIDI5MywgMTcyLCAyMTQsIDM2NSwgMjc5LCAgODYsIDI4OSwgMzUxLCAzNDcsIDM1NywKICAgIDI2MSwgMTg2LCAxNzYsIDI3MSwgIDkwLCAxMDAsIDE0NywgMzIyLCAyNzUsIDM2MSwKLSAgICA3MSwgMzMyLCAgNjEsIDI2NSwgMTU3LCAyNDYsIDIzNgorICAgIDcxLCAzMzIsICA2MSwgMjY1LCAxNTcsIDI0NiwgMjM2ICAgICAgICAgCiB9OwogCiBzdGF0aWMgV29yZDE2IHNvcnRfMjMwNVs0NjFdID0gewpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgICAxMzIsIDQ1MywgMzM2LCA0MjUsIDMyNSwgMzQ3LCAxMjYsIDEwNCwgMTM3LCA0NTgsCiAgICAzNTIsIDI0MywgNDQ3LCAxMTUsIDM0MSwgMjEwLCAzMzAsIDIyMSwgMjMyLCA0MzYsCiAgICA0NjUsIDMxOSwgMzU5LCAxMTEsIDQ1NCwgMjI4LCAyMTcsIDEyMiwgNDQzLCAzNDgsCi0gICAyMzksIDI1MCwgMTMzLCAxNDQsIDQzMiwgMzM3LCAzMjYKKyAgIDIzOSwgMjUwLCAxMzMsIDE0NCwgNDMyLCAzMzcsIDMyNiAgICAgICAgIAogfTsKIAogc3RhdGljIFdvcmQxNiBzb3J0X1NJRFszNV0gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaAppbmRleCA0YzFkMGYwLi4zZTUzMzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3N0cmVhbS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvc3RyZWFtLmgKQEAgLTI2LDcgKzI2LDcgQEAKICNkZWZpbmUgX19TVFJFQU1fSF9fCiAKICNpbmNsdWRlICJ2b01lbS5oIgotI2RlZmluZSBGcmFtZV9NYXhzaXplICAxMDI0ICogMiAgLy9Xb3JrIEJ1ZmZlciAxMEsKKyNkZWZpbmUgRnJhbWVfTWF4c2l6ZSAgMTAyNCAqIDIgIC8vV29yayBCdWZmZXIgMTBLIAogI2RlZmluZSBGcmFtZV9NYXhCeXRlICA2NDAgICAgICAgIC8vQU1SX1dCIEVuY29kZXIgb25lIGZyYW1lIDMyMCBzYW1wbGVzID0gNjQwIEJ5dGVzCiAjZGVmaW5lIE1JTihhLGIpCSAoKGEpIDwgKGIpPyAoYSkgOiAoYikpCiAKQEAgLTM1LDcgKzM1LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpmcmFtZV9wdHI7CiAJdW5zaWduZWQgY2hhciAqZnJhbWVfcHRyX2JrOwogCWludCAgc2V0X2xlbjsKLQlpbnQgIGZyYW1lYnVmZmVyX2xlbjsKKwlpbnQgIGZyYW1lYnVmZmVyX2xlbjsgCiAJaW50ICBmcmFtZV9zdG9yZWxlbjsKIAlpbnQgIHVzZWRfbGVuOwogfUZyYW1lU3RyZWFtOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaAppbmRleCBmMDhhNjc4Li41MzNlNjhiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaApAQCAtMzEsNyArMzEsNyBAQAogLyoKICAqIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgZnJvbSB0aGUgRVRTSSBmaWxlIHR5cGVkZWYuaAogICovCi0KKyAgIAogI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fWlRDX18pCiB0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwogdHlwZWRlZiBzaG9ydCBXb3JkMTY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmgKaW5kZXggMDA2MjU4NC4uZjMwZDI1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZnMuaApAQCAtNDUsNyArNDUsNyBAQAogKiAgICAgICAgT1NGICAgICAgICAgICBvbmx5IGRlZmluZWQgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYW4gQWxwaGEKICogICAgICAgIFBDICAgICAgICAgICAgb25seSBkZWZpbmVkIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGEgUEMKICogICAgICAgIFNVTiAgICAgICAgICAgb25seSBkZWZpbmVkIGlmIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGEgU3VuCi0qCisqICAgICAgICAKICogICAgICAgIExTQkZJUlNUICAgICAgaXMgZGVmaW5lZCBpZiB0aGUgYnl0ZSBvcmRlciBvbiB0aGlzIHBsYXRmb3JtIGlzCiAqICAgICAgICAgICAgICAgICAgICAgICJsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IiAtPiBkZWZpbmVkIG9uIERFQyBBbHBoYQogKiAgICAgICAgICAgICAgICAgICAgICBhbmQgUEMsIHVuZGVmaW5lZCBvbiBTdW4KQEAgLTY4LDcgKzY4LDcgQEAKIAogLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTCisqICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCiAvKgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAjZGVmaW5lICAgICBTeW5fZmlsdF8zMiAgICAgIHZvQVdCX1N5bl9maWx0XzMyCiAjZGVmaW5lICAgICBJc2ZfaXNwICAgICAgICAgIHZvQVdCX0lzZl9pc3AKICNkZWZpbmUgICAgIExldmluc29uICAgICAgICAgdm9BV0JfTGV2aW5zb24KLSNkZWZpbmUgICAgIG1lZGlhbjUgICAgICAgICAgdm9BV0JfbWVkaWFuNQorI2RlZmluZSAgICAgbWVkaWFuNSAgICAgICAgICB2b0FXQl9tZWRpYW41ICAgICAgICAgICAKICNkZWZpbmUgICAgIFByZWRfbHQ0ICAgICAgICAgdm9BV0JfUHJlZF9sdDQKICNkZWZpbmUgICAgIFJlb3JkZXJfaXNmICAgICAgdm9BV0JfUmVvcmRlcl9pc2YKICNkZWZpbmUgICAgIERwaXNmXzJzXzM2YiAgICAgdm9BV0JfRHBpc2ZfMnNfMzZiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucwppbmRleCAyODJkYjkyLi5jMWM3NGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMKQEAgLTMwLDEwICszMCwxMCBAQAogCiAgICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgICAuZ2xvYmFsICAgRGVlbXBoXzMyX2FzbQotCisJICAgCiBEZWVtcGhfMzJfYXNtOgogCi0gICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gCiAJICAgTU9WICAgICAgICAgIHI0LCAjMiAgICAgICAgICAgICAgICAgICBAaT0wCiAJICAgTERSU0ggICAgICAgIHI2LCBbcjBdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2hpWzBdCiAJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzBdCkBAIC00Nyw5ICs0Nyw5IEBACiAJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0ICAgICBATF90bXAgKz0geF9sb1swXSA8PCA0CiAJICAgTU9WICAgICAgICAgIHIxMCwgcjEyLCBMU0wgIzMgICAgICAgICBATF90bXAgPDw9IDMKIAkgICBNVUwgICAgICAgICAgcjksIHI1LCByOAotCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVsxXQorCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVsxXSAKIAkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5Ci0JICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzFdCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzFdICAKIAkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMSAgICAgICAgIEBMX3RtcCA9IExfbWFjKExfdG1wLCAqbWVtLCBmYWMpCiAJICAgUUFERCAgICAgICAgIHIxMCwgcjEyLCByMTEKIAkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYgICAgICAgIEB5WzBdID0gcm91bmQoTF90bXApCkBAIC05NCw5ICs5NCw5IEBACiAKICAgICAgICAgICAgQkxUICAgICAgICAgIExPT1AKICAgICAgICAgICAgU1RSICAgICAgICAgIHIxNCwgW3IzXQotICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdCisgICAgICAgICAgIFNUUkggICAgICAgICByMTQsIFtyMl0JICAgCiAKLSAgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9CisgICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSAKIAogCSAgIEBFTkRQCiAJICAgLkVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCmluZGV4IDRhYTMxN2UuLjAyYmRjYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMKQEAgLTMxLDcgKzMxLDcgQEAKIAogRG90X3Byb2R1Y3QxMl9hc206CiAKLSAgICAgICAgICBTVE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTR9CisgICAgICAgICAgU1RNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAKICAgICAgICAgICBNT1YgICAgICAgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gMAogICAgICAgICAgIE1PViAgICAgICAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDAKIApAQCAtNDEsMTMgKzQxLDEzIEBACiAgICAgICAgICAgTERSICAgICAgICAgICByOCwgW3IwXSwgIzQKICAgICAgICAgICBTTUxBQkIgICAgICAgIHI0LCByNiwgcjcsIHI0CiAgICAgICAgICAgTERSICAgICAgICAgICByOSwgW3IxXSwgIzQKLQkgIFNNTEFUVCAgICAgICAgcjQsIHI2LCByNywgcjQKKwkgIFNNTEFUVCAgICAgICAgcjQsIHI2LCByNywgcjQgCiAKIAkgIExEUiAgICAgICAgICAgcjYsIFtyMF0sICM0CiAJICBTTUxBQkIgICAgICAgIHI0LCByOCwgcjksIHI0CiAKIAkgIExEUiAgICAgICAgICAgcjcsIFtyMV0sICM0Ci0JICBTTUxBVFQgICAgICAgIHI0LCByOCwgcjksIHI0CisJICBTTUxBVFQgICAgICAgIHI0LCByOCwgcjksIHI0CSAgCiAJICBMRFIgICAgICAgICAgIHI4LCBbcjBdLCAjNAogCiAJICBTTUxBQkIgICAgICAgIHI0LCByNiwgcjcsIHI0CkBAIC01OCw3ICs1OCw3IEBACiAJICBDTVAgICAgICAgICAgIHI1LCByMgogCSAgU01MQVRUICAgICAgICByNCwgcjgsIHI5LCByNAogCSAgQkxUICAgICAgICAgICBMT09QCi0KKyAgICAgICAgICAgICAgCiAgICAgICAgICAgTU9WICAgICAgICAgICByMTIsIHI0LCBMU0wgIzEKICAgICAgICAgICBBREQgICAgICAgICAgIHIxMiwgcjEyLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gKExfc3VtIDw8IDEpICArIDEKIAkgIE1PViAgICAgICAgICAgcjQsIHIxMgpAQCAtNjksMTIgKzY5LDEyIEBACiAgICAgICAgICAgU1VCICAgICAgICAgICByMTAsIHIxMCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZnQgPSBub3JtX2woTF9zdW0pCiAgICAgICAgICAgTU9WICAgICAgICAgICByMCwgcjEyLCBMU0wgcjEwICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IExfc3VtIDw8IHNmdAogICAgICAgICAgIFJTQiAgICAgICAgICAgcjExLCByMTAsICMzMCAgICAgICAgICAgICAgICAgICAgICAgIEAgKmV4cCA9IDMwIC0gc2Z0Ci0gICAgICAgICAgU1RSSCAgICAgICAgICByMTEsIFtyM10KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMSwgW3IzXSAgICAgICAgICAgICAgICAgICAgIAogCiBEb3RfcHJvZHVjdDEyX2VuZDoKLQotICAgICAgICAgIExETUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KKwkJICAgICAKKyAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9IAogICAgICAgICAgIEBFTkRGVU5DCiAgICAgICAgICAgLkVORAotCisgCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKaW5kZXggODU2YWRhOC4uMWNlMmE4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKQEAgLTIzLDcgKzIzLDcgQEAKIEAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEAgcjAgICAgLS0tICBzaWduYWxbXQogQCByMSAgICAtLS0gIGxnCi1AIHIyICAgIC0tLSAgbWVtW10KK0AgcjIgICAgLS0tICBtZW1bXSAKIAogICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgIC5nbG9iYWwgIEZpbHRfNmtfN2tfYXNtCkBAIC0zMiw3ICszMiw3IEBACiAKIEZpbHRfNmtfN2tfYXNtOgogCi0gICAgICAgICAgU1RNRkQgICAJCXIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICAgIFNUTUZEICAgCQlyMTMhLCB7cjQgLSByMTIsIHIxNH0gCiAgICAgICAgICAgU1VCICAgIAkJcjEzLCByMTMsICMyNDAgICAgICAgICAgICAgIEAgeFtMX1NVQkZSMTZrICsgKExfRklSIC0gMSldCiAgICAgICAgICAgTU9WICAgICAJCXI4LCByMCAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgc2lnbmFsW10gYWRkcmVzcwogICAgICAgICAgIE1PViAgICAgCQlyNCwgcjEgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxnIGFkZHJlc3MKQEAgLTQzLDkgKzQzLDkgQEAKICAgICAgICAgICBNT1YgICAgIAkJcjIsICMzMCAgICAgICAgICAgICAgICAgICAgIEAgTF9GSVIgLSAxCiAgICAgICAgICAgQkwgICAgICAJCXZvQVdCX0NvcHkgICAgICAgICAgICAgICAgICAgQCBtZW1jcHkoeCwgbWVtLCAoTF9GSVIgLSAxKTw8MSkKIAotICAgICAgICAgIExEUiAgICAgCQlyMTAsIExhYmxlMSAgICAgICAgICAgICAgICAgQCBnZXQgZmlyXzdrIGFkZHJlc3MKKyAgICAgICAgICBMRFIgICAgIAkJcjEwLCBMYWJsZTEgICAgICAgICAgICAgICAgIEAgZ2V0IGZpcl83ayBhZGRyZXNzICAgICAKIAotICAgICAgICAgIE1PViAgICAgICAgICAgCXIxNCwgIzAKKyAgICAgICAgICBNT1YgICAgICAgICAgIAlyMTQsICMwICAKICAgICAgICAgICBNT1YgICAgICAgICAgICAgICAgICAgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgIEAgY2hhbmdlIG15TWVtQ29weSB0byBDb3B5LCBkdWUgdG8gQ29weSB3aWxsIGNoYW5nZSByMyBjb250ZW50CiAgICAgICAgICAgQUREICAgICAJICAgIAlyNiwgcjEzLCAjNjAgICAgICAgICAgICAgICAgQCBnZXQgeFtMX0ZJUiAtIDFdIGFkZHJlc3MKICAgICAgICAgICBNT1YgICAgICAgICAgIAlyNywgcjMgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnbmFsW2ldCkBAIC03NiwxNCArNzYsMTQgQEAKICAgICAgICAgICBTVFJIICAgICAgICAgIAlyMTIsIFtyNl0sICMyCiAgICAgICAgICAgQUREICAgICAgICAgICAJcjE0LCByMTQsICM4CiAgICAgICAgICAgQ01QICAgICAgICAgICAJcjE0LCAjODAKLSAgICAgICAgICBCTFQgICAgICAgICAgIAlMT09QMQorICAgICAgICAgIEJMVCAgICAgICAgICAgCUxPT1AxICAgICAgICAgIAogCiAKICAgICAgICAgICBTVFIgICAgIAkJcjUsIFtzcCwgIy00XSAgICAgICAgICAgICAgIEAgUFVTSCAgcjUgdG8gc3RhY2sKIAogICAgICAgICAgIEAgbm90IHVzZSByZWdpc3RlcnM6IHI0LCByMTAsIHIxMiwgcjE0LCByNQotICAgICAgICAgIE1PViAgICAgCQlyNCwgcjEzCi0gICAgICAgICAgTU9WICAgICAJCXI1LCAjMCAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwCisgICAgICAgICAgTU9WICAgICAJCXI0LCByMTMgCisgICAgICAgICAgTU9WICAgICAJCXI1LCAjMCAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwICAgICAgICAgICAgICAKIExPT1AyOgogICAgICAgICAgIExEUiAgICAgICAgICAgCXIwLCBbcjEwXQogCkBAIC0xMTEsMTMgKzExMSwxMyBAQAogICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOCwgW3I0LCAjMTBdICAgICAgICAgICAgICBAIGxvYWQgeFtpKzVdCiAgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICM1MF0gICAgICAgICAgICAgIEAgbG9hZCB4W2krMjVdCiAgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSszXSArIHhbaSsyN10pICogZmlyXzdrWzNdCi0gICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgeFtpKzVdICsgeFtpKzI1XQotCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgeFtpKzVdICsgeFtpKzI1XSAKKyAKICAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICM4XQogICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMSwgW3I0LCAjMTJdICAgICAgICAgICAgICBAIHhbaSs2XQogICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMiwgW3I0LCAjNDhdICAgICAgICAgICAgICBAIHhbaSsyNF0KICAgICAgICAgICBTTUxBQkIgICAgICAgICAgICAgICAgcjE0LCByNiwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzRdICsgeFtpKzI2XSkgKiBmaXJfN2tbNF0KLSAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzE0XSAgICAgICAgICAgICAgQCB4W2krN10KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzE0XSAgICAgICAgICAgICAgQCB4W2krN10gCiAgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI3LCBbcjQsICM0Nl0gICAgICAgICAgICAgIEAgeFtpKzIzXQogICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHI4LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krNV0gKyB4W2krMjVdKSAqIGZpcl83a1s1XQogICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzEyXQpAQCAtMTI1LDggKzEyNSw4IEBACiAgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgKHhbaSs3XSArIHhbaSsyM10pCiAgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs2XSArIHhbaSsyNF0pICogZmlyXzdrWzZdCiAgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI4LCBbcjQsICMxNl0gICAgICAgICAgICAgIEAgeFtpKzhdCi0gICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICM0NF0gICAgICAgICAgICAgIEAgeFtpKzIyXQotICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHI2LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krN10gKyB4W2krMjNdKSAqIGZpcl83a1s3XQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOSwgW3I0LCAjNDRdICAgICAgICAgICAgICBAIHhbaSsyMl0gCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs3XSArIHhbaSsyM10pICogZmlyXzdrWzddICAKICAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMxNl0KICAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjEsIFtyNCwgIzE4XSAgICAgICAgICAgICAgQCB4W2krOV0KICAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzQyXSAgICAgICAgICAgICAgQCB4W2krMjFdCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzM2XSAgICAgICAgICAgICAgQCB4W2krMThdCiAgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxMF0gKyB4W2krMjBdKSAqIGZpcl83a1sxMF0KICAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzI2XSAgICAgICAgICAgICAgQCB4W2krMTNdCi0gICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgKHhbaSsxMV0gKyB4W2krMTldKQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByOCwgcjgsIHI5ICAgICAgICAgICAgICAgICBAICh4W2krMTFdICsgeFtpKzE5XSkgIAogICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNywgW3I0LCAjMzRdICAgICAgICAgICAgICBAIHhbaSsxN10KICAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByOCwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzExXSArIHhbaSsxOV0pICogZmlyXzdrWzExXQogICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzI0XQpAQCAtMTUyLDMxICsxNTIsMzEgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjgsIFtyNCwgIzI4XSAgICAgICAgICAgICAgQCB4W2krMTRdCiAgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxMl0gKyB4W2krMThdKSAqIGZpcl83a1sxMl0KICAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgQCAoeFtpKzEzXSArIHhbaSsxN10pCi0gICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICMzMl0gICAgICAgICAgICAgIEAgeFtpKzE2XQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOSwgW3I0LCAjMzJdICAgICAgICAgICAgICBAIHhbaSsxNl0gCiAgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxM10gKyB4W2krMTddKSAqIGZpcl83a1sxM10KLSAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMyOF0KKyAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMyOF0gICAgICAgICAKICAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjgsIHI4LCByOSAgICAgICAgICAgICAgICAgQCAoeFtpKzE0XSArIHhbaSsxNl0pCiAgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIxLCBbcjQsICMzMF0gICAgICAgICAgICAgIEAgeFtpKzE1XQogICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHI4LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krMTRdICsgeFtpKzE2XSkgKiBmaXJfN2tbMTRdCi0gICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgeFtpKzE1XSAqIGZpcl83a1sxNV0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByMSwgcjAsIHIxNCAgICAgICAgICAgQCB4W2krMTVdICogZmlyXzdrWzE1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAgICAgICAgICAgQUREICAgICAJCXI1LCByNSwgIzEKICAgICAgICAgICBBREQgICAgIAkJcjE0LCByMTQsICMweDQwMDAKLSAgICAgICAgICBBREQgICAgIAkJcjQsIHI0LCAjMgorICAgICAgICAgIEFERCAgICAgCQlyNCwgcjQsICMyICAgICAgICAgICAgICAgIAogICAgICAgICAgIE1PViAgICAgCQlyMSwgcjE0LCBBU1IgIzE1CiAgICAgICAgICAgQ01QICAgICAJCXI1LCAjODAKICAgICAgICAgICBTVFJIICAgIAkJcjEsIFtyM10sICMyICAgICAgICAgICAgICAgQHNpZ25hbFtpXSA9IChMX3RtcCArIDB4NDAwMCkgPj4gMTUKLSAgICAgICAgICBCTFQgICAgIAkJTE9PUDIKLQorICAgICAgICAgIEJMVCAgICAgCQlMT09QMiAgICAgIAorICAgICAgICAgICAKICAgICAgICAgICBMRFIgICAgIAkJcjEsIFtzcCwgIy00XSAgICAgICAgICAgICAgIEBtZW0gYWRkcmVzcwogICAgICAgICAgIEFERCAgICAgCQlyMCwgcjEzLCAjMTYwICAgICAgICAgICAgICAgQHggKyBsZwogICAgICAgICAgIE1PViAgICAgCQlyMiwgIzMwCiAgICAgICAgICAgQkwgICAgICAJCXZvQVdCX0NvcHkKLQorICAgICAgICAgICAgICAgICAgICAKIEZpbHRfNmtfN2tfZW5kOgotICAgICAgICAgIEFERCAgICAgCQlyMTMsIHIxMywgIzI0MAotICAgICAgICAgIExETUZEICAgCQlyMTMhLCB7cjQgLSByMTIsIHIxNX0KLQorICAgICAgICAgIEFERCAgICAgCQlyMTMsIHIxMywgIzI0MCAgCisgICAgICAgICAgTERNRkQgICAJCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSAKKyAKIExhYmxlMToKICAgICAgICAgICAud29yZCAgIAkJZmlyXzZrXzdrCiAgICAgICAgICAgQEVOREZVTkMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCmluZGV4IDQ5YmRjMmIuLmI0NDBhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucwpAQCAtMzIsOCArMzIsOCBAQAogQCByNiAtLS0gY29ycl9ub3JtW10KIAogCi0JLnNlY3Rpb24gIC50ZXh0Ci0gICAgICAgIC5nbG9iYWwgICBOb3JtX2NvcnJfYXNtCisJLnNlY3Rpb24gIC50ZXh0IAorICAgICAgICAuZ2xvYmFsICAgTm9ybV9jb3JyX2FzbSAKICAgICAgICAgLmV4dGVybiAgIENvbnZvbHZlX2FzbQogICAgICAgICAuZXh0ZXJuICAgSXNxcnRfbgogQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDcsMTcgKzQ3LDE3IEBACiAuZXF1ICAgICAgICAgVF9NSU4gICAgICAgICAsICAgMjEyCiAuZXF1ICAgICAgICAgVF9NQVggICAgICAgICAsICAgMjE2CiAuZXF1ICAgICAgICAgQ09SUl9OT1JNICAgICAsICAgMjIwCi0KKyAgICAgICAgICAgICAgICAgIAogTm9ybV9jb3JyX2FzbToKIAotICAgICAgICBTVE1GRCAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICBTVE1GRCAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCiAgICAgICAgIFNVQiAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLCi0KKyAgCiAgICAgICAgIEFERCAgICAgICAgcjgsIHIxMywgIzIwICAgICAgICAgICAgICAgICBAZ2V0IHRoZSBleGNmW0xfU1VCRlJdCiAgICAgICAgIExEUiAgICAgICAgcjQsIFtyMTMsICNUX01JTl0gICAgICAgICAgICBAZ2V0IHRfbWluCiAgICAgICAgIFJTQiAgICAgICAgcjExLCByNCwgIzAgICAgICAgICAgICAgICAgICBAayA9IC10X21pbgotICAgICAgICBBREQgICAgICAgIHI1LCByMCwgcjExLCBMU0wgIzEgICAgICAgICAgQGdldCB0aGUgJmV4Y1trXQotCisgICAgICAgIEFERCAgICAgICAgcjUsIHIwLCByMTEsIExTTCAjMSAgICAgICAgICBAZ2V0IHRoZSAmZXhjW2tdICAgCisgICAgICAgIAogICAgICAgICBAdHJhbnNmZXIgQ29udm9sdmUgZnVuY3Rpb24KICAgICAgICAgU1RNRkQgICAgICAgc3AhLCB7cjAgLSByM30KICAgICAgICAgTU9WICAgICAgICAgcjAsIHI1CkBAIC02OCw3ICs2OCw3IEBACiAKICAgICAgICAgQCByOCAtLS0gZXhjZltdCiAKLQlNT1YgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MKKwlNT1YgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIE1PViAgICAgICAgIHI1LCAjNjQKICAgICAgICAgTU9WICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICBATF90bXAgPSAwCiAgICAgICAgIE1PViAgICAgICAgIHI3LCAjMQpAQCAtOTMsMjEgKzkzLDIxIEBACiAJQ0xaICAgICAgICAgcjcsIHI5CiAJU1VCICAgICAgICAgcjYsIHI3LCAjMSAgICAgICAgICAgICAgICAgICBAZXhwID0gbm9ybV9sKExfdG1wKQogICAgICAgICBSU0IgICAgICAgICByNywgcjYsICMzMiAgICAgICAgICAgICAgICAgIEBleHAgPSAzMiAtIGV4cAotCU1PViAgICAgICAgIHI2LCByNywgQVNSICMxCisJTU9WICAgICAgICAgcjYsIHI3LCBBU1IgIzEgICAgICAgICAKIAlSU0IgICAgICAgICByNywgcjYsICMwICAgICAgICAgICAgICAgICAgIEBzY2FsZSA9IC0oZXhwID4+IDEpCi0KKwkKICAgICAgICAgQGxvb3AgZm9yIGV2ZXJ5IHBvc3NpYmxlIHBlcmlvZAogCUBmb3IodCA9IHRfbWluQCB0IDw9IHRfbWF4QCB0KyspCiAJQHI3IC0tLSBzY2FsZSByNCAtLS0gdF9taW4gcjggLS0tIGV4Y2ZbXQogCi1MT09QRk9SOgorTE9PUEZPUjoJCiAgICAgICAgIE1PViAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgQExfdG1wICA9IDAKIAlNT1YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICAgICAgIEBMX3RtcDEgPSAwCi0JTU9WICAgICAgICAgcjksICM2NAorCU1PViAgICAgICAgIHI5LCAjNjQgIAogCU1PViAgICAgICAgIHIxMiwgcjEgICAgICAgICAgICAgICAgICAgICAgQGNvcHkgb2YgeG5bXQogCUFERCAgICAgICAgIHIxNCwgcjEzLCAjMjAgICAgICAgICAgICAgICAgQGNvcHkgb2YgZXhjZltdCiAJTU9WICAgICAgICAgcjgsICMweDgwMDAKLQorICAgICAgICAJCiBMT09QaToKIAlMRFIgICAgICAgICByMTEsIFtyMTRdLCAjNCAgICAgICAgICAgICAgIEBsb2FkIGV4Y2ZbaV0sIGV4Y2ZbaSsxXQogICAgICAgICBMRFIgICAgICAgICByMTAsIFtyMTJdLCAjNCAgICAgICAgICAgICAgIEBsb2FkIHhuW2ldLCB4bltpKzFdCkBAIC0xMjgsMTMgKzEyOCwxMyBAQAogCU1PViAgICAgICAgIHIxMCwgIzEKIAlBREQgICAgICAgICByNSwgcjEwLCByNSwgTFNMICMxICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCAxKSArIDEKIAlBREQgICAgICAgICByNiwgcjEwLCByNiwgTFNMICMxICAgICAgICAgIEBMX3RtcDEgPSAoTF90bXAxIDw8IDEpICsgMQotCi0JQ0xaICAgICAgICAgcjEwLCByNQorIAorCUNMWiAgICAgICAgIHIxMCwgcjUgICAgICAgIAogCUNNUCAgICAgICAgIHI1LCAjMAogCVJTQkxUICAgICAgIHIxMSwgcjUsICMwCiAJQ0xaTFQgICAgICAgcjEwLCByMTEKIAlTVUIgICAgICAgICByMTAsIHIxMCwgIzEgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCi0KKyAgICAgCiAJTU9WICAgICAgICAgcjUsIHI1LCBMU0wgcjEwICAgICAgICAgICAgICBATF90bXAgPSAoTF90bXAgPDwgZXhwKQogCVJTQiAgICAgICAgIHIxMCwgcjEwLCAjMzAgICAgICAgICAgICAgICAgQGV4cF9jb3JyID0gMzAgLSBleHAKIAlNT1YgICAgICAgICByMTEsIHI1LCBBU1IgIzE2ICAgICAgICAgICAgIEBjb3JyID0gZXh0cmFjdF9oKExfdG1wKQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJQElzcXJ0X24oJkxfdG1wLCAmZXhwX25vcm0pCiAKIAlNT1YgICAgICAgICByMTQsIHIwCi0JTU9WICAgICAgICAgcjEyLCByMQorCU1PViAgICAgICAgIHIxMiwgcjEgCiAKICAgICAgICAgU1RNRkQgICAgICAgc3AhLCB7cjAgLSByNCwgcjcgLSByMTIsIHIxNH0KIAlBREQgICAgICAgICByMSwgc3AsICM0CkBAIC0xNjgsNyArMTY4LDcgQEAKIAlNT1YgICAgICAgICByNiwgcjYsIEFTUiAjMTYgICAgICAgICAgICAgIEBub3JtID0gZXh0cmFjdF9oKExfdG1wKQogCU1VTCAgICAgICAgIHIxMiwgcjYsIHIxMQogCUFERCAgICAgICAgIHIxMiwgcjEyLCByMTIgICAgICAgICAgICAgICAgQExfdG1wID0gdm9fTF9tdWx0KGNvcnIsIG5vcm0pCi0KKyAgCiAJQUREICAgICAgICAgcjYsIHIxMCwgcjUKIAlBREQgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgIEBleHBfY29yciArIGV4cF9ub3JtICsgc2NhbGUKIApAQCAtMTg3LDkgKzE4Nyw5IEBACiAKIAlDTVAgICAgICAgICByNCwgcjYKIAlCRVEgICAgICAgICBOb3JtX2NvcnJfYXNtX2VuZAotCisgCiAJQUREICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICBAIHRfbWluICsrCi0KKyAgICAgICAgCiAJUlNCICAgICAgICAgcjUsIHI0LCAjMCAgICAgICAgICAgICAgICAgICBAIGsKIAogCU1PViAgICAgICAgIHI2LCAjNjMgICAgICAgICAgICAgICAgICAgICAgQCBpID0gNjMKQEAgLTIxNiwxNiArMjE2LDE2IEBACiAJTVVMICAgICAgICAgcjE0LCByMTEsIHI4CiAgICAgICAgIExEUiAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKIAlNT1YgICAgICAgICByOCwgcjE0LCBBU1IgIzE1Ci0JU1RSSCAgICAgICAgcjgsIFtyMTBdCisJU1RSSCAgICAgICAgcjgsIFtyMTBdICAgICAgICAgICAgICAgICAgICAKIAogCUNNUCAgICAgICAgIHI0LCByNgogCUJMRSAgICAgICAgIExPT1BGT1IKIAotTm9ybV9jb3JyX2FzbV9lbmQ6Ci0KLSAgICAgICAgQUREICAgICAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLCitOb3JtX2NvcnJfYXNtX2VuZDogCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICByMTMsIHIxMywgI3ZvU1RBQ0sgICAgICAKICAgICAgICAgTERNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9Ci0KKyAgICAKICAgICAgICAgLkVORAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucwppbmRleCAzZjQ5MzBjLi43MDQ2NGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCkBAIC0zOCw3ICszOCw3IEBACiAKIFN5bl9maWx0XzMyX2FzbToKIAotICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSAKICAgICAgICAgICBMRFIgICAgICAgICAgIHI0LCAgW3IxMywgIzQwXSAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ19oaVtdIGFkZHJlc3MKICAgICAgICAgICBMRFIgICAgICAgICAgIHI1LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ19sb1tdIGFkZHJlc3MKIApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgIEFORCAgICAgICAgICAgcjgsIHI4LCByMTQKICAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMl0gLS0gQXFbMV0KICAgICAgICAgICBPUlIgICAgICAgICAgIHIxMSwgcjgsIHI5LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbNF0gLS0gQXFbM10KLSAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy00XQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTRdICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtOF0KIAogICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzEwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzVdCkBAIC03MywxMiArNzMsMTIgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjAsICMyMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxMF0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHI4LCBbcjAsICMyMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxMV0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMyNF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxMl0KLSAgICAgICAgICBBTkQgICAgICAgICAgIHI2LCByNiwgcjE0CisgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNCAKICAgICAgICAgICBBTkQgICAgICAgICAgIHI4LCByOCwgcjE0CiAgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzEwXSAtLSBBcVs5XQogICAgICAgICAgIE9SUiAgICAgICAgICAgcjExLCByOCwgcjksIExTTCAjMTYgICAgICAgICAgICAgQCBBcVsxMl0gLS0gQXFbMTFdCiAgICAgICAgICAgU1RSICAgICAgICAgICByMTAsIFtyMTMsICMtMjBdCi0gICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtMjRdCisgICAgICAgICAgU1RSICAgICAgICAgICByMTEsIFtyMTMsICMtMjRdICAKIAogICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzI2XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzEzXQogICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzI4XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzE0XQpAQCAtOTAsMTQgKzkwLDE0IEBACiAgICAgICAgICAgT1JSICAgICAgICAgICByMTEsIHI4LCByOSwgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzE2XSAtLSBBcVsxNV0KICAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0yOF0KICAgICAgICAgICBTVFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0zMl0KLQorICAgICAgICAgIAogICAgICAgICAgIE1PViAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMAotCi1MT09QOgorICAgICAgICAgICAgICAKK0xPT1A6ICAgICAgICAgICAgCiAgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I1LCAjLTJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMV0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjUsICMtNF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0yXQogCi0gICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtNF0gICAgICAgICAgICAgICAgICBAIEFxWzJdIC0tIEFxWzFdCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtNF0gICAgICAgICAgICAgICAgICBAIEFxWzJdIC0tIEFxWzFdICAgICAgICAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjUsICMtNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0zXQogICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjUsICMtOF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTRdCiAKQEAgLTEzNSwxMiArMTM1LDEyIEBACiAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNSwgIy0zMl0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTZdCiAgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTEzXSAqIEFxWzEzXQogICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByNywgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xNF0gKiBBcVsxNF0KLQorIAogICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTMyXSAgICAgICAgICAgICAgICAgQCBBcVsxNl0gLS0gQXFbMTVdCi0gICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IyXSwjMiAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgZXhjW2ldCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IyXSwjMiAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgZXhjW2ldIAogICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xNV0gKiBBcVsxNV0KICAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktMTZdICogQXFbMTZdCi0gICAgICAgICAgTVVMICAgICAgICAgICByNywgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgICBAIGV4Y1tpXSAqIGEwCisgICAgICAgICAgTVVMICAgICAgICAgICByNywgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgICBAIGV4Y1tpXSAqIGEwIAogICAgICAgICAgIFJTQiAgICAgICAgICAgcjE0LCByMTIsICMwICAgICAgICAgICAgICAgICAgICAgQCBMX3RtcAogICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCByMTQsIEFTUiAjMTEgICAgICAgICAgICAgICAgQCBMX3RtcCA+Pj0gMTEKICAgICAgICAgICBBREQgICAgICAgICAgIHIxNCwgcjE0LCByNywgTFNMICMxICAgICAgICAgICAgIEAgTF90bXAgKz0gKGV4Y1tpXSAqIGEwKSA8PCAxCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjQsICMtMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xXQogICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNCwgIy00XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTJdCiAKLSAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy00XSAgICAgICAgICAgICAgICAgIEAgQXFbMl0gLS0gQXFbMV0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy00XSAgICAgICAgICAgICAgICAgIEAgQXFbMl0gLS0gQXFbMV0gICAgICAgIAogICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNCwgIy02XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTNdCiAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNCwgIy04XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktNF0KICAgICAgICAgICBTTVVMQkIgICAgICAgIHIxMiwgcjYsIHIxMSAgICAgICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMV0gKiBBcVsxXQpAQCAtMTk4LDE0ICsxOTgsMTQgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I0LCAjLTMyXSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xNl0KICAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTNdICogQXFbMTNdCiAgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTE0XSAqIEFxWzE0XQotCisgCiAgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtMzJdICAgICAgICAgICAgICAgICBAIEFxWzE2XSAtLSBBcVsxNV0KICAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTVdICogQXFbMTVdCi0gICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTE2XSAqIEFxWzE2XQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0xNl0gKiBBcVsxNl0gICAgICAgCiAgICAgICAgICAgQUREICAgICAgICAgICByNiwgcjEyLCByMTIgICAgICAgICAgICAgICAgICAgICBAIHIxMiA8PCAxCi0gICAgICAgICAgU1VCICAgICAgICAgICByMTQsIHIxNCwgcjYKKyAgICAgICAgICBTVUIgICAgICAgICAgIHIxNCwgcjE0LCByNiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCByMTQsIExTTCAjMyAgICAgICAgICAgICAgICAgQCBMX3RtcCA8PD0zCi0KKyAgCiAgICAgICAgICAgTU9WICAgICAgICAgICByNywgcjE0LCBBU1IgIzE2ICAgICAgICAgICAgICAgICBAIExfdG1wID4+IDE2CiAKICAgICAgICAgICBNT1YgICAgICAgICAgIHIxNCwgcjE0LCBBU1IgIzQgICAgICAgICAgICAgICAgIEAgTF90bXAgPj49NApAQCAtMjEzLDE0ICsyMTMsMTQgQEAKICAgICAgICAgICBTVUIgICAgICAgICAgIHI5LCByMTQsIHI3LCBMU0wgIzEyICAgICAgICAgICAgIEAgc2lnX2xvW2ldID0gTF90bXAgLSAoc2lnX2hpW2ldIDw8IDEyKQogCiAgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxCi0gICAgICAgICAgU1RSSCAgICAgICAgICByOSwgW3I1XSwgIzIKKyAgICAgICAgICBTVFJIICAgICAgICAgIHI5LCBbcjVdLCAjMiAgIAogICAgICAgICAgIENNUCAgICAgICAgICAgcjgsICM2NAotICAgICAgICAgIEJMVCAgICAgICAgICAgTE9PUAotCisgICAgICAgICAgQkxUICAgICAgICAgICBMT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCiBTeW5fZmlsdF8zMl9lbmQ6Ci0KLSAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9CisJCSAgICAgCisgICAgICAgICAgTERNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fSAKICAgICAgICAgICBARU5ERlVOQwogICAgICAgICAgIC5FTkQKLQorIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKaW5kZXggNzFiYjUzMi4uMDIyOGJkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucwpAQCAtMjcsMjQgKzI3LDI0IEBACiBAICByMyAtLS0gTAogCiAJLnNlY3Rpb24gIC50ZXh0Ci0gICAgICAgIC5nbG9iYWwgICBDb252b2x2ZV9hc20KKyAgICAgICAgLmdsb2JhbCAgIENvbnZvbHZlX2FzbSAKIAogQ29udm9sdmVfYXNtOgogCi0gICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICBTVE1GRCAgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0gIAogICAgICAgICBNT1YgICAgICAgICAgICByMywgICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBuCiAJTU9WICAgICAgICAgICAgcjExLCAjMHg4MDAwCi0KLUxPT1A6CisgICAgICAgIAorTE9PUDogCiAgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjMsIExTTCAjMSAgICAgICAgICAgICAgICBAIHRtcEggYWRkcmVzcwogICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gbiArIDEKICAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG1wWCA9IHgKICAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKwogICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCiAgICAgICAgIFNVQiAgICAgICAgICAgIHI1LCByNSwgIzEKLSAgICAgICAgTVVMICAgICAgICAgICAgcjgsICByOSwgcjEwCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCAgcjksIHIxMCAKIAotTE9PUDE6CitMT09QMTogICAgICAgICAgICAgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKICAgICAgICAgQkxFICAgICAgICAgICAgTDEKIAlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCkBAIC01OCwxMiArNTgsMTIgQEAKIAlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCiAJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQogCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAotICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0CisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQgCiAJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgIAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMSAgCiAKLSAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDEKLQotTDE6CitMMTogICAgICAgICAgICAgICAgICAKIAogICAgICAgICBBREQgICAgICAgICAgICByNSwgcjExLCByOCwgTFNMICMxCiAgICAgICAgIE1PViAgICAgICAgICAgIHI1LCByNSwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCkBAIC03NSwxNCArNzUsMTQgQEAKICAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIzLCAjMQogICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKICAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKwotICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyCiAgICAgICAgIExEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yCiAKICAgICAgICAgTVVMICAgICAgICAgICAgcjgsIHI5LCByMTAKICAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMgogICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4Ci0KKyAgICAgICAgCiBMT09QMjoKICAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCiAgICAgICAgIEJMRSAgICAgICAgICAgIEwyCkBAIC05NywxNCArOTcsMTQgQEAKIAlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCiAJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQogCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAotICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0CisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQgCiAJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAogICAgICAgICBCICAgICAgICAgICAgICBMT09QMgogCiBMMjoKICAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQogICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQotICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEgIAogICAgICAgICBTVFJIICAgICAgICAgICByOCwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KIAogICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICBNVUwgICAgICAgICAgICByOCwgcjksIHIxMAogICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyCiAgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yCi0gICAgICAgIE1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOCAKICAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMwogICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKIApAQCAtMTM1LDkgKzEzNSw5IEBACiAJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKwogCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KIAlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKLSAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNAotCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKLSAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDMKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4IAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMyAgIAogCiBMMzoKICAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAogICAgICAgICBNT1YgICAgICAgICAgICByOCwgIzAKIAotTE9PUDQ6CitMT09QNDogICAgICAgICAgICAgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKICAgICAgICAgQkxFICAgICAgICAgICAgTDQKIAlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCkBAIC0xNjQsMjIgKzE2NCwyMiBAQAogCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKIAlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCiAJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4Ci0gICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQKLQlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4Ci0gICAgICAgIEIgICAgICAgICAgICAgIExPT1A0Ci1MNDoKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDQgICAgCitMNDogICAgICAgICAgICAgICAgICAKICAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIxMSwgcjgsIExTTCAjMQogICAgICAgICBNT1YgICAgICAgICAgICByNSwgcjUsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQogICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCiAgICAgICAgIFNUUkggICAgICAgICAgIHI1LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQotCisgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByMywgIzY0CiAgICAgICAgIEJMVCAgICAgICAgICAgIExPT1AKLQotQ29udm9sdmVfYXNtX2VuZDoKLQorICAgICAgICAgICAgICAgIAorQ29udm9sdmVfYXNtX2VuZDogCisgCiAgICAgICAgIExETUZEICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9Ci0KKyAgICAKICAgICAgICAgQEVOREZVTkMKICAgICAgICAgLkVORAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwppbmRleCAyZDRjN2NjLi44ZjMyNzMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMKQEAgLTUxLDEyICs1MSwxMiBAQAogICAgICAgICAgUlNCICAgICAgICAgICByMTEsIHIyLCAjNjIgICAgICAgICAgICAgICAgICAgICAgQGo9NjItcG9zCiAKIExPT1BqMToKLQkgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMgorCSBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICAKIAkgTERSU0ggICAgICAgICByOCwgIFtyOV0sICMyCiAJIExEUlNIICAgICAgICAgcjE0LCBbcjldCiAJIFNVQlMgICAgICAgICAgcjExLCByMTEsICMxCiAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHI4LCByNQotICAgICAgICAgTUxBICAgICAgICAgICByNiwgcjEyLCByMTQsIHI2CisgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIAogCSBCR0UgICAgICAgICAgIExPT1BqMQogCiAJIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAKnAxKysKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAgICAgIE1MQSAgICAgICAgICAgcjUsIHIxMiwgcjE0LCByNQogICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDAKICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gKExfc3VtMSA8PCAyKQotICAgICAgICAgQUREICAgICAgICAgICByMTAsIHI2LCByMTQKKyAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICAgCiAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0CiAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByOSwgQVNSICMxNgogICAgICAgICAgTU9WICAgICAgICAgICByNiwgcjEwLCBBU1IgIzE2CkBAIC03Niw3ICs3Niw3IEBACiAJIE1VTCAgICAgICAgICAgcjE0LCByNiwgcjExCiAJIE1PViAgICAgICAgICAgcjUsIHIxMiwgQVNSICMxNQogCSBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUKLQkgTERSICAgICAgICAgICByOSwgIFtyMTMsICM0NF0KKwkgTERSICAgICAgICAgICByOSwgIFtyMTMsICM0NF0gICAgICAgICAgICAgICAgICAgCiAJIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdCiAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I3XSwgIzIgICAgICAgICAgICAgICAgICAgICAgQCpwMCsrCiAJIExEUlNIICAgICAgICAgcjExLCBbcjhdICAgICAgICAgICAgICAgICAgICAgICAgICBAKnAzKysKQEAgLTg4LDcgKzg4LDcgQEAKIAkgU1RSSCAgICAgICAgICByNiwgW3IxMl0KIAogICAgICAgICAgQUREICAgICAgICAgICByMiwgcjIsICM0Ci0KKyAKICAgICAgICAgIE1PViAgICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAwCiAJIE1PViAgICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTIgPSAwCiAJIEFERCAgICAgICAgICAgcjksIHIxLCByMiwgTFNMICMxICAgICAgICAgICAgICAgIEBwMiA9ICZ2ZWNbcG9zXQpAQCAtOTcsMTIgKzk3LDEyIEBACiAJIEFERCAgICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEBpKysKIAogTE9PUGoyOgotCSBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyCisJIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgIAogCSBMRFJTSCAgICAgICAgIHI4LCAgW3I5XSwgIzIKIAkgTERSU0ggICAgICAgICByMTQsIFtyOV0KIAkgU1VCUyAgICAgICAgICByMTEsIHIxMSwgIzEKICAgICAgICAgIE1MQSAgICAgICAgICAgcjUsIHIxMiwgcjgsIHI1Ci0gICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYKKyAgICAgICAgIE1MQSAgICAgICAgICAgcjYsIHIxMiwgcjE0LCByNgkgCiAJIEJHRSAgICAgICAgICAgTE9PUGoyCiAKIAkgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAqcDErKwpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHIxNCwgcjUKICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCAjMHg4MDAwCiAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByNSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IChMX3N1bTEgPDwgMikKLSAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0CisgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNCAgICAgICAgCiAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0CiAKICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI5LCBBU1IgIzE2CkBAIC0xMjMsNyArMTIzLDcgQEAKIAkgTVVMICAgICAgICAgICByMTQsIHI2LCByMTEKIAkgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1CiAJIE1PViAgICAgICAgICAgcjYsIHIxNCwgQVNSICMxNQotCSBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XQorCSBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICAKIAkgTERSICAgICAgICAgICByMTIsIFtyMTMsICM0OF0KICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjddLCAjMiAgICAgICAgICAgICAgICAgICAgICBAKnAwKysKIAkgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKwpAQCAtMTM2LDE2ICsxMzYsMTYgQEAKIAkgQUREICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgICAgICAgIEBpKzEKIAkgQUREICAgICAgICAgICByMiwgcjIsICM0ICAgICAgICAgICAgICAgICAgICAgICAgIEBwb3MgKz0gU1RFUAogCSBDTVAgICAgICAgICAgIHI0LCAjMTYKLQorCSAKIAkgQkxUICAgICAgICAgICBMT09QaQotCisgICAgICAgICAKIHRoZV9lbmQ6CiAgICAgICAgICBMRE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQotCisgICAgICAKICAgICAgICAgIEBFTkRGVU5DCi0gICAgICAgICAuRU5ECi0KLQotCisgICAgICAgICAuRU5ECSAKKyAgICAgICAgCisJCisJICAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCmluZGV4IGUwYjMzOGQuLmQ3YjQ1MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCkBAIC0zNSw3ICszNSw3IEBACiAKIHByZWRfbHQ0X2FzbToKIAotICAgICAgICAgU1RNRkQgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICAgU1RNRkQgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAKICAgICAgICAgIFJTQiAgICAgICByNCwgcjEsICMwICAgICAgICAgICAgICAgICAgICAgICAgIEAtVDAKICAgICAgICAgIFJTQiAgICAgICByMiwgcjIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIEBmcmFjID0gLWZyYWMKICAgICAgICAgIEFERCAgICAgICByNSwgcjAsIHI0LCBMU0wgIzEgICAgICAgICAgICAgICAgIEB4ID0gZXhjIC0gVDAKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgIFNVQiAgICAgICByNSwgcjUsICMzMCAgICAgICAgICAgICAgICAgICAgICAgIEB4IC09IDE1CiAgICAgICAgICBSU0IgICAgICAgcjQsIHIyLCAjMyAgICAgICAgICAgICAgICAgICAgICAgICBAayA9IDMgLSBmcmFjCiAgICAgICAgICBMRFIgICAgICAgcjYsIFRhYmxlCi0JIE1PViAgICAgICByOCwgcjQsIExTTCAjNgorCSBNT1YgICAgICAgcjgsIHI0LCBMU0wgIzYgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgQE1PViAgICAgICByNywgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBqID0gMAogICAgICAgICAgQUREICAgICAgIHI4LCByNiwgcjggICAgICAgICAgICAgICAgICAgICAgICAgQHB0cjIgPSAmKGludGVyNF8yW2tdWzBdKQogCkBAIC02Myw3ICs2Myw3IEBACiAJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzFdCiAJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzJdCiAKLQkgU01VTEJCICAgIHIxMCwgcjQsIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMF0gKiBoWzBdCisJIFNNVUxCQiAgICByMTAsIHI0LCByMyAgICAgICAgICAgICAgICAgICAgICAgIEB4WzBdICogaFswXSAgICAgICAgICAgICAgICAgIAogCSBTTVVMQkIgICAgcjExLCByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgICBAeFsxXSAqIGhbMF0KIAkgU01VTEJCICAgIHIxMiwgcjksIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMl0gKiBoWzBdCiAKQEAgLTI4NSw3ICsyODUsNyBAQAogCiAJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzJdICogaFsyXQogICAgICAgICAgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbM10gKiBoWzJdCi0KKyAgICAgIAogCSBTTUxBQlQgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszXSAqIGhbM10KIAkgU01MQUJUICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbNF0gKiBoWzNdCiAKQEAgLTQzNSw3ICs0MzUsNyBAQAogCSBNT1YgICAgICAgcjExLCByMTEsIExTTCAjMQogCiAJIFFBREQgICAgICByMTAsIHIxMCwgcjEwCi0JIFFBREQgICAgICByMTEsIHIxMSwgcjExCisJIFFBREQgICAgICByMTEsIHIxMSwgcjExIAogCiAJIFFBREQgICAgICByMTAsIHIxMCwgcjUKIAkgUUFERCAgICAgIHIxMSwgcjExLCByNQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwppbmRleCA1ZmYwOTY0Li44NmIzYmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpAQCAtMzQsMTIgKzM0LDEyIEBACiAKICAgICAgICAgTERSSCAgICByNSwgW3IwXSwgIzIKICAgICAgICAgTERSSCAgICByNiwgW3IwXSwgIzIKLSAgICAgICAgT1JSICAgICByNSwgcjYsIHI1LCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgQHI1IC0tLSBhMCwgYTEKKyAgICAgICAgT1JSICAgICByNSwgcjYsIHI1LCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgQHI1IC0tLSBhMCwgYTEJCiAKICAgICAgICAgTERSSCAgICByNiwgW3IwXSwgIzIKIAlMRFJIICAgIHI3LCBbcjBdLCAjMgogCU9SUiAgICAgcjYsIHI3LCByNiwgTFNMICMxNiAgICAgICAgICAgICAgICAgIEByNiAtLS0gYTIsIGEzCi0KKwkKICAgICAgICAgTERSSCAgICByNywgW3IwXSwgIzIKIAlMRFJIICAgIHI4LCBbcjBdLCAjMgogCU9SUiAgICAgcjcsIHI4LCByNywgTFNMICMxNiAgICAgICAgICAgICAgICAgIEByNyAtLS0gYTQsIGE1CkBAIC01OSwxMyArNTksMTMgQEAKICAgICAgICAgTERSSCAgICByMTEsIFtyMF0sICMyCiAJTERSSCAgICByMTIsIFtyMF0sICMyCiAJT1JSICAgICByMTEsIHIxMiwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgICAgQHIxMSAtLS0gYTEyLCBhMTMKLQorCQogCUxEUkggICAgcjEyLCBbcjBdLCAjMgogCUxEUkggICAgcjQsIFtyMF0sICMyCiAJT1JSICAgICByMTIsIHI0LCByMTIsIExTTCAjMTYgICAgICAgICAgICAgICAgQHIxMiAtLS0gYTE0LCBhMTUKKwkKIAotCi0JU1RNRkQgICByMTMhLCB7cjggLSByMTJ9ICAgICAgICAgICAgICAgICAgICAgQHN0b3JlIHI4LXIxMgorCVNUTUZEICAgcjEzISwge3I4IC0gcjEyfSAgICAgICAgICAgICAgICAgICAgIEBzdG9yZSByOC1yMTIgCiAJTERSSCAgICByNCwgW3IwXSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgYTE2CiAgICAgICAgIE1PViAgICAgcjE0LCByMywgQVNSICMyICAgICAgICAgICAgICAgICAgICAgIEBvbmUgbG9vcCBnZXQgNCBvdXRwdXRzCiAJQUREICAgICByMSwgcjEsICM0CkBAIC03OCw3ICs3OCw3IEBACiAJTERSICAgICByMiwgIFtyMV0sICMtNCAgICAgICAgICAgICAgICAgICAgICAgQHIyICAgLS0tIHhbMV0sIHhbMF0KIAogCVNNVUxUQiAgcjMsIHI1LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpMSgwKSAgLS0tIHIzID0geFswXSAqIGEwCi0gICAgICAgIFNNVUxUVCAgcjQsIHI1LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpMigwKSAgLS0tIHI0ID0geFsxXSAqIGEwCisgICAgICAgIFNNVUxUVCAgcjQsIHI1LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpMigwKSAgLS0tIHI0ID0geFsxXSAqIGEwCQogCVNNVUxUQiAgcjExLCByNSwgcjEwICAgICAgICAgICAgICAgICAgICAgICAgIEBpMygwKSAgLS0tIHIxMSA9IHhbMl0gKiBhMAogCVNNVUxUVCAgcjEyLCByNSwgcjEwICAgICAgICAgICAgICAgICAgICAgICAgIEBpNCgwKSAgLS0tIHIxMiA9IHhbM10gKiBhMAogCkBAIC04OCwyMCArODgsMjAgQEAKIAogCVNNTEFUQiAgcjExLCByNiwgcjIsIHIxMSAgICAgICAgICAgICAgICAgICAgIEBpMygyKSAgLS0tIHIxMSArPSB4WzBdICogYTIKIAlTTUxBVFQgIHIxMiwgcjYsIHIyLCByMTIgICAgICAgICAgICAgICAgICAgICBAaTQoMikgIC0tLSByMTIgKz0geFsxXSAqIGEyCi0JU01MQUJCICByMTIsIHI2LCByMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQGk0KDMpICAtLS0gcjEyICs9IHhbMF0gKiBhMwotCisJU01MQUJCICByMTIsIHI2LCByMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQGk0KDMpICAtLS0gcjEyICs9IHhbMF0gKiBhMyAgICAgICAgICAgICAgICAgCisJCiAJTERSICAgICByMiwgW3IxXSwgIy00ICAgICAgICAgICAgICAgICAgICAgICAgQHIyIC0tLS0geFstMV0sIHhbLTJdCiAKIAlTTUxBQlQgIHIzLCByNSwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICBAaTEoMSkgLS0tIHIzICs9IHhbLTFdICogYTEKIAlTTUxBVFQgIHI0LCByNiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgICAgICBAaTIoMikgLS0tIHI0ICs9IHhbLTFdICogYTIKIAlTTUxBQlQgIHIxMSwgcjYsIHIyLCByMTEgICAgICAgICAgICAgICAgICAgICBAaTMoMykgLS0tIHIxMSArPSB4Wy0xXSAqIGEzCiAJU01MQVRUICByMTIsIHI3LCByMiwgcjEyICAgICAgICAgICAgICAgICAgICAgQGk0KDQpIC0tLSByMTIgKz0geFstMV0gKiBhNAotICAgICAgICBTTUxBVEIgIHIzLCByNiwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICBAaTEoMikgLS0tIHIzICs9IHhbLTJdICogYTIKKyAgICAgICAgU01MQVRCICByMywgcjYsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgQGkxKDIpIC0tLSByMyArPSB4Wy0yXSAqIGEyCQogCiAJU01MQUJCCXI0LCByNiwgcjIsIHI0CQkJCUAgaTIJKDMpCiAJU01MQVRCICByMTEscjcsIHIyLCByMTEJCQkJQCBpMwkoNCkKIAlTTUxBQkIJcjEyLHI3LCByMiwgcjEyCQkJCUAgaTQJKDUpCi0KKwkKIAlMRFIJcjIsW3IxXSwjLTQKIAlTTUxBQlQJcjMsIHI2LCByMiwgcjMJCQkJQCBpMQkoMykKIAlTTUxBVFQJcjQsIHI3LCByMiwgcjQJCQkJQCBpMgkoNCkKQEAgLTExMSw3ICsxMTEsNyBAQAogCVNNTEFCQglyNCwgcjcsIHIyLCByNAkJCQlAIGkyCSg1KQogCVNNTEFUQglyMTEscjgsIHIyLCByMTEJCQkJQCBpMwkoNikKIAlTTUxBQkIJcjEyLHI4LCByMiwgcjEyCQkJCUAgaTQJKDcpCi0KKwkJCiAJTERSCXIyLFtyMV0sIy00CiAJU01MQUJUCXIzLCByNywgcjIsIHIzCQkJCUAgaTEJKDUpCiAJU01MQVRUCXI0LCByOCwgcjIsIHI0CQkJCUAgaTIJKDYpCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlTTUxBVEIJcjExLHI5LCByMiwgcjExCQkJCUAgaTMJKDgpCiAJU01MQUJCCXIxMixyOSwgcjIsIHIxMgkJCQlAIGk0CSg5KQogCUxEUglyMTAsIFtyMTMsICM4XQkJCQlAIFsgYTEwIHwgYTExXQotCisJCiAJTERSCXIyLFtyMV0sIy00CiAJU01MQUJUCXIzLCByOCwgcjIsIHIzCQkJCUAgaTEJKDcpCiAJU01MQVRUCXI0LCByOSwgcjIsIHI0CQkJCUAgaTIJKDgpCkBAIC0xMzMsNyArMTMzLDcgQEAKIAlTTUxBVEIJcjExLHIxMCwgcjIsIHIxMQkJCUAgaTMJKDEwKQogCVNNTEFCQglyMTIscjEwLCByMiwgcjEyCQkJQCBpNAkoMTEpCiAJTERSCXI4LCBbcjEzLCAjMTJdCQkJCUAgWyBhMTIgfCBhMTMgXQotCisJCQogCUxEUglyMixbcjFdLCMtNAogCVNNTEFCVAlyMywgcjksIHIyLCByMwkJCQlAIGkxCSg5KQogCVNNTEFUVAlyNCwgcjEwLCByMiwgcjQJCQkJQCBpMgkoMTApCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlTTUxBVEIJcjExLHI4LCByMiwgcjExCQkJCUAgaTMJKDEyKQogCVNNTEFCQglyMTIscjgsIHIyLCByMTIJCQkJQCBpNAkoMTMpCiAJTERSCXI5LCBbcjEzLCAjMTZdCQkJCUAgWyBhMTQgfCBhMTUgXQotCisJCiAJTERSCXIyLFtyMV0sIy00CiAJU01MQUJUCXIzLCByMTAsIHIyLCByMwkJCQlAIGkxCSgxMSkKIAlTTUxBVFQJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoMTIpCkBAIC0xNTQsNyArMTU0LDcgQEAKIAlTTUxBQkIJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoMTMpCiAJU01MQVRCCXIxMSxyOSwgcjIsIHIxMQkJCQlAIGkzCSgxNCkKIAlTTUxBQkIJcjEyLHI5LCByMiwgcjEyCQkJCUAgaTQJKDE1KQotCisJCiAKIAlMRFIJcjIsW3IxXSwjLTQKIAlTTUxBQlQJcjMsIHI4LCByMiwgcjMJCQkJQCBpMQkoMTMpCkBAIC0xNjUsNjQgKzE2NSw2NCBAQAogCVNNTEFCQglyNCwgcjksIHIyLCByNAkJCQlAIGkyCSgxNSkKIAlTTUxBQkIJcjExLHIxNCwgcjIsIHIxMQkJCUAgaTMJKDE2KQogCUxEUgkJcjgsIFtyMTNdCQkJCQlAIFsgYTYgfCBhNyBdCi0KKwkJCQogICAgICAgICBMRFIgICAgIHIyLFtyMV0sIzQ0ICAgICAgICAgCQlAIENoYW5nZQogCVNNTEFCVAlyMywgcjksIHIyLCByMwogCVNNTEFCQglyMywgcjE0LCByMiwgcjMKIAlTTUxBQlQJcjQsIHIxNCwgcjIsIHI0CiAJTERSCQlyOSwgW3IxMywgIzRdCQkJCUAgWyBhOCB8IGE5IF0KKwkKIAotCi0JUUFERAlyMyxyMyxyMwotCVFBREQJcjQscjQscjQKLQlRQURECXIxMSxyMTEscjExCi0JUUFERAlyMTIscjEyLHIxMgotCi0JUUFERAlyMyxyMyxyMwotCVFBREQJcjQscjQscjQKLQlRQURECXIxMSxyMTEscjExCi0JUUFERAlyMTIscjEyLHIxMgotCi0JUUFERAlyMyxyMyxyMwotCVFBREQJcjQscjQscjQKLQlRQURECXIxMSxyMTEscjExCi0JUUFERAlyMTIscjEyLHIxMgotCi0JUUFERAlyMyxyMyxyMwotCVFBREQJcjQscjQscjQKLQlRQURECXIxMSxyMTEscjExCi0JUUFERAlyMTIscjEyLHIxMgotCi0JTU9WCXIyLCMzMjc2OAotCi0JUURBREQJcjMscjIscjMKLQlRREFERAlyNCxyMixyNAotCVFEQURECXIxMSxyMixyMTEKLQlRREFERAlyMTIscjIscjEyCi0KLQorCVFBREQJcjMscjMscjMJCQkJCQorCVFBREQJcjQscjQscjQJCQkJCQorCVFBREQJcjExLHIxMSxyMTEJCQkJCQorCVFBREQJcjEyLHIxMixyMTIJCQkJCQorCQkKKwlRQURECXIzLHIzLHIzCQkJCQkKKwlRQURECXI0LHI0LHI0CQkJCQkKKwlRQURECXIxMSxyMTEscjExCQkJCQkKKwlRQURECXIxMixyMTIscjEyCQkJCQkKKwkKKwlRQURECXIzLHIzLHIzCQkJCQkKKwlRQURECXI0LHI0LHI0CQkJCQkKKwlRQURECXIxMSxyMTEscjExCQkJCQkKKwlRQURECXIxMixyMTIscjEyCQkJCQkKKwkKKwlRQURECXIzLHIzLHIzCQkJCQkKKwlRQURECXI0LHI0LHI0CQkJCQkKKwlRQURECXIxMSxyMTEscjExCQkJCQkKKwlRQURECXIxMixyMTIscjEyCQkJCQkKKwkKKwlNT1YJcjIsIzMyNzY4CQorCQorCVFEQURECXIzLHIyLHIzCQkJCQkKKwlRREFERAlyNCxyMixyNAkJCQkJCisJUURBREQJcjExLHIyLHIxMQkJCQkJCisJUURBREQJcjEyLHIyLHIxMgkJCQkJCisJCQorCQogCU1PVglyMyxyMyxhc3IgIzE2CiAJTU9WCXI0LHI0LGFzciAjMTYKIAlNT1YJcjExLHIxMSxhc3IgIzE2CiAJTU9WCXIxMixyMTIsYXNyICMxNgotCisJCiAJU1RSSAlyMyxbcjBdLCMyCiAJU1RSSAlyNCxbcjBdLCMyCiAJU1RSSAlyMTEsW3IwXSwjMgogCVNUUkgJcjEyLFtyMF0sIzIKLQorCQogCU1PVglyMixyMTQsYXNyICMxNgogCVNVQglyMTQsIHIxNCwgIzB4MTAwMDAKIAlTVUJTCXIyLHIyLCMxCi0JQk5FCXJlc2lkdV9sb29wCisJQk5FCXJlc2lkdV9sb29wCQogZW5kOgotCUxETUZECXIxMyEsIHtyOCAtcjEyfQorCUxETUZECXIxMyEsIHtyOCAtcjEyfQkKIAlMRE1GRAlyMTMhLCB7cjQgLXIxMixwY30KIAogICAgICAgICBARU5ERlVOQwotICAgICAgICAuRU5ECi0KLQotCisgICAgICAgIC5FTkQJIAorICAgICAgICAKKwkKKwkgIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCmluZGV4IGIzMDAyMjQuLmY4M2U2ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucwpAQCAtMzgsNyArMzgsNyBAQAogCSBNT1YgICAgICAgICAgIHI4LCAjMHg3ZmZmZmZmZgogCSBNT1YgICAgICAgICAgIHI5LCAjMHg4MDAwCiAJIEJMRSAgICAgICAgICAgTE9PUDIKLQorCSAKIExPT1AxOgogCiAgICAgICAgICBMRFJTSCAgICAgICAgICByNSwgW3I0XSAgICAgICAgICAgICAgICAgICAgQGxvYWQgeFtpXQpAQCAtNjUsMTEgKzY1LDExIEBACiAKIFRoZV9lbmQ6CiAgICAgICAgICBMRE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQotCisgICAgIAogICAgICAgICAgQEVOREZVTkMKLSAgICAgICAgIC5FTkQKLQotCi0KKyAgICAgICAgIC5FTkQJIAorICAgICAgICAKKwkKKwkgIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucwppbmRleCAwYzI4N2E0Li5mNDcwMGNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCkBAIC0zMywxOCArMzMsMTggQEAKIAogU3luX2ZpbHRfYXNtOgogCi0gICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9CisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IAogICAgICAgICAgIFNVQiAgICAgICAgICAgcjEzLCByMTMsICM3MDAgICAgICAgICAgICAgICAgICAgQCB5X2J1ZltMX0ZSQU1FMTZrICsgTTE2a10KLQorICAgCiAgICAgICAgICAgTU9WICAgICAgICAgICByNCwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbWVtW10gYWRkcmVzcwogICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHIxMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IHl5ID0geV9idWYgYWRkcmVzcwogCiAgICAgICAgICAgQCBmb3IoaSA9IDBAIGkgPCBtQCBpKyspCiAgICAgICAgICAgQHsKICAgICAgICAgICBAICAgICp5eSsrID0gbWVtW2ldQAotICAgICAgICAgIEB9CisgICAgICAgICAgQH0gCiAKLSAgICAgICAgICBMRFJIICAgICAgICAgIHI2LCAgW3I0XSwgIzIKKyAgICAgICAgICBMRFJIICAgICAgICAgIHI2LCAgW3I0XSwgIzIgICAgICAgICAgCiAgICAgICAgICAgTERSSCAgICAgICAgICByNywgIFtyNF0sICMyCiAgICAgICAgICAgTERSSCAgICAgICAgICByOCwgIFtyNF0sICMyCiAgICAgICAgICAgTERSSCAgICAgICAgICByOSwgIFtyNF0sICMyCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICAgU1RSSCAgICAgICAgICByMTIsIFtyNV0sICMyCiAgICAgICAgICAgU1RSSCAgICAgICAgICByMTQsIFtyNV0sICMyCiAKLSAgICAgICAgICBMRFJIICAgICAgICAgIHI2LCAgW3I0XSwgIzIKKyAgICAgICAgICBMRFJIICAgICAgICAgIHI2LCAgW3I0XSwgIzIgICAgICAgICAgCiAgICAgICAgICAgTERSSCAgICAgICAgICByNywgIFtyNF0sICMyCiAgICAgICAgICAgTERSSCAgICAgICAgICByOCwgIFtyNF0sICMyCiAgICAgICAgICAgTERSSCAgICAgICAgICByOSwgIFtyNF0sICMyCkBAIC05Miw0NSArOTIsNDUgQEAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICM2XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzNdCiAgICAgICAgICAgTERSU0ggICAgICAgICByMTEsW3IwLCAjOF0gICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVs0XQogICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQKLSAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0CisgICAgICAgICAgQU5EICAgICAgICAgICByOSwgcjksIHIxNCAgICAgICAgICAKICAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgLWFbMl0gLS0gLWFbMV0KICAgICAgICAgICBPUlIgICAgICAgICAgIHIxMiwgcjksIHIxMSwgTFNMICMxNiAgICAgICAgICAgIEAgLWFbNF0gLS0gLWFbM10KICAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy00XQogICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLThdCi0KKyAgICAgICAgICAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMxMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzVdCiAgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMTJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVs2XQogICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzE0XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbN10KICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSxbcjAsICMxNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzhdCiAgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNAotICAgICAgICAgIEFORCAgICAgICAgICAgcjksIHI5LCByMTQKKyAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0ICAgICAgICAgIAogICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCAtYVs2XSAtLSAtYVs1XQogICAgICAgICAgIE9SUiAgICAgICAgICAgcjEyLCByOSwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgQCAtYVs4XSAtLSAtYVs3XQogICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTEyXQotICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTE2XQotCisgICAgICAgICAgU1RSICAgICAgICAgICByMTIsIFtyMTMsICMtMTZdICAgICAgICAgIAorICAgICAgICAgICAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMxOF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzldCiAgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMjBdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsxMF0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMyMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzExXQogICAgICAgICAgIExEUlNIICAgICAgICAgcjExLFtyMCwgIzI0XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTJdCiAgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNAotICAgICAgICAgIEFORCAgICAgICAgICAgcjksIHI5LCByMTQKKyAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0ICAgICAgICAgIAogICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCAtYVsxMF0gLS0gLWFbOV0KICAgICAgICAgICBPUlIgICAgICAgICAgIHIxMiwgcjksIHIxMSwgTFNMICMxNiAgICAgICAgICAgIEAgLWFbMTJdIC0tIC1hWzExXQogICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTIwXQotICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTI0XQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTI0XSAgICAKIAogICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzI2XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTNdCiAgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMjhdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsxNF0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMzMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzE1XQogICAgICAgICAgIExEUlNIICAgICAgICAgcjExLFtyMCwgIzMyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTZdCiAgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNAotICAgICAgICAgIEFORCAgICAgICAgICAgcjksIHI5LCByMTQKKyAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0ICAgICAgICAgIAogICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCAtYVsxNF0gLS0gLWFbMTNdCiAgICAgICAgICAgT1JSICAgICAgICAgICByMTIsIHI5LCByMTEsIExTTCAjMTYgICAgICAgICAgICBAIC1hWzE2XSAtLSAtYVsxNV0KICAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0yOF0KLSAgICAgICAgICBTVFIgICAgICAgICAgIHIxMiwgW3IxMywgIy0zMl0KLQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTMyXSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIEFERCAgICAgICAgICAgcjQsIHIxMywgIzMyCiBMT09QOgogICAgICAgICAgIExEUlNIICAgICAgICAgcjYsICBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHhbaV0KQEAgLTE1NSw4ICsxNTUsOCBAQAogICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVszXSAqICgqKHRlbXBfcCAtMykpCiAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0xMF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA1KQotCi0gICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMSwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzRdICogKCoodGVtcF9wIC00KSkKKyAgIAorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVs0XSAqICgqKHRlbXBfcCAtNCkpICAgICAgICAKIAogICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTEyXSAgICAgICAgICAgICAgICAgQCAtYVs2XSAgLWFbNV0KICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMCwgIy0xMl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA2KQpAQCAtMTY5LDEzICsxNjksMTMgQEAKIAogICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTE2XSAgICAgICAgICAgICAgICAgQCAtYVs4XSAtYVs3XQogICAgICAgICAgIExEUlNIICAgICAgICAgcjExLCBbcjEwLCAjLTE2XSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDgpCi0KKyAgICAgICAgIAogICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVs3XSAqICgqKHRlbXBfcCAtNykpCiAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0xOF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA5KQogCi0gICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMSwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzhdICogKCoodGVtcF9wIC04KSkKLQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVs4XSAqICgqKHRlbXBfcCAtOCkpICAgICAgICAgIAorIAogICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTIwXSAgICAgICAgICAgICAgICAgQCAtYVsxMF0gIC1hWzldCiAgICAgICAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTAsICMtMjBdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTApCiAKQEAgLTE5MiwxMSArMTkyLDExIEBACiAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0yNl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxMykKIAotICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVsxMl0gKiAoKih0ZW1wX3AgLTEyKSkKKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjExLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbMTJdICogKCoodGVtcF9wIC0xMikpICAgICAgICAgICAKIAogICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTI4XSAgICAgICAgICAgICAgICAgQCAtYVsxNF0gLWFbMTNdCiAgICAgICAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTAsICMtMjhdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTQpCi0KKyAKICAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjksIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbMTNdICogKCoodGVtcF9wIC0xMykpCiAKICAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxMCwgIy0zMF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxNSkKQEAgLTIxMSwyOCArMjExLDI4IEBACiAgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMSwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzE2XSAqICgqKHRlbXBfcCAtMTYpKQogCiAgICAgICAgICAgUlNCICAgICAgICAgICByMTQsIHIxNCwgcjAKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE1PViAgICAgICAgICAgcjcsIHIxNCwgTFNMICM0ICAgICAgICAgICAgICAgICAgQCBMX3RtcCA8PD00CiAgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxCi0gICAgICAgICAgQUREICAgICAgICAgICByMTQsIHI3LCAjMHg4MDAwCisgICAgICAgICAgQUREICAgICAgICAgICByMTQsIHI3LCAjMHg4MDAwICAgICAgICAgICAgICAgICAKICAgICAgICAgICBNT1YgICAgICAgICAgIHI3LCByMTQsIEFTUiAjMTYgICAgICAgICAgICAgICAgIEAgKExfdG1wICsgMHg4MDAwKSA+PiAxNgogICAgICAgICAgIENNUCAgICAgICAgICAgcjgsICM4MAogICAgICAgICAgIFNUUkggICAgICAgICAgcjcsIFtyMTBdICAgICAgICAgICAgICAgICAgICAgICAgQCB5eVtpXQogICAgICAgICAgIFNUUkggICAgICAgICAgcjcsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgQCB5W2ldCiAgICAgICAgICAgQkxUICAgICAgICAgICBMT09QCi0KKyAKICAgICAgICAgICBAIHVwZGF0ZSBtZW1bXQogICAgICAgICAgIEFERCAgICAgICAgICAgcjUsIHIxMywgIzE2MCAgICAgICAgICAgICAgICAgICAgQCB5eVs2NF0gYWRkcmVzcwogICAgICAgICAgIE1PViAgICAgICAgICAgcjEsIHIzCiAgICAgICAgICAgTU9WICAgICAgICAgICByMCwgcjUKICAgICAgICAgICBNT1YgICAgICAgICAgIHIyLCAjMTYKLSAgICAgICAgICBCTCAgICAgICAgICAgIHZvQVdCX0NvcHkKKyAgICAgICAgICBCTCAgICAgICAgICAgIHZvQVdCX0NvcHkgICAgICAgICAgCiAKIFN5bl9maWx0X2FzbV9lbmQ6Ci0KLSAgICAgICAgICBBREQgICAgICAgICAgIHIxMywgcjEzLCAjNzAwCi0gICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9CisgCisgICAgICAgICAgQUREICAgICAgICAgICByMTMsIHIxMywgIzcwMAkJICAgICAKKyAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gCiAgICAgICAgICAgQEVOREZVTkMKICAgICAgICAgICAuRU5ECi0KKyAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKaW5kZXggMWQ1ODkzZi4uMmFmYzE0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zCkBAIC0zMCwxMCArMzAsMTAgQEAKIAogICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKICAgICAgICAgICAgLmdsb2JhbCAgIERlZW1waF8zMl9hc20KLQorCSAgIAogRGVlbXBoXzMyX2FzbToKIAotICAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0KKyAgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IAogCSAgIE1PViAgICAgICAgICByNCwgIzIgICAgICAgICAgICAgICAgICAgQGk9MAogCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVswXQogCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9sb1swXQpAQCAtNDcsOSArNDcsOSBAQAogCSAgIEFERCAgICAgICAgICByMTIsIHIxMCwgcjcsIExTTCAjNCAgICAgQExfdG1wICs9IHhfbG9bMF0gPDwgNAogCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzICAgICAgICAgQExfdG1wIDw8PSAzCiAJICAgTVVMICAgICAgICAgIHI5LCByNSwgcjgKLQkgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbMV0KKwkgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbMV0gCiAJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQotCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9sb1sxXQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9sb1sxXSAgCiAJICAgTU9WICAgICAgICAgIHIxMiwgcjEwLCBMU0wgIzEgICAgICAgICBATF90bXAgPSBMX21hYyhMX3RtcCwgKm1lbSwgZmFjKQogCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExCiAJICAgTU9WICAgICAgICAgIHIxNCwgcjEwLCBBU1IgIzE2ICAgICAgICBAeVswXSA9IHJvdW5kKExfdG1wKQpAQCAtOTQsOSArOTQsOSBAQAogCiAgICAgICAgICAgIEJMVCAgICAgICAgICBMT09QCiAgICAgICAgICAgIFNUUiAgICAgICAgICByMTQsIFtyM10KLSAgICAgICAgICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXQorICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdCSAgIAogCi0gICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fQorICAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gCiAKIAkgICAuRU5ECiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucwppbmRleCA4MjMwOTQ0Li42NzhmMWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zCkBAIC00NSwxNCArNDUsMTQgQEAKIAkgIFZMRDEuUzE2ICAgICAgICAgIHtRMTIsIFExM30sIFtyMV0hICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB5W10KIAogICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgIFExNSwgRDE2LCBEMAotICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE3LCBEMQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE3LCBEMSAgICAgICAgICAgICAgIAogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE4LCBEMgogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE5LCBEMwotCSAgVkxEMS5TMTYgICAgICAgICAge1EwLCBRMX0sIFtyMV0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHlbXQotICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDIwLCBENAorCSAgVkxEMS5TMTYgICAgICAgICAge1EwLCBRMX0sIFtyMV0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHlbXSAgIAorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDIwLCBENCAgICAgICAKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMSwgRDUKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMiwgRDYKLSAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMywgRDcKKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMywgRDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNCwgRDgKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNSwgRDkKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNiwgRDEwCkBAIC02NCw5ICs2NCw5IEBACiAKICAgICAgICAgICBDTVAgICAgICAgICAgICAgICByMiwgIzY0CiAgICAgICAgICAgQkVRICAgICAgICAgICAgICAgTGFibGUxCi0gICAgICAgICAgVkxEMS5TMTYgICAgICAgICAge1EwLCBRMX0sIFtyMF0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXQotCSAgVkxEMS5TMTYgICAgICAgICAge1EyLCBRM30sIFtyMV0hCi0gICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENCwgRDAKKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTAsIFExfSwgW3IwXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdICAKKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMiwgUTN9LCBbcjFdISAKKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ0LCBEMCAgICAgICAgICAgICAKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ1LCBEMQogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDYsIEQyCiAgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENywgRDMKQEAgLTEwMiwxMSArMTAyLDExIEBACiAJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyLCBEMgogCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMywgRDMKIAotTGFibGUxOgorTGFibGUxOiAKIAogICAgICAgICAgIFZRQURELlMzMiAgICAgICAgIEQzMCwgRDMwLCBEMzEKICAgICAgICAgICBWUEFERC5TMzIgICAgICAgICBEMzAsIEQzMCwgRDMwCi0gICAgICAgICAgVk1PVi5TMzIgICAgICAgICAgcjEyLCBEMzBbMF0KKyAgICAgICAgICBWTU9WLlMzMiAgICAgICAgICByMTIsIEQzMFswXSAgICAgICAgCiAKIAkgIEFERCAgICAgICAgICAgICAgIHIxMiwgcjEyLCByMTIKICAgICAgICAgICBBREQgICAgICAgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IChMX3N1bSA8PCAxKSAgKyAxCkBAIC0xMTcsMTEgKzExNywxMSBAQAogICAgICAgICAgIFNVQiAgICAgICAgICAgICAgIHIxMCwgcjEwLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIHNmdCA9IG5vcm1fbChMX3N1bSkKICAgICAgICAgICBNT1YgICAgICAgICAgICAgICByMCwgcjEyLCBMU0wgcjEwICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IExfc3VtIDw8IHNmdAogICAgICAgICAgIFJTQiAgICAgICAgICAgICAgIHIxMSwgcjEwLCAjMzAgICAgICAgICAgICAgICAgICAgICAgICBAICpleHAgPSAzMCAtIHNmdAotICAgICAgICAgIFNUUkggICAgICAgICAgICAgIHIxMSwgW3IzXQorICAgICAgICAgIFNUUkggICAgICAgICAgICAgIHIxMSwgW3IzXSAgICAgICAgICAgICAgICAgICAgIAogCiBEb3RfcHJvZHVjdDEyX2VuZDoKLQotICAgICAgICAgIExETUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KKwkJICAgICAKKyAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9IAogCiAgICAgICAgICAgLkVORAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCmluZGV4IDE0YmE4MjguLjUzODlhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCkBAIC0xMyw3ICsxMyw3IEBACiBAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIEAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiBAICovCi1ACitAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIEAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogQHZvaWQgRmlsdF82a183aygKIEAgICAgIFdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgICAgICAgICAgICAgICAgICAqLwpAQCAtMjMsNyArMjMsNyBAQAogQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBAIHIwICAgIC0tLSAgc2lnbmFsW10KIEAgcjEgICAgLS0tICBsZwotQCByMiAgICAtLS0gIG1lbVtdCitAIHIyICAgIC0tLSAgbWVtW10gCiAKICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKICAgICAgICAgICAuZ2xvYmFsICAgRmlsdF82a183a19hc20KQEAgLTMxLDcgKzMxLDcgQEAKIAogRmlsdF82a183a19hc206CiAKLSAgICAgICAgICBTVE1GRCAgIAkJcjEzISwge3IwIC0gcjEyLCByMTR9CisgICAgICAgICAgU1RNRkQgICAJCXIxMyEsIHtyMCAtIHIxMiwgcjE0fSAKICAgICAgICAgICBTVUIgICAgCQlyMTMsIHIxMywgIzI0MCAgICAgICAgICAgICAgQCB4W0xfU1VCRlIxNmsgKyAoTF9GSVIgLSAxKV0KICAgICAgICAgICBNT1YgICAgIAkJcjgsIHIwICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBzaWduYWxbXSBhZGRyZXNzCiAgICAgICAgICAgTU9WICAgICAJCXI1LCByMiAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbWVtW10gYWRkcmVzcwpAQCAtNDksNyArNDksNyBAQAogCiAKIAotICAgICAgICAgIExEUiAgICAgCQlyMTAsIExhYmxlMSAgICAgICAgICAgICAgICAgQCBnZXQgZmlyXzdrIGFkZHJlc3MKKyAgICAgICAgICBMRFIgICAgIAkJcjEwLCBMYWJsZTEgICAgICAgICAgICAgICAgIEAgZ2V0IGZpcl83ayBhZGRyZXNzICAgICAKICAgICAgICAgICBNT1YgICAgICAgICAgICAgICAgICAgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgIEAgY2hhbmdlIG15TWVtQ29weSB0byBDb3B5LCBkdWUgdG8gQ29weSB3aWxsIGNoYW5nZSByMyBjb250ZW50CiAgICAgICAgICAgQUREICAgICAJICAgIAlyNiwgcjEzLCAjNjAgICAgICAgICAgICAgICAgQCBnZXQgeFtMX0ZJUiAtIDFdIGFkZHJlc3MKICAgICAgICAgICBNT1YgICAgICAgICAgIAlyNywgcjMgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnbmFsW2ldCkBAIC04MSw5ICs4MSw5IEBACiAJICBNT1YgICAgICAgICAgICAgICAgICAgcjEyLCByNQogICAgICAgICAgIEBTVFIgICAgIAkJcjUsIFtzcCwgIy00XSAgICAgICAgICAgICAgIEAgUFVTSCAgcjUgdG8gc3RhY2sKICAgICAgICAgICBAIG5vdCB1c2UgcmVnaXN0ZXJzOiByNCwgcjEwLCByMTIsIHIxNCwgcjUKLSAgICAgICAgICBNT1YgICAgIAkJcjQsIHIxMwotICAgICAgICAgIE1PViAgICAgCQlyNSwgIzAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMAotCisgICAgICAgICAgTU9WICAgICAJCXI0LCByMTMgCisgICAgICAgICAgTU9WICAgICAJCXI1LCAjMCAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwICAgIAorICAgICAgICAgCiAgICAgICAgICAgQCByNCAtLS0geFtpXSwgcjEwIC0tLS0gZmlyXzZrXzdrCiAgICAgICAgICAgVkxEMS5TMTYgICAgICAgICAgICAgIHtRMCwgUTF9LCBbcjEwXSEgICAgICAgICAgIEBmaXJfNmtfN2tbMF0gIH4gZmlyXzZrXzdrWzE1XQogCSAgVkxEMS5TMTYgICAgICAgICAgICAgIHtRMiwgUTN9LCBbcjEwXSEgICAgICAgICAgIEBmaXJfNmtfN2tbMTZdIH4gZmlyXzZrXzdrWzMxXQpAQCAtOTEsMjAgKzkxLDIwIEBACiAKIAkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTQsIFE1fSwgW3I0XSEgICAgICAgICAgICBAeFswXSAgfiB4WzE1XQogCSAgVkxEMS5TMTYgICAgICAgICAgICAgIHtRNiwgUTd9LCBbcjRdISAgICAgICAgICAgIEB4WzE2XSB+IFhbMzFdCi0JICBWTEQxLlMxNiAgICAgICAgICAgICAge1E4fSwgW3I0XSEKLSAgICAgICAgICBWTU9WLlMxNiAgICAgICAgICAgICAgUTE1LCAjMAotCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge1E4fSwgW3I0XSEgCisgICAgICAgICAgVk1PVi5TMTYgICAgICAgICAgICAgIFExNSwgIzAJICAKKyAgICAgICAgICAKIExPT1BfNks3SzoKIAotICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgICAgICBROSxEOCxEMFswXQotICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgICAgICBRMTAsRDksRDFbMF0KLSAgICAgICAgICBWTVVMTC5TMTYgICAgICAgICAgICAgUTExLEQ5LEQwWzBdCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgICAgIFE5LEQ4LEQwWzBdICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBWTVVMTC5TMTYgICAgICAgICAgICAgUTEwLEQ5LEQxWzBdIAorICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgICAgICBRMTEsRDksRDBbMF0gICAgICAgICAgICAgICAgIAogICAgICAgICAgIFZNVUxMLlMxNiAgICAgICAgICAgICBRMTIsRDEwLEQxWzBdCiAgICAgICAgICAgVkVYVC44ICAgICAgICAgICAgICAgIFE0LFE0LFE1LCMyCiAgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFE5LEQxMCxEMlswXQogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTAsRDExLEQzWzBdCiAgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFExMSxEMTEsRDJbMF0KLSAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEyLEQxMixEM1swXQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTIsRDEyLEQzWzBdICAgIAogICAgICAgICAgIFZFWFQuOCAgICAgICAgICAgICAgICBRNSxRNSxRNiwjMgogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBROSxEMTIsRDRbMF0KICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEwLEQxMyxENVswXQpAQCAtMTE1LDE4ICsxMTUsMTggQEAKICAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEwLEQxNSxEN1swXQogICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTEsRDE1LEQ2WzBdCiAJICBWTUxBTC5TMTYgICAgICAgICAgICAgUTEyLEQxNixEN1swXQotCSAgVkVYVC44ICAJCVE3LFE3LFE4LCMyCisJICBWRVhULjggIAkJUTcsUTcsUTgsIzIgCiAKLQkgIFZNTEFMLlMxNiAJCVE5LEQ4LEQwWzFdCisJICBWTUxBTC5TMTYgCQlROSxEOCxEMFsxXSAgICAgICAgICAgICAgICAKIAkgIFZNTEFMLlMxNiAgICAgCVExMCxEOSxEMVsxXQotCSAgVkVYVC44IAkJUTgsUTgsUTE1LCMyCi0JICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbMV0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiAKKwkgIFZNTEFMLlMxNiAJCVExMSxEOSxEMFsxXSAgICAgICAgICAgICAgICAKIAkgIFZNTEFMLlMxNiAJCVExMixEMTAsRDFbMV0KIAkgIFZFWFQuOCAgCQlRNCxRNCxRNSwjMgogCSAgVk1MQUwuUzE2IAkJUTksRDEwLEQyWzFdCiAJICBWTUxBTC5TMTYgCQlRMTAsRDExLEQzWzFdCiAJICBWTUxBTC5TMTYgCQlRMTEsRDExLEQyWzFdCi0JICBWTUxBTC5TMTYgCQlRMTIsRDEyLEQzWzFdCisJICBWTUxBTC5TMTYgCQlRMTIsRDEyLEQzWzFdICAgIAogCSAgVkVYVC44ICAJCVE1LFE1LFE2LCMyCiAJICBWTUxBTC5TMTYgCQlROSxEMTIsRDRbMV0KIAkgIFZNTEFMLlMxNiAJCVExMCxEMTMsRDVbMV0KQEAgLTEzNywxOCArMTM3LDE4IEBACiAJICBWTUxBTC5TMTYgCQlRMTAsRDE1LEQ3WzFdCiAJICBWTUxBTC5TMTYgCQlRMTEsRDE1LEQ2WzFdCiAJICBWTUxBTC5TMTYgCQlRMTIsRDE2LEQ3WzFdCi0JICBWRVhULjggIAkJUTcsUTcsUTgsIzIKKwkgIFZFWFQuOCAgCQlRNyxRNyxROCwjMiAKIAotCSAgVk1MQUwuUzE2IAkJUTksRDgsRDBbMl0KKwkgIFZNTEFMLlMxNiAJCVE5LEQ4LEQwWzJdICAgICAgICAgICAKIAkgIFZNTEFMLlMxNiAJCVExMCxEOSxEMVsyXQotCSAgVkVYVC44IAkJUTgsUTgsUTE1LCMyCi0JICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbMl0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiAKKwkgIFZNTEFMLlMxNiAJCVExMSxEOSxEMFsyXSAgICAgICAgICAgCiAJICBWTUxBTC5TMTYgCQlRMTIsRDEwLEQxWzJdCiAJICBWRVhULjggIAkJUTQsUTQsUTUsIzIKIAkgIFZNTEFMLlMxNiAJCVE5LEQxMCxEMlsyXQogCSAgVk1MQUwuUzE2IAkJUTEwLEQxMSxEM1syXQogCSAgVk1MQUwuUzE2IAkJUTExLEQxMSxEMlsyXQotCSAgVk1MQUwuUzE2IAkJUTEyLEQxMixEM1syXQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxMixEM1syXSAgICAKIAkgIFZFWFQuOCAgCQlRNSxRNSxRNiwjMgogCSAgVk1MQUwuUzE2IAkJUTksRDEyLEQ0WzJdCiAJICBWTUxBTC5TMTYgCQlRMTAsRDEzLEQ1WzJdCkBAIC0xNTksMTggKzE1OSwxOCBAQAogCSAgVk1MQUwuUzE2IAkJUTEwLEQxNSxEN1syXQogCSAgVk1MQUwuUzE2IAkJUTExLEQxNSxENlsyXQogCSAgVk1MQUwuUzE2IAkJUTEyLEQxNixEN1syXQotCSAgVkVYVC44ICAJCVE3LFE3LFE4LCMyCisJICBWRVhULjggIAkJUTcsUTcsUTgsIzIgCiAKLQkgIFZNTEFMLlMxNiAJCVE5LEQ4LEQwWzNdCisJICBWTUxBTC5TMTYgCQlROSxEOCxEMFszXSAgICAgICAgICAgICAgCiAJICBWTUxBTC5TMTYgCQlRMTAsRDksRDFbM10KLQkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMgotCSAgVk1MQUwuUzE2IAkJUTExLEQ5LEQwWzNdCisJICBWRVhULjggCQlROCxROCxRMTUsIzIgCisJICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbM10gICAgICAgICAgICAgIAogCSAgVk1MQUwuUzE2IAkJUTEyLEQxMCxEMVszXQogCSAgVkVYVC44ICAJCVE0LFE0LFE1LCMyCiAJICBWTUxBTC5TMTYgCQlROSxEMTAsRDJbM10KIAkgIFZNTEFMLlMxNiAJCVExMCxEMTEsRDNbM10KIAkgIFZNTEFMLlMxNiAJCVExMSxEMTEsRDJbM10KLQkgIFZNTEFMLlMxNiAJCVExMixEMTIsRDNbM10KKwkgIFZNTEFMLlMxNiAJCVExMixEMTIsRDNbM10gICAgCiAJICBWRVhULjggIAkJUTUsUTUsUTYsIzIKIAkgIFZNTEFMLlMxNiAJCVE5LEQxMixENFszXQogCSAgVk1MQUwuUzE2IAkJUTEwLEQxMyxENVszXQpAQCAtMTgxLDEwICsxODEsMTAgQEAKIAkgIFZNTEFMLlMxNiAJCVExMCxEMTUsRDdbM10KIAkgIFZNTEFMLlMxNiAJCVExMSxEMTUsRDZbM10KIAkgIFZNTEFMLlMxNiAJCVExMixEMTYsRDdbM10KLQkgIFZFWFQuOCAJCVE3LFE3LFE4LCMyCisJICBWRVhULjggCQlRNyxRNyxROCwjMiAgICAgCiAKIAkgIFZNT1YuUzE2ICAJCUQ4LEQ5Ci0JICBWRVhULjggCQlROCxROCxRMTUsIzIKKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiAKIAkgIFZNT1YuUzE2ICAJCUQ5LEQxMAogCSAgVkFERC5TMzIgIAkJUTksUTksUTEwCiAJICBWTU9WLlMxNiAgCQlEMTAsRDExCkBAIC0yMTQsMTIgKzIxNCwxMiBAQAogCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtENCwgRDUsIEQ2fSwgW3IxXSEKIAkgIFZTVDEuUzE2ICAgICAgICAgICAgICBEN1swXSwgW3IxXSEKIAkgIFZTVDEuUzE2ICAgICAgICAgICAgICBEN1sxXSwgW3IxXSEKLQorICAgICAgICAgICAgICAgICAgICAKIEZpbHRfNmtfN2tfZW5kOgogCi0gICAgICAgICAgQUREICAgICAJCXIxMywgcjEzLCAjMjQwCi0gICAgICAgICAgTERNRkQgICAJCXIxMyEsIHtyMCAtIHIxMiwgcjE1fQotCisgICAgICAgICAgQUREICAgICAJCXIxMywgcjEzLCAjMjQwICAKKyAgICAgICAgICBMRE1GRCAgIAkJcjEzISwge3IwIC0gcjEyLCByMTV9IAorIAogTGFibGUxOgogICAgICAgICAgIC53b3JkICAgCQlmaXJfNmtfN2sKICAgICAgICAgICBARU5ERlVOQwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKaW5kZXggNDI2M2NkNC4uNjBlOWFkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zCkBAIC0zMyw3ICszMyw3IEBACiAKIAogCS5zZWN0aW9uICAudGV4dAotICAgICAgICAuZ2xvYmFsICAgIE5vcm1fY29ycl9hc20KKyAgICAgICAgLmdsb2JhbCAgICBOb3JtX2NvcnJfYXNtIAogICAgICAgICAuZXh0ZXJuICAgIENvbnZvbHZlX2FzbQogICAgICAgICAuZXh0ZXJuICAgIElzcXJ0X24KIEAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ3LDE3ICs0NywxNyBAQAogLmVxdSAgICBUX01JTiAgICAgICAgICAgICAsIDIxMgogLmVxdSAgICBUX01BWCAgICAgICAgICAgICAsIDIxNgogLmVxdSAgICBDT1JSX05PUk0gICAgICAgICAsIDIyMAotCisgICAgICAgICAgICAgICAgICAKIE5vcm1fY29ycl9hc206CiAKLSAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9CisgICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCiAgICAgICAgIFNVQiAgICAgICAgICAgIHIxMywgcjEzLCAjdm9TVEFDSwotCisgIAogICAgICAgICBBREQgICAgICAgICAgICByOCwgcjEzLCAjMjAgICAgICAgICAgICAgICAgIEBnZXQgdGhlIGV4Y2ZbTF9TVUJGUl0KICAgICAgICAgTERSICAgICAgICAgICAgcjQsIFtyMTMsICNUX01JTl0gICAgICAgICAgICBAZ2V0IHRfbWluCiAgICAgICAgIFJTQiAgICAgICAgICAgIHIxMSwgcjQsICMwICAgICAgICAgICAgICAgICAgQGsgPSAtdF9taW4KLSAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIwLCByMTEsIExTTCAjMSAgICAgICAgICBAZ2V0IHRoZSAmZXhjW2tdCi0KKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIwLCByMTEsIExTTCAjMSAgICAgICAgICBAZ2V0IHRoZSAmZXhjW2tdICAgCisgICAgICAgIAogICAgICAgICBAdHJhbnNmZXIgQ29udm9sdmUgZnVuY3Rpb24KICAgICAgICAgU1RNRkQgICAgICAgICAgc3AhLCB7cjAgLSByM30KICAgICAgICAgTU9WICAgICAgICAgICAgcjAsIHI1CkBAIC02OCw3ICs2OCw3IEBACiAKICAgICAgICAgQCByOCAtLS0gZXhjZltdCiAKLQlNT1YgICAgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MKKwlNT1YgICAgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIE1PViAgICAgICAgICAgIHI3LCAjMQogCVZMRDEuUzE2ICAgICAgIHtRMCwgUTF9LCBbcjE0XSEKIAlWTEQxLlMxNiAgICAgICB7UTIsIFEzfSwgW3IxNF0hCkBAIC05NSwzNCArOTUsMzQgQEAKICAgICAgICAgVlFBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMQogICAgICAgICBWTU9WLlMzMiAgICAgICByOSwgIEQyMFswXQogICAgICAgICBWTU9WLlMzMiAgICAgICByMTAsIEQyMFsxXQotICAgICAgICBRQUREICAgICAgICAgICByNiwgcjksIHIxMAorICAgICAgICBRQUREICAgICAgICAgICByNiwgcjksIHIxMCAKIAlRQUREICAgICAgICAgICByNiwgcjYsIHI2CiAgICAgICAgIFFBREQgICAgICAgICAgIHI5LCByNiwgcjcgICAgICAgICAgICAgICAgICAgQExfdG1wID0gKExfdG1wIDw8IDEpICsgMTsKIAlDTFogICAgICAgICAgICByNywgcjkKIAlTVUIgICAgICAgICAgICByNiwgcjcsICMxICAgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCiAgICAgICAgIFJTQiAgICAgICAgICAgIHI3LCByNiwgIzMyICAgICAgICAgICAgICAgICAgQGV4cCA9IDMyIC0gZXhwCi0JTU9WICAgICAgICAgICAgcjYsIHI3LCBBU1IgIzEKKwlNT1YgICAgICAgICAgICByNiwgcjcsIEFTUiAjMSAgICAgICAgIAogCVJTQiAgICAgICAgICAgIHI3LCByNiwgIzAgICAgICAgICAgICAgICAgICAgQHNjYWxlID0gLShleHAgPj4gMSkKLQorCQogICAgICAgICBAbG9vcCBmb3IgZXZlcnkgcG9zc2libGUgcGVyaW9kCiAJQGZvcih0ID0gdF9taW5AIHQgPD0gdF9tYXhAIHQrKykKIAlAcjcgLS0tIHNjYWxlIHI0IC0tLSB0X21pbiByOCAtLS0gZXhjZltdCiAKLUxPT1BGT1I6CitMT09QRk9SOgkKIAlBREQgICAgICAgICAgICByMTQsIHIxMywgIzIwICAgICAgICAgICAgICAgIEBjb3B5IG9mIGV4Y2ZbXQogCU1PViAgICAgICAgICAgIHIxMiwgcjEgICAgICAgICAgICAgICAgICAgICAgQGNvcHkgb2YgeG5bXQogCU1PViAgICAgICAgICAgIHI4LCAjMHg4MDAwCiAKICAgICAgICAgVkxEMS5TMTYgICAgICAge1EwLCBRMX0sIFtyMTRdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IGV4Y2ZbXQotICAgICAgICBWTEQxLlMxNiAgICAgICB7UTIsIFEzfSwgW3IxNF0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgZXhjZltdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRMiwgUTN9LCBbcjE0XSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiBleGNmW10gICAgICAgCiAgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRNCwgUTV9LCBbcjEyXSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiB4W10KIAlWTEQxLlMxNiAgICAgICB7UTYsIFE3fSwgW3IxMl0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgeFtdCiAgICAgICAgIFZNVUxMLlMxNiAgICBRMTAsIEQwLCBEMCAgICAgICAgICAgICAgICAgICAgICBATF90bXAxICs9IGV4Y2ZbXSAqIGV4Y2ZbXQotICAgICAgICBWTVVMTC5TMTYgICAgUTExLCBEMCwgRDggICAgICAgICAgICAgICAgICAgICAgQExfdG1wICArPSB4W10gKiBleGNmW10KKyAgICAgICAgVk1VTEwuUzE2ICAgIFExMSwgRDAsIEQ4ICAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCAgKz0geFtdICogZXhjZltdICAgICAgICAgICAgICAgICAgIAogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMSwgRDEKICAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDEsIEQ5CiAgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQyLCBEMgotICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMiwgRDEwCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQyLCBEMTAgICAgICAgIAogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMywgRDMKICAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDMsIEQxMQogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENCwgRDQKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMSwgRDEKICAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDEsIEQ5CiAgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQyLCBEMgotICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMiwgRDEwCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQyLCBEMTAgICAgICAgIAogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMywgRDMKICAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDMsIEQxMQogICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBENCwgRDQKQEAgLTE2MiwxOSArMTYyLDE5IEBACiAJVlBBREQuUzMyICAgICAgRDIyLCBEMjIsIEQyMiAgICAgICAgICAgICAgICAgICBARDIyWzBdIC0tLSBMX3RtcCA8PCAxCiAKIAlWTU9WLlMzMiAgICAgICByNiwgRDIwWzBdCi0gICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCBEMjJbMF0KKyAgICAgICAgVk1PVi5TMzIgICAgICAgcjUsIEQyMlswXQkKIAogCUByNSAtLS0gTF90bXAsIHI2IC0tLSBMX3RtcDEKIAlNT1YgICAgICAgICAgICByMTAsICMxCiAJQUREICAgICAgICAgICAgcjUsIHIxMCwgcjUsIExTTCAjMSAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCAxKSArIDEKIAlBREQgICAgICAgICAgICByNiwgcjEwLCByNiwgTFNMICMxICAgICAgICAgICAgICAgICAgICAgQExfdG1wMSA9IChMX3RtcDEgPDwgMSkgKyAxCi0KLQlDTFogICAgICAgICAgICByMTAsIHI1CisgCisJQ0xaICAgICAgICAgICAgcjEwLCByNSAgICAgICAgCiAJQ01QICAgICAgICAgICAgcjUsICMwCiAJUlNCTFQgICAgICAgICAgcjExLCByNSwgIzAKIAlDTFpMVCAgICAgICAgICByMTAsIHIxMQogCVNVQiAgICAgICAgICAgIHIxMCwgcjEwLCAjMSAgICAgICAgICAgICAgICAgQGV4cCA9IG5vcm1fbChMX3RtcCkKLQorICAgICAKIAlNT1YgICAgICAgICAgICByNSwgcjUsIExTTCByMTAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCBleHApCiAJUlNCICAgICAgICAgICAgcjEwLCByMTAsICMzMCAgICAgICAgICAgICAgICBAZXhwX2NvcnIgPSAzMCAtIGV4cAogCU1PViAgICAgICAgICAgIHIxMSwgcjUsIEFTUiAjMTYgICAgICAgICAgICAgQGNvcnIgPSBleHRyYWN0X2goTF90bXApCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlASXNxcnRfbigmTF90bXAsICZleHBfbm9ybSkKIAogCU1PViAgICAgICAgICAgIHIxNCwgcjAKLQlNT1YgICAgICAgICAgICByMTIsIHIxCisJTU9WICAgICAgICAgICAgcjEyLCByMSAKIAogICAgICAgICBTVE1GRCAgICAgICAgICBzcCEsIHtyMCAtIHI0LCByNyAtIHIxMiwgcjE0fQogCUFERCAgICAgICAgICAgIHIxLCBzcCwgIzQKQEAgLTIwOCw3ICsyMDgsNyBAQAogCU1PViAgICAgICAgICAgIHI2LCByNiwgQVNSICMxNiAgICAgICAgICAgICAgQG5vcm0gPSBleHRyYWN0X2goTF90bXApCiAJTVVMICAgICAgICAgICAgcjEyLCByNiwgcjExCiAJQUREICAgICAgICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgICBATF90bXAgPSB2b19MX211bHQoY29yciwgbm9ybSkKLQorICAKIAlBREQgICAgICAgICAgICByNiwgcjEwLCByNQogCUFERCAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICAgQGV4cF9jb3JyICsgZXhwX25vcm0gKyBzY2FsZQogCkBAIC0yMjcsOCArMjI3LDggQEAKIAogCUNNUCAgICAgICAgICAgIHI0LCByNgogCUJFUSAgICAgICAgICAgIE5vcm1fY29ycl9hc21fZW5kCi0KLQlBREQgICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgIEAgdF9taW4gKysKKyAKKwlBREQgICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgIEAgdF9taW4gKysgCiAJUlNCICAgICAgICAgICAgcjUsIHI0LCAjMCAgICAgICAgICAgICAgICAgICBAIGsKIAogCU1PViAgICAgICAgICAgIHI2LCAjNjMgICAgICAgICAgICAgICAgICAgICAgQCBpID0gNjMKQEAgLTI1NSwxNiArMjU1LDE2IEBACiAJTVVMICAgICAgICAgICAgcjE0LCByMTEsIHI4CiAgICAgICAgIExEUiAgICAgICAgICAgIHI2LCBbcjEzLCAjVF9NQVhdICAgICAgICAgICAgQCBnZXQgdF9tYXgKIAlNT1YgICAgICAgICAgICByOCwgcjE0LCBBU1IgIzE1Ci0JU1RSSCAgICAgICAgICAgcjgsIFtyMTBdCisJU1RSSCAgICAgICAgICAgcjgsIFtyMTBdICAgICAgICAgICAgICAgICAgICAKIAogCUNNUCAgICAgICAgICAgIHI0LCByNgogCUJMRSAgICAgICAgICAgIExPT1BGT1IKIAotTm9ybV9jb3JyX2FzbV9lbmQ6Ci0KLSAgICAgICAgQUREICAgICAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLCitOb3JtX2NvcnJfYXNtX2VuZDogCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICByMTMsIHIxMywgI3ZvU1RBQ0sgICAgICAKICAgICAgICAgTERNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9Ci0KKyAgICAKICAgICAgICAgLkVORAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucwppbmRleCBlNzg2ZGRlLi4xZTY1ZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvU3luX2ZpbHRfMzJfbmVvbi5zCkBAIC0zMywxMiArMzMsMTIgQEAKIEAgc2lnX2xvW10gLS0tIHI1CiBAIGxnICAgICAgIC0tLSByNgogCi0gICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0IAogICAgICAgICAgIC5nbG9iYWwgICBTeW5fZmlsdF8zMl9hc20KIAogU3luX2ZpbHRfMzJfYXNtOgogCi0gICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9CisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IAogICAgICAgICAgIExEUiAgICAgICAgICAgcjQsICBbcjEzLCAjNDBdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2hpW10gYWRkcmVzcwogICAgICAgICAgIExEUiAgICAgICAgICAgcjUsICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2xvW10gYWRkcmVzcwogCkBAIC00OSw4ICs0OSw4IEBACiAJICBTVUIgICAgICAgICAgIHIxMCwgcjQsICMzMiAgICAgICAgICAgICAgICAgICAgIEAgc2lnX2hpWy0xNl0gYWRkcmVzcwogCSAgU1VCICAgICAgICAgICByMTEsIHI1LCAjMzIgICAgICAgICAgICAgICAgICAgICBAIHNpZ19sb1stMTZdIGFkZHJlc3MKIAotCSAgVkxEMS5TMTYgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjBdISAgICAgICAgICBAYVsxXSB+IGFbMTZdCi0KKwkgIFZMRDEuUzE2ICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IwXSEgICAgICAgICAgQGFbMV0gfiBhWzE2XSAKKyAgCiAgICAgICAgICAgTU9WICAgICAgICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwCiAKIAkgIFZMRDEuUzE2ICAgICAge0Q0LCBENSwgRDYsIEQ3fSwgW3IxMF0hICAgICAgICAgQCBzaWdfaGlbLTE2XSB+IHNpZ19oaVstMV0KQEAgLTU4LDkgKzU4LDkgQEAKICAgICAgICAgICBWUkVWNjQuMTYgICAgIEQxLCBEMQogCSAgVkxEMS5TMTYgICAgICB7RDgsIEQ5LCBEMTAsIEQxMX0sIFtyMTFdISAgICAgICBAIHNpZ19sb1stMTZdIH4gc2lnX2xvWy0xXQogICAgICAgICAgIFZSRVY2NC4xNiAgICAgRDIsIEQyCi0gICAgICAgICAgVlJFVjY0LjE2ICAgICBEMywgRDMKKyAgICAgICAgICBWUkVWNjQuMTYgICAgIEQzLCBEMwkKICAgICAgICAgICBWRFVQLlMzMiAgICAgIFExNSwgcjgKLQorICAgICAgICAgICAgICAKIFNZTl9MT09QOgogCiAgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICBAZXhjW2ldCkBAIC03MywxMiArNzMsMTIgQEAKIAogCSAgVkVYVC44ICAgICAgICBEOSwgRDksIEQxMCwgIzIKIAkgIFZFWFQuOCAgICAgICAgRDEwLCBEMTAsIEQxMSwgIzIKLQorCSAgCiAJICBWUEFERC5TMzIgICAgIEQyOCwgRDIwLCBEMjEKICAgICAgICAgICBNVUwgICAgICAgICAgIHIxMiwgcjYsIHIzICAgICAgICAgICAgICAgICAgICAgIEBleGNbaV0gKiBhMAogCSAgVlBBREQuUzMyICAgICBEMjksIEQyOCwgRDI4CiAJICBWRFVQLlMzMiAgICAgIFExMCwgRDI5WzBdICAgICAgICAgICAgICAgICAgICAgIEByZXN1bHQxCi0KKyAgICAgICAgICAKIAkgIFZNVUxMLlMxNiAgICAgUTExLCBENCwgRDMKIAkgIFZNTEFMLlMxNiAgICAgUTExLCBENSwgRDIKICAgICAgICAgICBWU1VCLlMzMiAgICAgIFExMCwgUTE1LCBRMTAKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAJICBWU0hSLlMzMiAgICAgIFExMCwgUTEwLCAjMTEgICAgICAgICAgICAgICAgICAgIEByZXN1bHQxID4+PSAxMQogCSAgVlNITC5TMzIgICAgICBRMTEsIFExMSwgIzEgICAgICAgICAgICAgICAgICAgICBAcmVzdWx0MiA8PD0gMQotCSAgVkRVUC5TMzIgICAgICBRMTIsIHIxNAorCSAgVkRVUC5TMzIgICAgICBRMTIsIHIxNCAgICAgICAgICAgICAgICAgICAgICAgICAKIAkgIFZBREQuUzMyICAgICAgUTEyLCBRMTIsIFExMCAgICAgICAgICAgICAgICAgICAgQExfdG1wID0gTF90bXAgLSAocmVzdWx0MSA+Pj0gMTEpIC0gKHJlc3VsdDIgPDw9IDEpCiAJICBWU1VCLlMzMiAgICAgIFExMiwgUTEyLCBRMTEKIApAQCAtMTIyLDEyICsxMjIsMTIgQEAKIAkgIFNUUkggICAgICAgICAgcjEyLCBbcjVdLCAjMiAgICAgICAgICAgICAgICAgICAgQHN0cm9lIHNpZ19sb1tpXQogCiAgICAgICAgICAgQ01QICAgICAgICAgICByOCwgIzY0Ci0gICAgICAgICAgQkxUICAgICAgICAgICBTWU5fTE9PUAotCisgICAgICAgICAgQkxUICAgICAgICAgICBTWU5fTE9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKIFN5bl9maWx0XzMyX2VuZDoKLQotICAgICAgICAgIExETUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KKwkJICAgICAKKyAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9IAogICAgICAgICAgIEBFTkRGVU5DCiAgICAgICAgICAgLkVORAotCisgCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwppbmRleCA4ZWZhOWZiLi4xODllMzNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zCkBAIC0yMCwyMiArMjAsMjIgQEAKIEAqICAgIFdvcmQxNiB5W10sICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIEAqICAgIFdvcmQxNiBMICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIEAqKQotQAorQCAKIEAgcjAgLS0tIHhbXQogQCByMSAtLS0gaFtdCiBAIHIyIC0tLSB5W10KIEAgcjMgLS0tIEwKIAotCS5zZWN0aW9uICAudGV4dAotICAgICAgICAuZ2xvYmFsICAgQ29udm9sdmVfYXNtCisJLnNlY3Rpb24gIC50ZXh0IAorICAgICAgICAuZ2xvYmFsICAgQ29udm9sdmVfYXNtIAogCiBDb252b2x2ZV9hc206CiAKLSAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9Ci0gICAgICAgIE1PViAgICAgICAgICAgIHIzLCAgIzAKKyAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9ICAKKyAgICAgICAgTU9WICAgICAgICAgICAgcjMsICAjMCAgICAgICAgICAgICAgICAgICAgICAgIAogCU1PViAgICAgICAgICAgIHIxMSwgIzB4ODAwMAotCi1MT09QOgorICAgICAgICAKK0xPT1A6IAogICAgICAgICBATU9WICAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcyA9IDAKICAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxICAgICAgICAgICAgICAgIEAgdG1wSCBhZGRyZXNzCiAgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSBuICsgMQpAQCAtNDMsMjEgKzQzLDIxIEBACiAgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKICAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdICAgICAgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQogICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMxCi0gICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAKLSAgICAgICAgTVVMICAgICAgICAgICAgcjgsICByOSwgcjEwCisgICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAgCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCAgcjksIHIxMCAKIAotTE9PUDE6CitMT09QMTogICAgICAgICAgICAgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKICAgICAgICAgQkxFICAgICAgICAgICAgTDEKICAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAogICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAogICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKICAgICAgICAgVlJFVjY0LjE2ICAgICAgRDEsIEQxCi0gICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQKLSAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEKLSAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDEKLUwxOgorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0ICAKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDEgICAgCitMMTogICAgICAgICAgICAgICAgICAKICAgICAgICAgVkFERC5TMzIgICAgICAgRDIwLCBEMjAsIEQyMQogICAgICAgICBWUEFERC5TMzIgICAgICBEMjAsIEQyMCwgRDIwCiAgICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCBEMjBbMF0KQEAgLTczLDI1ICs3MywyNSBAQAogICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxCiAgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAogICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCi0gICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIExEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIKICAgICAgICAgTERSU0ggICAgICAgICAgcjE0LCBbcjRdCiAKICAgICAgICAgTVVMICAgICAgICAgICAgcjgsIHI5LCByMTAKICAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMgogICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4Ci0KKyAgICAgICAgCiAgICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAKIExPT1AyOgogICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKICAgICAgICAgQkxFICAgICAgICAgICAgTDIKICAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAogICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAogICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKICAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNAogICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKLSAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgCiAgICAgICAgIEIgICAgICAgICAgICAgIExPT1AyCiBMMjoKICAgICAgICAgVkFERC5TMzIgICAgICAgRDIwLCBEMjAsIEQyMQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIEFERCAgICAgICAgICAgIHI4LCByOCwgcjUKICAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQogICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQotICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEgIAogICAgICAgICBTVFJIICAgICAgICAgICByOCwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KIAogCkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgTVVMICAgICAgICAgICAgcjgsIHI5LCByMTAKICAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMgogICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0KLSAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4IAogICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMzCiAgICAgICAgIE1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAogCkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogICAgICAgICBCTEUgICAgICAgICAgICBMMwogICAgICAgICBTVUIgICAgICAgICAgICByNCwgcjQsICM4CiAgICAgICAgIE1PViAgICAgICAgICAgIHI5LCByNAotICAgICAgICBWTEQxLlMxNiAgICAgICBEMCwgW3I2XSEKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hICAgCiAgICAgICAgIFZMRDEuUzE2ICAgICAgIEQxLCBbcjldIQogICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKICAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNAotICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQwLCBEMQotICAgICAgICBCICAgICAgICAgICAgICBMT09QMworICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQwLCBEMSAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDMgICAKIAogTDM6CiAgICAgICAgIFZBREQuUzMyICAgICAgIEQyMCwgRDIwLCBEMjEKQEAgLTE0NiwxOCArMTQ2LDE4IEBACiAgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjUsIExTTCAjMSAgICAgICAgICAgICAgICBAIHRtcEggYWRkcmVzcwogICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKICAgICAgICAgVk1PVi5TMzIgICAgICAgUTEwLCAjMAotTE9PUDQ6CitMT09QNDogICAgICAgICAgICAgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKICAgICAgICAgQkxFICAgICAgICAgICAgTDQKICAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAogICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAogICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKICAgICAgICAgVlJFVjY0LjE2ICAgICAgRDEsIEQxCi0gICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQKLSAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEKLSAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDQKLUw0OgorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0ICAKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDQgICAgCitMNDogICAgICAgICAgICAgICAgICAKICAgICAgICAgVkFERC5TMzIgICAgICAgRDIwLCBEMjAsIEQyMQogICAgICAgICBWUEFERC5TMzIgICAgICBEMjAsIEQyMCwgRDIwCiAgICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCAgRDIwWzBdCkBAIC0xNjUsMTQgKzE2NSwxNCBAQAogICAgICAgICBNT1YgICAgICAgICAgICByNSwgcjUsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQogICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCiAgICAgICAgIFNUUkggICAgICAgICAgIHI1LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQotCisgICAgICAgIAogICAgICAgICBDTVAgICAgICAgICAgICByMywgIzY0CiAgICAgICAgIEJMVCAgICAgICAgICAgIExPT1AKLQotQ29udm9sdmVfYXNtX2VuZDoKLQorICAgICAgICAgICAgICAgIAorQ29udm9sdmVfYXNtX2VuZDogCisgCiAgICAgICAgIExETUZEICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9Ci0KKyAgICAKICAgICAgICAgQEVOREZVTkMKICAgICAgICAgLkVORAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucwppbmRleCA4OTA0Mjg5Li5jMzE0YTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMKQEAgLTMxLDcgKzMxLDcgQEAKIEByNSAtLS0tIGNvcl8xW10KIEByNiAtLS0tIGNvcl8yW10KIAotICAgICAgICAgICAgICAuc2VjdGlvbiAudGV4dAorICAgICAgICAgICAgICAuc2VjdGlvbiAudGV4dCAKIAkgICAgICAuZ2xvYmFsICBjb3JfaF92ZWNfMDEyX2FzbQogCiBjb3JfaF92ZWNfMDEyX2FzbToKQEAgLTUyLDEyICs1MiwxMiBAQAogCSAgICAgUlNCICAgICAgICAgICByMTEsIHIyLCAjNjIgICAgICAgICAgICAgICAgICAgICAgQGo9NjItcG9zCiAKIExPT1BqMToKLQkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIKKwkgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgIAogCSAgICAgTERSU0ggICAgICAgICByOCwgIFtyOV0sICMyCiAJICAgICBMRFJTSCAgICAgICAgIHIxNCwgW3I5XQogCSAgICAgU1VCUyAgICAgICAgICByMTEsIHIxMSwgIzEKICAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHI4LCByNQotICAgICAgICAgICAgIE1MQSAgICAgICAgICAgcjYsIHIxMiwgcjE0LCByNgorICAgICAgICAgICAgIE1MQSAgICAgICAgICAgcjYsIHIxMiwgcjE0LCByNgkgCiAJICAgICBCR0UgICAgICAgICAgIExPT1BqMQogCiAJICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICAgICAgICAgICAgICAgICAgICAgQCpwMSsrCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByMTQsIHI1CiAgICAgICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDAKICAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByNSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IChMX3N1bTEgPDwgMikKLSAgICAgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNAorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICAgCiAgICAgICAgICAgICAgQUREICAgICAgICAgICByOSwgcjUsIHIxNAogICAgICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI5LCBBU1IgIzE2CiAgICAgICAgICAgICAgTU9WICAgICAgICAgICByNiwgcjEwLCBBU1IgIzE2CkBAIC03Nyw3ICs3Nyw3IEBACiAJICAgICBNVUwgICAgICAgICAgIHIxNCwgcjYsIHIxMQogCSAgICAgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1CiAJICAgICBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUKLQkgICAgIExEUiAgICAgICAgICAgcjksICBbcjEzLCAjNDRdCisJICAgICBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICAKIAkgICAgIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdCiAgICAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKwogCSAgICAgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKwpAQCAtODksNyArODksNyBAQAogCSAgICAgU1RSSCAgICAgICAgICByNiwgW3IxMl0KIAogICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjIsIHIyLCAjNAotCisgCiAgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IDAKIAkgICAgIE1PViAgICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTIgPSAwCiAJICAgICBBREQgICAgICAgICAgIHI5LCByMSwgcjIsIExTTCAjMSAgICAgICAgICAgICAgICBAcDIgPSAmdmVjW3Bvc10KQEAgLTk4LDEyICs5OCwxMiBAQAogCSAgICAgQUREICAgICAgICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgICAgICAgQGkrKwogCiBMT09QajI6Ci0JICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyCisJICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICAKIAkgICAgIExEUlNIICAgICAgICAgcjgsICBbcjldLCAjMgogCSAgICAgTERSU0ggICAgICAgICByMTQsIFtyOV0KIAkgICAgIFNVQlMgICAgICAgICAgcjExLCByMTEsICMxCiAgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByOCwgcjUKLSAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYKKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIAogCSAgICAgQkdFICAgICAgICAgICBMT09QajIKIAogCSAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAqcDErKwpAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByMTQsIHI1CiAgICAgICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDAKICAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByNSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IChMX3N1bTEgPDwgMikKLSAgICAgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNAorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICAKICAgICAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByNSwgcjE0CiAKICAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByOSwgQVNSICMxNgpAQCAtMTI0LDcgKzEyNCw3IEBACiAJICAgICBNVUwgICAgICAgICAgIHIxNCwgcjYsIHIxMQogCSAgICAgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1CiAJICAgICBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUKLQkgICAgIExEUiAgICAgICAgICAgcjksICBbcjEzLCAjNDRdCisJICAgICBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICAKIAkgICAgIExEUiAgICAgICAgICAgcjEyLCBbcjEzLCAjNDhdCiAgICAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKwogCSAgICAgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKwpAQCAtMTM3LDE1ICsxMzcsMTUgQEAKIAkgICAgIEFERCAgICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAaSsxCiAJICAgICBBREQgICAgICAgICAgIHIyLCByMiwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgQHBvcyArPSBTVEVQCiAJICAgICBDTVAgICAgICAgICAgIHI0LCAjMTYKLQorCSAgICAgCiAJICAgICBCTFQgICAgICAgICAgIExPT1BpCi0KKyAgICAgICAgIAogdGhlX2VuZDoKICAgICAgICAgICAgICBMRE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQotCi0JICAgICAuRU5ECi0KLQotCisgICAgICAgICAgICAgCisJICAgICAuRU5ECSAKKyAgICAgICAgCisJCisJICAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCmluZGV4IDZiNzgyY2IuLmRmZmI3NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCkBAIC0yNSwxNCArMjUsMTQgQEAKIEAgcjEgICAgLS0tICBUMAogQCByMiAgICAtLS0gIGZyYWMKIEAgcjMgICAgLS0tICBMX3N1YmZyCi0KLSAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKKyAKKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQgCiAgICAgICAgICAgLmdsb2JhbCAgIHByZWRfbHQ0X2FzbQogICAgICAgICAgIC5leHRlcm4gICBpbnRlcjRfMgogCiBwcmVkX2x0NF9hc206CiAKLSAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gCiAgICAgICAgICAgU1VCICAgICAgICAgICByNCwgcjAsIHIxLCBMU0wgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIHggPSBleGMgLSBUMAogICAgICAgICAgIFJTQiAgICAgICAgICAgcjIsIHIyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmcmFjID0gLSBmcmFjCiAgICAgICAgICAgU1VCICAgICAgICAgICByNCwgcjQsICMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHggLT0gTF9JTlRFUlBPTDIgLSAxCkBAIC00Nyw4ICs0Nyw4IEBACiAKIAkgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyMTFdIQogCSAgVkxEMS5TMTYgICAgICB7UTIsIFEzfSwgW3IxMV0hCi0KLQkgIE1PViAgICAgICAgICAgcjYsICMweDgwMDAKKyAgICAgICAgICAKKwkgIE1PViAgICAgICAgICAgcjYsICMweDgwMDAgCiAKICAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRNCwgUTV9LCBbcjRdISAgICAgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIDE2IHhbXQogICAgICAgICAgIFZMRDEuUzE2ICAgICAge1E2LCBRN30sIFtyNF0hICAgICAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgMTYgeFtdCkBAIC01OCwxNCArNTgsMTQgQEAKICAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDksIEQxCiAgICAgICAgICAgVlFETUxBTC5TMTYgICBRMTUsIEQxMCwgRDIKICAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDExLCBEMwotCisgICAgICAgIAogICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTIsIEQ0CiAgICAgICAgICAgVlFETUxBTC5TMTYgICBRMTUsIEQxMywgRDUKICAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDE0LCBENgogICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTUsIEQ3CiAKLSAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3I0XSwgIzIKLQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjRdLCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAKICAgICAgICAgICBWRVhULlMxNiAgICAgIEQ4LCBEOCwgRDksICMxCiAgICAgICAgICAgVkVYVC5TMTYgICAgICBEOSwgRDksIEQxMCwgIzEKICAgICAgICAgICBWRVhULlMxNiAgICAgIEQxMCwgRDEwLCBEMTEsICMxCkBAIC03MywyNiArNzMsMjYgQEAKICAgICAgICAgICBWRFVQLlMxNiAgICAgIEQyNCwgcjEyCiAgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTIsIEQxMiwgRDEzLCAjMQogICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDEzLCBEMTMsIEQxNCwgIzEKLQorICAgICAKICAgICAgICAgICBWUUFERC5TMzIgICAgIEQzMCwgRDMwLCBEMzEKLQkgIE1PViAgICAgICAgICAgcjExLCAjMHg4MDAwCisJICBNT1YgICAgICAgICAgIHIxMSwgIzB4ODAwMCAgICAgICAgICAKICAgICAgICAgICBWUEFERC5TMzIgICAgIEQzMCwgRDMwLCBEMzAKICAgICAgICAgICBBREQgICAgICAgICAgIHI4LCByOCwgIzEKICAgICAgICAgICBWTU9WLlMzMiAgICAgIHIxMiwgRDMwWzBdCi0gICAgICAgICAgVkVYVC5TMTYgICAgICBEMTQsIEQxNCwgRDE1LCAjMQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDE0LCBEMTQsIEQxNSwgIzEgICAgICAgICAgCiAKICAgICAgICAgICBRQUREICAgICAgICAgIHIxLCByMTIsIHIxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgTF9zdW0gPSAoTF9zdW0gPDwgMikKICAgICAgICAgICBWRVhULlMxNiAgICAgIEQxNSwgRDE1LCBEMjQsICMxCi0gICAgICAgICAgUUFERCAgICAgICAgICByNSwgcjEsIHI2CisgICAgICAgICAgUUFERCAgICAgICAgICByNSwgcjEsIHI2ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE1PViAgICAgICAgICAgcjEsIHI1LCBBU1IgIzE2CiAgICAgICAgICAgQ01QICAgICAgICAgICByOCwgcjMKICAgICAgICAgICBTVFJIICAgICAgICAgIHIxLCBbcjBdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZXhjW2pdID0gKExfc3VtICsgMHg4MDAwKSA+PiAxNgogICAgICAgICAgIEJMVCAgICAgICAgICAgTE9PUAotCisgICAgICAgICAgICAgICAgICAgIAogcHJlZF9sdDRfZW5kOgotCi0gICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9Ci0KKwkJICAgICAKKyAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gCisgCiBMYWJsZTE6CiAgICAgICAgICAgLndvcmQgICAJaW50ZXI0XzIKICAgICAgICAgICBARU5ERlVOQwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwppbmRleCAzOTRmYTgzLi5iOWU2YjIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwpAQCAtMjYsMTcgKzI2LDE3IEBACiBAbGcgICAgICAgICBSTiAgICAgcjMKIAogCS5zZWN0aW9uICAgLnRleHQKLSAgICAgICAgLmdsb2JhbCAgICBSZXNpZHVfb3B0CisgICAgICAgIC5nbG9iYWwgICAgUmVzaWR1X29wdCAKIAogUmVzaWR1X29wdDoKIAotICAgICAgICBTVE1GRCAgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0KKyAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9IAogICAgICAgICBTVUIgICAgICAgICAgICByNywgcjMsICM0ICAgICAgICAgICAgICAgICAgICAgICBAaSA9IGxnIC0gNAotCi0gICAgICAgIFZMRDEuUzE2ICAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hICAgICAgICAgICAgICBAZ2V0IGFsbCBhW10KKyAgICAgICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hICAgICAgICAgICAgICBAZ2V0IGFsbCBhW10gIAogCVZMRDEuUzE2ICAgICAgIHtENH0sIFtyMF0hCiAgICAgICAgIFZNT1YuUzMyICAgICAgIFE4LCAgIzB4ODAwMAotCisgICAgICAgIAogTE9PUDE6CiAgICAgICAgIEFERCAgICAgICAgICAgIHI5LCByMSwgcjcsIExTTCAjMSAgICAgICAgICAgICAgIEBjb3B5IHRoZSBhZGRyZXNzCiAgICAgICAgIEFERCAgICAgICAgICAgIHIxMCwgcjIsIHI3LCBMU0wgIzEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgVlFETVVMTC5TMTYgICAgUTEwLCBENSwgRDBbMF0gICAgICAgICAgICAgICAgICBAZmluaXNoIHRoZSBmaXJzdCBMX211bHQKIAogICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMyICAgICAgICAgICAgICAgICAgICAgICBAZ2V0IHRoZSB4W2ktMV0gYWRkcmVzcwotICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hIAogICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMFsxXQogCiAgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMl0gYWRkcmVzcwpAQCAtNTMsMzYgKzUzLDM2IEBACiAgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQwWzJdCiAKICAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjNiAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0zXSBhZGRyZXNzCi0gICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQotICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMFszXQorICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMFszXSAgICAgICAgICAgICAgICAgICAgCiAKICAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjOCAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS00XSBhZGRyZXNzCi0gICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQotICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVswXQorICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVswXSAgCiAKICAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjMTAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS01XSBhZGRyZXNzCi0gICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQotICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVsxXQorICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVsxXSAKIAogICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxMiAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTZdIGFkZHJlc3MKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCi0gICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzJdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzJdICAKIAogICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxNCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTddIGFkZHJlc3MKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCi0gICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzNdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQxWzNdICAKIAogICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxNiAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLThdIGFkZHJlc3MKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCi0gICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzBdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzBdICAKIAogICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxOCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTldIGFkZHJlc3MKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCi0gICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzFdCi0KKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDJbMV0gICAgICAgICAKKyAgICAgICAgICAgCiAgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzIwICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTBdIGFkZHJlc3MKLSAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCi0gICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzJdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzJdICAKIAogCVNVQiAgICAgICAgICAgIHI4LCByOSwgIzIyICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTFdIGFkZHJlc3MKIAlWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKQEAgLTExNywxMCArMTE3LDEwIEBACiAKICAgICAgICAgQkdFICAgICAgICAgICAgTE9PUDEKIAotUmVzaWR1X2FzbV9lbmQ6Ci0KK1Jlc2lkdV9hc21fZW5kOiAKKyAKICAgICAgICAgTERNRkQgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KLQorICAgIAogICAgICAgICBARU5ERlVOQwogICAgICAgICAuRU5ECiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zCmluZGV4IGU0NWRhYWMuLmJiZDM1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucwpAQCAtMTMsNyArMTMsNyBAQAogQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogQCAqLwotQAorQCAgICAgICAgICAgICAgICAgICAKIEAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogQHZvaWQgU2NhbGVfc2lnKAogQCAgICAgICAgICAgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBzaWduYWwgdG8gc2NhbGUgICAgICAgICAgICAgICAqLwpAQCAtMjUsMTYgKzI1LDE2IEBACiBAICBsZyAgICAtLS0gIHIxCiBAICBleHAgICAtLS0gIHIyCiAKLSAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQgCiAgICAgICAgICAgLmdsb2JhbCAgIFNjYWxlX3NpZ19vcHQKIAogU2NhbGVfc2lnX29wdDoKIAotICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fQorICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSAKICAgICAgICAgICBNT1YgICAgICAgICAgIHI0LCAjNAotICAgICAgICAgIFZNT1YuUzMyICAgICAgUTE1LCAjMHg4MDAwCi0gICAgICAgICAgVkRVUC5TMzIgICAgICBRMTQsIHIyCi0gICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSB4W10gYWRkcmVzcworICAgICAgICAgIFZNT1YuUzMyICAgICAgUTE1LCAjMHg4MDAwICAgICAgIAorICAgICAgICAgIFZEVVAuUzMyICAgICAgUTE0LCByMiAgCisgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSB4W10gYWRkcmVzcyAgICAKICAgICAgICAgICBDTVAgICAgICAgICAgIHIxLCAjNjQKICAgICAgICAgICBNT1ZFUSAgICAgICAgIHI0LCAjMQogICAgICAgICAgIEJFUSAgICAgICAgICAgTE9PUApAQCAtNDgsNyArNDgsNyBAQAogCSAgQkVRICAgICAgICAgICBMT09QMQogCiBMT09QMToKLSAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRMCwgUTF9LCBbcjVdISAgICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdICAgICAKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDAsICMxNgogICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEMSwgIzE2CiAgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTIsIEQyLCAjMTYKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICBWQURESE4uUzMyICAgIEQxOSwgUTEzLCBRMTUKICAgICAgICAgICBWU1QxLlMxNiAgICAgIHtROCwgUTl9LCBbcjBdISAgICAgICAgICAgICAgICAgQHN0b3JlIDE2IFdvcmQxNiB4W10KIAotTE9PUDoKK0xPT1A6ICAgICAgICAgICAgICAgIAogICAgICAgICAgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdCiAgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTIsIFEzfSwgW3I1XSEgICAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10KICAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRNCwgUTV9LCBbcjVdISAgICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgIFZTSExMLlMxNiAgICAgUTgsIEQwLCAjMTYKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFE5LCBEMSwgIzE2CiAgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTAsIEQyLCAjMTYKLSAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMSwgRDMsICMxNgorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEMywgIzE2ICAgICAKICAgICAgICAgICBWU0hMLlMzMiAgICAgIFE4LCBROCwgUTE0CiAgICAgICAgICAgVlNITC5TMzIgICAgICBROSwgUTksIFExNAogICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEwLCBRMTAsIFExNApAQCAtODMsNyArODMsNyBAQAogICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTEsIFExNQogICAgICAgICAgIFZTVDEuUzE2ICAgICAge1E4LCBROX0sIFtyMF0hICAgICAgICAgICAgICAgICBAc3RvcmUgMTYgV29yZDE2IHhbXQogCi0KKyAgIAogICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEyLCBENCwgIzE2CiAgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTMsIEQ1LCAjMTYKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDYsICMxNgpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTksIFExMywgUTE1CiAgICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdCiAKLSAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDEyLCAjMTYKKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDEyLCAjMTYgICAKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMSwgRDEzLCAjMTYKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMiwgRDE0LCAjMTYKICAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMywgRDE1LCAjMTYKQEAgLTEyMywxNiArMTIzLDE2IEBACiAgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTYsIFExMCwgUTE1CiAgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTcsIFExMSwgUTE1CiAgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMiwgUTE1Ci0gICAgICAgICAgVkFEREhOLlMzMiAgICBEMTksIFExMywgUTE1Ci0gICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTksIFExMywgUTE1IAorICAgICAgICAgIFZTVDEuUzE2ICAgICAge1E4LCBROX0sIFtyMF0hICAgICAgICAgICAgICAgICBAc3RvcmUgMTYgV29yZDE2IHhbXSAgCiAgICAgICAgICAgU1VCUyAgICAgICAgICByNCwgcjQsICMxCi0gICAgICAgICAgQkdUICAgICAgICAgICBMT09QCi0KLQorICAgICAgICAgIEJHVCAgICAgICAgICAgTE9PUCAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAogU2NhbGVfc2lnX2FzbV9lbmQ6CiAKLSAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0KKyAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gCiAgICAgICAgICAgQEVOREZVTkMKICAgICAgICAgICAuRU5ECi0KKyAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc3luX2ZpbHRfbmVvbi5zCmluZGV4IDU3MzFiZGIuLmRiNDU1OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKQEAgLTI3LDIxICsyNywyMSBAQAogQCBtZW1bXSAgLS0tICAgcjMKIEAgbSAtLS0gIDE2ICBsZyAtLS0gODAgIHVwZGF0ZSAtLS0gMQogCi0gICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0IAogICAgICAgICAgIC5nbG9iYWwgICBTeW5fZmlsdF9hc20KIAogU3luX2ZpbHRfYXNtOgogCi0gICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9CisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IAogICAgICAgICAgIFNVQiAgICAgICAgICAgcjEzLCByMTMsICM3MDAgICAgICAgICAgICAgICAgICAgQCB5X2J1ZltMX0ZSQU1FMTZrICsgTTE2a10KLQorICAgCiAgICAgICAgICAgTU9WICAgICAgICAgICByNCwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbWVtW10gYWRkcmVzcwogICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHIxMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IHl5ID0geV9idWYgYWRkcmVzcwogCiAgICAgICAgICAgQCBmb3IoaSA9IDBAIGkgPCBtQCBpKyspCiAgICAgICAgICAgQHsKICAgICAgICAgICBAICAgICp5eSsrID0gbWVtW2ldQAotICAgICAgICAgIEB9CisgICAgICAgICAgQH0gCiAgICAgICAgICAgVkxEMS5TMTYgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjRdISAgICAgICAgICBAbG9hZCAxNiBtZW1zCiAJICBWU1QxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyNV0hICAgICAgICAgIEBzdG9yZSAxNiBtZW1bXSB0byAqeXkKIApAQCAtNTQsNyArNTQsNyBAQAogCSAgVlJFVjY0LjE2ICAgICBEMCwgRDAKIAkgIFZSRVY2NC4xNiAgICAgRDEsIEQxCiAJICBWUkVWNjQuMTYgICAgIEQyLCBEMgotCSAgVlJFVjY0LjE2ICAgICBEMywgRDMKKwkgIFZSRVY2NC4xNiAgICAgRDMsIEQzIAogCSAgTU9WICAgICAgICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvb3AgdGltZXMKIAkgIE1PViAgICAgICAgICAgcjEwLCByMTMgICAgICAgICAgICAgICAgICAgICAgICAgQCB0ZW1wID0geV9idWYKIAkgIEFERCAgICAgICAgICAgcjQsIHIxMywgIzMyICAgICAgICAgICAgICAgICAgICAgQCB5eVtpXSBhZGRyZXNzCkBAIC02OCw3ICs2OCw3IEBACiAJICBBREQgICAgICAgICAgIHIxMCwgcjQsIHI4LCBMU0wgIzEgICAgICAgICAgICAgIEAgeVtpXSwgeXlbaV0gYWRkcmVzcwogCiAJICBWRFVQLlMzMiAgICAgIFExMCwgcjEyCi0JICBWTVVMTC5TMTYgICAgIFE1LCBEMywgRDQKKwkgIFZNVUxMLlMxNiAgICAgUTUsIEQzLCBENCAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgVk1MQUwuUzE2ICAgICBRNSwgRDIsIEQ1CiAgICAgICAgICAgVk1MQUwuUzE2ICAgICBRNSwgRDEsIEQ2CiAgICAgICAgICAgVk1MQUwuUzE2ICAgICBRNSwgRDAsIEQ3CkBAIC04MiwyNSArODIsMjUgQEAKIAkgIFZEVVAuUzMyICAgICAgUTcsIEQxMFswXQogCiAJICBWU1VCLlMzMiAgICAgIFE5LCBRMTAsIFE3Ci0gICAgICAgICAgVlFSU0hSTi5TMzIgICBEMjAsIFE5LCAjMTIKKyAgICAgICAgICBWUVJTSFJOLlMzMiAgIEQyMCwgUTksICMxMiAgIAogICAgICAgICAgIFZNT1YuUzE2ICAgICAgcjksIEQyMFswXQogICAgICAgICAgIFZFWFQuOCAgICAgICAgRDcsIEQ3LCBEMjAsICMyCiAgICAgICAgICAgQ01QICAgICAgICAgICByOCwgIzgwCiAgICAgICAgICAgU1RSSCAgICAgICAgICByOSwgW3IxMF0gICAgICAgICAgICAgICAgICAgICAgICBAIHl5W2ldCi0gICAgICAgICAgU1RSSCAgICAgICAgICByOSwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICBAIHlbaV0KLQorICAgICAgICAgIFNUUkggICAgICAgICAgcjksIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgQCB5W2ldICAgICAgICAgIAkgICAgICAgICAKKwkgIAogICAgICAgICAgIEJMVCAgICAgICAgICAgU1lOX0xPT1AKLQorIAogICAgICAgICAgIEAgdXBkYXRlIG1lbVtdCiAgICAgICAgICAgQUREICAgICAgICAgICByNSwgcjEzLCAjMTYwICAgICAgICAgICAgICAgICAgICBAIHl5WzY0XSBhZGRyZXNzCiAJICBWTEQxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyNV0hCi0JICBWU1QxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyM10hCisJICBWU1QxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyM10hICAgICAgICAgICAgICAKIAogU3luX2ZpbHRfYXNtX2VuZDoKLQotICAgICAgICAgIEFERCAgICAgICAgICAgcjEzLCByMTMsICM3MDAKLSAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0KKyAKKyAgICAgICAgICBBREQgICAgICAgICAgIHIxMywgcjEzLCAjNzAwCQkgICAgIAorICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSAKICAgICAgICAgICBARU5ERlVOQwogICAgICAgICAgIC5FTkQKLQorIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKaW5kZXggOGM0NzdjYS4uOWJhYTkzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpAQCAtNzAsMTkgKzcwLDE5IEBACiAJCXAxID0geTsKIAkJZm9yIChpID0gMDsgaSA8IExfV0lORE9XOyBpKz00KQogCQl7Ci0JCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsKKwkJCSpwMSA9IHZvX3Nocl9yKCpwMSwgc2hpZnQpOyAKKwkJCXAxKys7CisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsgCiAJCQlwMSsrOwogCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7CiAJCQlwMSsrOwotCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7Ci0JCQlwMSsrOwotCQkJKnAxID0gdm9fc2hyX3IoKnAxLCBzaGlmdCk7CisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsgCiAJCQlwMSsrOwogCQl9CiAJfQogCiAJLyogQ29tcHV0ZSBhbmQgbm9ybWFsaXplIHJbMF0gKi8KLQlMX3N1bSA9IDE7CisJTF9zdW0gPSAxOyAKIAlmb3IgKGkgPSAwOyBpIDwgTF9XSU5ET1c7IGkrPTQpCiAJewogCQlMX3N1bSArPSB2b19MX211bHQoeVtpXSwgeVtpXSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hel9pc3AuYwppbmRleCA0M2RiMjdhLi45MzMzZDE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXpfaXNwLmMKQEAgLTkwLDkgKzkwLDkgQEAKIAkJZjFbaV0gPSB2b19yb3VuZCh0MCArIChhW00gLSBpXSA8PCAxNSkpOyAgICAgICAgLyogPShhW2ldK2FbTS1pXSkvMiAqLwogCQlmMltpXSA9IHZvX3JvdW5kKHQwIC0gKGFbTSAtIGldIDw8IDE1KSk7ICAgICAgICAvKiA9KGFbaV0tYVtNLWldKS8yICovCiAJfQotCWYxW05DXSA9IGFbTkNdOworCWYxW05DXSA9IGFbTkNdOyAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDI7IGkgPCBOQzsgaSsrKSAgICAgICAgICAgICAgIC8qIERpdmlkZSBieSAoMS16Xi0yKSAqLwotCQlmMltpXSA9IGFkZDEoZjJbaV0sIGYyW2kgLSAyXSk7CisJCWYyW2ldID0gYWRkMShmMltpXSwgZjJbaSAtIDJdKTsgICAgIAogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiAJICogRmluZCB0aGUgSVNQcyAocm9vdHMgb2YgRjEoeikgYW5kIEYyKHopICkgdXNpbmcgdGhlICAgICAgICAgICAgICAgICAqCkBAIC0xMDcsMTcgKzEwNywxNyBAQAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAluZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBmb3VuZCBmcmVxdWVuY2llcyAqLwogCWlwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdG9yIGZvciBmMSBvciBmMiAgICAgICovCi0JY29lZiA9IGYxOwotCW9yZGVyID0gTkM7Ci0JeGxvdyA9IHZvZ3JpZFswXTsKKwljb2VmID0gZjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlvcmRlciA9IE5DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl4bG93ID0gdm9ncmlkWzBdOyAgICAgICAgICAgICAgICAgICAgICAgIAogCXlsb3cgPSBDaGVicHMyKHhsb3csIGNvZWYsIG9yZGVyKTsKIAlqID0gMDsKIAl3aGlsZSAoKG5mIDwgTSAtIDEpICYmIChqIDwgR1JJRF9QT0lOVFMpKQogCXsKIAkJaiArKzsKLQkJeGhpZ2ggPSB4bG93OwotCQl5aGlnaCA9IHlsb3c7Ci0JCXhsb3cgPSB2b2dyaWRbal07CisJCXhoaWdoID0geGxvdzsgICAgICAgICAgICAgICAgICAgICAKKwkJeWhpZ2ggPSB5bG93OyAgICAgICAgICAgICAgICAgICAgICAKKwkJeGxvdyA9IHZvZ3JpZFtqXTsgICAgICAgICAgICAgICAgICAgIAogCQl5bG93ID0gQ2hlYnBzMih4bG93LCBjb2VmLCBvcmRlcik7CiAJCWlmICgoeWxvdyAqIHloaWdoKSA8PSAoV29yZDMyKSAwKQogCQl7CkBAIC0xMjgsMTIgKzEyOCwxMiBAQAogCQkJCXltaWQgPSBDaGVicHMyKHhtaWQsIGNvZWYsIG9yZGVyKTsKIAkJCQlpZiAoKHlsb3cgKiB5bWlkKSA8PSAoV29yZDMyKSAwKQogCQkJCXsKLQkJCQkJeWhpZ2ggPSB5bWlkOwotCQkJCQl4aGlnaCA9IHhtaWQ7CisJCQkJCXloaWdoID0geW1pZDsgICAgICAgICAKKwkJCQkJeGhpZ2ggPSB4bWlkOyAgICAgICAgICAKIAkJCQl9IGVsc2UKIAkJCQl7Ci0JCQkJCXlsb3cgPSB5bWlkOwotCQkJCQl4bG93ID0geG1pZDsKKwkJCQkJeWxvdyA9IHltaWQ7ICAgICAgICAgICAKKwkJCQkJeGxvdyA9IHhtaWQ7ICAgICAgICAgIAogCQkJCX0KIAkJCX0KIAkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKQEAgLTE0NCwxMCArMTQ0LDEwIEBACiAJCQl5ID0geWhpZ2ggLSB5bG93OwogCQkJaWYgKHkgPT0gMCkKIAkJCXsKLQkJCQl4aW50ID0geGxvdzsKKwkJCQl4aW50ID0geGxvdzsgICAgICAgICAgICAgICAKIAkJCX0gZWxzZQogCQkJewotCQkJCXNpZ24gPSB5OworCQkJCXNpZ24gPSB5OyAgICAgICAgICAgICAgICAgCiAJCQkJeSA9IGFic19zKHkpOwogCQkJCWV4cCA9IG5vcm1fcyh5KTsKIAkJCQl5ID0geSA8PCBleHA7CkBAIC0xNjEsMTkgKzE2MSwxOSBAQAogCQkJCXQwID0gKHQwID4+IDEwKTsgICAgICAgIC8qIHJlc3VsdCBpbiBRMTUgKi8KIAkJCQl4aW50ID0gdm9fc3ViKHhsb3csIHZvX2V4dHJhY3RfbCh0MCkpOyAgICAgICAgLyogeGludCA9IHhsb3cgLSB5bG93KnkgKi8KIAkJCX0KLQkJCWlzcFtuZl0gPSB4aW50OwotCQkJeGxvdyA9IHhpbnQ7Ci0JCQluZisrOworCQkJaXNwW25mXSA9IHhpbnQ7ICAgICAgICAgICAgICAgIAorCQkJeGxvdyA9IHhpbnQ7ICAgICAgICAgICAgICAgICAgIAorCQkJbmYrKzsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJaWYgKGlwID09IDApCiAJCQl7Ci0JCQkJaXAgPSAxOwotCQkJCWNvZWYgPSBmMjsKLQkJCQlvcmRlciA9IE5DIC0gMTsKKwkJCQlpcCA9IDE7ICAgICAgICAgICAgICAgICAgICAKKwkJCQljb2VmID0gZjI7ICAgICAgICAgICAgICAgIAorCQkJCW9yZGVyID0gTkMgLSAxOyAgICAgICAgICAgCiAJCQl9IGVsc2UKIAkJCXsKLQkJCQlpcCA9IDA7Ci0JCQkJY29lZiA9IGYxOwotCQkJCW9yZGVyID0gTkM7CisJCQkJaXAgPSAwOyAgICAgICAgICAgICAgICAgICAKKwkJCQljb2VmID0gZjE7ICAgICAgICAgICAgICAgICAKKwkJCQlvcmRlciA9IE5DOyAgICAgICAgICAgICAgCiAJCQl9CiAJCQl5bG93ID0gQ2hlYnBzMih4bG93LCBjb2VmLCBvcmRlcik7CiAJCX0KQEAgLTE4Myw3ICsxODMsNyBAQAogCXsKIAkJZm9yIChpID0gMDsgaSA8IE07IGkrKykKIAkJewotCQkJaXNwW2ldID0gb2xkX2lzcFtpXTsKKwkJCWlzcFtpXSA9IG9sZF9pc3BbaV07ICAgICAgICAgIAogCQl9CiAJfSBlbHNlCiAJewpAQCAtMjQzLDkgKzI0Myw5IEBACiAJCWIwX2wgPSAodDAgJiAweGZmZmYpID4+IDE7CiAKIAkJYjJfbCA9IGIxX2w7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGIyID0gYjE7ICovCi0JCWIyX2ggPSBiMV9oOworCQliMl9oID0gYjFfaDsgICAgICAgICAgICAgICAgICAgICAgIAogCQliMV9sID0gYjBfbDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYjEgPSBiMDsgKi8KLQkJYjFfaCA9IGIwX2g7CisJCWIxX2ggPSBiMF9oOyAgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCiAJdDAgPSAoKGIxX2ggKiB4KTw8MSkgKyAoKChiMV9sICogeCk+PjE1KTw8MSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCmluZGV4IGU3OGRjMWYuLjYxY2FjM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYml0cy5jCkBAIC0zNCw4ICszNCw4IEBACiAKIGludCBQYWNrQml0cyhXb3JkMTYgcHJtc1tdLCAgICAgICAgICAgICAvKiAgaTogYW5hbHlzaXMgcGFyYW1ldGVycyAqLwogCQkJIFdvcmQxNiBjb2RpbmdfbW9kZSwgICAgICAgIC8qICBpOiBjb2RpbmcgYml0LXN0cmVhbSByYXRpbyBtb2RlICovCi0JCQkgV29yZDE2IG1vZGUsICAgICAgICAgICAgICAgLyogIGk6IGNvZGluZyBiaXQtc3RyZWFtIHJhdGlvIG1vZGUqLwotCQkJIENvZGVyX1N0YXRlICpzdCAgICAgICAgICAgIC8qaS9vOiBjb2RlciBnbG9iYWwgcGFyYW1ldGVycyBzdHJ1Y3QgKi8KKwkJCSBXb3JkMTYgbW9kZSwgICAgICAgICAgICAgICAvKiAgaTogY29kaW5nIGJpdC1zdHJlYW0gcmF0aW8gbW9kZSovIAorCQkJIENvZGVyX1N0YXRlICpzdCAgICAgICAgICAgIC8qaS9vOiBjb2RlciBnbG9iYWwgcGFyYW1ldGVycyBzdHJ1Y3QgKi8gICAgICAgICAgIAogCQkJICkKIHsKIAlXb3JkMTYgaSwgZnJhbWVfdHlwZTsKQEAgLTQ2LDcgKzQ2LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCogZGF0YU91dCA9IHN0LT5vdXRwdXRTdHJlYW07CiAKIAlpZiAoY29kaW5nX21vZGUgPT0gTVJEVFgpCi0JeworCXsJICAgCiAJCXN0LT5zaWRfdXBkYXRlX2NvdW50ZXItLTsKIAogCQlpZiAoc3QtPnByZXZfZnQgPT0gVFhfU1BFRUNIKQpAQCAtOTIsNyArOTIsNyBAQAogCX0gZWxzZQogCXsKIAkJaWYgKGJpdHN0cmVhbWZvcm1hdCA9PSAxKQkJLyogSVRVIGZpbGUgZm9ybWF0ICovCi0JCXsKKwkJeyAgCQkJCQkJCiAJCQkqKGRhdGFPdXQpID0gMHg2YjIxOwogCQkJaWYoZnJhbWVfdHlwZSAhPSBUWF9OT19EQVRBICYmIGZyYW1lX3R5cGUgIT0gVFhfU0lEX0ZJUlNUKQogCQkJewpAQCAtMTAwLDE3ICsxMDAsMTcgQEAKIAkJCQlmb3IgKGkgPSAwOyBpIDwgbmJfb2ZfYml0c1tjb2RpbmdfbW9kZV07IGkrKykKIAkJCQl7CiAJCQkJCWlmKHBybXNbaV0gPT0gQklUXzApewotCQkJCQkJKihkYXRhT3V0ICsgMiArIGkpID0gQklUXzBfSVRVOworCQkJCQkJKihkYXRhT3V0ICsgMiArIGkpID0gQklUXzBfSVRVOwkgCQkJCiAJCQkJCX0KIAkJCQkJZWxzZXsKIAkJCQkJCSooZGF0YU91dCArIDIgKyBpKSA9IEJJVF8xX0lUVTsKIAkJCQkJfQogCQkJCX0KLQkJCQlyZXR1cm4gKDIgKyBuYl9vZl9iaXRzW2NvZGluZ19tb2RlXSk8PDE7CisJCQkJcmV0dXJuICgyICsgbmJfb2ZfYml0c1tjb2RpbmdfbW9kZV0pPDwxOyAgIAogCQkJfSBlbHNlCiAJCQl7CiAJCQkJKihkYXRhT3V0ICsgMSkgPSAwOwotCQkJCXJldHVybiAyPDwxOworCQkJCXJldHVybiAyPDwxOwkgICAKIAkJCX0KIAkJfSBlbHNlCQkJCQkJCS8qIE1JTUUvc3RvcmFnZSBmaWxlIGZvcm1hdCAqLwogCQl7CkBAIC0xOTEsNyArMTkxLDcgQEAKIAkJKQogewogCVdvcmQxNiBpLCBiaXQ7Ci0JKnBybXMgKz0gbm9fb2ZfYml0czsKKwkqcHJtcyArPSBub19vZl9iaXRzOyAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDA7IGkgPCBub19vZl9iaXRzOyBpKyspCiAJewogCQliaXQgPSAoV29yZDE2KSAodmFsdWUgJiAweDAwMDEpOyAgICAvKiBnZXQgbHNiICovCkBAIC0xOTksOSArMTk5LDkgQEAKIAkJCSotLSgqcHJtcykgPSBCSVRfMDsKIAkJZWxzZQogCQkJKi0tKCpwcm1zKSA9IEJJVF8xOwotCQl2YWx1ZSA+Pj0gMTsKKwkJdmFsdWUgPj49IDE7ICAgICAgICAgIAogCX0KLQkqcHJtcyArPSBub19vZl9iaXRzOworCSpwcm1zICs9IG5vX29mX2JpdHM7ICAgICAgICAgICAgICAgICAgCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2MydDY0ZnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCmluZGV4IDE4Njk4ZTIuLjgwOTkwZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCkBAIC03OSw3ICs3OSw3IEBACiAjZW5kaWYKIAogCUlzcXJ0X24oJnMsICZleHApOwotCXMgPSBMX3NobChzLCBhZGQxKGV4cCwgNSkpOworCXMgPSBMX3NobChzLCBhZGQxKGV4cCwgNSkpOyAgICAgICAgICAgICAKIAlrX2NuID0gdm9fcm91bmQocyk7CiAKIAkvKiBzZXQga19kbiA9IDMyLi41MTIgKGVuZXJfZG4gPSAyXjMwLi4yXjIyKSAqLwpAQCAtMTA3LDIyICsxMDcsMjIgQEAKIAkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOwogCQkqcDIrKyA9IHMgPj4gNzsKIAkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOwotCQkqcDIrKyA9IHMgPj4gNzsKKwkJKnAyKysgPSBzID4+IDc7IAogCX0KIAogCS8qIHNldCBzaWduIGFjY29yZGluZyB0byBkbjJbXSA9IGtfY24qY25bXSArIGtfZG4qZG5bXSAgICAqLwogCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpICsrKQogCXsKLQkJdmFsID0gZG5baV07Ci0JCXBzID0gZG4yW2ldOworCQl2YWwgPSBkbltpXTsgICAgICAgICAgICAgICAgICAgCisJCXBzID0gZG4yW2ldOyAgICAgICAgICAgICAgICAgICAKIAkJaWYgKHBzID49IDApCiAJCXsKIAkJCXNpZ25baV0gPSAzMjc2NzsgICAgICAgICAgICAgLyogc2lnbiA9ICsxIChRMTIpICovCi0JCQl2ZWNbaV0gPSAtMzI3Njg7CisJCQl2ZWNbaV0gPSAtMzI3Njg7ICAgICAgICAgICAKIAkJfSBlbHNlCiAJCXsKIAkJCXNpZ25baV0gPSAtMzI3Njg7ICAgICAgICAgICAgLyogc2lnbiA9IC0xIChRMTIpICovCi0JCQl2ZWNbaV0gPSAzMjc2NzsKKwkJCXZlY1tpXSA9IDMyNzY3OyAgICAgICAgICAgIAogCQkJZG5baV0gPSAtdmFsOwogCQl9CiAJfQpAQCAtMTMwLDEzICsxMzAsMTMgQEAKIAkgKiBDb21wdXRlIGhfaW52W2ldLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJLyogaW1wdWxzZSByZXNwb25zZSBidWZmZXIgZm9yIGZhc3QgY29tcHV0YXRpb24gKi8KLQloID0gaF9idWYgKyBMX1NVQkZSOwotCWhfaW52ID0gaCArIChMX1NVQkZSPDwxKTsKKwloID0gaF9idWYgKyBMX1NVQkZSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaF9pbnYgPSBoICsgKExfU1VCRlI8PDEpOyAgICAgICAgIAogCiAJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykKIAl7Ci0JCWhbaV0gPSBIW2ldOwotCQloX2ludltpXSA9IHZvX25lZ2F0ZShoW2ldKTsKKwkJaFtpXSA9IEhbaV07ICAgICAgICAgICAgICAgICAgICAgICAKKwkJaF9pbnZbaV0gPSB2b19uZWdhdGUoaFtpXSk7ICAgICAgICAgICAKIAl9CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKQEAgLTE0NCw0NiArMTQ0LDQ2IEBACiAJICogUmVzdWx0IGlzIG11bHRpcGxpZWQgYnkgMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCS8qIEluaXQgcG9pbnRlcnMgdG8gbGFzdCBwb3NpdGlvbiBvZiBycml4aXhbXSAqLwotCXAwID0gJnJyaXhpeFswXVtOQl9QT1MgLSAxXTsKLQlwMSA9ICZycml4aXhbMV1bTkJfUE9TIC0gMV07CisJcDAgPSAmcnJpeGl4WzBdW05CX1BPUyAtIDFdOyAgICAgICAgICAgCisJcDEgPSAmcnJpeGl4WzFdW05CX1BPUyAtIDFdOyAgICAgICAgICAgCiAKLQlwdHJfaDEgPSBoOworCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWNvciA9IDB4MDAwMTAwMDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHJvdW5kaW5nICovCiAJZm9yIChpID0gMDsgaSA8IE5CX1BPUzsgaSsrKQogCXsKIAkJY29yICs9ICgoKnB0cl9oMSkgKiAoKnB0cl9oMSkgPDwgMSk7CiAJCXB0cl9oMSsrOwotCQkqcDEtLSA9IChleHRyYWN0X2goY29yKSA+PiAxKTsKKwkJKnAxLS0gPSAoZXh0cmFjdF9oKGNvcikgPj4gMSk7ICAgICAgICAgICAgCiAJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDEpIDw8IDEpOwogCQlwdHJfaDErKzsKLQkJKnAwLS0gPSAoZXh0cmFjdF9oKGNvcikgPj4gMSk7CisJCSpwMC0tID0gKGV4dHJhY3RfaChjb3IpID4+IDEpOyAgICAgICAgICAgIAogCX0KIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCSAqIENvbXB1dGUgcnJpeGl5W11bXSBuZWVkZWQgZm9yIHRoZSBjb2RlYm9vayBzZWFyY2guICAgICAgICAgKgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwb3MgPSBNU0laRSAtIDE7Ci0JcG9zMiA9IE1TSVpFIC0gMjsKLQlwdHJfaGYgPSBoICsgMTsKKwlwb3MgPSBNU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAKKwlwb3MyID0gTVNJWkUgLSAyOyAgICAgICAgICAgICAgICAgICAgICAKKwlwdHJfaGYgPSBoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoayA9IDA7IGsgPCBOQl9QT1M7IGsrKykKIAl7Ci0JCXAxID0gJnJyaXhpeVtwb3NdOwotCQlwMCA9ICZycml4aXlbcG9zMl07CisJCXAxID0gJnJyaXhpeVtwb3NdOyAgICAgICAgICAgICAgICAgCisJCXAwID0gJnJyaXhpeVtwb3MyXTsgICAgICAgICAgICAgICAgCiAJCWNvciA9IDB4MDAwMDgwMDBMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLwotCQlwdHJfaDEgPSBoOwotCQlwdHJfaDIgPSBwdHJfaGY7CisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgCisJCXB0cl9oMiA9IHB0cl9oZjsgICAgICAgICAgICAgICAgICAgCiAKIAkJZm9yIChpID0gKGsgKyAxKTsgaSA8IE5CX1BPUzsgaSsrKQogCQl7CiAJCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gyKSk8PDE7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAxID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDEgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgCiAJCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gyKSk8PDE7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAwID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDAgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAKIAogCQkJcDEgLT0gKE5CX1BPUyArIDEpOwogCQkJcDAgLT0gKE5CX1BPUyArIDEpOwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDIpKTw8MTsKIAkJcHRyX2gxKys7CiAJCXB0cl9oMisrOwotCQkqcDEgPSBleHRyYWN0X2goY29yKTsKKwkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICAKIAogCQlwb3MgLT0gTkJfUE9TOwogCQlwb3MyLS07CkBAIC0yMDEsMTcgKzIwMSwxNyBAQAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCSAqIE1vZGlmaWNhdGlvbiBvZiBycml4aXlbXVtdIHRvIHRha2Ugc2lnbnMgaW50byBhY2NvdW50LiAgICAgKgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwMCA9IHJyaXhpeTsKKwlwMCA9IHJyaXhpeTsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpICs9IFNURVApCiAJewotCQlwc2lnbiA9IHNpZ247CisJCXBzaWduID0gc2lnbjsgICAgICAgICAgICAgICAgICAgICAgCiAJCWlmIChwc2lnbltpXSA8IDApCiAJCXsKLQkJCXBzaWduID0gdmVjOworCQkJcHNpZ24gPSB2ZWM7ICAgICAgICAgICAgICAgICAgIAogCQl9CiAJCWZvciAoaiA9IDE7IGogPCBMX1NVQkZSOyBqICs9IFNURVApCiAJCXsKLQkJCSpwMCA9IHZvX211bHQoKnAwLCBwc2lnbltqXSk7CisJCQkqcDAgPSB2b19tdWx0KCpwMCwgcHNpZ25bal0pOyAgICAgCiAJCQlwMCsrOwogCQl9CiAJfQpAQCAtMjIwLDIwICsyMjAsMjAgQEAKIAkgKiB+QH5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAJICogMzIgcG9zIHggMzIgcG9zID0gMTAyNCB0ZXN0cyAoYWxsIGNvbWJpbmFpc29ucyBpcyB0ZXN0ZWQpICAgICAgICAgKgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JcDAgPSBycml4aXhbMF07Ci0JcDEgPSBycml4aXhbMV07Ci0JcDIgPSBycml4aXk7CisJcDAgPSBycml4aXhbMF07ICAgICAgICAgICAgICAgICAgICAgICAgCisJcDEgPSBycml4aXhbMV07ICAgICAgICAgICAgICAgICAgICAgICAgCisJcDIgPSBycml4aXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAotCXBzayA9IC0xOwotCWFscGsgPSAxOwotCWl4ID0gMDsKLQlpeSA9IDE7CisJcHNrID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJYWxwayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaXkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlmb3IgKGkwID0gMDsgaTAgPCBMX1NVQkZSOyBpMCArPSBTVEVQKQogCXsKLQkJcHMxID0gZG5baTBdOwotCQlhbHAxID0gKCpwMCsrKTsKLQkJcG9zID0gLTE7CisJCXBzMSA9IGRuW2kwXTsgICAgICAgICAgICAgICAgICAgICAgCisJCWFscDEgPSAoKnAwKyspOyAgICAgICAgICAgICAgICAgICAgCisJCXBvcyA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCWZvciAoaTEgPSAxOyBpMSA8IExfU1VCRlI7IGkxICs9IFNURVApCiAJCXsKIAkJCXBzMiA9IGFkZDEocHMxLCBkbltpMV0pOwpAQCAtMjQyLDE2ICsyNDIsMTYgQEAKIAkJCXMgPSB2b19MX211bHQoYWxwaywgc3EpIC0gKChwc2sgKiBhbHAyKTw8MSk7CiAJCQlpZiAocyA+IDApCiAJCQl7Ci0JCQkJcHNrID0gc3E7Ci0JCQkJYWxwayA9IGFscDI7Ci0JCQkJcG9zID0gaTE7CisJCQkJcHNrID0gc3E7ICAgICAgICAgICAgICAgICAgCisJCQkJYWxwayA9IGFscDI7ICAgICAgICAgICAgICAgCisJCQkJcG9zID0gaTE7ICAgICAgICAgICAgICAgICAgCiAJCQl9CiAJCX0KIAkJcDEgLT0gTkJfUE9TOwogCQlpZiAocG9zID49IDApCiAJCXsKLQkJCWl4ID0gaTA7Ci0JCQlpeSA9IHBvczsKKwkJCWl4ID0gaTA7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJaXkgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykKIAl7Ci0JCWNvZGVbaV0gPSAwOworCQljb2RlW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAogCWkwID0gKGl4ID4+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIG9mIHB1bHNlIDEgKDAuLjMxKSAqLwpAQCAtMjY4LDI0ICsyNjgsMjQgQEAKIAlpZiAoc2lnbltpeF0gPiAwKQogCXsKIAkJY29kZVtpeF0gPSA1MTI7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZXdvcmQgaW4gUTkgZm9ybWF0ICovCi0JCXAwID0gaCAtIGl4OworCQlwMCA9IGggLSBpeDsgICAgICAgICAgICAgICAgICAgICAgIAogCX0gZWxzZQogCXsKLQkJY29kZVtpeF0gPSAtNTEyOwotCQlpMCArPSBOQl9QT1M7Ci0JCXAwID0gaF9pbnYgLSBpeDsKKwkJY29kZVtpeF0gPSAtNTEyOyAgICAgICAgICAgICAgICAgICAKKwkJaTAgKz0gTkJfUE9TOyAgICAgICAgICAgICAgICAgICAgICAKKwkJcDAgPSBoX2ludiAtIGl4OyAgICAgICAgICAgICAgICAgICAKIAl9CiAJaWYgKHNpZ25baXldID4gMCkKIAl7Ci0JCWNvZGVbaXldID0gNTEyOwotCQlwMSA9IGggLSBpeTsKKwkJY29kZVtpeV0gPSA1MTI7ICAgICAgICAgICAgICAgICAgICAKKwkJcDEgPSBoIC0gaXk7ICAgICAgICAgICAgICAgICAgICAgICAKIAl9IGVsc2UKIAl7Ci0JCWNvZGVbaXldID0gLTUxMjsKLQkJaTEgKz0gTkJfUE9TOwotCQlwMSA9IGhfaW52IC0gaXk7CisJCWNvZGVbaXldID0gLTUxMjsgICAgICAgICAgICAgICAgICAgCisJCWkxICs9IE5CX1BPUzsgICAgICAgICAgICAgICAgICAgICAgCisJCXAxID0gaF9pbnYgLSBpeTsgICAgICAgICAgICAgICAgICAgCiAJfQotCSppbmRleCA9IGFkZDEoKGkwIDw8IDYpLCBpMSk7CisJKmluZGV4ID0gYWRkMSgoaTAgPDwgNiksIGkxKTsgICAgICAgICAgCiAJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykKIAl7CiAJCXlbaV0gPSB2b19zaHJfcihhZGQxKCgqcDArKyksICgqcDErKykpLCAzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKaW5kZXggMWVjYzExZi4uMTdmM2Q0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKQEAgLTE1MSw1OCArMTUxLDU4IEBACiAJCWNhc2UgMjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwIGJpdHMsIDQgcHVsc2VzLCA0IHRyYWNrcyAqLwogCQkJbmJpdGVyID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDR4MTZ4MTY9MTAyNCBsb29wICovCiAJCQlhbHAgPSA4MTkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMi4wIChRMTIpICovCi0JCQluYl9wdWxzZSA9IDQ7Ci0JCQluYnBvc1swXSA9IDQ7Ci0JCQluYnBvc1sxXSA9IDg7CisJCQluYl9wdWxzZSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMF0gPSA0OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzFdID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJY2FzZSAzNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzYgYml0cywgOCBwdWxzZXMsIDQgdHJhY2tzICovCiAJCQluYml0ZXIgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNHgyMHgxNj0xMjgwIGxvb3AgKi8KIAkJCWFscCA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAxLjAgKFExMikgKi8KLQkJCW5iX3B1bHNlID0gODsKLQkJCW5icG9zWzBdID0gNDsKLQkJCW5icG9zWzFdID0gODsKLQkJCW5icG9zWzJdID0gODsKKwkJCW5iX3B1bHNlID0gODsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1swXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMV0gPSA4OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzJdID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJY2FzZSA0NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgYml0cywgMTAgcHVsc2VzLCA0IHRyYWNrcyAqLwogCQkJbmJpdGVyID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDR4MjZ4MTY9MTY2NCBsb29wICovCiAJCQlhbHAgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMS4wIChRMTIpICovCi0JCQluYl9wdWxzZSA9IDEwOwotCQkJbmJwb3NbMF0gPSA0OwotCQkJbmJwb3NbMV0gPSA2OwotCQkJbmJwb3NbMl0gPSA4OwotCQkJbmJwb3NbM10gPSA4OworCQkJbmJfcHVsc2UgPSAxMDsgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1sxXSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMl0gPSA4OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzNdID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJY2FzZSA1MjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNTIgYml0cywgMTIgcHVsc2VzLCA0IHRyYWNrcyAqLwogCQkJbmJpdGVyID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDR4MjZ4MTY9MTY2NCBsb29wICovCiAJCQlhbHAgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMS4wIChRMTIpICovCi0JCQluYl9wdWxzZSA9IDEyOwotCQkJbmJwb3NbMF0gPSA0OwotCQkJbmJwb3NbMV0gPSA2OwotCQkJbmJwb3NbMl0gPSA4OwotCQkJbmJwb3NbM10gPSA4OworCQkJbmJfcHVsc2UgPSAxMjsgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1sxXSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMl0gPSA4OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzNdID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJY2FzZSA2NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjQgYml0cywgMTYgcHVsc2VzLCA0IHRyYWNrcyAqLwogCQkJbmJpdGVyID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDN4MzZ4MTY9MTcyOCBsb29wICovCiAJCQlhbHAgPSAzMjc3OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMC44IChRMTIpICovCi0JCQluYl9wdWxzZSA9IDE2OwotCQkJbmJwb3NbMF0gPSA0OwotCQkJbmJwb3NbMV0gPSA0OwotCQkJbmJwb3NbMl0gPSA2OwotCQkJbmJwb3NbM10gPSA2OwotCQkJbmJwb3NbNF0gPSA4OwotCQkJbmJwb3NbNV0gPSA4OworCQkJbmJfcHVsc2UgPSAxNjsgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1sxXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMl0gPSA2OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzNdID0gNjsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1s0XSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbNV0gPSA4OyAgICAgICAgICAgICAgICAgICAgICAKIAkJCWJyZWFrOwogCQljYXNlIDcyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA3MiBiaXRzLCAxOCBwdWxzZXMsIDQgdHJhY2tzICovCiAJCQluYml0ZXIgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogM3gzNXgxNj0xNjgwIGxvb3AgKi8KIAkJCWFscCA9IDMwNzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAwLjc1IChRMTIpICovCi0JCQluYl9wdWxzZSA9IDE4OwotCQkJbmJwb3NbMF0gPSAyOwotCQkJbmJwb3NbMV0gPSAzOwotCQkJbmJwb3NbMl0gPSA0OwotCQkJbmJwb3NbM10gPSA1OwotCQkJbmJwb3NbNF0gPSA2OwotCQkJbmJwb3NbNV0gPSA3OwotCQkJbmJwb3NbNl0gPSA4OworCQkJbmJfcHVsc2UgPSAxODsgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzBdID0gMjsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1sxXSA9IDM7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMl0gPSA0OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzNdID0gNTsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1s0XSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbNV0gPSA3OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzZdID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJY2FzZSA4ODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogODggYml0cywgMjQgcHVsc2VzLCA0IHRyYWNrcyAqLwogCQkJaWYoc2VyX3NpemUgPiA0NjIpCkBAIC0yMTEsMTcgKzIxMSwxNyBAQAogCQkJCW5iaXRlciA9IDI7ICAgICAgICAgICAgICAgICAgICAvKiAyeDUzeDE2PTE2OTYgbG9vcCAqLwogCiAJCQlhbHAgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMC41IChRMTIpICovCi0JCQluYl9wdWxzZSA9IDI0OwotCQkJbmJwb3NbMF0gPSAyOwotCQkJbmJwb3NbMV0gPSAyOwotCQkJbmJwb3NbMl0gPSAzOwotCQkJbmJwb3NbM10gPSA0OwotCQkJbmJwb3NbNF0gPSA1OwotCQkJbmJwb3NbNV0gPSA2OwotCQkJbmJwb3NbNl0gPSA3OwotCQkJbmJwb3NbN10gPSA4OwotCQkJbmJwb3NbOF0gPSA4OwotCQkJbmJwb3NbOV0gPSA4OworCQkJbmJfcHVsc2UgPSAyNDsgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzBdID0gMjsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1sxXSA9IDI7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbMl0gPSAzOyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzNdID0gNDsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1s0XSA9IDU7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbNV0gPSA2OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzZdID0gNzsgICAgICAgICAgICAgICAgICAgICAgCisJCQluYnBvc1s3XSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIAorCQkJbmJwb3NbOF0gPSA4OyAgICAgICAgICAgICAgICAgICAgICAKKwkJCW5icG9zWzldID0gODsgICAgICAgICAgICAgICAgICAgICAgCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCW5iaXRlciA9IDA7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBuYl9wdWxzZTsgaSsrKQogCXsKLQkJY29kdmVjW2ldID0gaTsKKwkJY29kdmVjW2ldID0gaTsgICAgICAgICAgICAgICAgICAgICAKIAl9CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCkBAIC0yNDYsNyArMjQ2LDcgQEAKICNlbmRpZgogCiAJSXNxcnRfbigmcywgJmV4cCk7Ci0JcyA9IExfc2hsKHMsIChleHAgKyA1KSk7CisJcyA9IExfc2hsKHMsIChleHAgKyA1KSk7IAogCWtfY24gPSBleHRyYWN0X2goTF9hZGQocywgMHg4MDAwKSk7CiAKIAkvKiBzZXQga19kbiA9IDMyLi41MTIgKGVuZXJfZG4gPSAyXjMwLi4yXjIyKSAqLwpAQCAtMjc0LDIyICsyNzQsMjIgQEAKIAkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOwogCQkqcDIrKyA9IHMgPj4gNzsKIAkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOwotCQkqcDIrKyA9IHMgPj4gNzsKKwkJKnAyKysgPSBzID4+IDc7IAogCX0KIAogCS8qIHNldCBzaWduIGFjY29yZGluZyB0byBkbjJbXSA9IGtfY24qY25bXSArIGtfZG4qZG5bXSAgICAqLwogCWZvcihpID0gMDsgaSA8IExfU1VCRlI7IGkrKykKIAl7Ci0JCXZhbCA9IGRuW2ldOwotCQlwcyA9IGRuMltpXTsKKwkJdmFsID0gZG5baV07ICAgICAgICAgICAgICAgICAgIAorCQlwcyA9IGRuMltpXTsgICAgICAgICAgICAgICAgICAgCiAJCWlmIChwcyA+PSAwKQogCQl7CiAJCQlzaWduW2ldID0gMzI3Njc7ICAgICAgICAgICAgIC8qIHNpZ24gPSArMSAoUTEyKSAqLwotCQkJdmVjW2ldID0gLTMyNzY4OworCQkJdmVjW2ldID0gLTMyNzY4OyAgICAgICAgICAgCiAJCX0gZWxzZQogCQl7CiAJCQlzaWduW2ldID0gLTMyNzY4OyAgICAgICAgICAgIC8qIHNpZ24gPSAtMSAoUTEyKSAqLwotCQkJdmVjW2ldID0gMzI3Njc7CisJCQl2ZWNbaV0gPSAzMjc2NzsgICAgICAgICAgICAKIAkJCWRuW2ldID0gLXZhbDsKIAkJCWRuMltpXSA9IC1wczsKIAkJfQpAQCAtMzAyLDE5ICszMDIsMTkgQEAKIAl7CiAJCWZvciAoayA9IDA7IGsgPCBOQl9NQVg7IGsrKykKIAkJewotCQkJcHMgPSAtMTsKKwkJCXBzID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAKIAkJCWZvciAoaiA9IGk7IGogPCBMX1NVQkZSOyBqICs9IFNURVApCiAJCQl7CiAJCQkJaWYoZG4yW2pdID4gcHMpCiAJCQkJewotCQkJCQlwcyA9IGRuMltqXTsKLQkJCQkJcG9zID0gajsKKwkJCQkJcHMgPSBkbjJbal07ICAgICAgICAgIAorCQkJCQlwb3MgPSBqOyAgICAgICAgICAgICAgIAogCQkJCX0KIAkJCX0KIAkJCWRuMltwb3NdID0gKGsgLSBOQl9NQVgpOyAgICAgLyogZG4yIDwgMCB3aGVuIHBvc2l0aW9uIGlzIHNlbGVjdGVkICovCiAJCQlpZiAoayA9PSAwKQogCQkJewotCQkJCXBvc19tYXhbaV0gPSBwb3M7CisJCQkJcG9zX21heFtpXSA9IHBvczsgICAgICAgICAgCiAJCQl9CiAJCX0KIAl9CkBAIC0zMzUsMjIgKzMzNSwyMiBAQAogCiAJLyogaW1wdWxzZSByZXNwb25zZSBidWZmZXIgZm9yIGZhc3QgY29tcHV0YXRpb24gKi8KIAotCWggPSBoX2J1ZjsKLQloX2ludiA9IGhfYnVmICsgKDIgKiBMX1NVQkZSKTsKKwloID0gaF9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwloX2ludiA9IGhfYnVmICsgKDIgKiBMX1NVQkZSKTsgICAKIAlMX3RtcCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykKIAl7Ci0JCSpoKysgPSAwOwotCQkqaF9pbnYrKyA9IDA7CisJCSpoKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCSpoX2ludisrID0gMDsgICAKIAkJTF90bXAgKz0gKEhbaV0gKiBIW2ldKSA8PCAxOwogCX0KIAkvKiBzY2FsZSBoW10gZG93biAoLzIpIHdoZW4gZW5lcmd5IG9mIGhbXSBpcyBoaWdoIHdpdGggbWFueSBwdWxzZXMgdXNlZCAqLwogCXZhbCA9IGV4dHJhY3RfaChMX3RtcCk7Ci0JaF9zaGlmdCA9IDA7CisJaF9zaGlmdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlpZiAoKG5iX3B1bHNlID49IDEyKSAmJiAodmFsID4gMTAyNCkpCiAJewotCQloX3NoaWZ0ID0gMTsKKwkJaF9zaGlmdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAJcDAgPSBIOwogCXAxID0gaDsKQEAgLTM1OCwxNCArMzU4LDE0IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUi80OyBpKyspCiAJewotCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OwotCQkqcDIrKyA9IC0oKnAxKyspOwotCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OwotCQkqcDIrKyA9IC0oKnAxKyspOwotCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OwotCQkqcDIrKyA9IC0oKnAxKyspOwotCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OwotCQkqcDIrKyA9IC0oKnAxKyspOworCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIAorCQkqcDIrKyA9IC0oKnAxKyspOyAgCisJCSpwMSA9ICpwMCsrID4+IGhfc2hpZnQ7ICAgICAgICAgCisJCSpwMisrID0gLSgqcDErKyk7IAorCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIAorCQkqcDIrKyA9IC0oKnAxKyspOyAKKwkJKnAxID0gKnAwKysgPj4gaF9zaGlmdDsgICAgICAgICAKKwkJKnAyKysgPSAtKCpwMSsrKTsgCiAJfQogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCkBAIC0zNzcsMjcgKzM3NywyNyBAQAogCS8qIHN0b3JhZ2Ugb3JkZXIgLS0+IGkzaTMsIGkyaTIsIGkxaTEsIGkwaTAgKi8KIAogCS8qIEluaXQgcG9pbnRlcnMgdG8gbGFzdCBwb3NpdGlvbiBvZiBycml4aXhbXSAqLwotCXAwID0gJnJyaXhpeFswXVtOQl9QT1MgLSAxXTsKLQlwMSA9ICZycml4aXhbMV1bTkJfUE9TIC0gMV07Ci0JcDIgPSAmcnJpeGl4WzJdW05CX1BPUyAtIDFdOwotCXAzID0gJnJyaXhpeFszXVtOQl9QT1MgLSAxXTsKKwlwMCA9ICZycml4aXhbMF1bTkJfUE9TIC0gMV07ICAgICAgICAgICAKKwlwMSA9ICZycml4aXhbMV1bTkJfUE9TIC0gMV07ICAgICAgICAgICAKKwlwMiA9ICZycml4aXhbMl1bTkJfUE9TIC0gMV07ICAgICAgICAgICAKKwlwMyA9ICZycml4aXhbM11bTkJfUE9TIC0gMV07ICAgICAgICAgICAKIAotCXB0cl9oMSA9IGg7CisJcHRyX2gxID0gaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJY29yID0gMHgwMDAwODAwMEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTkJfUE9TOyBpKyspCiAJewogCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDEpKTsKIAkJcHRyX2gxKys7Ci0JCSpwMy0tID0gZXh0cmFjdF9oKGNvcik7CisJCSpwMy0tID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgCiAJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMSkpOwogCQlwdHJfaDErKzsKLQkJKnAyLS0gPSBleHRyYWN0X2goY29yKTsKKwkJKnAyLS0gPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICAKIAkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gxKSk7CiAJCXB0cl9oMSsrOwotCQkqcDEtLSA9IGV4dHJhY3RfaChjb3IpOworCQkqcDEtLSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgIAogCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDEpKTsKIAkJcHRyX2gxKys7Ci0JCSpwMC0tID0gZXh0cmFjdF9oKGNvcik7CisJCSpwMC0tID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgCiAJfQogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCkBAIC00MDksMzggKzQwOSwzOCBAQAogCiAJLyogc3RvcmFnZSBvcmRlciAtLT4gaTJpMywgaTFpMiwgaTBpMSwgaTNpMCAqLwogCi0JcG9zID0gTVNJWkUgLSAxOwotCXB0cl9oZiA9IGggKyAxOworCXBvcyA9IE1TSVpFIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIAorCXB0cl9oZiA9IGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgIAogCiAJZm9yIChrID0gMDsgayA8IE5CX1BPUzsgaysrKQogCXsKLQkJcDMgPSAmcnJpeGl5WzJdW3Bvc107Ci0JCXAyID0gJnJyaXhpeVsxXVtwb3NdOwotCQlwMSA9ICZycml4aXlbMF1bcG9zXTsKLQkJcDAgPSAmcnJpeGl5WzNdW3BvcyAtIE5CX1BPU107CisJCXAzID0gJnJyaXhpeVsyXVtwb3NdOyAgICAgICAgICAgICAgCisJCXAyID0gJnJyaXhpeVsxXVtwb3NdOyAgICAgICAgICAgICAgCisJCXAxID0gJnJyaXhpeVswXVtwb3NdOyAgICAgICAgICAgICAgCisJCXAwID0gJnJyaXhpeVszXVtwb3MgLSBOQl9QT1NdOyAgICAgCiAKIAkJY29yID0gMHgwMDAwODAwMEw7ICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLwotCQlwdHJfaDEgPSBoOwotCQlwdHJfaDIgPSBwdHJfaGY7CisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgCisJCXB0cl9oMiA9IHB0cl9oZjsgICAgICAgICAgICAgICAgICAgCiAKIAkJZm9yIChpID0gayArIDE7IGkgPCBOQl9QT1M7IGkrKykKIAkJewogCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAzID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDMgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgCiAJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsKIAkJCXB0cl9oMSsrOwogCQkJcHRyX2gyKys7Ci0JCQkqcDIgPSBleHRyYWN0X2goY29yKTsKKwkJCSpwMiA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAKIAkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOwogCQkJcHRyX2gxKys7CiAJCQlwdHJfaDIrKzsKLQkJCSpwMSA9IGV4dHJhY3RfaChjb3IpOworCQkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIAogCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAwID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDAgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAKIAogCQkJcDMgLT0gKE5CX1BPUyArIDEpOwogCQkJcDIgLT0gKE5CX1BPUyArIDEpOwpAQCAtNDUwLDE1ICs0NTAsMTUgQEAKIAkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7CiAJCXB0cl9oMSsrOwogCQlwdHJfaDIrKzsKLQkJKnAzID0gZXh0cmFjdF9oKGNvcik7CisJCSpwMyA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgICAgCiAJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOwogCQlwdHJfaDErKzsKIAkJcHRyX2gyKys7Ci0JCSpwMiA9IGV4dHJhY3RfaChjb3IpOworCQkqcDIgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICAgIAogCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsKIAkJcHRyX2gxKys7CiAJCXB0cl9oMisrOwotCQkqcDEgPSBleHRyYWN0X2goY29yKTsKKwkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICAKIAogCQlwb3MgLT0gTkJfUE9TOwogCQlwdHJfaGYgKz0gU1RFUDsKQEAgLTQ2NiwzOCArNDY2LDM4IEBACiAKIAkvKiBzdG9yYWdlIG9yZGVyIC0tPiBpM2kwLCBpMmkzLCBpMWkyLCBpMGkxICovCiAKLQlwb3MgPSBNU0laRSAtIDE7Ci0JcHRyX2hmID0gaCArIDM7CisJcG9zID0gTVNJWkUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgCisJcHRyX2hmID0gaCArIDM7ICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlmb3IgKGsgPSAwOyBrIDwgTkJfUE9TOyBrKyspCiAJewotCQlwMyA9ICZycml4aXlbM11bcG9zXTsKLQkJcDIgPSAmcnJpeGl5WzJdW3BvcyAtIDFdOwotCQlwMSA9ICZycml4aXlbMV1bcG9zIC0gMV07Ci0JCXAwID0gJnJyaXhpeVswXVtwb3MgLSAxXTsKKwkJcDMgPSAmcnJpeGl5WzNdW3Bvc107ICAgICAgICAgICAgICAKKwkJcDIgPSAmcnJpeGl5WzJdW3BvcyAtIDFdOyAgICAgICAgICAKKwkJcDEgPSAmcnJpeGl5WzFdW3BvcyAtIDFdOyAgICAgICAgICAKKwkJcDAgPSAmcnJpeGl5WzBdW3BvcyAtIDFdOyAgICAgICAgICAKIAogCQljb3IgPSAweDAwMDA4MDAwTDsJCQkJCQkJCS8qIGZvciByb3VuZGluZyAqLwotCQlwdHJfaDEgPSBoOwotCQlwdHJfaDIgPSBwdHJfaGY7CisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgCisJCXB0cl9oMiA9IHB0cl9oZjsgICAgICAgICAgICAgICAgICAgCiAKIAkJZm9yIChpID0gayArIDE7IGkgPCBOQl9QT1M7IGkrKykKIAkJewogCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAzID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDMgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgCiAJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsKIAkJCXB0cl9oMSsrOwogCQkJcHRyX2gyKys7Ci0JCQkqcDIgPSBleHRyYWN0X2goY29yKTsKKwkJCSpwMiA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAKIAkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOwogCQkJcHRyX2gxKys7CiAJCQlwdHJfaDIrKzsKLQkJCSpwMSA9IGV4dHJhY3RfaChjb3IpOworCQkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIAogCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7CiAJCQlwdHJfaDErKzsKIAkJCXB0cl9oMisrOwotCQkJKnAwID0gZXh0cmFjdF9oKGNvcik7CisJCQkqcDAgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgCiAKIAkJCXAzIC09IChOQl9QT1MgKyAxKTsKIAkJCXAyIC09IChOQl9QT1MgKyAxKTsKQEAgLTUwNyw3ICs1MDcsNyBAQAogCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsKIAkJcHRyX2gxKys7CiAJCXB0cl9oMisrOwotCQkqcDMgPSBleHRyYWN0X2goY29yKTsKKwkJKnAzID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICAKIAogCQlwb3MtLTsKIAkJcHRyX2hmICs9IFNURVA7CkBAIC01MTcsMjIgKzUxNywyMiBAQAogCSAqIE1vZGlmaWNhdGlvbiBvZiBycml4aXlbXVtdIHRvIHRha2Ugc2lnbnMgaW50byBhY2NvdW50LiAgICAgKgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCXAwID0gJnJyaXhpeVswXVswXTsKKwlwMCA9ICZycml4aXlbMF1bMF07ICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoayA9IDA7IGsgPCBOQl9UUkFDSzsgaysrKQogCXsKIAkJal90ZW1wID0gKGsgKyAxKSYweDAzOwogCQlmb3IgKGkgPSBrOyBpIDwgTF9TVUJGUjsgaSArPSBTVEVQKQogCQl7Ci0JCQlwc2lnbiA9IHNpZ247CisJCQlwc2lnbiA9IHNpZ247ICAgICAgICAgICAgICAgICAgCiAJCQlpZiAocHNpZ25baV0gPCAwKQogCQkJewotCQkJCXBzaWduID0gdmVjOworCQkJCXBzaWduID0gdmVjOyAgICAgICAgICAgICAgIAogCQkJfQogCQkJaiA9IGpfdGVtcDsKIAkJCWZvciAoOyBqIDwgTF9TVUJGUjsgaiArPSBTVEVQKQogCQkJewotCQkJCSpwMCA9IHZvX211bHQoKnAwLCBwc2lnbltqXSk7CisJCQkJKnAwID0gdm9fbXVsdCgqcDAsIHBzaWduW2pdKTsgICAgCiAJCQkJcDArKzsKIAkJCX0KIAkJfQpAQCAtNTQyLDggKzU0Miw4IEBACiAJICogICAgICAgICAgICAgICAgICAgICAgIERlZXAgZmlyc3Qgc2VhcmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQlwc2sgPSAtMTsKLQlhbHBrID0gMTsKKwlwc2sgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlhbHBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoayA9IDA7IGsgPCBuYml0ZXI7IGsrKykKIAl7CkBAIC01NTMsMTIgKzU1MywxMiBAQAogCiAJCWlmKG5iYml0cyA9PSAyMCkKIAkJewotCQkJcG9zID0gMDsKLQkJCXBzID0gMDsKLQkJCWFscCA9IDA7CisJCQlwb3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlhbHAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgCiAJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQogCQkJewotCQkJCXZlY1tpXSA9IDA7CisJCQkJdmVjW2ldID0gMDsgICAgICAgICAgICAgICAgCiAJCQl9CiAJCX0gZWxzZSBpZiAoKG5iYml0cyA9PSAzNikgfHwgKG5iYml0cyA9PSA0NCkpCiAJCXsKQEAgLTU5MSwxOCArNTkxLDE4IEBACiAKIAkJCWlmKG5iYml0cyA9PSA0NCkKIAkJCXsKLQkJCQlpcG9zWzhdID0gMDsKLQkJCQlpcG9zWzldID0gMTsKKwkJCQlpcG9zWzhdID0gMDsgICAgICAgICAgICAgICAKKwkJCQlpcG9zWzldID0gMTsgICAgICAgICAgICAgICAKIAkJCX0KIAkJfSBlbHNlCiAJCXsKIAkJCS8qIGZpcnN0IHN0YWdlOiBmaXggNCBwdWxzZXMgKi8KIAkJCXBvcyA9IDQ7CiAKLQkJCWl4ID0gaW5kWzBdID0gcG9zX21heFtpcG9zWzBdXTsKLQkJCWl5ID0gaW5kWzFdID0gcG9zX21heFtpcG9zWzFdXTsKLQkJCWkgPSBpbmRbMl0gPSBwb3NfbWF4W2lwb3NbMl1dOwotCQkJaiA9IGluZFszXSA9IHBvc19tYXhbaXBvc1szXV07CisJCQlpeCA9IGluZFswXSA9IHBvc19tYXhbaXBvc1swXV07ICAKKwkJCWl5ID0gaW5kWzFdID0gcG9zX21heFtpcG9zWzFdXTsgIAorCQkJaSA9IGluZFsyXSA9IHBvc19tYXhbaXBvc1syXV07ICAgCisJCQlqID0gaW5kWzNdID0gcG9zX21heFtpcG9zWzNdXTsgICAKIAkJCXBzID0gYWRkMShhZGQxKGFkZDEoZG5baXhdLCBkbltpeV0pLCBkbltpXSksIGRuW2pdKTsKIAogCQkJaWYgKHNpZ25baXhdIDwgMCkKQEAgLTYzNiw4ICs2MzYsOCBAQAogCiAJCQlpZihuYmJpdHMgPT0gNzIpCiAJCQl7Ci0JCQkJaXBvc1sxNl0gPSAwOwotCQkJCWlwb3NbMTddID0gMTsKKwkJCQlpcG9zWzE2XSA9IDA7ICAgICAgICAgICAgICAKKwkJCQlpcG9zWzE3XSA9IDE7ICAgICAgICAgICAgICAKIAkJCX0KIAkJfQogCkBAIC02NjgsOCArNjY4LDggQEAKIAkJCXNlYXJjaF9peGl5KG5icG9zW3N0XSwgaXBvc1tqXSwgaXBvc1tqICsgMV0sICZwcywgJmFscCwKIAkJCQkJJml4LCAmaXksIGRuLCBkbjIsIGNvcl94LCBjb3JfeSwgcnJpeGl5KTsKIAotCQkJaW5kW2pdID0gaXg7Ci0JCQlpbmRbaiArIDFdID0gaXk7CisJCQlpbmRbal0gPSBpeDsgICAgICAgICAgICAgICAgICAgCisJCQlpbmRbaiArIDFdID0gaXk7ICAgICAgICAgICAgICAgCiAKIAkJCWlmIChzaWduW2l4XSA8IDApCiAJCQkJcDAgPSBoX2ludiAtIGl4OwpAQCAtNjgyLDEwICs2ODIsMTAgQEAKIAogCQkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrPTQpCiAJCQl7Ci0JCQkJdmVjW2ldICAgKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsKLQkJCQl2ZWNbaSsxXSArPSBhZGQxKCgqcDArKyksICgqcDErKykpOwotCQkJCXZlY1tpKzJdICs9IGFkZDEoKCpwMCsrKSwgKCpwMSsrKSk7Ci0JCQkJdmVjW2krM10gKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsKKwkJCQl2ZWNbaV0gICArPSBhZGQxKCgqcDArKyksICgqcDErKykpOyAgICAgICAKKwkJCQl2ZWNbaSsxXSArPSBhZGQxKCgqcDArKyksICgqcDErKykpOyAgICAgICAgCisJCQkJdmVjW2krMl0gKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsgICAgICAgIAorCQkJCXZlY1tpKzNdICs9IGFkZDEoKCpwMCsrKSwgKCpwMSsrKSk7ICAgICAgCiAJCQl9CiAJCX0KIAkJLyogbWVtb3Jpc2UgdGhlIGJlc3QgY29kZXZlY3RvciAqLwpAQCAtNjkzLDE1ICs2OTMsMTUgQEAKIAkJcyA9IHZvX0xfbXN1KHZvX0xfbXVsdChhbHBrLCBwcyksIHBzaywgYWxwKTsKIAkJaWYgKHMgPiAwKQogCQl7Ci0JCQlwc2sgPSBwczsKLQkJCWFscGsgPSBhbHA7CisJCQlwc2sgPSBwczsgICAgICAgICAgICAgICAgICAgICAgCisJCQlhbHBrID0gYWxwOyAgICAgICAgICAgICAgICAgICAgCiAJCQlmb3IgKGkgPSAwOyBpIDwgbmJfcHVsc2U7IGkrKykKIAkJCXsKLQkJCQljb2R2ZWNbaV0gPSBpbmRbaV07CisJCQkJY29kdmVjW2ldID0gaW5kW2ldOyAgICAgICAgCiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQogCQkJewotCQkJCXlbaV0gPSB2ZWNbaV07CisJCQkJeVtpXSA9IHZlY1tpXTsgICAgICAgICAgICAgCiAJCQl9CiAJCX0KIAl9CkBAIC03MTAsMTEgKzcxMCwxMSBAQAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJZm9yIChpID0gMDsgaSA8IE5QTUFYUFQgKiBOQl9UUkFDSzsgaSsrKQogCXsKLQkJaW5kW2ldID0gLTE7CisJCWluZFtpXSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspCiAJewotCQljb2RlW2ldID0gMDsKKwkJY29kZVtpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAKIAkJeVtpXSA9IHZvX3Nocl9yKHlbaV0sIDMpOyAgICAgICAgICAgICAgIC8qIFExMiB0byBROSAqLwogCX0KIAl2YWwgPSAoNTEyID4+IGhfc2hpZnQpOyAgICAgICAgICAgICAgIC8qIGNvZGV3b3JkIGluIFE5IGZvcm1hdCAqLwpAQCAtNzI3LDEyICs3MjcsMTIgQEAKIAogCQlpZiAoaiA+IDApCiAJCXsKLQkJCWNvZGVbaV0gKz0gdmFsOwotCQkJY29kdmVjW2tdICs9IDEyODsKKwkJCWNvZGVbaV0gKz0gdmFsOyAgIAorCQkJY29kdmVjW2tdICs9IDEyODsgIAogCQl9IGVsc2UKIAkJewotCQkJY29kZVtpXSAtPSB2YWw7Ci0JCQlpbmRleCArPSBOQl9QT1M7CisJCQljb2RlW2ldIC09IHZhbDsgICAKKwkJCWluZGV4ICs9IE5CX1BPUzsgICAgCiAJCX0KIAogCQlpID0gKFdvcmQxNikoKHZvX0xfbXVsdCh0cmFjaywgTlBNQVhQVCkgPj4gMSkpOwpAQCAtNzQxLDEwICs3NDEsMTAgQEAKIAkJewogCQkJaSArPSAxOwogCQl9Ci0JCWluZFtpXSA9IGluZGV4OworCQlpbmRbaV0gPSBpbmRleDsgICAgICAgICAgICAgICAgICAgIAogCX0KIAotCWsgPSAwOworCWsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCS8qIEJ1aWxkIGluZGV4IG9mIGNvZGV2ZWN0b3IgKi8KIAlpZihuYmJpdHMgPT0gMjApCiAJewpAQCAtODQ5LDIwICs4NDksMjAgQEAKIAkJcDIgPSAmdmVjW3Bvc107CiAJCWZvciAoaj1wb3M7aiA8IExfU1VCRlI7IGorKykKIAkJewotCQkJTF9zdW0xICs9ICpwMSAqICpwMjsKKwkJCUxfc3VtMSArPSAqcDEgKiAqcDI7CQkKIAkJCXAyLT0zOwotCQkJTF9zdW0yICs9ICpwMSsrICogKnAyOworCQkJTF9zdW0yICs9ICpwMSsrICogKnAyOwkJCiAJCQlwMis9NDsKIAkJfQogCQlwMi09MzsKLQkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7Ci0JCUxfc3VtMiArPSAqcDErKyAqICpwMisrOwotCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsKKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJCisJCUxfc3VtMiArPSAqcDErKyAqICpwMisrOwkKIAogCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOwogCQlMX3N1bTIgPSAoTF9zdW0yIDw8IDIpOwogCi0JCWNvcnIgPSB2b19yb3VuZChMX3N1bTEpOworCQljb3JyID0gdm9fcm91bmQoTF9zdW0xKTsJCiAJCSpjb3JfeCsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvc10pICsgKCpwMCsrKTsKIAkJY29yciA9IHZvX3JvdW5kKExfc3VtMik7CiAJCSpjb3JfeSsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvcy0zXSkgKyAoKnAzKyspOwpAQCAtODczLDIwICs4NzMsMjAgQEAKIAkJcDIgPSAmdmVjW3Bvc107CiAJCWZvciAoaj1wb3M7aiA8IExfU1VCRlI7IGorKykKIAkJewotCQkJTF9zdW0xICs9ICpwMSAqICpwMjsKKwkJCUxfc3VtMSArPSAqcDEgKiAqcDI7CQkKIAkJCXAyLT0zOwotCQkJTF9zdW0yICs9ICpwMSsrICogKnAyOworCQkJTF9zdW0yICs9ICpwMSsrICogKnAyOwkJCiAJCQlwMis9NDsKIAkJfQogCQlwMi09MzsKLQkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7Ci0JCUxfc3VtMiArPSAqcDErKyAqICpwMisrOwotCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsKKwkJTF9zdW0yICs9ICpwMSsrICogKnAyKys7CQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJCisJCUxfc3VtMiArPSAqcDErKyAqICpwMisrOwkKIAogCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOwogCQlMX3N1bTIgPSAoTF9zdW0yIDw8IDIpOwogCi0JCWNvcnIgPSB2b19yb3VuZChMX3N1bTEpOworCQljb3JyID0gdm9fcm91bmQoTF9zdW0xKTsJCiAJCSpjb3JfeCsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvc10pICsgKCpwMCsrKTsKIAkJY29yciA9IHZvX3JvdW5kKExfc3VtMik7CiAJCSpjb3JfeSsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvcy0zXSkgKyAoKnAzKyspOwpAQCAtOTgyLDE3ICs5ODIsMTcgQEAKIAlXb3JkMTYgKnAwLCAqcDEsICpwMjsKIAlXb3JkMzIgcywgYWxwMCwgYWxwMSwgYWxwMjsKIAotCXAwID0gY29yX3g7Ci0JcDEgPSBjb3JfeTsKLQlwMiA9IHJyaXhpeVt0cmFja194XTsKKwlwMCA9IGNvcl94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlwMSA9IGNvcl95OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlwMiA9IHJyaXhpeVt0cmFja194XTsgICAgICAgICAgICAgICAgICAKIAogCXRocmVzX2l4ID0gbmJfcG9zX2l4IC0gTkJfTUFYOwogCiAJYWxwMCA9IExfZGVwb3NpdF9oKCphbHApOwogCWFscDAgPSAoYWxwMCArIDB4MDAwMDgwMDBMKTsgICAgICAgLyogZm9yIHJvdW5kaW5nICovCiAKLQlzcWsgPSAtMTsKLQlhbHBrID0gMTsKKwlzcWsgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlhbHBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoeCA9IHRyYWNrX3g7IHggPCBMX1NVQkZSOyB4ICs9IFNURVApCiAJewpAQCAtMTAxNCwxNyArMTAxNCwxNyBAQAogCiAJCQkJaWYgKHMgPiAwKQogCQkJCXsKLQkJCQkJc3FrID0gc3E7Ci0JCQkJCWFscGsgPSBhbHBfMTY7Ci0JCQkJCXBvcyA9IHk7CisJCQkJCXNxayA9IHNxOyAgICAgICAgICAgICAgCisJCQkJCWFscGsgPSBhbHBfMTY7ICAgICAgICAgCisJCQkJCXBvcyA9IHk7ICAgICAgICAgICAgICAgCiAJCQkJfQogCQkJfQogCQkJcDEgLT0gTkJfUE9TOwogCiAJCQlpZiAocG9zID49IDApCiAJCQl7Ci0JCQkJKml4ID0geDsKLQkJCQkqaXkgPSBwb3M7CisJCQkJKml4ID0geDsgICAgICAgICAgICAgICAgICAgCisJCQkJKml5ID0gcG9zOyAgICAgICAgICAgICAgICAgCiAJCQl9CiAJCX0gZWxzZQogCQl7CkBAIC0xMDMyLDggKzEwMzIsOCBAQAogCQl9CiAJfQogCi0JKnBzID0gYWRkMSgqcHMsIGFkZDEoZG5bKml4XSwgZG5bKml5XSkpOwotCSphbHAgPSBhbHBrOworCSpwcyA9IGFkZDEoKnBzLCBhZGQxKGRuWyppeF0sIGRuWyppeV0pKTsgCisJKmFscCA9IGFscGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKaW5kZXggYWNiYTUzMi4uNGY3ZmQ4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwpAQCAtNDksNyArNDksNyBAQAogCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOwogCQkJaSAtPSA0OwogCQl9Ci0JCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7CisJCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7ICAgCiAJCW4rKzsKIAogCQl0bXBIID0gaCtuOwpAQCAtNjYsNyArNjYsNyBAQAogCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOwogCQkJaSAtPSA0OwogCQl9Ci0JCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7CisJCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7ICAgIAogCQluKys7CiAKIAkJdG1wSCA9IGgrbjsKQEAgLTg0LDcgKzg0LDcgQEAKIAkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsKIAkJCWkgLT0gNDsKIAkJfQotCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OworCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OyAgIAogCQluKys7CiAKIAkJcyA9IDA7CkBAIC05OSw4ICs5OSw4IEBACiAJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7CiAJCQlpIC09IDQ7CiAJCX0KLQkJeVtuXSA9ICgoczw8MSkgKyAweDgwMDApPj4xNjsKLQkJbisrOworCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OyAgIAorCQluKys7ICAgICAgICAKIAl9CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb3JfaF94LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYwppbmRleCBkOTI0NWVkLi5iNjQ1ZmEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYwpAQCAtMTgsNyArMTgsNyBAQAogKiAgICAgICBGaWxlOiBjb3JfaF94LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICoJICAgRGVzY3JpcHRpb246Q29tcHV0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCAieFtdIiBhbmQgImhbXSIgICoKLSoJICAgICAgICAgICAgICAgRGVzaWduZWQgZm9yIGNvZGVib29rIHNlYXJjaCAoMjQgcHVsc2VzLCA0IHRyYWNrcywgICoKKyoJICAgICAgICAgICAgICAgRGVzaWduZWQgZm9yIGNvZGVib29rIHNlYXJjaCAoMjQgcHVsc2VzLCA0IHRyYWNrcywgICogCiAqCQkJCSAgIDQgcHVsc2VzIHBlciB0cmFjaywgMTYgcG9zaXRpb25zIGluIGVhY2ggdHJhY2spIHRvICAqCiAqCQkJCSAgIGF2b2lkIHNhdHVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTQ0LDggKzQ0LDggQEAKIAlXb3JkMzIgKnAzOwogCVdvcmQzMiBMX21heCwgTF9tYXgxLCBMX21heDIsIExfbWF4MzsKIAkvKiBmaXJzdCBrZWVwIHRoZSByZXN1bHQgb24gMzIgYml0cyBhbmQgZmluZCBhYnNvbHV0ZSBtYXhpbXVtICovCi0JTF90b3QgID0gMTsKLQlMX21heCAgPSAwOworCUxfdG90ICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCUxfbWF4ICA9IDA7IAogCUxfbWF4MSA9IDA7CiAJTF9tYXgyID0gMDsKIAlMX21heDMgPSAwOwpAQCAtNTcsMTEgKzU3LDExIEBACiAJCWZvciAoaiA9IGk7IGogPCBMX1NVQkZSOyBqKyspCiAJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsKIAotCQl5MzJbaV0gPSBMX3RtcDsKKwkJeTMyW2ldID0gTF90bXA7ICAgICAgICAgICAgICAgCiAJCUxfdG1wID0gKExfdG1wID4gMCk/IExfdG1wOi1MX3RtcDsKIAkJaWYoTF90bXAgPiBMX21heCkKIAkJewotCQkJTF9tYXggPSBMX3RtcDsKKwkJCUxfbWF4ID0gTF90bXA7ICAgICAgICAgICAgIAogCQl9CiAKIAkJTF90bXAgPSAxTDsKQEAgLTcwLDExICs3MCwxMSBAQAogCQlmb3IgKGogPSBpKzE7IGogPCBMX1NVQkZSOyBqKyspCiAJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsKIAotCQl5MzJbaSsxXSA9IExfdG1wOworCQl5MzJbaSsxXSA9IExfdG1wOyAgICAgICAgICAgICAgIAogCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7CiAJCWlmKExfdG1wID4gTF9tYXgxKQogCQl7Ci0JCQlMX21heDEgPSBMX3RtcDsKKwkJCUxfbWF4MSA9IExfdG1wOyAgICAgICAgICAgICAKIAkJfQogCiAJCUxfdG1wID0gMTsKQEAgLTgzLDExICs4MywxMSBAQAogCQlmb3IgKGogPSBpKzI7IGogPCBMX1NVQkZSOyBqKyspCiAJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsKIAotCQl5MzJbaSsyXSA9IExfdG1wOworCQl5MzJbaSsyXSA9IExfdG1wOyAgICAgICAgICAgICAgIAogCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7CiAJCWlmKExfdG1wID4gTF9tYXgyKQogCQl7Ci0JCQlMX21heDIgPSBMX3RtcDsKKwkJCUxfbWF4MiA9IExfdG1wOyAgICAgICAgICAgICAKIAkJfQogCiAJCUxfdG1wID0gMTsKQEAgLTk2LDExICs5NiwxMSBAQAogCQlmb3IgKGogPSBpKzM7IGogPCBMX1NVQkZSOyBqKyspCiAJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsKIAotCQl5MzJbaSszXSA9IExfdG1wOworCQl5MzJbaSszXSA9IExfdG1wOyAgICAgICAgICAgICAgIAogCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7CiAJCWlmKExfdG1wID4gTF9tYXgzKQogCQl7Ci0JCQlMX21heDMgPSBMX3RtcDsKKwkJCUxfbWF4MyA9IExfdG1wOyAgICAgICAgICAgICAKIAkJfQogCX0KIAkvKiB0b3QgKz0gMyptYXggLyA4ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlY2ltNTQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCmluZGV4IDNiODg1MTQuLjdiYzU1NzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCkBAIC0xMzYsOCArMTM2LDggQEAKIAkJTF9zdW0gKz0gdm9fbXVsdDMyKCgqeCsrKSwoKnkrKykpOwogCQlMX3N1bSArPSB2b19tdWx0MzIoKCp4KSwoKnkpKTsKIAotCQlMX3N1bSA9IExfc2hsMihMX3N1bSwgMik7Ci0JCXNpZ19kW2pdID0gZXh0cmFjdF9oKExfYWRkKExfc3VtLCAweDgwMDApKTsKKwkJTF9zdW0gPSBMX3NobDIoTF9zdW0sIDIpOyAgICAgICAgICAgICAgCisJCXNpZ19kW2pdID0gZXh0cmFjdF9oKExfYWRkKExfc3VtLCAweDgwMDApKTsgCiAJCXBvcyArPSBGQUM1OyAgICAgICAgICAgICAgLyogcG9zICsgNS80ICovCiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVlbXBoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlZW1waC5jCmluZGV4IDBjNDlkNmIuLjRlZTE0NDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVlbXBoLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYwpAQCAtMzksMTYgKzM5LDE2IEBACiAKIAlMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOwogCUxfdG1wID0gTF9tYWMoTF90bXAsICptZW0sIG11KTsKLQl4WzBdID0gdm9fcm91bmQoTF90bXApOworCXhbMF0gPSB2b19yb3VuZChMX3RtcCk7ICAgICAgICAgICAgICAgICAgIAogCiAJZm9yIChpID0gMTsgaSA8IEw7IGkrKykKIAl7CiAJCUxfdG1wID0gTF9kZXBvc2l0X2goeFtpXSk7CiAJCUxfdG1wID0gTF9tYWMoTF90bXAsIHhbaSAtIDFdLCBtdSk7Ci0JCXhbaV0gPSB2b3JvdW5kKExfdG1wKTsKKwkJeFtpXSA9IHZvcm91bmQoTF90bXApOyAgICAgICAgICAgICAgIAogCX0KIAotCSptZW0gPSB4W0wgLSAxXTsKKwkqbWVtID0geFtMIC0gMV07ICAgICAgICAgICAgICAgICAgICAgICAKIAogCXJldHVybjsKIH0KQEAgLTY1LDE0ICs2NSwxNCBAQAogCVdvcmQzMiBMX3RtcDsKIAlMX3RtcCA9IHhbMF0gPDwgMTU7CiAJTF90bXAgKz0gKCgqbWVtKSAqIG11KTw8MTsKLQl4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisJeFswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAxOyBpIDwgTDsgaSsrKQogCXsKIAkJTF90bXAgPSB4W2ldIDw8IDE1OwogCQlMX3RtcCArPSAoeFtpIC0gMV0gKiBtdSk8PDE7Ci0JCXhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKwkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIAogCX0KLQkqbWVtID0geFtMIC0gMV07CisJKm1lbSA9IHhbTCAtIDFdOyAgICAgICAgICAgICAgICAgICAgICAgCiAJcmV0dXJuOwogfQogCkBAIC05NSw4ICs5NSw4IEBACiAJTF90bXAgKz0gKHhfbG9bMF0gKiA4KTw8MTsKIAlMX3RtcCA9IChMX3RtcCA8PCAzKTsKIAlMX3RtcCArPSAoKCptZW0pICogZmFjKTw8MTsKLQlMX3RtcCA9IChMX3RtcCA8PCAxKTsKLQl5WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisJTF90bXAgPSAoTF90bXAgPDwgMSk7ICAgICAgICAgICAgICAgCisJeVswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgICAgIAogCiAJZm9yIChpID0gMTsgaSA8IEw7IGkrKykKIAl7CkBAIC0xMDQsMTEgKzEwNCwxMSBAQAogCQlMX3RtcCArPSAoeF9sb1tpXSAqIDgpPDwxOwogCQlMX3RtcCA9IChMX3RtcCA8PCAzKTsKIAkJTF90bXAgKz0gKHlbaSAtIDFdICogZmFjKTw8MTsKLQkJTF90bXAgPSAoTF90bXAgPDwgMSk7Ci0JCXlbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKwkJTF90bXAgPSAoTF90bXAgPDwgMSk7ICAgICAgICAgICAKKwkJeVtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIAogCX0KIAotCSptZW0gPSB5W0wgLSAxXTsKKwkqbWVtID0geVtMIC0gMV07ICAgICAgICAgICAgICAgICAgICAgICAKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZHR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2R0eC5jCmluZGV4IDJjZmFjZWQuLmRmNTMxMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZHR4LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYwpAQCAtMTA1LDMwICsxMDUsMzAgQEAKIAkJZnByaW50ZihzdGRlcnIsICJkdHhfZW5jX3Jlc2V0OiBpbnZhbGlkIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0Jc3QtPmhpc3RfcHRyID0gMDsKLQlzdC0+bG9nX2VuX2luZGV4ID0gMDsKKwlzdC0+aGlzdF9wdHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAKKwlzdC0+bG9nX2VuX2luZGV4ID0gMDsgICAgICAgICAgICAgICAgICAKIAogCS8qIEluaXQgaXNmX2hpc3RbXSAqLwogCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspCiAJewogCQlDb3B5KGlzZl9pbml0LCAmc3QtPmlzZl9oaXN0W2kgKiBNXSwgTSk7CiAJfQotCXN0LT5jbmdfc2VlZCA9IFJBTkRPTV9JTklUU0VFRDsKKwlzdC0+Y25nX3NlZWQgPSBSQU5ET01fSU5JVFNFRUQ7ICAgICAgIAogCiAJLyogUmVzZXQgZW5lcmd5IGhpc3RvcnkgKi8KIAlTZXRfemVybyhzdC0+bG9nX2VuX2hpc3QsIERUWF9ISVNUX1NJWkUpOwogCi0Jc3QtPmR0eEhhbmdvdmVyQ291bnQgPSBEVFhfSEFOR19DT05TVDsKLQlzdC0+ZGVjQW5hRWxhcHNlZENvdW50ID0gMzI3Njc7CisJc3QtPmR0eEhhbmdvdmVyQ291bnQgPSBEVFhfSEFOR19DT05TVDsgCisJc3QtPmRlY0FuYUVsYXBzZWRDb3VudCA9IDMyNzY3OyAgICAgICAgCiAKIAlmb3IgKGkgPSAwOyBpIDwgMjg7IGkrKykKIAl7Ci0JCXN0LT5EW2ldID0gMDsKKwkJc3QtPkRbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRSAtIDE7IGkrKykKIAl7Ci0JCXN0LT5zdW1EW2ldID0gMDsKKwkJc3QtPnN1bURbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTI3OSw3ICsyNzksNyBAQAogCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspCiAJewogCQl0bXAgPSBtdWx0KGV4YzJbaV0sIGdhaW4pOyAgICAgICAgIC8qIFEwICogUTE1ICovCi0JCWV4YzJbaV0gPSBzaGwodG1wLCBleHApOworCQlleGMyW2ldID0gc2hsKHRtcCwgZXhwKTsgCiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAogCVdvcmQxNiBsb2dfZW5fZTsKIAlXb3JkMTYgbG9nX2VuX207Ci0Jc3QtPmhpc3RfcHRyID0gYWRkKHN0LT5oaXN0X3B0ciwgMSk7CisJc3QtPmhpc3RfcHRyID0gYWRkKHN0LT5oaXN0X3B0ciwgMSk7IAogCWlmKHN0LT5oaXN0X3B0ciA9PSBEVFhfSElTVF9TSVpFKQogCXsKIAkJc3QtPmhpc3RfcHRyID0gMDsKQEAgLTM0NSw3ICszNDUsNyBAQAogewogCiAJLyogdGhpcyBzdGF0ZSBtYWNoaW5lIGlzIGluIHN5bmNoIHdpdGggdGhlIEdTTUVGUiB0eER0eCBtYWNoaW5lICAgICAgKi8KLQlzdC0+ZGVjQW5hRWxhcHNlZENvdW50ID0gYWRkKHN0LT5kZWNBbmFFbGFwc2VkQ291bnQsIDEpOworCXN0LT5kZWNBbmFFbGFwc2VkQ291bnQgPSBhZGQoc3QtPmRlY0FuYUVsYXBzZWRDb3VudCwgMSk7IAogCiAJaWYgKHZhZF9mbGFnICE9IDApCiAJewpAQCAtMzU0LDggKzM1NCw4IEBACiAJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uLXNwZWVjaCAqLwogCQlpZiAoc3QtPmR0eEhhbmdvdmVyQ291bnQgPT0gMCkKIAkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgb2YgZGVjb2RlciBhbmFseXNpcyBoYW5nb3ZlciAgKi8KLQkJCXN0LT5kZWNBbmFFbGFwc2VkQ291bnQgPSAwOwotCQkJKnVzZWRNb2RlID0gTVJEVFg7CisJCQlzdC0+ZGVjQW5hRWxhcHNlZENvdW50ID0gMDsgICAgCisJCQkqdXNlZE1vZGUgPSBNUkRUWDsgICAgICAgICAgICAKIAkJfSBlbHNlCiAJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gcG9zc2libGUgYW5hbHlzaXMgaGFuZ292ZXIgKi8KIAkJCXN0LT5kdHhIYW5nb3ZlckNvdW50ID0gc3ViKHN0LT5kdHhIYW5nb3ZlckNvdW50LCAxKTsKQEAgLTM5NCw4ICszOTQsOCBAQAogCQl7CiAJCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQogCQkJewotCQkJCWlzZl90bXBbayAqIE0gKyBpXSA9IGlzZl9vbGRbaW5kaWNlc1trXSAqIE0gKyBpXTsKLQkJCQlpc2Zfb2xkW2luZGljZXNba10gKiBNICsgaV0gPSBpc2Zfb2xkW2luZGljZXNbMl0gKiBNICsgaV07CisJCQkJaXNmX3RtcFtrICogTSArIGldID0gaXNmX29sZFtpbmRpY2VzW2tdICogTSArIGldOyAgICAgIAorCQkJCWlzZl9vbGRbaW5kaWNlc1trXSAqIE0gKyBpXSA9IGlzZl9vbGRbaW5kaWNlc1syXSAqIE0gKyBpXTsgICAgCiAJCQl9CiAJCX0KIAl9CkBAIC00MDMsMTMgKzQwMywxMyBAQAogCS8qIFBlcmZvcm0gdGhlIElTRiBhdmVyYWdpbmcgKi8KIAlmb3IgKGogPSAwOyBqIDwgTTsgaisrKQogCXsKLQkJTF90bXAgPSAwOworCQlMX3RtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIAogCiAJCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspCiAJCXsKIAkJCUxfdG1wID0gTF9hZGQoTF90bXAsIExfZGVwb3NpdF9sKGlzZl9vbGRbaSAqIE0gKyBqXSkpOwogCQl9Ci0JCWlzZl9hdmVyW2pdID0gTF90bXA7CisJCWlzZl9hdmVyW2pdID0gTF90bXA7ICAgICAgICAgICAgICAKIAl9CiAKIAkvKiBSZXRyaWV2ZSBmcm9tIGlzZl90bXBbXVtdIHRoZSBJU0YgdmVjdG9ycyBzYXZlZCBwcmlvciB0byBhdmVyYWdpbmcgKi8KQEAgLTQ0MSwxMiArNDQxLDEyIEBACiAJLyogc3VtIHN1bURbMC4uRFRYX0hJU1RfU0laRS0xXS4gc3VtRFtEVFhfSElTVF9TSVpFXSBpcyAgICAqLwogCS8qIG5vdCB1cGRhdGVkIHNpbmNlIGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4gICAgICAgICAgICovCiAKLQl0bXAgPSBEVFhfSElTVF9TSVpFX01JTl9PTkU7Ci0JaiA9IC0xOworCXRtcCA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgICAgICAgICAgIAorCWogPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFX01JTl9PTkU7IGkrKykKIAl7CiAJCWogPSBhZGQoaiwgdG1wKTsKLQkJc3QtPnN1bURbaV0gPSBMX3N1YihzdC0+c3VtRFtpXSwgc3QtPkRbal0pOworCQlzdC0+c3VtRFtpXSA9IExfc3ViKHN0LT5zdW1EW2ldLCBzdC0+RFtqXSk7ICAgICAKIAkJdG1wID0gc3ViKHRtcCwgMSk7CiAJfQogCkBAIC00NTgsODYgKzQ1OCw4NiBAQAogCiAJZm9yIChpID0gRFRYX0hJU1RfU0laRV9NSU5fT05FOyBpID4gMDsgaS0tKQogCXsKLQkJc3QtPnN1bURbaV0gPSBzdC0+c3VtRFtpIC0gMV07CisJCXN0LT5zdW1EW2ldID0gc3QtPnN1bURbaSAtIDFdOyAgICAgCiAJfQotCXN0LT5zdW1EWzBdID0gMDsKKwlzdC0+c3VtRFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAKIAogCS8qIFJlbW92ZSB0aGUgb2xkZXN0IGZyYW1lIGZyb20gdGhlIGRpc3RhbmNlIG1hdHJpeC4gICAgICAgICAgICovCiAJLyogTm90ZSB0aGF0IHRoZSBkaXN0YW5jZSBtYXRyaXggaXMgcmVwbGFjZWQgYnkgYSBvbmUtICAgICAgICAgKi8KIAkvKiBkaW1lbnNpb25hbCBhcnJheSB0byBzYXZlIHN0YXRpYyBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAqLwogCi0JdG1wID0gMDsKKwl0bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAyNzsgaSA+PSAxMjsgaSA9IChXb3JkMTYpIChpIC0gdG1wKSkKIAl7CiAJCXRtcCA9IGFkZCh0bXAsIDEpOwogCQlmb3IgKGogPSB0bXA7IGogPiAwOyBqLS0pCiAJCXsKLQkJCXN0LT5EW2kgLSBqICsgMV0gPSBzdC0+RFtpIC0gaiAtIHRtcF07CisJCQlzdC0+RFtpIC0gaiArIDFdID0gc3QtPkRbaSAtIGogLSB0bXBdOyAgIAogCQl9CiAJfQogCiAJLyogQ29tcHV0ZSB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBkaXN0YW5jZSBtYXRyaXggRCAgICAgICAgICAgICovCiAJLyogKHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlcyBmcm9tIGlzZjFbXSB0byBpc2Zfb2xkX3R4W11bXSkuICovCiAKLQlwdHIgPSBzdC0+aGlzdF9wdHI7CisJcHRyID0gc3QtPmhpc3RfcHRyOyAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMTsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykKIAl7CiAJCS8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGxhdGVzdCBpc2YgYW5kIHRoZSBvdGhlciBpc2ZzLiAqLwogCQlwdHIgPSBzdWIocHRyLCAxKTsKIAkJaWYgKHB0ciA8IDApCiAJCXsKLQkJCXB0ciA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsKKwkJCXB0ciA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgICAKIAkJfQotCQlMX3RtcCA9IDA7CisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCWZvciAoaiA9IDA7IGogPCBNOyBqKyspCiAJCXsKIAkJCXRtcCA9IHN1Yihpc2Zfb2xkX3R4W3N0LT5oaXN0X3B0ciAqIE0gKyBqXSwgaXNmX29sZF90eFtwdHIgKiBNICsgal0pOwogCQkJTF90bXAgPSBMX21hYyhMX3RtcCwgdG1wLCB0bXApOwogCQl9Ci0JCXN0LT5EW2kgLSAxXSA9IExfdG1wOworCQlzdC0+RFtpIC0gMV0gPSBMX3RtcDsgICAgICAgICAgIAogCiAJCS8qIFVwZGF0ZSBhbHNvIHRoZSBjb2x1bW4gc3Vtcy4gKi8KLQkJc3QtPnN1bURbMF0gPSBMX2FkZChzdC0+c3VtRFswXSwgc3QtPkRbaSAtIDFdKTsKLQkJc3QtPnN1bURbaV0gPSBMX2FkZChzdC0+c3VtRFtpXSwgc3QtPkRbaSAtIDFdKTsKKwkJc3QtPnN1bURbMF0gPSBMX2FkZChzdC0+c3VtRFswXSwgc3QtPkRbaSAtIDFdKTsgCisJCXN0LT5zdW1EW2ldID0gTF9hZGQoc3QtPnN1bURbaV0sIHN0LT5EW2kgLSAxXSk7IAogCX0KIAogCS8qIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZGlzdGFuY2VzICovCi0Jc3VtbWF4ID0gc3QtPnN1bURbMF07Ci0Jc3VtbWluID0gc3QtPnN1bURbMF07Ci0JaW5kaWNlc1swXSA9IDA7Ci0JaW5kaWNlc1syXSA9IDA7CisJc3VtbWF4ID0gc3QtPnN1bURbMF07ICAgICAgICAgICAgICAgICAgCisJc3VtbWluID0gc3QtPnN1bURbMF07ICAgICAgICAgICAgICAgICAgCisJaW5kaWNlc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCisJaW5kaWNlc1syXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMTsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykKIAl7CiAJCWlmIChMX3N1YihzdC0+c3VtRFtpXSwgc3VtbWF4KSA+IDApCiAJCXsKLQkJCWluZGljZXNbMF0gPSBpOwotCQkJc3VtbWF4ID0gc3QtPnN1bURbaV07CisJCQlpbmRpY2VzWzBdID0gaTsgICAgICAgICAgICAgICAgCisJCQlzdW1tYXggPSBzdC0+c3VtRFtpXTsgICAgICAgICAgCiAJCX0KIAkJaWYgKExfc3ViKHN0LT5zdW1EW2ldLCBzdW1taW4pIDwgMCkKIAkJewotCQkJaW5kaWNlc1syXSA9IGk7Ci0JCQlzdW1taW4gPSBzdC0+c3VtRFtpXTsKKwkJCWluZGljZXNbMl0gPSBpOyAgICAgICAgICAgICAgICAKKwkJCXN1bW1pbiA9IHN0LT5zdW1EW2ldOyAgICAgICAgICAKIAkJfQogCX0KIAogCS8qIEZpbmQgdGhlIHNlY29uZCBsYXJnZXN0IGRpc3RhbmNlICovCi0Jc3VtbWF4Mm5kID0gLTIxNDc0ODM2NDdMOwotCWluZGljZXNbMV0gPSAtMTsKKwlzdW1tYXgybmQgPSAtMjE0NzQ4MzY0N0w7ICAgICAgICAgICAgICAKKwlpbmRpY2VzWzFdID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRTsgaSsrKQogCXsKIAkJaWYgKChMX3N1YihzdC0+c3VtRFtpXSwgc3VtbWF4Mm5kKSA+IDApICYmIChzdWIoaSwgaW5kaWNlc1swXSkgIT0gMCkpCiAJCXsKLQkJCWluZGljZXNbMV0gPSBpOwotCQkJc3VtbWF4Mm5kID0gc3QtPnN1bURbaV07CisJCQlpbmRpY2VzWzFdID0gaTsgICAgICAgICAgICAgICAgCisJCQlzdW1tYXgybmQgPSBzdC0+c3VtRFtpXTsgICAgICAgCiAJCX0KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCXsKLQkJaW5kaWNlc1tpXSA9IHN1YihzdC0+aGlzdF9wdHIsIGluZGljZXNbaV0pOworCQlpbmRpY2VzW2ldID0gc3ViKHN0LT5oaXN0X3B0ciwgaW5kaWNlc1tpXSk7ICAgICAKIAkJaWYgKGluZGljZXNbaV0gPCAwKQogCQl7Ci0JCQlpbmRpY2VzW2ldID0gYWRkKGluZGljZXNbaV0sIERUWF9ISVNUX1NJWkUpOworCQkJaW5kaWNlc1tpXSA9IGFkZChpbmRpY2VzW2ldLCBEVFhfSElTVF9TSVpFKTsgICAgICAgCiAJCX0KIAl9CiAKQEAgLTU0OSw3ICs1NDksNyBAQAogCUxfdG1wID0gTF9tdWx0KHZvcm91bmQoc3VtbWF4KSwgSU5WX01FRF9USFJFU0gpOwogCWlmKExfdG1wIDw9IHN1bW1pbikKIAl7Ci0JCWluZGljZXNbMF0gPSAtMTsKKwkJaW5kaWNlc1swXSA9IC0xOyAKIAl9CiAJLyogSWYgc2Vjb25kIGxhcmdlc3QgZGlzdGFuY2UvTUVEX1RIUkVTSCBpcyBzbWFsbGVyIHRoYW4gICAgICovCiAJLyogbWluaW11bSBkaXN0YW5jZSB0aGVuIHRoZSBtZWRpYW4gSVNGIHZlY3RvciByZXBsYWNlbWVudCBpcyAgICAqLwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJTF90bXAgPSBMX211bHQodm9yb3VuZChzdW1tYXgybmQpLCBJTlZfTUVEX1RIUkVTSCk7CiAJaWYoTF90bXAgPD0gc3VtbWluKQogCXsKLQkJaW5kaWNlc1sxXSA9IC0xOworCQlpbmRpY2VzWzFdID0gLTE7ICAgICAgICAgICAgICAgICAKIAl9CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9nX3BpdGNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwppbmRleCBkNjgxZjJlLi5mNTExMmM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAKICNlbmRpZgogCi0JZ19jb2VmZlswXSA9IHl5OwotCWdfY29lZmZbMV0gPSBleHBfeXk7Ci0JZ19jb2VmZlsyXSA9IHh5OwotCWdfY29lZmZbM10gPSBleHBfeHk7CisJZ19jb2VmZlswXSA9IHl5OyAgICAgICAgICAgICAgICAgICAgICAgCisJZ19jb2VmZlsxXSA9IGV4cF95eTsgICAgICAgICAgICAgICAgICAgCisJZ19jb2VmZlsyXSA9IHh5OyAgICAgICAgICAgICAgICAgICAgICAgCisJZ19jb2VmZlszXSA9IGV4cF94eTsgICAgICAgICAgICAgICAgICAgCiAKIAkvKiBJZiAoeHkgPCAwKSBnYWluID0gMCAqLwogCWlmICh4eSA8IDApCkBAIC02NSwxMiArNjUsMTIgQEAKIAlpID0gZXhwX3h5OwogCWkgLT0gZXhwX3l5OwogCi0JZ2FpbiA9IHNobChnYWluLCBpKTsKKwlnYWluID0gc2hsKGdhaW4sIGkpOyAgICAgICAgICAgICAgICAgICAKIAogCS8qIGlmIChnYWluID4gMS4yKSBnYWluID0gMS4yICBpbiBRMTQgKi8KIAlpZihnYWluID4gMTk2NjEpCiAJewotCQlnYWluID0gMTk2NjE7CisJCWdhaW4gPSAxOTY2MTsgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCXJldHVybiAoZ2Fpbik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dwY2xpcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ncGNsaXAuYwppbmRleCA4MDBiM2Y5Li4yNDE1OGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dwY2xpcC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICogICAgICBjYXNlIG9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgIGEgcmVzb25hbmNlIG9uIExQQyBmaWx0ZXIobHBfZGlzcCA8IDYwSHopICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgYSBnb29kIHBpdGNoIHByZWRpY3Rpb24gKGxwX2dwID4gMC45NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAidHlwZWRlZi5oIgogI2luY2x1ZGUgImJhc2ljX29wLmgiCkBAIC0zOCw4ICszOCw4IEBACiAJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovCiAJCSkKIHsKLQltZW1bMF0gPSBESVNUX0lTRl9NQVg7Ci0JbWVtWzFdID0gR0FJTl9QSVRfTUlOOworCW1lbVswXSA9IERJU1RfSVNGX01BWDsgICAgICAgICAgICAgICAgIAorCW1lbVsxXSA9IEdBSU5fUElUX01JTjsgICAgICAgICAgICAgICAgIAogfQogCiAKQEAgLTQ5LDcgKzQ5LDcgQEAKIHsKIAlXb3JkMTYgY2xpcCA9IDA7CiAJaWYgKChtZW1bMF0gPCBESVNUX0lTRl9USFJFUykgJiYgKG1lbVsxXSA+IEdBSU5fUElUX1RIUkVTKSkKLQkJY2xpcCA9IDE7CisJCWNsaXAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlyZXR1cm4gKGNsaXApOwogfQpAQCAtNzAsNyArNzAsNyBAQAogCQlkaXN0ID0gdm9fc3ViKGlzZltpXSwgaXNmW2kgLSAxXSk7CiAJCWlmKGRpc3QgPCBkaXN0X21pbikKIAkJewotCQkJZGlzdF9taW4gPSBkaXN0OworCQkJZGlzdF9taW4gPSBkaXN0OyAgICAgICAgICAgICAgIAogCQl9CiAJfQogCkBAIC03OCw5ICs3OCw5IEBACiAKIAlpZiAoZGlzdCA+IERJU1RfSVNGX01BWCkKIAl7Ci0JCWRpc3QgPSBESVNUX0lTRl9NQVg7CisJCWRpc3QgPSBESVNUX0lTRl9NQVg7ICAgICAgICAgICAgICAgCiAJfQotCW1lbVswXSA9IGRpc3Q7CisJbWVtWzBdID0gZGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAKIAogCXJldHVybjsKIH0KQEAgLTEwMCw5ICsxMDAsOSBAQAogCiAJaWYoZ2FpbiA8IEdBSU5fUElUX01JTikKIAl7Ci0JCWdhaW4gPSBHQUlOX1BJVF9NSU47CisJCWdhaW4gPSBHQUlOX1BJVF9NSU47ICAgICAgICAgICAgICAKIAl9Ci0JbWVtWzFdID0gZ2FpbjsKKwltZW1bMV0gPSBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYwppbmRleCBhNmY5NzAxLi5mYTY2ZjFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDQwMC5jCkBAIC02OCw4ICs2OCw4IEBACiAJeTJfbG8gPSAqbWVtKys7CiAJeTFfaGkgPSAqbWVtKys7CiAJeTFfbG8gPSAqbWVtKys7Ci0JeDAgPSAqbWVtKys7Ci0JeDEgPSAqbWVtOworCXgwID0gKm1lbSsrOyAgIAorCXgxID0gKm1lbTsgICAKIAludW0gPSAoV29yZDMyKWxnOwogCWRvCiAJewpAQCAtOTgsNyArOTgsNyBAQAogCSptZW0tLSA9IHkxX2xvOwogCSptZW0tLSA9IHkxX2hpOwogCSptZW0tLSA9IHkyX2xvOwotCSptZW0gICA9IHkyX2hpOworCSptZW0gICA9IHkyX2hpOyAgCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNTAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCmluZGV4IGMxYzdiODMuLjM2ZGQxZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCkBAIC03MCw3ICs3MCw3IEBACiAJeTJfbG8gPSAqbWVtKys7CiAJeTFfaGkgPSAqbWVtKys7CiAJeTFfbG8gPSAqbWVtKys7Ci0JeDAgPSAqbWVtKys7CisJeDAgPSAqbWVtKys7ICAgCiAJeDEgPSAqbWVtOwogCW51bSA9IChXb3JkMzIpbGc7CiAJZG8KQEAgLTk4LDcgKzk4LDcgQEAKIAkqbWVtLS0gPSB5MV9sbzsKIAkqbWVtLS0gPSB5MV9oaTsKIAkqbWVtLS0gPSB5Ml9sbzsKLQkqbWVtLS0gPSB5Ml9oaTsKKwkqbWVtLS0gPSB5Ml9oaTsgIAogCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDZrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYwppbmRleCA4ZTY2ZWIwLi41Nzg2MzNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYwpAQCAtMjAsNyArMjAsNyBAQAogKglEZXNjcmlwdGlvbjoxNXRoIG9yZGVyIGJhbmQgcGFzcyA2a0h6IHRvIDdrSHogRklSIGZpbHRlciAgICAgICAgKgogKiAgICAgICBmcmVxdWVuY3k6IDRrSHogICA1a0h6ICA1LjVrSHogIDZrSHogIDYuNWtIeiAgN2tIeiA3LjVrSHogOGtIeiAgKgogKglkQiBsb3NzOiAgLTYwZEIgIC00NWRCICAtMTNkQiAgIC0zZEIgICAwZEIgICAgLTNkQiAtMTNkQiAgLTQ1ZEIgKgotKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0eXBlZGVmLmgiCkBAIC02Myw3ICs2Myw3IEBACiAJZm9yIChpID0gbGcgLSAxOyBpID49IDA7IGktLSkKIAl7CiAJCXhbaSArIExfRklSIC0gMV0gPSBzaWduYWxbaV0gPj4gMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2FpbiBvZiBmaWx0ZXIgPSA0ICovCi0JfQorCX0JCiAJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspCiAJewogCQlMX3RtcCA9ICAoeFtpXSArIHhbaSsgMzBdKSAqIGZpcl82a183a1swXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jCmluZGV4IGJjMWVjNDkuLjM1MTAyNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocF93c3AuYwpAQCAtODgsMjIgKzg4LDIyIEBACiAJV29yZDE2IHkzX2hpLCB5M19sbywgeTJfaGksIHkyX2xvLCB5MV9oaSwgeTFfbG87CiAJV29yZDMyIGksIExfdG1wOwogCi0JeTNfaGkgPSBtZW1bMF07Ci0JeTNfbG8gPSBtZW1bMV07Ci0JeTJfaGkgPSBtZW1bMl07Ci0JeTJfbG8gPSBtZW1bM107Ci0JeTFfaGkgPSBtZW1bNF07Ci0JeTFfbG8gPSBtZW1bNV07Ci0JeDAgPSBtZW1bNl07Ci0JeDEgPSBtZW1bN107Ci0JeDIgPSBtZW1bOF07CisJeTNfaGkgPSBtZW1bMF07ICAgICAgICAgICAgICAgICAgICAgICAgCisJeTNfbG8gPSBtZW1bMV07ICAgICAgICAgICAgICAgICAgICAgICAgCisJeTJfaGkgPSBtZW1bMl07ICAgICAgICAgICAgICAgICAgICAgICAgCisJeTJfbG8gPSBtZW1bM107ICAgICAgICAgICAgICAgICAgICAgICAgCisJeTFfaGkgPSBtZW1bNF07ICAgICAgICAgICAgICAgICAgICAgICAgCisJeTFfbG8gPSBtZW1bNV07ICAgICAgICAgICAgICAgICAgICAgICAgCisJeDAgPSBtZW1bNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDEgPSBtZW1bN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDIgPSBtZW1bOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykKIAl7Ci0JCXgzID0geDI7Ci0JCXgyID0geDE7Ci0JCXgxID0geDA7Ci0JCXgwID0gd3NwW2ldOworCQl4MyA9IHgyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl4MiA9IHgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl4MSA9IHgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl4MCA9IHdzcFtpXTsgICAgICAgICAgICAgICAgICAgICAgIAogCQkvKiB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiMTQwWzJdKnhbaS0yXSArIGJbM10qeFtpLTNdICAqLwogCQkvKiArIGFbMV0qeVtpLTFdICsgYVsyXSAqIHlbaS0yXSAgKyBhWzNdKnlbaS0zXSAgKi8KIApAQCAtMTIyLDI1ICsxMjIsMjUgQEAKIAogCQlMX3RtcCA9IExfdG1wIDw8IDI7CiAKLQkJeTNfaGkgPSB5Ml9oaTsKLQkJeTNfbG8gPSB5Ml9sbzsKLQkJeTJfaGkgPSB5MV9oaTsKLQkJeTJfbG8gPSB5MV9sbzsKKwkJeTNfaGkgPSB5Ml9oaTsgICAgICAgICAgICAgICAgICAgICAKKwkJeTNfbG8gPSB5Ml9sbzsgICAgICAgICAgICAgICAgICAgICAKKwkJeTJfaGkgPSB5MV9oaTsgICAgICAgICAgICAgICAgICAgICAKKwkJeTJfbG8gPSB5MV9sbzsgCiAJCXkxX2hpID0gTF90bXAgPj4gMTY7CiAJCXkxX2xvID0gKExfdG1wICYgMHhmZmZmKSA+PjE7CiAKLQkJaHBfd3NwW2ldID0gKExfdG1wICsgMHg0MDAwKT4+MTU7CisJCWhwX3dzcFtpXSA9IChMX3RtcCArIDB4NDAwMCk+PjE1OyAgICAgICAgICAKIAl9CiAKLQltZW1bMF0gPSB5M19oaTsKLQltZW1bMV0gPSB5M19sbzsKLQltZW1bMl0gPSB5Ml9oaTsKLQltZW1bM10gPSB5Ml9sbzsKLQltZW1bNF0gPSB5MV9oaTsKLQltZW1bNV0gPSB5MV9sbzsKLQltZW1bNl0gPSB4MDsKLQltZW1bN10gPSB4MTsKLQltZW1bOF0gPSB4MjsKKwltZW1bMF0gPSB5M19oaTsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bMV0gPSB5M19sbzsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bMl0gPSB5Ml9oaTsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bM10gPSB5Ml9sbzsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bNF0gPSB5MV9oaTsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bNV0gPSB5MV9sbzsgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bNl0gPSB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bN10gPSB4MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwltZW1bOF0gPSB4MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaW50X2xwYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKaW5kZXggMTExOWJjNy4uODgyODVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKQEAgLTM2LDIxICszNiwyMSBAQAogCQlXb3JkMTYgQXpbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogTFAgY29lZmZpY2llbnRzIGluIDQgc3ViZnJhbWVzICAgICovCiAJICAgICkKIHsKLQlXb3JkMzIgaSwgazsKKwlXb3JkMzIgaSwgazsgCiAJV29yZDE2IGZhY19vbGQsIGZhY19uZXc7CiAJV29yZDE2IGlzcFtNXTsKIAlXb3JkMzIgTF90bXA7CiAKIAlmb3IgKGsgPSAwOyBrIDwgMzsgaysrKQogCXsKLQkJZmFjX25ldyA9IGZyYWNba107CisJCWZhY19uZXcgPSBmcmFjW2tdOyAgICAgICAgICAgICAgICAKIAkJZmFjX29sZCA9ICgzMjc2NyAtIGZhY19uZXcpICsgMTsgIC8qIDEuMCAtIGZhY19uZXcgKi8KIAogCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQogCQl7CiAJCQlMX3RtcCA9IChpc3Bfb2xkW2ldICogZmFjX29sZCk8PDE7CiAJCQlMX3RtcCArPSAoaXNwX25ld1tpXSAqIGZhY19uZXcpPDwxOwotCQkJaXNwW2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisJCQlpc3BbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgIAogCQl9CiAJCUlzcF9Beihpc3AsIEF6LCBNLCAwKTsKIAkJQXogKz0gTVAxOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMKaW5kZXggMzBhOGJiZC4uYzIzNWM1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9hei5jCkBAIC00Miw3ICs0Miw3IEBACiAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgIDEgICA6IGFkYXB0aXZlIHNjYWxpbmcgZW5hYmxlZCAgKi8KIAkgICApCiB7Ci0JV29yZDMyIGksIGo7CisJV29yZDMyIGksIGo7IAogCVdvcmQxNiBoaSwgbG87CiAJV29yZDMyIGYxW05DMTZrICsgMV0sIGYyW05DMTZrXTsKIAlXb3JkMTYgbmM7CkBAIC05MiwxNCArOTIsMTQgQEAKIAkJbG8gPSAoZjFbaV0gJiAweGZmZmYpPj4xOwogCiAJCXQwID0gTXB5XzMyXzE2KGhpLCBsbywgaXNwW20gLSAxXSk7Ci0JCWYxW2ldID0gdm9fTF9hZGQoZjFbaV0sIHQwKTsKKwkJZjFbaV0gPSB2b19MX2FkZChmMVtpXSwgdDApOyAKIAogCQkvKiBmMltpXSAqPSAoMS4wIC0gaXNwW00tMV0pOyAqLwogCiAJCWhpID0gZjJbaV0gPj4gMTY7CiAJCWxvID0gKGYyW2ldICYgMHhmZmZmKT4+MTsKIAkJdDAgPSBNcHlfMzJfMTYoaGksIGxvLCBpc3BbbSAtIDFdKTsKLQkJZjJbaV0gPSB2b19MX3N1YihmMltpXSwgdDApOworCQlmMltpXSA9IHZvX0xfc3ViKGYyW2ldLCB0MCk7IAogCX0KIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCkBAIC0xMDgsMjAgKzEwOCwyMCBAQAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAJLyogYVswXSA9IDEuMDsgKi8KLQlhWzBdID0gNDA5NjsKLQl0bWF4ID0gMTsKKwlhWzBdID0gNDA5NjsgIAorCXRtYXggPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAxLCBqID0gbSAtIDE7IGkgPCBuYzsgaSsrLCBqLS0pCiAJewogCQkvKiBhW2ldID0gMC41KihmMVtpXSArIGYyW2ldKTsgKi8KIAogCQl0MCA9IHZvX0xfYWRkKGYxW2ldLCBmMltpXSk7ICAgICAgICAgIC8qIGYxW2ldICsgZjJbaV0gICAgICAgICAgICAgKi8KLQkJdG1heCB8PSBMX2Ficyh0MCk7CisJCXRtYXggfD0gTF9hYnModDApOyAgICAgICAgICAgICAgICAgCiAJCWFbaV0gPSAoV29yZDE2KSh2b19MX3Nocl9yKHQwLCAxMikpOyAvKiBmcm9tIFEyMyB0byBRMTIgYW5kICogMC41ICovCiAKIAkJLyogYVtqXSA9IDAuNSooZjFbaV0gLSBmMltpXSk7ICovCiAKIAkJdDAgPSB2b19MX3N1YihmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSAtIGYyW2ldICAgICAgICAgICAgICovCi0JCXRtYXggfD0gTF9hYnModDApOworCQl0bWF4IHw9IExfYWJzKHQwKTsgICAgICAgICAgICAgICAgCiAJCWFbal0gPSAoV29yZDE2KSh2b19MX3Nocl9yKHQwLCAxMikpOyAvKiBmcm9tIFEyMyB0byBRMTIgYW5kICogMC41ICovCiAJfQogCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogCQkJdDAgPSB2b19MX3N1YihmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSAtIGYyW2ldICAgICAgICAgICAgICovCiAJCQlhW2pdID0gKFdvcmQxNikodm9fTF9zaHJfcih0MCwgcV9zdWcpKTsgLyogZnJvbSBRMjMgdG8gUTEyIGFuZCAqIDAuNSAqLwogCQl9Ci0JCWFbMF0gPSBzaHIoYVswXSwgcSk7CisJCWFbMF0gPSBzaHIoYVswXSwgcSk7IAogCX0KIAllbHNlCiAJewotCQlxX3N1ZyA9IDEyOwotCQlxICAgICA9IDA7CisJCXFfc3VnID0gMTI7IAorCQlxICAgICA9IDA7IAogCX0KIAkvKiBhW05DXSA9IDAuNSpmMVtOQ10qKDEuMCArIGlzcFtNLTFdKTsgKi8KIAloaSA9IGYxW25jXSA+PiAxNjsKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWlzcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBpc3AgcG9pbnRlciAgICAgICAgKi8KIAlmb3IgKGkgPSAyOyBpIDw9IG47IGkrKykKIAl7Ci0JCSpmID0gZlstMl07CisJCSpmID0gZlstMl07ICAgICAgICAgICAgICAgICAgICAgICAgCiAJCWZvciAoaiA9IDE7IGogPCBpOyBqKyssIGYtLSkKIAkJewogCQkJaGkgPSBmWy0xXT4+MTY7CkBAIC0yMjgsNyArMjI4LDcgQEAKIAogCWZvciAoaSA9IDI7IGkgPD0gbjsgaSsrKQogCXsKLQkJKmYgPSBmWy0yXTsKKwkJKmYgPSBmWy0yXTsgICAgICAgICAgICAgICAgICAgICAgICAKIAkJZm9yIChqID0gMTsgaiA8IGk7IGorKywgZi0tKQogCQl7CiAJCQlWT19MX0V4dHJhY3QoZlstMV0sICZoaSwgJmxvKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMKaW5kZXggYjRiYTQwOC4uZmJlODBlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMKQEAgLTUxLDkgKzUxLDkgQEAKIAkJLyogYWNvcyhpc3BbaV0pPSBpbmQqMTI4ICsgKCAoIGlzcFtpXS10YWJsZVtpbmRdICkgKiBzbG9wZVtpbmRdICkvMjA0OCAqLwogCQlMX3RtcCA9IHZvX0xfbXVsdCh2b19zdWIoaXNwW2ldLCB0YWJsZVtpbmRdKSwgc2xvcGVbaW5kXSk7CiAJCWlzZltpXSA9IHZvX3JvdW5kKChMX3RtcCA8PCA0KSk7ICAgLyogKGlzcFtpXS10YWJsZVtpbmRdKSpzbG9wZVtpbmRdKT4+MTEgKi8KLQkJaXNmW2ldID0gYWRkMShpc2ZbaV0sIChpbmQgPDwgNykpOworCQlpc2ZbaV0gPSBhZGQxKGlzZltpXSwgKGluZCA8PCA3KSk7IAogCX0KLQlpc2ZbbSAtIDFdID0gKGlzZlttIC0gMV0gPj4gMSk7CisJaXNmW20gLSAxXSA9IChpc2ZbbSAtIDFdID4+IDEpOyAgICAgIAogCXJldHVybjsKIH0KIApAQCAtNjksNyArNjksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG0gLSAxOyBpKyspCiAJewotCQlpc3BbaV0gPSBpc2ZbaV07CisJCWlzcFtpXSA9IGlzZltpXTsgICAgICAgICAgICAgICAgICAKIAl9CiAJaXNwW20gLSAxXSA9IChpc2ZbbSAtIDFdIDw8IDEpOwogCkBAIC04MCw3ICs4MCw3IEBACiAKIAkJLyogaXNwW2ldID0gdGFibGVbaW5kXSsgKCh0YWJsZVtpbmQrMV0tdGFibGVbaW5kXSkqb2Zmc2V0KSAvIDEyOCAqLwogCQlMX3RtcCA9IHZvX0xfbXVsdCh2b19zdWIodGFibGVbaW5kICsgMV0sIHRhYmxlW2luZF0pLCBvZmZzZXQpOwotCQlpc3BbaV0gPSBhZGQxKHRhYmxlW2luZF0sIChXb3JkMTYpKChMX3RtcCA+PiA4KSkpOworCQlpc3BbaV0gPSBhZGQxKHRhYmxlW2luZF0sIChXb3JkMTYpKChMX3RtcCA+PiA4KSkpOyAgIAogCX0KIAogCXJldHVybjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYwppbmRleCA0YjJmOGVkLi5hNjg4NDVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xldmluc29uLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sZXZpbnNvbi5jCkBAIC0xMjIsOCArMTIyLDggQEAKIAlXb3JkMTYgKm9sZF9BLCAqb2xkX3JjOwogCiAJLyogTGFzdCBBKHopIGZvciBjYXNlIG9mIHVuc3RhYmxlIGZpbHRlciAqLwotCW9sZF9BID0gbWVtOwotCW9sZF9yYyA9IG1lbSArIE07CisJb2xkX0EgPSBtZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJb2xkX3JjID0gbWVtICsgTTsgICAgICAgICAgICAgICAgICAgICAgCiAKIAkvKiBLID0gQVsxXSA9IC1SWzFdIC8gUlswXSAqLwogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogCUtoID0gdDAgPj4gMTY7CiAJS2wgPSAodDAgJiAweGZmZmYpPj4xOwotCXJjWzBdID0gS2g7CisJcmNbMF0gPSBLaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJdDAgPSAodDAgPj4gNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQVsxXSBpbiBRMjcgICAgICAqLwogCiAJQWhbMV0gPSB0MCA+PiAxNjsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCWZvciAoaSA9IDI7IGkgPD0gTTsgaSsrKQogCXsKIAkJLyogdDAgPSBTVU0gKCBSW2pdKkFbaS1qXSAsaj0xLGktMSApICsgIFJbaV0gKi8KLQkJdDAgPSAwOworCQl0MCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCWZvciAoaiA9IDE7IGogPCBpOyBqKyspCiAJCQl0MCA9IHZvX0xfYWRkKHQwLCBNcHlfMzIoUmhbal0sIFJsW2pdLCBBaFtpIC0gal0sIEFsW2kgLSBqXSkpOwogCkBAIC0xODIsMTQgKzE4MiwxNCBAQAogCQlLaCA9IHQyID4+IDE2OwogCQlLbCA9ICh0MiAmIDB4ZmZmZik+PjE7CiAKLQkJcmNbaSAtIDFdID0gS2g7CisJCXJjW2kgLSAxXSA9IEtoOyAgICAgICAgICAgICAgICAgICAKIAkJLyogVGVzdCBmb3IgdW5zdGFibGUgZmlsdGVyLiBJZiB1bnN0YWJsZSBrZWVwIG9sZCBBKHopICovCiAJCWlmIChhYnNfcyhLaCkgPiAzMjc1MCkKIAkJewogCQkJQVswXSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAvKiBBaVswXSBub3Qgc3RvcmVkIChhbHdheXMgMS4wKSAqLwogCQkJZm9yIChqID0gMDsgaiA8IE07IGorKykKIAkJCXsKLQkJCQlBW2ogKyAxXSA9IG9sZF9BW2pdOworCQkJCUFbaiArIDFdID0gb2xkX0Fbal07ICAgICAgIAogCQkJfQogCQkJcmNbMF0gPSBvbGRfcmNbMF07ICAgICAgICAgICAgIC8qIG9ubHkgdHdvIHJjIGNvZWZmaWNpZW50cyBhcmUgbmVlZGVkICovCiAJCQlyY1sxXSA9IG9sZF9yY1sxXTsKQEAgLTIyOSwxOSArMjI5LDE5IEBACiAJCS8qIEFbal0gPSBBbltqXSAqLwogCQlmb3IgKGogPSAxOyBqIDw9IGk7IGorKykKIAkJewotCQkJQWhbal0gPSBBbmhbal07Ci0JCQlBbFtqXSA9IEFubFtqXTsKKwkJCUFoW2pdID0gQW5oW2pdOyAgICAgICAgICAgICAgIAorCQkJQWxbal0gPSBBbmxbal07ICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCS8qIFRydW5jYXRlIEFbaV0gaW4gUTI3IHRvIFExMiB3aXRoIHJvdW5kaW5nICovCi0JQVswXSA9IDQwOTY7CisJQVswXSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAxOyBpIDw9IE07IGkrKykKIAl7CiAJCXQwID0gKEFoW2ldIDw8IDE2KSArIChBbFtpXSA8PCAxKTsKLQkJb2xkX0FbaSAtIDFdID0gQVtpXSA9IHZvX3JvdW5kKCh0MCA8PCAxKSk7CisJCW9sZF9BW2kgLSAxXSA9IEFbaV0gPSB2b19yb3VuZCgodDAgPDwgMSkpOyAgICAgIAogCX0KLQlvbGRfcmNbMF0gPSByY1swXTsKLQlvbGRfcmNbMV0gPSByY1sxXTsKKwlvbGRfcmNbMF0gPSByY1swXTsgICAgICAgICAgICAgICAgICAgIAorCW9sZF9yY1sxXSA9IHJjWzFdOyAgICAgICAgICAgICAgICAgICAgCiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xvZzIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCmluZGV4IDBmNjU1NDEuLjY0NmQ2YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbG9nMi5jCkBAIC02NCwxMSArNjQsMTEgQEAKIAlXb3JkMzIgTF95OwogCWlmIChMX3ggPD0gKFdvcmQzMikgMCkKIAl7Ci0JCSpleHBvbmVudCA9IDA7Ci0JCSpmcmFjdGlvbiA9IDA7CisJCSpleHBvbmVudCA9IDA7IAorCQkqZnJhY3Rpb24gPSAwOyAKIAkJcmV0dXJuOwogCX0KLQkqZXhwb25lbnQgPSAoMzAgLSBleHApOworCSpleHBvbmVudCA9ICgzMCAtIGV4cCk7IAogCUxfeCA9IChMX3ggPj4gOSk7CiAJaSA9IGV4dHJhY3RfaCAoTF94KTsgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBiMjUtYjMxICovCiAJTF94ID0gKExfeCA+PiAxKTsKQEAgLTc4LDcgKzc4LDcgQEAKIAlMX3kgPSBMX2RlcG9zaXRfaCAodGFibGVbaV0pOyAgICAgICAvKiB0YWJsZVtpXSA8PCAxNiAgICAgICAgKi8KIAl0bXAgPSB2b19zdWIodGFibGVbaV0sIHRhYmxlW2kgKyAxXSk7IC8qIHRhYmxlW2ldIC0gdGFibGVbaSsxXSAqLwogCUxfeSA9IHZvX0xfbXN1IChMX3ksIHRtcCwgYSk7ICAgICAgICAgIC8qIExfeSAtPSB0bXAqYSoyICAgICAgICAqLwotCSpmcmFjdGlvbiA9IGV4dHJhY3RfaCAoTF95KTsKKwkqZnJhY3Rpb24gPSBleHRyYWN0X2ggKExfeSk7IAogCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9scF9kZWMyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYwppbmRleCAxZDVkMDc2Li4yOWJkNDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYwpAQCAtNDIsMjUgKzQyLDI1IEBACiAJV29yZDMyIGksIGo7CiAJV29yZDMyIExfdG1wOwogCS8qIGNvcHkgaW5pdGlhbCBmaWx0ZXIgc3RhdGVzIGludG8gYnVmZmVyICovCi0JcF94ID0geF9idWY7CisJcF94ID0geF9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMDsgaSA8IExfTUVNOyBpKyspCiAJewotCQkqcF94KysgPSBtZW1baV07Ci0JCW1lbVtpXSA9IHhbbCAtIExfTUVNICsgaV07CisJCSpwX3grKyA9IG1lbVtpXTsgIAorCQltZW1baV0gPSB4W2wgLSBMX01FTSArIGldOyAgCiAJfQogCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspCiAJewotCQkqcF94KysgPSB4W2ldOworCQkqcF94KysgPSB4W2ldOyAgICAgICAgICAgICAgICAgICAgIAogCX0KIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gMiwgaisrKQogCXsKLQkJcF94ID0gJnhfYnVmW2ldOworCQlwX3ggPSAmeF9idWZbaV07ICAKIAkJTF90bXAgID0gKCgqcF94KyspICogaF9maXJbMF0pOwogCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2ZpclsxXSk7CiAJCUxfdG1wICs9ICgoKnBfeCsrKSAqIGhfZmlyWzJdKTsKIAkJTF90bXAgKz0gKCgqcF94KyspICogaF9maXJbM10pOwogCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2Zpcls0XSk7Ci0JCXhbal0gPSAoTF90bXAgKyAweDQwMDApPj4xNTsKKwkJeFtqXSA9IChMX3RtcCArIDB4NDAwMCk+PjE1OyAgICAgICAgICAgICAgCiAJfQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWF0aF9vcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKaW5kZXggN2FmZmJiMi4uMWE3YjUxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKQEAgLTEwNiwyMSArMTA2LDIxIEBACiAKIAlpZiAoKmZyYWMgPD0gKFdvcmQzMikgMCkKIAl7Ci0JCSpleHAgPSAwOwotCQkqZnJhYyA9IDB4N2ZmZmZmZmZMOworCQkqZXhwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkqZnJhYyA9IDB4N2ZmZmZmZmZMOyAgICAgICAgICAgICAgIAogCQlyZXR1cm47CiAJfQogCiAJaWYoKCpleHAgJiAxKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgLypJZiBleHBvbmFudCBvZGQgLT4gc2hpZnQgcmlnaHQgKi8KIAkJKmZyYWMgPSAoKmZyYWMpID4+IDE7CiAKLQkqZXhwID0gbmVnYXRlKCgqZXhwIC0gMSkgPj4gMSk7CisJKmV4cCA9IG5lZ2F0ZSgoKmV4cCAtIDEpID4+IDEpOyAgIAogCi0JKmZyYWMgPSAoKmZyYWMgPj4gOSk7CisJKmZyYWMgPSAoKmZyYWMgPj4gOSk7ICAgICAgICAgICAgICAgCiAJaSA9IGV4dHJhY3RfaCgqZnJhYyk7ICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCBiMjUtYjMxICovCi0JKmZyYWMgPSAoKmZyYWMgPj4gMSk7CisJKmZyYWMgPSAoKmZyYWMgPj4gMSk7ICAgICAgICAgICAgICAKIAlhID0gKFdvcmQxNikoKmZyYWMpOyAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgYjEwLWIyNCAqLwotCWEgPSAoV29yZDE2KSAoYSAmIChXb3JkMTYpIDB4N2ZmZik7CisJYSA9IChXb3JkMTYpIChhICYgKFdvcmQxNikgMHg3ZmZmKTsgICAgCiAJaSAtPSAxNjsKIAkqZnJhYyA9IExfZGVwb3NpdF9oKHRhYmxlX2lzcXJ0W2ldKTsgICAvKiB0YWJsZVtpXSA8PCAxNiAgICAgICAgICovCiAJdG1wID0gdm9fc3ViKHRhYmxlX2lzcXJ0W2ldLCB0YWJsZV9pc3FydFtpICsgMV0pOyAgICAgIC8qIHRhYmxlW2ldIC0gdGFibGVbaSsxXSkgKi8KQEAgLTE2Nyw3ICsxNjcsNyBAQAogCWkgPSBleHRyYWN0X2goTF94KTsgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgYjEwLWIxNiBvZiBmcmFjdGlvbiAqLwogCUxfeCA9TF94ID4+IDE7CiAJYSA9IChXb3JkMTYpKExfeCk7ICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIwLWI5ICAgb2YgZnJhY3Rpb24gKi8KLQlhID0gKFdvcmQxNikgKGEgJiAoV29yZDE2KSAweDdmZmYpOworCWEgPSAoV29yZDE2KSAoYSAmIChXb3JkMTYpIDB4N2ZmZik7IAogCiAJTF94ID0gTF9kZXBvc2l0X2godGFibGVfcG93MltpXSk7ICAgICAgLyogdGFibGVbaV0gPDwgMTYgICAgICAgICovCiAJdG1wID0gdm9fc3ViKHRhYmxlX3BvdzJbaV0sIHRhYmxlX3BvdzJbaSArIDFdKTsgICAgICAgIC8qIHRhYmxlW2ldIC0gdGFibGVbaSsxXSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tZW1fYWxpZ24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWVtX2FsaWduLmMKaW5kZXggYTI5YmFmMy4uZTU4OTE1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tZW1fYWxpZ24uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jCkBAIC0yNyw3ICsyNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogbWVtX21hbGxvYwotKiBkZXNjcmlwdGlvbjogIG1hbGxvYyB0aGUgYWxpZ25tZW50cyBtZW1vcnkKKyogZGVzY3JpcHRpb246ICBtYWxsb2MgdGhlIGFsaWdubWVudHMgbWVtb3J5IAogKiByZXR1cm5zOiAgICAgIHRoZSBwb2ludCBvZiB0aGUgbWVtb3J5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wX21lZF9vbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wX21lZF9vbC5jCmluZGV4IGI4MTc0YjkuLjA4ZjQzMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcF9tZWRfb2wuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMKQEAgLTE4LDcgKzE4LDcgQEAKICogICAgICBGaWxlOiBwX21lZF9vbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgRGVzY3JpcHRpb246IENvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICoKLSoJICAgICAgICAgICAgb3V0cHV0OiBvcGVuIGxvb3AgcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgKgorKgkgICAgICAgICAgICBvdXRwdXQ6IG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAidHlwZWRlZi5oIgpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgInBfbWVkX29sLnRhYiIKIAogV29yZDE2IFBpdGNoX21lZF9vbCgKLQkJICAgV29yZDE2ICAgICAgd3NwW10sICAgICAgICAvKiAgIGk6IHNpZ25hbCB1c2VkIHRvIGNvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCovCisJCSAgIFdvcmQxNiAgICAgIHdzcFtdLCAgICAgICAgLyogICBpOiBzaWduYWwgdXNlZCB0byBjb21wdXRlIHRoZSBvcGVuIGxvb3AgcGl0Y2gqLyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICB3c3BbLXBpdF9tYXhdIHRvIHdzcFstMV0gc2hvdWxkIGJlIGtub3duICovCiAJCSAgIENvZGVyX1N0YXRlICpzdCwgICAgICAgICAgLyogaS9vOiBjb2RlYyBnbG9iYWwgc3RydWN0dXJlICovCiAJCSAgIFdvcmQxNiAgICAgIExfZnJhbWUgICAgICAgLyogICBpOiBsZW5ndGggb2YgZnJhbWUgdG8gY29tcHV0ZSBwaXRjaCAqLwpAQCAtNTIsOCArNTIsOCBAQAogCXd3ID0gJmNvcnJ3ZWlnaHRbMTk4XTsKIAl3ZSA9ICZjb3Jyd2VpZ2h0Wzk4ICsgTF9tYXggLSBMXzBdOwogCi0JbWF4ID0gTUlOXzMyOwotCVRtID0gMDsKKwltYXggPSBNSU5fMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlUbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSBMX21heDsgaSA+IExfbWluOyBpLS0pCiAJewogCQkvKiBDb21wdXRlIHRoZSBjb3JyZWxhdGlvbiAqLwpAQCAtNjUsNyArNjUsNyBAQAogCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOwogCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOwogCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOwotCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOworCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOyAgICAgCiAJCX0KIAkJLyogV2VpZ2h0aW5nIG9mIHRoZSBjb3JyZWxhdGlvbiBmdW5jdGlvbi4gICAqLwogCQloaSA9IFIwPj4xNjsKQEAgLTkwLDEzICs5MCwxMyBAQAogCX0KIAogCS8qIEh5cGFzcyB0aGUgd3NwW10gdmVjdG9yICovCi0JaHBfd3NwID0gb2xkX2hwX3dzcCArIExfbWF4OworCWhwX3dzcCA9IG9sZF9ocF93c3AgKyBMX21heDsgICAgICAgICAgIAogCUhwX3dzcCh3c3AsIGhwX3dzcCwgTF9mcmFtZSwgaHBfd3NwX21lbSk7CiAKIAkvKiBDb21wdXRlIG5vcm1hbGl6ZSBjb3JyZWxhdGlvbiBhdCBkZWxheSBUbSAqLwotCVIwID0gMDsKLQlSMSA9IDA7Ci0JUjIgPSAwOworCVIwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCVIxID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJUjIgPSAwOyAKIAlwMSA9IGhwX3dzcDsKIAlwMiA9IGhwX3dzcCAtIFRtOwogCWZvciAoaiA9IDA7IGogPCBMX2ZyYW1lOyBqKz00KQpAQCAtMTc0LDU3ICsxNzQsNTcgQEAKIAlXb3JkMTYgeDEsIHgyLCB4MywgeDQsIHg1OwogCVdvcmQxNiB0bXA7CiAKLQl4MSA9IHhbLTJdOwotCXgyID0geFstMV07Ci0JeDMgPSB4WzBdOwotCXg0ID0geFsxXTsKLQl4NSA9IHhbMl07CisJeDEgPSB4Wy0yXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDIgPSB4Wy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDMgPSB4WzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDQgPSB4WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJeDUgPSB4WzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlpZiAoeDIgPCB4MSkKIAl7CiAJCXRtcCA9IHgxOwogCQl4MSA9IHgyOwotCQl4MiA9IHRtcDsKKwkJeDIgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAJaWYgKHgzIDwgeDEpCiAJewogCQl0bXAgPSB4MTsKIAkJeDEgPSB4MzsKLQkJeDMgPSB0bXA7CisJCXgzID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCWlmICh4NCA8IHgxKQogCXsKIAkJdG1wID0geDE7CiAJCXgxID0geDQ7Ci0JCXg0ID0gdG1wOworCQl4NCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAlpZiAoeDUgPCB4MSkKIAl7Ci0JCXg1ID0geDE7CisJCXg1ID0geDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCWlmICh4MyA8IHgyKQogCXsKIAkJdG1wID0geDI7CiAJCXgyID0geDM7Ci0JCXgzID0gdG1wOworCQl4MyA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAlpZiAoeDQgPCB4MikKIAl7CiAJCXRtcCA9IHgyOwogCQl4MiA9IHg0OwotCQl4NCA9IHRtcDsKKwkJeDQgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAJaWYgKHg1IDwgeDIpCiAJewotCQl4NSA9IHgyOworCQl4NSA9IHgyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAlpZiAoeDQgPCB4MykKIAl7Ci0JCXgzID0geDQ7CisJCXgzID0geDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCWlmICh4NSA8IHgzKQogCXsKLQkJeDMgPSB4NTsKKwkJeDMgPSB4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAJcmV0dXJuICh4Myk7CiB9CkBAIC0yNDEsMTAgKzI0MSwxMCBAQAogCiAJZm9yIChpID0gNDsgaSA+IDA7IGktLSkKIAl7Ci0JCW9sZF9vbF9sYWdbaV0gPSBvbGRfb2xfbGFnW2kgLSAxXTsKKwkJb2xkX29sX2xhZ1tpXSA9IG9sZF9vbF9sYWdbaSAtIDFdOyAKIAl9CiAKLQlvbGRfb2xfbGFnWzBdID0gcHJldl9vbF9sYWc7CisJb2xkX29sX2xhZ1swXSA9IHByZXZfb2xfbGFnOyAgICAgICAgICAgCiAKIAlpID0gbWVkaWFuNSgmb2xkX29sX2xhZ1syXSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwppbmRleCAwZDY2YzMxLi40MWQ3NDEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCkBAIC05MCw3ICs5MCw3IEBACiAgICAgTm9ybV9jb3JyX2FzbShleGMsIHhuLCBoLCBMX3N1YmZyLCB0X21pbiwgdF9tYXgsIGNvcnIpOwogI2Vsc2UKIAlOb3JtX0NvcnIoZXhjLCB4biwgaCwgTF9zdWJmciwgdF9taW4sIHRfbWF4LCBjb3JyKTsKLSNlbmRpZgorI2VuZGlmIAogCiAJLyogRmluZCBpbnRlZ2VyIHBpdGNoICovCiAKQEAgLTEwMCw4ICsxMDAsOCBAQAogCXsKIAkJaWYgKGNvcnJbaV0gPj0gbWF4KQogCQl7Ci0JCQltYXggPSBjb3JyW2ldOwotCQkJdDAgPSBpOworCQkJbWF4ID0gY29ycltpXTsgICAgICAgICAgICAgICAgIAorCQkJdDAgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCS8qIElmIGZpcnN0IHN1YmZyYW1lIGFuZCB0MCA+PSB0MF9mcjEsIGRvIG5vdCBzZWFyY2ggZnJhY3Rpb25uYWwgcGl0Y2ggKi8KQEAgLTE4Miw3ICsxODIsNyBAQAogI2VuZGlmCiAKIAkvKiBDb21wdXRlIHJvdW5kZWQgZG93biAxL3NxcnQoZW5lcmd5IG9mIHhuW10pICovCi0JTF90bXAgPSAwOworCUxfdG1wID0gMDsgCiAJZm9yIChpID0gMDsgaSA8IDY0OyBpKz00KQogCXsKIAkJTF90bXAgKz0gKHhuW2ldICogeG5baV0pOwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJZm9yICh0ID0gdF9taW47IHQgPD0gdF9tYXg7IHQrKykKIAl7CiAJCS8qIENvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiB4bltdIGFuZCBleGNmW10gKi8KLQkJTF90bXAgID0gMDsKKwkJTF90bXAgID0gMDsgIAogCQlMX3RtcDEgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrPTQpCiAJCXsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkJTF90bXAgPSBMX3RtcCA8PCBMX3RtcDI7CiAJCX0KIAotCQljb3JyX25vcm1bdF0gPSB2b19yb3VuZChMX3RtcCk7CisJCWNvcnJfbm9ybVt0XSA9IHZvX3JvdW5kKExfdG1wKTsgICAgICAKIAkJLyogbW9kaWZ5IHRoZSBmaWx0ZXJlZCBleGNpdGF0aW9uIGV4Y2ZbXSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uICovCiAKIAkJaWYodCAhPSB0X21heCkKQEAgLTMxMCwxMCArMzEwLDEwIEBACiAJTF9zdW0gKz0gdm9fbXVsdDMyKHhbMV0sICgqcHRyKyspKTsKIAlMX3N1bSArPSB2b19tdWx0MzIoeFsyXSwgKCpwdHIrKykpOwogCUxfc3VtICs9IHZvX211bHQzMih4WzNdLCAoKnB0cisrKSk7Ci0JTF9zdW0gKz0gdm9fbXVsdDMyKHhbNF0sICgqcHRyKyspKTsKKwlMX3N1bSArPSB2b19tdWx0MzIoeFs0XSwgKCpwdHIrKykpOyAgCiAJTF9zdW0gKz0gdm9fbXVsdDMyKHhbNV0sICgqcHRyKyspKTsKIAlMX3N1bSArPSB2b19tdWx0MzIoeFs2XSwgKCpwdHIrKykpOwotCUxfc3VtICs9IHZvX211bHQzMih4WzddLCAoKnB0cisrKSk7CisJTF9zdW0gKz0gdm9fbXVsdDMyKHhbN10sICgqcHRyKyspKTsgICAKIAogCXN1bSA9IGV4dHJhY3RfaChMX2FkZChMX3NobDIoTF9zdW0sIDIpLCAweDgwMDApKTsKIAlyZXR1cm4gKHN1bSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMKaW5kZXggODQwNGNmOS4uYjM1OTY1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVkX2x0NC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZF9sdDQuYwpAQCAtNjAsMTMgKzYwLDEzIEBACiAJV29yZDE2ICpwdHIsICpwdHIxOwogCVdvcmQxNiAqcHRyMjsKIAotCXggPSBleGMgLSBUMDsKKwl4ID0gZXhjIC0gVDA7ICAgCiAJZnJhYyA9IC1mcmFjOwogCWlmIChmcmFjIDwgMCkKIAl7CiAJCWZyYWMgKz0gVVBfU0FNUDsKIAkJeC0tOwotCX0KKwl9ICAgCiAJeCAtPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeCA9IExfSU5URVJQT0wyIC0gMSAqLwogCWsgPSAzIC0gZnJhYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGsgPSBVUF9TQU1QIC0gMSAtIGZyYWMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9wcmVlbXBoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYwppbmRleCBjODY3YmY3Li41NDA4NjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYwpAQCAtMzUsMjAgKzM1LDIwIEBACiAJV29yZDE2IHRlbXA7CiAJV29yZDMyIGksIExfdG1wOwogCi0JdGVtcCA9IHhbbGcgLSAxXTsKKwl0ZW1wID0geFtsZyAtIDFdOyAgICAgICAgICAgICAgICAgICAgIAogCiAJZm9yIChpID0gbGcgLSAxOyBpID4gMDsgaS0tKQogCXsKIAkJTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsKIAkJTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOwotCQl4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisJCXhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICAKIAl9CiAKIAlMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOwogCUxfdG1wIC09ICgoKm1lbSkgKiBtdSk8PDE7Ci0JeFswXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworCXhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICAgICAgCiAKLQkqbWVtID0gdGVtcDsKKwkqbWVtID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogCXJldHVybjsKIH0KQEAgLTY0LDIyICs2NCwyMiBAQAogCVdvcmQxNiB0ZW1wOwogCVdvcmQzMiBpLCBMX3RtcDsKIAotCXRlbXAgPSB4W2xnIC0gMV07CisJdGVtcCA9IHhbbGcgLSAxXTsgICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoaSA9IChXb3JkMTYpIChsZyAtIDEpOyBpID4gMDsgaS0tKQogCXsKIAkJTF90bXAgPSBMX2RlcG9zaXRfaCh4W2ldKTsKIAkJTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOwogCQlMX3RtcCA9IChMX3RtcCA8PCAxKTsKLQkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworCQl4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgCiAJfQogCiAJTF90bXAgPSBMX2RlcG9zaXRfaCh4WzBdKTsKIAlMX3RtcCAtPSAoKCptZW0pICogbXUpPDwxOwogCUxfdG1wID0gKExfdG1wIDw8IDEpOwotCXhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKwl4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgICAgIAogCi0JKm1lbSA9IHRlbXA7CisJKm1lbSA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfZ2FpbjIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCmluZGV4IGU4Y2EwNDMuLjdiYzI5OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCkBAIC04Myw3ICs4Myw3IEBACiAJV29yZDMyIGksIGosIExfdG1wLCBkaXN0X21pbjsKIAlXb3JkMTYgKnBhc3RfcXVhX2VuLCAqdF9xdWFfZ2FpbjsKIAotCXBhc3RfcXVhX2VuID0gbWVtOworCXBhc3RfcXVhX2VuID0gbWVtOyAgICAgICAgICAgICAgICAgICAgIAogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKIAkgKiAtIEZpbmQgdGhlIGluaXRpYWwgcXVhbnRpemF0aW9uIHBpdGNoIGluZGV4ICAgICAgICAgICAgICAgICAgICAgKgpAQCAtOTEsOSArOTEsOSBAQAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCWlmIChuYml0cyA9PSA2KQogCXsKLQkJdF9xdWFfZ2FpbiA9IHRfcXVhX2dhaW42YjsKLQkJbWluX2luZCA9IDA7Ci0JCXNpemUgPSBSQU5HRTsKKwkJdF9xdWFfZ2FpbiA9IHRfcXVhX2dhaW42YjsgICAgICAgICAKKwkJbWluX2luZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAKKwkJc2l6ZSA9IFJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAKIAogCQlpZihncF9jbGlwID09IDEpCiAJCXsKQEAgLTEwMSwxOCArMTAxLDE4IEBACiAJCX0KIAl9IGVsc2UKIAl7Ci0JCXRfcXVhX2dhaW4gPSB0X3F1YV9nYWluN2I7CisJCXRfcXVhX2dhaW4gPSB0X3F1YV9nYWluN2I7ICAgICAgICAgCiAKIAkJcCA9IHRfcXVhX2dhaW43YiArIFJBTkdFOyAgICAgICAgICAgIC8qIHB0IGF0IDEvNHRoIG9mIHRhYmxlICovCiAKLQkJaiA9IG5iX3F1YV9nYWluN2IgLSBSQU5HRTsKKwkJaiA9IG5iX3F1YV9nYWluN2IgLSBSQU5HRTsgICAgICAgICAKIAogCQlpZiAoZ3BfY2xpcCA9PSAxKQogCQl7CiAJCQlqID0gaiAtIDI3OyAgICAgICAgICAgICAgICAvKiBsaW1pdCBnYWluIHBpdGNoIHRvIDEuMCAqLwogCQl9Ci0JCW1pbl9pbmQgPSAwOwotCQlnX3BpdGNoID0gKmdhaW5fcGl0OworCQltaW5faW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgIAorCQlnX3BpdGNoID0gKmdhaW5fcGl0OyAgICAgICAgICAgICAgIAogCiAJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyssIHAgKz0gMikKIAkJewpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQkJbWluX2luZCA9IG1pbl9pbmQgKyAxOwogCQkJfQogCQl9Ci0JCXNpemUgPSBSQU5HRTsKKwkJc2l6ZSA9IFJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAKIAl9CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKQEAgLTEzNywxMCArMTM3LDEwIEBACiAJICogYXJlIGluIHZlY3RvciBnX2NvZWZmW10uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JY29lZmZbMF0gPSBnX2NvZWZmWzBdOwotCWV4cF9jb2VmZlswXSA9IGdfY29lZmZbMV07CisJY29lZmZbMF0gPSBnX2NvZWZmWzBdOyAgICAgICAgICAgICAgICAgCisJZXhwX2NvZWZmWzBdID0gZ19jb2VmZlsxXTsgICAgICAgICAgICAgCiAJY29lZmZbMV0gPSBuZWdhdGUoZ19jb2VmZlsyXSk7ICAgICAgICAgICAgICAgICAgICAvKiBjb2VmZlsxXSA9IC0yIHhuIHkxICovCi0JZXhwX2NvZWZmWzFdID0gZ19jb2VmZlszXSArIDE7CisJZXhwX2NvZWZmWzFdID0gZ19jb2VmZlszXSArIDE7ICAgICAKIAogCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgPHkyW10seTJbXT4gKi8KICNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovCkBAIC0yNDIsMjAgKzI0MiwyMCBAQAogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIAlleHBfY29kZSA9IChleHBfZ2NvZGUwICsgNCk7Ci0JZXhwX21heFswXSA9IChleHBfY29lZmZbMF0gLSAxMyk7Ci0JZXhwX21heFsxXSA9IChleHBfY29lZmZbMV0gLSAxNCk7Ci0JZXhwX21heFsyXSA9IChleHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwX2NvZGUgPDwgMSkpKTsKLQlleHBfbWF4WzNdID0gKGV4cF9jb2VmZlszXSArIGV4cF9jb2RlKTsKLQlleHBfbWF4WzRdID0gKGV4cF9jb2VmZls0XSArICgxICsgZXhwX2NvZGUpKTsKKwlleHBfbWF4WzBdID0gKGV4cF9jb2VmZlswXSAtIDEzKTsgICAgCisJZXhwX21heFsxXSA9IChleHBfY29lZmZbMV0gLSAxNCk7ICAgIAorCWV4cF9tYXhbMl0gPSAoZXhwX2NvZWZmWzJdICsgKDE1ICsgKGV4cF9jb2RlIDw8IDEpKSk7ICAKKwlleHBfbWF4WzNdID0gKGV4cF9jb2VmZlszXSArIGV4cF9jb2RlKTsgICAKKwlleHBfbWF4WzRdID0gKGV4cF9jb2VmZls0XSArICgxICsgZXhwX2NvZGUpKTsgIAogCiAJLyogRmluZCBtYXhpbXVtIGV4cG9uYW50ICovCiAKLQllX21heCA9IGV4cF9tYXhbMF07CisJZV9tYXggPSBleHBfbWF4WzBdOyAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQogCXsKIAkJaWYoZXhwX21heFtpXSA+IGVfbWF4KQogCQl7Ci0JCQllX21heCA9IGV4cF9tYXhbaV07CisJCQllX21heCA9IGV4cF9tYXhbaV07ICAgICAgICAgICAgCiAJCX0KIAl9CiAKQEAgLTI3MSwxNCArMjcxLDE0IEBACiAJfQogCiAJLyogQ29kZWJvb2sgc2VhcmNoICovCi0JZGlzdF9taW4gPSBNQVhfMzI7Ci0JcCA9ICZ0X3F1YV9nYWluW21pbl9pbmQgPDwgMV07CisJZGlzdF9taW4gPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgCisJcCA9ICZ0X3F1YV9nYWluW21pbl9pbmQgPDwgMV07ICAgICAgCiAKLQlpbmRleCA9IDA7CisJaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKIAl7Ci0JCWdfcGl0Y2ggPSAqcCsrOwotCQlnX2NvZGUgPSAqcCsrOworCQlnX3BpdGNoID0gKnArKzsgICAgICAgICAgICAgICAgICAgIAorCQlnX2NvZGUgPSAqcCsrOyAgICAgICAgICAgICAgICAgICAgIAogCiAJCWdfY29kZSA9ICgoZ19jb2RlICogZ2NvZGUwKSArIDB4NDAwMCk+PjE1OwogCQlnMl9waXRjaCA9ICgoZ19waXRjaCAqIGdfcGl0Y2gpICsgMHg0MDAwKT4+MTU7CkBAIC0zMDIsMTQgKzMwMiwxNCBAQAogCiAJCWlmKExfdG1wIDwgZGlzdF9taW4pCiAJCXsKLQkJCWRpc3RfbWluID0gTF90bXA7Ci0JCQlpbmRleCA9IGk7CisJCQlkaXN0X21pbiA9IExfdG1wOyAgICAgICAgICAgICAgCisJCQlpbmRleCA9IGk7ICAgICAgICAgICAgICAgICAgICAgCiAJCX0KIAl9CiAKIAkvKiBSZWFkIHRoZSBxdWFudGl6ZWQgZ2FpbnMgKi8KIAlpbmRleCA9IGluZGV4ICsgbWluX2luZDsKLQlwID0gJnRfcXVhX2dhaW5bKGluZGV4ICsgaW5kZXgpXTsKKwlwID0gJnRfcXVhX2dhaW5bKGluZGV4ICsgaW5kZXgpXTsgICAgCiAJKmdhaW5fcGl0ID0gKnArKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbGVjdGVkIHBpdGNoIGdhaW4gaW4gUTE0ICovCiAJZ19jb2RlID0gKnArKzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbGVjdGVkIGNvZGUgZ2FpbiBpbiBRMTEgICovCiAKQEAgLTMzMywxMCArMzMzLDEwIEBACiAKIAkvKiB1cGRhdGUgdGFibGUgb2YgcGFzdCBxdWFudGl6ZWQgZW5lcmdpZXMgKi8KIAotCXBhc3RfcXVhX2VuWzNdID0gcGFzdF9xdWFfZW5bMl07Ci0JcGFzdF9xdWFfZW5bMl0gPSBwYXN0X3F1YV9lblsxXTsKLQlwYXN0X3F1YV9lblsxXSA9IHBhc3RfcXVhX2VuWzBdOwotCXBhc3RfcXVhX2VuWzBdID0gcXVhX2VuZXI7CisJcGFzdF9xdWFfZW5bM10gPSBwYXN0X3F1YV9lblsyXTsgICAgICAgCisJcGFzdF9xdWFfZW5bMl0gPSBwYXN0X3F1YV9lblsxXTsgICAgICAgCisJcGFzdF9xdWFfZW5bMV0gPSBwYXN0X3F1YV9lblswXTsgICAgICAgCisJcGFzdF9xdWFfZW5bMF0gPSBxdWFfZW5lcjsgICAgICAgICAgICAgCiAKIAlyZXR1cm4gKGluZGV4KTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKaW5kZXggODBhMGI3My4uNDk2Y2E4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJaWYgKHZvX3N1YigoV29yZDE2KSAocG9zMSAmIG1hc2spLCAoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PSAwKQogCQl7CiAJCQkvKiBpbmRleCA9ICgocG9zMiAmIG1hc2spIDw8IE4pICsgKHBvczEgJiBtYXNrKTsgKi8KLQkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsKKwkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsgCiAJCQlpZiAoKHBvczIgJiBOQl9QT1MpICE9IDApCiAJCQl7CiAJCQkJdG1wID0gKE4gPDwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLwpAQCAtOTEsNyArOTEsNyBAQAogCQl9IGVsc2UKIAkJewogCQkJLyogaW5kZXggPSAoKHBvczEgJiBtYXNrKSA8PCBOKSArIChwb3MyICYgbWFzayk7CSAqLwotCQkJaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMiAmIG1hc2spKSkpOworCQkJaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMiAmIG1hc2spKSkpOyAKIAkJCWlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkKIAkJCXsKIAkJCQl0bXAgPSAoTiA8PCAxKTsKQEAgLTEyMCwxNCArMTIwLDE0IEBACiAJewogCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCiAJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLwotCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7CisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsgIAogCQkvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MzLCBOKSA8PCAoMipOKTsgKi8KIAkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczMsIE4pPDwoTiA8PCAxKSkpOwogCiAJfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKIAl7CiAJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOLTEpKTsgKi8KLQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7IAogCQkvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KIAkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczIsIE4pIDw8IChOIDw8IDEpKSk7CiAJCS8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczIsIE4pIDw8CkBAIC0xMzYsNyArMTM2LDcgQEAKIAl7CiAJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOIC0gMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTi0xKSk7ICovCiAJCS8qIGluZGV4ICs9IChwb3MyICYgbmJfcG9zKSA8PCBOOwkJCSAqLwotCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczIgJiBuYl9wb3MpKSA8PCBOKSk7CisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsgIAogCQkvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoMipOKTsJICovCiAJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoTiA8PCAxKSkpOwogCX0KQEAgLTE2MiwyMSArMTYyLDIxIEBACiAJewogCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCiAJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOwkgKi8KLQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7ICAKIAkJLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8ICgyKk4pOyAqLwogCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7CiAJfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKIAl7CiAJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOIC0gMSkpOwogCQkvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KLQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7ICAKIAkJLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8ICgyKk4pOyAqLwogCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7CiAJfSBlbHNlCiAJewogCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsKIAkJLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47ICovCi0JCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsKKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOyAgCiAJCS8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3MxLCBwb3M0LCBOKSA8PCAoMipOKTsgKi8KIAkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MxLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOwogCX0KQEAgLTE5MiwyMCArMTkyLDIwIEBACiAJV29yZDE2IHBvc0FbNF0sIHBvc0JbNF07CiAJV29yZDMyIGksIGosIGssIGluZGV4OwogCi0Jbl8xID0gKFdvcmQxNikgKE4gLSAxKTsKKwluXzEgPSAoV29yZDE2KSAoTiAtIDEpOyAgICAgICAgICAgICAgICAKIAluYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLwogCW1hc2sgPSB2b19zdWIoKDEgPDwgTiksIDEpOyAgICAgICAgICAgICAgLyogbWFzayA9ICgoMTw8TiktMSk7ICovCiAKLQlpID0gMDsKLQlqID0gMDsKKwlpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlqID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQogCXsKIAkJaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCiAJCXsKLQkJCXBvc0FbaSsrXSA9IHBvc1trXTsKKwkJCXBvc0FbaSsrXSA9IHBvc1trXTsgICAgICAgICAgICAKIAkJfSBlbHNlCiAJCXsKLQkJCXBvc0JbaisrXSA9IHBvc1trXTsKKwkJCXBvc0JbaisrXSA9IHBvc1trXTsgICAgICAgICAgICAKIAkJfQogCX0KIApAQCAtMjU4LDE5ICsyNTgsMTkgQEAKIAlXb3JkMTYgcG9zQVs1XSwgcG9zQls1XTsKIAlXb3JkMzIgaSwgaiwgaywgaW5kZXgsIHRtcDI7CiAKLQluXzEgPSAoV29yZDE2KSAoTiAtIDEpOworCW5fMSA9IChXb3JkMTYpIChOIC0gMSk7ICAgICAgICAgICAgICAgIAogCW5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovCiAKLQlpID0gMDsKLQlqID0gMDsKKwlpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlqID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQogCXsKIAkJaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCiAJCXsKLQkJCXBvc0FbaSsrXSA9IHBvc1trXTsKKwkJCXBvc0FbaSsrXSA9IHBvc1trXTsgICAgICAgICAgICAKIAkJfSBlbHNlCiAJCXsKLQkJCXBvc0JbaisrXSA9IHBvc1trXTsKKwkJCXBvc0JbaisrXSA9IHBvc1trXTsgICAgICAgICAgICAKIAkJfQogCX0KIApAQCAtMzMzLDE5ICszMzMsMTkgQEAKIAlXb3JkMzIgaSwgaiwgaywgaW5kZXg7CiAKIAkvKiAhISAgTiBhbmQgbl8xIGFyZSBjb25zdGFudHMgLT4gaXQgZG9lc24ndCBuZWVkIHRvIGJlIG9wZXJhdGVkIGJ5IEJhc2ljIE9wZXJhdG9ycyAqLwotCW5fMSA9IChXb3JkMTYpIChOIC0gMSk7CisJbl8xID0gKFdvcmQxNikgKE4gLSAxKTsgICAgICAgICAgICAgICAgCiAJbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8KIAotCWkgPSAwOwotCWogPSAwOworCWkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoayA9IDA7IGsgPCA2OyBrKyspCiAJewogCQlpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkKIAkJewotCQkJcG9zQVtpKytdID0gcG9zW2tdOworCQkJcG9zQVtpKytdID0gcG9zW2tdOyAgICAgICAgICAgIAogCQl9IGVsc2UKIAkJewotCQkJcG9zQltqKytdID0gcG9zW2tdOworCQkJcG9zQltqKytdID0gcG9zW2tdOyAgICAgICAgICAgIAogCQl9CiAJfQogCkBAIC0zNjgsMjMgKzM2OCwyMyBAQAogCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSkpOyAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpOyAqLwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKLQkJCWluZGV4ID0gKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8IChXb3JkMTYpICgzICogbl8xICsgMSkpOworCQkJaW5kZXggPSAocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKFdvcmQxNikgKDMgKiBuXzEgKyAxKSk7ICAgIAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovCi0JCQlpbmRleCA9dm9fTF9hZGQoaW5kZXgsIHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpKTsKKwkJCWluZGV4ID12b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOyAgICAgCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKTsgKi8KIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlpID0gMjsKKwkJCWkgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCWluZGV4ID0gKHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKFdvcmQxNikgKDIgKiBuXzEgKyAxKSk7ICAvKiBpbmRleCA9IHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovCiAJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSk7ICovCiAJCQlicmVhazsKIAkJY2FzZSA1OgotCQkJaSA9IDE7CisJCQlpID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQlpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8KIAkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKTsgKi8KIAkJCWJyZWFrOwogCQljYXNlIDY6Ci0JCQlpID0gMDsKKwkJCWkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQlpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8KIAkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVs1XSwgbl8xKTsgKi8KIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Fpc2ZfbnMuYwppbmRleCBmYzJmMDBkLi5mNmQ1M2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Fpc2ZfbnMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Fpc2ZfbnMuYwpAQCAtNDMsMTQgKzQzLDE0IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykKIAl7Ci0JCWlzZl9xW2ldID0gc3ViKGlzZjFbaV0sIG1lYW5faXNmX25vaXNlW2ldKTsKKwkJaXNmX3FbaV0gPSBzdWIoaXNmMVtpXSwgbWVhbl9pc2Zfbm9pc2VbaV0pOyAgICAgCiAJfQogCi0JaW5kaWNlWzBdID0gU3ViX1ZRKCZpc2ZfcVswXSwgZGljbzFfaXNmX25vaXNlLCAyLCBTSVpFX0JLX05PSVNFMSwgJnRtcCk7Ci0JaW5kaWNlWzFdID0gU3ViX1ZRKCZpc2ZfcVsyXSwgZGljbzJfaXNmX25vaXNlLCAzLCBTSVpFX0JLX05PSVNFMiwgJnRtcCk7Ci0JaW5kaWNlWzJdID0gU3ViX1ZRKCZpc2ZfcVs1XSwgZGljbzNfaXNmX25vaXNlLCAzLCBTSVpFX0JLX05PSVNFMywgJnRtcCk7Ci0JaW5kaWNlWzNdID0gU3ViX1ZRKCZpc2ZfcVs4XSwgZGljbzRfaXNmX25vaXNlLCA0LCBTSVpFX0JLX05PSVNFNCwgJnRtcCk7Ci0JaW5kaWNlWzRdID0gU3ViX1ZRKCZpc2ZfcVsxMl0sIGRpY281X2lzZl9ub2lzZSwgNCwgU0laRV9CS19OT0lTRTUsICZ0bXApOworCWluZGljZVswXSA9IFN1Yl9WUSgmaXNmX3FbMF0sIGRpY28xX2lzZl9ub2lzZSwgMiwgU0laRV9CS19OT0lTRTEsICZ0bXApOyAgICAKKwlpbmRpY2VbMV0gPSBTdWJfVlEoJmlzZl9xWzJdLCBkaWNvMl9pc2Zfbm9pc2UsIDMsIFNJWkVfQktfTk9JU0UyLCAmdG1wKTsgICAgCisJaW5kaWNlWzJdID0gU3ViX1ZRKCZpc2ZfcVs1XSwgZGljbzNfaXNmX25vaXNlLCAzLCBTSVpFX0JLX05PSVNFMywgJnRtcCk7ICAgIAorCWluZGljZVszXSA9IFN1Yl9WUSgmaXNmX3FbOF0sIGRpY280X2lzZl9ub2lzZSwgNCwgU0laRV9CS19OT0lTRTQsICZ0bXApOyAgICAKKwlpbmRpY2VbNF0gPSBTdWJfVlEoJmlzZl9xWzEyXSwgZGljbzVfaXNmX25vaXNlLCA0LCBTSVpFX0JLX05PSVNFNSwgJnRtcCk7ICAgCiAKIAkvKiBkZWNvZGluZyB0aGUgSVNGcyAqLwogCkBAIC03OCwyOCArNzgsMjggQEAKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCiAJewotCQlpc2ZfcVtpXSA9IGRpY28xX2lzZl9ub2lzZVtpbmRpY2VbMF0gKiAyICsgaV07CisJCWlzZl9xW2ldID0gZGljbzFfaXNmX25vaXNlW2luZGljZVswXSAqIDIgKyBpXTsgIAogCX0KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCXsKLQkJaXNmX3FbaSArIDJdID0gZGljbzJfaXNmX25vaXNlW2luZGljZVsxXSAqIDMgKyBpXTsKKwkJaXNmX3FbaSArIDJdID0gZGljbzJfaXNmX25vaXNlW2luZGljZVsxXSAqIDMgKyBpXTsgICAgICAKIAl9CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAl7Ci0JCWlzZl9xW2kgKyA1XSA9IGRpY28zX2lzZl9ub2lzZVtpbmRpY2VbMl0gKiAzICsgaV07CisJCWlzZl9xW2kgKyA1XSA9IGRpY28zX2lzZl9ub2lzZVtpbmRpY2VbMl0gKiAzICsgaV07ICAgICAgCiAJfQogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJewotCQlpc2ZfcVtpICsgOF0gPSBkaWNvNF9pc2Zfbm9pc2VbaW5kaWNlWzNdICogNCArIGldOworCQlpc2ZfcVtpICsgOF0gPSBkaWNvNF9pc2Zfbm9pc2VbaW5kaWNlWzNdICogNCArIGldOyAgICAgIAogCX0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCXsKLQkJaXNmX3FbaSArIDEyXSA9IGRpY281X2lzZl9ub2lzZVtpbmRpY2VbNF0gKiA0ICsgaV07CisJCWlzZl9xW2kgKyAxMl0gPSBkaWNvNV9pc2Zfbm9pc2VbaW5kaWNlWzRdICogNCArIGldOyAgICAgCiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspCiAJewotCQlpc2ZfcVtpXSA9IGFkZChpc2ZfcVtpXSwgbWVhbl9pc2Zfbm9pc2VbaV0pOworCQlpc2ZfcVtpXSA9IGFkZChpc2ZfcVtpXSwgbWVhbl9pc2Zfbm9pc2VbaV0pOyAgIAogCX0KIAogCVJlb3JkZXJfaXNmKGlzZl9xLCBJU0ZfR0FQLCBPUkRFUik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FwaXNmXzJzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FwaXNmXzJzLmMKaW5kZXggYzcxMWNkMC4uYWMxM2E2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcXBpc2ZfMnMuYwpAQCAtNzAsMzAgKzcwLDMwIEBACiAJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspCiAJewogCQlpc2ZbaV0gPSB2b19zdWIoaXNmMVtpXSwgbWVhbl9pc2ZbaV0pOwotCQlpc2ZbaV0gPSB2b19zdWIoaXNmW2ldLCB2b19tdWx0KE1VLCBwYXN0X2lzZnFbaV0pKTsKKwkJaXNmW2ldID0gdm9fc3ViKGlzZltpXSwgdm9fbXVsdChNVSwgcGFzdF9pc2ZxW2ldKSk7IAogCX0KIAogCVZRX3N0YWdlMSgmaXNmWzBdLCBkaWNvMV9pc2YsIDksIFNJWkVfQksxLCBzdXJ2MSwgbmJfc3Vydik7CiAKLQlkaXN0YW5jZSA9IE1BWF8zMjsKKwlkaXN0YW5jZSA9IE1BWF8zMjsgICAgICAgICAgCiAKIAlmb3IgKGsgPSAwOyBrIDwgbmJfc3VydjsgaysrKQogCXsKIAkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKIAkJewotCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbaV0sIGRpY28xX2lzZltpICsgc3VydjFba10gKiA5XSk7CisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZltpXSwgZGljbzFfaXNmW2kgKyBzdXJ2MVtrXSAqIDldKTsgCiAJCX0KLQkJdG1wX2luZFswXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlswXSwgZGljbzIxX2lzZiwgMywgU0laRV9CSzIxLCAmbWluX2Vycik7CisJCXRtcF9pbmRbMF0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbMF0sIGRpY28yMV9pc2YsIDMsIFNJWkVfQksyMSwgJm1pbl9lcnIpOyAKIAkJdGVtcCA9IG1pbl9lcnI7Ci0JCXRtcF9pbmRbMV0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbM10sIGRpY28yMl9pc2YsIDMsIFNJWkVfQksyMiwgJm1pbl9lcnIpOworCQl0bXBfaW5kWzFdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzNdLCBkaWNvMjJfaXNmLCAzLCBTSVpFX0JLMjIsICZtaW5fZXJyKTsgCiAJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsKLQkJdG1wX2luZFsyXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMls2XSwgZGljbzIzX2lzZiwgMywgU0laRV9CSzIzLCAmbWluX2Vycik7CisJCXRtcF9pbmRbMl0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbNl0sIGRpY28yM19pc2YsIDMsIFNJWkVfQksyMywgJm1pbl9lcnIpOyAgCiAJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsKIAogCQlpZih0ZW1wIDwgZGlzdGFuY2UpCiAJCXsKLQkJCWRpc3RhbmNlID0gdGVtcDsKLQkJCWluZGljZVswXSA9IHN1cnYxW2tdOworCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIAorCQkJaW5kaWNlWzBdID0gc3VydjFba107ICAgICAgICAgIAogCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkJCXsKIAkJCQlpbmRpY2VbaSArIDJdID0gdG1wX2luZFtpXTsKQEAgLTEwNCwyNCArMTA0LDI0IEBACiAKIAlWUV9zdGFnZTEoJmlzZls5XSwgZGljbzJfaXNmLCA3LCBTSVpFX0JLMiwgc3VydjEsIG5iX3N1cnYpOwogCi0JZGlzdGFuY2UgPSBNQVhfMzI7CisJZGlzdGFuY2UgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgIAogCiAJZm9yIChrID0gMDsgayA8IG5iX3N1cnY7IGsrKykKIAl7CiAJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAJCXsKLQkJCWlzZl9zdGFnZTJbaV0gPSB2b19zdWIoaXNmWzkgKyBpXSwgZGljbzJfaXNmW2kgKyBzdXJ2MVtrXSAqIDddKTsKKwkJCWlzZl9zdGFnZTJbaV0gPSB2b19zdWIoaXNmWzkgKyBpXSwgZGljbzJfaXNmW2kgKyBzdXJ2MVtrXSAqIDddKTsgICAgICAgCiAJCX0KIAogCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjRfaXNmLCAzLCBTSVpFX0JLMjQsICZtaW5fZXJyKTsKLQkJdGVtcCA9IG1pbl9lcnI7CisJCXRlbXAgPSBtaW5fZXJyOyAKIAkJdG1wX2luZFsxXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlszXSwgZGljbzI1X2lzZiwgNCwgU0laRV9CSzI1LCAmbWluX2Vycik7CiAJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsKIAogCQlpZih0ZW1wIDwgZGlzdGFuY2UpCiAJCXsKLQkJCWRpc3RhbmNlID0gdGVtcDsKLQkJCWluZGljZVsxXSA9IHN1cnYxW2tdOworCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIAorCQkJaW5kaWNlWzFdID0gc3VydjFba107ICAgICAgICAgIAogCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKIAkJCXsKIAkJCQlpbmRpY2VbaSArIDVdID0gdG1wX2luZFtpXTsKQEAgLTE2NSwyNCArMTY1LDI0IEBACiAKIAlWUV9zdGFnZTEoJmlzZlswXSwgZGljbzFfaXNmLCA5LCBTSVpFX0JLMSwgc3VydjEsIG5iX3N1cnYpOwogCi0JZGlzdGFuY2UgPSBNQVhfMzI7CisJZGlzdGFuY2UgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgCiAKIAlmb3IgKGsgPSAwOyBrIDwgbmJfc3VydjsgaysrKQogCXsKIAkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKIAkJewotCQkJaXNmX3N0YWdlMltpXSA9IHZvX3N1Yihpc2ZbaV0sIGRpY28xX2lzZltpICsgc3VydjFba10gKiA5XSk7CisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZltpXSwgZGljbzFfaXNmW2kgKyBzdXJ2MVtrXSAqIDldKTsgCiAJCX0KIAotCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjFfaXNmXzM2YiwgNSwgU0laRV9CSzIxXzM2YiwgJm1pbl9lcnIpOwotCQl0ZW1wID0gbWluX2VycjsKLQkJdG1wX2luZFsxXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMls1XSwgZGljbzIyX2lzZl8zNmIsIDQsIFNJWkVfQksyMl8zNmIsICZtaW5fZXJyKTsKKwkJdG1wX2luZFswXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlswXSwgZGljbzIxX2lzZl8zNmIsIDUsIFNJWkVfQksyMV8zNmIsICZtaW5fZXJyKTsgICAgICAgIAorCQl0ZW1wID0gbWluX2VycjsgICAgICAgICAgICAgICAgICAKKwkJdG1wX2luZFsxXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMls1XSwgZGljbzIyX2lzZl8zNmIsIDQsIFNJWkVfQksyMl8zNmIsICZtaW5fZXJyKTsgICAgICAgIAogCQl0ZW1wID0gdm9fTF9hZGQodGVtcCwgbWluX2Vycik7CiAKIAkJaWYodGVtcCA8IGRpc3RhbmNlKQogCQl7Ci0JCQlkaXN0YW5jZSA9IHRlbXA7Ci0JCQlpbmRpY2VbMF0gPSBzdXJ2MVtrXTsKKwkJCWRpc3RhbmNlID0gdGVtcDsgICAgICAgICAgICAgICAKKwkJCWluZGljZVswXSA9IHN1cnYxW2tdOyAgICAgICAgICAKIAkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCiAJCQl7CiAJCQkJaW5kaWNlW2kgKyAyXSA9IHRtcF9pbmRbaV07CkBAIC0xOTEsMjMgKzE5MSwyMyBAQAogCX0KIAogCVZRX3N0YWdlMSgmaXNmWzldLCBkaWNvMl9pc2YsIDcsIFNJWkVfQksyLCBzdXJ2MSwgbmJfc3Vydik7Ci0JZGlzdGFuY2UgPSBNQVhfMzI7CisJZGlzdGFuY2UgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAKIAogCWZvciAoayA9IDA7IGsgPCBuYl9zdXJ2OyBrKyspCiAJewogCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQogCQl7Ci0JCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZls5ICsgaV0sIGRpY28yX2lzZltpICsgc3VydjFba10gKiA3XSk7CisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZls5ICsgaV0sIGRpY28yX2lzZltpICsgc3VydjFba10gKiA3XSk7ICAgICAKIAkJfQogCi0JCXRtcF9pbmRbMF0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbMF0sIGRpY28yM19pc2ZfMzZiLCA3LCBTSVpFX0JLMjNfMzZiLCAmbWluX2Vycik7Ci0JCXRlbXAgPSBtaW5fZXJyOworCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjNfaXNmXzM2YiwgNywgU0laRV9CSzIzXzM2YiwgJm1pbl9lcnIpOyAgCisJCXRlbXAgPSBtaW5fZXJyOyAgICAgICAgICAgICAgICAgIAogCiAJCWlmKHRlbXAgPCBkaXN0YW5jZSkKIAkJewotCQkJZGlzdGFuY2UgPSB0ZW1wOwotCQkJaW5kaWNlWzFdID0gc3VydjFba107Ci0JCQlpbmRpY2VbNF0gPSB0bXBfaW5kWzBdOworCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIAorCQkJaW5kaWNlWzFdID0gc3VydjFba107ICAgICAgICAgIAorCQkJaW5kaWNlWzRdID0gdG1wX2luZFswXTsgICAgICAgIAogCQl9CiAJfQogCkBAIC0yMzksMzIgKzIzOSwzMiBAQAogCXsKIAkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKIAkJewotCQkJaXNmX3FbaV0gPSBkaWNvMV9pc2ZbaW5kaWNlWzBdICogOSArIGldOworCQkJaXNmX3FbaV0gPSBkaWNvMV9pc2ZbaW5kaWNlWzBdICogOSArIGldOyAgICAKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQogCQl7Ci0JCQlpc2ZfcVtpICsgOV0gPSBkaWNvMl9pc2ZbaW5kaWNlWzFdICogNyArIGldOworCQkJaXNmX3FbaSArIDldID0gZGljbzJfaXNmW2luZGljZVsxXSAqIDcgKyBpXTsgICAgICAgCiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQl7Ci0JCQlpc2ZfcVtpXSA9IGFkZDEoaXNmX3FbaV0sIGRpY28yMV9pc2ZbaW5kaWNlWzJdICogMyArIGldKTsKLQkJCWlzZl9xW2kgKyAzXSA9IGFkZDEoaXNmX3FbaSArIDNdLCBkaWNvMjJfaXNmW2luZGljZVszXSAqIDMgKyBpXSk7Ci0JCQlpc2ZfcVtpICsgNl0gPSBhZGQxKGlzZl9xW2kgKyA2XSwgZGljbzIzX2lzZltpbmRpY2VbNF0gKiAzICsgaV0pOwotCQkJaXNmX3FbaSArIDldID0gYWRkMShpc2ZfcVtpICsgOV0sIGRpY28yNF9pc2ZbaW5kaWNlWzVdICogMyArIGldKTsKKwkJCWlzZl9xW2ldID0gYWRkMShpc2ZfcVtpXSwgZGljbzIxX2lzZltpbmRpY2VbMl0gKiAzICsgaV0pOyAgIAorCQkJaXNmX3FbaSArIDNdID0gYWRkMShpc2ZfcVtpICsgM10sIGRpY28yMl9pc2ZbaW5kaWNlWzNdICogMyArIGldKTsgIAorCQkJaXNmX3FbaSArIDZdID0gYWRkMShpc2ZfcVtpICsgNl0sIGRpY28yM19pc2ZbaW5kaWNlWzRdICogMyArIGldKTsgCisJCQlpc2ZfcVtpICsgOV0gPSBhZGQxKGlzZl9xW2kgKyA5XSwgZGljbzI0X2lzZltpbmRpY2VbNV0gKiAzICsgaV0pOyAKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCXsKLQkJCWlzZl9xW2kgKyAxMl0gPSBhZGQxKGlzZl9xW2kgKyAxMl0sIGRpY28yNV9pc2ZbaW5kaWNlWzZdICogNCArIGldKTsKKwkJCWlzZl9xW2kgKyAxMl0gPSBhZGQxKGlzZl9xW2kgKyAxMl0sIGRpY28yNV9pc2ZbaW5kaWNlWzZdICogNCArIGldKTsgIAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspCiAJCXsKLQkJCXRtcCA9IGlzZl9xW2ldOwotCQkJaXNmX3FbaV0gPSBhZGQxKHRtcCwgbWVhbl9pc2ZbaV0pOworCQkJdG1wID0gaXNmX3FbaV07ICAgICAgICAgICAgICAgCisJCQlpc2ZfcVtpXSA9IGFkZDEodG1wLCBtZWFuX2lzZltpXSk7ICAKIAkJCWlzZl9xW2ldID0gYWRkMShpc2ZfcVtpXSwgdm9fbXVsdChNVSwgcGFzdF9pc2ZxW2ldKSk7Ci0JCQlwYXN0X2lzZnFbaV0gPSB0bXA7CisJCQlwYXN0X2lzZnFbaV0gPSB0bXA7ICAKIAkJfQogCiAJCWlmIChlbmNfZGVjKQpAQCAtMjczLDkgKzI3Myw5IEBACiAJCQl7CiAJCQkJZm9yIChqID0gKExfTUVBTkJVRiAtIDEpOyBqID4gMDsgai0tKQogCQkJCXsKLQkJCQkJaXNmX2J1ZltqICogTSArIGldID0gaXNmX2J1ZlsoaiAtIDEpICogTSArIGldOworCQkJCQlpc2ZfYnVmW2ogKiBNICsgaV0gPSBpc2ZfYnVmWyhqIC0gMSkgKiBNICsgaV07IAogCQkJCX0KLQkJCQlpc2ZfYnVmW2ldID0gaXNmX3FbaV07CisJCQkJaXNmX2J1ZltpXSA9IGlzZl9xW2ldOyAKIAkJCX0KIAkJfQogCX0gZWxzZQpAQCAtMjkzLDE0ICsyOTMsMTQgQEAKIAkJLyogdXNlIHRoZSBwYXN0IElTRnMgc2xpZ2h0bHkgc2hpZnRlZCB0b3dhcmRzIHRoZWlyIG1lYW4gKi8KIAkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspCiAJCXsKLQkJCWlzZl9xW2ldID0gYWRkMSh2b19tdWx0KEFMUEhBLCBpc2ZvbGRbaV0pLCB2b19tdWx0KE9ORV9BTFBIQSwgcmVmX2lzZltpXSkpOworCQkJaXNmX3FbaV0gPSBhZGQxKHZvX211bHQoQUxQSEEsIGlzZm9sZFtpXSksIHZvX211bHQoT05FX0FMUEhBLCByZWZfaXNmW2ldKSk7IAogCQl9CiAKIAkJLyogZXN0aW1hdGUgcGFzdCBxdWFudGl6ZWQgcmVzaWR1YWwgdG8gYmUgdXNlZCBpbiBuZXh0IGZyYW1lICovCiAJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQogCQl7CiAJCQl0bXAgPSBhZGQxKHJlZl9pc2ZbaV0sIHZvX211bHQocGFzdF9pc2ZxW2ldLCBNVSkpOyAgICAgIC8qIHByZWRpY3RlZCBJU0YgKi8KLQkJCXBhc3RfaXNmcVtpXSA9IHZvX3N1Yihpc2ZfcVtpXSwgdG1wKTsKKwkJCXBhc3RfaXNmcVtpXSA9IHZvX3N1Yihpc2ZfcVtpXSwgdG1wKTsgCiAJCQlwYXN0X2lzZnFbaV0gPSAocGFzdF9pc2ZxW2ldID4+IDEpOyAgICAgICAgLyogcGFzdF9pc2ZxW2ldICo9IDAuNSAqLwogCQl9CiAJfQpAQCAtMzMyLDMyICszMzIsMzIgQEAKIAl7CiAJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCiAJCXsKLQkJCWlzZl9xW2ldID0gZGljbzFfaXNmW2luZGljZVswXSAqIDkgKyBpXTsKKwkJCWlzZl9xW2ldID0gZGljbzFfaXNmW2luZGljZVswXSAqIDkgKyBpXTsgICAgCiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKIAkJewotCQkJaXNmX3FbaSArIDldID0gZGljbzJfaXNmW2luZGljZVsxXSAqIDcgKyBpXTsKKwkJCWlzZl9xW2kgKyA5XSA9IGRpY28yX2lzZltpbmRpY2VbMV0gKiA3ICsgaV07ICAgICAgIAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKIAkJewotCQkJaXNmX3FbaV0gPSBhZGQxKGlzZl9xW2ldLCBkaWNvMjFfaXNmXzM2YltpbmRpY2VbMl0gKiA1ICsgaV0pOworCQkJaXNmX3FbaV0gPSBhZGQxKGlzZl9xW2ldLCBkaWNvMjFfaXNmXzM2YltpbmRpY2VbMl0gKiA1ICsgaV0pOyAgICAgICAKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQl7Ci0JCQlpc2ZfcVtpICsgNV0gPSBhZGQxKGlzZl9xW2kgKyA1XSwgZGljbzIyX2lzZl8zNmJbaW5kaWNlWzNdICogNCArIGldKTsKKwkJCWlzZl9xW2kgKyA1XSA9IGFkZDEoaXNmX3FbaSArIDVdLCBkaWNvMjJfaXNmXzM2YltpbmRpY2VbM10gKiA0ICsgaV0pOyAgICAgICAgCiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKIAkJewotCQkJaXNmX3FbaSArIDldID0gYWRkMShpc2ZfcVtpICsgOV0sIGRpY28yM19pc2ZfMzZiW2luZGljZVs0XSAqIDcgKyBpXSk7CisJCQlpc2ZfcVtpICsgOV0gPSBhZGQxKGlzZl9xW2kgKyA5XSwgZGljbzIzX2lzZl8zNmJbaW5kaWNlWzRdICogNyArIGldKTsgICAgICAgCiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykKIAkJewogCQkJdG1wID0gaXNmX3FbaV07Ci0JCQlpc2ZfcVtpXSA9IGFkZDEodG1wLCBtZWFuX2lzZltpXSk7Ci0JCQlpc2ZfcVtpXSA9IGFkZDEoaXNmX3FbaV0sIHZvX211bHQoTVUsIHBhc3RfaXNmcVtpXSkpOwotCQkJcGFzdF9pc2ZxW2ldID0gdG1wOworCQkJaXNmX3FbaV0gPSBhZGQxKHRtcCwgbWVhbl9pc2ZbaV0pOyAgIAorCQkJaXNmX3FbaV0gPSBhZGQxKGlzZl9xW2ldLCB2b19tdWx0KE1VLCBwYXN0X2lzZnFbaV0pKTsgICAKKwkJCXBhc3RfaXNmcVtpXSA9IHRtcDsgICAgICAgICAgIAogCQl9CiAKIApAQCAtMzY3LDkgKzM2Nyw5IEBACiAJCQl7CiAJCQkJZm9yIChqID0gKExfTUVBTkJVRiAtIDEpOyBqID4gMDsgai0tKQogCQkJCXsKLQkJCQkJaXNmX2J1ZltqICogTSArIGldID0gaXNmX2J1ZlsoaiAtIDEpICogTSArIGldOworCQkJCQlpc2ZfYnVmW2ogKiBNICsgaV0gPSBpc2ZfYnVmWyhqIC0gMSkgKiBNICsgaV07ICAgICAgCiAJCQkJfQotCQkJCWlzZl9idWZbaV0gPSBpc2ZfcVtpXTsKKwkJCQlpc2ZfYnVmW2ldID0gaXNmX3FbaV07ICAgIAogCQkJfQogCQl9CiAJfSBlbHNlCkBAIC0zODEsMjAgKzM4MSwyMCBAQAogCQkJewogCQkJCUxfdG1wICs9IChpc2ZfYnVmW2ogKiBNICsgaV0gPDwgMTQpOwogCQkJfQotCQkJcmVmX2lzZltpXSA9IHZvX3JvdW5kKExfdG1wKTsKKwkJCXJlZl9pc2ZbaV0gPSB2b19yb3VuZChMX3RtcCk7ICAgIAogCQl9CiAKIAkJLyogdXNlIHRoZSBwYXN0IElTRnMgc2xpZ2h0bHkgc2hpZnRlZCB0b3dhcmRzIHRoZWlyIG1lYW4gKi8KIAkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspCiAJCXsKLQkJCWlzZl9xW2ldID0gYWRkMSh2b19tdWx0KEFMUEhBLCBpc2ZvbGRbaV0pLCB2b19tdWx0KE9ORV9BTFBIQSwgcmVmX2lzZltpXSkpOworCQkJaXNmX3FbaV0gPSBhZGQxKHZvX211bHQoQUxQSEEsIGlzZm9sZFtpXSksIHZvX211bHQoT05FX0FMUEhBLCByZWZfaXNmW2ldKSk7ICAgICAgICAKIAkJfQogCiAJCS8qIGVzdGltYXRlIHBhc3QgcXVhbnRpemVkIHJlc2lkdWFsIHRvIGJlIHVzZWQgaW4gbmV4dCBmcmFtZSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykKIAkJewogCQkJdG1wID0gYWRkMShyZWZfaXNmW2ldLCB2b19tdWx0KHBhc3RfaXNmcVtpXSwgTVUpKTsgICAgICAvKiBwcmVkaWN0ZWQgSVNGICovCi0JCQlwYXN0X2lzZnFbaV0gPSB2b19zdWIoaXNmX3FbaV0sIHRtcCk7CisJCQlwYXN0X2lzZnFbaV0gPSB2b19zdWIoaXNmX3FbaV0sIHRtcCk7ICAKIAkJCXBhc3RfaXNmcVtpXSA9IHBhc3RfaXNmcVtpXSA+PiAxOyAgICAgICAgIC8qIHBhc3RfaXNmcVtpXSAqPSAwLjUgKi8KIAkJfQogCX0KQEAgLTQyNCwxNSArNDI0LDE1IEBACiAJCVdvcmQxNiBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICAgOiBudW1iZXIgb2YgSVNGICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkJKQogewotCVdvcmQzMiBpOworCVdvcmQzMiBpOyAKIAlXb3JkMTYgaXNmX21pbjsKIAotCWlzZl9taW4gPSBtaW5fZGlzdDsKKwlpc2ZfbWluID0gbWluX2Rpc3Q7ICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAwOyBpIDwgbiAtIDE7IGkrKykKIAl7CiAJCWlmKGlzZltpXSA8IGlzZl9taW4pCiAJCXsKLQkJCWlzZltpXSA9IGlzZl9taW47CisJCQlpc2ZbaV0gPSBpc2ZfbWluOyAgICAgICAgICAgICAgCiAJCX0KIAkJaXNmX21pbiA9IChpc2ZbaV0gKyBtaW5fZGlzdCk7CiAJfQpAQCAtNDUyLDEzICs0NTIsMTMgQEAKIAlXb3JkMzIgaSwgaiwgaW5kZXg7CiAJV29yZDMyIGRpc3RfbWluLCBkaXN0OwogCi0JZGlzdF9taW4gPSBNQVhfMzI7Ci0JcF9kaWNvID0gZGljbzsKKwlkaXN0X21pbiA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgICAKKwlwX2RpY28gPSBkaWNvOyAgICAgICAgICAgICAgICAgICAgICAgICAKIAotCWluZGV4ID0gMDsKKwlpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAwOyBpIDwgZGljb19zaXplOyBpKyspCiAJewotCQlkaXN0ID0gMDsKKwkJZGlzdCA9IDA7ICAKIAogCQlmb3IgKGogPSAwOyBqIDwgZGltOyBqKyspCiAJCXsKQEAgLTQ2OCwxOCArNDY4LDE4IEBACiAKIAkJaWYoZGlzdCA8IGRpc3RfbWluKQogCQl7Ci0JCQlkaXN0X21pbiA9IGRpc3Q7Ci0JCQlpbmRleCA9IGk7CisJCQlkaXN0X21pbiA9IGRpc3Q7ICAgICAgICAgICAgICAgCisJCQlpbmRleCA9IGk7ICAgICAgICAgICAgICAgICAgICAgCiAJCX0KIAl9CiAKLQkqZGlzdGFuY2UgPSBkaXN0X21pbjsKKwkqZGlzdGFuY2UgPSBkaXN0X21pbjsgICAgICAgICAgICAgICAgICAKIAogCS8qIFJlYWRpbmcgdGhlIHNlbGVjdGVkIHZlY3RvciAqLwotCXBfZGljbyA9ICZkaWNvW2luZGV4ICogZGltXTsKKwlwX2RpY28gPSAmZGljb1tpbmRleCAqIGRpbV07ICAgICAgICAgICAKIAlmb3IgKGogPSAwOyBqIDwgZGltOyBqKyspCiAJewotCQl4W2pdID0gKnBfZGljbysrOworCQl4W2pdID0gKnBfZGljbysrOyAgICAgICAgICAgICAgICAgIAogCX0KIAogCXJldHVybiBpbmRleDsKQEAgLTUwOCwxMSArNTA4LDExIEBACiAJaW5kZXhbMl0gPSAyOwogCWluZGV4WzNdID0gMzsKIAotCXBfZGljbyA9IGRpY287CisJcF9kaWNvID0gZGljbzsgICAgICAgICAgICAgICAgICAgICAgICAgCiAKIAlmb3IgKGkgPSAwOyBpIDwgZGljb19zaXplOyBpKyspCiAJewotCQlkaXN0ID0gMDsKKwkJZGlzdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJZm9yIChqID0gMDsgaiA8IGRpbTsgaisrKQogCQl7CiAJCQl0ZW1wID0geFtqXSAtICAoKnBfZGljbysrKTsKQEAgLTUyNSwxMSArNTI1LDExIEBACiAJCQl7CiAJCQkJZm9yIChsID0gc3VydiAtIDE7IGwgPiBrOyBsLS0pCiAJCQkJewotCQkJCQlkaXN0X21pbltsXSA9IGRpc3RfbWluW2wgLSAxXTsKLQkJCQkJaW5kZXhbbF0gPSBpbmRleFtsIC0gMV07CisJCQkJCWRpc3RfbWluW2xdID0gZGlzdF9taW5bbCAtIDFdOyAgICAgIAorCQkJCQlpbmRleFtsXSA9IGluZGV4W2wgLSAxXTsgICAgCiAJCQkJfQotCQkJCWRpc3RfbWluW2tdID0gZGlzdDsKLQkJCQlpbmRleFtrXSA9IGk7CisJCQkJZGlzdF9taW5ba10gPSBkaXN0OyAgICAgICAgCisJCQkJaW5kZXhba10gPSBpOyAgICAgICAgICAgICAgCiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jCmluZGV4IGIwYzA0YjUuLjMyOGFlZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yZXNpZHUuYwpAQCAtNTYsNyArNTYsNyBAQAogCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsKIAkJcyArPSB2b19tdWx0MzIoKCpwMSksICgqcDIpKTsKIAotCQlzID0gTF9zaGwyKHMsIDUpOworCQlzID0gTF9zaGwyKHMsIDUpOyAKIAkJeVtpXSA9IGV4dHJhY3RfaChMX2FkZChzLCAweDgwMDApKTsKIAl9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc2NhbGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc2NhbGUuYwppbmRleCA0MThjYzA2Li5iMjAzYmVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zY2FsZS5jCkBAIC0zNiw4ICszNiw4IEBACiAJewogCQlmb3IgKGkgPSBsZyAtIDEgOyBpID49IDA7IGktLSkKIAkJewotCQkJTF90bXAgPSBMX3NobDIoeFtpXSwgMTYgKyBleHApOwotCQkJeFtpXSA9IGV4dHJhY3RfaChMX2FkZChMX3RtcCwgMHg4MDAwKSk7CisJCQlMX3RtcCA9IExfc2hsMih4W2ldLCAxNiArIGV4cCk7ICAKKwkJCXhbaV0gPSBleHRyYWN0X2goTF9hZGQoTF90bXAsIDB4ODAwMCkpOyAgICAgICAgICAgIAogCQl9CiAJfQogCWVsc2UKQEAgLTQ2LDggKzQ2LDggQEAKIAkJZm9yIChpID0gbGcgLSAxOyBpID49IDA7IGktLSkKIAkJewogCQkJTF90bXAgPSB4W2ldIDw8IDE2OwotCQkJTF90bXAgPj49IGV4cDsKLQkJCXhbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsKKwkJCUxfdG1wID4+PSBleHA7IAorCQkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgIAogCQl9CiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N0cmVhbS5jCmluZGV4IDc4MGYwMDkuLmJkZjBkNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zdHJlYW0uYwpAQCAtMjksMTEgKzI5LDExIEBACiAJc3RyZWFtLT5mcmFtZV9wdHJfYmsgPSBzdHJlYW0tPmZyYW1lX3B0cjsKIAlzdHJlYW0tPnNldF9sZW4gPSAwOwogCXN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuID0gMDsKLQlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsKKwlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsJCiB9CiAKIHZvaWQgdm9BV0JfVXBkYXRlRnJhbWVCdWZmZXIoCi0JCUZyYW1lU3RyZWFtICpzdHJlYW0sCisJCUZyYW1lU3RyZWFtICpzdHJlYW0sIAogCQlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUAogCQkpCiB7CkBAIC01Myw2ICs1Myw2IEBACiAJc3RyZWFtLT5mcmFtZV9wdHJfYmsgPSBzdHJlYW0tPmZyYW1lX3B0cjsKIAlzdHJlYW0tPnNldF9sZW4gPSAwOwogCXN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuID0gMDsKLQlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsKKwlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsJCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwppbmRleCAxYmRhMDVhLi45MGZhZmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCkBAIC0zOSwxMSArMzksMTEgQEAKIAlXb3JkMTYgeV9idWZbTF9TVUJGUjE2ayArIE0xNmtdOwogCVdvcmQzMiBMX3RtcDsKIAlXb3JkMTYgKnl5LCAqcDEsICpwMjsKLQl5eSA9ICZ5X2J1ZlswXTsKKwl5eSA9ICZ5X2J1ZlswXTsgICAgICAgICAgICAgICAgICAgICAgICAKIAkvKiBjb3B5IGluaXRpYWwgZmlsdGVyIHN0YXRlcyBpbnRvIHN5bnRoZXNpcyBidWZmZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAl7Ci0JCSp5eSsrID0gbWVtW2ldOworCQkqeXkrKyA9IG1lbVtpXTsgICAgICAgICAgICAgICAgICAgIAogCX0KIAlhMCA9IChhWzBdID4+IDEpOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IC8gMiAqLwogCS8qIERvIHRoZSBmaWx0ZXJpbmcuICovCkBAIC03MCw3ICs3MCw3IEBACiAJCUxfdG1wIC09IHZvX211bHQzMigoKnAxKSwgKCpwMikpOwogCiAJCUxfdG1wID0gTF9zaGwyKExfdG1wLCA0KTsKLQkJeVtpXSA9IHl5W2ldID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsKKwkJeVtpXSA9IHl5W2ldID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsgIAogCX0KIAkvKiBVcGRhdGUgbWVtb3J5IGlmIHJlcXVpcmVkICovCiAJaWYgKHVwZGF0ZSkKQEAgLTk5LDcgKzk5LDcgQEAKIAkvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLwogCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQogCXsKLQkJTF90bXAgID0gMDsKKwkJTF90bXAgID0gMDsgCiAJCUxfdG1wMSA9IDA7CiAJCXAxID0gYTsKIAkJcDIgPSAmc2lnX2xvW2kgLSAxXTsKQEAgLTEzOCwxOCArMTM4LDE4IEBACiAJCUxfdG1wICAtPSB2b19tdWx0MzIoKCpwMi0tKSwgKCpwMSkpOwogCQlMX3RtcDEgLT0gdm9fbXVsdDMyKCgqcDMtLSksICgqcDErKykpOwogCi0JCUxfdG1wID0gTF90bXAgPj4gMTE7CisJCUxfdG1wID0gTF90bXAgPj4gMTE7ICAgICAgCiAJCUxfdG1wICs9IHZvX0xfbXVsdChleGNbaV0sIGEwKTsKIAogCQkvKiBzaWdfaGkgPSBiaXQxNiB0byBiaXQzMSBvZiBzeW50aGVzaXMgKi8KIAkJTF90bXAgPSBMX3RtcCAtIChMX3RtcDE8PDEpOwogCiAJCUxfdG1wID0gTF90bXAgPj4gMzsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLwotCQlzaWdfaGlbaV0gPSBleHRyYWN0X2goTF90bXApOworCQlzaWdfaGlbaV0gPSBleHRyYWN0X2goTF90bXApOyAgICAgIAogCiAJCS8qIHNpZ19sbyA9IGJpdDQgdG8gYml0MTUgb2Ygc3ludGhlc2lzICovCiAJCUxfdG1wID4+PSA0OyAgICAgICAgICAgLyogNCA6IHNpZ19sb1tpXSA+PiA0ICovCi0JCXNpZ19sb1tpXSA9IChXb3JkMTYpKChMX3RtcCAtIChzaWdfaGlbaV0gPDwgMTMpKSk7CisJCXNpZ19sb1tpXSA9IChXb3JkMTYpKChMX3RtcCAtIChzaWdfaGlbaV0gPDwgMTMpKSk7ICAKIAl9CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3VwZHRfdGFyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3VwZHRfdGFyLmMKaW5kZXggOTY3NzlmZC4uZWRhMmIxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91cGR0X3Rhci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYwpAQCAtMzksNyArMzksNyBAQAogCXsKIAkJTF90bXAgPSB4W2ldIDw8IDE1OwogCQlMX3RtcCAtPSAoeVtpXSAqIGdhaW4pPDwxOwotCQl4MltpXSA9IGV4dHJhY3RfaChMX3NobDIoTF90bXAsIDEpKTsKKwkJeDJbaV0gPSBleHRyYWN0X2goTF9zaGwyKExfdG1wLCAxKSk7IAogCX0KIAogCXJldHVybjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKaW5kZXggMGY0ZDY4OS4uYmFjMDBkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKQEAgLTg0LDExICs4NCwxMSBAQAogCVNldF96ZXJvKGNvZF9zdGF0ZS0+b2xkX2V4YywgUElUX01BWCArIExfSU5URVJQT0wpOwogCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX3N5biwgTSk7CiAJU2V0X3plcm8oY29kX3N0YXRlLT5wYXN0X2lzZnEsIE0pOwotCWNvZF9zdGF0ZS0+bWVtX3cwID0gMDsKLQljb2Rfc3RhdGUtPnRpbHRfY29kZSA9IDA7Ci0JY29kX3N0YXRlLT5maXJzdF9mcmFtZSA9IDE7CisJY29kX3N0YXRlLT5tZW1fdzAgPSAwOyAgICAgICAgICAgICAgICAgCisJY29kX3N0YXRlLT50aWx0X2NvZGUgPSAwOyAgICAgICAgICAgICAgCisJY29kX3N0YXRlLT5maXJzdF9mcmFtZSA9IDE7ICAgICAgICAgICAgCiAJSW5pdF9ncF9jbGlwKGNvZF9zdGF0ZS0+Z3BfY2xpcCk7Ci0JY29kX3N0YXRlLT5MX2djX3RocmVzID0gMDsKKwljb2Rfc3RhdGUtPkxfZ2NfdGhyZXMgPSAwOyAgICAgICAgICAgICAKIAlpZiAocmVzZXRfYWxsICE9IDApCiAJewogCQkvKiBTdGF0aWMgdmVjdG9ycyB0byB6ZXJvICovCkBAIC0xMDUsMjEgKzEwNSwyMSBAQAogCQlDb3B5KGlzcF9pbml0LCBjb2Rfc3RhdGUtPmlzcG9sZCwgTSk7CiAJCUNvcHkoaXNwX2luaXQsIGNvZF9zdGF0ZS0+aXNwb2xkX3EsIE0pOwogCQkvKiB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiAqLwotCQljb2Rfc3RhdGUtPm1lbV9wcmVlbXBoID0gMDsKLQkJY29kX3N0YXRlLT5tZW1fd3NwID0gMDsKLQkJY29kX3N0YXRlLT5RX29sZCA9IDE1OwotCQljb2Rfc3RhdGUtPlFfbWF4WzBdID0gMTU7Ci0JCWNvZF9zdGF0ZS0+UV9tYXhbMV0gPSAxNTsKLQkJY29kX3N0YXRlLT5vbGRfd3NwX21heCA9IDA7Ci0JCWNvZF9zdGF0ZS0+b2xkX3dzcF9zaGlmdCA9IDA7CisJCWNvZF9zdGF0ZS0+bWVtX3ByZWVtcGggPSAwOyAgICAgICAgCisJCWNvZF9zdGF0ZS0+bWVtX3dzcCA9IDA7ICAgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+UV9vbGQgPSAxNTsgICAgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+UV9tYXhbMF0gPSAxNTsgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+UV9tYXhbMV0gPSAxNTsgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+b2xkX3dzcF9tYXggPSAwOyAgICAgICAgCisJCWNvZF9zdGF0ZS0+b2xkX3dzcF9zaGlmdCA9IDA7ICAgICAgCiAJCS8qIHBpdGNoIG9sIGluaXRpYWxpemF0aW9uICovCi0JCWNvZF9zdGF0ZS0+b2xkX1QwX21lZCA9IDQwOwotCQljb2Rfc3RhdGUtPm9sX2dhaW4gPSAwOwotCQljb2Rfc3RhdGUtPmFkYV93ID0gMDsKLQkJY29kX3N0YXRlLT5vbF93Z2h0X2ZsZyA9IDA7CisJCWNvZF9zdGF0ZS0+b2xkX1QwX21lZCA9IDQwOyAgICAgICAgCisJCWNvZF9zdGF0ZS0+b2xfZ2FpbiA9IDA7ICAgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+YWRhX3cgPSAwOyAgICAgICAgICAgICAgCisJCWNvZF9zdGF0ZS0+b2xfd2dodF9mbGcgPSAwOyAgICAgICAgCiAJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCXsKLQkJCWNvZF9zdGF0ZS0+b2xkX29sX2xhZ1tpXSA9IDQwOworCQkJY29kX3N0YXRlLT5vbGRfb2xfbGFnW2ldID0gNDA7IAogCQl9CiAJCVNldF96ZXJvKGNvZF9zdGF0ZS0+b2xkX2hwX3dzcCwgKExfRlJBTUUgLyAyKSAvIE9QTF9ERUNJTSArIChQSVRfTUFYIC8gT1BMX0RFQ0lNKSk7CiAJCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX3N5bl9oZiwgTSk7CkBAIC0xMjksMTAgKzEyOSwxMCBAQAogCQlJbml0X0ZpbHRfNmtfN2soY29kX3N0YXRlLT5tZW1faGYpOwogCQlJbml0X0hQNDAwXzEyazgoY29kX3N0YXRlLT5tZW1faHA0MDApOwogCQlDb3B5KGlzZl9pbml0LCBjb2Rfc3RhdGUtPmlzZm9sZCwgTSk7Ci0JCWNvZF9zdGF0ZS0+bWVtX2RlZW1waCA9IDA7Ci0JCWNvZF9zdGF0ZS0+c2VlZDIgPSAyMTg0NTsKKwkJY29kX3N0YXRlLT5tZW1fZGVlbXBoID0gMDsgICAgICAgICAKKwkJY29kX3N0YXRlLT5zZWVkMiA9IDIxODQ1OyAgICAgICAgICAKIAkJSW5pdF9GaWx0XzZrXzdrKGNvZF9zdGF0ZS0+bWVtX2hmMik7Ci0JCWNvZF9zdGF0ZS0+Z2Fpbl9hbHBoYSA9IDMyNzY3OworCQljb2Rfc3RhdGUtPmdhaW5fYWxwaGEgPSAzMjc2NzsgICAgIAogCQljb2Rfc3RhdGUtPnZhZF9oaXN0ID0gMDsKIAkJd2JfdmFkX3Jlc2V0KGNvZF9zdGF0ZS0+dmFkU3QpOwogCQlkdHhfZW5jX3Jlc2V0KGNvZF9zdGF0ZS0+ZHR4X2VuY1N0LCBpc2ZfaW5pdCk7CkBAIC0yMTIsOCArMjEyLDggQEAKIAogCXN0ID0gKENvZGVyX1N0YXRlICopIHNwZV9zdGF0ZTsKIAotCSpzZXJfc2l6ZSA9IG5iX29mX2JpdHNbKm1vZGVdOwotCWNvZGVjX21vZGUgPSAqbW9kZTsKKwkqc2VyX3NpemUgPSBuYl9vZl9iaXRzWyptb2RlXTsgICAgICAgICAKKwljb2RlY19tb2RlID0gKm1vZGU7ICAgICAgICAgICAgICAgICAgICAKIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiAJICogICAgICAgICAgSW5pdGlhbGl6ZSBwb2ludGVycyB0byBzcGVlY2ggdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTIzMywxMCArMjMzLDEwIEBACiAKIAluZXdfc3BlZWNoID0gb2xkX3NwZWVjaCArIExfVE9UQUwgLSBMX0ZSQU1FIC0gTF9GSUxUOyAgICAgICAgIC8qIE5ldyBzcGVlY2ggICAgICovCiAJc3BlZWNoID0gb2xkX3NwZWVjaCArIExfVE9UQUwgLSBMX0ZSQU1FIC0gTF9ORVhUOyAgICAgICAgICAgICAvKiBQcmVzZW50IGZyYW1lICAqLwotCXBfd2luZG93ID0gb2xkX3NwZWVjaCArIExfVE9UQUwgLSBMX1dJTkRPVzsKKwlwX3dpbmRvdyA9IG9sZF9zcGVlY2ggKyBMX1RPVEFMIC0gTF9XSU5ET1c7IAogCi0JZXhjID0gb2xkX2V4YyArIFBJVF9NQVggKyBMX0lOVEVSUE9MOwotCXdzcCA9IG9sZF93c3AgKyAoUElUX01BWCAvIE9QTF9ERUNJTSk7CisJZXhjID0gb2xkX2V4YyArIFBJVF9NQVggKyBMX0lOVEVSUE9MOyAgCisJd3NwID0gb2xkX3dzcCArIChQSVRfTUFYIC8gT1BMX0RFQ0lNKTsgCiAKIAkvKiBjb3B5IGNvZGVyIG1lbW9yeSBzdGF0ZSBpbnRvIHdvcmtpbmcgc3BhY2UgKi8KIAlDb3B5KHN0LT5vbGRfc3BlZWNoLCBvbGRfc3BlZWNoLCBMX1RPVEFMIC0gTF9GUkFNRSk7CkBAIC0yODcsNyArMjg3LDcgQEAKIAkJTF90bXAgPSBMX2FicyhMX3RtcCk7CiAJCWlmKExfdG1wID4gTF9tYXgpCiAJCXsKLQkJCUxfbWF4ID0gTF90bXA7CisJCQlMX21heCA9IExfdG1wOyAgICAgICAgICAgICAgICAgCiAJCX0KIAl9CiAKQEAgLTI5Nyw1MCArMjk3LDUwIEBACiAJdG1wID0gZXh0cmFjdF9oKExfbWF4KTsKIAlpZiAodG1wID09IDApCiAJewotCQlzaGlmdCA9IFFfTUFYOworCQlzaGlmdCA9IFFfTUFYOyAgICAgICAgICAgICAgICAgICAgIAogCX0gZWxzZQogCXsKIAkJc2hpZnQgPSBub3JtX3ModG1wKSAtIDE7CiAJCWlmIChzaGlmdCA8IDApCiAJCXsKLQkJCXNoaWZ0ID0gMDsKKwkJCXNoaWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAKIAkJfQogCQlpZiAoc2hpZnQgPiBRX01BWCkKIAkJewotCQkJc2hpZnQgPSBRX01BWDsKKwkJCXNoaWZ0ID0gUV9NQVg7ICAgICAgICAgICAgICAgICAKIAkJfQogCX0KLQlRX25ldyA9IHNoaWZ0OworCVFfbmV3ID0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIAogCWlmIChRX25ldyA+IHN0LT5RX21heFswXSkKIAl7Ci0JCVFfbmV3ID0gc3QtPlFfbWF4WzBdOworCQlRX25ldyA9IHN0LT5RX21heFswXTsgICAgICAgICAgICAgIAogCX0KIAlpZiAoUV9uZXcgPiBzdC0+UV9tYXhbMV0pCiAJewotCQlRX25ldyA9IHN0LT5RX21heFsxXTsKKwkJUV9uZXcgPSBzdC0+UV9tYXhbMV07ICAgICAgICAgICAgICAKIAl9CiAJZXhwID0gKFFfbmV3IC0gc3QtPlFfb2xkKTsKLQlzdC0+UV9vbGQgPSBRX25ldzsKLQlzdC0+UV9tYXhbMV0gPSBzdC0+UV9tYXhbMF07Ci0Jc3QtPlFfbWF4WzBdID0gc2hpZnQ7CisJc3QtPlFfb2xkID0gUV9uZXc7ICAgICAgICAgICAgICAgICAgICAgCisJc3QtPlFfbWF4WzFdID0gc3QtPlFfbWF4WzBdOyAgICAgICAgICAgCisJc3QtPlFfbWF4WzBdID0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgCiAKIAkvKiBwcmVlbXBoYXNpcyB3aXRoIHNjYWxpbmcgKExfRlJBTUUrTF9GSUxUKSAqLwotCXRtcCA9IG5ld19zcGVlY2hbTF9GUkFNRSAtIDFdOworCXRtcCA9IG5ld19zcGVlY2hbTF9GUkFNRSAtIDFdOyAgICAgICAgIAogCiAJZm9yIChpID0gTF9GUkFNRSArIExfRklMVCAtIDE7IGkgPiAwOyBpLS0pCiAJewogCQlMX3RtcCA9IG5ld19zcGVlY2hbaV0gPDwgMTU7CiAJCUxfdG1wIC09IChuZXdfc3BlZWNoW2kgLSAxXSAqIG11KTw8MTsKIAkJTF90bXAgPSAoTF90bXAgPDwgUV9uZXcpOwotCQluZXdfc3BlZWNoW2ldID0gdm9fcm91bmQoTF90bXApOworCQluZXdfc3BlZWNoW2ldID0gdm9fcm91bmQoTF90bXApOyAgICAgIAogCX0KIAogCUxfdG1wID0gbmV3X3NwZWVjaFswXSA8PCAxNTsKIAlMX3RtcCAtPSAoc3QtPm1lbV9wcmVlbXBoICogbXUpPDwxOwogCUxfdG1wID0gKExfdG1wIDw8IFFfbmV3KTsKLQluZXdfc3BlZWNoWzBdID0gdm9fcm91bmQoTF90bXApOworCW5ld19zcGVlY2hbMF0gPSB2b19yb3VuZChMX3RtcCk7ICAgICAgICAgIAogCi0Jc3QtPm1lbV9wcmVlbXBoID0gdG1wOworCXN0LT5tZW1fcHJlZW1waCA9IHRtcDsgICAgICAgICAgICAgICAgIAogCiAJLyogc2NhbGUgcHJldmlvdXMgc2FtcGxlcyBhbmQgbWVtb3J5ICovCiAKQEAgLTM2NCwxMyArMzY0LDEzIEBACiAJU2NhbGVfc2lnKGJ1ZiwgTF9GUkFNRSwgMSAtIFFfbmV3KTsKICNlbmRpZgogCi0JdmFkX2ZsYWcgPSB3Yl92YWQoc3QtPnZhZFN0LCBidWYpOyAgICAgICAgICAvKiBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24gKi8KKwl2YWRfZmxhZyA9IHdiX3ZhZChzdC0+dmFkU3QsIGJ1Zik7ICAgICAgICAgIC8qIFZvaWNlIEFjdGl2aXR5IERldGVjdGlvbiAqLyAKIAlpZiAodmFkX2ZsYWcgPT0gMCkKIAl7Ci0JCXN0LT52YWRfaGlzdCA9IChzdC0+dmFkX2hpc3QgKyAxKTsKKwkJc3QtPnZhZF9oaXN0ID0gKHN0LT52YWRfaGlzdCArIDEpOyAgICAgICAgCiAJfSBlbHNlCiAJewotCQlzdC0+dmFkX2hpc3QgPSAwOworCQlzdC0+dmFkX2hpc3QgPSAwOyAgICAgICAgICAgICAKIAl9CiAKIAkvKiBEVFggcHJvY2Vzc2luZyAqLwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJewogCQkvKiBOb3RlIHRoYXQgbW9kZSBtYXkgY2hhbmdlIGhlcmUgKi8KIAkJdHhfZHR4X2hhbmRsZXIoc3QtPmR0eF9lbmNTdCwgdmFkX2ZsYWcsIG1vZGUpOwotCQkqc2VyX3NpemUgPSBuYl9vZl9iaXRzWyptb2RlXTsKKwkJKnNlcl9zaXplID0gbmJfb2ZfYml0c1sqbW9kZV07IAogCX0KIAogCWlmKCptb2RlICE9IE1SRFRYKQpAQCAtNDIzLDcgKzQyMyw3IEBACiAJICogLSBzY2FsZSB3c3BbXSB0byBhdm9pZCBvdmVyZmxvdyBpbiBwaXRjaCBlc3RpbWF0aW9uICAgICAgICAgICAgICAgICAgKgogCSAqIC0gRmluZCBvcGVuIGxvb3AgcGl0Y2ggbGFnIGZvciB3aG9sZSBzcGVlY2ggZnJhbWUgICAgICAgICAgICAgICAgICAgICoKIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXBfQSA9IEE7CisJcF9BID0gQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpCiAJewogCQkvKiBXZWlnaHRpbmcgb2YgTFBDIGNvZWZmaWNpZW50cyAqLwpAQCAtNDM1LDI3ICs0MzUsMjcgQEAKIAkJUmVzaWR1KEFwLCAmc3BlZWNoW2lfc3ViZnJdLCAmd3NwW2lfc3ViZnJdLCBMX1NVQkZSKTsKICNlbmRpZgogCi0JCXBfQSArPSAoTSArIDEpOworCQlwX0EgKz0gKE0gKyAxKTsgICAgICAgICAgICAgICAgICAgIAogCX0KIAogCURlZW1waDIod3NwLCBUSUxUX0ZBQywgTF9GUkFNRSwgJihzdC0+bWVtX3dzcCkpOwogCiAJLyogZmluZCBtYXhpbXVtIHZhbHVlIG9uIHdzcFtdIGZvciAxMiBiaXRzIHNjYWxpbmcgKi8KLQltYXggPSAwOworCW1heCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykKIAl7CiAJCXRtcCA9IGFic19zKHdzcFtpXSk7CiAJCWlmKHRtcCA+IG1heCkKIAkJewotCQkJbWF4ID0gdG1wOworCQkJbWF4ID0gdG1wOyAgICAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQotCXRtcCA9IHN0LT5vbGRfd3NwX21heDsKKwl0bXAgPSBzdC0+b2xkX3dzcF9tYXg7ICAgICAgICAgICAgICAgICAKIAlpZihtYXggPiB0bXApCiAJewogCQl0bXAgPSBtYXg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRtcCA9IG1heCh3c3BfbWF4LCBvbGRfd3NwX21heCkgKi8KIAl9Ci0Jc3QtPm9sZF93c3BfbWF4ID0gbWF4OworCXN0LT5vbGRfd3NwX21heCA9IG1heDsgICAgICAgICAgICAgICAgCiAKIAlzaGlmdCA9IG5vcm1fcyh0bXApIC0gMzsKIAlpZiAoc2hpZnQgPiAwKQpAQCAtNDk0LDggKzQ5NCw4IEBACiAKIAlpZihzdC0+b2xfZ2FpbiA+IDE5NjYxKSAgICAgICAvKiAwLjYgaW4gUTE1ICovCiAJewotCQlzdC0+b2xkX1QwX21lZCA9IE1lZF9vbGFnKFRfb3AsIHN0LT5vbGRfb2xfbGFnKTsKLQkJc3QtPmFkYV93ID0gMzI3Njc7CisJCXN0LT5vbGRfVDBfbWVkID0gTWVkX29sYWcoVF9vcCwgc3QtPm9sZF9vbF9sYWcpOyAgICAgICAKKwkJc3QtPmFkYV93ID0gMzI3Njc7ICAgICAgICAgICAgICAgICAKIAl9IGVsc2UKIAl7CiAJCXN0LT5hZGFfdyA9IHZvX211bHQoc3QtPmFkYV93LCAyOTQ5MSk7CkBAIC01MDcsNyArNTA3LDcgQEAKIAkJc3QtPm9sX3dnaHRfZmxnID0gMTsKIAogCXdiX3ZhZF90b25lX2RldGVjdGlvbihzdC0+dmFkU3QsIHN0LT5vbF9nYWluKTsKLQlUX29wICo9IE9QTF9ERUNJTTsKKwlUX29wICo9IE9QTF9ERUNJTTsgICAgICAgICAgICAgICAgICAgICAKIAogCWlmKCpzZXJfc2l6ZSAhPSBOQkJJVFNfN2spCiAJewpAQCAtNTE2LDExICs1MTYsMTEgQEAKIAogCQlpZihzdC0+b2xfZ2FpbiA+IDE5NjYxKSAgIC8qIDAuNiBpbiBRMTUgKi8KIAkJewotCQkJc3QtPm9sZF9UMF9tZWQgPSBNZWRfb2xhZyhUX29wMiwgc3QtPm9sZF9vbF9sYWcpOwotCQkJc3QtPmFkYV93ID0gMzI3Njc7CisJCQlzdC0+b2xkX1QwX21lZCA9IE1lZF9vbGFnKFRfb3AyLCBzdC0+b2xkX29sX2xhZyk7ICAKKwkJCXN0LT5hZGFfdyA9IDMyNzY3OyAgICAgICAgICAgICAKIAkJfSBlbHNlCiAJCXsKLQkJCXN0LT5hZGFfdyA9IG11bHQoc3QtPmFkYV93LCAyOTQ5MSk7CisJCQlzdC0+YWRhX3cgPSBtdWx0KHN0LT5hZGFfdywgMjk0OTEpOyAKIAkJfQogCiAJCWlmKHN0LT5hZGFfdyA8IDI2MjE0KQpAQCAtNTMwLDExICs1MzAsMTEgQEAKIAogCQl3Yl92YWRfdG9uZV9kZXRlY3Rpb24oc3QtPnZhZFN0LCBzdC0+b2xfZ2Fpbik7CiAKLQkJVF9vcDIgKj0gT1BMX0RFQ0lNOworCQlUX29wMiAqPSBPUExfREVDSU07ICAgICAgICAgICAgICAgIAogCiAJfSBlbHNlCiAJewotCQlUX29wMiA9IFRfb3A7CisJCVRfb3AyID0gVF9vcDsgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKIAkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUWC1DTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCkBAIC01NTAsMTAgKzU1MCwxMCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspCiAJCXsKLQkJCWV4YzJbaV0gPSBzaHIoZXhjW2ldLCBRX25ldyk7CisJCQlleGMyW2ldID0gc2hyKGV4Y1tpXSwgUV9uZXcpOyAgCiAJCX0KIAotCQlMX3RtcCA9IDA7CisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspCiAJCQlMX3RtcCArPSAoZXhjMltpXSAqIGV4YzJbaV0pPDwxOwogCkBAIC02MTcsMjMgKzYxNywyMyBAQAogCiAJLyogQ2hlY2sgc3RhYmlsaXR5IG9uIGlzZiA6IGRpc3RhbmNlIGJldHdlZW4gb2xkIGlzZiBhbmQgY3VycmVudCBpc2YgKi8KIAotCUxfdG1wID0gMDsKKwlMX3RtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMDsgaSA8IE0gLSAxOyBpKyspCiAJewogCQl0bXAgPSB2b19zdWIoaXNmW2ldLCBzdC0+aXNmb2xkW2ldKTsKIAkJTF90bXAgKz0gKHRtcCAqIHRtcCk8PDE7CiAJfQogCi0JdG1wID0gZXh0cmFjdF9oKExfc2hsMihMX3RtcCwgOCkpOworCXRtcCA9IGV4dHJhY3RfaChMX3NobDIoTF90bXAsIDgpKTsgCiAKIAl0bXAgPSB2b19tdWx0KHRtcCwgMjYyMTQpOyAgICAgICAgICAgICAgICAvKiB0bXAgPSBMX3RtcCowLjgvMjU2ICovCiAJdG1wID0gdm9fc3ViKDIwNDgwLCB0bXApOyAgICAgICAgICAgICAgICAgLyogMS4yNSAtIHRtcCAoaW4gUTE0KSAqLwogCi0Jc3RhYl9mYWMgPSBzaGwodG1wLCAxKTsKKwlzdGFiX2ZhYyA9IHNobCh0bXAsIDEpOyAKIAogCWlmIChzdGFiX2ZhYyA8IDApCiAJewotCQlzdGFiX2ZhYyA9IDA7CisJCXN0YWJfZmFjID0gMDsgICAgICAgICAgICAgICAgICAgICAgCiAJfQogCUNvcHkoaXNmLCBzdC0+aXNmb2xkLCBNKTsKIApAQCAtNjQyLDcgKzY0Miw3IEBACiAKIAlpZiAoc3QtPmZpcnN0X2ZyYW1lICE9IDApCiAJewotCQlzdC0+Zmlyc3RfZnJhbWUgPSAwOworCQlzdC0+Zmlyc3RfZnJhbWUgPSAwOyAgICAgICAgICAgICAgCiAJCUNvcHkoaXNwbmV3X3EsIHN0LT5pc3BvbGRfcSwgTSk7CiAJfQogCS8qIEZpbmQgdGhlIGludGVycG9sYXRlZCBJU1BzIGFuZCBjb252ZXJ0IHRvIGFbXSBmb3IgYWxsIHN1YmZyYW1lcyAqLwpAQCAtNjYwLDcgKzY2MCw3IEBACiAjZWxzZQogCQlSZXNpZHUocF9BcSwgJnNwZWVjaFtpX3N1YmZyXSwgJmV4Y1tpX3N1YmZyXSwgTF9TVUJGUik7CiAjZW5kaWYKLQkJcF9BcSArPSAoTSArIDEpOworCQlwX0FxICs9IChNICsgMSk7ICAgICAgICAgICAgICAgICAgIAogCX0KIAogCS8qIEJ1ZmZlciBpc2YncyBhbmQgZW5lcmd5IGZvciBkdHggb24gbm9uLXNwZWVjaCBmcmFtZSAqLwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJCXsKIAkJCWV4YzJbaV0gPSBleGNbaV0gPj4gUV9uZXc7CiAJCX0KLQkJTF90bXAgPSAwOworCQlMX3RtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIAogCQlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQogCQkJTF90bXAgKz0gKGV4YzJbaV0gKiBleGMyW2ldKTw8MTsKIAkJTF90bXAgPj49IDE7CkBAIC02ODIsMTQgKzY4MiwxNCBAQAogCVQwX21pbiA9IFRfb3AgLSA4OwogCWlmIChUMF9taW4gPCBQSVRfTUlOKQogCXsKLQkJVDBfbWluID0gUElUX01JTjsKKwkJVDBfbWluID0gUElUX01JTjsgICAgICAgICAgICAgICAgICAKIAl9CiAJVDBfbWF4ID0gKFQwX21pbiArIDE1KTsKIAogCWlmKFQwX21heCA+IFBJVF9NQVgpCiAJewotCQlUMF9tYXggPSBQSVRfTUFYOwotCQlUMF9taW4gPSBUMF9tYXggLSAxNTsKKwkJVDBfbWF4ID0gUElUX01BWDsgICAgICAgICAgICAgICAgICAKKwkJVDBfbWluID0gVDBfbWF4IC0gMTU7ICAgICAgICAgIAogCX0KIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKIAkgKiAgICAgICAgICBMb29wIGZvciBldmVyeSBzdWJmcmFtZSBpbiB0aGUgYW5hbHlzaXMgZnJhbWUgICAgICAgICAgICAgICAgICoKQEAgLTcxMSwyNSArNzExLDI1IEBACiAJICogICAgIC0gdXBkYXRlIHN0YXRlcyBvZiB3ZWlnaHRpbmcgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAJICogICAgIC0gZmluZCBleGNpdGF0aW9uIGFuZCBzeW50aGVzaXMgc3BlZWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXBfQSA9IEE7Ci0JcF9BcSA9IEFxOworCXBfQSA9IEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXBfQXEgPSBBcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpCiAJewotCQlwaXRfZmxhZyA9IGlfc3ViZnI7CisJCXBpdF9mbGFnID0gaV9zdWJmcjsgICAgICAgICAgICAgICAgCiAJCWlmICgoaV9zdWJmciA9PSAyICogTF9TVUJGUikgJiYgKCpzZXJfc2l6ZSA+IE5CQklUU183aykpCiAJCXsKLQkJCXBpdF9mbGFnID0gMDsKKwkJCXBpdF9mbGFnID0gMDsgICAgICAgICAgICAgICAgIAogCQkJLyogcmFuZ2UgZm9yIGNsb3NlZCBsb29wIHBpdGNoIHNlYXJjaCBpbiAzcmQgc3ViZnJhbWUgKi8KIAkJCVQwX21pbiA9IChUX29wMiAtIDgpOwogCiAJCQlpZiAoVDBfbWluIDwgUElUX01JTikKIAkJCXsKLQkJCQlUMF9taW4gPSBQSVRfTUlOOworCQkJCVQwX21pbiA9IFBJVF9NSU47ICAgICAgICAgIAogCQkJfQogCQkJVDBfbWF4ID0gKFQwX21pbiArIDE1KTsKIAkJCWlmIChUMF9tYXggPiBQSVRfTUFYKQogCQkJewotCQkJCVQwX21heCA9IFBJVF9NQVg7CisJCQkJVDBfbWF4ID0gUElUX01BWDsgICAgICAgICAKIAkJCQlUMF9taW4gPSAoVDBfbWF4IC0gMTUpOwogCQkJfQogCQl9CkBAIC03NzYsNyArNzc2LDcgQEAKIAkJLyogZmlyc3QgaGFsZjogeG5bXSAtLT4gY25bXSAqLwogCQlTZXRfemVybyhjb2RlLCBNKTsKIAkJQ29weSh4biwgY29kZSArIE0sIExfU1VCRlIgLyAyKTsKLQkJdG1wID0gMDsKKwkJdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQlQcmVlbXBoMihjb2RlICsgTSwgVElMVF9GQUMsIExfU1VCRlIgLyAyLCAmdG1wKTsKIAkJV2VpZ2h0X2EocF9BLCBBcCwgR0FNTUExLCBNKTsKIAkJU3luX2ZpbHQoQXAsY29kZSArIE0sIGNvZGUgKyBNLCBMX1NVQkZSIC8gMiwgY29kZSwgMCk7CkBAIC03OTEsNyArNzkxLDcgQEAKIAkJQ29weSgmZXhjW2lfc3ViZnIgKyAoTF9TVUJGUiAvIDIpXSwgY24gKyAoTF9TVUJGUiAvIDIpLCBMX1NVQkZSIC8gMik7CiAKIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0JCSAqIENvbXB1dGUgaW1wdWxzZSByZXNwb25zZSwgaDFbXSwgb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciAgKgorCQkgKiBDb21wdXRlIGltcHVsc2UgcmVzcG9uc2UsIGgxW10sIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgICogCiAJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCQlTZXRfemVybyhlcnJvciwgTSArIExfU1VCRlIpOwpAQCAtODE0LDcgKzgxNCw3IEBACiAJCQkqdm9fcDMrKyA9ICp2b19wMCsrID0gdm9fcm91bmQoKExfdG1wIDw8NCkpOwogCQl9CiAJCS8qIGRlZW1waCB3aXRob3V0IGRpdmlzaW9uIGJ5IDIgLT4gUTE0IHRvIFExNSAqLwotCQl0bXAgPSAwOworCQl0bXAgPSAwOyAKIAkJRGVlbXBoMihoMSwgVElMVF9GQUMsIExfU1VCRlIsICZ0bXApOyAgIC8qIGgxIGluIFExNCAqLwogCiAJCS8qIGgyIGluIFExMiBmb3IgY29kZWJvb2sgc2VhcmNoICovCkBAIC05MTcsNyArOTE3LDcgQEAKIAkJCQlUMF9taW4gPSAoVDAgLSA4KTsKIAkJCQlpZiAoVDBfbWluIDwgUElUX01JTikKIAkJCQl7Ci0JCQkJCVQwX21pbiA9IFBJVF9NSU47CisJCQkJCVQwX21pbiA9IFBJVF9NSU47IAogCQkJCX0KIAkJCQlUMF9tYXggPSBUMF9taW4gKyAxNTsKIApAQCAtOTY0LDE4ICs5NjQsMTggQEAKIAkJCUNvbnZvbHZlX2FzbSgmZXhjW2lfc3ViZnJdLCBoMSwgeTEsIExfU1VCRlIpOwogI2Vsc2UKIAkJCUNvbnZvbHZlKCZleGNbaV9zdWJmcl0sIGgxLCB5MSwgTF9TVUJGUik7Ci0jZW5kaWYKKyNlbmRpZiAKIAkJCWdhaW4xID0gR19waXRjaCh4biwgeTEsIGdfY29lZmYsIExfU1VCRlIpOwogCQkJLyogY2xpcCBnYWluIGlmIG5lY2Vzc2FyeSB0byBhdm9pZCBwcm9ibGVtIGF0IGRlY29kZXIgKi8KIAkJCWlmICgoY2xpcF9nYWluICE9IDApICYmIChnYWluMSA+IEdQX0NMSVApKQogCQkJewotCQkJCWdhaW4xID0gR1BfQ0xJUDsKKwkJCQlnYWluMSA9IEdQX0NMSVA7IAogCQkJfQogCQkJLyogZmluZCBlbmVyZ3kgb2YgbmV3IHRhcmdldCB4bjJbXSAqLwogCQkJVXBkdF90YXIoeG4sIGRuLCB5MSwgZ2FpbjEsIExfU1VCRlIpOyAgICAgICAvKiBkbiB1c2VkIHRlbXBvcmFyeSAqLwogCQl9IGVsc2UKIAkJewotCQkJZ2FpbjEgPSAwOworCQkJZ2FpbjEgPSAwOyAKIAkJfQogCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCQkgKiAtIGZpbmQgcGl0Y2ggZXhjaXRhdGlvbiBmaWx0ZXJlZCBieSAxc3Qgb3JkZXIgTFAgZmlsdGVyLiAgICAgICAgKgpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKIAkJQ29udm9sdmVfYXNtKGNvZGUsIGgxLCB5MiwgTF9TVUJGUik7CiAjZWxzZQogCQlDb252b2x2ZShjb2RlLCBoMSwgeTIsIExfU1VCRlIpOwotI2VuZGlmCisjZW5kaWYgCiAKIAkJZ2FpbjIgPSBHX3BpdGNoKHhuLCB5MiwgZ19jb2VmZjIsIExfU1VCRlIpOwogCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCQkgKiB1c2UgdGhlIGJlc3QgcHJlZGljdGlvbiAobWluaW1pc2UgcXVhZHJhdGljIGVycm9yKS4gICAgICAgICAgICAgKgogCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJc2VsZWN0ID0gMDsKKwkJc2VsZWN0ID0gMDsgCiAJCWlmKCpzZXJfc2l6ZSA+IE5CQklUU185aykKIAkJewogCQkJTF90bXAgPSAwTDsKQEAgLTEwMzYsNyArMTAzNiw3IEBACiAKIAkJCWlmIChMX3RtcCA8PSAwKQogCQkJewotCQkJCXNlbGVjdCA9IDE7CisJCQkJc2VsZWN0ID0gMTsgCiAJCQl9CiAJCQlQYXJtX3NlcmlhbChzZWxlY3QsIDEsICZwcm1zKTsKIAkJfQpAQCAtMTE1NCw3ICsxMTU0LDcgQEAKIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCQkgKiAtIEFkZCB0aGUgZml4ZWQtZ2FpbiBwaXRjaCBjb250cmlidXRpb24gdG8gY29kZVtdLiAgICAqCiAJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCXRtcCA9IDA7CisJCXRtcCA9IDA7IAogCQlQcmVlbXBoKGNvZGUsIHN0LT50aWx0X2NvZGUsIExfU1VCRlIsICZ0bXApOwogCQlQaXRfc2hycChjb2RlLCBUMCwgUElUX1NIQVJQLCBMX1NVQkZSKTsKIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAkJLyogdGVzdCBxdWFudGl6ZWQgZ2FpbiBvZiBwaXRjaCBmb3IgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovCiAJCUdwX2NsaXBfdGVzdF9nYWluX3BpdChnYWluX3BpdCwgc3QtPmdwX2NsaXApOwogCi0JCUxfdG1wID0gTF9zaGwoTF9nYWluX2NvZGUsIFFfbmV3KTsKKwkJTF90bXAgPSBMX3NobChMX2dhaW5fY29kZSwgUV9uZXcpOyAKIAkJZ2Fpbl9jb2RlID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsKIAogCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCQkJTF90bXAgPSAoZ2Fpbl9jb2RlICogY29kZVtpXSk8PDE7CiAJCQlMX3RtcCA9IChMX3RtcCA8PCA1KTsKIAkJCUxfdG1wICs9IChleGNbaSArIGlfc3ViZnJdICogZ2Fpbl9waXQpPDwxOwotCQkJTF90bXAgPSBMX3NobDIoTF90bXAsIDEpOworCQkJTF90bXAgPSBMX3NobDIoTF90bXAsIDEpOyAKIAkJCWV4Y1tpICsgaV9zdWJmcl0gPSBleHRyYWN0X2goTF9hZGQoTF90bXAsIDB4ODAwMCkpOwogCQl9CiAKQEAgLTEyNDIsNyArMTI0Miw3IEBACiAJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJCQl0bXAgPSAoMTYzODQgLSAodm9pY2VfZmFjID4+IDEpKTsgICAgICAgIC8qIDE9dW52b2ljZWQsIDA9dm9pY2VkICovCiAJCQlmYWMgPSB2b19tdWx0KHN0YWJfZmFjLCB0bXApOwotCQkJTF90bXAgPSBMX2dhaW5fY29kZTsKKwkJCUxfdG1wID0gTF9nYWluX2NvZGU7IAogCQkJaWYoTF90bXAgPCBzdC0+TF9nY190aHJlcykKIAkJCXsKIAkJCQlMX3RtcCA9IHZvX0xfYWRkKExfdG1wLCBNcHlfMzJfMTYoZ2Fpbl9jb2RlLCBnYWluX2NvZGVfbG8sIDYyMjYpKTsKQEAgLTEyNzYsMTkgKzEyNzYsMTkgQEAKIAogCQkJTF90bXAgPSBMX2RlcG9zaXRfaChjb2RlWzBdKTsKIAkJCUxfdG1wIC09IChjb2RlWzFdICogdG1wKTw8MTsKLQkJCWNvZGUyWzBdID0gdm9fcm91bmQoTF90bXApOworCQkJY29kZTJbMF0gPSB2b19yb3VuZChMX3RtcCk7IAogCiAJCQlmb3IgKGkgPSAxOyBpIDwgTF9TVUJGUiAtIDE7IGkrKykKIAkJCXsKIAkJCQlMX3RtcCA9IExfZGVwb3NpdF9oKGNvZGVbaV0pOwogCQkJCUxfdG1wIC09IChjb2RlW2kgKyAxXSAqIHRtcCk8PDE7CiAJCQkJTF90bXAgLT0gKGNvZGVbaSAtIDFdICogdG1wKTw8MTsKLQkJCQljb2RlMltpXSA9IHZvX3JvdW5kKExfdG1wKTsKKwkJCQljb2RlMltpXSA9IHZvX3JvdW5kKExfdG1wKTsgCiAJCQl9CiAKIAkJCUxfdG1wID0gTF9kZXBvc2l0X2goY29kZVtMX1NVQkZSIC0gMV0pOwogCQkJTF90bXAgLT0gKGNvZGVbTF9TVUJGUiAtIDJdICogdG1wKTw8MTsKLQkJCWNvZGUyW0xfU1VCRlIgLSAxXSA9IHZvX3JvdW5kKExfdG1wKTsKKwkJCWNvZGUyW0xfU1VCRlIgLSAxXSA9IHZvX3JvdW5kKExfdG1wKTsgCiAKIAkJCS8qIGJ1aWxkIGV4Y2l0YXRpb24gKi8KIAkJCWdhaW5fY29kZSA9IHZvX3JvdW5kKExfc2hsKExfZ2Fpbl9jb2RlLCBRX25ldykpOwpAQCAtMTM4MSw3ICsxMzgxLDcgQEAKIAkvKiBPcmlnaW5hbCBzcGVlY2ggc2lnbmFsIGFzIHJlZmVyZW5jZSBmb3IgaGlnaCBiYW5kIGdhaW4gcXVhbnRpc2F0aW9uICovCiAJZm9yIChpID0gMDsgaSA8IExfU1VCRlIxNms7IGkrKykKIAl7Ci0JCUhGX1NQW2ldID0gc3ludGgxNmtbaV07CisJCUhGX1NQW2ldID0gc3ludGgxNmtbaV07IAogCX0KIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIAkJZmFjID0gZGl2X3ModG1wLCBlbmVyKTsKIAl9IGVsc2UKIAl7Ci0JCWZhYyA9IDA7CisJCWZhYyA9IDA7IAogCX0KIAogCS8qIG1vZGlmeSBlbmVyZ3kgb2Ygd2hpdGUgbm9pc2UgYWNjb3JkaW5nIHRvIHN5bnRoZXNpcyB0aWx0ICovCkBAIC0xNTUwLDcgKzE1NTAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgotKiBCcmVpZjogQ29kZWMgbWFpbiBmdW5jdGlvbgorKiBCcmVpZjogQ29kZWMgbWFpbiBmdW5jdGlvbiAKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xNjIyLDcgKzE2MjIsNyBAQAogCWVsc2UKIAl7CiAJCXBNZW1PUCA9IChWT19NRU1fT1BFUkFUT1IgKilwVXNlckRhdGEtPm1lbURhdGE7Ci0JfQorCX0gCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogCSAqIE1lbW9yeSBhbGxvY2F0aW9uIGZvciBjb2RlciBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTYzMSw4ICsxNjMxLDggQEAKIAkJcmV0dXJuIFZPX0VSUl9PVVRPRl9NRU1PUlk7CiAJfQogCi0Jc3QtPnZhZFN0ID0gTlVMTDsKLQlzdC0+ZHR4X2VuY1N0ID0gTlVMTDsKKwlzdC0+dmFkU3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAKKwlzdC0+ZHR4X2VuY1N0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAKIAlzdC0+c2lkX3VwZGF0ZV9jb3VudGVyID0gMzsKIAlzdC0+c2lkX2hhbmRvdmVyX2RlYnQgPSAwOwogCXN0LT5wcmV2X2Z0ID0gVFhfU1BFRUNIOwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKIAl7CiAJCXBBdWRpb0Zvcm1hdC0+Rm9ybWF0LkNoYW5uZWxzID0gMTsKIAkJcEF1ZGlvRm9ybWF0LT5Gb3JtYXQuU2FtcGxlUmF0ZSA9IDgwMDA7Ci0JCXBBdWRpb0Zvcm1hdC0+Rm9ybWF0LlNhbXBsZUJpdHMgPSAxNjsKKwkJcEF1ZGlvRm9ybWF0LT5Gb3JtYXQuU2FtcGxlQml0cyA9IDE2OwkKIAkJcEF1ZGlvRm9ybWF0LT5JbnB1dFVzZWQgPSBzdHJlYW0tPnVzZWRfbGVuOwogCX0KIAlyZXR1cm4gVk9fRVJSX05PTkU7CkBAIC0xNzkyLDE0ICsxNzkyLDE0IEBACiAJCS8qIHNldHRpbmcgQU1SLVdCIGZyYW1lIHR5cGUqLwogCQljYXNlIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEU6CiAJCQlpZigqbFZhbHVlIDwgVk9BTVJXQl9ERUZBVUxUIHx8ICpsVmFsdWUgPiBWT0FNUldCX1JGQzMyNjcpCi0JCQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsKKwkJCQlyZXR1cm4gVk9fRVJSX1dST05HX1BBUkFNX0lEOyAKIAkJCWdEYXRhLT5mcmFtZVR5cGUgPSAqbFZhbHVlOwogCQkJYnJlYWs7CiAJCS8qIHNldHRpbmcgQU1SLVdCIGJpdCByYXRlICovCiAJCWNhc2UgVk9fUElEX0FNUldCX01PREU6CiAJCQl7CiAJCQkJaWYoKmxWYWx1ZSA8IFZPQU1SV0JfTUQ2NiB8fCAqbFZhbHVlID4gVk9BTVJXQl9NRDIzODUpCi0JCQkJCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7CisJCQkJCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7IAogCQkJCWdEYXRhLT5tb2RlID0gKmxWYWx1ZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTgzOSw3ICsxODM5LDcgQEAKIAlpbnQgICAgdGVtcDsKIAlDb2Rlcl9TdGF0ZSogZ0RhdGEgPSAoQ29kZXJfU3RhdGUqKWhDb2RlYzsKIAotCWlmIChnRGF0YT09TlVMTCkKKwlpZiAoZ0RhdGE9PU5VTEwpIAogCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwogCXN3aXRjaCh1UGFyYW1JRCkKIAl7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvaWNlZmFjLmMKaW5kZXggZDg5MDA0NC4uMTdlNGU1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b2ljZWZhYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYwpAQCAtMTgsNyArMTgsNyBAQAogKiAgIEZpbGU6IHZvaWNlZmFjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICBEZXNjcmlwdGlvbjogRmluZCB0aGUgdm9pY2luZyBmYWN0b3JzICgxID0gdm9pY2UgdG8gLTEgPSB1bnZvaWNlZCkgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJ0eXBlZGVmLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYwppbmRleCAxM2RkMmFhLi43ZTFkNjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogCWlmIChtYW50IDw9IDApCiAJewotCQltYW50ID0gMTsKKwkJbWFudCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIAogCX0KIAlleCA9IG5vcm1fcyhtYW50KTsKIAltYW50ID0gbWFudCA8PCBleDsKQEAgLTg4LDE0ICs4OCwxNCBAQAogCiAJdGVtcDAgPSB2b19zdWIoKmluMCwgdm9fbXVsdChDT0VGRjVfMSwgZGF0YVswXSkpOwogCXRlbXAxID0gYWRkMShkYXRhWzBdLCB2b19tdWx0KENPRUZGNV8xLCB0ZW1wMCkpOwotCWRhdGFbMF0gPSB0ZW1wMDsKKwlkYXRhWzBdID0gdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgIAogCiAJdGVtcDAgPSB2b19zdWIoKmluMSwgdm9fbXVsdChDT0VGRjVfMiwgZGF0YVsxXSkpOwogCXRlbXAyID0gYWRkMShkYXRhWzFdLCB2b19tdWx0KENPRUZGNV8yLCB0ZW1wMCkpOwotCWRhdGFbMV0gPSB0ZW1wMDsKKwlkYXRhWzFdID0gdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgICAKIAotCSppbjAgPSBleHRyYWN0X2goKHZvX0xfYWRkKHRlbXAxLCB0ZW1wMikgPDwgMTUpKTsKLQkqaW4xID0gZXh0cmFjdF9oKCh2b19MX3N1Yih0ZW1wMSwgdGVtcDIpIDw8IDE1KSk7CisJKmluMCA9IGV4dHJhY3RfaCgodm9fTF9hZGQodGVtcDEsIHRlbXAyKSA8PCAxNSkpOyAgIAorCSppbjEgPSBleHRyYWN0X2goKHZvX0xfc3ViKHRlbXAxLCB0ZW1wMikgPDwgMTUpKTsgIAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTYsMTAgKzExNiwxMCBAQAogCiAJdGVtcDEgPSB2b19zdWIoKmluMSwgdm9fbXVsdChDT0VGRjMsICpkYXRhKSk7CiAJdGVtcDIgPSBhZGQxKCpkYXRhLCB2b19tdWx0KENPRUZGMywgdGVtcDEpKTsKLQkqZGF0YSA9IHRlbXAxOworCSpkYXRhID0gdGVtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgCiAKLQkqaW4xID0gZXh0cmFjdF9oKCh2b19MX3N1YigqaW4wLCB0ZW1wMikgPDwgMTUpKTsKLQkqaW4wID0gZXh0cmFjdF9oKCh2b19MX2FkZCgqaW4wLCB0ZW1wMikgPDwgMTUpKTsKKwkqaW4xID0gZXh0cmFjdF9oKCh2b19MX3N1YigqaW4wLCB0ZW1wMikgPDwgMTUpKTsgICAKKwkqaW4wID0gZXh0cmFjdF9oKCh2b19MX2FkZCgqaW4wLCB0ZW1wMikgPDwgMTUpKTsgICAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ5LDE0ICsxNDksMTQgQEAKIAlXb3JkMzIgaSwgbF90ZW1wMSwgbF90ZW1wMjsKIAlXb3JkMTYgbGV2ZWw7CiAKLQlsX3RlbXAxID0gMEw7CisJbF90ZW1wMSA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gY291bnQxOyBpIDwgY291bnQyOyBpKyspCiAJewogCQlsX3RlbXAxICs9IChhYnNfcyhkYXRhW2luZF9tICogaSArIGluZF9hXSk8PDEpOwogCX0KIAogCWxfdGVtcDIgPSB2b19MX2FkZChsX3RlbXAxLCBMX3NobCgqc3ViX2xldmVsLCAxNiAtIHNjYWxlKSk7Ci0JKnN1Yl9sZXZlbCA9IGV4dHJhY3RfaChMX3NobChsX3RlbXAxLCBzY2FsZSkpOworCSpzdWJfbGV2ZWwgPSBleHRyYWN0X2goTF9zaGwobF90ZW1wMSwgc2NhbGUpKTsgICAgICAKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDE7IGkrKykKIAl7CkBAIC0xODcsNyArMTg3LDcgQEAKIAkvKiBzaGlmdCBpbnB1dCAxIGJpdCBkb3duIGZvciBzYWZlIHNjYWxpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTEVOOyBpKyspCiAJewotCQl0bXBfYnVmW2ldID0gaW5baV0gPj4gMTsKKwkJdG1wX2J1ZltpXSA9IGluW2ldID4+IDE7ICAgICAgIAogCX0KIAogCS8qIHJ1biB0aGUgZmlsdGVyIGJhbmsgKi8KQEAgLTIyMiwyOSArMjIyLDI5IEBACiAJLyogY2FsY3VsYXRlIGxldmVscyBpbiBlYWNoIGZyZXF1ZW5jeSBiYW5kICovCiAKIAkvKiA0ODAwIC0gNjQwMCBIeiAqLwotCWxldmVsWzExXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzExXSwgMTYsIDY0LCA0LCAxLCAxNCk7CisJbGV2ZWxbMTFdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMTFdLCAxNiwgNjQsIDQsIDEsIDE0KTsgICAKIAkvKiA0MDAwIC0gNDgwMCBIeiAqLwotCWxldmVsWzEwXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzEwXSwgOCwgMzIsIDgsIDcsIDE1KTsKKwlsZXZlbFsxMF0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFsxMF0sIDgsIDMyLCA4LCA3LCAxNSk7ICAgCiAJLyogMzIwMCAtIDQwMDAgSHogKi8KLQlsZXZlbFs5XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzldLDgsIDMyLCA4LCAzLCAxNSk7CisJbGV2ZWxbOV0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs5XSw4LCAzMiwgOCwgMywgMTUpOyAgIAogCS8qIDI0MDAgLSAzMjAwIEh6ICovCi0JbGV2ZWxbOF0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs4XSw4LCAzMiwgOCwgMiwgMTUpOworCWxldmVsWzhdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbOF0sOCwgMzIsIDgsIDIsIDE1KTsgICAKIAkvKiAyMDAwIC0gMjQwMCBIeiAqLwotCWxldmVsWzddID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbN10sNCwgMTYsIDE2LCAxNCwgMTYpOworCWxldmVsWzddID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbN10sNCwgMTYsIDE2LCAxNCwgMTYpOyAgICAgICAKIAkvKiAxNjAwIC0gMjAwMCBIeiAqLwotCWxldmVsWzZdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbNl0sNCwgMTYsIDE2LCA2LCAxNik7CisJbGV2ZWxbNl0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs2XSw0LCAxNiwgMTYsIDYsIDE2KTsgICAgICAgIAogCS8qIDEyMDAgLSAxNjAwIEh6ICovCi0JbGV2ZWxbNV0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs1XSw0LCAxNiwgMTYsIDQsIDE2KTsKKwlsZXZlbFs1XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzVdLDQsIDE2LCAxNiwgNCwgMTYpOyAgICAgICAgCiAJLyogODAwIC0gMTIwMCBIeiAqLwotCWxldmVsWzRdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbNF0sNCwgMTYsIDE2LCAxMiwgMTYpOworCWxldmVsWzRdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbNF0sNCwgMTYsIDE2LCAxMiwgMTYpOyAgICAgICAKIAkvKiA2MDAgLSA4MDAgSHogKi8KLQlsZXZlbFszXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzNdLDIsIDgsIDMyLCA4LCAxNyk7CisJbGV2ZWxbM10gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFszXSwyLCA4LCAzMiwgOCwgMTcpOyAKIAkvKiA0MDAgLSA2MDAgSHogKi8KLQlsZXZlbFsyXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzJdLDIsIDgsIDMyLCAyNCwgMTcpOworCWxldmVsWzJdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMl0sMiwgOCwgMzIsIDI0LCAxNyk7ICAgICAgICAKIAkvKiAyMDAgLSA0MDAgSHogKi8KLQlsZXZlbFsxXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzFdLDIsIDgsIDMyLCAxNiwgMTcpOworCWxldmVsWzFdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMV0sMiwgOCwgMzIsIDE2LCAxNyk7ICAgICAgICAKIAkvKiAwIC0gMjAwIEh6ICovCi0JbGV2ZWxbMF0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFswXSwyLCA4LCAzMiwgMCwgMTcpOworCWxldmVsWzBdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMF0sMiwgOCwgMzIsIDAsIDE3KTsgCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI2NiwzMSArMjY2LDMxIEBACiAJLyogaWYgYSB0b25lIGhhcyBiZWVuIGRldGVjdGVkIGZvciBhIHdoaWxlLCBpbml0aWFsaXplIHN0YXRfY291bnQgKi8KIAlpZiAoc3ViKChXb3JkMTYpIChzdC0+dG9uZV9mbGFnICYgMHg3YzAwKSwgMHg3YzAwKSA9PSAwKQogCXsKLQkJc3QtPnN0YXRfY291bnQgPSBTVEFUX0NPVU5UOworCQlzdC0+c3RhdF9jb3VudCA9IFNUQVRfQ09VTlQ7ICAgICAgCiAJfSBlbHNlCiAJewogCQkvKiBpZiA4IGxhc3QgdmFkLWRlY2lzaW9ucyBoYXZlIGJlZW4gIjAiLCByZWluaXRpYWxpemUgc3RhdF9jb3VudCAqLwogCQlpZiAoKHN0LT52YWRyZWcgJiAweDdmODApID09IDApCiAJCXsKLQkJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsKKwkJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsgICAKIAkJfSBlbHNlCiAJCXsKLQkJCXN0YXRfcmF0ID0gMDsKKwkJCXN0YXRfcmF0ID0gMDsgICAgICAgICAgICAgICAgICAKIAkJCWZvciAoaSA9IDA7IGkgPCBDT01QTEVOOyBpKyspCiAJCQl7CiAJCQkJaWYobGV2ZWxbaV0gPiBzdC0+YXZlX2xldmVsW2ldKQogCQkJCXsKLQkJCQkJbnVtID0gbGV2ZWxbaV07Ci0JCQkJCWRlbm9tID0gc3QtPmF2ZV9sZXZlbFtpXTsKKwkJCQkJbnVtID0gbGV2ZWxbaV07ICAgICAgICAKKwkJCQkJZGVub20gPSBzdC0+YXZlX2xldmVsW2ldOyAgIAogCQkJCX0gZWxzZQogCQkJCXsKIAkJCQkJbnVtID0gc3QtPmF2ZV9sZXZlbFtpXTsKLQkJCQkJZGVub20gPSBsZXZlbFtpXTsKKwkJCQkJZGVub20gPSBsZXZlbFtpXTsgICAgICAKIAkJCQl9CiAJCQkJLyogTGltaXQgbmltaW11bSB2YWx1ZSBvZiBudW0gYW5kIGRlbm9tIHRvIFNUQVRfVEhSX0xFVkVMICovCiAJCQkJaWYobnVtIDwgU1RBVF9USFJfTEVWRUwpCiAJCQkJewotCQkJCQludW0gPSBTVEFUX1RIUl9MRVZFTDsKKwkJCQkJbnVtID0gU1RBVF9USFJfTEVWRUw7ICAKIAkJCQl9CiAJCQkJaWYoZGVub20gPCBTVEFUX1RIUl9MRVZFTCkKIAkJCQl7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJCS8qIGNvbXBhcmUgc3RhdF9yYXQgd2l0aCBhIHRocmVzaG9sZCBhbmQgdXBkYXRlIHN0YXRfY291bnQgKi8KIAkJCWlmKHN0YXRfcmF0ID4gU1RBVF9USFIpCiAJCQl7Ci0JCQkJc3QtPnN0YXRfY291bnQgPSBTVEFUX0NPVU5UOworCQkJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsgICAgCiAJCQl9IGVsc2UKIAkJCXsKIAkJCQlpZiAoKHN0LT52YWRyZWcgJiAweDQwMDApICE9IDApCkBAIC0zMTUsNyArMzE1LDcgQEAKIAogCQkJCQlpZiAoc3QtPnN0YXRfY291bnQgIT0gMCkKIAkJCQkJewotCQkJCQkJc3QtPnN0YXRfY291bnQgPSBzdC0+c3RhdF9jb3VudCAtIDE7CisJCQkJCQlzdC0+c3RhdF9jb3VudCA9IHN0LT5zdGF0X2NvdW50IC0gMTsgICAgICAgCiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0zMjMsMTcgKzMyMywxNyBAQAogCX0KIAogCS8qIFVwZGF0ZSBhdmVyYWdlIGFtcGxpdHVkZSBlc3RpbWF0ZSBmb3Igc3RhdGlvbmFyaXR5IGVzdGltYXRpb24gKi8KLQlhbHBoYSA9IEFMUEhBNDsKKwlhbHBoYSA9IEFMUEhBNDsgICAgICAgICAgICAgICAgICAgICAgICAKIAlpZihzdC0+c3RhdF9jb3VudCA9PSBTVEFUX0NPVU5UKQogCXsKLQkJYWxwaGEgPSAzMjc2NzsKKwkJYWxwaGEgPSAzMjc2NzsgICAgICAgICAgICAgICAgICAgIAogCX0gZWxzZSBpZiAoKHN0LT52YWRyZWcgJiAweDQwMDApID09IDApCiAJewotCQlhbHBoYSA9IEFMUEhBNTsKKwkJYWxwaGEgPSBBTFBIQTU7ICAgICAgICAgICAgICAgICAgIAogCX0KIAlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQogCXsKLQkJc3QtPmF2ZV9sZXZlbFtpXSA9IGFkZDEoc3QtPmF2ZV9sZXZlbFtpXSwgdm9fbXVsdF9yKGFscGhhLCB2b19zdWIobGV2ZWxbaV0sIHN0LT5hdmVfbGV2ZWxbaV0pKSk7CisJCXN0LT5hdmVfbGV2ZWxbaV0gPSBhZGQxKHN0LT5hdmVfbGV2ZWxbaV0sIHZvX211bHRfcihhbHBoYSwgdm9fc3ViKGxldmVsW2ldLCBzdC0+YXZlX2xldmVsW2ldKSkpOyAgIAogCX0KIH0KIApAQCAtMzU0LDI1ICszNTQsMjUgQEAKIAkvKiBpZiB0aGUgaW5wdXQgcG93ZXIgKHBvd19zdW0pIGlzIGxvd2VyIHRoYW4gYSB0aHJlc2hvbGQsIGNsZWFyIGNvdW50ZXJzIGFuZCBzZXQgVkFEX2ZsYWcgdG8gIjAiICAgICAgICAgKi8KIAlpZiAobG93X3Bvd2VyICE9IDApCiAJewotCQlzdC0+YnVyc3RfY291bnQgPSAwOwotCQlzdC0+aGFuZ19jb3VudCA9IDA7CisJCXN0LT5idXJzdF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgCisJCXN0LT5oYW5nX2NvdW50ID0gMDsgICAgICAgICAgICAgICAgCiAJCXJldHVybiAwOwogCX0KIAkvKiB1cGRhdGUgdGhlIGNvdW50ZXJzIChoYW5nX2NvdW50LCBidXJzdF9jb3VudCkgKi8KIAlpZiAoKHN0LT52YWRyZWcgJiAweDQwMDApICE9IDApCiAJewotCQlzdC0+YnVyc3RfY291bnQgPSBzdC0+YnVyc3RfY291bnQgKyAxOworCQlzdC0+YnVyc3RfY291bnQgPSBzdC0+YnVyc3RfY291bnQgKyAxOyAgICAKIAkJaWYoc3QtPmJ1cnN0X2NvdW50ID49IGJ1cnN0X2xlbikKIAkJewotCQkJc3QtPmhhbmdfY291bnQgPSBoYW5nX2xlbjsKKwkJCXN0LT5oYW5nX2NvdW50ID0gaGFuZ19sZW47ICAgICAKIAkJfQogCQlyZXR1cm4gMTsKIAl9IGVsc2UKIAl7Ci0JCXN0LT5idXJzdF9jb3VudCA9IDA7CisJCXN0LT5idXJzdF9jb3VudCA9IDA7ICAgICAgICAgICAgICAgCiAJCWlmIChzdC0+aGFuZ19jb3VudCA+IDApCiAJCXsKLQkJCXN0LT5oYW5nX2NvdW50ID0gc3QtPmhhbmdfY291bnQgLSAxOworCQkJc3QtPmhhbmdfY291bnQgPSBzdC0+aGFuZ19jb3VudCAtIDE7ICAgIAogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJV29yZDE2IGxldmVsW10gICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBzdWItYmFuZCBsZXZlbHMgb2YgdGhlIGlucHV0IGZyYW1lICovCiAJCSkKIHsKLQlXb3JkMzIgaTsKKwlXb3JkMzIgaTsgCiAJV29yZDE2IGFscGhhX3VwLCBhbHBoYV9kb3duLCBiY2tyX2FkZCA9IDI7CiAKIAkvKiBDb250cm9sIHVwZGF0ZSBvZiBiY2tyX2VzdFtdICovCkBAIC00MDAsMTkgKzQwMCwxOSBAQAogCS8qIENob29zZSB1cGRhdGUgc3BlZWQgKi8KIAlpZiAoKDB4NzgwMCAmIHN0LT52YWRyZWcpID09IDApCiAJewotCQlhbHBoYV91cCA9IEFMUEhBX1VQMTsKLQkJYWxwaGFfZG93biA9IEFMUEhBX0RPV04xOworCQlhbHBoYV91cCA9IEFMUEhBX1VQMTsgICAgICAgICAgICAgIAorCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjE7ICAgICAgICAgIAogCX0gZWxzZQogCXsKIAkJaWYgKChzdC0+c3RhdF9jb3VudCA9PSAwKSkKIAkJewotCQkJYWxwaGFfdXAgPSBBTFBIQV9VUDI7Ci0JCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjI7CisJCQlhbHBoYV91cCA9IEFMUEhBX1VQMjsgICAgICAgICAgCisJCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjI7ICAgICAgCiAJCX0gZWxzZQogCQl7Ci0JCQlhbHBoYV91cCA9IDA7Ci0JCQlhbHBoYV9kb3duID0gQUxQSEEzOwotCQkJYmNrcl9hZGQgPSAwOworCQkJYWxwaGFfdXAgPSAwOyAgICAgICAgICAgICAgICAgIAorCQkJYWxwaGFfZG93biA9IEFMUEhBMzsgICAgICAgICAgIAorCQkJYmNrcl9hZGQgPSAwOyAgICAgICAgICAgICAgICAgIAogCQl9CiAJfQogCkBAIC00MjQsMjAgKzQyNCwyMCBAQAogCiAJCWlmICh0ZW1wIDwgMCkKIAkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgZG93bndhcmRzICovCi0JCQlzdC0+YmNrcl9lc3RbaV0gPSBhZGQxKC0yLCBhZGQoc3QtPmJja3JfZXN0W2ldLHZvX211bHRfcihhbHBoYV9kb3duLCB0ZW1wKSkpOworCQkJc3QtPmJja3JfZXN0W2ldID0gYWRkMSgtMiwgYWRkKHN0LT5iY2tyX2VzdFtpXSx2b19tdWx0X3IoYWxwaGFfZG93biwgdGVtcCkpKTsgCiAJCQkvKiBsaW1pdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBub2lzZSBlc3RpbWF0ZSB0byBOT0lTRV9NSU4gKi8KIAkJCWlmKHN0LT5iY2tyX2VzdFtpXSA8IE5PSVNFX01JTikKIAkJCXsKLQkJCQlzdC0+YmNrcl9lc3RbaV0gPSBOT0lTRV9NSU47CisJCQkJc3QtPmJja3JfZXN0W2ldID0gTk9JU0VfTUlOOyAgIAogCQkJfQogCQl9IGVsc2UKIAkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgdXB3YXJkcyAqLwotCQkJc3QtPmJja3JfZXN0W2ldID0gYWRkMShiY2tyX2FkZCwgYWRkMShzdC0+YmNrcl9lc3RbaV0sdm9fbXVsdF9yKGFscGhhX3VwLCB0ZW1wKSkpOworCQkJc3QtPmJja3JfZXN0W2ldID0gYWRkMShiY2tyX2FkZCwgYWRkMShzdC0+YmNrcl9lc3RbaV0sdm9fbXVsdF9yKGFscGhhX3VwLCB0ZW1wKSkpOyAgIAogCiAJCQkvKiBsaW1pdCBtYXhpbXVtIHZhbHVlIG9mIHRoZSBub2lzZSBlc3RpbWF0ZSB0byBOT0lTRV9NQVggKi8KIAkJCWlmKHN0LT5iY2tyX2VzdFtpXSA+IE5PSVNFX01BWCkKIAkJCXsKLQkJCQlzdC0+YmNrcl9lc3RbaV0gPSBOT0lTRV9NQVg7CisJCQkJc3QtPmJja3JfZXN0W2ldID0gTk9JU0VfTUFYOyAgICAKIAkJCX0KIAkJfQogCX0KQEAgLTQ0NSw3ICs0NDUsNyBAQAogCS8qIFVwZGF0ZSBzaWduYWwgbGV2ZWxzIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAob2xkX2xldmVsKSAqLwogCWZvciAoaSA9IDA7IGkgPCBDT01QTEVOOyBpKyspCiAJewotCQlzdC0+b2xkX2xldmVsW2ldID0gbGV2ZWxbaV07CisJCXN0LT5vbGRfbGV2ZWxbaV0gPSBsZXZlbFtpXTsgICAgICAKIAl9CiB9CiAKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCiAJLyogQ2FsY3VsYXRlIHNxdWFyZWQgc3VtIG9mIHRoZSBpbnB1dCBsZXZlbHMgKGxldmVsKSBkaXZpZGVkIGJ5IHRoZSBiYWNrZ3JvdW5kIG5vaXNlIGNvbXBvbmVudHMKIAkgKiAoYmNrcl9lc3QpLiAqLwotCUxfc25yX3N1bSA9IDA7CisJTF9zbnJfc3VtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAKIAlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQogCXsKIAkJV29yZDE2IGV4cDsKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCX0KIAogCS8qIENhbGN1bGF0ZSBhdmVyYWdlIGxldmVsIG9mIGVzdGltYXRlZCBiYWNrZ3JvdW5kIG5vaXNlICovCi0JTF90ZW1wID0gMDsKKwlMX3RlbXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDE7IGkgPCBDT01QTEVOOyBpKyspICAgICAgICAgIC8qIGlnbm9yZSBsb3dlc3QgYmFuZCAqLwogCXsKIAkJTF90ZW1wID0gdm9fTF9hZGQoTF90ZW1wLCBzdC0+YmNrcl9lc3RbaV0pOwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAKIAlpZihzdC0+c3BlZWNoX2xldmVsIDwgdGVtcCkKIAl7Ci0JCXN0LT5zcGVlY2hfbGV2ZWwgPSB0ZW1wOworCQlzdC0+c3BlZWNoX2xldmVsID0gdGVtcDsgICAgICAgICAgCiAJfQogCWlsb2cyX25vaXNlX2xldmVsID0gaWxvZzIobm9pc2VfbGV2ZWwpOwogCkBAIC01MTEsMzMgKzUxMSwzMyBAQAogCXRlbXAyID0gYWRkMShTUF9DSF9NSU4sIHZvX211bHQoU1BfU0xPUEUsIChpbG9nMl9zcGVlY2hfbGV2ZWwgLSBTUF9QMSkpKTsKIAlpZiAodGVtcDIgPCBTUF9DSF9NSU4pCiAJewotCQl0ZW1wMiA9IFNQX0NIX01JTjsKKwkJdGVtcDIgPSBTUF9DSF9NSU47ICAgICAgICAgICAgICAgICAKIAl9CiAJaWYgKHRlbXAyID4gU1BfQ0hfTUFYKQogCXsKLQkJdGVtcDIgPSBTUF9DSF9NQVg7CisJCXRlbXAyID0gU1BfQ0hfTUFYOyAgICAgICAgICAgICAgICAgCiAJfQogCXZhZF90aHIgPSB0ZW1wICsgdGVtcDI7CiAKIAlpZih2YWRfdGhyIDwgVEhSX01JTikKIAl7Ci0JCXZhZF90aHIgPSBUSFJfTUlOOworCQl2YWRfdGhyID0gVEhSX01JTjsgICAgICAgICAgICAgICAgIAogCX0KIAkvKiBTaGlmdCBWQUQgZGVjaXNpb24gcmVnaXN0ZXIgKi8KLQlzdC0+dmFkcmVnID0gKHN0LT52YWRyZWcgPj4gMSk7CisJc3QtPnZhZHJlZyA9IChzdC0+dmFkcmVnID4+IDEpOyAgICAgICAKIAogCS8qIE1ha2UgaW50ZXJtZWRpYXRlIFZBRCBkZWNpc2lvbiAqLwogCWlmKExfc25yX3N1bSA+IHZvX0xfbXVsdCh2YWRfdGhyLCAoNTEyICogQ09NUExFTikpKQogCXsKLQkJc3QtPnZhZHJlZyA9IChXb3JkMTYpIChzdC0+dmFkcmVnIHwgMHg0MDAwKTsKKwkJc3QtPnZhZHJlZyA9IChXb3JkMTYpIChzdC0+dmFkcmVnIHwgMHg0MDAwKTsgCiAJfQogCS8qIGNoZWNrIGlmIHRoZSBpbnB1dCBwb3dlciAocG93X3N1bSkgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZCIgKi8KIAlpZihwb3dfc3VtIDwgVkFEX1BPV19MT1cpCiAJewotCQlsb3dfcG93ZXJfZmxhZyA9IDE7CisJCWxvd19wb3dlcl9mbGFnID0gMTsgICAgICAgICAgICAgICAKIAl9IGVsc2UKIAl7Ci0JCWxvd19wb3dlcl9mbGFnID0gMDsKKwkJbG93X3Bvd2VyX2ZsYWcgPSAwOyAgICAgICAgICAgICAgIAogCX0KIAkvKiBVcGRhdGUgYmFja2dyb3VuZCBub2lzZSBlc3RpbWF0ZXMgKi8KIAlub2lzZV9lc3RpbWF0ZV91cGRhdGUoc3QsIGxldmVsKTsKQEAgLTU0Niw3ICs1NDYsNyBAQAogCWhhbmdfbGVuID0gYWRkMSh2b19tdWx0KEhBTkdfU0xPUEUsICh2YWRfdGhyIC0gSEFOR19QMSkpLCBIQU5HX0hJR0gpOwogCWlmKGhhbmdfbGVuIDwgSEFOR19MT1cpCiAJewotCQloYW5nX2xlbiA9IEhBTkdfTE9XOworCQloYW5nX2xlbiA9IEhBTkdfTE9XOyAgICAgICAgICAgICAgCiAJfQogCWJ1cnN0X2xlbiA9IGFkZDEodm9fbXVsdChCVVJTVF9TTE9QRSwgKHZhZF90aHIgLSBCVVJTVF9QMSkpLCBCVVJTVF9ISUdIKTsKIApAQCAtNTc1LDIwICs1NzUsMjAgQEAKIAkvKiBpZiB0aGUgcmVxdWlyZWQgYWN0aXZpdHkgY291bnQgY2Fubm90IGJlIGFjaGlldmVkLCByZXNldCBjb3VudGVycyAqLwogCWlmKChzdC0+c3BfZXN0X2NudCAtIHN0LT5zcF9tYXhfY250KSA+IChTUF9FU1RfQ09VTlQgLSBTUF9BQ1RJVklUWV9DT1VOVCkpCiAJewotCQlzdC0+c3BfZXN0X2NudCA9IDA7Ci0JCXN0LT5zcF9tYXggPSAwOwotCQlzdC0+c3BfbWF4X2NudCA9IDA7CisJCXN0LT5zcF9lc3RfY250ID0gMDsgICAgICAgICAgICAgICAgCisJCXN0LT5zcF9tYXggPSAwOyAgICAgICAgICAgICAgICAgICAgCisJCXN0LT5zcF9tYXhfY250ID0gMDsgICAgICAgICAgICAgICAgCiAJfQotCXN0LT5zcF9lc3RfY250ICs9IDE7CisJc3QtPnNwX2VzdF9jbnQgKz0gMTsgCiAKIAlpZiAoKChzdC0+dmFkcmVnICYgMHg0MDAwKXx8KGluX2xldmVsID4gc3QtPnNwZWVjaF9sZXZlbCkpICYmIChpbl9sZXZlbCA+IE1JTl9TUEVFQ0hfTEVWRUwxKSkKIAl7CiAJCS8qIHVwZGF0ZSBzcF9tYXggKi8KIAkJaWYoaW5fbGV2ZWwgPiBzdC0+c3BfbWF4KQogCQl7Ci0JCQlzdC0+c3BfbWF4ID0gaW5fbGV2ZWw7CisJCQlzdC0+c3BfbWF4ID0gaW5fbGV2ZWw7ICAgICAgICAgCiAJCX0KLQkJc3QtPnNwX21heF9jbnQgKz0gMTsKKwkJc3QtPnNwX21heF9jbnQgKz0gMTsgICAgICAgIAogCiAJCWlmKHN0LT5zcF9tYXhfY250ID49IFNQX0FDVElWSVRZX0NPVU5UKQogCQl7CkBAIC01OTksMTkgKzU5OSwxOSBAQAogCQkJLyogc2VsZWN0IHVwZGF0ZSBzcGVlZCAqLwogCQkJaWYodG1wID4gc3QtPnNwZWVjaF9sZXZlbCkKIAkJCXsKLQkJCQlhbHBoYSA9IEFMUEhBX1NQX1VQOworCQkJCWFscGhhID0gQUxQSEFfU1BfVVA7ICAgICAgIAogCQkJfSBlbHNlCiAJCQl7Ci0JCQkJYWxwaGEgPSBBTFBIQV9TUF9ET1dOOworCQkJCWFscGhhID0gQUxQSEFfU1BfRE9XTjsgICAgCiAJCQl9CiAJCQlpZih0bXAgPiBNSU5fU1BFRUNIX0xFVkVMMikKIAkJCXsKLQkJCQlzdC0+c3BlZWNoX2xldmVsID0gYWRkMShzdC0+c3BlZWNoX2xldmVsLCB2b19tdWx0X3IoYWxwaGEsIHZvX3N1Yih0bXAsIHN0LT5zcGVlY2hfbGV2ZWwpKSk7CisJCQkJc3QtPnNwZWVjaF9sZXZlbCA9IGFkZDEoc3QtPnNwZWVjaF9sZXZlbCwgdm9fbXVsdF9yKGFscGhhLCB2b19zdWIodG1wLCBzdC0+c3BlZWNoX2xldmVsKSkpOyAKIAkJCX0KIAkJCS8qIGNsZWFyIGFsbCBjb3VudGVycyB1c2VkIGZvciBzcGVlY2ggZXN0aW1hdGlvbiAqLwotCQkJc3QtPnNwX21heCA9IDA7Ci0JCQlzdC0+c3BfbWF4X2NudCA9IDA7Ci0JCQlzdC0+c3BfZXN0X2NudCA9IDA7CisJCQlzdC0+c3BfbWF4ID0gMDsgICAgICAgICAgICAgICAgCisJCQlzdC0+c3BfbWF4X2NudCA9IDA7ICAgICAgICAgICAgCisJCQlzdC0+c3BfZXN0X2NudCA9IDA7ICAgICAgICAgICAgCiAJCX0KIAl9CiB9CkBAIC03NjcsMjIgKzc2NywyMiBAQAogCVdvcmQzMiBMX3RlbXAsIHBvd19zdW07CiAKIAkvKiBDYWxjdWxhdGUgcG93ZXIgb2YgdGhlIGlucHV0IGZyYW1lLiAqLwotCUxfdGVtcCA9IDBMOworCUxfdGVtcCA9IDBMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9MRU47IGkrKykKIAl7CiAJCUxfdGVtcCA9IExfbWFjKExfdGVtcCwgaW5fYnVmW2ldLCBpbl9idWZbaV0pOwogCX0KIAogCS8qIHBvd19zdW0gPSBwb3dlciBvZiBjdXJyZW50IGZyYW1lIGFuZCBwcmV2aW91cyBmcmFtZSAqLwotCXBvd19zdW0gPSBMX2FkZChMX3RlbXAsIHN0LT5wcmV2X3Bvd19zdW0pOworCXBvd19zdW0gPSBMX2FkZChMX3RlbXAsIHN0LT5wcmV2X3Bvd19zdW0pOyAgCiAKIAkvKiBzYXZlIHBvd2VyIG9mIGN1cnJlbnQgZnJhbWUgZm9yIG5leHQgY2FsbCAqLwotCXN0LT5wcmV2X3Bvd19zdW0gPSBMX3RlbXA7CisJc3QtPnByZXZfcG93X3N1bSA9IExfdGVtcDsgICAgICAgICAgICAgCiAKIAkvKiBJZiBpbnB1dCBwb3dlciBpcyB2ZXJ5IGxvdywgY2xlYXIgdG9uZSBmbGFnICovCiAJaWYgKHBvd19zdW0gPCBQT1dfVE9ORV9USFIpCiAJewotCQlzdC0+dG9uZV9mbGFnID0gKFdvcmQxNikgKHN0LT50b25lX2ZsYWcgJiAweDFmZmYpOworCQlzdC0+dG9uZV9mbGFnID0gKFdvcmQxNikgKHN0LT50b25lX2ZsYWcgJiAweDFmZmYpOyAgICAgIAogCX0KIAkvKiBSdW4gdGhlIGZpbHRlciBiYW5rIGFuZCBjYWxjdWxhdGUgc2lnbmFsIGxldmVscyBhdCBlYWNoIGJhbmQgKi8KIAlmaWx0ZXJfYmFuayhzdCwgaW5fYnVmLCBsZXZlbCk7CkBAIC03OTEsNyArNzkxLDcgQEAKIAlWQURfZmxhZyA9IHZhZF9kZWNpc2lvbihzdCwgbGV2ZWwsIHBvd19zdW0pOwogCiAJLyogQ2FsY3VsYXRlIGlucHV0IGxldmVsICovCi0JTF90ZW1wID0gMDsKKwlMX3RlbXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJZm9yIChpID0gMTsgaSA8IENPTVBMRU47IGkrKykgICAgICAgICAgLyogaWdub3JlIGxvd2VzdCBiYW5kICovCiAJewogCQlMX3RlbXAgPSB2b19MX2FkZChMX3RlbXAsIGxldmVsW2ldKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2VpZ2h0X2EuYwppbmRleCBhMDJiNDhkLi44ZjBmYjM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3dlaWdodF9hLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jCkBAIC0xOSw3ICsxOSw3IEBACiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogICAgICAgRGVzY3JpcHRpb246V2VpZ2h0aW5nIG9mIExQQyBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgKgogKgkgICAgICAgICAgICAgICBhcFtpXSA9IGFbaV0gKiAoZ2FtbWEgKiogaSkgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgInR5cGVkZWYuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FWQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYmJhMzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvQVZDRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQVZDRGVjb2RlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFWQ0RlY29kZXIuaCIKLQotI2luY2x1ZGUgImF2Y2RlY19hcGkuaCIKLSNpbmNsdWRlICJhdmNkZWNfaW50LmgiCi0KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtTdGFydENvZGVbNF0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKLQotc3RhdGljIGludDMyX3QgTWFsbG9jKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihtYWxsb2Moc2l6ZSkpOwotfQotCi1zdGF0aWMgdm9pZCBGcmVlKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHB0cikgewotICAgIGZyZWUocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHB0cikpOwotfQotCi1BVkNEZWNvZGVyOjpBVkNEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUhhbmRsZShuZXcgdGFnQVZDSGFuZGxlKSwKLSAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1BbmNob3JUaW1lVXMoMCksCi0gICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKLSAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcygtMSksCi0gICAgICBtUGVuZGluZ1NlZWtNb2RlKE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpLAotICAgICAgbVRhcmdldFRpbWVVcygtMSksCi0gICAgICBtU1BTU2VlbihmYWxzZSksCi0gICAgICBtUFBTU2VlbihmYWxzZSkgewotICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFnQVZDSGFuZGxlKSk7Ci0gICAgbUhhbmRsZS0+QVZDT2JqZWN0ID0gTlVMTDsKLSAgICBtSGFuZGxlLT51c2VyRGF0YSA9IHRoaXM7Ci0gICAgbUhhbmRsZS0+Q0JBVkNfRFBCQWxsb2MgPSBBY3RpdmF0ZVNQU1dyYXBwZXI7Ci0gICAgbUhhbmRsZS0+Q0JBVkNfRnJhbWVCaW5kID0gQmluZEZyYW1lV3JhcHBlcjsKLSAgICBtSGFuZGxlLT5DQkFWQ19GcmFtZVVuYmluZCA9IFVuYmluZEZyYW1lOwotICAgIG1IYW5kbGUtPkNCQVZDX01hbGxvYyA9IE1hbGxvYzsKLSAgICBtSGFuZGxlLT5DQkFWQ19GcmVlID0gRnJlZTsKLQotICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLSAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgIG1Gb3JtYXQtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCAwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOwotICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkFWQ0RlY29kZXIiKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICBtRm9ybWF0LT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLX0KLQotQVZDRGVjb2Rlcjo6fkFWQ0RlY29kZXIoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci0KLSAgICBQVkFWQ0NsZWFuVXBEZWNvZGVyKG1IYW5kbGUpOwotCi0gICAgZGVsZXRlIG1IYW5kbGU7Ci0gICAgbUhhbmRsZSA9IE5VTEw7Ci19Ci0KLXN0YXR1c190IEFWQ0RlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICopIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAvLyBQYXJzZSB0aGUgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQKLQotICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0KLSAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKLSAgICAgICAgQ0hFQ0tfRVEocHRyWzBdLCAxKTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLSAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdOwotICAgICAgICB1aW50OF90IGxldmVsID0gcHRyWzNdOwotCi0gICAgICAgIC8vIFRoZXJlIGlzIGRlY29kYWJsZSBjb250ZW50IG91dCB0aGVyZSB0aGF0IGZhaWxzIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgLy8gYXNzZXJ0aW9uLCBsZXQncyBiZSBsZW5pZW50IGZvciBub3cuLi4KLSAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCi0KLSAgICAgICAgc2l6ZV90IGxlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwotCi0gICAgICAgIC8vIGNvbW1lbnRlZCBvdXQgY2hlY2sgYmVsb3cgYXMgSDI2NF9RVkdBXzUwMF9OT19BVURJTy4zZ3AKLSAgICAgICAgLy8gdmlvbGF0ZXMgaXQuLi4KLSAgICAgICAgLy8gQ0hFQ0soKHB0cls1XSA+PiA1KSA9PSA3KTsgIC8vIHJlc2VydmVkCi0KLSAgICAgICAgc2l6ZV90IG51bVNlcVBhcmFtZXRlclNldHMgPSBwdHJbNV0gJiAzMTsKLQotICAgICAgICBwdHIgKz0gNjsKLSAgICAgICAgc2l6ZSAtPSA2OwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VxUGFyYW1ldGVyU2V0czsgKytpKSB7Ci0gICAgICAgICAgICBDSEVDSyhzaXplID49IDIpOwotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSBsZW5ndGgpOwotCi0gICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLKHNpemUgPj0gMSk7Ci0gICAgICAgIHNpemVfdCBudW1QaWN0dXJlUGFyYW1ldGVyU2V0cyA9ICpwdHI7Ci0gICAgICAgICsrcHRyOwotICAgICAgICAtLXNpemU7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QaWN0dXJlUGFyYW1ldGVyU2V0czsgKytpKSB7Ci0gICAgICAgICAgICBDSEVDSyhzaXplID49IDIpOwotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICAgICAgQ0hFQ0soc2l6ZSA+PSBsZW5ndGgpOwotCi0gICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICBtQW5jaG9yVGltZVVzID0gMDsKLSAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgbVBlbmRpbmdTZWVrVGltZVVzID0gLTE7Ci0gICAgbVBlbmRpbmdTZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzsKLSAgICBtVGFyZ2V0VGltZVVzID0gLTE7Ci0gICAgbVNQU1NlZW4gPSBmYWxzZTsKLSAgICBtUFBTU2VlbiA9IGZhbHNlOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBVkNEZWNvZGVyOjphZGRDb2RlY1NwZWNpZmljRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSArIDQpOwotICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwga1N0YXJ0Q29kZSwgNCk7Ci0gICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyA0LCBkYXRhLCBzaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBzaXplICsgNCk7Ci0KLSAgICBtQ29kZWNTcGVjaWZpY0RhdGEucHVzaChidWZmZXIpOwotfQotCi1zdGF0dXNfdCBBVkNEZWNvZGVyOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjU3BlY2lmaWNEYXRhLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICgqbUNvZGVjU3BlY2lmaWNEYXRhLmVkaXRJdGVtQXQoaSkpLnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbUNvZGVjU3BlY2lmaWNEYXRhLmNsZWFyKCk7Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIHJlbGVhc2VGcmFtZXMoKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBVkNEZWNvZGVyOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmROQUxGcmFnbWVudCgKLSAgICAgICAgY29uc3QgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgY29uc3QgdWludDhfdCAqKmZyYWdQdHIsIHNpemVfdCAqZnJhZ1NpemUpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICBDSEVDSyhzaXplID49IDQpOwotICAgIENIRUNLKCFtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgNCkpOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDQ7Ci0gICAgd2hpbGUgKG9mZnNldCArIDMgPCBzaXplICYmIG1lbWNtcChrU3RhcnRDb2RlLCAmZGF0YVtvZmZzZXRdLCA0KSkgewotICAgICAgICArK29mZnNldDsKLSAgICB9Ci0KLSAgICAqZnJhZ1B0ciA9ICZkYXRhWzRdOwotICAgIGlmIChvZmZzZXQgKyAzID49IHNpemUpIHsKLSAgICAgICAgKmZyYWdTaXplID0gc2l6ZSAtIDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmZyYWdTaXplID0gb2Zmc2V0IC0gNDsKLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyICpBVkNEZWNvZGVyOjpkcmFpbk91dHB1dEJ1ZmZlcigpIHsKLSAgICBpbnQzMl90IGluZGV4OwotICAgIGludDMyX3QgUmVsZWFzZTsKLSAgICBBVkNGcmFtZUlPIE91dHB1dDsKLSAgICBPdXRwdXQuWUNiQ3JbMF0gPSBPdXRwdXQuWUNiQ3JbMV0gPSBPdXRwdXQuWUNiQ3JbMl0gPSBOVUxMOwotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzID0gUFZBVkNEZWNHZXRPdXRwdXQobUhhbmRsZSwgJmluZGV4LCAmUmVsZWFzZSwgJk91dHB1dCk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7Ci0gICAgICAgIExPR1YoIlBWQVZDRGVjR2V0T3V0cHV0IHJldHVybmVkIGVycm9yICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQ0hFQ0soaW5kZXggPj0gMCk7Ci0gICAgQ0hFQ0soaW5kZXggPCAoaW50MzJfdCltRnJhbWVzLnNpemUoKSk7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG1GcmFtZXMuZWRpdEl0ZW1BdChpbmRleCk7Ci0KLSAgICBib29sIHNraXBGcmFtZSA9IGZhbHNlOwotCi0gICAgaWYgKG1UYXJnZXRUaW1lVXMgPj0gMCkgewotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgICAgICBDSEVDSyh0aW1lVXMgPD0gbVRhcmdldFRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKHRpbWVVcyA8IG1UYXJnZXRUaW1lVXMpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBmcmFtZSB3aXRoIHRoZSBtYXRjaGluZwotICAgICAgICAgICAgLy8gdGltZXN0YW1wIGFuZCB3ZSB3b24ndCByZXR1cm4gdGhlIGN1cnJlbnQgb25lLgotICAgICAgICAgICAgc2tpcEZyYW1lID0gdHJ1ZTsKLQotICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJmb3VuZCB0YXJnZXQgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghc2tpcEZyYW1lKSB7Ci0gICAgICAgIG1idWYtPnNldF9yYW5nZSgwLCBtYnVmLT5zaXplKCkpOwotICAgICAgICBtYnVmLT5hZGRfcmVmKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1idWY7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBNZWRpYUJ1ZmZlcigwKTsKLX0KLQotc3RhdHVzX3QgQVZDRGVjb2Rlcjo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgTE9HVigic2VlayByZXF1ZXN0ZWQgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIHNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7Ci0gICAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIG1QZW5kaW5nU2Vla01vZGUgPSBtb2RlOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIFBWQVZDRGVjUmVzZXQobUhhbmRsZSk7Ci0gICAgfQotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoImZldGNoaW5nIG5ldyBpbnB1dCBidWZmZXIuIik7Ci0KLSAgICAgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtQ29kZWNTcGVjaWZpY0RhdGEuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtQ29kZWNTcGVjaWZpY0RhdGEuZWRpdEl0ZW1BdCgwKTsKLSAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YS5yZW1vdmVBdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigicmVhZGluZyBkYXRhIGZyb20gdGltZXN0YW1wICVsbGQgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcywgbVBlbmRpbmdTZWVrVGltZVVzIC8gMUU2KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBSZWFkT3B0aW9ucyBzZWVrT3B0aW9uczsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vla2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vla09wdGlvbnMuc2V0U2Vla1RvKG1QZW5kaW5nU2Vla1RpbWVVcywgbVBlbmRpbmdTZWVrTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcyA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZzZWVrT3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgc2Vla09wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCA9IGRyYWluT3V0cHV0QnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKm91dCA9PSBOVUxMKSAgPyBlcnIgOiAoc3RhdHVzX3QpT0s7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vla2luZykgewotICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRUaW1lVXM7Ci0gICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQotICAgICAgICAgICAgICAgICAgICAmJiB0YXJnZXRUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSB0YXJnZXRUaW1lVXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmZyYWdQdHI7Ci0gICAgc2l6ZV90IGZyYWdTaXplOwotICAgIGZpbmROQUxGcmFnbWVudChtSW5wdXRCdWZmZXIsICZmcmFnUHRyLCAmZnJhZ1NpemUpOwotCi0gICAgYm9vbCByZWxlYXNlRnJhZ21lbnQgPSB0cnVlOwotICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICBpbnQgbmFsVHlwZTsKLSAgICBpbnQgbmFsUmVmSWRjOwotICAgIEFWQ0RlY19TdGF0dXMgcmVzID0KLSAgICAgICAgUFZBVkNEZWNHZXROQUxUeXBlKAotICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwgZnJhZ1NpemUsCi0gICAgICAgICAgICAgICAgJm5hbFR5cGUsICZuYWxSZWZJZGMpOwotCi0gICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICBMT0dWKCJjYW5ub3QgZGV0ZXJtaW5lIG5hbCB0eXBlIik7Ci0gICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEFWQ19OQUxUWVBFX1NQUyB8fCBuYWxUeXBlID09IEFWQ19OQUxUWVBFX1BQUwotICAgICAgICAgICAgICAgIHx8IChtU1BTU2VlbiAmJiBtUFBTU2VlbikpIHsKLSAgICAgICAgc3dpdGNoIChuYWxUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NQUzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtU1BTU2VlbiA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NlcVBhcmFtU2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGZyYWdQdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1NpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICBMT0dWKCJQVkFWQ0RlY1NlcVBhcmFtU2V0IHJldHVybmVkIGVycm9yICVkIiwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKLQotICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAocERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEpICogMTY7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpICogMTY7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQgPSAyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfbWJzX29ubHlfZmxhZykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF90b3AgPSAyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IDQgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgY3JvcF90b3AgPSBjcm9wX2xlZnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3QgcHJldkNyb3BMZWZ0LCBwcmV2Q3JvcFRvcDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByZXZDcm9wUmlnaHQsIHByZXZDcm9wQm90dG9tOwotICAgICAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2Q3JvcExlZnQsICZwcmV2Q3JvcFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldkNyb3BSaWdodCwgJnByZXZDcm9wQm90dG9tKSkgewotICAgICAgICAgICAgICAgICAgICBwcmV2Q3JvcExlZnQgPSBwcmV2Q3JvcFRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZDcm9wUmlnaHQgPSB3aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZDcm9wQm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IG9sZFdpZHRoLCBvbGRIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm9sZFdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZvbGRIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChvbGRXaWR0aCAhPSB3aWR0aCB8fCBvbGRIZWlnaHQgIT0gaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwcmV2Q3JvcExlZnQgIT0gY3JvcF9sZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwcmV2Q3JvcFRvcCAhPSBjcm9wX3RvcAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJldkNyb3BSaWdodCAhPSBjcm9wX3JpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwcmV2Q3JvcEJvdHRvbSAhPSBjcm9wX2JvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gSU5GT19GT1JNQVRfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfUFBTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1QUFNTZWVuID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjUGljUGFyYW1TZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoIlBWQVZDRGVjUGljUGFyYW1TZXQgcmV0dXJuZWQgZXJyb3IgJWQiLCByZXMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU0xJQ0U6Ci0gICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0lEUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY29kZVNsaWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGZyYWdQdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1NpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9PVVRQVVRfUkVBRFkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBkcmFpbk91dHB1dEJ1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICpvdXQgPSBtYnVmOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIERvIF9ub3RfIHJlbGVhc2UgaW5wdXQgYnVmZmVyIHlldC4KLQotICAgICAgICAgICAgICAgICAgICByZWxlYXNlRnJhZ21lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQVZDREVDX1BJQ1RVUkVfUkVBRFkgfHwgcmVzID09IEFWQ0RFQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiUFZBVkNEZWNvZGVTbGljZSByZXR1cm5lZCBlcnJvciAlZCIsIHJlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NFSToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NFSSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQVZDREVDX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0FVRDoKLSAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfRklMTDoKLSAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfRU9TRVE6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR0UoIlNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBuYWxUeXBlICVkIiwgbmFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBTUFMgb3IgUFBTIHlldC4KLQotICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwotICAgICAgICBlcnIgPSBPSzsKLSAgICB9Ci0KLSAgICBpZiAocmVsZWFzZUZyYWdtZW50KSB7Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICBpZiAoZnJhZ1NpemUgKyA0ID09IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBmcmFnU2l6ZSArIDQsCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFnU2l6ZSAtIDQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gc3RhdGljCi1pbnQzMl90IEFWQ0RlY29kZXI6OkFjdGl2YXRlU1BTV3JhcHBlcigKLSAgICAgICAgdm9pZCAqdXNlckRhdGEsIHVuc2lnbmVkIGludCBzaXplSW5NYnMsIHVuc2lnbmVkIGludCBudW1CdWZmZXJzKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEFWQ0RlY29kZXIgKj4odXNlckRhdGEpLT5hY3RpdmF0ZVNQUyhzaXplSW5NYnMsIG51bUJ1ZmZlcnMpOwotfQotCi0vLyBzdGF0aWMKLWludDMyX3QgQVZDRGVjb2Rlcjo6QmluZEZyYW1lV3JhcHBlcigKLSAgICAgICAgdm9pZCAqdXNlckRhdGEsIGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QVZDRGVjb2RlciAqPih1c2VyRGF0YSktPmJpbmRGcmFtZShpbmRleCwgeXV2KTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEFWQ0RlY29kZXI6OlVuYmluZEZyYW1lKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IGluZGV4KSB7Ci19Ci0KLWludDMyX3QgQVZDRGVjb2Rlcjo6YWN0aXZhdGVTUFMoCi0gICAgICAgIHVuc2lnbmVkIGludCBzaXplSW5NYnMsIHVuc2lnbmVkIGludCBudW1CdWZmZXJzKSB7Ci0gICAgQ0hFQ0sobUZyYW1lcy5pc0VtcHR5KCkpOwotCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IChzaXplSW5NYnMgPDwgNykgKiAzOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWVTaXplKTsKLSAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLQotICAgICAgICBtRnJhbWVzLnB1c2goYnVmZmVyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50MzJfdCBBVkNEZWNvZGVyOjpiaW5kRnJhbWUoaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dikgewotICAgIENIRUNLKGluZGV4ID49IDApOwotICAgIENIRUNLKGluZGV4IDwgKGludDMyX3QpbUZyYW1lcy5zaXplKCkpOwotCi0gICAgQ0hFQ0sobUlucHV0QnVmZmVyICE9IE5VTEwpOwotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIG1GcmFtZXNbaW5kZXhdLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAqeXV2ID0gKHVpbnQ4X3QgKiltRnJhbWVzW2luZGV4XS0+ZGF0YSgpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgQVZDRGVjb2Rlcjo6cmVsZWFzZUZyYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GcmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG1GcmFtZXMuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOwotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbUZyYW1lcy5jbGVhcigpOwotfQotCi12b2lkIEFWQ0RlY29kZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAwMzQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgQVZDRGVjb2Rlci5jcHAgXAotCXNyYy9hdmNkZWNfYXBpLmNwcCBcCi0gCXNyYy9hdmNfYml0c3RyZWFtLmNwcCBcCi0gCXNyYy9oZWFkZXIuY3BwIFwKLSAJc3JjL2l0cmFucy5jcHAgXAotIAlzcmMvcHJlZF9pbnRlci5jcHAgXAotIAlzcmMvcHJlZF9pbnRyYS5jcHAgXAotIAlzcmMvcmVzaWR1YWwuY3BwIFwKLSAJc3JjL3NsaWNlLmNwcCBcCi0gCXNyYy92bGMuY3BwCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hdmNkZWMKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChMT0NBTF9QQVRIKS9zcmMgXAotIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotIAkkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9Ci0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL2luY2x1ZGUvYXZjZGVjX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvaW5jbHVkZS9hdmNkZWNfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTE0YjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvaW5jbHVkZS9hdmNkZWNfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkKLWFuZCBuZWNlc3NhcnkgdHlwZSBkZWZpdGlvbml0aW9ucyBhbmQgZW51bWVyYXRpb25zLgotQHB1Ymxpc2hlZEFsbAotKi8KLQotI2lmbmRlZiBfQVZDREVDX0FQSV9IXwotI2RlZmluZSBfQVZDREVDX0FQSV9IXwotCi0jaW5jbHVkZSAiYXZjYXBpX2NvbW1vbi5oIgotCi0vKioKLSBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgZm9yIHRoZSBzdGF0dXMgcmV0dXJuZWQgZnJvbSB0aGUgbGlicmFyeSBpbnRlcmZhY2UuCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgVGhlIGZvbGxvd2luZ3MgYXJlIGZhaWwgd2l0aCBkZXRhaWxzLiBUaGVpciB2YWx1ZXMgYXJlIG5lZ2F0aXZlLgotICAgICovCi0gICAgQVZDREVDX05PX0RBVEEgPSAtNCwKLSAgICBBVkNERUNfUEFDS0VUX0xPU1MgPSAtMywKLSAgICAvKioKLSAgICBGYWlsIGluZm9ybWF0aW9uCi0gICAgKi8KLSAgICBBVkNERUNfTk9fQlVGRkVSID0gLTIsIC8qIG5vIG91dHB1dCBwaWN0dXJlIGJ1ZmZlciBhdmFpbGFibGUgKi8KLSAgICBBVkNERUNfTUVNT1JZX0ZBSUwgPSAtMSwgLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkICovCi0gICAgQVZDREVDX0ZBSUwgPSAwLAotICAgIC8qKgotICAgIEdlbmVyaWMgc3VjY2VzcyB2YWx1ZQotICAgICovCi0gICAgQVZDREVDX1NVQ0NFU1MgPSAxLAotICAgIEFWQ0RFQ19QSUNUVVJFX09VVFBVVF9SRUFEWSA9IDIsCi0gICAgQVZDREVDX1BJQ1RVUkVfUkVBRFkgPSAzLAotCi0gICAgLyoqCi0gICAgVGhlIGZvbGxvd2luZ3MgYXJlIHN1Y2Nlc3Mgd2l0aCB3YXJuaW5ncy4gVGhlaXIgdmFsdWVzIGFyZSBwb3NpdGl2ZSBpbnRlZ2Vycy4KLSAgICAqLwotICAgIEFWQ0RFQ19OT19ORVhUX1NDID0gNCwKLSAgICBBVkNERUNfUkVEVU5EQU5UX0ZSQU1FID0gNSwKLSAgICBBVkNERUNfQ09OQ0VBTEVEX0ZSQU1FID0gNiAgLyogZGV0ZWN0IGFuZCBjb25jZWFsIHRoZSBlcnJvciAqLwotfSBBVkNEZWNfU3RhdHVzOwotCi0KLS8qKgotVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgc2VxdWVuY2UgcGFyYW1ldGVycyBpbmZvcm1hdGlvbi4KLSovCi10eXBlZGVmIHN0cnVjdCB0YWdBVkNEZWNTUFNJbmZvCi17Ci0gICAgaW50IEZyYW1lV2lkdGg7Ci0gICAgaW50IEZyYW1lSGVpZ2h0OwotICAgIHVpbnQgZnJhbWVfb25seV9mbGFnOwotICAgIGludCAgZnJhbWVfY3JvcF9sZWZ0OwotICAgIGludCAgZnJhbWVfY3JvcF9yaWdodDsKLSAgICBpbnQgIGZyYW1lX2Nyb3BfdG9wOwotICAgIGludCAgZnJhbWVfY3JvcF9ib3R0b207Ci0KLX0gQVZDRGVjU1BTSW5mbzsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotICAgIC8qKiBUSEUgRk9MTE9XSU5HUyBBUkUgQVBJUyAqLwotICAgIC8qKgotICAgIFRoaXMgZnVuY3Rpb24gcGFyc2VzIG9uZSBOQUwgdW5pdCBmcm9tIGJ5dGUgc3RyZWFtIGZvcm1hdCBpbnB1dCBhY2NvcmRpbmcgdG8gQW5uZXggQi4KLSAgICBccGFyYW0gImJpdHN0cmVhbSIgICJQb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gYnVmZmVyLiIKLSAgICBccGFyYW0gIm5hbF91bml0IiAgICJQb2ludCB0byBwb2ludGVyIGFuZCB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBOQUwgdW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIGluIGJpdHN0cmVhbS4iCi0gICAgXHBhcmFtICJzaXplIiAgICAgICAiQXMgaW5wdXQsIHRoZSBwb2ludGVyIHRvIHRoZSBzaXplIG9mIGJpdHN0cmVhbSBpbiBieXRlcy4gQXMgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBmb3VuZCBOQUwgdW5pdC4iCi0gICAgXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDREVDX0ZBSUwgaWYgbm8gZmlyc3Qgc3RhcnQgY29kZSBpcyBmb3VuZCwgQVZDREVDX05PX05FWF9TQyBpZgotICAgICAgICAgICAgdGhlIGZpcnN0IHN0YXJ0IGNvZGUgaXMgZm91bmQsIGJ1dCB0aGUgc2Vjb25kIHN0YXJ0IGNvZGUgaXMgbWlzc2luZyAocG90ZW50aWFsIHBhcnRpYWwgTkFMKS4iCi0gICAgKi8KLSAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRGVjX1N0YXR1cyBQVkFWQ0FubmV4QkdldE5BTFVuaXQodWludDggKmJpdHN0cmVhbSwgdWludDggKipuYWxfdW5pdCwgaW50ICpzaXplKTsKLQotICAgIC8qKgotICAgIFRoaXMgZnVuY3Rpb24gc25pZmZzIHRoZSBuYWxfdW5pdF90eXBlIHN1Y2ggdGhhdCB1c2VycyBjYW4gY2FsbCBjb3JyZXNwb25kaW5nIEFQSXMuCi0gICAgXHBhcmFtICJiaXRzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEgTkFMIHVuaXQgKHN0YXJ0IHdpdGggZm9yYmlkZGVuX3plcm9fYml0LCBldGMuKS4iCi0gICAgXHBhcmFtICJzaXplIiAgICAgICAic2l6ZSBvZiB0aGUgYml0c3RyZWFtIChOdW1CeXRlc0luTkFMdW5pdCArIDEpLiIKLSAgICBccGFyYW0gIm5hbF91bml0X3R5cGUiICJQb2ludGVyIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgbmFsIHVuaXQgdHlwZS4iCi0gICAgXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDREVDX0ZBSUwgb3RoZXJ3aXNlLiIKLSAgICAqLwotICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjR2V0TkFMVHlwZSh1aW50OCAqYml0c3RyZWFtLCBpbnQgc2l6ZSwgaW50ICpuYWxfdHlwZSwgaW50ICpuYWxfcmVmX2lkYyk7Ci0KLSAgICAvKioKLSAgICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIHNlcXVlbmNlIHBhcmFtZXRlcnMgc2V0LCBpbml0aWFsaXplcyByZWxhdGVkIHBhcmFtZXRlcnMgYW5kCi0gICAgYWxsb2NhdGVzIG1lbW9yeSAocmVmZXJlbmNlIGZyYW1lcyBsaXN0KSwgbXVzdCBhbHNvIGJlIGNvbXBsaWFudCB3aXRoIEFubmV4IEEuCi0gICAgSXQgaXMgZXF1aXZhbGVudCB0byBkZWNvZGUgVk9MIGhlYWRlciBvZiBNUEVHNC4KLSAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKLSAgICBccGFyYW0gIm5hbF91bml0IiAgICJQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBzaW5nbGUgTkFMIHVuaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29udGVudCB3aWxsIGNoYW5nZSBkdWUgdG8gRUJTUC10by1SQlNQIGNvbnZlcnNpb24uIgotICAgIFxwYXJhbSAibmFsX3NpemUiICAgICAgICJzaXplIG9mIHRoZSBiaXRzdHJlYW0gTnVtQnl0ZXNJbk5BTHVuaXQuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsCi0gICAgICAgICAgICBBVkNERUNfRkFJTCBpZiBwcm9maWxlIGFuZCBsZXZlbCBpcyBub3Qgc3VwcG9ydGVkLAotICAgICAgICAgICAgQVZDREVDX01FTU9SWV9GQUlMIGlmIG1lbW9yeSBhbGxvY2F0aW9ucyByZXR1cm4gbnVsbC4iCi0gICAgKi8KLSAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRGVjX1N0YXR1cyBQVkFWQ0RlY1NlcVBhcmFtU2V0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50OCAqbmFsX3VuaXQsIGludCBuYWxfc2l6ZSk7Ci0KLSAgICAvKioKLSAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgc2VxdWVuY2UgcGFyYW1ldGVycyBzdWNoIGFzIGRpbWVuc2lvbiBhbmQgZmllbGQgZmxhZyBvZiB0aGUgbW9zdCByZWNlbnRseQotICAgIGRlY29kZWQgU1BTLiBNb3JlIGNhbiBiZSBhZGRlZCBsYXRlciBvciBncm91cGVkIHRvZ2V0aGVyIGludG8gYSBzdHJ1Y3R1cmUuIFRoaXMgQVBJIGNhbiBiZSBjYWxsZWQKLSAgICBhZnRlciBQVkFWQ0luaXRTZXF1ZW5jZS4gSWYgbm8gc2VxdWVuY2UgcGFyYW1ldGVyIGhhcyBiZWVuIGRlY29kZWQgeWV0LCBpdCB3aWxsIHJldHVybiBBVkNERUNfRkFJTC4KLQotICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGRlY29kZXIgbGlicmFyeSBvYmplY3QuIgotICAgIFxwYXJhbSAic2VxSW5mbyIgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0RlY1NlcVBhcmFtSW5mbyBzdHJ1Y3R1cmUuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIGlmIGZhaWwuIgotICAgIFxub3RlICJUaGlzIEFQSSBjYW4gYmUgY29tYmluZWQgd2l0aCBQVkFWQ0luaXRTZXF1ZW5jZSBpZiB3YW50ZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIG00dmRlYyBsaWIuIgotICAgICovCi0gICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0RlY19TdGF0dXMgUFZBVkNEZWNHZXRTZXFJbmZvKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNEZWNTUFNJbmZvICpzZXFJbmZvKTsKLQotICAgIC8qKgotICAgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyB0aGUgcGljdHVyZSBwYXJhbWV0ZXJzIHNldCBhbmQgaW5pdGlhbGl6ZXMgcmVsYXRlZCBwYXJhbWV0ZXJzLiBOb3RlIHRoYXRlCi0gICAgdGhlIFBQUyBtYXkgbm90IGJlIHByZXNlbnQgZm9yIGV2ZXJ5IHBpY3R1cmUuCi0gICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZGVjb2RlciBsaWJyYXJ5IG9iamVjdC4iCi0gICAgXHBhcmFtICJuYWxfdW5pdCIgICAiUG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgc2luZ2xlIE5BTCB1bml0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnQgd2lsbCBjaGFuZ2UgZHVlIHRvIEVCU1AtdG8tUkJTUCBjb252ZXJzaW9uLiIKLSAgICBccGFyYW0gIm5hbF9zaXplIiAgICAgICAic2l6ZSBvZiB0aGUgYml0c3RyZWFtIE51bUJ5dGVzSW5OQUx1bml0LiIKLSAgICBccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNERUNfRkFJTCBpZiBwcm9maWxlIGFuZCBsZXZlbCBpcyBub3Qgc3VwcG9ydGVkLiIKLSAgICAqLwotICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjUGljUGFyYW1TZXQoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpuYWxfdW5pdCwgaW50IG5hbF9zaXplKTsKLQotICAgIC8qKgotICAgIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBvbmUgTkFMIHVuaXQgb2YgYml0c3RyZWFtLiBUaGUgdHlwZSBvZiBuYWwgdW5pdCBpcyBvbmUgb2YgdGhlCi0gICAgZm9sbG93aW5ncywgMSwgNS4gKGZvciBub3csIG5vIGRhdGEgcGFydGl0aW9uaW5nLCB0eXBlIDIsMyw0KS4KLSAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKLSAgICBccGFyYW0gIm5hbF91bml0IiAgICJQb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBvciBwYXJ0aWFsIE5BTCB1bml0LgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnQgd2lsbCBjaGFuZ2UgZHVlIHRvIEVCU1AtdG8tUkJTUCBjb252ZXJzaW9uLiIKLSAgICBccGFyYW0gImJ1Zl9zaXplIiAgICJTaXplIG9mIHRoZSBidWZmZXIgKGxlc3MgdGhhbiBvciBlcXVhbCBuYWxfc2l6ZSkuIgotICAgIFxwYXJhbSAibmFsX3NpemUiICAgInNpemUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQgTnVtQnl0ZXNJbk5BTHVuaXQuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19QSUNUVVJFX1JFQURZIGZvciBzdWNjZXNzIGFuZCBhbiBvdXRwdXQgaXMgcmVhZHksCi0gICAgICAgICAgICBBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBidXQgbm8gb3V0cHV0IGlzIHJlYWR5LAotICAgICAgICAgICAgQVZDREVDX1BBQ0tFVF9MT1NTIGlzIEdldERhdGEgcmV0dXJucyBBVkNERUNfUEFDS0VUX0xPU1MsCi0gICAgICAgICAgICBBVkNERUNfRkFJTCBpZiBzeW50YXggZXJyb3IgaXMgZGV0ZWN0ZWQsCi0gICAgICAgICAgICBBVkNERUNfTUVNT1JZX0ZBSUwgaWYgbWVtb3J5IGlzIGNvcnJ1cHRlZC4KLSAgICAgICAgICAgIEFWQ0RFQ19OT19QSUNUVVJFIGlmIG5vIGZyYW1lIG1lbW9yeSB0byB3cml0ZSB0byAodXNlcnMgbmVlZCB0byBnZXQgb3V0cHV0IGFuZC9vciByZXR1cm4gcGljdHVyZSkuCi0gICAgICAgICAgICBBVkNERUNfUkVEVU5EQU5UX1BJQ1RVUkUgaWYgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgaW4gdGhlIHByaW1hcnkgcGljdHVyZSBhbmQgcmVkdW5kYW50IHBpY3R1cmUgaXMgYXZhaWxhYmxlLAotICAgICAgICAgICAgQVZDREVDX0NPTkNFQUxFRF9QSUNUVVJFIGlmIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBkZWNvZGVyIGhhcyBjb25jZWFsZWQgaXQuIgotICAgICovCi0gICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0RlY19TdGF0dXMgUFZBVkNEZWNTRUkoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpuYWxfdW5pdCwgaW50IG5hbF9zaXplKTsKLQotICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjb2RlU2xpY2UoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpidWZmZXIsIGludCBidWZfc2l6ZSk7Ci0KLSAgICAvKioKLSAgICBDaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBkZWNvZGVkIHBpY3R1cmUgaW4gZGVjb2Rpbmcgb3JkZXIgKGZyYW1lX251bSkuCi0gICAgVGhlIEFWQ0ZyYW1lSU8gYWxzbyBwcm92aWRlIGRpc3BsYXlpbmcgb3JkZXIgaW5mb3JtYXRpb24gc3VjaCB0aGF0IHRoZSBhcHBsaWNhdGlvbgotICAgIGNhbiByZS1vcmRlciB0aGUgZnJhbWUgZm9yIGRpc3BsYXkuIEEgcGljdHVyZSBjYW4gYmUgcmV0cmlldmVkIG9ubHkgb25jZS4KLSAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKLSAgICBccGFyYW0gIm91dHB1dCIgICAgICAiUG9pbnRlciB0byB0aGUgQVZDT3V0cHV0IHN0cnVjdHVyZS4gTm90ZSB0aGF0IGRlY29kZXIgbGlicmFyeSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgcmUtdXNlZCB0aGUgcGl4ZWwgbWVtb3J5IGluIHRoaXMgc3RydWN0dXJlIHVudGlsIGl0IGhhcyBiZWVuIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJ1IFBWQVZDUmVsZWFzZU91dHB1dCBBUEkuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBBVkNERUNfRkFJTCBpZiBubyBwaWN0dXJlIGlzIGF2YWlsYWJsZSB0byBiZSBkaXNwbGF5ZWQsCi0gICAgICAgICAgICBBVkNERUNfUElDVFVSRV9SRUFEWSBpZiB0aGVyZSBpcyBhbm90aGVyIHBpY3R1cmUgdG8gYmUgZGlzcGxheWVkLiIKLSAgICAqLwotICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjR2V0T3V0cHV0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQgKmluZHgsIGludCAqcmVsZWFzZV9mbGFnLCBBVkNGcmFtZUlPICpvdXRwdXQpOwotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGRlY29kZXIgYW5kIGV4cGVjdHMgdG8gc2VlIHRoZSBuZXh0IElEUiBzbGljZS4KLSAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKLSAgICAqLwotICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWQVZDRGVjUmVzZXQoQVZDSGFuZGxlICphdmNIYW5kbGUpOwotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjbGVhbiB1cCBvcGVyYXRpb24gaW5jbHVkaW5nIG1lbW9yeSBkZWFsbG9jYXRpb24uCi0gICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZGVjb2RlciBsaWJyYXJ5IG9iamVjdC4iCi0gICAgKi8KLSAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVkFWQ0NsZWFuVXBEZWNvZGVyKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKLS8vQVZDRGVjX1N0YXR1cyBFQlNQdG9SQlNQKHVpbnQ4ICpuYWxfdW5pdCxpbnQgKnNpemUpOwotCi0KLQotICAgIC8qKiBDQUxMQkFDSyBGVU5DVElPTiBUTyBCRSBJTVBMRU1FTlRFRCBCWSBBUFBMSUNBVElPTiAqLwotICAgIC8qKiBJbiBBVkNIYW5kbGUgc3RydWN0dXJlLCB1c2VyRGF0YSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZwotICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLgotICAgICovCi0gICAgQVZDRGVjX1N0YXR1cyBDQkFWQ0RlY19HZXREYXRhKHVpbnQzMiAqdXNlckRhdGEsIHVuc2lnbmVkIGNoYXIgKipidWZmZXIsIHVuc2lnbmVkIGludCAqc2l6ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfQVZDREVDX0FQSV9IXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9pbmNsdWRlL3B2YXZjZGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvaW5jbHVkZS9wdmF2Y2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxOTZkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9pbmNsdWRlL3B2YXZjZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZm5kZWYgUFZBVkNERUNPREVSX0hfSU5DTFVERUQKLSNkZWZpbmUgUFZBVkNERUNPREVSX0hfSU5DTFVERUQKLQotI2lmbmRlZiBQVkFWQ0RFQ09ERVJJTlRFUkZBQ0VfSF9JTkNMVURFRAotI2luY2x1ZGUgInB2YXZjZGVjb2RlcmludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8vIEFWQyB2aWRlbyBkZWNvZGVyCi1jbGFzcyBQVkFWQ0RlY29kZXIgOiBwdWJsaWMgUFZBVkNEZWNvZGVySW50ZXJmYWNlCi17Ci0gICAgcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5QVkFWQ0RlY29kZXIoKTsKLSAgICAgICAgc3RhdGljICBQVkFWQ0RlY29kZXIqIE5ldyh2b2lkKTsKLSAgICAgICAgdmlydHVhbCBib29sICAgIEluaXRBVkNEZWNvZGVyKEZ1bmN0aW9uVHlwZV9TUFMsIEZ1bmN0aW9uVHlwZV9BbGxvYywgRnVuY3Rpb25UeXBlX1VuYmluZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZV9NYWxsb2MsIEZ1bmN0aW9uVHlwZV9GcmVlLCB2b2lkICopOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYW5VcEFWQ0RlY29kZXIodm9pZCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBSZXNldEFWQ0RlY29kZXIodm9pZCk7Ci0gICAgICAgIHZpcnR1YWwgaW50MzIgICBEZWNvZGVTUFModWludDggKmJpdHN0cmVhbSwgaW50MzIgYnVmZmVyX3NpemUpOwotICAgICAgICB2aXJ0dWFsIGludDMyICAgRGVjb2RlUFBTKHVpbnQ4ICpiaXRzdHJlYW0sIGludDMyIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMiAgIERlY29kZUFWQ1NsaWNlKHVpbnQ4ICpiaXRzdHJlYW0sIGludDMyICpidWZmZXJfc2l6ZSk7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBHZXREZWNPdXRwdXQoaW50ICppbmR4LCBpbnQgKnJlbGVhc2UpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgR2V0VmlkZW9EaW1lbnNpb25zKGludDMyICp3aWR0aCwgaW50MzIgKmhlaWdodCwgaW50MzIgKnRvcCwgaW50MzIgKmxlZnQsIGludDMyICpib3R0b20sIGludDMyICpyaWdodCk7Ci0gICAgICAgIGludCAgICAgQVZDX01hbGxvYyhpbnQzMiBzaXplLCBpbnQgYXR0cmlidXRlKTsKLSAgICAgICAgdm9pZCAgICBBVkNfRnJlZShpbnQgbWVtKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFBWQVZDRGVjb2RlcigpOwotICAgICAgICBib29sIENvbnN0cnVjdCh2b2lkKTsKLSAgICAgICAgdm9pZCAqaUFWQ0hhbmRsZTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvaW5jbHVkZS9wdmF2Y2RlY29kZXJpbnRlcmZhY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL2luY2x1ZGUvcHZhdmNkZWNvZGVyaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzIxMmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvaW5jbHVkZS9wdmF2Y2RlY29kZXJpbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaWZuZGVmIFBWQVZDREVDT0RFUklOVEVSRkFDRV9IX0lOQ0xVREVECi0jZGVmaW5lIFBWQVZDREVDT0RFUklOVEVSRkFDRV9IX0lOQ0xVREVECi0KLXR5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uVHlwZV9VbmJpbmQpKHZvaWQgKiwgaW50KTsKLXR5cGVkZWYgaW50ICgqRnVuY3Rpb25UeXBlX0FsbG9jKSh2b2lkICosIGludCwgdWludDggKiopOwotdHlwZWRlZiBpbnQgKCpGdW5jdGlvblR5cGVfU1BTKSh2b2lkICosIHVpbnQsIHVpbnQpOwotdHlwZWRlZiBpbnQgKCpGdW5jdGlvblR5cGVfTWFsbG9jKSh2b2lkICosIGludDMyLCBpbnQpOwotdHlwZWRlZiB2b2lkKCpGdW5jdGlvblR5cGVfRnJlZSkodm9pZCAqLCBpbnQpOwotCi0KLS8vIFBWQVZDRGVjb2RlckludGVyZmFjZSBwdXJlIHZpcnR1YWwgaW50ZXJmYWNlIGNsYXNzCi1jbGFzcyBQVkFWQ0RlY29kZXJJbnRlcmZhY2UKLXsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgflBWQVZDRGVjb2RlckludGVyZmFjZSgpIHt9OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgSW5pdEFWQ0RlY29kZXIoRnVuY3Rpb25UeXBlX1NQUywgRnVuY3Rpb25UeXBlX0FsbG9jLCBGdW5jdGlvblR5cGVfVW5iaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlX01hbGxvYywgRnVuY3Rpb25UeXBlX0ZyZWUsIHZvaWQgKikgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYW5VcEFWQ0RlY29kZXIodm9pZCkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgUmVzZXRBVkNEZWNvZGVyKHZvaWQpID0gMDsKLSAgICAgICAgdmlydHVhbCBpbnQzMiAgIERlY29kZVNQUyh1aW50OCAqYml0c3RyZWFtLCBpbnQzMiBidWZmZXJfc2l6ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIGludDMyICAgRGVjb2RlUFBTKHVpbnQ4ICpiaXRzdHJlYW0sIGludDMyIGJ1ZmZlcl9zaXplKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50MzIgICBEZWNvZGVBVkNTbGljZSh1aW50OCAqYml0c3RyZWFtLCBpbnQzMiAqYnVmZmVyX3NpemUpID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sICAgIEdldERlY091dHB1dChpbnQgKmluZHgsIGludCAqcmVsZWFzZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgR2V0VmlkZW9EaW1lbnNpb25zKGludDMyICp3aWR0aCwgaW50MzIgKmhlaWdodCwgaW50MzIgKnRvcCwgaW50MzIgKmxlZnQsIGludDMyICpib3R0b20sIGludDMyICpyaWdodCkgPSAwOwotLy8gIHZpcnR1YWwgaW50ICAgICBBVkNfTWFsbG9jKGludDMyIHNpemUsIGludCBhdHRyaWJ1dGUpOwotLy8gIHZpcnR1YWwgdm9pZCAgICBBVkNfRnJlZShpbnQgbWVtKTsKLX07Ci0KLSNlbmRpZiAvLyBQVkFWQ0RFQ09ERVJJTlRFUkZBQ0VfSF9JTkNMVURFRAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNfYml0c3RyZWFtLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNfYml0c3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwYjY2NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvYXZjX2JpdHN0cmVhbS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJhdmNkZWNfYml0c3RyZWFtLmgiCi0KLS8qIFN3YXBwaW5nIG1heSBub3QgYmUgbmVlZGVkIGFueW1vcmUgc2luY2Ugd2UgcmVhZCBvbmUgYnl0ZSBhdCBhIHRpbWUgYW5kIHBlcmZvcm0KLUVCU1AgdG8gUkJTUCBjb252ZXJzaW9uIGluIGJpdHN0cmVhbS4gKi8KLSNpZmRlZiBMSVRUTEVfRU5ESUFOCi0jaWYgKFdPUkRfU0laRT09MzIpICAvKiB0aGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGFzc2VtYmx5IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTV0FQX0JZVEVTKHgpICgoKCh4KSYweEZGKTw8MjQpIHwgKCgoeCkmMHhGRjAwKTw8OCkgfCAoKCh4KSYweEZGMDAwMCk+PjgpIHwgKCgoeCkmMHhGRjAwMDAwMCk+PjI0KSkKLSNlbHNlICAvKiBmb3IgMTYtYml0ICovCi0jZGVmaW5lIFNXQVBfQllURVMoeCkgKCgoKHgpJjB4RkYpPDw4KSB8ICgoKHgpJjB4RkYwMCk+PjgpKQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBTV0FQX0JZVEVTKHgpICh4KQotI2VuZGlmCi0KLQotLyogYXJyYXkgZm9yIHRyYWlsaW5nIGJpdCBwYXR0ZXJuIGFzIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBiaXRzICovCi0vKiB0aGUgZmlyc3Qgb25lIGlzIHVudXNlZC4gKi8KLWNvbnN0IHN0YXRpYyB1aW50OCB0cmFpbGluZ19iaXRzWzldID0gezAsIDB4MSwgMHgyLCAweDQsIDB4OCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtSW5pdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxMS80LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFBvcHVsYXRlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBiaXRzdHJlYW0gYnVmZmVyIGFuZCBzaXplICAqLwotLyogICAgICAgICAgICAgaXQgYWxzbyBpbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IEFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDREVDX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiB8LS0tLS0tLS18LS0tLS0tLS18LS0tLX5+fn5+LS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18Ci0gICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXnJlYWRfcG9zICAgICAgICAgICBeZGF0YV9lbmRfcG9zCi0gICBiaXRzdHJlYW1CdWZmZXIgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkCi0KLSAgIHx4eHh4eHh4eHh4eHh4LS0tLXwgID0gY3VycmVudF93b3JkIDMyIG9yIDE2IGJpdHMKLSAgICA8LS0tLS0tLS0tLS0tPgotICAgICBiaXRfbGVmdAotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtTmV4dFdvcmQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxMi80LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFJlYWQgdXAgdG8gbWFjaGluZSB3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBOZXh0IHdvcmQgd2l0aCBlbXVsYXRpb24gcHJldmVudGlvbiBjb2RlIHJlbW92ZWQuIEV2ZXJ5dGhpbmcKLSAgICBpbiB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZSBnb3QgbW9kaWZpZWQgZXhjZXB0IGN1cnJlbnRfd29yZCAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotQVZDRGVjX1N0YXR1cyBCaXRzdHJlYW1Jbml0KEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50OCAqYnVmZmVyLCBpbnQgc2l6ZSkKLXsKLSAgICBFQlNQdG9SQlNQKGJ1ZmZlciwgJnNpemUpOwotCi0gICAgc3RyZWFtLT5pbmNudCA9IDA7Ci0gICAgc3RyZWFtLT5pbmNudF9uZXh0ID0gMDsKLSAgICBzdHJlYW0tPmJpdGNudCA9IDA7Ci0gICAgc3RyZWFtLT5jdXJyX3dvcmQgPSBzdHJlYW0tPm5leHRfd29yZCA9IDA7Ci0gICAgc3RyZWFtLT5yZWFkX3BvcyA9IDA7Ci0KLSAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIHN0cmVhbS0+ZGF0YV9lbmRfcG9zID0gc2l6ZTsKLQotICAgIHN0cmVhbS0+bmFsX3NpemUgPSBzaXplOwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBBVkNfQml0c3RyZWFtRmlsbENhY2hlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxLzEvMjAwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFJlYWQgdXAgdG8gbWFjaGluZSB3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBSZWFkIGluIDQgYnl0ZXMgb2YgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLUFWQ0RlY19TdGF0dXMgQVZDX0JpdHN0cmVhbUZpbGxDYWNoZShBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSkKLXsKLSAgICB1aW50OCAqYml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXI7Ci0gICAgdWludDggKnY7Ci0gICAgaW50IG51bV9iaXRzLCBpOwotCi0gICAgc3RyZWFtLT5jdXJyX3dvcmQgfD0gKHN0cmVhbS0+bmV4dF93b3JkID4+IHN0cmVhbS0+aW5jbnQpOyAgIC8vIHN0cmVhbS0+aW5jbnQgY2Fubm90IGJlIDMyCi0gICAgc3RyZWFtLT5uZXh0X3dvcmQgPDw9ICgzMSAtIHN0cmVhbS0+aW5jbnQpOwotICAgIHN0cmVhbS0+bmV4dF93b3JkIDw8PSAxOwotICAgIG51bV9iaXRzID0gc3RyZWFtLT5pbmNudF9uZXh0ICsgc3RyZWFtLT5pbmNudDsKLSAgICBpZiAobnVtX2JpdHMgPj0gMzIpCi0gICAgewotICAgICAgICBzdHJlYW0tPmluY250X25leHQgLT0gKDMyIC0gc3RyZWFtLT5pbmNudCk7Ci0gICAgICAgIHN0cmVhbS0+aW5jbnQgPSAzMjsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotICAgIH0KLSAgICAvKiB0aGlzIGNoZWNrIGNhbiBiZSByZW1vdmVkIGlmIHRoZXJlIGlzIGFkZGl0aW9uYWwgZXh0cmEgNCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBiaXRzdHJlYW0gKi8KLSAgICB2ID0gYml0c3RyZWFtQnVmZmVyICsgc3RyZWFtLT5yZWFkX3BvczsKLQotICAgIGlmIChzdHJlYW0tPnJlYWRfcG9zID4gc3RyZWFtLT5kYXRhX2VuZF9wb3MgLSA0KQotICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+ZGF0YV9lbmRfcG9zIDw9IHN0cmVhbS0+cmVhZF9wb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVhbS0+aW5jbnQgPSBudW1fYml0czsKLSAgICAgICAgICAgIHN0cmVhbS0+aW5jbnRfbmV4dCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJlYW0tPm5leHRfd29yZCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+ZGF0YV9lbmRfcG9zIC0gc3RyZWFtLT5yZWFkX3BvczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0tPm5leHRfd29yZCB8PSAodltpXSA8PCAoKDMgLSBpKSA8PCAzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJlYW0tPnJlYWRfcG9zID0gc3RyZWFtLT5kYXRhX2VuZF9wb3M7Ci0gICAgICAgIHN0cmVhbS0+Y3Vycl93b3JkIHw9IChzdHJlYW0tPm5leHRfd29yZCA+PiBudW1fYml0cyk7IC8vIHRoaXMgaXMgc2FmZQotCi0gICAgICAgIHN0cmVhbS0+bmV4dF93b3JkIDw8PSAoMzEgLSBudW1fYml0cyk7Ci0gICAgICAgIHN0cmVhbS0+bmV4dF93b3JkIDw8PSAxOwotICAgICAgICBudW1fYml0cyA9IGkgPDwgMzsKLSAgICAgICAgc3RyZWFtLT5pbmNudCArPSBzdHJlYW0tPmluY250X25leHQ7Ci0gICAgICAgIHN0cmVhbS0+aW5jbnRfbmV4dCA9IG51bV9iaXRzIC0gKDMyIC0gc3RyZWFtLT5pbmNudCk7Ci0gICAgICAgIGlmIChzdHJlYW0tPmluY250X25leHQgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0tPmluY250ICs9ICBudW1fYml0czsKLSAgICAgICAgICAgIHN0cmVhbS0+aW5jbnRfbmV4dCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0tPmluY250ID0gMzI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotICAgIH0KLQotICAgIHN0cmVhbS0+bmV4dF93b3JkID0gKCh1aW50MzIpdlswXSA8PCAyNCkgfCAodlsxXSA8PCAxNikgfCAodlsyXSA8PCA4KSB8IHZbM107Ci0gICAgc3RyZWFtLT5yZWFkX3BvcyArPSA0OwotCi0gICAgc3RyZWFtLT5jdXJyX3dvcmQgfD0gKHN0cmVhbS0+bmV4dF93b3JkID4+IG51bV9iaXRzKTsgLy8gdGhpcyBpcyBzYWZlCi0gICAgc3RyZWFtLT5uZXh0X3dvcmQgPDw9ICgzMSAtIG51bV9iaXRzKTsKLSAgICBzdHJlYW0tPm5leHRfd29yZCA8PD0gMTsKLSAgICBzdHJlYW0tPmluY250X25leHQgKz0gc3RyZWFtLT5pbmNudDsKLSAgICBzdHJlYW0tPmluY250ID0gMzI7Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotCi19Ci0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVJlYWRCaXRzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBSZWFkIHVwIHRvIG1hY2hpbmUgd29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNERUNfRkFJTCBpZiBudW1iZXIgb2YgYml0cyAgICovCi0vKiAgICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSB3b3JkLXNpemUsIEFWQ0RFQ19QQUNLRVRfTE9TUyBvciAgICAgICAgKi8KLS8qICAgICAgICAgICAgICBBVkNERUNfTk9fREFUQSBpZiBjYWxsYmFjayB0byBnZXQgZGF0YSBmYWlscy4gICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUFWQ0RlY19TdGF0dXMgQml0c3RyZWFtUmVhZEJpdHMoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIGludCBuQml0cywgdWludCAqY29kZSkKLXsKLSAgICBpZiAoc3RyZWFtLT5pbmNudCA8IG5CaXRzKQotICAgIHsKLSAgICAgICAgLyogZnJhbWUtYmFzZWQgZGVjb2RpbmcgKi8KLSAgICAgICAgQVZDX0JpdHN0cmVhbUZpbGxDYWNoZShzdHJlYW0pOwotICAgIH0KLSAgICAqY29kZSA9IHN0cmVhbS0+Y3Vycl93b3JkID4+ICgzMiAtIG5CaXRzKTsKLSAgICBCaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBuQml0cyk7Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1TaG93Qml0cygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogU2hvdyB1cCB0byBtYWNoaW5lIHdvcmQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHBvaW50ZXIuICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IEFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDREVDX0ZBSUwgaWYgbnVtYmVyIG9mIGJpdHMgICAqLwotLyogICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgd29yZC1zaXplLCBBVkNERUNfTk9fREFUQSBpZiBpdCBuZWVkcyAgICovCi0vKiAgICAgICAgICAgICAgdG8gY2FsbGJhY2sgdG8gZ2V0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1BVkNEZWNfU3RhdHVzIEJpdHN0cmVhbVNob3dCaXRzKEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgbkJpdHMsIHVpbnQgKmNvZGUpCi17Ci0gICAgaWYgKHN0cmVhbS0+aW5jbnQgPCBuQml0cykKLSAgICB7Ci0gICAgICAgIC8qIGZyYW1lLWJhc2VkIGRlY29kaW5nICovCi0gICAgICAgIEFWQ19CaXRzdHJlYW1GaWxsQ2FjaGUoc3RyZWFtKTsKLSAgICB9Ci0KLSAgICAqY29kZSA9IHN0cmVhbS0+Y3Vycl93b3JkID4+ICgzMiAtIG5CaXRzKTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1SZWFkMUJpdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogUmVhZCAxIGJpdCBmcm9tIHRoZSBiaXRzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IEFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDREVDX0ZBSUwgaWYgbnVtYmVyIG9mIGJpdHMgICAqLwotLyogICAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgd29yZC1zaXplLCBBVkNERUNfUEFDS0VUX0xPU1Mgb3IgICAgICAgICovCi0vKiAgICAgICAgICAgICAgQVZDREVDX05PX0RBVEEgaWYgY2FsbGJhY2sgdG8gZ2V0IGRhdGEgZmFpbHMuICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLUFWQ0RlY19TdGF0dXMgQml0c3RyZWFtUmVhZDFCaXQoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgKmNvZGUpCi17Ci0gICAgaWYgKHN0cmVhbS0+aW5jbnQgPCAxKQotICAgIHsKLSAgICAgICAgLyogZnJhbWUtYmFzZWQgZGVjb2RpbmcgKi8KLSAgICAgICAgQVZDX0JpdHN0cmVhbUZpbGxDYWNoZShzdHJlYW0pOwotICAgIH0KLSAgICAqY29kZSA9IHN0cmVhbS0+Y3Vycl93b3JkID4+IDMxOwotICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDEpOwotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotCi0KLUFWQ0RlY19TdGF0dXMgQml0c3RyZWFtQnl0ZUFsaWduKEFWQ0RlY0JpdHN0cmVhbSAgKnN0cmVhbSkKLXsKLSAgICB1aW50IG5fc3R1ZmZlZDsKLQotICAgIG5fc3R1ZmZlZCA9ICg4IC0gKHN0cmVhbS0+Yml0Y250ICYgMHg3KSkgJiAweDc7IC8qICAwNy8wNS8wMSAqLwotCi0gICAgc3RyZWFtLT5iaXRjbnQgKz0gbl9zdHVmZmVkOwotICAgIHN0cmVhbS0+aW5jbnQgLT0gbl9zdHVmZmVkOwotCi0gICAgaWYgKHN0cmVhbS0+aW5jbnQgPCAwKQotICAgIHsKLSAgICAgICAgc3RyZWFtLT5iaXRjbnQgKz0gc3RyZWFtLT5pbmNudDsKLSAgICAgICAgc3RyZWFtLT5pbmNudCA9IDA7Ci0gICAgfQotICAgIHN0cmVhbS0+Y3Vycl93b3JkIDw8PSBuX3N0dWZmZWQ7Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIFJCU1AgZGF0YS4gKi8KLS8qIGlnbm9yZSB0aGUgZW11bGF0aW9uIHByZXZlbnRpb24gY29kZSwgYXNzdW1lIGl0IGhhcyBiZWVuIHRha2VuIG91dC4gKi8KLWJvb2wgbW9yZV9yYnNwX2RhdGEoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgaW50IHRvdGFsX2JpdF9sZWZ0OwotICAgIHVpbnQgY29kZTsKLQotICAgIGlmIChzdHJlYW0tPnJlYWRfcG9zID49IHN0cmVhbS0+bmFsX3NpemUpCi0gICAgewotICAgICAgICB0b3RhbF9iaXRfbGVmdCA9IHN0cmVhbS0+aW5jbnRfbmV4dCArIHN0cmVhbS0+aW5jbnQ7Ci0gICAgICAgIGlmICh0b3RhbF9iaXRfbGVmdCA8PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodG90YWxfYml0X2xlZnQgPD0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCB0b3RhbF9iaXRfbGVmdCwgJmNvZGUpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gdHJhaWxpbmdfYml0c1t0b3RhbF9iaXRfbGVmdF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNkZWNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNkZWNfYXBpLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3NWYxNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvYXZjZGVjX2FwaS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM2ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKioKLVRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIHRoZSBBVkMgZGVjb2RlciBsaWJyYXJ5LgotQHB1Ymxpc2hlZEFsbAotKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZjZGVjX2FwaS5oIgotI2luY2x1ZGUgImF2Y2RlY19saWIuaCIKLSNpbmNsdWRlICJhdmNkZWNfYml0c3RyZWFtLmgiCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogRUJTUHRvUkJTUCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxMS80LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IENvbnZlcnQgRUJTUCB0byBSQlNQIGFuZCBvdmVyd3JpdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgQXNzdW1pbmcgdGhhdCBmb3JiaWRkZW5femVybywgbmFsX3JlZl9pZGMgYW5kIG5hbF91bml0X3R5cGUgICovCi0vKiAgICAgICAgICAoZmlyc3QgYnl0ZSksIGhhcyBiZWVuIHRha2VuIG91dCBvZiB0aGUgbmFsX3VuaXQuICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyoqCi1AcHNldWRvY29kZSAiCi0gICAgTnVtQnl0ZXNJblJCU1AgPSAwOwotICAgIGZvcihpPTA6aTwgKnNpemU7IGkrKyl7Ci0gICAgICAgIGlmKGkrMiA8ICpzaXplICYmIG5leHRfYml0cygyNCk9PTB4MDAwMDAzKXsKLSAgICAgICAgICAgIHJic3BfYnl0ZVtOdW1CeXRlc0luUkJTUCsrXTsKLSAgICAgICAgICAgIHJic3BfYnl0ZVtOdW1CeXRlc0luUkJTUCsrXTsKLSAgICAgICAgICAgIGkrPTI7Ci0gICAgICAgICAgICBlbXVsYXRpb25fcHJldmVudGlvbl90aHJlZV9ieXRlICgweDAzKQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJic3BfYnl0ZVtOdW1CeXRlc0luUkJTUCsrXTsKLSAgICB9IgotKi8KLUFWQ0RlY19TdGF0dXMgRUJTUHRvUkJTUCh1aW50OCAqbmFsX3VuaXQsIGludCAqc2l6ZSkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgLyogVGhpcyBjb2RlIGlzIGJhc2VkIG9uIEVCU1B0b1JCU1Agb2YgSk0gKi8KLSAgICBqID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAqc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGNvdW50ID09IDIgJiYgbmFsX3VuaXRbaV0gPT0gMHgwMykKLSAgICAgICAgewotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG5hbF91bml0W2pdID0gbmFsX3VuaXRbaV07Ci0gICAgICAgIGlmIChuYWxfdW5pdFtpXSA9PSAweDAwKQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgKnNpemUgPSBqOwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQVZDQW5uZXhCR2V0TkFMVW5pdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvMy8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBQYXJzZSBhIE5BTCBmcm9tIGJ5dGUgc3RyZWFtIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyoqCi1AcHNldWRvY29kZSAiCi0gICAgYnl0ZV9zdHJlYW1fbmFsX3VuaXQoTnVtQnl0ZXNJbk5hbHVuaXQpewotICAgIHdoaWxlKG5leHRfYml0cygyNCkgIT0gMHgwMDAwMDEpCi0gICAgICAgIHplcm9fYnl0ZQotICAgIGlmKG1vcmVfZGF0YV9pbl9ieXRlX3N0cmVhbSgpKXsKLSAgICAgICAgc3RhcnRfY29kZV9wcmVmaXhfb25lXzNieXRlcyAvLyBlcXVhbCAweDAwMDAwMQotICAgICAgICBuYWxfdW5pdChOdW1CeXRlc0luTkFMdW5pdCkKLSAgICB9Ci0gICB9IgotKi8KLU9TQ0xfRVhQT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDQW5uZXhCR2V0TkFMVW5pdCh1aW50OCAqYml0c3RyZWFtLCB1aW50OCAqKm5hbF91bml0LAotICAgICAgICBpbnQgKnNpemUpCi17Ci0gICAgaW50IGksIGosIEZvdW5kU3RhcnRDb2RlID0gMDsKLSAgICBpbnQgZW5kOwotCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKGJpdHN0cmVhbVtpXSA9PSAwICYmIGkgPCAqc2l6ZSkKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgaWYgKGkgPj0gKnNpemUpCi0gICAgewotICAgICAgICAqbmFsX3VuaXQgPSBiaXRzdHJlYW07Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogY2Fubm90IGZpbmQgYW55IHN0YXJ0X2NvZGVfcHJlZml4LiAqLwotICAgIH0KLSAgICBlbHNlIGlmIChiaXRzdHJlYW1baV0gIT0gMHgxKQotICAgIHsKLSAgICAgICAgaSA9IC0xOyAgLyogc3RhcnRfY29kZV9wcmVmaXggaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcsIGNvbnRpbnVlICovCi0gICAgfQotCi0gICAgaSsrOwotICAgICpuYWxfdW5pdCA9IGJpdHN0cmVhbSArIGk7IC8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE5BTCB1bml0ICovCi0KLSAgICBqID0gZW5kID0gaTsKLSAgICB3aGlsZSAoIUZvdW5kU3RhcnRDb2RlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKChqICsgMSA8ICpzaXplKSAmJiAoYml0c3RyZWFtW2pdICE9IDAgfHwgYml0c3RyZWFtW2orMV0gIT0gMCkpICAvKiBzZWUgMiBjb25zZWN1dGl2ZSB6ZXJvIGJ5dGVzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICBlbmQgPSBqOyAgIC8qIHN0b3AgYW5kIGNoZWNrIGZvciBzdGFydCBjb2RlICovCi0gICAgICAgIHdoaWxlIChqICsgMiA8ICpzaXplICYmIGJpdHN0cmVhbVtqKzJdID09IDApIC8qIGtlZXAgcmVhZGluZyBmb3IgemVybyBieXRlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiArIDIgPj0gKnNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpzaXplIC09IGk7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX05PX05FWFRfU0M7ICAvKiBjYW5ub3QgZmluZCB0aGUgc2Vjb25kIHN0YXJ0X2NvZGVfcHJlZml4ICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpdHN0cmVhbVtqKzJdID09IDB4MSkKLSAgICAgICAgewotICAgICAgICAgICAgRm91bmRTdGFydENvZGUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogY291bGQgYmUgZW11bGF0aW9uIGNvZGUgMHgzICovCi0gICAgICAgICAgICBqICs9IDI7IC8qIGNvbnRpbnVlIHRoZSBzZWFyY2ggKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgICpzaXplID0gZW5kIC0gaTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkFWQ0dldE5BTFR5cGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogU25pZmYgTkFMIHR5cGUgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IEFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2NlZWQsIEFWQ19GQUlMIGlmIGZhaWwuICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjR2V0TkFMVHlwZSh1aW50OCAqYml0c3RyZWFtLCBpbnQgc2l6ZSwKLSAgICAgICAgaW50ICpuYWxfdHlwZSwgaW50ICpuYWxfcmVmX2lkYykKLXsKLSAgICBpbnQgZm9yYmlkZGVuX3plcm9fYml0OwotICAgIGlmIChzaXplID4gMCkKLSAgICB7Ci0gICAgICAgIGZvcmJpZGRlbl96ZXJvX2JpdCA9IGJpdHN0cmVhbVswXSA+PiA3OwotICAgICAgICBpZiAoZm9yYmlkZGVuX3plcm9fYml0ICE9IDApCi0gICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgICpuYWxfcmVmX2lkYyA9IChiaXRzdHJlYW1bMF0gJiAweDYwKSA+PiA1OwotICAgICAgICAqbmFsX3R5cGUgPSBiaXRzdHJlYW1bMF0gJiAweDFGOwotICAgICAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQVZDRGVjU2VxUGFyYW1TZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBJbml0aWFsaXplIHNlcXVlbmNlLCBtZW1vcnkgYWxsb2NhdGlvbiBpZiBuZWNlc3NhcnkuICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQVZDRGVjX1N0YXR1cyAgIFBWQVZDRGVjU2VxUGFyYW1TZXQoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpuYWxfdW5pdCwKLSAgICAgICAgaW50IG5hbF9zaXplKQotewotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotICAgIEFWQ0RlY09iamVjdCAqZGVjdmlkOwotICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87Ci0gICAgQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW07Ci0gICAgdm9pZCAqdXNlckRhdGEgPSBhdmNIYW5kbGUtPnVzZXJEYXRhOwotICAgIGJvb2wgIGZpcnN0X3NlcSA9IEZBTFNFOwotICAgIGludCBpOwotCi0KLSAgICBERUJVR19MT0codXNlckRhdGEsIEFWQ19MT0dUWVBFX0lORk8sICJQVkFWQ0RlY1NlcVBhcmFtU2V0IiwgLTEsIC0xKTsKLQotICAgIGlmIChhdmNIYW5kbGUtPkFWQ09iamVjdCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgZmlyc3Rfc2VxID0gVFJVRTsKLQotICAgICAgICAvL2F2Y0hhbmRsZS0+bWVtb3J5X3VzYWdlID0gMDsKLSAgICAgICAgLyogYWxsb2NhdGUgQVZDRGVjT2JqZWN0ICovCi0gICAgICAgIGF2Y0hhbmRsZS0+QVZDT2JqZWN0ID0gKHZvaWQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDRGVjT2JqZWN0KSwgMC8qREVGQVVMVF9BVFRSKi8pOwotICAgICAgICBpZiAoYXZjSGFuZGxlLT5BVkNPYmplY3QgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19NRU1PUllfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlY3ZpZCA9IChBVkNEZWNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKLQotICAgICAgICBtZW1zZXQoZGVjdmlkLCAwLCBzaXplb2YoQVZDRGVjT2JqZWN0KSk7Ci0KLSAgICAgICAgZGVjdmlkLT5jb21tb24gPSAoQVZDQ29tbW9uT2JqKilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0NvbW1vbk9iaiksIDApOwotICAgICAgICBpZiAoZGVjdmlkLT5jb21tb24gPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19NRU1PUllfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvID0gZGVjdmlkLT5jb21tb247Ci0gICAgICAgIG1lbXNldCh2aWRlbywgMCwgc2l6ZW9mKEFWQ0NvbW1vbk9iaikpOwotCi0gICAgICAgIHZpZGVvLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IDk5OTk7IC8qIHNldCBpdCB0byBzb21lIGlsbGVnYWwgdmFsdWUgKi8KLQotICAgICAgICBkZWN2aWQtPmJpdHN0cmVhbSA9IChBVkNEZWNCaXRzdHJlYW0gKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNEZWNCaXRzdHJlYW0pLCAxLypERUZBVUxUX0FUVFIqLyk7Ci0gICAgICAgIGlmIChkZWN2aWQtPmJpdHN0cmVhbSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX01FTU9SWV9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVjdmlkLT5iaXRzdHJlYW0tPnVzZXJEYXRhID0gYXZjSGFuZGxlLT51c2VyRGF0YTsgLyogY2FsbGJhY2sgZm9yIG1vcmUgZGF0YSAqLwotICAgICAgICBkZWN2aWQtPmF2Y0hhbmRsZSA9IGF2Y0hhbmRsZTsKLSAgICAgICAgZGVjdmlkLT5kZWJ1Z0VuYWJsZSA9IGF2Y0hhbmRsZS0+ZGVidWdFbmFibGU7Ci0gICAgfQotCi0gICAgZGVjdmlkID0gKEFWQ0RlY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OwotICAgIHZpZGVvID0gZGVjdmlkLT5jb21tb247Ci0gICAgYml0c3RyZWFtID0gZGVjdmlkLT5iaXRzdHJlYW07Ci0KLSAgICAvKiBjaGVjayBpZiB3ZSBjYW4gcmV1c2UgdGhlIG1lbW9yeSB3aXRob3V0IHJlLWFsbG9jYXRpbmcgaXQuICovCi0gICAgLyogYWx3YXlzIGNoZWNrIGlmKGZpcnN0X3NlcT09VFJVRSkgKi8KLQotICAgIC8qIENvbnZlcnNpb24gZnJvbSBFQlNQIHRvIFJCU1AgKi8KLSAgICB2aWRlby0+Zm9yYmlkZGVuX2JpdCA9IG5hbF91bml0WzBdID4+IDc7Ci0gICAgaWYgKHZpZGVvLT5mb3JiaWRkZW5fYml0KSByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgdmlkZW8tPm5hbF9yZWZfaWRjID0gKG5hbF91bml0WzBdICYgMHg2MCkgPj4gNTsKLSAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IChBVkNOYWxVbml0VHlwZSkobmFsX3VuaXRbMF0gJiAweDFGKTsKLQotICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSAhPSBBVkNfTkFMVFlQRV9TUFMpIC8qIG5vdCBhIFNQUyBOQUwgKi8KLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGJpdHN0cmVhbSBzdHJ1Y3R1cmUqLwotICAgIEJpdHN0cmVhbUluaXQoYml0c3RyZWFtLCBuYWxfdW5pdCArIDEsIG5hbF9zaXplIC0gMSk7Ci0KLSAgICAvKiBpZiBmaXJzdF9zZXEgPT0gVFJVRSwgYWxsb2NhdGUgdGhlIGZvbGxvd2luZyBtZW1vcnkgICovCi0gICAgaWYgKGZpcnN0X3NlcSA9PSBUUlVFKQotICAgIHsKLSAgICAgICAgdmlkZW8tPmN1cnJTZXFQYXJhbXMgPSBOVUxMOyAvKiBpbml0aWFsaXplIGl0IHRvIE5VTEwgKi8KLSAgICAgICAgdmlkZW8tPmN1cnJQaWNQYXJhbXMgPSBOVUxMOwotCi0gICAgICAgIC8qIFRoZXJlIGFyZSAzMiBwb2ludGVycyB0byBzZXF1ZW5jZSBwYXJhbSBzZXQsIHNlcVBhcmFtcy4KLSAgICAgICAgICAgICAgICBUaGVyZSBhcmUgMjU1IHBvaW50ZXJzIHRvIHBpY3R1cmUgcGFyYW0gc2V0LCBwaWNQYXJhbXMuKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgICAgICAgICBkZWN2aWQtPnNlcVBhcmFtc1tpXSA9IE5VTEw7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICAgICAgZGVjdmlkLT5waWNQYXJhbXNbaV0gPSBOVUxMOwotCi0gICAgICAgIHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCA9IE5VTEw7Ci0KLSAgICAgICAgdmlkZW8tPm1lbV9tZ3JfY3RybF9lcV81ID0gRkFMU0U7Ci0gICAgICAgIHZpZGVvLT5uZXdQaWMgPSBUUlVFOwotICAgICAgICB2aWRlby0+bmV3U2xpY2UgPSBUUlVFOwotICAgICAgICB2aWRlby0+Y3VyclBpYyA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5jdXJyRlMgPSBOVUxMOwotICAgICAgICB2aWRlby0+cHJldlJlZlBpYyA9IE5VTEw7Ci0KLSAgICAgICAgdmlkZW8tPm1iTnVtID0gMDsgLy8gTUNfQ29uY2VhbAotICAgICAgICAvKiAgQWxsb2NhdGUgc2xpY2VIZHIuICovCi0KLSAgICAgICAgdmlkZW8tPnNsaWNlSGRyID0gKEFWQ1NsaWNlSGVhZGVyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNTbGljZUhlYWRlciksIDUvKkRFRkFVTFRfQVRUUiovKTsKLSAgICAgICAgaWYgKHZpZGVvLT5zbGljZUhkciA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX01FTU9SWV9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPmRlY1BpY0J1ZiA9IChBVkNEZWNQaWNCdWZmZXIqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0RlY1BpY0J1ZmZlciksIDMvKkRFRkFVTFRfQVRUUiovKTsKLSAgICAgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19NRU1PUllfRkFJTDsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQodmlkZW8tPmRlY1BpY0J1ZiwgMCwgc2l6ZW9mKEFWQ0RlY1BpY0J1ZmZlcikpOwotICAgIH0KLQotICAgIC8qIERlY29kZSBTUFMsIGFsbG9jYXRlIHZpZGVvLT5zZXFQYXJhbXNbaV0gYW5kIGFzc2lnbiB2aWRlby0+Y3VyclNlcVBhcmFtcyAqLwotICAgIHN0YXR1cyA9IERlY29kZVNQUyhkZWN2aWQsIGJpdHN0cmVhbSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQVZDRGVjR2V0U2VxSW5mbygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgc2VxdWVuY2UgcGFyYW1ldGVyIGluZm8uIGFmdGVyIFNQUyBOQUwgaXMgZGVjb2RlZC4gICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxMi8yMC8wMzogIGNoYW5nZSBpbnB1dCBhcmd1bWVudCwgdXNlIHN0cnVjdHVyZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLU9TQ0xfRVhQT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjR2V0U2VxSW5mbyhBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRGVjU1BTSW5mbyAqc2VxSW5mbykKLXsKLSAgICBBVkNEZWNPYmplY3QgKmRlY3ZpZCA9IChBVkNEZWNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKLSAgICBBVkNDb21tb25PYmogKnZpZGVvOwotICAgIGludCBQaWNXaWR0aEluTWJzLCBQaWNIZWlnaHRJbk1hcFVuaXRzLCBGcmFtZUhlaWdodEluTWJzOwotCi0gICAgaWYgKGRlY3ZpZCA9PSBOVUxMIHx8IGRlY3ZpZC0+c2VxUGFyYW1zWzBdID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgdmlkZW8gPSBkZWN2aWQtPmNvbW1vbjsKLQotICAgIFBpY1dpZHRoSW5NYnMgPSBkZWN2aWQtPnNlcVBhcmFtc1swXS0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxOwotICAgIFBpY0hlaWdodEluTWFwVW5pdHMgPSBkZWN2aWQtPnNlcVBhcmFtc1swXS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSA7Ci0gICAgRnJhbWVIZWlnaHRJbk1icyA9ICgyIC0gZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWcpICogUGljSGVpZ2h0SW5NYXBVbml0cyA7Ci0KLSAgICBzZXFJbmZvLT5GcmFtZVdpZHRoID0gUGljV2lkdGhJbk1icyA8PCA0OwotICAgIHNlcUluZm8tPkZyYW1lSGVpZ2h0ID0gRnJhbWVIZWlnaHRJbk1icyA8PCA0OwotCi0gICAgc2VxSW5mby0+ZnJhbWVfb25seV9mbGFnID0gZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWc7Ci0KLSAgICBpZiAoZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCi0gICAgewotICAgICAgICBzZXFJbmZvLT5mcmFtZV9jcm9wX2xlZnQgPSAyICogZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQ7Ci0gICAgICAgIHNlcUluZm8tPmZyYW1lX2Nyb3BfcmlnaHQgPSBzZXFJbmZvLT5GcmFtZVdpZHRoIC0gKDIgKiBkZWN2aWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgKyAxKTsKLQotICAgICAgICBpZiAoc2VxSW5mby0+ZnJhbWVfb25seV9mbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXFJbmZvLT5mcmFtZV9jcm9wX3RvcCA9IDIgKiBkZWN2aWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OwotICAgICAgICAgICAgc2VxSW5mby0+ZnJhbWVfY3JvcF9ib3R0b20gPSBzZXFJbmZvLT5GcmFtZUhlaWdodCAtICgyICogZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCArIDEpOwotICAgICAgICAgICAgLyogTm90ZSBpbiA3LjQuMi4xLCB0aGVyZSBpcyBhIGNvbnRyYWludCBvbiB0aGUgdmFsdWUgb2YgZnJhbWVfY3JvcF9sZWZ0IGFuZCBmcmFtZV9jcm9wX3RvcAotICAgICAgICAgICAgc3VjaCB0aGF0IHRoZXkgaGF2ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZnJhbWVfY3JvcF9yaWdodC8yIGFuZCBmcmFtZV9jcm9wX2JvdHRvbS8yLCByZXNwZWN0aXZlbHkuICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXFJbmZvLT5mcmFtZV9jcm9wX3RvcCA9IDQgKiBkZWN2aWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OwotICAgICAgICAgICAgc2VxSW5mby0+ZnJhbWVfY3JvcF9ib3R0b20gPSBzZXFJbmZvLT5GcmFtZUhlaWdodCAtICg0ICogZGVjdmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCArIDEpOwotICAgICAgICAgICAgLyogTm90ZSBpbiA3LjQuMi4xLCB0aGVyZSBpcyBhIGNvbnRyYWludCBvbiB0aGUgdmFsdWUgb2YgZnJhbWVfY3JvcF9sZWZ0IGFuZCBmcmFtZV9jcm9wX3RvcAotICAgICAgICAgICAgc3VjaCB0aGF0IHRoZXkgaGF2ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZnJhbWVfY3JvcF9yaWdodC8yIGFuZCBmcmFtZV9jcm9wX2JvdHRvbS80LCByZXNwZWN0aXZlbHkuICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgLyogbm8gY3JvcHBpbmcgZmxhZywganVzdCBnaXZlIHRoZSBmaXJzdCBhbmQgbGFzdCBwaXhlbCAqLwotICAgIHsKLSAgICAgICAgc2VxSW5mby0+ZnJhbWVfY3JvcF9ib3R0b20gPSBzZXFJbmZvLT5GcmFtZUhlaWdodCAtIDE7Ci0gICAgICAgIHNlcUluZm8tPmZyYW1lX2Nyb3BfcmlnaHQgPSBzZXFJbmZvLT5GcmFtZVdpZHRoIC0gMTsKLSAgICAgICAgc2VxSW5mby0+ZnJhbWVfY3JvcF90b3AgPSBzZXFJbmZvLT5mcmFtZV9jcm9wX2xlZnQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkFWQ0RlY1BpY1BhcmFtU2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogSW5pdGlhbGl6ZSBwaWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICBjcmVhdGUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyoqCi1TaW5jZSBQUFMgZG9lc24ndCBjb250YWluIG11Y2ggZGF0YSwgbW9zdCBvZiB0aGUgcGljdHVyZSBpbml0aWFsaXphdGlvbiB3aWxsCi1iZSBkb25lIGFmdGVyIGRlY29kaW5nIHRoZSBzbGljZSBoZWFkZXIgaW4gUFZBVkNEZWNvZGVTbGljZS4gKi8KLU9TQ0xfRVhQT1JUX1JFRiBBVkNEZWNfU3RhdHVzICAgUFZBVkNEZWNQaWNQYXJhbVNldChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDggKm5hbF91bml0LAotICAgICAgICBpbnQgbmFsX3NpemUpCi17Ci0gICAgQVZDRGVjX1N0YXR1cyBzdGF0dXM7Ci0gICAgQVZDRGVjT2JqZWN0ICpkZWN2aWQgPSAoQVZDRGVjT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7Ci0gICAgQVZDQ29tbW9uT2JqICp2aWRlbzsKLSAgICBBVkNEZWNCaXRzdHJlYW0gKmJpdHN0cmVhbTsKLQotICAgIGlmIChkZWN2aWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICB2aWRlbyA9IGRlY3ZpZC0+Y29tbW9uOwotICAgIGJpdHN0cmVhbSA9IGRlY3ZpZC0+Yml0c3RyZWFtOwotICAgIC8qIDEuIENvbnZlcnQgRUJTUCB0byBSQlNQLiBDcmVhdGUgYml0c3RyZWFtIHN0cnVjdHVyZSAqLwotICAgIHZpZGVvLT5mb3JiaWRkZW5fYml0ID0gbmFsX3VuaXRbMF0gPj4gNzsKLSAgICB2aWRlby0+bmFsX3JlZl9pZGMgPSAobmFsX3VuaXRbMF0gJiAweDYwKSA+PiA1OwotICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gKEFWQ05hbFVuaXRUeXBlKShuYWxfdW5pdFswXSAmIDB4MUYpOwotCi0gICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlICE9IEFWQ19OQUxUWVBFX1BQUykgLyogbm90IGEgUFBTIE5BTCAqLwotICAgIHsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgIH0KLQotCi0gICAgLyogMi4gSW5pdGlhbGl6ZSBiaXRzdHJlYW0gc3RydWN0dXJlKi8KLSAgICBCaXRzdHJlYW1Jbml0KGJpdHN0cmVhbSwgbmFsX3VuaXQgKyAxLCBuYWxfc2l6ZSAtIDEpOwotCi0gICAgLyogMi4gRGVjb2RlIHBpY19wYXJhbWV0ZXJfc2V0X3Jic3Agc3ludGF4LiBBbGxvY2F0ZSB2aWRlby0+cGljUGFyYW1zW2ldIGFuZCBhc3NpZ24gdG8gY3VyclBpY1BhcmFtcyAqLwotICAgIHN0YXR1cyA9IERlY29kZVBQUyhkZWN2aWQsIHZpZGVvLCBiaXRzdHJlYW0pOwotICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZSA9IHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgKyAxIDsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotT1NDTF9FWFBPUlRfUkVGIEFWQ0RlY19TdGF0dXMgICBQVkFWQ0RlY1NFSShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDggKm5hbF91bml0LAotICAgICAgICBpbnQgbmFsX3NpemUpCi17Ci0gICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7Ci0gICAgT1NDTF9VTlVTRURfQVJHKG5hbF91bml0KTsKLSAgICBPU0NMX1VOVVNFRF9BUkcobmFsX3NpemUpOwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkFWQ0RlY29kZVNsaWNlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIG9uZSBOQUwgdW5pdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFNlZSBlbnVtIEFWQ0RlY19TdGF0dXMgZm9yIHJldHVybiB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiBBVkNEZWNfU3RhdHVzIFBWQVZDRGVjb2RlU2xpY2UoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpidWZmZXIsCi0gICAgICAgIGludCBidWZfc2l6ZSkKLXsKLSAgICBBVkNEZWNPYmplY3QgKmRlY3ZpZCA9IChBVkNEZWNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKLSAgICBBVkNDb21tb25PYmogKnZpZGVvOwotICAgIEFWQ0RlY0JpdHN0cmVhbSAqYml0c3RyZWFtOwotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotCi0gICAgaWYgKGRlY3ZpZCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgIH0KLQotICAgIHZpZGVvID0gZGVjdmlkLT5jb21tb247Ci0gICAgYml0c3RyZWFtID0gZGVjdmlkLT5iaXRzdHJlYW07Ci0KLSAgICBpZiAodmlkZW8tPm1lbV9tZ3JfY3RybF9lcV81KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19QSUNUVVJFX09VVFBVVF9SRUFEWTsgICAgICAvLyB0byBmbHVzaG91dCBmcmFtZSBidWZmZXJzCi0gICAgfQotCi0gICAgaWYgKHZpZGVvLT5uZXdTbGljZSkKLSAgICB7Ci0gICAgICAgIC8qIDIuIENoZWNrIE5BTCB0eXBlICAqLwotICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+cHJldl9uYWxfdW5pdF90eXBlID0gdmlkZW8tPm5hbF91bml0X3R5cGU7Ci0gICAgICAgIHZpZGVvLT5mb3JiaWRkZW5fYml0ID0gYnVmZmVyWzBdID4+IDc7Ci0gICAgICAgIHZpZGVvLT5uYWxfcmVmX2lkYyA9IChidWZmZXJbMF0gJiAweDYwKSA+PiA1OwotICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IChBVkNOYWxVbml0VHlwZSkoYnVmZmVyWzBdICYgMHgxRik7Ci0KLQotICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfQVVEKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgIT0gQVZDX05BTFRZUEVfU0xJQ0UgJiYKLSAgICAgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSAhPSBBVkNfTkFMVFlQRV9JRFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogbm90IHN1cHBvcnRlZCAqLwotICAgICAgICB9Ci0KLQotCi0gICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA+PSAyICYmIHZpZGVvLT5uYWxfdW5pdF90eXBlIDw9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogbm90IHN1cHBvcnRlZCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnNsaWNlX2RhdGFfcGFydGl0aW9uaW5nID0gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlby0+bmV3U2xpY2UgPSBGQUxTRTsKLSAgICAgICAgLyogIEluaXRpYWxpemUgYml0c3RyZWFtIHN0cnVjdHVyZSovCi0gICAgICAgIEJpdHN0cmVhbUluaXQoYml0c3RyZWFtLCBidWZmZXIgKyAxLCBidWZfc2l6ZSAtIDEpOwotCi0KLSAgICAgICAgLyogMi4xIERlY29kZSBTbGljZSBIZWFkZXIgKHNlcGFyYXRlIGZ1bmN0aW9uKSovCi0gICAgICAgIHN0YXR1cyA9IERlY29kZVNsaWNlSGVhZGVyKGRlY3ZpZCwgdmlkZW8sIGJpdHN0cmVhbSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5uZXdTbGljZSA9IFRSVUU7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtICE9IHZpZGVvLT5wcmV2RnJhbWVOdW0gfHwgKHZpZGVvLT5zbGljZUhkci0+Zmlyc3RfbWJfaW5fc2xpY2UgPCAodWludCl2aWRlby0+bWJOdW0gJiYgdmlkZW8tPmN1cnJTZXFQYXJhbXMtPmNvbnN0cmFpbmVkX3NldDFfZmxhZyA9PSAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPm5ld1BpYyA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPm51bU1CcyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ29uY2VhbCBtaXNzaW5nIE1CcyBvZiBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUKLSAgICAgICAgICAgICAgICBDb25jZWFsU2xpY2UoZGVjdmlkLCB2aWRlby0+UGljU2l6ZUluTWJzIC0gdmlkZW8tPm51bU1CcywgdmlkZW8tPlBpY1NpemVJbk1icyk7ICAvLyBDb25jZWFsCi0gICAgICAgICAgICAgICAgdmlkZW8tPm51bU1CcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgRGVibG9ja1BpY3R1cmUodmlkZW8pOyAgIC8vIE5vIG5lZWQgdG8gZGVibG9jawotCi0gICAgICAgICAgICAgICAgLyogMy4yIERlY29kZWQgZnJhbWUgcmVmZXJlbmNlIG1hcmtpbmcuICovCi0gICAgICAgICAgICAgICAgLyogMy4zIFB1dCB0aGUgZGVjb2RlZCBwaWN0dXJlIGluIG91dHB1dCBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgLyogc2V0IHZpZGVvLT5tZW1fbWdlX2N0cmxfZXFfNSAqLwotICAgICAgICAgICAgICAgIEFWQ05hbFVuaXRUeXBlIHRlbXAgPSB2aWRlby0+bmFsX3VuaXRfdHlwZTsKLSAgICAgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IHZpZGVvLT5wcmV2X25hbF91bml0X3R5cGU7Ci0gICAgICAgICAgICAgICAgU3RvcmVQaWN0dXJlSW5EUEIoYXZjSGFuZGxlLCB2aWRlbyk7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHZpZGVvLT5tYk51bSA9IDA7IC8vIE1DX0NvbmNlYWwKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX1BJQ1RVUkVfT1VUUFVUX1JFQURZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICB2aWRlby0+UHJldlJlZkZyYW1lTnVtID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmlkZW8tPmN1cnJTZXFQYXJhbXMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZykKLSAgICAgICAgeyAgIC8qIG5vIGdhcHMgYWxsb3dlZCwgZnJhbWVfbnVtIGhhcyB0byBpbmNyZWFzZSBieSBvbmUgb25seSAqLwotICAgICAgICAgICAgLyogICAgICAgICAgaWYoc2xpY2VIZHItPmZyYW1lX251bSAhPSAodmlkZW8tPlByZXZSZWZGcmFtZU51bSArIDEpJXZpZGVvLT5NYXhGcmFtZU51bSkgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bSAhPSB2aWRlby0+UHJldlJlZkZyYW1lTnVtICYmIHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtICE9ICh2aWRlby0+UHJldlJlZkZyYW1lTnVtICsgMSkgJSB2aWRlby0+TWF4RnJhbWVOdW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ29uY2VhbCBtaXNzaW5nIE1CcyBvZiBwcmV2aW91c2x5IGRlY29kZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB2aWRlby0+bnVtTUJzID0gMDsKLSAgICAgICAgICAgICAgICB2aWRlby0+bmV3UGljID0gVFJVRTsKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtKys7IC8vIEZJWAotICAgICAgICAgICAgICAgIHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0rKzsKLSAgICAgICAgICAgICAgICBBVkNOYWxVbml0VHlwZSB0ZW1wID0gdmlkZW8tPm5hbF91bml0X3R5cGU7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9TTElDRTsgLy92aWRlby0+cHJldl9uYWxfdW5pdF90eXBlOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IChBVkNEZWNfU3RhdHVzKURQQkluaXRCdWZmZXIoYXZjSGFuZGxlLCB2aWRlbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyRlMtPklzT3V0cHV0dGVkID0gMHgwMTsKLSAgICAgICAgICAgICAgICB2aWRlby0+Y3VyckZTLT5Jc1JlZmVyZW5jZSA9IDM7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJGUy0+SXNMb25nVGVybSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBEZWNvZGVQT0ModmlkZW8pOwotICAgICAgICAgICAgICAgIC8qIGZpbmQgYW4gZW1wdHkgbWVtb3J5IGZyb20gRFBCIGFuZCBhc3NpZ25lZCB0byBjdXJyUGljICovCi0gICAgICAgICAgICAgICAgRFBCSW5pdFBpYyh2aWRlbywgdmlkZW8tPlByZXZSZWZGcmFtZU51bSAlIHZpZGVvLT5NYXhGcmFtZU51bSk7Ci0gICAgICAgICAgICAgICAgUmVmTGlzdEluaXQodmlkZW8pOwotICAgICAgICAgICAgICAgIENvbmNlYWxTbGljZShkZWN2aWQsIDAsIHZpZGVvLT5QaWNTaXplSW5NYnMpOyAgLy8gQ29uY2VhbAotICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyRlMtPklzT3V0cHV0dGVkIHw9IDB4MDI7Ci0gICAgICAgICAgICAgICAgLy9jb25jZWFsIGZyYW1lCi0gICAgICAgICAgICAgICAgLyogMy4yIERlY29kZWQgZnJhbWUgcmVmZXJlbmNlIG1hcmtpbmcuICovCi0gICAgICAgICAgICAgICAgLyogMy4zIFB1dCB0aGUgZGVjb2RlZCBwaWN0dXJlIGluIG91dHB1dCBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgLyogc2V0IHZpZGVvLT5tZW1fbWdlX2N0cmxfZXFfNSAqLwotICAgICAgICAgICAgICAgIHZpZGVvLT5tYk51bSA9IDA7IC8vIENvbmNlYWwKLSAgICAgICAgICAgICAgICBTdG9yZVBpY3R1cmVJbkRQQihhdmNIYW5kbGUsIHZpZGVvKTsKLSAgICAgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX1BJQ1RVUkVfT1VUUFVUX1JFQURZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZpZGVvLT5uZXdQaWMgPT0gVFJVRSkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IChBVkNEZWNfU3RhdHVzKURQQkluaXRCdWZmZXIoYXZjSGFuZGxlLCB2aWRlbyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aWRlby0+bmV3U2xpY2UgPSBUUlVFOwotCi0gICAgLyogZnVuY3Rpb24gcG9pbnRlciBzZXR0aW5nIGF0IHNsaWNlLWxldmVsICovCi0gICAgLy8gT1BUSU1JWkUKLSAgICBkZWN2aWQtPnJlc2lkdWFsX2Jsb2NrID0gJnJlc2lkdWFsX2Jsb2NrX2NhdmxjOwotCi0gICAgLyogZGVyaXZlIHBpY3R1cmUgb3JkZXIgY291bnQgKi8KLSAgICBpZiAodmlkZW8tPm5ld1BpYyA9PSBUUlVFKQotICAgIHsKLSAgICAgICAgdmlkZW8tPm51bU1CcyA9IHZpZGVvLT5QaWNTaXplSW5NYnM7Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlICE9IEFWQ19OQUxUWVBFX0lEUiAmJiB2aWRlby0+Y3VyclNlcVBhcmFtcy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0gIT0gKHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gKyAxKSAlIHZpZGVvLT5NYXhGcmFtZU51bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmaWxsX2ZyYW1lX251bV9nYXAoYXZjSGFuZGxlLCB2aWRlbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5udW1NQnMgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IChBVkNEZWNfU3RhdHVzKURQQkluaXRCdWZmZXIoYXZjSGFuZGxlLCB2aWRlbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5udW1NQnMgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogaWYgdGhlcmUncyBnYXAgaW4gdGhlIGZyYW1lX251bSwgd2UgaGF2ZSB0byBmaWxsIGluIHRoZSBnYXAgd2l0aAotICAgICAgICAgICAgaW1hZ2luYXJ5IGZyYW1lcyB0aGF0IHdvbid0IGdldCB1c2VkIGZvciBzaG9ydC10ZXJtIHJlZi4gKi8KLSAgICAgICAgLyogc2VlIGZpbGxfZnJhbWVfbnVtX2dhcCgpIGluIEpNICovCi0KLQotICAgICAgICBEZWNvZGVQT0ModmlkZW8pOwotICAgICAgICAvKiBmaW5kIGFuIGVtcHR5IG1lbW9yeSBmcm9tIERQQiBhbmQgYXNzaWduZWQgdG8gY3VyclBpYyAqLwotICAgICAgICBEUEJJbml0UGljKHZpZGVvLCB2aWRlby0+Q3VyclBpY051bSk7Ci0KLSAgICAgICAgdmlkZW8tPmN1cnJQaWMtPmlzUmVmZXJlbmNlID0gVFJVRTsgIC8vIEZJWAotCi0gICAgICAgIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPmN1cnJQaWMtPmlzUmVmZXJlbmNlID0gRkFMU0U7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyckZTLT5Jc091dHB1dHRlZCB8PSAweDAyOyAgICAgLyogVGhlIE1BU0sgMHgwMiBtZWFucyBub3QgbmVlZGVkIGZvciByZWZlcmVuY2UsIG9yIHJldHVybmVkICovCi0gICAgICAgICAgICAvKiBub2RlIG5lZWQgdG8gY2hlY2sgZm9yIGZyZWVpbmcgb2YgdGhpcyBidWZmZXIgKi8KLSAgICAgICAgfQotCi0gICAgICAgIEZNT0luaXQodmlkZW8pOwotCi0gICAgICAgIGlmICh2aWRlby0+Y3VyclBpYy0+aXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtOwotICAgIH0KLQotICAgIHZpZGVvLT5uZXdQaWMgPSBGQUxTRTsKLQotCi0gICAgLyogSW5pdGlhbGl6ZSByZWZMaXN0SWR4IGZvciB0aGlzIHBpY3R1cmUgKi8KLSAgICBSZWZMaXN0SW5pdCh2aWRlbyk7Ci0KLSAgICAvKiBSZS1vcmRlciB0aGUgcmVmZXJlbmNlIGxpc3QgYWNjb3JkaW5nIHRvIHRoZSByZWZfcGljX2xpc3RfcmVvcmRlcmluZygpICovCi0gICAgc3RhdHVzID0gKEFWQ0RlY19TdGF0dXMpUmVPcmRlckxpc3QodmlkZW8pOwotICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogMi4yIERlY29kZSBTbGljZS4gKi8KLSAgICBzdGF0dXMgPSAoQVZDRGVjX1N0YXR1cylEZWNvZGVTbGljZShkZWN2aWQpOwotCi0gICAgdmlkZW8tPnNsaWNlX2lkKys7ICAvLyAgc2xpY2UKLQotICAgIGlmIChzdGF0dXMgPT0gQVZDREVDX1BJQ1RVUkVfUkVBRFkpCi0gICAgewotICAgICAgICAvKiAzLiBDaGVjayBjb21wbGV0ZSBwaWN0dXJlICovCi0jaWZuZGVmIE1CX0JBU0VEX0RFQkxPQ0sKLSAgICAgICAgLyogMy4xIERlYmxvY2sgKi8KLSAgICAgICAgRGVibG9ja1BpY3R1cmUodmlkZW8pOwotI2VuZGlmCi0gICAgICAgIC8qIDMuMiBEZWNvZGVkIGZyYW1lIHJlZmVyZW5jZSBtYXJraW5nLiAqLwotICAgICAgICAvKiAzLjMgUHV0IHRoZSBkZWNvZGVkIHBpY3R1cmUgaW4gb3V0cHV0IGJ1ZmZlcnMgKi8KLSAgICAgICAgLyogc2V0IHZpZGVvLT5tZW1fbWdlX2N0cmxfZXFfNSAqLwotICAgICAgICBzdGF0dXMgPSAoQVZDRGVjX1N0YXR1cylTdG9yZVBpY3R1cmVJbkRQQihhdmNIYW5kbGUsIHZpZGVvKTsgICAgICAgICAgLy8gQ0hFQ0sgY2hlY2sgdGhlIHJldHVuciBzdGF0dXMKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPlByZXZSZWZGcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gMDsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOwotICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250OwotICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiID0gdmlkZW8tPlBpY09yZGVyQ250TXNiOwotICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IHZpZGVvLT5zbGljZUhkci0+cGljX29yZGVyX2NudF9sc2I7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPkZyYW1lTnVtT2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19QSUNUVVJFX1JFQURZOwotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQVZDRGVjR2V0T3V0cHV0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvMy8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgdGhlIG5leHQgcGljdHVyZSBhY2NvcmRpbmcgdG8gUGljT3JkZXJDbnQuICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQVZDRnJhbWVJTyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQVZDRGVjX1N0YXR1cyBQVkFWQ0RlY0dldE91dHB1dChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50ICppbmR4LCBpbnQgKnJlbGVhc2UsIEFWQ0ZyYW1lSU8gKm91dHB1dCkKLXsKLSAgICBBVkNEZWNPYmplY3QgKmRlY3ZpZCA9IChBVkNEZWNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKLSAgICBBVkNDb21tb25PYmogKnZpZGVvOwotICAgIEFWQ0RlY1BpY0J1ZmZlciAqZHBiOwotICAgIEFWQ0ZyYW1lU3RvcmUgKm9sZGVzdEZyYW1lID0gTlVMTDsKLSAgICBpbnQgaSwgZmlyc3QgPSAxOwotICAgIGludCBjb3VudF9mcmFtZSA9IDA7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBpbnQgbWluX3BvYyA9IDA7Ci0KLSAgICBpZiAoZGVjdmlkID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgdmlkZW8gPSBkZWN2aWQtPmNvbW1vbjsKLSAgICBkcGIgPSB2aWRlby0+ZGVjUGljQnVmOwotCi0gICAgaWYgKGRwYi0+bnVtX2ZzID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIGZvciB0aGUgb2xkZXN0IGZyYW1lX251bSBpbiBkcGIgKi8KLSAgICAvKiBleHRlbnNpb24gdG8gZmllbGQgZGVjb2RpbmcsIHdlIGhhdmUgdG8gc2VhcmNoIGZvciBldmVyeSB0b3BfZmllbGQvYm90dG9tX2ZpZWxkIHdpdGhpbgotICAgIGVhY2ggZnJhbWUgaW4gdGhlIGRwYi4gVGhpcyBjb2RlIG9ubHkgd29ya3MgZm9yIGZyYW1lIGJhc2VkLiovCi0KLSAgICBpZiAodmlkZW8tPm1lbV9tZ3JfY3RybF9lcV81ID09IEZBTFNFKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtX2ZzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoZHBiLT5mc1tpXS0+SXNPdXRwdXR0ZWQgJiAweDAxKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X2ZyYW1lKys7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWluX3BvYyA9IGRwYi0+ZnNbaV0tPlBpY09yZGVyQ250OwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG9sZGVzdEZyYW1lID0gZHBiLT5mc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZHBiLT5mc1tpXS0+UGljT3JkZXJDbnQgPCBtaW5fcG9jKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWluX3BvYyA9IGRwYi0+ZnNbaV0tPlBpY09yZGVyQ250OwotICAgICAgICAgICAgICAgICAgICBvbGRlc3RGcmFtZSA9IGRwYi0+ZnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtX2ZzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoZHBiLT5mc1tpXS0+SXNPdXRwdXR0ZWQgJiAweDAxKSA9PSAwICYmIGRwYi0+ZnNbaV0gIT0gdmlkZW8tPmN1cnJGUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9mcmFtZSsrOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1pbl9wb2MgPSBkcGItPmZzW2ldLT5QaWNPcmRlckNudDsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgICAgICAgICBvbGRlc3RGcmFtZSA9IGRwYi0+ZnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRwYi0+ZnNbaV0tPlBpY09yZGVyQ250IDwgbWluX3BvYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1pbl9wb2MgPSBkcGItPmZzW2ldLT5QaWNPcmRlckNudDsKLSAgICAgICAgICAgICAgICAgICAgb2xkZXN0RnJhbWUgPSBkcGItPmZzW2ldOwotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvdW50X2ZyYW1lIDwgMiAmJiB2aWRlby0+bmFsX3VuaXRfdHlwZSAhPSBBVkNfTkFMVFlQRV9JRFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSA9IEZBTFNFOyAgLy8gRklYCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY291bnRfZnJhbWUgPCAxICYmIHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtX2ZzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRwYi0+ZnNbaV0gPT0gdmlkZW8tPmN1cnJGUyAmJiAoZHBiLT5mc1tpXS0+SXNPdXRwdXR0ZWQgJiAweDAxKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkZXN0RnJhbWUgPSBkcGItPmZzW2ldOwotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG9sZGVzdEZyYW1lID09IE5VTEwpCi0gICAgewotCi0gICAgICAgIC8qICAgICAgQ2hlY2sgZm9yIE1lbV9tZ210X29wZXJhdGlvbl81IGJhc2VkIGZvcmNlZCBvdXRwdXQgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtX2ZzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIHRoZSBvbmUgbm90IHVzZWQgb3Igbm90IHJlZmVyZW5jZSBhbmQgaGFzIGJlZW4gb3V0cHV0dGVkICovCi0gICAgICAgICAgICBpZiAoZHBiLT5mc1tpXS0+SXNSZWZlcmVuY2UgPT0gMCAmJiBkcGItPmZzW2ldLT5Jc091dHB1dHRlZCA9PSAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpIDwgZHBiLT5udW1fZnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHRoZXJlIGFyZSBmcmFtZXMgYXZhaWxhYmxlIGZvciBkZWNvZGluZyAqLwotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOyAvKiBubyBmcmFtZSB0byBiZSBvdXRwdXR0ZWQgKi8KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyogbm8gZnJlZSBmcmFtZSBhdmFpbGFibGUsIHdlIGhhdmUgdG8gcmVsZWFzZSBvbmUgdG8gY29udGludWUgZGVjb2RpbmcgKi8KLSAgICAgICAgaW50IE1pbklkeCA9IDA7Ci0gICAgICAgIGludDMyIE1pbkZyYW1lTnVtV3JhcCA9IDB4N0ZGRkZGRkY7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtX2ZzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkcGItPmZzW2ldLT5Jc1JlZmVyZW5jZSAmJiAhZHBiLT5mc1tpXS0+SXNMb25nVGVybSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZHBiLT5mc1tpXS0+RnJhbWVOdW1XcmFwIDwgTWluRnJhbWVOdW1XcmFwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWluRnJhbWVOdW1XcmFwID0gZHBiLT5mc1tpXS0+RnJhbWVOdW1XcmFwOwotICAgICAgICAgICAgICAgICAgICBNaW5JZHggPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBtYXJrIHRoZSBmcmFtZSB3aXRoIHNtYWxsZXN0IFBpY09yZGVyQ250IHRvIGJlIHVudXNlZCBmb3IgcmVmZXJlbmNlICovCi0gICAgICAgIGRwYi0+ZnNbTWluSWR4XS0+SXNSZWZlcmVuY2UgPSAwOwotICAgICAgICBkcGItPmZzW01pbklkeF0tPklzTG9uZ1Rlcm0gPSAwOwotICAgICAgICBkcGItPmZzW01pbklkeF0tPmZyYW1lLmlzUmVmZXJlbmNlID0gRkFMU0U7Ci0gICAgICAgIGRwYi0+ZnNbTWluSWR4XS0+ZnJhbWUuaXNMb25nVGVybSA9IEZBTFNFOwotICAgICAgICBkcGItPmZzW01pbklkeF0tPklzT3V0cHV0dGVkIHw9IDB4MDI7Ci0jaWZkZWYgUFZfTUVNT1JZX1BPT0wKLSAgICAgICAgaWYgKGRwYi0+ZnNbTWluSWR4XS0+SXNPdXRwdXR0ZWQgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmFtZVVuYmluZChhdmNIYW5kbGUtPnVzZXJEYXRhLCBNaW5JZHgpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgIH0KLSAgICAvKiBNQVNLIDB4MDEgbWVhbnMgdGhlIGZyYW1lIGlzIG91dHB1dHRlZCAoZm9yIGRpc3BsYXkpLiBBIGZyYW1lIGdldHMgZnJlZWQgd2hlbiBpdCBpcwotICAgIG91dHB1dHRlZCAoMHgwMSkgYW5kIG5vdCBuZWVkZWQgZm9yIHJlZmVyZW5jZSAoMHgwMikgICAqLwotICAgIG9sZGVzdEZyYW1lLT5Jc091dHB1dHRlZCB8PSAweDAxOwotCi0gICAgaWYgKG9sZGVzdEZyYW1lLT5Jc091dHB1dHRlZCA9PSAzKQotICAgIHsKLSAgICAgICAgKnJlbGVhc2UgPSAxOyAvKiBmbGFnIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcmVsZWFzZSA9IDA7Ci0gICAgfQotICAgIC8qIGRvIG5vdCByZWxlYXNlIGJ1ZmZlciBoZXJlLCByZWxlYXNlIGl0IGFmdGVyIGl0IGlzIHNlbnQgdG8gdGhlIHNpbmsgbm9kZSAqLwotCi0gICAgb3V0cHV0LT5ZQ2JDclswXSA9IG9sZGVzdEZyYW1lLT5mcmFtZS5TbDsKLSAgICBvdXRwdXQtPllDYkNyWzFdID0gb2xkZXN0RnJhbWUtPmZyYW1lLlNjYjsKLSAgICBvdXRwdXQtPllDYkNyWzJdID0gb2xkZXN0RnJhbWUtPmZyYW1lLlNjcjsKLSAgICBvdXRwdXQtPmhlaWdodCA9IG9sZGVzdEZyYW1lLT5mcmFtZS5oZWlnaHQ7Ci0gICAgb3V0cHV0LT5waXRjaCA9IG9sZGVzdEZyYW1lLT5mcmFtZS53aWR0aDsKLSAgICBvdXRwdXQtPmRpc3Bfb3JkZXIgPSBvbGRlc3RGcmFtZS0+UGljT3JkZXJDbnQ7Ci0gICAgb3V0cHV0LT5jb2Rpbmdfb3JkZXIgPSBvbGRlc3RGcmFtZS0+RnJhbWVOdW07Ci0gICAgb3V0cHV0LT5pZCA9ICh1aW50MzIpIG9sZGVzdEZyYW1lLT5iYXNlX2RwYjsgLyogdXNlIHRoZSBwb2ludGVyIGFzIHRoZSBpZCAqLwotICAgICppbmR4ID0gaW5kZXg7Ci0KLQotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZBVkNEZWNSZXNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwMy8wNC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFJlc2V0IGRlY29kZXIsIHByZXBhcmUgaXQgZm9yIGEgbmV3IElEUiBmcmFtZS4gICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgdm9pZCAgICBQVkFWQ0RlY1Jlc2V0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQotewotICAgIEFWQ0RlY09iamVjdCAqZGVjdmlkID0gKEFWQ0RlY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OwotICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87Ci0gICAgQVZDRGVjUGljQnVmZmVyICpkcGI7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoZGVjdmlkID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmlkZW8gPSBkZWN2aWQtPmNvbW1vbjsKLSAgICBkcGIgPSB2aWRlby0+ZGVjUGljQnVmOwotCi0gICAgLyogcmVzZXQgdGhlIERQQiAqLwotCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1fZnM7IGkrKykKLSAgICB7Ci0gICAgICAgIGRwYi0+ZnNbaV0tPklzTG9uZ1Rlcm0gPSAwOwotICAgICAgICBkcGItPmZzW2ldLT5Jc1JlZmVyZW5jZSA9IDA7Ci0gICAgICAgIGRwYi0+ZnNbaV0tPklzT3V0cHV0dGVkID0gMzsKLSAgICAgICAgZHBiLT5mc1tpXS0+ZnJhbWUuaXNSZWZlcmVuY2UgPSAwOwotICAgICAgICBkcGItPmZzW2ldLT5mcmFtZS5pc0xvbmdUZXJtID0gMDsKLSAgICB9Ci0KLSAgICB2aWRlby0+bWVtX21ncl9jdHJsX2VxXzUgPSBGQUxTRTsKLSAgICB2aWRlby0+bmV3UGljID0gVFJVRTsKLSAgICB2aWRlby0+bmV3U2xpY2UgPSBUUlVFOwotICAgIHZpZGVvLT5jdXJyUGljID0gTlVMTDsKLSAgICB2aWRlby0+Y3VyckZTID0gTlVMTDsKLSAgICB2aWRlby0+cHJldlJlZlBpYyA9IE5VTEw7Ci0gICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IDA7Ci0gICAgdmlkZW8tPlByZXZSZWZGcmFtZU51bSA9IDA7Ci0gICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICB2aWRlby0+bWJOdW0gPSAwOwotICAgIHZpZGVvLT5udW1NQnMgPSAwOwotCi0gICAgcmV0dXJuIDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWQVZDQ2xlYW5VcERlY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBDbGVhbiB1cCB0aGUgZGVjb2RlciwgZnJlZSBhbGwgbWVtb3JpZXMgYWxsb2NhdGVkLiAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgdm9pZCBQVkFWQ0NsZWFuVXBEZWNvZGVyKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQotewotICAgIEFWQ0RlY09iamVjdCAqZGVjdmlkID0gKEFWQ0RlY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OwotICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87Ci0gICAgdm9pZCAqdXNlckRhdGEgPSBhdmNIYW5kbGUtPnVzZXJEYXRhOwotICAgIGludCBpOwotCi0gICAgREVCVUdfTE9HKHVzZXJEYXRhLCBBVkNfTE9HVFlQRV9JTkZPLCAiUFZBVkNDbGVhblVwRGVjb2RlciIsIC0xLCAtMSk7Ci0KLSAgICBpZiAoZGVjdmlkICE9IE5VTEwpCi0gICAgewotICAgICAgICB2aWRlbyA9IGRlY3ZpZC0+Y29tbW9uOwotICAgICAgICBpZiAodmlkZW8gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXApOwotICAgICAgICAgICAgfQotCi0jaWZkZWYgTUJfQkFTRURfREVCTE9DSwotICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYV9wcmVkX3RvcCAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+aW50cmFfcHJlZF90b3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYV9wcmVkX3RvcF9jYiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+aW50cmFfcHJlZF90b3BfY2IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYV9wcmVkX3RvcF9jciAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+aW50cmFfcHJlZF90b3BfY3IpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9jayAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+bWJsb2NrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDbGVhblVwRFBCKGF2Y0hhbmRsZSwgdmlkZW8pOwotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+ZGVjUGljQnVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZpZGVvLT5zbGljZUhkciAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+c2xpY2VIZHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8pOyAvKiBsYXN0IHRoaW5nIHRvIGRvICovCi0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlY3ZpZC0+cGljUGFyYW1zW2ldICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY3ZpZC0+cGljUGFyYW1zW2ldLT5zbGljZV9ncm91cF9pZCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWRlY3ZpZC0+cGljUGFyYW1zW2ldLT5zbGljZV9ncm91cF9pZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClkZWN2aWQtPnBpY1BhcmFtc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWN2aWQtPnNlcVBhcmFtc1tpXSAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClkZWN2aWQtPnNlcVBhcmFtc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlY3ZpZC0+Yml0c3RyZWFtICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClkZWN2aWQtPmJpdHN0cmVhbSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClkZWN2aWQpOwotICAgIH0KLQotCi0gICAgcmV0dXJuIDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNkZWNfYml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvYXZjZGVjX2JpdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFiYzU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNkZWNfYml0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotVGhpcyBmaWxlIGNvbnRhaW5zIGJpdHN0cmVhbSByZWxhdGVkIGZ1bmN0aW9ucy4KLUBwdWJsaXNoZWRBbGwKLSovCi0KLSNpZm5kZWYgX0FWQ0RFQ19CSVRTVFJFQU1fSF8KLSNkZWZpbmUgX0FWQ0RFQ19CSVRTVFJFQU1fSF8KLQotI2luY2x1ZGUgImF2Y2RlY19saWIuaCIKLQotI2RlZmluZSBXT1JEX1NJWkUgICAzMiAgLyogdGhpcyBjYW4gdmFyeSwgZGVmYXVsdCB0byAzMiBiaXQgZm9yIG5vdyAqLwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgQVZDX0dFVERBVEEoeCx5KSAgIHVzZXJEYXRhLT5BVkNfR2V0RGF0YSh4LHkpCi0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotI2RlZmluZSBCaXRzdHJlYW1GbHVzaEJpdHMoQSxCKSAgICAgeyhBKS0+Yml0Y250ICs9IChCKTsgKEEpLT5pbmNudCAtPSAoQik7IChBKS0+Y3Vycl93b3JkIDw8PSAoQik7fQotCi0gICAgQVZDRGVjX1N0YXR1cyBBVkNfQml0c3RyZWFtRmlsbENhY2hlKEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLSAgICAvKioKLSAgICBUaGlzIGZ1bmN0aW9uIHBvcHVsYXRlcyBiaXRzdHJlYW0gc3RydWN0dXJlLgotICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBiaXRzdHJlYW0gc3RydWN0dXJlLiIKLSAgICBccGFyYW0gImJ1ZmZlciIgIlBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuIgotICAgIFxwYXJhbSAic2l6ZSIgICAiU2l6ZSBvZiB0aGUgYnVmZmVyLiIKLSAgICBccGFyYW0gIm5hbF9zaXplIiAgICJTaXplIG9mIHRoZSBOQUwgdW5pdC4iCi0gICAgXHBhcmFtICJyZXNldGFsbCIgICAiRmxhZyBmb3IgcmVzZXQgZXZlcnl0aGluZy4iCi0gICAgXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIGZvciBmYWlsLiIKLSAgICAqLwotICAgIEFWQ0RlY19TdGF0dXMgQml0c3RyZWFtSW5pdChBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgdWludDggKmJ1ZmZlciwgaW50IHNpemUpOwotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiByZWFkcyBuZXh0IGFsaWduZWQgd29yZCBhbmQgcmVtb3ZlIHRoZSBlbXVsYXRpb24gcHJldmVudGlvbiBjb2RlCi0gICAgaWYgbmVjZXNzYXJ5LgotICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBiaXRzdHJlYW0gc3RydWN0dXJlLiIKLSAgICBccmV0dXJuICJOZXh0IHdvcmQuIgotICAgICovCi0gICAgdWludCBCaXRzdHJlYW1OZXh0V29yZChBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvKioKLSAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIG5CaXRzIGJpdHMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlci4KLSAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gYml0c3RyZWFtIHN0cnVjdHVyZS4iCi0gICAgXHBhcmFtICJuQml0cyIgIk51bWJlciBvZiBiaXRzIHRvIGJlIHJlYWQuIgotICAgIFxwYXJhbSAiY29kZSIgICAiUG9pbnQgdG8gdGhlIHJlYWQgdmFsdWUuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDREVDX0ZBSUwgaWYgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgICAgICAgICBpcyBncmVhdGVyIHRoYW4gdGhlIHdvcmQtc2l6ZSwgQVZDREVDX1BBQ0tFVF9MT1NTIG9yCi0gICAgICAgICAgICAgICAgQVZDREVDX05PX0RBVEEgaWYgY2FsbGJhY2sgdG8gZ2V0IGRhdGEgZmFpbHMuIgotICAgICovCi0gICAgQVZDRGVjX1N0YXR1cyBCaXRzdHJlYW1SZWFkQml0cyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IG5CaXRzLCB1aW50ICpjb2RlKTsKLQotICAgIC8qKgotICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgbkJpdHMgYml0cyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBwb2ludGVyLgotICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBiaXRzdHJlYW0gc3RydWN0dXJlLiIKLSAgICBccGFyYW0gIm5CaXRzIiAiTnVtYmVyIG9mIGJpdHMgdG8gYmUgcmVhZC4iCi0gICAgXHBhcmFtICJjb2RlIiAgICJQb2ludCB0byB0aGUgcmVhZCB2YWx1ZS4iCi0gICAgXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNERUNfRkFJTCBpZiBudW1iZXIgb2YgYml0cwotICAgICAgICAgICAgICAgICAgICBpcyBncmVhdGVyIHRoYW4gdGhlIHdvcmQtc2l6ZSwgQVZDREVDX05PX0RBVEEgaWYgaXQgbmVlZHMKLSAgICAgICAgICAgICAgICAgICAgdG8gY2FsbGJhY2sgdG8gZ2V0IGRhdGEuIgotICAgICovCi0gICAgQVZDRGVjX1N0YXR1cyBCaXRzdHJlYW1TaG93Qml0cyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IG5CaXRzLCB1aW50ICpjb2RlKTsKLQotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIG5CaXRzIGJpdHMgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gYml0c3RyZWFtIHN0cnVjdHVyZS4iCi0gICAgXHBhcmFtICJuQml0cyIgIk51bWJlciBvZiBiaXRzIHRvIGJlIHJlYWQuIgotICAgIFxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDREVDX0ZBSUwgaWYgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSB3b3JkLXNpemUgSXQgd2lsbCBub3QgY2FsbCBiYWNrIHRvIGdldAotICAgICAgICAgICAgICAgICAgIG1vcmUgZGF0YS4gVXNlcnMgc2hvdWxkIGNhbGwgQml0c3RyZWFtU2hvd0JpdHMgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgaG93IG11Y2ggdGhleSB3YW50IHRvIGZsdXNoLiIKLSAgICAqLwotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiByZWFkIDEgYml0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIuCi0gICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIGJpdHN0cmVhbSBzdHJ1Y3R1cmUuIgotICAgIFxwYXJhbSAibkJpdHMiICJOdW1iZXIgb2YgYml0cyB0byBiZSByZWFkLiIKLSAgICBccGFyYW0gImNvZGUiICAgIlBvaW50IHRvIHRoZSByZWFkIHZhbHVlLiIKLSAgICBccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0RFQ19GQUlMIGlmIG51bWJlciBvZiBiaXRzCi0gICAgICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHRoZSB3b3JkLXNpemUsIEFWQ0RFQ19QQUNLRVRfTE9TUyBvcgotICAgICAgICAgICAgICAgIEFWQ0RFQ19OT19EQVRBIGlmIGNhbGxiYWNrIHRvIGdldCBkYXRhIGZhaWxzLiIKLSAgICAqLwotICAgIEFWQ0RlY19TdGF0dXMgQml0c3RyZWFtUmVhZDFCaXQoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgKmNvZGUpOwotCi0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaXMgYnl0ZS1hbGlnbmVkIG9yIG5vdC4KLSAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUuIgotICAgIFxyZXR1cm4gIlRSVUUgaWYgYnl0ZS1hbGlnbmVkLCBGQUxTRSBvdGhlcndpc2UuIgotICAgICovCi0gICAgYm9vbCBieXRlX2FsaWduZWQoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pOwotICAgIEFWQ0RlY19TdGF0dXMgQml0c3RyZWFtQnl0ZUFsaWduKEFWQ0RlY0JpdHN0cmVhbSAgKnN0cmVhbSk7Ci0gICAgLyoqCi0gICAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgbW9yZSBSQlNQIGRhdGEgYmVmb3JlIHRoZSB0cmFpbGluZyBiaXRzLgotICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZS4iCi0gICAgXHJldHVybiAiVFJVRSBpZiB5ZXMsIEZBTFNFIG90aGVyd2lzZS4iCi0gICAgKi8KLSAgICBib29sIG1vcmVfcmJzcF9kYXRhKEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAgKi8KLQotI2VuZGlmIC8qIF9BVkNERUNfQklUU1RSRUFNX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvYXZjZGVjX2ludC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2F2Y2RlY19pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4ZjliMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvYXZjZGVjX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gdGhlIEFWQyBkZWNvZGVyIGxpYnJhcnkKLWFuZCBuZWNlc3NhcnkgdHlwZSBkZWZpdGlvbml0aW9ucyBhbmQgZW51bWVyYXRpb25zLgotTmFtaW5nIGNvbnZlbnRpb24gZm9yIHZhcmlhYmxlczoKLWxvd2VyX2Nhc2Vfd2l0aF91bmRlcl9saW5lICBpcyAgc3ludGF4IGVsZW1lbnQgaW4gc3ViY2xhdXNlIDcuMiBhbmQgNy4zCi1ub1VuZGVyTGluZSBvciBOb1VuZGVyTGluZSAgaXMgIGRlcml2ZWQgdmFyaWFibGVzIGRlZmluZWQgc29tZXdoZXJlIGVsc2UgaW4gdGhlIGRyYWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludHJvZHVjZWQgYnkgdGhpcyBkZWNvZGVyIGxpYnJhcnkuCi1AcHVibGlzaGVkQWxsCi0qLwotCi0jaWZuZGVmIF9BVkNERUNfSU5UX0hfCi0jZGVmaW5lIF9BVkNERUNfSU5UX0hfCi0KLSNpbmNsdWRlICJhdmNpbnRfY29tbW9uLmgiCi0jaW5jbHVkZSAiYXZjZGVjX2FwaS5oIgotCi0KLS8qKgotQml0c3RyZWFtIHN0cnVjdHVyZSBjb250YWlucyBiaXRzdHJlYW0gcmVsYXRlZCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIHBvaW50ZXIKLXRvIHRoZSBidWZmZXIsIHRoZSBjdXJyZW50IGJ5dGUgcG9zaXRpb24gYW5kIGJpdCBwb3NpdGlvbi4KLUBwdWJsaXNoZWRBbGwKLSovCi10eXBlZGVmIHN0cnVjdCB0YWdEZWNCaXRzdHJlYW0KLXsKLSAgICB1aW50OCAqYml0c3RyZWFtQnVmZmVyOyAvKiBwb2ludGVyIHRvIGJ1ZmZlciBtZW1vcnkgICAqLwotICAgIGludCBuYWxfc2l6ZTsgICAgICAgLyogc2l6ZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdCAqLwotICAgIGludCBkYXRhX2VuZF9wb3M7ICAvKiBiaXRzdHJlYW1CdWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotICAgIGludCByZWFkX3BvczsgICAgICAgLyogbmV4dCBwb3NpdGlvbiB0byByZWFkIGZyb20gYml0c3RyZWFtQnVmZmVyICAqLwotICAgIHVpbnQgY3Vycl93b3JkOyAvKiBieXRlLXN3YXBwZWQgKE1TQiBsZWZ0KSBjdXJyZW50IHdvcmQgcmVhZCBmcm9tIGJ1ZmZlciAqLwotICAgIGludCBiaXRfbGVmdDsgICAgICAvKiBudW1iZXIgb2YgYml0IGxlZnQgaW4gY3VycmVudF93b3JkICovCi0gICAgdWludCBuZXh0X3dvcmQ7ICAgICAvKiBpbiBjYXNlIGZvciBvbGQgZGF0YSBpbiBwcmV2aW91cyBidWZmZXIgaGFzbid0IGJlZW4gZmx1c2hlZC4gKi8KLSAgICBpbnQgaW5jbnQ7ICAvKiBiaXQgbGVmdCBpbiB0aGUgcHJldl93b3JkICovCi0gICAgaW50IGluY250X25leHQ7Ci0gICAgaW50IGJpdGNudDsKLSAgICB2b2lkICp1c2VyRGF0YTsKLX0gQVZDRGVjQml0c3RyZWFtOwotCi0vKioKLVRoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIG9iamVjdCBmb3IgQVZDIGRlY29kZXIgbGlicmFyeSBwcm92aWRpbmcgYWNjZXNzIHRvIGFsbAotZ2xvYmFsIHZhcmlhYmxlcy4gSXQgaXMgYWxsb2NhdGVkIGF0IFBWQVZDSW5pdERlY29kZXIgYW5kIGZyZWVkIGF0IFBWQVZDQ2xlYW5VcERlY29kZXIuCi1AcHVibGlzaGVkQWxsCi0qLwotdHlwZWRlZiBzdHJ1Y3QgdGFnRGVjT2JqZWN0Ci17Ci0KLSAgICBBVkNDb21tb25PYmogKmNvbW1vbjsKLQotICAgIEFWQ0RlY0JpdHN0cmVhbSAgICAgKmJpdHN0cmVhbTsgLyogZm9yIGN1cnJlbnQgTkFMICovCi0KLSAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0ICovCi0gICAgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtc1szMl07IC8qIEFycmF5IG9mIHBvaW50ZXJzLCBnZXQgYWxsb2NhdGVkIGF0IGFycml2YWwgb2YgbmV3IHNlcV9pZCAqLwotCi0gICAgLyogcGljdHVyZSBwYXJhbWV0ZXIgc2V0ICovCi0gICAgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtc1syNTZdOyAvKiBBcnJheSBvZiBwb2ludGVycyB0byBwaWN0dXJlIHBhcmFtIHNldCBzdHJ1Y3R1cmVzICovCi0KLSAgICAvKiBGb3IgaW50ZXJuYWwgb3BlcmF0aW9uLCBzY3JhdGNoIG1lbW9yeSBmb3IgTVYsIHByZWRpY3Rpb24sIHRyYW5zZm9ybSwgZXRjLiovCi0gICAgdWludCAgICByZWZfaWR4X2wwWzRdOyAvKiBbbWJQYXJ0SWR4XSwgdGUodikgKi8KLSAgICB1aW50ICAgIHJlZl9pZHhfbDFbNF07Ci0KLSAgICAvKiBmdW5jdGlvbiBwb2ludGVycyAqLwotICAgIEFWQ0RlY19TdGF0dXMoKnJlc2lkdWFsX2Jsb2NrKShzdHJ1Y3QgdGFnRGVjT2JqZWN0KiwgaW50LCAgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiwgaW50ICosIGludCAqKTsKLSAgICAvKiBBcHBsaWNhdGlvbiBjb250cm9sIGRhdGEgKi8KLSAgICBBVkNIYW5kbGUgKmF2Y0hhbmRsZTsKLSAgICB2b2lkICgqQVZDX0RlYnVnTG9nKShBVkNMb2dUeXBlIHR5cGUsIGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpOwotICAgIC8qYm9vbCovCi0gICAgdWludCAgICBkZWJ1Z0VuYWJsZTsKLQotfSBBVkNEZWNPYmplY3Q7Ci0KLSNlbmRpZiAvKiBfQVZDREVDX0lOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2F2Y2RlY19saWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9hdmNkZWNfbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWFkMDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2F2Y2RlY19saWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqCi1UaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIG9mIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgQVZDIGRlY29kZXIgbGlicmFyeS4KLUBwdWJsaXNoZWRBbGwKLSovCi0jaWZuZGVmIF9BVkNERUNfTElCX0hfCi0jZGVmaW5lIF9BVkNERUNfTElCX0hfCi0KLSNpbmNsdWRlICJhdmNsaWJfY29tbW9uLmgiCi0jaW5jbHVkZSAiYXZjZGVjX2ludC5oIgotCi0vKi0tLS0tLS0tLS0tIGF2Y2RlY19hcGkuYyAtLS0tLS0tLS0tLS0tKi8KLS8qKgotVGhpcyBmdW5jdGlvbiB0YWtlcyBvdXQgdGhlIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGVzIGZyb20gdGhlIGlucHV0IHRvIGNyZWF0IFJCU1AuCi1UaGUgcmVzdWx0IGlzIHdyaXR0ZW4gb3ZlciB0aGUgaW5wdXQgYml0c3RyZWFtLgotXHBhcmFtICJuYWxfdW5pdCIgICAiKEkvTykgUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyLiIKLVxwYXJhbSAic2l6ZSIgICAgICAgIihJL08pIFBvaW50ZXIgdG8gdGhlIHNpemUgb2YgdGhlIGlucHV0L291dHB1dCBidWZmZXIuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIG90aGVyd2lzZS4iCi0qLwotQVZDRGVjX1N0YXR1cyBFQlNQdG9SQlNQKHVpbnQ4ICpuYWxfdW5pdCwgaW50ICpzaXplKTsKLQotLyotLS0tLS0tLS0tLS0tIHByZWRfaW50cmEuYyAtLS0tLS0tLS0tLS0tLS0qLwotLyoqCi1UaGlzIGZ1bmN0aW9uIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IHRvIGludHJhIHByZWRpY3Rpb24gb3BlcmF0aW9uIG9uIGEKLW1hY3JvYmxvY2suCi1ccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLSovCi1BVkNTdGF0dXMgIEludHJhTUJQcmVkaWN0aW9uKEFWQ0NvbW1vbk9iaiAqdmlkZW8pOwotCi12b2lkIFNhdmVOZWlnaGJvckZvckludHJhUHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgb2Zmc2V0KTsKLQotQVZDU3RhdHVzIEludHJhXzR4NChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgY29tcG9uZW50LCBpbnQgU3ViQmxvY2tfaW5keCwgdWludDggKmNvbXApOwotdm9pZCBJbnRyYV80eDRfVmVydGljYWwoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IGJsb2NrX29mZnNldCk7Ci12b2lkIEludHJhXzR4NF9Ib3Jpem9udGFsKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgaW50IGJsb2NrX29mZnNldCk7Ci12b2lkIEludHJhXzR4NF9EQyhBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIGludCBibG9ja19vZmZzZXQsIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5ICphdmFpbGFiaWxpdHkpOwotdm9pZCBJbnRyYV80eDRfRG93bl9MZWZ0KEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibG9ja19vZmZzZXQsIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5ICphdmFpbGFiaWxpdHkpOwotdm9pZCBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIGludCBibG9ja19vZmZzZXQpOwotdm9pZCBJbnRyYV80eDRfRGlhZ29uYWxfVmVydGljYWxfUmlnaHQoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLCBpbnQgYmxvY2tfb2Zmc2V0KTsKLXZvaWQgSW50cmFfNHg0X0RpYWdvbmFsX0hvcml6b250YWxfRG93bihBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIGludCBibG9ja19vZmZzZXQpOwotdm9pZCBJbnRyYV80eDRfVmVydGljYWxfTGVmdChBVkNDb21tb25PYmogKnZpZGVvLCAgaW50IGJsb2NrX29mZnNldCwgQVZDTmVpZ2hib3JBdmFpbGFiaWxpdHkgKmF2YWlsYWJpbGl0eSk7Ci12b2lkIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgaW50IGJsb2NrX29mZnNldCk7Ci12b2lkICBJbnRyYV8xNngxNl9WZXJ0aWNhbChBVkNDb21tb25PYmogKnZpZGVvKTsKLXZvaWQgSW50cmFfMTZ4MTZfSG9yaXpvbnRhbChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gpOwotdm9pZCBJbnRyYV8xNngxNl9EQyhBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gpOwotdm9pZCBJbnRyYV8xNngxNl9QbGFuZShBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gpOwotdm9pZCBJbnRyYV9DaHJvbWFfREMoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLCB1aW50OCAqcHJlZENiLCB1aW50OCAqcHJlZENyKTsKLXZvaWQgIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgdWludDggKnByZWRDYiwgdWludDggKnByZWRDcik7Ci12b2lkICBJbnRyYV9DaHJvbWFfVmVydGljYWwoQVZDQ29tbW9uT2JqICp2aWRlbywgdWludDggKnByZWRDYiwgdWludDggKnByZWRDcik7Ci12b2lkICBJbnRyYV9DaHJvbWFfUGxhbmUoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLCB1aW50OCAqcHJlZENiLCB1aW50OCAqcHJlZENyKTsKLQotLyotLS0tLS0tLS0tLS0gcHJlZF9pbnRlci5jIC0tLS0tLS0tLS0tLS0tLSovCi0vKioKLVRoaXMgZnVuY3Rpb24gaXMgdGhlIG1haW4gZW50cmFuY2UgdG8gaW50ZXIgcHJlZGljdGlvbiBvcGVyYXRpb24gZm9yCi1hIG1hY3JvYmxvY2suIEZvciBkZWNvZGluZywgdGhpcyBmdW5jdGlvbiBhbHNvIGNhbGxzIGludmVyc2UgdHJhbnNmb3JtIGFuZAotY29tcGVuc2F0aW9uLgotXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCi1ccmV0dXJuICJ2b2lkIgotKi8KLXZvaWQgSW50ZXJNQlByZWRpY3Rpb24oQVZDQ29tbW9uT2JqICp2aWRlbyk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGx1bWEgbW90aW9uIGNvbXBlbnNhdGlvbi4KLVxwYXJhbSAicmVmIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIGEgcmVmZXJlbmNlIGx1bWEuIgotXHBhcmFtICJwaWN3aWR0aCIgICAiV2lkdGggb2YgdGhlIHBpY3R1cmUuIgotXHBhcmFtICJwaWNoZWlnaHQiICAiSGVpZ2h0IG9mIHRoZSBwaWN0dXJlLiIKLVxwYXJhbSAieF9wb3MiICAiWC1jb29yZGluYXRlIG9mIHRoZSBwcmVkaWN0ZWQgYmxvY2sgaW4gcXVhcnRlciBwZWwgcmVzb2x1dGlvbi4iCi1ccGFyYW0gInlfcG9zIiAgIlktY29vcmRpbmF0ZSBvZiB0aGUgcHJlZGljdGVkIGJsb2NrIGluIHF1YXJ0ZXIgcGVsIHJlc29sdXRpb24uIgotXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBvdXRwdXQgcHJlZGljdGVkIGJsb2NrLiIKLVxwYXJhbSAicHJlZF9waXRjaCIgIldpZHRoIG9mIHByZWQuIgotXHBhcmFtICJibGt3aWR0aCIgICAiV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKLVxwYXJhbSAiYmxraGVpZ2h0IiAgIkhlaWdodCBvZiB0aGUgY3VycmVudCBwYXJ0aXRpb24uIgotXHJldHVybiAidm9pZCIKLSovCi12b2lkIEx1bWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotLyoqCi1GdW5jdGlvbnMgYmVsb3cgYXJlIHNwZWNpYWwgY2FzZXMgZm9yIGx1bWEgbW90aW9uIGNvbXBlbnNhdGlvbi4KLUx1bWFGdWxsUGVsTUMgaXMgZm9yIGZ1bGwgcGl4ZWwgbW90aW9uIGNvbXBlbnNhdGlvbi4KLUx1bWFCb3JkZXJNQyBpcyBmb3IgaW50ZXJwb2xhdGlvbiBpbiBvbmx5IG9uZSBkaW1lbnNpb24uCi1MdW1hQ3Jvc3NNQyBpcyBmb3IgaW50ZXJwb2xhdGlvbiBpbiBvbmUgZGltZW5zaW9uIGFuZCBoYWxmIHBvaW50IGluIHRoZSBvdGhlciBkaW1lbnNpb24uCi1MdW1hRGlhZ29uYWxNQyBpcyBmb3IgaW50ZXJwb2xhdGlvbiBpbiBkaWFnb25hbCBkaXJlY3Rpb24uCi0KLVxwYXJhbSAicmVmIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIGEgcmVmZXJlbmNlIGx1bWEuIgotXHBhcmFtICJwaWN3aWR0aCIgICAiV2lkdGggb2YgdGhlIHBpY3R1cmUuIgotXHBhcmFtICJwaWNoZWlnaHQiICAiSGVpZ2h0IG9mIHRoZSBwaWN0dXJlLiIKLVxwYXJhbSAieF9wb3MiICAiWC1jb29yZGluYXRlIG9mIHRoZSBwcmVkaWN0ZWQgYmxvY2sgaW4gZnVsbCBwZWwgcmVzb2x1dGlvbi4iCi1ccGFyYW0gInlfcG9zIiAgIlktY29vcmRpbmF0ZSBvZiB0aGUgcHJlZGljdGVkIGJsb2NrIGluIGZ1bGwgcGVsIHJlc29sdXRpb24uIgotXHBhcmFtICJkeCIgICAgICJGcmFjdGlvbiBvZiB4X3BvcyBpbiBxdWFydGVyIHBlbC4iCi1ccGFyYW0gImR5IiAgICAgIkZyYWN0aW9uIG9mIHlfcG9zIGluIHF1YXJ0ZXIgcGVsLiIKLVxwYXJhbSAiY3VyciIgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBwYXJ0aXRpb24gaW4gdGhlIGN1cnJlbnQgcGljdHVyZS4iCi1ccGFyYW0gInJlc2lkdWUiICAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBhcnRpdGlvbiBmb3IgdGhlIHJlc2lkdWUgYmxvY2suIgotXHBhcmFtICJibGt3aWR0aCIgICAiV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKLVxwYXJhbSAiYmxraGVpZ2h0IiAgIkhlaWdodCBvZiB0aGUgY3VycmVudCBwYXJ0aXRpb24uIgotXHJldHVybiAidm9pZCIKLSovCi12b2lkIENyZWF0ZVBhZCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsIGludCB4X3BvcywgaW50IHlfcG9zLAotICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBGdWxsUGVsTUModWludDggKmluLCBpbnQgaW53aWR0aCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBIb3J6SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKLSAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCk7Ci0KLXZvaWQgSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KTsKLQotdm9pZCBIb3J6SW50ZXJwM01DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBWZXJ0SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKLSAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSk7Ci0KLXZvaWQgVmVydEludGVycDJNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7Ci0KLXZvaWQgVmVydEludGVycDNNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KTsKLQotdm9pZCBEaWFnb25hbEludGVycE1DKHVpbnQ4ICppbjEsIHVpbnQ4ICppbjIsIGludCBpbnBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotCi0KLXZvaWQgQ2hyb21hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotCi12b2lkIENocm9tYUZ1bGxQZWxNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpIDsKLXZvaWQgQ2hyb21hQm9yZGVyTUModWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotdm9pZCBDaHJvbWFEaWFnb25hbE1DKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotCi12b2lkIENocm9tYUZ1bGxQZWxNQ091dHNpZGUodWludDggKnJlZiwgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IHhfaW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X2luYzAsIGludCB5X2luYzEsIGludCB4X21pZCwgaW50IHlfbWlkKTsKLXZvaWQgQ2hyb21hQm9yZGVyTUNPdXRzaWRlKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHJlZCwgaW50IHByZWRfcGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X2luYywgaW50IHpfaW5jLCBpbnQgeV9pbmMwLCBpbnQgeV9pbmMxLCBpbnQgeF9taWQsIGludCB5X21pZCk7Ci12b2lkIENocm9tYURpYWdvbmFsTUNPdXRzaWRlKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR4LCBpbnQgZHksIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgeF9pbmMsIGludCB6X2luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfaW5jMCwgaW50IHlfaW5jMSwgaW50IHhfbWlkLCBpbnQgeV9taWQpOwotCi12b2lkIENocm9tYURpYWdvbmFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotCi12b2lkIENocm9tYUhvcml6b250YWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBDaHJvbWFWZXJ0aWNhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBDaHJvbWFGdWxsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7Ci0KLXZvaWQgQ2hyb21hVmVydGljYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKLQotdm9pZCBDaHJvbWFEaWFnb25hbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOwotCi0KLS8qLS0tLS0tLS0tLS0gc2xpY2UuYyAtLS0tLS0tLS0tLS0tLS0qLwotLyoqCi1UaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtYWluIGRlY29kaW5nIGxvb3AgZm9yIHNsaWNlIGRhdGEgaW5jbHVkaW5nCi1JTlRSQS9JTlRFUiBwcmVkaWN0aW9uLCB0cmFuc2Zvcm0gYW5kIHF1YW50aXphdGlvbiBhbmQgY29tcGVuc2F0aW9uLgotU2VlIGRlY29kZV9mcmFtZV9zbGljZSgpIGluIEpNLgotXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0RlY09iamVjdC4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDREVDX1BJQ1RVUkVfUkVBRFkgZm9yIGVuZC1vZi1waWN0dXJlIGFuZCBBVkNERUNfRkFJTCBvdGhlcndpc2UuIgotKi8KLUFWQ0RlY19TdGF0dXMgRGVjb2RlU2xpY2UoQVZDRGVjT2JqZWN0ICp2aWRlbyk7Ci1BVkNEZWNfU3RhdHVzIENvbmNlYWxTbGljZShBVkNEZWNPYmplY3QgKmRlY3ZpZCwgaW50IG1ibnVtX3N0YXJ0LCBpbnQgbWJudW1fZW5kKTsKLS8qKgotVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZGVjb2Rpbmcgb2Ygb25lIG1hY3JvYmxvY2suCi1ccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRGVjT2JqZWN0LiIKLVxwYXJhbSAicHJldk1iU2tpcHBlZCIgICJBIHZhbHVlIGRlcml2ZWQgaW4gNy4zLjQuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgQVZDREVDX0ZBSUwgb3RoZXJ3aXNlLiIKLSovCi1BVkNEZWNfU3RhdHVzIERlY29kZU1CKEFWQ0RlY09iamVjdCAqdmlkZW8pOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbWFjcm9ibG9jayBwcmVkaWN0aW9uIHR5cGUgZGVjb2RpbmcgYXMgaW4gc3ViY2xhdXNlIDcuMy41LjEuCi1ccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgotXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0RlY0JpdHN0cmVhbS4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBBVkNERUNfRkFJTCBvdGhlcndpc2UuIgotKi8KLUFWQ0RlY19TdGF0dXMgbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHN1Yi1tYWNyb2Jsb2NrIHByZWRpY3Rpb24gdHlwZSBkZWNvZGluZyBhcyBpbiBzdWJjbGF1c2UgNy4zLjUuMi4KLVxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCi1ccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4iCi1ccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRGVjQml0c3RyZWFtLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIEFWQ0RFQ19GQUlMIG90aGVyd2lzZS4iCi0qLwotQVZDRGVjX1N0YXR1cyBzdWJfbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIG1iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCi13aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19JX1NMSUNFLgotaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgotXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCi1ccGFyYW0gIm1iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKLVxyZXR1cm4gInZvaWQiCi0qLwotdm9pZCBJbnRlcnByZXRNQk1vZGVJKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCBtYl90eXBlKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIG1iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCi13aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19QX1NMSUNFLgotaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgotXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCi1ccGFyYW0gIm1iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKLVxyZXR1cm4gInZvaWQiCi0qLwotdm9pZCBJbnRlcnByZXRNQk1vZGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCBtYl90eXBlKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIG1iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCi13aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19CX1NMSUNFLgotaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgotXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCi1ccGFyYW0gIm1iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKLVxyZXR1cm4gInZvaWQiCi0qLwotdm9pZCBJbnRlcnByZXRNQk1vZGVCKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCBtYl90eXBlKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIG1iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCi13aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19TSV9TTElDRS4KLWluIHRoZSBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4KLVxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byBjdXJyZW50IEFWQ01hY3JvYmxvY2suIgotXHBhcmFtICJtYl90eXBlIiAiRnJvbSB0aGUgc3ludGF4IGJpdHN0cmVhbS4iCi1ccmV0dXJuICJ2b2lkIgotKi8KLXZvaWQgSW50ZXJwcmV0TUJNb2RlU0koQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50IG1iX3R5cGUpOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgc3ViX21iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCi13aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19QX1NMSUNFLgotaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgotXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCi1ccGFyYW0gInN1Yl9tYl90eXBlIiAiRnJvbSB0aGUgc3ludGF4IGJpdHN0cmVhbS4iCi1ccmV0dXJuICJ2b2lkIgotKi8KLXZvaWQgSW50ZXJwcmV0U3ViTUJNb2RlUChBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIHN1Yl9tYl90eXBlIGFuZCBzZXRzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgotd2hlbiB0aGUgc2xpY2UgdHlwZSBpcyBBVkNfQl9TTElDRS4KLWluIHRoZSBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4KLVxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byBjdXJyZW50IEFWQ01hY3JvYmxvY2suIgotXHBhcmFtICJzdWJfbWJfdHlwZSIgIkZyb20gdGhlIHN5bnRheCBiaXRzdHJlYW0uIgotXHJldHVybiAidm9pZCIKLSovCi12b2lkIEludGVycHJldFN1Yk1CTW9kZUIoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBJbnRyYTR4NCBwcmVkaWN0aW9uIG1vZGUgZnJvbSBuZWlnaGJvcmluZyBpbmZvcm1hdGlvbgotYW5kIGZyb20gdGhlIGRlY29kZWQgc3ludGF4LgotXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCi1ccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrLiIKLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1Mgb3IgQVZDREVDX0ZBSUwuIgotKi8KLUFWQ0RlY19TdGF0dXMgRGVjb2RlSW50cmE0eDRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pOwotCi0vKi0tLS0tLS0tLS0tIHZsYy5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqCi1UaGlzIGZ1bmN0aW9uIHJlYWRzIGFuZCBkZWNvZGVzIEV4cC1Hb2xvbWIgY29kZXMuCi1ccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAiY29kZU51bSIgIlBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlTnVtLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIG9yIEFWQ0RFQ19GQUlMLiIKLSovCi1BVkNEZWNfU3RhdHVzIHVlX3YoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKmNvZGVOdW0pOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gcmVhZHMgYW5kIGRlY29kZXMgc2lnbmVkIEV4cC1Hb2xvbWIgY29kZXMuCi1ccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAidmFsdWUiICAiUG9pbnRlciB0byBzeW50YXggZWxlbWVudCB2YWx1ZS4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBvciBBVkNERUNfRkFJTC4iCi0qLwotQVZDRGVjX1N0YXR1cyAgc2VfdihBVkNEZWNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgaW50ICp2YWx1ZSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiByZWFkcyBhbmQgZGVjb2RlcyBzaWduZWQgRXhwLUdvbG9tYiBjb2RlcyBmb3IKLTMyIGJpdCBjb2Rld29yZC4KLVxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJ2YWx1ZSIgICJQb2ludGVyIHRvIHN5bnRheCBlbGVtZW50IHZhbHVlLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIG9yIEFWQ0RFQ19GQUlMLiIKLSovCi1BVkNEZWNfU3RhdHVzICBzZV92MzJiaXQoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIGludDMyICp2YWx1ZSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiByZWFkcyBhbmQgZGVjb2RlcyB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2Rlcy4KLVxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJ2YWx1ZSIgICJQb2ludGVyIHRvIHN5bnRheCBlbGVtZW50IHZhbHVlLiIKLVxwYXJhbSAicmFuZ2UiICAiUmFuZ2Ugb2YgdGhlIHZhbHVlIGFzIGlucHV0IHRvIGRldGVybWluZSB0aGUgYWxnb3JpdGhtLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIG9yIEFWQ0RFQ19GQUlMLiIKLSovCi1BVkNEZWNfU3RhdHVzIHRlX3YoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKnZhbHVlLCB1aW50IHJhbmdlKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIHBhcnNlIEV4cC1Hb2xvbWIgY29kZSBmcm9tIHRoZSBiaXRzdHJlYW0uCi1ccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAibGVhZGluZ1plcm9zIiAiUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MuIgotXHBhcmFtICJpbmZvYml0cyIgICAiUG9pbnRlciB0byB0aGUgdmFsdWUgYWZ0ZXIgbGVhZGluZyB6ZXJvcyBhbmQgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIHJlYWQgaXMgMipsZWFkaW5nWmVyb3MgKyAxLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIG9yIEFWQ0RFQ19GQUlMLiIKLSovCi1BVkNEZWNfU3RhdHVzIEdldEVHQml0c3RyaW5nKEFWQ0RlY0JpdHN0cmVhbSAqYml0c3RyZWFtLCBpbnQgKmxlYWRpbmdaZXJvcywgaW50ICppbmZvYml0cyk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBwYXJzZSBFeHAtR29sb21iIGNvZGUgZnJvbSB0aGUgYml0c3RyZWFtIGZvciAzMiBiaXQgY29kZXdvcmRzLgotXHBhcmFtICJiaXRzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0RlY0JpdHN0cmVhbS4iCi1ccGFyYW0gImxlYWRpbmdaZXJvcyIgIlBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLiIKLVxwYXJhbSAiaW5mb2JpdHMiICAgIlBvaW50ZXIgdG8gdGhlIHZhbHVlIGFmdGVyIGxlYWRpbmcgemVyb3MgYW5kIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICAgICAgICAgIFRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyByZWFkIGlzIDIqbGVhZGluZ1plcm9zICsgMS4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBvciBBVkNERUNfRkFJTC4iCi0qLwotQVZDRGVjX1N0YXR1cyBHZXRFR0JpdHN0cmluZzMyYml0KEFWQ0RlY0JpdHN0cmVhbSAqYml0c3RyZWFtLCBpbnQgKmxlYWRpbmdaZXJvcywgdWludDMyICppbmZvYml0cyk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBvZiB0aGUgQ0JQIChjb2RlZCBibG9jayBwYXR0ZXJuKSBvZiBhIG1hY3JvYmxvY2sKLWJ5IGNhbGxpbmcgdWVfdigpIGFuZCB0aGVuIG1hcHBpbmcgdGhlIGNvZGVOdW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgQ0JQIHZhbHVlLgotXHBhcmFtICJjdXJyTUIiICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCi1ccGFyYW0gInN0cmVhbSIgICJQb2ludGVyIHRvIHRoZSBBVkNEZWNCaXRzdHJlYW0uIgotXHJldHVybiAidm9pZCIKLSovCi1BVkNEZWNfU3RhdHVzIERlY29kZUNCUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIHN5bnRheCBmb3IgdHJhaWxpbmcgb25lcyBhbmQgdG90YWwgY29lZmZpY2llbnQuCi1TdWJqZWN0IHRvIG9wdGltaXphdGlvbi4KLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAiVHJhaWxpbmdPbmVzIiAgICJQb2ludGVyIHRvIHRoZSB0cmFpbGluZyBvbmUgdmFyaWFibGUgb3V0cHV0LiIKLVxwYXJhbSAiVG90YWxDb2VmZiIgIlBvaW50ZXIgdG8gdGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCi1ccGFyYW0gIm5DIiAiQ29udGV4dCBmb3IgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnQgKHByZWRpY3Rpb24gY29udGV4dCkuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgotKi8KLUFWQ0RlY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpUcmFpbGluZ09uZXMsIGludCAqVG90YWxDb2VmZiwgaW50IG5DKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIHN5bnRheCBmb3IgdHJhaWxpbmcgb25lcyBhbmQgdG90YWwgY29lZmZpY2llbnQgZm9yCi1jaHJvbWEgREMgYmxvY2suIFN1YmplY3QgdG8gb3B0aW1pemF0aW9uLgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJUcmFpbGluZ09uZXMiICAgIlBvaW50ZXIgdG8gdGhlIHRyYWlsaW5nIG9uZSB2YXJpYWJsZSBvdXRwdXQuIgotXHBhcmFtICJUb3RhbENvZWZmIiAiUG9pbnRlciB0byB0aGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGZvciBzdWNjZXNzLiIKLSovCi1BVkNEZWNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXNDaHJvbWFEQyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpUcmFpbGluZ09uZXMsIGludCAqVG90YWxDb2VmZik7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGUgYSBWTEMgdGFibGUgd2l0aCAyIG91dHB1dC4KLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAibGVudGFiIiAiVGFibGUgZm9yIGNvZGUgbGVuZ3RoLiIKLVxwYXJhbSAiY29kdGFiIiAiVGFibGUgZm9yIGNvZGUgdmFsdWUuIgotXHBhcmFtICJ0YWJ3aWR0aCIgIldpZHRoIG9mIHRoZSB0YWJsZSBvciBhbHBoYWJldCBzaXplIG9mIHRoZSBmaXJzdCBvdXRwdXQuIgotXHBhcmFtICJ0YWJoZWlnaHQiICAiSGVpZ2h0IG9mIHRoZSB0YWJsZSBvciBhbHBoYWJldCBzaXplIG9mIHRoZSBzZWNvbmQgb3V0cHV0LiIKLVxwYXJhbSAiY29kZTEiICAiUG9pbnRlciB0byB0aGUgZmlyc3Qgb3V0cHV0LiIKLVxwYXJhbSAiY29kZTIiICAiUG9pbnRlciB0byB0aGUgc2Vjb25kIG91dHB1dC4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCi0qLwotQVZDRGVjX1N0YXR1cyBjb2RlX2Zyb21fYml0c3RyZWFtXzJkKEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgKmxlbnRhYiwgaW50ICpjb2R0YWIsIGludCB0YWJ3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFiaGVpZ2h0LCBpbnQgKmNvZGUxLCBpbnQgKmNvZGUyKTsKLQotLyoqCi1UaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGxldmVsX3ByZWZpeCBWTEMgdmFsdWUgYXMgaW4gVGFibGUgOS02LgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJjb2RlIiAgICJQb2ludGVyIHRvIHRoZSBvdXRwdXQuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgotKi8KLUFWQ0RlY19TdGF0dXMgY2VfTGV2ZWxQcmVmaXgoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgKmNvZGUpOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gZGVjb2RlcyB0b3RhbF96ZXJvcyBWTEMgc3ludGF4IGFzIGluIFRhYmxlIDktNyBhbmQgOS04LgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJjb2RlIiAgICJQb2ludGVyIHRvIHRoZSBvdXRwdXQuIgotXHBhcmFtICJUb3RhbENvZWZmIiAiQ29udGV4dCBwYXJhbWV0ZXIuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgotKi8KLUFWQ0RlY19TdGF0dXMgY2VfVG90YWxaZXJvcyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpjb2RlLCBpbnQgVG90YWxDb2VmZik7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRvdGFsX3plcm9zIFZMQyBzeW50YXggZm9yIGNocm9tYSBEQyBhcyBpbiBUYWJsZSA5LTkuCi1ccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0RlY0JpdHN0cmVhbS4iCi1ccGFyYW0gImNvZGUiICAgIlBvaW50ZXIgdG8gdGhlIG91dHB1dC4iCi1ccGFyYW0gIlRvdGFsQ29lZmYiICJDb250ZXh0IHBhcmFtZXRlci4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCi0qLwotQVZDRGVjX1N0YXR1cyBjZV9Ub3RhbFplcm9zQ2hyb21hREMoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIGludCAqY29kZSwgaW50IFRvdGFsQ29lZmYpOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gZGVjb2RlcyBydW5fYmVmb3JlIFZMQyBzeW50YXggYXMgaW4gVGFibGUgOS0xMC4KLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRGVjQml0c3RyZWFtLiIKLVxwYXJhbSAiY29kZSIgICAiUG9pbnRlciB0byB0aGUgb3V0cHV0LiIKLVxwYXJhbSAiemVyb0xlZnQiICAgIkNvbnRleHQgcGFyYW1ldGVyLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGZvciBzdWNjZXNzLiIKLSovCi1BVkNEZWNfU3RhdHVzIGNlX1J1bkJlZm9yZShBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpjb2RlLCBpbnQgemVyb0xlZnQpOwotCi0vKi0tLS0tLS0tLS0tIGhlYWRlci5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqCi1UaGlzIGZ1bmN0aW9uIHBhcnNlcyB2dWlfcGFyYW1ldGVycy4KLVxwYXJhbSAiZGVjdmlkIiAiUG9pbnRlciB0byBBVkNEZWNPYmplY3QuIgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0RlY0JpdHN0cmVhbS4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBvciBBVkNERUNfRkFJTC4iCi0qLwotQVZDRGVjX1N0YXR1cyB2dWlfcGFyYW1ldGVycyhBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTKTsKLUFWQ0RlY19TdGF0dXMgc2VpX3BheWxvYWQoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50IHBheWxvYWRUeXBlLCB1aW50IHBheWxvYWRTaXplKTsKLQotQVZDRGVjX1N0YXR1cyBidWZmZXJpbmdfcGVyaW9kKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci1BVkNEZWNfU3RhdHVzIHBpY190aW1pbmcoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLUFWQ0RlY19TdGF0dXMgcmVjb3ZlcnlfcG9pbnQoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLUFWQ0RlY19TdGF0dXMgZGVjX3JlZl9waWNfbWFya2luZ19yZXBldGl0aW9uKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci1BVkNEZWNfU3RhdHVzIG1vdGlvbl9jb25zdHJhaW5lZF9zbGljZV9ncm91cF9zZXQoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLQotCi0vKioKLVRoaXMgZnVuY3Rpb24gcGFyc2VzIGhyZF9wYXJhbWV0ZXJzLgotXHBhcmFtICJkZWN2aWQiICJQb2ludGVyIHRvIEFWQ0RlY09iamVjdC4iCi1ccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRGVjQml0c3RyZWFtLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIG9yIEFWQ0RFQ19GQUlMLiIKLSovCi1BVkNEZWNfU3RhdHVzIGhyZF9wYXJhbWV0ZXJzKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDSFJEUGFyYW1zICpIUkRQYXJhbSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBzeW50YXggaW4gc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBzbGljZSBhbmQgZmlsbCB1cCB0aGUgQVZDU2VxUGFyYW1TZXQKLXN0cnVjdHVyZS4KLVxwYXJhbSAiZGVjdmlkIiAiUG9pbnRlciB0byBBVkNEZWNPYmplY3QuIgotXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1Mgb3IgQVZDREVDX0ZBSUwuIgotKi8KLUFWQ0RlY19TdGF0dXMgRGVjb2RlU1BTKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBzeW50YXggaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGFuZCBmaWxsIHVwIHRoZSBBVkNQaWNQYXJhbVNldAotc3RydWN0dXJlLgotXHBhcmFtICJkZWN2aWQiICJQb2ludGVyIHRvIEFWQ0RlY09iamVjdC4iCi1ccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0RlY0JpdHN0cmVhbS4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBvciBBVkNERUNfRkFJTC4iCi0qLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVQUFMoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKTsKLUFWQ0RlY19TdGF0dXMgRGVjb2RlU0VJKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHNsaWNlIGhlYWRlciwgY2FsbHMgcmVsYXRlZCBmdW5jdGlvbnMgc3VjaCBhcwotcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nLCBwcmVkaWN0aW9uIHdlaWdodCB0YWJsZSwgZGVjb2RlIHJlZiBtYXJraW5nLgotU2VlIEZpcnN0UGFydE9mU2xpY2VIZWFkZXIoKSBhbmQgUmVzdE9mU2xpY2VIZWFkZXIoKSBpbiBKTS4KLVxwYXJhbSAiZGVjdmlkIiAiUG9pbnRlciB0byBBVkNEZWNPYmplY3QuIgotXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIG90aGVyd2lzZS4iCi0qLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVTbGljZUhlYWRlcihBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gcGVyZm9ybWVzIG5lY2Vzc2FyeSBvcGVyYXRpb25zIHRvIGNyZWF0ZSBkdW1teSBmcmFtZXMgd2hlbgotdGhlcmUgaXMgYSBnYXAgaW4gZnJhbWVfbnVtLgotXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBhbmQgQVZDREVDX0ZBSUwgb3RoZXJ3aXNlLiIKLSovCi1BVkNEZWNfU3RhdHVzIGZpbGxfZnJhbWVfbnVtX2dhcChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDQ29tbW9uT2JqICp2aWRlbyk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nIHJlbGF0ZWQgc3ludGF4IGFuZCBmaWxsIHVwIHRoZSBBVkNTbGljZUhlYWRlcgotc3RydWN0dXJlLgotXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJzbGljZUhkciIgIlBvaW50ZXIgdG8gQVZDU2xpY2VIZHIuIgotXHBhcmFtICJzbGljZV90eXBlIiAiVmFsdWUgb2Ygc2xpY2VfdHlwZSAtIDUgaWYgZ3JlYXRlciB0aGFuIDUuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIG90aGVyd2lzZS4iCi0qLwotQVZDRGVjX1N0YXR1cyByZWZfcGljX2xpc3RfcmVvcmRlcmluZyhBVkNDb21tb25PYmogKnZpZGVvLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyLCBpbnQgc2xpY2VfdHlwZSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGRlY19yZWZfcGljX21hcmtpbmcgcmVsYXRlZCBzeW50YXggIGFuZCBmaWxsIHVwIHRoZSBBVkNTbGljZUhlYWRlcgotc3RydWN0dXJlLgotXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLVxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNEZWNCaXRzdHJlYW0uIgotXHBhcmFtICJzbGljZUhkciIgIlBvaW50ZXIgdG8gQVZDU2xpY2VIZHIuIgotXHJldHVybiAiQVZDREVDX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0RFQ19GQUlMIG90aGVyd2lzZS4iCi0qLwotQVZDRGVjX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIpOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgUE9DIHJlbGF0ZWQgb3BlcmF0aW9uIHByaW9yIHRvIGRlY29kaW5nIGEgcGljdHVyZQotXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKLVxyZXR1cm4gIkFWQ0RFQ19TVUNDRVNTIGZvciBzdWNjZXNzIGFuZCBBVkNERUNfRkFJTCBvdGhlcndpc2UuIgotU2VlIGFsc28gUG9zdFBPQygpIGZvciBpbml0aWFsaXphdGlvbiBvZiBzb21lIHZhcmlhYmxlcy4KLSovCi1BVkNEZWNfU3RhdHVzIERlY29kZVBPQyhBVkNDb21tb25PYmogKnZpZGVvKTsKLQotCi0KLS8qLS0tLS0tLS0tLS0tIHJlc2lkdWFsLmMgLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKgotVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoZSBpbnRyYSBwY20gZGF0YSBhbmQgZmlsbCBpdCBpbiB0aGUgY29ycmVzcG9uZGluZyBsb2NhdGlvbgotb24gdGhlIGN1cnJlbnQgcGljdHVyZS4KLVxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgotXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0RlY0JpdHN0cmVhbS4iCi0qLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVJbnRyYVBDTShBVkNDb21tb25PYmogKnZpZGVvLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSk7Ci0KLS8qKgotVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyByZXNpZHVhbCBzeW50YXggZGVjb2RpbmcgYXMgd2VsbCBhcyBxdWFudGl6YXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIG9mCi10aGUgZGVjb2RlZCBjb2VmZmljaWVudHMuIFNlZSBzdWJjbGF1c2UgNy4zLjUuMy4KLVxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNEZWNPYmplY3QuIgotXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jay4iCi0qLwotQVZDRGVjX1N0YXR1cyByZXNpZHVhbChBVkNEZWNPYmplY3QgKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIpOwotCi0vKioKLVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgQ0FWTEMgc3ludGF4IGRlY29kaW5nIHRvIGdldCB0aGUgcnVuIGFuZCBsZXZlbCBpbmZvcm1hdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzLgotXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0RlY09iamVjdC4iCi1ccGFyYW0gInR5cGUiICAgIk9uZSBvZiBBVkNSZXNpZHVhbFR5cGUgZm9yIGEgcGFydGljdWxhciA0eDQgYmxvY2suIgotXHBhcmFtICJieCIgICAgICJIb3Jpem9udGFsIGJsb2NrIGluZGV4LiIKLVxwYXJhbSAiYnkiICAgICAiVmVydGljYWwgYmxvY2sgaW5kZXguIgotXHBhcmFtICJsZXZlbCIgICJQb2ludGVyIHRvIGFycmF5IG9mIGxldmVsIGZvciBvdXRwdXQuIgotXHBhcmFtICJydW4iICAgICJQb2ludGVyIHRvIGFycmF5IG9mIHJ1biBmb3Igb3V0cHV0LiIKLVxwYXJhbSAibnVtY29lZmYiICAgIlBvaW50ZXIgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cy4iCi1ccmV0dXJuICJBVkNERUNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCi0qLwotQVZDRGVjX1N0YXR1cyByZXNpZHVhbF9ibG9ja19jYXZsYyhBVkNEZWNPYmplY3QgKnZpZGVvLCBpbnQgbkMsIGludCBtYXhOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZXZlbCwgaW50ICpydW4sIGludCAqbnVtY29lZmYpOwotCi0jZW5kaWYgLyogX0FWQ0RFQ19MSUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9oZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODFlMmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2hlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaW5jbHVkZSAiYXZjZGVjX2xpYi5oIgotI2luY2x1ZGUgImF2Y2RlY19iaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhdmNkZWNfYXBpLmgiCi0KLS8qKiBzZWUgc3ViY2xhdXNlIDcuNC4yLjEgKi8KLUFWQ0RlY19TdGF0dXMgRGVjb2RlU1BTKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSkKLXsKLSAgICBBVkNEZWNfU3RhdHVzIHN0YXR1cyA9IEFWQ0RFQ19TVUNDRVNTOwotICAgIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbTsKLSAgICB1aW50IHRlbXA7Ci0gICAgaW50IGk7Ci0gICAgdWludCBwcm9maWxlX2lkYywgY29uc3RyYWluZWRfc2V0MF9mbGFnLCBjb25zdHJhaW5lZF9zZXQxX2ZsYWcsIGNvbnN0cmFpbmVkX3NldDJfZmxhZzsKLSAgICB1aW50IGxldmVsX2lkYywgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgdm9pZCAqdXNlckRhdGEgPSBkZWN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGE7Ci0gICAgQVZDSGFuZGxlICphdmNIYW5kbGUgPSBkZWN2aWQtPmF2Y0hhbmRsZTsKLQotICAgIERFQlVHX0xPRyh1c2VyRGF0YSwgQVZDX0xPR1RZUEVfSU5GTywgIkRlY29kZVNQUyIsIC0xLCAtMSk7Ci0KLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICZwcm9maWxlX2lkYyk7Ci0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmY29uc3RyYWluZWRfc2V0MF9mbGFnKTsKLS8vICBpZiAocHJvZmlsZV9pZGMgIT0gNjYgJiYgY29uc3RyYWluZWRfc2V0MF9mbGFnICE9IDEpCi0vLyAgewotLy8gICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0vLyAgfQotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJmNvbnN0cmFpbmVkX3NldDFfZmxhZyk7Ci0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmY29uc3RyYWluZWRfc2V0Ml9mbGFnKTsKLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDUsICZ0ZW1wKTsKLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICZsZXZlbF9pZGMpOwotICAgIGlmIChsZXZlbF9pZGMgPiA1MSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0gICAgaWYgKG1hcExldjJJZHhbbGV2ZWxfaWRjXSA9PSAyNTUpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotICAgIHVlX3Yoc3RyZWFtLCAmc2VxX3BhcmFtZXRlcl9zZXRfaWQpOwotCi0gICAgaWYgKHNlcV9wYXJhbWV0ZXJfc2V0X2lkID4gMzEpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgc2VxdWVuY2UgcGFyYW0gc2V0IGZvciBzZXFQYXJhbXNbc2VxX3BhcmFtZXRlcl9zZXRfaWRdLiAqLwotICAgIGlmIChkZWN2aWQtPnNlcVBhcmFtc1tzZXFfcGFyYW1ldGVyX3NldF9pZF0gPT0gTlVMTCkgIC8qIGFsbG9jYXRlIHNlcVBhcmFtc1tpZF0gKi8KLSAgICB7Ci0gICAgICAgIGRlY3ZpZC0+c2VxUGFyYW1zW3NlcV9wYXJhbWV0ZXJfc2V0X2lkXSA9Ci0gICAgICAgICAgICAoQVZDU2VxUGFyYW1TZXQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1NlcVBhcmFtU2V0KSwgREVGQVVMVF9BVFRSKTsKLQotICAgICAgICBpZiAoZGVjdmlkLT5zZXFQYXJhbXNbc2VxX3BhcmFtZXRlcl9zZXRfaWRdID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfTUVNT1JZX0ZBSUw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBERUJVR19MT0codXNlckRhdGEsIEFWQ19MT0dUWVBFX0lORk8sICJkb25lIGFsbG9jIHNlcVBhcmFtcyIsIC0xLCAtMSk7Ci0KLSAgICBzZXFQYXJhbSA9IGRlY3ZpZC0+c2VxUGFyYW1zW3NlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKLQotICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IHByb2ZpbGVfaWRjOwotICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWcgPSBjb25zdHJhaW5lZF9zZXQwX2ZsYWc7Ci0gICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyA9IGNvbnN0cmFpbmVkX3NldDFfZmxhZzsKLSAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnID0gY29uc3RyYWluZWRfc2V0Ml9mbGFnOwotICAgIHNlcVBhcmFtLT5sZXZlbF9pZGMgPSBsZXZlbF9pZGM7Ci0gICAgc2VxUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0KLSAgICAvKiBjb250aW51ZSBkZWNvZGluZyBTUFMgKi8KLSAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCkpOwotCi0gICAgaWYgKHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID4gMTIpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgdWVfdihzdHJlYW0sICYoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSkpOwotCi0gICAgREVCVUdfTE9HKHVzZXJEYXRhLCBBVkNfTE9HVFlQRV9JTkZPLCAiY2hlY2sgcG9pbnQgMSIsIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0LCBzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlKTsKLQotICAgIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDApCi0gICAgewotICAgICAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICB7ICAgICAgICAgICAgICAgLy8gTUNfQ0hFQ0sKLSAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAodWludCopJihzZXFQYXJhbS0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpKTsKLSAgICAgICAgc2VfdjMyYml0KHN0cmVhbSwgJihzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYykpOwotICAgICAgICBzZV92MzJiaXQoc3RyZWFtLCAmKHNlcVBhcmFtLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQpKTsKLSAgICAgICAgdWVfdihzdHJlYW0sICYoc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlX3YzMmJpdChzdHJlYW0sICYoc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMpKTsKLQotICAgIGlmIChzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgPiAxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICBERUJVR19MT0codXNlckRhdGEsIEFWQ19MT0dUWVBFX0lORk8sICJjaGVjayBwb2ludCAyIiwgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzLCAtMSk7Ci0KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICh1aW50KikmKHNlcVBhcmFtLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcpKTsKLSAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+cGljX3dpZHRoX2luX21ic19taW51czEpKTsKLQotICAgIERFQlVHX0xPRyh1c2VyRGF0YSwgQVZDX0xPR1RZUEVfSU5GTywgInBpY3dpZHRoIiwgc2VxUGFyYW0tPnBpY193aWR0aF9pbl9tYnNfbWludXMxLCAtMSk7Ci0KLSAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxKSk7Ci0KLSAgICBERUJVR19MT0codXNlckRhdGEsIEFWQ19MT0dUWVBFX0lORk8sICJwaWN3aWR0aCIsIHNlcVBhcmFtLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEsIC0xKTsKLQotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgKHVpbnQqKSYoc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcpKTsKLQotICAgIHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMDsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgIGlmICghc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICh1aW50KikmKHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnKSk7Ci0gICAgfQotCi0gICAgREVCVUdfTE9HKHVzZXJEYXRhLCBBVkNfTE9HVFlQRV9JTkZPLCAiY2hlY2sgcG9pbnQgMyIsIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnLCAtMSk7Ci0KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICh1aW50KikmKHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKSk7Ci0KLSAgICBERUJVR19MT0codXNlckRhdGEsIEFWQ19MT0dUWVBFX0lORk8sICJjaGVjayBwb2ludCA0Iiwgc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcsIC0xKTsKLQotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgKHVpbnQqKSYoc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpKTsKLSAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7ICAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7LyogZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSAwOy8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBpZiAoc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCi0gICAgewotICAgICAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCkpOwotICAgICAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpKTsKLSAgICAgICAgdWVfdihzdHJlYW0sICYoc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCkpOwotICAgICAgICB1ZV92KHN0cmVhbSwgJihzZXFQYXJhbS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSk7Ci0gICAgfQotCi0gICAgREVCVUdfTE9HKHVzZXJEYXRhLCBBVkNfTE9HVFlQRV9JTkZPLCAiY2hlY2sgcG9pbnQgNSIsIHNlcVBhcmFtLT5mcmFtZV9jcm9wcGluZ19mbGFnLCAtMSk7Ci0KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICh1aW50KikmKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpKTsKLSAgICBpZiAoc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IHZ1aV9wYXJhbWV0ZXJzKGRlY3ZpZCwgc3RyZWFtLCBzZXFQYXJhbSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotQVZDRGVjX1N0YXR1cyB2dWlfcGFyYW1ldGVycyhBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTKQotewotICAgIHVpbnQgdGVtcDsKLSAgICB1aW50IHRlbXAzMjsKLSAgICB1aW50IGFzcGVjdF9yYXRpb19pZGMsIG92ZXJzY2FuX2FwcG9wcmlhdGVfZmxhZywgdmlkZW9fZm9ybWF0LCB2aWRlb19mdWxsX3JhbmdlX2ZsYWc7Ci0gICAgLyogYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnICovCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgaWYgKHRlbXApCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICZhc3BlY3RfcmF0aW9faWRjKTsKLSAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gMjU1KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzYXJfd2lkdGggKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgMTYsICZ0ZW1wKTsKLSAgICAgICAgICAgIC8qIHNhcl9oZWlnaHQgKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgMTYsICZ0ZW1wKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBvdmVyc2Nhbl9pbmZvX3ByZXNlbnQgKi8KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJm92ZXJzY2FuX2FwcG9wcmlhdGVfZmxhZyk7Ci0gICAgfQotICAgIC8qIHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZyAqLwotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgIGlmICh0ZW1wKQotICAgIHsKLSAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCAzLCAmdmlkZW9fZm9ybWF0KTsKLSAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdmlkZW9fZnVsbF9yYW5nZV9mbGFnKTsKLSAgICAgICAgLyogY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgaWYgKHRlbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbG91cl9wcmltYXJpZXMgKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgJnRlbXApOwotICAgICAgICAgICAgLyogdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICovCi0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICZ0ZW1wKTsKLSAgICAgICAgICAgIC8qIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgJnRlbXApOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qICBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnICovCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgaWYgKHRlbXApCi0gICAgewotICAgICAgICAvKiAgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQgKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgLyogIGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkICovCi0gICAgICAgIHVlX3Yoc3RyZWFtLCAmdGVtcCk7Ci0gICAgfQotCi0gICAgLyogIHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyovCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgaWYgKHRlbXApCi0gICAgewotICAgICAgICAvKiAgbnVtX3VuaXRfaW5fdGljayovCi0gICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgMzIsICZ0ZW1wMzIpOwotICAgICAgICAvKiAgdGltZV9zY2FsZSAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDMyLCAmdGVtcDMyKTsKLSAgICAgICAgLyogIGZpeGVkX2ZyYW1lX3JhdGVfZmxhZyAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICB9Ci0KLSAgICAvKiAgbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAqLwotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSB0ZW1wOwotICAgIGlmICh0ZW1wKQotICAgIHsKLSAgICAgICAgaHJkX3BhcmFtZXRlcnMoZGVjdmlkLCBzdHJlYW0sICYoY3VyclNQUy0+dnVpX3BhcmFtZXRlcnMubmFsX2hyZF9wYXJhbWV0ZXJzKSk7Ci0gICAgfQotICAgIC8qICB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKi8KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICBjdXJyU1BTLT52dWlfcGFyYW1ldGVycy52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gdGVtcDsKLSAgICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICAgIGhyZF9wYXJhbWV0ZXJzKGRlY3ZpZCwgc3RyZWFtLCAmKGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycykpOwotICAgIH0KLSAgICBpZiAoY3VyclNQUy0+dnVpX3BhcmFtZXRlcnMubmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fCBjdXJyU1BTLT52dWlfcGFyYW1ldGVycy52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQotICAgIHsKLSAgICAgICAgLyogIGxvd19kZWxheV9ocmRfZmxhZyAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICB9Ci0gICAgLyogIHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnICovCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgY3VyclNQUy0+dnVpX3BhcmFtZXRlcnMucGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgPSB0ZW1wOwotICAgIC8qICBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAqLwotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgIGlmICh0ZW1wKQotICAgIHsKLSAgICAgICAgLyogIG1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgLyogIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tICovCi0gICAgICAgIHVlX3Yoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgIC8qICBtYXhfYml0c19wZXJfbWJfZGVub20gKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgLyogIGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsICovCi0gICAgICAgIHVlX3Yoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgIC8qICBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgLyogIG51bV9yZW9yZGVyX2ZyYW1lcyAqLwotICAgICAgICB1ZV92KHN0cmVhbSwgJnRlbXApOwotICAgICAgICAvKiAgbWF4X2RlY19mcmFtZV9idWZmZXJpbmcgKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotQVZDRGVjX1N0YXR1cyBocmRfcGFyYW1ldGVycyhBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIEFWQ0hSRFBhcmFtcyAqSFJEUGFyYW0pCi17Ci0gICAgT1NDTF9VTlVTRURfQVJHKGRlY3ZpZCk7Ci0gICAgdWludCB0ZW1wOwotICAgIHVpbnQgY3BiX2NudF9taW51czE7Ci0gICAgdWludCBpOwotICAgIHVlX3Yoc3RyZWFtLCAmY3BiX2NudF9taW51czEpOwotICAgIEhSRFBhcmFtLT5jcGJfY250X21pbnVzMSA9IGNwYl9jbnRfbWludXMxOwotICAgIC8qICBiaXRfcmF0ZV9zY2FsZSAqLwotICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNCwgJnRlbXApOwotICAgIC8qICBjcGJfc2l6ZV9zY2FsZSAqLwotICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNCwgJnRlbXApOwotICAgIGZvciAoaSA9IDA7IGkgPD0gY3BiX2NudF9taW51czE7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qICBiaXRfcmF0ZV92YWx1ZV9taW51czFbaV0gKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgLyogIGNwYl9zaXplX3ZhbHVlX21pbnVzMVtpXSAqLwotICAgICAgICB1ZV92KHN0cmVhbSwgJnRlbXApOwotICAgICAgICAvKiAgY2JyX2ZsYWdbaV0gKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICB9Ci0gICAgLyogIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSAqLwotICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNSwgJnRlbXApOwotICAgIC8qICBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICovCi0gICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA1LCAmdGVtcCk7Ci0gICAgSFJEUGFyYW0tPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgPSB0ZW1wOwotICAgIC8qICBkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKi8KLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDUsICZ0ZW1wKTsKLSAgICBIUkRQYXJhbS0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxID0gdGVtcDsKLSAgICAvKiAgdGltZV9vZmZzZXRfbGVuZ3RoICAqLwotICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNSwgJnRlbXApOwotICAgIEhSRFBhcmFtLT50aW1lX29mZnNldF9sZW5ndGggPSB0ZW1wOwotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotCi0vKiogc2VlIHN1YmNsYXVzZSA3LjQuMi4yICovCi1BVkNEZWNfU3RhdHVzIERlY29kZVBQUyhBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtOwotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotICAgIGludCBpLCBpR3JvdXAsIG51bUJpdHM7Ci0gICAgaW50IFBpY1dpZHRoSW5NYnMsIFBpY0hlaWdodEluTWFwVW5pdHMsIFBpY1NpemVJbk1hcFVuaXRzOwotICAgIHVpbnQgcGljX3BhcmFtZXRlcl9zZXRfaWQsIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIHZvaWQgKnVzZXJEYXRhID0gZGVjdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhOwotICAgIEFWQ0hhbmRsZSAqYXZjSGFuZGxlID0gZGVjdmlkLT5hdmNIYW5kbGU7Ci0KLSAgICB1ZV92KHN0cmVhbSwgJnBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLSAgICBpZiAocGljX3BhcmFtZXRlcl9zZXRfaWQgPiAyNTUpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgdWVfdihzdHJlYW0sICZzZXFfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICBpZiAoc2VxX3BhcmFtZXRlcl9zZXRfaWQgPiAzMSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiAyLjEgaWYgcGljUGFyYW1zW3BpY19wYXJhbV9zZXRfaWRdIGlzIE5VTEwsIGFsbG9jYXRlIGl0LiAqLwotICAgIGlmIChkZWN2aWQtPnBpY1BhcmFtc1twaWNfcGFyYW1ldGVyX3NldF9pZF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRlY3ZpZC0+cGljUGFyYW1zW3BpY19wYXJhbWV0ZXJfc2V0X2lkXSA9Ci0gICAgICAgICAgICAoQVZDUGljUGFyYW1TZXQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDUGljUGFyYW1TZXQpLCBERUZBVUxUX0FUVFIpOwotICAgICAgICBpZiAoZGVjdmlkLT5waWNQYXJhbXNbcGljX3BhcmFtZXRlcl9zZXRfaWRdID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfTUVNT1JZX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWN2aWQtPnBpY1BhcmFtc1twaWNfcGFyYW1ldGVyX3NldF9pZF0tPnNsaWNlX2dyb3VwX2lkID0gTlVMTDsKLSAgICB9Ci0KLSAgICB2aWRlby0+Y3VyclBpY1BhcmFtcyA9IHBpY1BhcmFtID0gZGVjdmlkLT5waWNQYXJhbXNbcGljX3BhcmFtZXRlcl9zZXRfaWRdOwotICAgIHBpY1BhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIHBpY1BhcmFtLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAodWludCopJihwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnKSk7Ci0gICAgaWYgKHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBVkNERUNfRkFJTDsKLSAgICAgICAgZ290byBjbGVhbl91cDsKLSAgICB9Ci0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAodWludCopJihwaWNQYXJhbS0+cGljX29yZGVyX3ByZXNlbnRfZmxhZykpOwotICAgIHVlX3Yoc3RyZWFtLCAmKHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSkpOwotCi0gICAgaWYgKHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IE1BWF9OVU1fU0xJQ0VfR1JPVVAgLSAxKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQVZDREVDX0ZBSUw7Ci0gICAgICAgIGdvdG8gY2xlYW5fdXA7Ci0gICAgfQotCi0gICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9IDA7IC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKLSAgICB7Ci0gICAgICAgIHVlX3Yoc3RyZWFtLCAmKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSkpOwotICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDw9IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1ZV92KHN0cmVhbSwgJihwaWNQYXJhbS0+cnVuX2xlbmd0aF9taW51czFbaUdyb3VwXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAyKQotICAgICAgICB7ICAgLy8gTUNfQ0hFQ0sgIDw9IG9yIDwKLSAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDwgKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlHcm91cCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCAmKHBpY1BhcmFtLT50b3BfbGVmdFtpR3JvdXBdKSk7Ci0gICAgICAgICAgICAgICAgdWVfdihzdHJlYW0sICYocGljUGFyYW0tPmJvdHRvbV9yaWdodFtpR3JvdXBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDMgfHwKLSAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDQgfHwKLSAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgKHVpbnQqKSYocGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZykpOwotICAgICAgICAgICAgdWVfdihzdHJlYW0sICYocGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA2KQotICAgICAgICB7Ci0gICAgICAgICAgICB1ZV92KHN0cmVhbSwgJihwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSkpOwotCi0gICAgICAgICAgICBudW1CaXRzID0gMDsvKiBjZWlsKGxvZzIobnVtX3NsaWNlX2dyb3Vwc19taW51czErMSkpIGJpdHMgKi8KLSAgICAgICAgICAgIGkgPSBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7Ci0gICAgICAgICAgICB3aGlsZSAoaSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbnVtQml0cysrOwotICAgICAgICAgICAgICAgIGkgPj49IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkgPSBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgICAgICAgICBpZiAoZGVjdmlkLT5zZXFQYXJhbXNbaV0gPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFuX3VwOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFBpY1dpZHRoSW5NYnMgPSBkZWN2aWQtPnNlcVBhcmFtc1tpXS0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxOwotICAgICAgICAgICAgUGljSGVpZ2h0SW5NYXBVbml0cyA9IGRlY3ZpZC0+c2VxUGFyYW1zW2ldLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxIDsKLSAgICAgICAgICAgIFBpY1NpemVJbk1hcFVuaXRzID0gUGljV2lkdGhJbk1icyAqIFBpY0hlaWdodEluTWFwVW5pdHMgOwotCi0gICAgICAgICAgICAvKiBpbmZvcm1hdGlvbiBoYXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBzZXFfcGFyYW0gKi8KLSAgICAgICAgICAgIGlmICgoaW50KXBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxICE9IFBpY1NpemVJbk1hcFVuaXRzIC0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFuX3VwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID0gKHVpbnQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YodWludCkgKiBQaWNTaXplSW5NYXBVbml0cywgREVGQVVMVF9BVFRSKTsKLSAgICAgICAgICAgIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAgQVZDREVDX01FTU9SWV9GQUlMOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW5fdXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQaWNTaXplSW5NYXBVbml0czsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgbnVtQml0cywgJihwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWRbaV0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgdWVfdihzdHJlYW0sICYocGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEpKTsKLSAgICBpZiAocGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAzMSkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEFWQ0RFQ19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZ290byBjbGVhbl91cDsKLSAgICB9Ci0KLSAgICB1ZV92KHN0cmVhbSwgJihwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSkpOwotICAgIGlmIChwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA+IDMxKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQVZDREVDX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLwotICAgICAgICBnb3RvIGNsZWFuX3VwOwotICAgIH0KLQotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgKHVpbnQqKSYocGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZykpOwotICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgMiwgJihwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYykpOwotICAgIGlmIChwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA+IDIpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBVkNERUNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCi0gICAgICAgIGdvdG8gY2xlYW5fdXA7Ci0gICAgfQotCi0gICAgc2VfdihzdHJlYW0sICYocGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYpKTsKLSAgICBpZiAocGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPCAtMjYgfHwgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPiAyNSkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEFWQ0RFQ19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZ290byBjbGVhbl91cDsKLSAgICB9Ci0KLSAgICBzZV92KHN0cmVhbSwgJihwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNikpOwotICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA+IDI1KQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQVZDREVDX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLwotICAgICAgICBnb3RvIGNsZWFuX3VwOwotICAgIH0KLQotICAgIHNlX3Yoc3RyZWFtLCAmKHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KSk7Ci0gICAgaWYgKHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IDwgLTEyIHx8IHBpY1BhcmFtLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID4gMTIpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBBVkNERUNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCi0gICAgICAgIHN0YXR1cyA9IEFWQ0RFQ19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZ290byBjbGVhbl91cDsKLSAgICB9Ci0KLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDMsICZwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0gICAgcGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0gcGljX3BhcmFtZXRlcl9zZXRfaWQgPj4gMjsKLSAgICBwaWNQYXJhbS0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gKHBpY19wYXJhbWV0ZXJfc2V0X2lkID4+IDEpICYgMTsKLSAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gcGljX3BhcmFtZXRlcl9zZXRfaWQgJiAxOwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotY2xlYW5fdXA6Ci0gICAgaWYgKGRlY3ZpZC0+cGljUGFyYW1zW3BpY19wYXJhbWV0ZXJfc2V0X2lkXSkKLSAgICB7Ci0gICAgICAgIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludClwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQpOwotICAgICAgICB9Ci0gICAgICAgIGRlY3ZpZC0+cGljUGFyYW1zW3BpY19wYXJhbWV0ZXJfc2V0X2lkXS0+c2xpY2VfZ3JvdXBfaWQgPSBOVUxMOwotICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZGVjdmlkLT5waWNQYXJhbXNbcGljX3BhcmFtZXRlcl9zZXRfaWRdKTsKLSAgICAgICAgZGVjdmlkLT5waWNQYXJhbXNbcGljX3BhcmFtZXRlcl9zZXRfaWRdID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0KLS8qIEZpcnN0UGFydE9mU2xpY2VIZWFkZXIoKTsKLSAgICBSZXN0T2ZTbGljZUhlYWRlcigpICovCi0vKiogc2VlIHN1YmNsYXVzZSA3LjQuMyAqLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVTbGljZUhlYWRlcihBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOwotICAgIEFWQ1BpY1BhcmFtU2V0ICpjdXJyUFBTOwotICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTOwotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotICAgIHVpbnQgaWRyX3BpY19pZDsKLSAgICBpbnQgc2xpY2VfdHlwZSwgdGVtcCwgaTsKLQotICAgIHVlX3Yoc3RyZWFtLCAmKHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZSkpOwotICAgIHVlX3Yoc3RyZWFtLCAodWludCopJnNsaWNlX3R5cGUpOwotCi0gICAgaWYgKHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZSAhPSAwKQotICAgIHsKLSAgICAgICAgaWYgKChpbnQpc2xpY2VIZHItPnNsaWNlX3R5cGUgPj0gNSAmJiBzbGljZV90eXBlICE9IChpbnQpc2xpY2VIZHItPnNsaWNlX3R5cGUgLSA1KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIHNsaWNlIHR5cGUgZG9lc24ndCBmb2xsb3cgdGhlIGZpcnN0IHNsaWNlIGluIHRoZSBwaWN0dXJlICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgc2xpY2VIZHItPnNsaWNlX3R5cGUgPSAoQVZDU2xpY2VUeXBlKSBzbGljZV90eXBlOwotICAgIGlmIChzbGljZV90eXBlID4gNCkKLSAgICB7Ci0gICAgICAgIHNsaWNlX3R5cGUgLT0gNTsKLSAgICB9Ci0KLSAgICBpZiAoc2xpY2VfdHlwZSA9PSAxIHx8IHNsaWNlX3R5cGUgPiAyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgIH0KLQotICAgIHZpZGVvLT5zbGljZV90eXBlID0gKEFWQ1NsaWNlVHlwZSkgc2xpY2VfdHlwZTsKLQotICAgIHVlX3Yoc3RyZWFtLCAmKHNsaWNlSGRyLT5waWNfcGFyYW1ldGVyX3NldF9pZCkpOwotICAgIC8qIGVuZCBGaXJzdFBhcnRTbGljZUhlYWRlcigpICovCi0gICAgLyogYmVnaW4gUmVzdE9mU2xpY2VIZWFkZXIoKSAqLwotICAgIC8qIGFmdGVyIGdldHRpbmcgcGljX3BhcmFtZXRlcl9zZXRfaWQsIHdlIGhhdmUgdG8gbG9hZCBjb3JyZXNwb25kaW5nIFNQUyBhbmQgUFBTICovCi0gICAgaWYgKHNsaWNlSGRyLT5waWNfcGFyYW1ldGVyX3NldF9pZCA+IDI1NSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICBpZiAoZGVjdmlkLT5waWNQYXJhbXNbc2xpY2VIZHItPnBpY19wYXJhbWV0ZXJfc2V0X2lkXSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIFBQUyBkb2Vzbid0IGV4aXN0ICovCi0KLSAgICBjdXJyUFBTID0gdmlkZW8tPmN1cnJQaWNQYXJhbXMgPSBkZWN2aWQtPnBpY1BhcmFtc1tzbGljZUhkci0+cGljX3BhcmFtZXRlcl9zZXRfaWRdOwotCi0gICAgaWYgKGRlY3ZpZC0+c2VxUGFyYW1zW2N1cnJQUFMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkXSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIFNQUyBkb2Vzbid0IGV4aXN0ICovCi0KLSAgICBjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXMgPSBkZWN2aWQtPnNlcVBhcmFtc1tjdXJyUFBTLT5zZXFfcGFyYW1ldGVyX3NldF9pZF07Ci0KLSAgICBpZiAoY3VyclBQUy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgIT0gdmlkZW8tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKQotICAgIHsKLSAgICAgICAgdmlkZW8tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gY3VyclBQUy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgICAgIHN0YXR1cyA9IChBVkNEZWNfU3RhdHVzKUFWQ0NvbmZpZ3VyZVNlcXVlbmNlKGRlY3ZpZC0+YXZjSGFuZGxlLCB2aWRlbywgZmFsc2UpOwotICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgdmlkZW8tPmxldmVsX2lkYyA9IGN1cnJTUFMtPmxldmVsX2lkYzsKLSAgICB9Ci0KLSAgICAvKiBkZXJpdmVkIHZhcmlhYmxlcyBmcm9tIFNQUyAqLwotICAgIHZpZGVvLT5NYXhGcmFtZU51bSA9IDEgPDwgKGN1cnJTUFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLSAgICAvLyBNQ19PUFRJTUlaRQotICAgIHZpZGVvLT5QaWNXaWR0aEluTWJzID0gY3VyclNQUy0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxOwotICAgIHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIDE2IDsKLSAgICB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNDID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiA4IDsKLSAgICB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA9IGN1cnJTUFMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEgOwotICAgIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyA9IHZpZGVvLT5QaWNXaWR0aEluTWJzICogdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgOwotICAgIHZpZGVvLT5GcmFtZUhlaWdodEluTWJzID0gKDIgLSBjdXJyU1BTLT5mcmFtZV9tYnNfb25seV9mbGFnKSAqIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzIDsKLQotICAgIC8qIGRlcml2ZWQgZnJvbSBQUFMgKi8KLSAgICB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUgPSBjdXJyUFBTLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgKyAxOwotCi0gICAgLyogdGhlbiB3ZSBjYW4gY29udGludWUgZGVjb2Rpbmcgc2xpY2UgaGVhZGVyICovCi0KLSAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0LCAmKHNsaWNlSGRyLT5mcmFtZV9udW0pKTsKLQotICAgIGlmICh2aWRlby0+Y3VyckZTID09IE5VTEwgJiYgc2xpY2VIZHItPmZyYW1lX251bSAhPSAwKQotICAgIHsKLSAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPSBzbGljZUhkci0+ZnJhbWVfbnVtIC0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWN1cnJTUFMtPmZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICYoc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKSk7Ci0gICAgICAgIGlmIChzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGRlcml2ZWQgdmFyaWFibGVzIGZyb20gc2xpY2UgaGVhZGVyKi8KLSAgICB2aWRlby0+UGljSGVpZ2h0SW5NYnMgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1iczsKLSAgICB2aWRlby0+UGljSGVpZ2h0SW5TYW1wbGVzTCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1icyAqIDE2OwotICAgIHZpZGVvLT5QaWNIZWlnaHRJblNhbXBsZXNDID0gdmlkZW8tPlBpY0hlaWdodEluTWJzICogODsKLSAgICB2aWRlby0+UGljU2l6ZUluTWJzID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiB2aWRlby0+UGljSGVpZ2h0SW5NYnM7Ci0KLSAgICBpZiAoc2xpY2VIZHItPmZpcnN0X21iX2luX3NsaWNlID49IHZpZGVvLT5QaWNTaXplSW5NYnMpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotICAgIHZpZGVvLT5NYXhQaWNOdW0gPSB2aWRlby0+TWF4RnJhbWVOdW07Ci0gICAgdmlkZW8tPkN1cnJQaWNOdW0gPSBzbGljZUhkci0+ZnJhbWVfbnVtOwotCi0KLSAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQotICAgIHsKLSAgICAgICAgaWYgKHNsaWNlSGRyLT5mcmFtZV9udW0gIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgICAgICB9Ci0gICAgICAgIHVlX3Yoc3RyZWFtLCAmaWRyX3BpY19pZCk7Ci0gICAgfQotCi0gICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tID0gMDsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0gMDsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgIGlmIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgY3VyclNQUy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJihzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IpKTsKLSAgICAgICAgdmlkZW8tPk1heFBpY09yZGVyQ250THNiID0gIDEgPDwgKGN1cnJTUFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgICAgICBpZiAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiID4gdmlkZW8tPk1heFBpY09yZGVyQ250THNiIC0gMSkKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCi0KLSAgICAgICAgaWYgKGN1cnJQUFMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlX3YzMmJpdChzdHJlYW0sICYoc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxICYmICFjdXJyU1BTLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykKLSAgICB7Ci0gICAgICAgIHNlX3YzMmJpdChzdHJlYW0sICYoc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0pKTsKLSAgICAgICAgaWYgKGN1cnJQUFMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlX3YzMmJpdChzdHJlYW0sICYoc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNsaWNlSGRyLT5yZWR1bmRhbnRfcGljX2NudCA9IDA7IC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBpZiAoY3VyclBQUy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnKQotICAgIHsKLSAgICAgICAgLy8gTUNfQ0hFQ0sKLSAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPnJlZHVuZGFudF9waWNfY250KSk7Ci0gICAgICAgIGlmIChzbGljZUhkci0+cmVkdW5kYW50X3BpY19jbnQgPiAxMjcpIC8qIG91dCBvZiByYW5nZSAqLwotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotCi0gICAgICAgIGlmIChzbGljZUhkci0+cmVkdW5kYW50X3BpY19jbnQgPiAwKSAvKiByZWR1bmRhbnQgcGljdHVyZSAqLwotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOyAvKiBub3Qgc3VwcG9ydGVkICovCi0gICAgfQotICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gY3VyclBQUy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKLSAgICBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IGN1cnJQUFMtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7Ci0KLSAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJihzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpKTsKLSAgICAgICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAvKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBpcyBub3QgYWxsb3dlZCBpZiB0aGUgZmxhZyBpcyB6ZXJvICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkgJiYgY3VyclBQUy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA+IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogbm90IGFsbG93ZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID4gMTUgfHwKLSAgICAgICAgICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID4gMTUpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIG5vdCBhbGxvd2VkICovCi0gICAgfQotICAgIC8qIGlmIE1iYWZmRnJhbWVGbGFnID0xLAotICAgIG1heCB2YWx1ZSBvZiBpbmRleCBpcyBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIGZvciBmcmFtZSBNQnMgYW5kCi0gICAgMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDEgZm9yIGZpZWxkIE1CcyAqLwotCi0gICAgLyogcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoKSAqLwotICAgIHN0YXR1cyA9IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKHZpZGVvLCBzdHJlYW0sIHNsaWNlSGRyLCBzbGljZV90eXBlKTsKLSAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLQotICAgIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgIT0gMCkKLSAgICB7Ci0gICAgICAgIGRlY19yZWZfcGljX21hcmtpbmcodmlkZW8sIHN0cmVhbSwgc2xpY2VIZHIpOwotICAgIH0KLSAgICBzZV92KHN0cmVhbSwgJihzbGljZUhkci0+c2xpY2VfcXBfZGVsdGEpKTsKLQotICAgIHZpZGVvLT5RUHkgPSAyNiArIGN1cnJQUFMtPnBpY19pbml0X3FwX21pbnVzMjYgKyBzbGljZUhkci0+c2xpY2VfcXBfZGVsdGE7Ci0gICAgaWYgKHZpZGVvLT5RUHkgPiA1MSB8fCB2aWRlby0+UVB5IDwgMCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5RUHkgPSBBVkNfQ0xJUDMoMCwgNTEsIHZpZGVvLT5RUHkpOwotLy8gICAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotICAgIHZpZGVvLT5RUGMgPSBtYXBRUGkyUVBjW0FWQ19DTElQMygwLCA1MSwgdmlkZW8tPlFQeSArIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KV07Ci0KLSAgICB2aWRlby0+UVB5X2Rpdl82ID0gKHZpZGVvLT5RUHkgKiA0MykgPj4gODsKLSAgICB2aWRlby0+UVB5X21vZF82ID0gdmlkZW8tPlFQeSAtIDYgKiB2aWRlby0+UVB5X2Rpdl82OwotCi0gICAgdmlkZW8tPlFQY19kaXZfNiA9ICh2aWRlby0+UVBjICogNDMpID4+IDg7Ci0gICAgdmlkZW8tPlFQY19tb2RfNiA9IHZpZGVvLT5RUGMgLSA2ICogdmlkZW8tPlFQY19kaXZfNjsKLQotICAgIHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA9IDA7Ci0gICAgc2xpY2VIZHItPnNsaWNlX2JldGFfb2Zmc2V0X2Rpdl8yID0gMDsKLSAgICBzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgPSAwOwotICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRBID0gdmlkZW8tPkZpbHRlck9mZnNldEIgPSAwOwotCi0gICAgaWYgKGN1cnJQUFMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnKQotICAgIHsKLSAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjKSk7Ci0gICAgICAgIGlmIChzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgPiAyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLwotICAgICAgICB9Ci0gICAgICAgIGlmIChzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgc2VfdihzdHJlYW0sICYoc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyKSk7Ci0gICAgICAgICAgICBpZiAoc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyIDwgLTYgfHwKLSAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyID4gNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+RmlsdGVyT2Zmc2V0QSA9IHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA8PCAxOwotCi0gICAgICAgICAgICBzZV92KHN0cmVhbSwgJihzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIpKTsKLSAgICAgICAgICAgIGlmIChzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIgPCAtNiB8fAotICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIgPiA2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRCID0gc2xpY2VIZHItPnNsaWNlX2JldGFfb2Zmc2V0X2Rpdl8yIDw8IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3VyclBQUy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlID49IDMKLSAgICAgICAgICAgICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlIDw9IDUpCi0gICAgewotICAgICAgICAvKiBDZWlsKExvZzIoUGljU2l6ZUluTWFwVW5pdHMvKGZsb2F0KVNsaWNlR3JvdXBDaGFuZ2VSYXRlICsgMSkpICovCi0gICAgICAgIHRlbXAgPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLyB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGU7Ci0gICAgICAgIGlmICh2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgJSB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXArKzsKLSAgICAgICAgfQotICAgICAgICBpID0gMDsKLSAgICAgICAgdGVtcCsrOwotICAgICAgICB3aGlsZSAodGVtcCkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA+Pj0gMTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgaSwgJihzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlKSk7Ci0gICAgICAgIHZpZGVvLT5NYXBVbml0c0luU2xpY2VHcm91cDAgPQotICAgICAgICAgICAgQVZDX01JTihzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlICogdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlLCB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMpOwotICAgIH0KLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotCi1BVkNEZWNfU3RhdHVzIGZpbGxfZnJhbWVfbnVtX2dhcChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDQ29tbW9uT2JqICp2aWRlbykKLXsKLSAgICBBVkNEZWNfU3RhdHVzIHN0YXR1czsKLSAgICBpbnQgQ3VyckZyYW1lTnVtOwotICAgIGludCBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICBpbnQgdG1wMSA9IHZpZGVvLT5zbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKLSAgICBpbnQgdG1wMiA9IHZpZGVvLT5zbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXTsKLSAgICBpbnQgdG1wMyA9IHZpZGVvLT5DdXJyUGljTnVtOwotICAgIGludCB0bXA0ID0gdmlkZW8tPnNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnOwotICAgIFVudXNlZFNob3J0VGVybUZyYW1lTnVtID0gKHZpZGVvLT5wcmV2RnJhbWVOdW0gKyAxKSAlIHZpZGVvLT5NYXhGcmFtZU51bTsKLSAgICBDdXJyRnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKLQotICAgIHZpZGVvLT5zbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IDA7Ci0gICAgdmlkZW8tPnNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsKLSAgICB3aGlsZSAoQ3VyckZyYW1lTnVtICE9IFVudXNlZFNob3J0VGVybUZyYW1lTnVtKQotICAgIHsKLSAgICAgICAgdmlkZW8tPkN1cnJQaWNOdW0gPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0gPSBVbnVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLQotICAgICAgICBzdGF0dXMgPSAoQVZDRGVjX1N0YXR1cylEUEJJbml0QnVmZmVyKGF2Y0hhbmRsZSwgdmlkZW8pOwotICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKSAgLyogbm8gYnVmZmVyIGF2YWlsYWJsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIERlY29kZVBPQyh2aWRlbyk7Ci0gICAgICAgIERQQkluaXRQaWModmlkZW8sIFVudXNlZFNob3J0VGVybUZyYW1lTnVtKTsKLQotCi0gICAgICAgIHZpZGVvLT5jdXJyRlMtPlBpY09yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OwotICAgICAgICB2aWRlby0+Y3VyckZTLT5GcmFtZU51bSA9IHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtOwotCi0gICAgICAgIC8qIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byB6ZXJvICovCi0gICAgICAgIHZpZGVvLT5jdXJyRlMtPklzT3V0cHV0dGVkID0gMHgwMTsKLSAgICAgICAgdmlkZW8tPmN1cnJGUy0+SXNSZWZlcmVuY2UgPSAzOwotICAgICAgICB2aWRlby0+Y3VyckZTLT5Jc0xvbmdUZXJtID0gMDsKLSAgICAgICAgdmlkZW8tPmN1cnJGUy0+ZnJhbWUuaXNSZWZlcmVuY2UgPSBUUlVFOwotICAgICAgICB2aWRlby0+Y3VyckZTLT5mcmFtZS5pc0xvbmdUZXJtID0gRkFMU0U7Ci0KLSAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnID0gMDsKLQotICAgICAgICBzdGF0dXMgPSAoQVZDRGVjX1N0YXR1cylTdG9yZVBpY3R1cmVJbkRQQihhdmNIYW5kbGUsIHZpZGVvKTsgIC8vIE1DX0NIRUNLIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzCi0gICAgICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gVW51c2VkU2hvcnRUZXJtRnJhbWVOdW07Ci0gICAgICAgIFVudXNlZFNob3J0VGVybUZyYW1lTnVtID0gKFVudXNlZFNob3J0VGVybUZyYW1lTnVtICsgMSkgJSB2aWRlby0+TWF4RnJhbWVOdW07Ci0gICAgfQotICAgIHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtID0gQ3VyckZyYW1lTnVtOwotICAgIHZpZGVvLT5DdXJyUGljTnVtID0gdG1wMzsKLSAgICB2aWRlby0+c2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPSB0bXAxOwotICAgIHZpZGVvLT5zbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IHRtcDI7Ci0gICAgdmlkZW8tPnNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnID0gdG1wNDsKLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLS8qKiBzZWUgc3ViY2xhdXNlIDcuNC4zLjEgKi8KLUFWQ0RlY19TdGF0dXMgcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciwgaW50IHNsaWNlX3R5cGUpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoc2xpY2VfdHlwZSAhPSBBVkNfSV9TTElDRSkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJihzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMCkpOwotICAgICAgICBpZiAoc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1ZV92KHN0cmVhbSwgJihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0pKTsKLSAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wwW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMFtpXSA+IHZpZGVvLT5NYXhQaWNOdW0gLyAyIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0gPiB2aWRlby0+TWF4UGljTnVtIC8gMiAtIDIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1ZV92KHN0cmVhbSwgJihzbGljZUhkci0+bG9uZ190ZXJtX3BpY19udW1fbDBbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpLTFdICE9IDMKLSAgICAgICAgICAgICAgICAgICAgJiYgaSA8PSAoaW50KXNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICsgMSkgOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyoqIHNlZSBzdWJjbGF1c2UgNy40LjMuMyAqLwotQVZDRGVjX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIpCi17Ci0gICAgaW50IGk7Ci0gICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJihzbGljZUhkci0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZykpOwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICYoc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZykpOwotICAgICAgICBpZiAoc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyA9PSAwKSAvKiB1c2VkIGZvciBzaG9ydC10ZXJtICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5NYXhMb25nVGVybUZyYW1lSWR4ID0gLTE7IC8qIG5vIGxvbmctdGVybSBmcmFtZSBpbmR4ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiB1c2VkIGZvciBsb25nLXRlcm0gKi8KLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPk1heExvbmdUZXJtRnJhbWVJZHggPSAwOwotICAgICAgICAgICAgdmlkZW8tPkxvbmdUZXJtRnJhbWVJZHggPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJihzbGljZUhkci0+YWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZykpOwotICAgICAgICBpZiAoc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1ZV92KHN0cmVhbSwgJihzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0pKTsKLSAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPmRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCAmKHNsaWNlSGRyLT5sb25nX3Rlcm1fcGljX251bVtpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSA2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPmxvbmdfdGVybV9mcmFtZV9pZHhbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdWVfdihzdHJlYW0sICYoc2xpY2VIZHItPm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baS0xXSAhPSAwICYmIGkgPCBNQVhfREVDX1JFRl9QSUNfTUFSS0lORyk7Ci0gICAgICAgICAgICBpZiAoaSA+PSBNQVhfREVDX1JFRl9QSUNfTUFSS0lORykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7IC8qIHdlJ3JlIHNjcmV3ZWQhISwgbm90IGVub3VnaCBtZW1vcnkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogc2VlIHN1YmNsYXVzZSA4LjIuMSBEZWNvZGluZyBwcm9jZXNzIGZvciBwaWN0dXJlIG9yZGVyIGNvdW50LiAqLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVQT0MoQVZDQ29tbW9uT2JqICp2aWRlbykKLXsKLSAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOwotICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKLSAgICBpbnQgaTsKLQotICAgIHN3aXRjaCAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlKQotICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBQT0MgTU9ERSAwICwgc3ViY2xhdXNlIDguMi4xLjEgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiA9IDA7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgTVNCcyBvZiBjdXJyZW50IHBpY3R1cmUgKi8KLSAgICAgICAgICAgIGlmIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgIDwgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgICYmCi0gICAgICAgICAgICAgICAgICAgICh2aWRlby0+cHJldlBpY09yZGVyQ250THNiIC0gc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiKSAgPj0gKHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiAvIDIpKQotICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudE1zYiA9IHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgKyB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgID4gIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgICYmCi0gICAgICAgICAgICAgICAgICAgICAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiIC0gdmlkZW8tPnByZXZQaWNPcmRlckNudExzYikgID4gKHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiAvIDIpKQotICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudE1zYiA9IHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgLSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYjsKLQotICAgICAgICAgICAgLyogSlZULUkwMTAgcGFnZSA4MSBpcyBkaWZmZXJlbnQgZnJvbSBKTTcuMyAqLwotCi0KLSAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250TXNiICsgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOwotICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICBjYXNlIDE6IC8qIFBPQyBNT0RFIDEsIHN1YmNsYXVzZSA4LjIuMS4yICovCi0gICAgICAgICAgICAvKiBjYWxjdWxhdGUgRnJhbWVOdW1PZmZzZXQgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5wcmV2RnJhbWVOdW0gPiBzbGljZUhkci0+ZnJhbWVfbnVtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyB2aWRlby0+TWF4RnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBhYnNGcmFtZU51bSAqLwotICAgICAgICAgICAgaWYgKGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtID0gdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+YWJzRnJhbWVOdW0gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmlkZW8tPmFic0ZyYW1lTnVtID4gMCAmJiB2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+YWJzRnJhbWVOdW0tLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZGVyaXZlIHBpY09yZGVyQ250Q3ljbGVDbnQgYW5kIGZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPmFic0ZyYW1lTnVtID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+cGljT3JkZXJDbnRDeWNsZUNudCA9ICh2aWRlby0+YWJzRnJhbWVOdW0gLSAxKSAvIGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlID0gKHZpZGVvLT5hYnNGcmFtZU51bSAtIDEpICUgY3VyclNQUy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGRlcml2ZSBleHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSAqLwotICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBkZXJpdmUgZXhwZWN0ZWRQaWNPcmRlckNudCAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCA9IHZpZGVvLT5waWNPcmRlckNudEN5Y2xlQ250ICogdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gdmlkZW8tPmZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArPSBjdXJyU1BTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmlkZW8tPm5hbF9yZWZfaWRjID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGRlcml2ZSBUb3BGaWVsZE9yZGVyQ250IGFuZCBCb3R0b21GaWVsZE9yZGVyQ250ICovCi0KLSAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKLSAgICAgICAgICAgIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgKyBjdXJyU1BTLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXTsKLQotICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gQVZDX01JTih2aWRlby0+VG9wRmllbGRPcmRlckNudCwgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQpOwotCi0KLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgY2FzZSAyOiAvKiBQT0MgTU9ERSAyLCBzdWJjbGF1c2UgOC4yLjEuMyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPnByZXZGcmFtZU51bSA+IHNsaWNlSGRyLT5mcmFtZV9udW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCArIHZpZGVvLT5NYXhGcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZGVyaXZlIHRlbXBQaWNPcmRlckNudCwgd2UganVzdCB1c2UgUGljT3JkZXJDbnQgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0KLUFWQ0RlY19TdGF0dXMgRGVjb2RlU0VJKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSkKLXsKLSAgICBPU0NMX1VOVVNFRF9BUkcoZGVjdmlkKTsKLSAgICBPU0NMX1VOVVNFRF9BUkcoc3RyZWFtKTsKLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLUFWQ0RlY19TdGF0dXMgc2VpX3BheWxvYWQoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50IHBheWxvYWRUeXBlLCB1aW50IHBheWxvYWRTaXplKQotewotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzID0gQVZDREVDX1NVQ0NFU1M7Ci0gICAgdWludCBpOwotICAgIHN3aXRjaCAocGF5bG9hZFR5cGUpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAvKiAgYnVmZmVyaW5nIHBlcmlvZCBTRUkgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IGJ1ZmZlcmluZ19wZXJpb2QoZGVjdmlkLCBzdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIC8qICBwaWN0dXJlIHRpbWluZyBTRUkgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IHBpY190aW1pbmcoZGVjdmlkLCBzdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLQotICAgICAgICBjYXNlIDM6Ci0KLSAgICAgICAgY2FzZSA0OgotCi0gICAgICAgIGNhc2UgNToKLQotICAgICAgICBjYXNlIDg6Ci0KLSAgICAgICAgY2FzZSA5OgotCi0gICAgICAgIGNhc2UgMTA6Ci0KLSAgICAgICAgY2FzZSAxMToKLQotICAgICAgICBjYXNlIDEyOgotCi0gICAgICAgIGNhc2UgMTM6Ci0KLSAgICAgICAgY2FzZSAxNDoKLQotICAgICAgICBjYXNlIDE1OgotCi0gICAgICAgIGNhc2UgMTY6Ci0KLSAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIC8qICAgICAgcmVjb3ZlcnkgcG9pbnQgU0VJICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc3RhdHVzID0gcmVjb3ZlcnlfcG9pbnQoZGVjdmlkLCBzdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIC8qICAgICAgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHJlcGV0aXRpb24gU0VJICovCi0gICAgICAgICAgICBzdGF0dXMgPSBkZWNfcmVmX3BpY19tYXJraW5nX3JlcGV0aXRpb24oZGVjdmlkLCBzdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgIC8qICAgICAgbW90aW9uLWNvbnN0cmFpbmVkIHNsaWNlIGdyb3VwIHNldCBTRUkgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IG1vdGlvbl9jb25zdHJhaW5lZF9zbGljZV9ncm91cF9zZXQoZGVjdmlkLCBzdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiAgICAgICAgICByZXNlcnZlZF9zZWlfbWVzc2FnZSAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRTaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQml0c3RyZWFtQnl0ZUFsaWduKHN0cmVhbSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotQVZDRGVjX1N0YXR1cyBidWZmZXJpbmdfcGVyaW9kKEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSkKLXsKLSAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUzsKLSAgICB1aW50IHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIHVpbnQgdGVtcDsKLSAgICB1aW50IGk7Ci0gICAgdWVfdihzdHJlYW0sICZzZXFfcGFyYW1ldGVyX3NldF9pZCk7Ci0gICAgaWYgKHNlcV9wYXJhbWV0ZXJfc2V0X2lkID4gMzEpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0vLyAgZGVjdmlkLT5jb21tb24tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0KLSAgICBjdXJyU1BTID0gZGVjdmlkLT5zZXFQYXJhbXNbc2VxX3BhcmFtZXRlcl9zZXRfaWRdOwotICAgIGlmIChjdXJyU1BTLT52dWlfcGFyYW1ldGVycy5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyU1BTLT52dWlfcGFyYW1ldGVycy5uYWxfaHJkX3BhcmFtZXRlcnMuY3BiX2NudF9taW51czE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheVtpXSAqLwotICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCBjdXJyU1BTLT52dWlfcGFyYW1ldGVycy5uYWxfaHJkX3BhcmFtZXRlcnMuY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEsICZ0ZW1wKTsKLSAgICAgICAgICAgIC8qaW5pdGlhbCBfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0W2ldICovCi0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVycy5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSwgJnRlbXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycy5jcGJfY250X21pbnVzMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5W2ldICovCi0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycy5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSwgJnRlbXApOwotICAgICAgICAgICAgLyppbml0aWFsIF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXRbaV0gKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgY3VyclNQUy0+dnVpX3BhcmFtZXRlcnMudmNsX2hyZF9wYXJhbWV0ZXJzLmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgKyAxLCAmdGVtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci1BVkNEZWNfU3RhdHVzIHBpY190aW1pbmcoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKQotewotICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTOwotICAgIHVpbnQgdGVtcCwgTnVtQ2xvY2tUcyA9IDAsIHRpbWVfb2Zmc2V0X2xlbmd0aCA9IDI0LCBmdWxsX3RpbWVzdGFtcF9mbGFnOwotICAgIHVpbnQgaTsKLQotICAgIGN1cnJTUFMgPSBkZWN2aWQtPnNlcVBhcmFtc1tkZWN2aWQtPmNvbW1vbi0+c2VxX3BhcmFtZXRlcl9zZXRfaWRdOwotCi0gICAgaWYgKGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVycy5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSwgJnRlbXApOwotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVycy5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxLCAmdGVtcCk7Ci0gICAgICAgIHRpbWVfb2Zmc2V0X2xlbmd0aCA9IGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLm5hbF9ocmRfcGFyYW1ldGVycy50aW1lX29mZnNldF9sZW5ndGg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycy5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSwgJnRlbXApOwotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycy5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxLCAmdGVtcCk7Ci0gICAgICAgIHRpbWVfb2Zmc2V0X2xlbmd0aCA9IGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnZjbF9ocmRfcGFyYW1ldGVycy50aW1lX29mZnNldF9sZW5ndGg7Ci0gICAgfQotCi0gICAgaWYgKGN1cnJTUFMtPnZ1aV9wYXJhbWV0ZXJzLnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKQotICAgIHsKLSAgICAgICAgLyogcGljX3N0cnVjdCAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDQsICZ0ZW1wKTsKLQotICAgICAgICBzd2l0Y2ggKHRlbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBOdW1DbG9ja1RzID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICBOdW1DbG9ja1RzID0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBOdW1DbG9ja1RzID0gMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTnVtQ2xvY2tUcyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtQ2xvY2tUczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjbG9ja190aW1lc3RhbXBfZmxhZ1tpXSAqLwotICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgICAgICBpZiAodGVtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjdF90eXBlICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCAyLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgLyogbnVpdF9maWVsZF9iYXNlZF9mbGFnICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgLyogY291bnRpbmdfdHlwZSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDUsICZ0ZW1wKTsKLSAgICAgICAgICAgICAgICAvKiBmdWxsX3RpbWVzdGFtcF9mbGFnICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgZnVsbF90aW1lc3RhbXBfZmxhZyA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgLyogZGlzY29udGludWl0eV9mbGFnICovCi0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgLyogY250X2Ryb3BwZWRfZmxhZyAqLwotICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgICAgICAgICAgICAgIC8qIG5fZnJhbWVzICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgJnRlbXApOwotCi0KLSAgICAgICAgICAgICAgICBpZiAoZnVsbF90aW1lc3RhbXBfZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZHNfdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA2LCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIG1pbnV0ZXNfdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA2LCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvdXJzX3ZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNSwgJnRlbXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmRzX2ZsYWcgICovCi0gICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kc192YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA2LCAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW51dGVzX2ZsYWcgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbnV0ZXNfdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDYsICZ0ZW1wKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvdXJzc19mbGFnICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3Vyc192YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDUsICZ0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0aW1lX29mZnNldF9sZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiB0aW1lX29mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIHRpbWVfb2Zmc2V0X2xlbmd0aCwgJnRlbXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiB0aW1lX29mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotQVZDRGVjX1N0YXR1cyByZWNvdmVyeV9wb2ludChBVkNEZWNPYmplY3QgKmRlY3ZpZCwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgT1NDTF9VTlVTRURfQVJHKGRlY3ZpZCk7Ci0gICAgdWludCB0ZW1wOwotICAgIC8qIHJlY292ZXJfZnJhbWVfY250ICovCi0gICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICAvKiBleGFjdF9tYXRjaF9mbGFnICovCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoc3RyZWFtLCAmdGVtcCk7Ci0gICAgLyogYnJva2VuX2xpbmtfZmxhZyAqLwotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgIC8qIGNoYW5naW5nIHNsaWNfZ3JvdXBfaWRjICovCi0gICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCAyLCAmdGVtcCk7Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotQVZDRGVjX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nX3JlcGV0aXRpb24oQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKQotewotICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTOwotICAgIHVpbnQgdGVtcDsKLSAgICBjdXJyU1BTID0gZGVjdmlkLT5zZXFQYXJhbXNbZGVjdmlkLT5jb21tb24tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKLSAgICAvKiBvcmlnaW5hbF9pZHJfZmxhZyAqLwotICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgIC8qIG9yaWdpbmFsX2ZyYW1lX251bSAqLwotICAgIHVlX3Yoc3RyZWFtLCAmdGVtcCk7Ci0gICAgaWYgKGN1cnJTUFMtPmZyYW1lX21ic19vbmx5X2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIG9yaWdpbmFsX2ZpZWxkX3BpY19mbGFnICovCi0gICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgICAgICBpZiAodGVtcCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogb3JpZ2luYWxfYm90dG9tX2ZpZWxkX2ZsYWcgKi8KLSAgICAgICAgICAgIEJpdHN0cmVhbVJlYWQxQml0KHN0cmVhbSwgJnRlbXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogIGRlY19yZWZfcGljX21hcmtpbmcodmlkZW8sc3RyZWFtLHNsaWNlSGRyKTsgKi8KLQotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotQVZDRGVjX1N0YXR1cyBtb3Rpb25fY29uc3RyYWluZWRfc2xpY2VfZ3JvdXBfc2V0KEFWQ0RlY09iamVjdCAqZGVjdmlkLCBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSkKLXsKLSAgICBPU0NMX1VOVVNFRF9BUkcoZGVjdmlkKTsKLSAgICB1aW50IHRlbXAsIGksIG51bUJpdHM7Ci0gICAgLyogbnVtX3NsaWNlX2dyb3Vwc19pbl9zZXRfbWludXMxICovCi0gICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLQotICAgIG51bUJpdHMgPSAwOy8qIGNlaWwobG9nMihudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSsxKSkgYml0cyAqLwotICAgIGkgPSB0ZW1wOwotICAgIHdoaWxlIChpID4gMCkKLSAgICB7Ci0gICAgICAgIG51bUJpdHMrKzsKLSAgICAgICAgaSA+Pj0gMTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8PSB0ZW1wOyBpKyspCi0gICAgewotICAgICAgICAvKiBzbGljZV9ncm91cF9pZCAqLwotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIG51bUJpdHMsICZ0ZW1wKTsKLSAgICB9Ci0gICAgLyogZXhhY3Rfc2FtcGxlX3ZhbHVlX21hdGNoX2ZsYWcgKi8KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICAvKiBwYW5fc2Nhbl9yZWN0X2ZsYWcgKi8KLSAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICZ0ZW1wKTsKLSAgICBpZiAodGVtcCkKLSAgICB7Ci0gICAgICAgIC8qIHBhbl9zY2FuX3JlY3RfaWQgKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZ0ZW1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9pdHJhbnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2l0cmFucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzU1MGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL2l0cmFucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJhdmNsaWJfY29tbW9uLmgiCi0KLS8qIGlucHV0IGFyZSBpbiB0aGUgZmlyc3QgMTYgZWxlbWVudHMgb2YgYmxvY2ssCi0gICBvdXRwdXQgbXVzdCBiZSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIEZpZ3VyZSA4LTYuICovCi0vKiBzdWJjbGF1c2UgOC41LjYgKi8KLXZvaWQgSW50cmExNkRDVHJhbnMoaW50MTYgKmJsb2NrLCBpbnQgUXEsIGludCBScSkKLXsKLSAgICBpbnQgbTAsIG0xLCBtMiwgbTM7Ci0gICAgaW50IGosIG9mZnNldDsKLSAgICBpbnQxNiAqaW5vdXQ7Ci0gICAgaW50IHNjYWxlID0gZGVxdWFudF9jb2VmcmVzW1JxXVswXTsKLQotICAgIGlub3V0ID0gYmxvY2s7Ci0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIG0wID0gaW5vdXRbMF0gKyBpbm91dFs0XTsKLSAgICAgICAgbTEgPSBpbm91dFswXSAtIGlub3V0WzRdOwotICAgICAgICBtMiA9IGlub3V0WzhdICsgaW5vdXRbMTJdOwotICAgICAgICBtMyA9IGlub3V0WzhdIC0gaW5vdXRbMTJdOwotCi0KLSAgICAgICAgaW5vdXRbMF0gPSBtMCArIG0yOwotICAgICAgICBpbm91dFs0XSA9IG0wIC0gbTI7Ci0gICAgICAgIGlub3V0WzhdID0gbTEgLSBtMzsKLSAgICAgICAgaW5vdXRbMTJdID0gbTEgKyBtMzsKLSAgICAgICAgaW5vdXQgKz0gNjQ7Ci0gICAgfQotCi0gICAgaW5vdXQgPSBibG9jazsKLQotICAgIGlmIChRcSA+PSAyKSAgLyogdGhpcyB3YXkgc2hvdWxkIGJlIGZhc3RlciB0aGFuIEpNICovCi0gICAgeyAgICAgICAgICAgLyogdGhleSB1c2UgKCgobTQqc2NhbGUpPDwoUVB5LzYpKSsyKT4+MiBmb3IgYm90aCBjYXNlcy4gKi8KLSAgICAgICAgUXEgLT0gMjsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgbTAgPSBpbm91dFswXSArIGlub3V0WzY0XTsKLSAgICAgICAgICAgIG0xID0gaW5vdXRbMF0gLSBpbm91dFs2NF07Ci0gICAgICAgICAgICBtMiA9IGlub3V0WzEyOF0gKyBpbm91dFsxOTJdOwotICAgICAgICAgICAgbTMgPSBpbm91dFsxMjhdIC0gaW5vdXRbMTkyXTsKLQotICAgICAgICAgICAgaW5vdXRbMF0gPSAoKG0wICsgbTIpICogc2NhbGUpIDw8IFFxOwotICAgICAgICAgICAgaW5vdXRbNjRdID0gKChtMCAtIG0yKSAqIHNjYWxlKSA8PCBRcTsKLSAgICAgICAgICAgIGlub3V0WzEyOF0gPSAoKG0xIC0gbTMpICogc2NhbGUpIDw8IFFxOwotICAgICAgICAgICAgaW5vdXRbMTkyXSA9ICgobTEgKyBtMykgKiBzY2FsZSkgPDwgUXE7Ci0gICAgICAgICAgICBpbm91dCArPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFFxID0gMiAtIFFxOwotICAgICAgICBvZmZzZXQgPSAxIDw8IChRcSAtIDEpOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG0wID0gaW5vdXRbMF0gKyBpbm91dFs2NF07Ci0gICAgICAgICAgICBtMSA9IGlub3V0WzBdIC0gaW5vdXRbNjRdOwotICAgICAgICAgICAgbTIgPSBpbm91dFsxMjhdICsgaW5vdXRbMTkyXTsKLSAgICAgICAgICAgIG0zID0gaW5vdXRbMTI4XSAtIGlub3V0WzE5Ml07Ci0KLSAgICAgICAgICAgIGlub3V0WzBdID0gKCgobTAgKyBtMikgKiBzY2FsZSArIG9mZnNldCkgPj4gUXEpOwotICAgICAgICAgICAgaW5vdXRbNjRdID0gKCgobTAgLSBtMikgKiBzY2FsZSArIG9mZnNldCkgPj4gUXEpOwotICAgICAgICAgICAgaW5vdXRbMTI4XSA9ICgoKG0xIC0gbTMpICogc2NhbGUgKyBvZmZzZXQpID4+IFFxKTsKLSAgICAgICAgICAgIGlub3V0WzE5Ml0gPSAoKChtMSArIG0zKSAqIHNjYWxlICsgb2Zmc2V0KSA+PiBRcSk7Ci0gICAgICAgICAgICBpbm91dCArPSA0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotLyogc2VlIHN1YmNsYXNlIDguNS44ICovCi12b2lkIGl0cmFucyhpbnQxNiAqYmxvY2ssIHVpbnQ4ICpwcmVkLCB1aW50OCAqY3VyLCBpbnQgd2lkdGgpCi17Ci0gICAgaW50IGUwLCBlMSwgZTIsIGUzOyAvKiBub3RlLCBhdCBldmVyeSBzdGVwIG9mIHRoZSBjYWxjdWxhdGlvbiwgdGhlc2UgdmFsdWVzICovCi0gICAgLyogc2hhbGwgbmV2ZXIgZXhjZWVkIDE2Yml0IHNpZ24gdmFsdWUsIGJ1dCB3ZSBkb24ndCBjaGVjayAqLwotICAgIGludCBpOyAgICAgICAgICAgLyogdG8gc2F2ZSB0aGUgY3ljbGVzLiAqLwotICAgIGludDE2ICppbm91dDsKLQotICAgIGlub3V0ID0gYmxvY2s7Ci0KLSAgICBmb3IgKGkgPSA0OyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgZTAgPSBpbm91dFswXSArIGlub3V0WzJdOwotICAgICAgICBlMSA9IGlub3V0WzBdIC0gaW5vdXRbMl07Ci0gICAgICAgIGUyID0gKGlub3V0WzFdID4+IDEpIC0gaW5vdXRbM107Ci0gICAgICAgIGUzID0gaW5vdXRbMV0gKyAoaW5vdXRbM10gPj4gMSk7Ci0KLSAgICAgICAgaW5vdXRbMF0gPSBlMCArIGUzOwotICAgICAgICBpbm91dFsxXSA9IGUxICsgZTI7Ci0gICAgICAgIGlub3V0WzJdID0gZTEgLSBlMjsKLSAgICAgICAgaW5vdXRbM10gPSBlMCAtIGUzOwotCi0gICAgICAgIGlub3V0ICs9IDE2OwotICAgIH0KLQotICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBlMCA9IGJsb2NrWzBdICsgYmxvY2tbMzJdOwotICAgICAgICBlMSA9IGJsb2NrWzBdIC0gYmxvY2tbMzJdOwotICAgICAgICBlMiA9IChibG9ja1sxNl0gPj4gMSkgLSBibG9ja1s0OF07Ci0gICAgICAgIGUzID0gYmxvY2tbMTZdICsgKGJsb2NrWzQ4XSA+PiAxKTsKLQotICAgICAgICBlMCArPSBlMzsKLSAgICAgICAgZTMgPSAoZTAgLSAoZTMgPDwgMSkpOyAvKiBlMC1lMyAqLwotICAgICAgICBlMSArPSBlMjsKLSAgICAgICAgZTIgPSAoZTEgLSAoZTIgPDwgMSkpOyAvKiBlMS1lMiAqLwotICAgICAgICBlMCArPSAzMjsKLSAgICAgICAgZTEgKz0gMzI7Ci0gICAgICAgIGUyICs9IDMyOwotICAgICAgICBlMyArPSAzMjsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICBlMCA9IHByZWRbMF0gKyAoZTAgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMCA+IDB4RkYpICAgZTAgPSAweEZGICYgKH4oZTAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgZTEgPSBwcmVkWzIwXSArIChlMSA+PiA2KTsKLSAgICAgICAgaWYgKCh1aW50KWUxID4gMHhGRikgICBlMSA9IDB4RkYgJiAofihlMSA+PiAzMSkpOyAgLyogY2xpcCAqLwotICAgICAgICBlMiA9IHByZWRbNDBdICsgKGUyID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTIgPiAweEZGKSAgIGUyID0gMHhGRiAmICh+KGUyID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgIGUzID0gcHJlZFs2MF0gKyAoZTMgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMyA+IDB4RkYpICAgZTMgPSAweEZGICYgKH4oZTMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgKmN1ciA9IGUwOwotICAgICAgICAqKGN1ciArPSB3aWR0aCkgPSBlMTsKLSAgICAgICAgKihjdXIgKz0gd2lkdGgpID0gZTI7Ci0gICAgICAgIGN1clt3aWR0aF0gPSBlMzsKLSAgICAgICAgY3VyIC09ICh3aWR0aCA8PCAxKTsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIHByZWQrKzsKLSNlbHNlCi0gICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhwcmVkKTsKLQotICAgICAgICBlMCA9ICpjdXIgKyAoZTAgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMCA+IDB4RkYpICAgZTAgPSAweEZGICYgKH4oZTAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgKmN1ciA9IGUwOwotICAgICAgICBlMSA9ICooY3VyICs9IHdpZHRoKSArIChlMSA+PiA2KTsKLSAgICAgICAgaWYgKCh1aW50KWUxID4gMHhGRikgICBlMSA9IDB4RkYgJiAofihlMSA+PiAzMSkpOyAgLyogY2xpcCAqLwotICAgICAgICAqY3VyID0gZTE7Ci0gICAgICAgIGUyID0gKihjdXIgKz0gd2lkdGgpICsgKGUyID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTIgPiAweEZGKSAgIGUyID0gMHhGRiAmICh+KGUyID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgICpjdXIgPSBlMjsKLSAgICAgICAgZTMgPSBjdXJbd2lkdGhdICsgKGUzID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTMgPiAweEZGKSAgIGUzID0gMHhGRiAmICh+KGUzID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgIGN1clt3aWR0aF0gPSBlMzsKLSAgICAgICAgY3VyIC09ICh3aWR0aCA8PCAxKTsKLSAgICAgICAgY3VyKys7Ci0jZW5kaWYKLSAgICAgICAgYmxvY2srKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi0vKiBzZWUgc3ViY2xhc2UgOC41LjggKi8KLXZvaWQgaWN0cmFucyhpbnQxNiAqYmxvY2ssIHVpbnQ4ICpwcmVkLCB1aW50OCAqY3VyLCBpbnQgd2lkdGgpCi17Ci0gICAgaW50IGUwLCBlMSwgZTIsIGUzOyAvKiBub3RlLCBhdCBldmVyeSBzdGVwIG9mIHRoZSBjYWxjdWxhdGlvbiwgdGhlc2UgdmFsdWVzICovCi0gICAgLyogc2hhbGwgbmV2ZXIgZXhjZWVkIDE2Yml0IHNpZ24gdmFsdWUsIGJ1dCB3ZSBkb24ndCBjaGVjayAqLwotICAgIGludCBpOyAgICAgICAgICAgLyogdG8gc2F2ZSB0aGUgY3ljbGVzLiAqLwotICAgIGludDE2ICppbm91dDsKLQotICAgIGlub3V0ID0gYmxvY2s7Ci0KLSAgICBmb3IgKGkgPSA0OyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgZTAgPSBpbm91dFswXSArIGlub3V0WzJdOwotICAgICAgICBlMSA9IGlub3V0WzBdIC0gaW5vdXRbMl07Ci0gICAgICAgIGUyID0gKGlub3V0WzFdID4+IDEpIC0gaW5vdXRbM107Ci0gICAgICAgIGUzID0gaW5vdXRbMV0gKyAoaW5vdXRbM10gPj4gMSk7Ci0KLSAgICAgICAgaW5vdXRbMF0gPSBlMCArIGUzOwotICAgICAgICBpbm91dFsxXSA9IGUxICsgZTI7Ci0gICAgICAgIGlub3V0WzJdID0gZTEgLSBlMjsKLSAgICAgICAgaW5vdXRbM10gPSBlMCAtIGUzOwotCi0gICAgICAgIGlub3V0ICs9IDE2OwotICAgIH0KLQotICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBlMCA9IGJsb2NrWzBdICsgYmxvY2tbMzJdOwotICAgICAgICBlMSA9IGJsb2NrWzBdIC0gYmxvY2tbMzJdOwotICAgICAgICBlMiA9IChibG9ja1sxNl0gPj4gMSkgLSBibG9ja1s0OF07Ci0gICAgICAgIGUzID0gYmxvY2tbMTZdICsgKGJsb2NrWzQ4XSA+PiAxKTsKLQotICAgICAgICBlMCArPSBlMzsKLSAgICAgICAgZTMgPSAoZTAgLSAoZTMgPDwgMSkpOyAvKiBlMC1lMyAqLwotICAgICAgICBlMSArPSBlMjsKLSAgICAgICAgZTIgPSAoZTEgLSAoZTIgPDwgMSkpOyAvKiBlMS1lMiAqLwotICAgICAgICBlMCArPSAzMjsKLSAgICAgICAgZTEgKz0gMzI7Ci0gICAgICAgIGUyICs9IDMyOwotICAgICAgICBlMyArPSAzMjsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICBlMCA9IHByZWRbMF0gKyAoZTAgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMCA+IDB4RkYpICAgZTAgPSAweEZGICYgKH4oZTAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgZTEgPSBwcmVkWzEyXSArIChlMSA+PiA2KTsKLSAgICAgICAgaWYgKCh1aW50KWUxID4gMHhGRikgICBlMSA9IDB4RkYgJiAofihlMSA+PiAzMSkpOyAgLyogY2xpcCAqLwotICAgICAgICBlMiA9IHByZWRbMjRdICsgKGUyID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTIgPiAweEZGKSAgIGUyID0gMHhGRiAmICh+KGUyID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgIGUzID0gcHJlZFszNl0gKyAoZTMgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMyA+IDB4RkYpICAgZTMgPSAweEZGICYgKH4oZTMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgKmN1ciA9IGUwOwotICAgICAgICAqKGN1ciArPSB3aWR0aCkgPSBlMTsKLSAgICAgICAgKihjdXIgKz0gd2lkdGgpID0gZTI7Ci0gICAgICAgIGN1clt3aWR0aF0gPSBlMzsKLSAgICAgICAgY3VyIC09ICh3aWR0aCA8PCAxKTsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIHByZWQrKzsKLSNlbHNlCi0gICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhwcmVkKTsKLQotICAgICAgICBlMCA9ICpjdXIgKyAoZTAgPj4gNik7Ci0gICAgICAgIGlmICgodWludCllMCA+IDB4RkYpICAgZTAgPSAweEZGICYgKH4oZTAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KLSAgICAgICAgKmN1ciA9IGUwOwotICAgICAgICBlMSA9ICooY3VyICs9IHdpZHRoKSArIChlMSA+PiA2KTsKLSAgICAgICAgaWYgKCh1aW50KWUxID4gMHhGRikgICBlMSA9IDB4RkYgJiAofihlMSA+PiAzMSkpOyAgLyogY2xpcCAqLwotICAgICAgICAqY3VyID0gZTE7Ci0gICAgICAgIGUyID0gKihjdXIgKz0gd2lkdGgpICsgKGUyID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTIgPiAweEZGKSAgIGUyID0gMHhGRiAmICh+KGUyID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgICpjdXIgPSBlMjsKLSAgICAgICAgZTMgPSBjdXJbd2lkdGhdICsgKGUzID4+IDYpOwotICAgICAgICBpZiAoKHVpbnQpZTMgPiAweEZGKSAgIGUzID0gMHhGRiAmICh+KGUzID4+IDMxKSk7ICAvKiBjbGlwICovCi0gICAgICAgIGN1clt3aWR0aF0gPSBlMzsKLSAgICAgICAgY3VyIC09ICh3aWR0aCA8PCAxKTsKLSAgICAgICAgY3VyKys7Ci0jZW5kaWYKLSAgICAgICAgYmxvY2srKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi0vKiBzZWUgc3ViY2xhdXNlIDguNS43ICovCi12b2lkIENocm9tYURDVHJhbnMoaW50MTYgKmJsb2NrLCBpbnQgUXEsIGludCBScSkKLXsKLSAgICBpbnQgYzAwLCBjMDEsIGMxMCwgYzExOwotICAgIGludCBmMCwgZjEsIGYyLCBmMzsKLSAgICBpbnQgc2NhbGUgPSBkZXF1YW50X2NvZWZyZXNbUnFdWzBdOwotCi0gICAgYzAwID0gYmxvY2tbMF0gKyBibG9ja1s0XTsKLSAgICBjMDEgPSBibG9ja1swXSAtIGJsb2NrWzRdOwotICAgIGMxMCA9IGJsb2NrWzY0XSArIGJsb2NrWzY4XTsKLSAgICBjMTEgPSBibG9ja1s2NF0gLSBibG9ja1s2OF07Ci0KLSAgICBmMCA9IGMwMCArIGMxMDsKLSAgICBmMSA9IGMwMSArIGMxMTsKLSAgICBmMiA9IGMwMCAtIGMxMDsKLSAgICBmMyA9IGMwMSAtIGMxMTsKLQotICAgIGlmIChRcSA+PSAxKQotICAgIHsKLSAgICAgICAgUXEgLT0gMTsKLSAgICAgICAgYmxvY2tbMF0gPSAoZjAgKiBzY2FsZSkgPDwgUXE7Ci0gICAgICAgIGJsb2NrWzRdID0gKGYxICogc2NhbGUpIDw8IFFxOwotICAgICAgICBibG9ja1s2NF0gPSAoZjIgKiBzY2FsZSkgPDwgUXE7Ci0gICAgICAgIGJsb2NrWzY4XSA9IChmMyAqIHNjYWxlKSA8PCBRcTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYmxvY2tbMF0gPSAoZjAgKiBzY2FsZSkgPj4gMTsKLSAgICAgICAgYmxvY2tbNF0gPSAoZjEgKiBzY2FsZSkgPj4gMTsKLSAgICAgICAgYmxvY2tbNjRdID0gKGYyICogc2NhbGUpID4+IDE7Ci0gICAgICAgIGJsb2NrWzY4XSA9IChmMyAqIHNjYWxlKSA+PiAxOwotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLQotdm9pZCBjb3B5X2Jsb2NrKHVpbnQ4ICpwcmVkLCB1aW50OCAqY3VyLCBpbnQgd2lkdGgsIGludCBwcmVkX3BpdGNoKQotewotICAgIHVpbnQzMiB0ZW1wOwotCi0gICAgdGVtcCA9ICooKHVpbnQzMiopcHJlZCk7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgICooKHVpbnQzMiopY3VyKSA9IHRlbXA7Ci0gICAgY3VyICs9IHdpZHRoOwotICAgIHRlbXAgPSAqKCh1aW50MzIqKXByZWQpOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICAqKCh1aW50MzIqKWN1cikgPSB0ZW1wOwotICAgIGN1ciArPSB3aWR0aDsKLSAgICB0ZW1wID0gKigodWludDMyKilwcmVkKTsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgKigodWludDMyKiljdXIpID0gdGVtcDsKLSAgICBjdXIgKz0gd2lkdGg7Ci0gICAgdGVtcCA9ICooKHVpbnQzMiopcHJlZCk7Ci0gICAgKigodWludDMyKiljdXIpID0gdGVtcDsKLQotICAgIHJldHVybiA7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3ByZWRfaW50ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3ByZWRfaW50ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTM2YzM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9wcmVkX2ludGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzMjkgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJhdmNkZWNfbGliLmgiCi0KLQotI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKCh1aW50KXggPiAweEZGKXsgXAotICAgICAgICAgICAgICAgICB4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQotCi0vKiAoYmxrd2lkdGggPDwgMikgKyAoZHkgPDwgMSkgKyBkeCAqLwotc3RhdGljIHZvaWQgKCpjb25zdCBDaHJvbWFNQ19TSU1EWzhdKSh1aW50OCAqLCBpbnQgLCBpbnQgLCBpbnQgLCB1aW50OCAqLCBpbnQsIGludCAsIGludCkgPQotewotICAgICZDaHJvbWFGdWxsTUNfU0lNRCwKLSAgICAmQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQsCi0gICAgJkNocm9tYVZlcnRpY2FsTUNfU0lNRCwKLSAgICAmQ2hyb21hRGlhZ29uYWxNQ19TSU1ELAotICAgICZDaHJvbWFGdWxsTUNfU0lNRCwKLSAgICAmQ2hyb21hSG9yaXpvbnRhbE1DMl9TSU1ELAotICAgICZDaHJvbWFWZXJ0aWNhbE1DMl9TSU1ELAotICAgICZDaHJvbWFEaWFnb25hbE1DMl9TSU1ECi19OwotLyogUGVyZm9ybSBtb3Rpb24gcHJlZGljdGlvbiBhbmQgY29tcGVuc2F0aW9uIHdpdGggcmVzaWR1ZSBpZiBleGlzdC4gKi8KLXZvaWQgSW50ZXJNQlByZWRpY3Rpb24oQVZDQ29tbW9uT2JqICp2aWRlbykKLXsKLSAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COwotICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7Ci0gICAgaW50IG1iUGFydElkeCwgc3ViTWJQYXJ0SWR4OwotICAgIGludCByZWZfaWR4OwotICAgIGludCBvZmZzZXRfTWJQYXJ0X2luZHggPSAwOwotICAgIGludDE2ICptdjsKLSAgICB1aW50MzIgeF9wb3MsIHlfcG9zOwotICAgIHVpbnQ4ICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKLSAgICB1aW50OCAqcmVmX2wsICpyZWZfQ2IsICpyZWZfQ3I7Ci0gICAgdWludDggKnByZWRCbG9jaywgKnByZWRDYiwgKnByZWRDcjsKLSAgICBpbnQgYmxvY2tfeCwgYmxvY2tfeSwgb2Zmc2V0X3gsIG9mZnNldF95LCBvZmZzZXRQLCBvZmZzZXQ7Ci0gICAgaW50IHhfcG9zaXRpb24gPSAodmlkZW8tPm1iX3ggPDwgNCk7Ci0gICAgaW50IHlfcG9zaXRpb24gPSAodmlkZW8tPm1iX3kgPDwgNCk7Ci0gICAgaW50IE1iSGVpZ2h0LCBNYldpZHRoLCBtYlBhcnRJZHhfWCwgbWJQYXJ0SWR4X1ksIG9mZnNldF9pbmR4OwotICAgIGludCBwaWNXaWR0aCA9IGN1cnJQaWMtPnBpdGNoOwotICAgIGludCBwaWNIZWlnaHQgPSBjdXJyUGljLT5oZWlnaHQ7Ci0gICAgaW50MTYgKmRhdGFCbG9jazsKLSAgICB1aW50MzIgY2JwNHg0OwotICAgIHVpbnQzMiB0bXBfd29yZDsKLQotICAgIHRtcF93b3JkID0geV9wb3NpdGlvbiAqIHBpY1dpZHRoOwotICAgIGN1ckwgPSBjdXJyUGljLT5TbCArIHRtcF93b3JkICsgeF9wb3NpdGlvbjsKLSAgICBvZmZzZXQgPSAodG1wX3dvcmQgPj4gMikgKyAoeF9wb3NpdGlvbiA+PiAxKTsKLSAgICBjdXJDYiA9IGN1cnJQaWMtPlNjYiArIG9mZnNldDsKLSAgICBjdXJDciA9IGN1cnJQaWMtPlNjciArIG9mZnNldDsKLQotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcHJlZEJsb2NrID0gdmlkZW8tPnByZWQgKyA4NDsKLSAgICBwcmVkQ2IgPSB2aWRlby0+cHJlZCArIDQ1MjsKLSAgICBwcmVkQ3IgPSB2aWRlby0+cHJlZCArIDU5NjsKLSNlbHNlCi0gICAgcHJlZEJsb2NrID0gY3VyTDsKLSAgICBwcmVkQ2IgPSBjdXJDYjsKLSAgICBwcmVkQ3IgPSBjdXJDcjsKLSNlbmRpZgotCi0gICAgR2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKHZpZGVvLCBmYWxzZSk7Ci0KLSAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKLSAgICB7Ci0gICAgICAgIE1iSGVpZ2h0ID0gY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbbWJQYXJ0SWR4XTsKLSAgICAgICAgTWJXaWR0aCA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbbWJQYXJ0SWR4XTsKLSAgICAgICAgbWJQYXJ0SWR4X1ggPSAoKG1iUGFydElkeCArIG9mZnNldF9NYlBhcnRfaW5keCkgJiAxKTsKLSAgICAgICAgbWJQYXJ0SWR4X1kgPSAobWJQYXJ0SWR4ICsgb2Zmc2V0X01iUGFydF9pbmR4KSA+PiAxOwotICAgICAgICByZWZfaWR4ID0gY3Vyck1CLT5yZWZfaWR4X0wwWyhtYlBhcnRJZHhfWSA8PCAxKSArIG1iUGFydElkeF9YXTsKLSAgICAgICAgb2Zmc2V0X2luZHggPSAwOwotCi0gICAgICAgIHJlZl9sID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TbDsKLSAgICAgICAgcmVmX0NiID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TY2I7Ci0gICAgICAgIHJlZl9DciA9IHZpZGVvLT5SZWZQaWNMaXN0MFtyZWZfaWR4XS0+U2NyOwotCi0gICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1TdWJNYlBhcnRbbWJQYXJ0SWR4XTsgc3ViTWJQYXJ0SWR4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrX3ggPSAobWJQYXJ0SWR4X1ggPDwgMSkgKyAoKHN1Yk1iUGFydElkeCArIG9mZnNldF9pbmR4KSAmIDEpOyAgLy8gY2hlY2sgdGhpcwotICAgICAgICAgICAgYmxvY2tfeSA9IChtYlBhcnRJZHhfWSA8PCAxKSArICgoKHN1Yk1iUGFydElkeCArIG9mZnNldF9pbmR4KSA+PiAxKSAmIDEpOwotICAgICAgICAgICAgbXYgPSAoaW50MTYqKShjdXJyTUItPm12TDAgKyBibG9ja194ICsgKGJsb2NrX3kgPDwgMikpOwotICAgICAgICAgICAgb2Zmc2V0X3ggPSB4X3Bvc2l0aW9uICsgKGJsb2NrX3ggPDwgMik7Ci0gICAgICAgICAgICBvZmZzZXRfeSA9IHlfcG9zaXRpb24gKyAoYmxvY2tfeSA8PCAyKTsKLSAgICAgICAgICAgIHhfcG9zID0gKG9mZnNldF94IDw8IDIpICsgKm12Kys7ICAgLypxdWFydGVyIHBlbCAqLwotICAgICAgICAgICAgeV9wb3MgPSAob2Zmc2V0X3kgPDwgMikgKyAqbXY7ICAgLypxdWFydGVyIHBlbCAqLwotCi0gICAgICAgICAgICAvL29mZnNldCA9IG9mZnNldF95ICogY3VyclBpYy0+d2lkdGg7Ci0gICAgICAgICAgICAvL29mZnNldEMgPSAob2Zmc2V0ID4+IDIpICsgKG9mZnNldF94ID4+IDEpOwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgKiA4MCkgKyAoYmxvY2tfeCA8PCAyKTsKLSAgICAgICAgICAgIEx1bWFNb3Rpb25Db21wKHJlZl9sLCBwaWNXaWR0aCwgcGljSGVpZ2h0LCB4X3BvcywgeV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2wgKyBvZmZzZXQgKyBvZmZzZXRfeCwqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZEJsb2NrICsgb2Zmc2V0UCwgMjAsIE1iV2lkdGgsIE1iSGVpZ2h0KTsKLSNlbHNlCi0gICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgPDwgMikgKiBwaWNXaWR0aCArIChibG9ja194IDw8IDIpOwotICAgICAgICAgICAgTHVtYU1vdGlvbkNvbXAocmVmX2wsIHBpY1dpZHRoLCBwaWNIZWlnaHQsIHhfcG9zLCB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TbCArIG9mZnNldCArIG9mZnNldF94LCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQmxvY2sgKyBvZmZzZXRQLCBwaWNXaWR0aCwgTWJXaWR0aCwgTWJIZWlnaHQpOwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgb2Zmc2V0UCA9IChibG9ja195ICogMjQpICsgKGJsb2NrX3ggPDwgMSk7Ci0gICAgICAgICAgICBDaHJvbWFNb3Rpb25Db21wKHJlZl9DYiwgcGljV2lkdGggPj4gMSwgcGljSGVpZ2h0ID4+IDEsIHhfcG9zLCB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb21wX1NjYiArICBvZmZzZXRDLCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRDYiArIG9mZnNldFAsIDEyLCBNYldpZHRoID4+IDEsIE1iSGVpZ2h0ID4+IDEpOwotICAgICAgICAgICAgQ2hyb21hTW90aW9uQ29tcChyZWZfQ3IsIHBpY1dpZHRoID4+IDEsIHBpY0hlaWdodCA+PiAxLCB4X3BvcywgeV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TY3IgKyAgb2Zmc2V0QywqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQ3IgKyBvZmZzZXRQLCAxMiwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKLSNlbHNlCi0gICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgKiBwaWNXaWR0aCkgKyAoYmxvY2tfeCA8PCAxKTsKLSAgICAgICAgICAgIENocm9tYU1vdGlvbkNvbXAocmVmX0NiLCBwaWNXaWR0aCA+PiAxLCBwaWNIZWlnaHQgPj4gMSwgeF9wb3MsIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2NiICsgIG9mZnNldEMsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENiICsgb2Zmc2V0UCwgcGljV2lkdGggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKLSAgICAgICAgICAgIENocm9tYU1vdGlvbkNvbXAocmVmX0NyLCBwaWNXaWR0aCA+PiAxLCBwaWNIZWlnaHQgPj4gMSwgeF9wb3MsIHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2NyICsgIG9mZnNldEMsKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENyICsgb2Zmc2V0UCwgcGljV2lkdGggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBvZmZzZXRfaW5keCA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbbWJQYXJ0SWR4XSA+PiAzOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldF9NYlBhcnRfaW5keCA9IGN1cnJNQi0+TWJQYXJ0V2lkdGggPj4gNDsKLSAgICB9Ci0KLSAgICAvKiB1c2VkIGluIGRlY29kZXIsIHVzZWQgdG8gYmUgaWYoIWVuY0ZsYWcpICAqLwotCi0gICAgLyogdHJhbnNmb3JtIGluIHJhc3RlciBzY2FuIG9yZGVyICovCi0gICAgZGF0YUJsb2NrID0gdmlkZW8tPmJsb2NrOwotICAgIGNicDR4NCA9IHZpZGVvLT5jYnA0eDQ7Ci0gICAgLyogbHVtYSAqLwotICAgIGZvciAoYmxvY2tfeSA9IDQ7IGJsb2NrX3kgPiAwOyBibG9ja195LS0pCi0gICAgewotICAgICAgICBmb3IgKGJsb2NrX3ggPSA0OyBibG9ja194ID4gMDsgYmxvY2tfeC0tKQotICAgICAgICB7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgICAgIGlmIChjYnA0eDQmMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpdHJhbnMoZGF0YUJsb2NrLCBwcmVkQmxvY2ssIHByZWRCbG9jaywgMjApOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGlmIChjYnA0eDQmMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpdHJhbnMoZGF0YUJsb2NrLCBjdXJMLCBjdXJMLCBwaWNXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGNicDR4NCA+Pj0gMTsKLSAgICAgICAgICAgIGRhdGFCbG9jayArPSA0OwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBwcmVkQmxvY2sgKz0gNDsKLSNlbHNlCi0gICAgICAgICAgICBjdXJMICs9IDQ7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBkYXRhQmxvY2sgKz0gNDg7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgcHJlZEJsb2NrICs9IDY0OwotI2Vsc2UKLSAgICAgICAgY3VyTCArPSAoKHBpY1dpZHRoIDw8IDIpIC0gMTYpOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogY2hyb21hICovCi0gICAgcGljV2lkdGggPSAocGljV2lkdGggPj4gMSk7Ci0gICAgZm9yIChibG9ja195ID0gMjsgYmxvY2tfeSA+IDA7IGJsb2NrX3ktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoYmxvY2tfeCA9IDI7IGJsb2NrX3ggPiAwOyBibG9ja194LS0pCi0gICAgICAgIHsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGljdHJhbnMoZGF0YUJsb2NrLCBwcmVkQ2IsIHByZWRDYiwgMTIpOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGlmIChjYnA0eDQmMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpY3RyYW5zKGRhdGFCbG9jaywgY3VyQ2IsIGN1ckNiLCBwaWNXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGNicDR4NCA+Pj0gMTsKLSAgICAgICAgICAgIGRhdGFCbG9jayArPSA0OwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBwcmVkQ2IgKz0gNDsKLSNlbHNlCi0gICAgICAgICAgICBjdXJDYiArPSA0OwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChibG9ja194ID0gMjsgYmxvY2tfeCA+IDA7IGJsb2NrX3gtLSkKLSAgICAgICAgewotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBpZiAoY2JwNHg0JjEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWN0cmFucyhkYXRhQmxvY2ssIHByZWRDciwgcHJlZENyLCAxMik7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGljdHJhbnMoZGF0YUJsb2NrLCBjdXJDciwgY3VyQ3IsIHBpY1dpZHRoKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgY2JwNHg0ID4+PSAxOwotICAgICAgICAgICAgZGF0YUJsb2NrICs9IDQ7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgICAgIHByZWRDciArPSA0OwotI2Vsc2UKLSAgICAgICAgICAgIGN1ckNyICs9IDQ7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBkYXRhQmxvY2sgKz0gNDg7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgcHJlZENiICs9IDQwOwotICAgICAgICBwcmVkQ3IgKz0gNDA7Ci0jZWxzZQotICAgICAgICBjdXJDYiArPSAoKHBpY1dpZHRoIDw8IDIpIC0gOCk7Ci0gICAgICAgIGN1ckNyICs9ICgocGljV2lkdGggPDwgMikgLSA4KTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE1CX0JBU0VEX0RFQkxPQ0sKLSAgICBTYXZlTmVpZ2hib3JGb3JJbnRyYVByZWQodmlkZW8sIG9mZnNldCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiA7Ci19Ci0KLQotLyogcHJlZm9ybSB0aGUgYWN0dWFsICBtb3Rpb24gY29tcCBoZXJlICovCi12b2lkIEx1bWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIGludCBkeCwgZHk7Ci0gICAgdWludDggdGVtcFsyNF1bMjRdOyAvKiBmb3IgcGFkZGluZywgbWFrZSB0aGUgc2l6ZSBtdWx0aXBsZSBvZiA0IGZvciBwYWNraW5nICovCi0gICAgaW50IHRlbXAyWzIxXVsyMV07IC8qIGZvciBpbnRlcm1lZGlhdGUgcmVzdWx0cyAqLwotICAgIHVpbnQ4ICpyZWYyOwotCi0gICAgZHggPSB4X3BvcyAmIDM7Ci0gICAgZHkgPSB5X3BvcyAmIDM7Ci0gICAgeF9wb3MgPSB4X3BvcyA+PiAyOyAgLyogcm91bmQgaXQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbiAqLwotICAgIHlfcG9zID0geV9wb3MgPj4gMjsKLQotICAgIC8qIHBlcmZvcm0gYWN0dWFsIG1vdGlvbiBjb21wZW5zYXRpb24gKi8KLSAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKQotICAgIHsgIC8qIGZ1bGxwZWwgcG9zaXRpb24gKi8vKiBHICovCi0gICAgICAgIGlmICh4X3BvcyA+PSAwICYmIHhfcG9zICsgYmxrd2lkdGggPD0gcGljd2lkdGggJiYgeV9wb3MgPj0gMCAmJiB5X3BvcyArIGJsa2hlaWdodCA8PSBwaWNoZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3dpZHRoICsgeF9wb3M7Ci0gICAgICAgICAgICBGdWxsUGVsTUMocmVmLCBwaWN3aWR0aCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDcmVhdGVQYWQocmVmLCBwaWN3aWR0aCwgcGljaGVpZ2h0LCB4X3BvcywgeV9wb3MsICZ0ZW1wWzBdWzBdLCBibGt3aWR0aCwgYmxraGVpZ2h0KTsKLSAgICAgICAgICAgIEZ1bGxQZWxNQygmdGVtcFswXVswXSwgMjQsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICB9ICAgLyogb3RoZXIgcG9zaXRpb25zICovCi0gICAgZWxzZSAgaWYgKGR5ID09IDApCi0gICAgeyAvKiBubyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovLyogYSxiLGMqLwotCi0gICAgICAgIGlmICh4X3BvcyAtIDIgPj0gMCAmJiB4X3BvcyArIDMgKyBibGt3aWR0aCA8PSBwaWN3aWR0aCAmJiB5X3BvcyA+PSAwICYmIHlfcG9zICsgYmxraGVpZ2h0IDw9IHBpY2hlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVmICs9IHlfcG9zICogcGljd2lkdGggKyB4X3BvczsKLQotICAgICAgICAgICAgSG9yekludGVycDFNQyhyZWYsIHBpY3dpZHRoLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgLyogbmVlZCBwYWRkaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIENyZWF0ZVBhZChyZWYsIHBpY3dpZHRoLCBwaWNoZWlnaHQsIHhfcG9zIC0gMiwgeV9wb3MsICZ0ZW1wWzBdWzBdLCBibGt3aWR0aCArIDUsIGJsa2hlaWdodCk7Ci0KLSAgICAgICAgICAgIEhvcnpJbnRlcnAxTUMoJnRlbXBbMF1bMl0sIDI0LCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZHggPT0gMCkKLSAgICB7IC8qbm8gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovLyogZCxoLG4gKi8KLQotICAgICAgICBpZiAoeF9wb3MgPj0gMCAmJiB4X3BvcyArIGJsa3dpZHRoIDw9IHBpY3dpZHRoICYmIHlfcG9zIC0gMiA+PSAwICYmIHlfcG9zICsgMyArIGJsa2hlaWdodCA8PSBwaWNoZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3dpZHRoICsgeF9wb3M7Ci0KLSAgICAgICAgICAgIFZlcnRJbnRlcnAxTUMocmVmLCBwaWN3aWR0aCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgIC8qIG5lZWQgcGFkZGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBDcmVhdGVQYWQocmVmLCBwaWN3aWR0aCwgcGljaGVpZ2h0LCB4X3BvcywgeV9wb3MgLSAyLCAmdGVtcFswXVswXSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOwotCi0gICAgICAgICAgICBWZXJ0SW50ZXJwMU1DKCZ0ZW1wWzJdWzBdLCAyNCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGR5ID09IDIpCi0gICAgeyAgLyogaG9yaXpvbnRhbCBjcm9zcyAqLy8qIGksIGosIGsgKi8KLQotICAgICAgICBpZiAoeF9wb3MgLSAyID49IDAgJiYgeF9wb3MgKyAzICsgYmxrd2lkdGggPD0gcGljd2lkdGggJiYgeV9wb3MgLSAyID49IDAgJiYgeV9wb3MgKyAzICsgYmxraGVpZ2h0IDw9IHBpY2hlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVmICs9IHlfcG9zICogcGljd2lkdGggKyB4X3BvcyAtIDI7IC8qIG1vdmUgdG8gdGhlIGxlZnQgMiBwaXhlbHMgKi8KLQotICAgICAgICAgICAgVmVydEludGVycDJNQyhyZWYsIHBpY3dpZHRoLCAmdGVtcDJbMF1bMF0sIDIxLCBibGt3aWR0aCArIDUsIGJsa2hlaWdodCk7Ci0KLSAgICAgICAgICAgIEhvcnpJbnRlcnAyTUMoJnRlbXAyWzBdWzJdLCAyMSwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogbmVlZCBwYWRkaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIENyZWF0ZVBhZChyZWYsIHBpY3dpZHRoLCBwaWNoZWlnaHQsIHhfcG9zIC0gMiwgeV9wb3MgLSAyLCAmdGVtcFswXVswXSwgYmxrd2lkdGggKyA1LCBibGtoZWlnaHQgKyA1KTsKLQotICAgICAgICAgICAgVmVydEludGVycDJNQygmdGVtcFsyXVswXSwgMjQsICZ0ZW1wMlswXVswXSwgMjEsIGJsa3dpZHRoICsgNSwgYmxraGVpZ2h0KTsKLQotICAgICAgICAgICAgSG9yekludGVycDJNQygmdGVtcDJbMF1bMl0sIDIxLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZHggPT0gMikKLSAgICB7IC8qIHZlcnRpY2FsIGNyb3NzICovIC8qIGYscSAqLwotCi0gICAgICAgIGlmICh4X3BvcyAtIDIgPj0gMCAmJiB4X3BvcyArIDMgKyBibGt3aWR0aCA8PSBwaWN3aWR0aCAmJiB5X3BvcyAtIDIgPj0gMCAmJiB5X3BvcyArIDMgKyBibGtoZWlnaHQgPD0gcGljaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZWYgKz0gKHlfcG9zIC0gMikgKiBwaWN3aWR0aCArIHhfcG9zOyAvKiBtb3ZlIHRvIHVwIDIgbGluZXMgKi8KLQotICAgICAgICAgICAgSG9yekludGVycDNNQyhyZWYsIHBpY3dpZHRoLCAmdGVtcDJbMF1bMF0sIDIxLCBibGt3aWR0aCwgYmxraGVpZ2h0ICsgNSk7Ci0gICAgICAgICAgICBWZXJ0SW50ZXJwM01DKCZ0ZW1wMlsyXVswXSwgMjEsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQsIGR5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAvKiBuZWVkIHBhZGRpbmcgKi8KLSAgICAgICAgewotICAgICAgICAgICAgQ3JlYXRlUGFkKHJlZiwgcGljd2lkdGgsIHBpY2hlaWdodCwgeF9wb3MgLSAyLCB5X3BvcyAtIDIsICZ0ZW1wWzBdWzBdLCBibGt3aWR0aCArIDUsIGJsa2hlaWdodCArIDUpOwotICAgICAgICAgICAgSG9yekludGVycDNNQygmdGVtcFswXVsyXSwgMjQsICZ0ZW1wMlswXVswXSwgMjEsIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKLSAgICAgICAgICAgIFZlcnRJbnRlcnAzTUMoJnRlbXAyWzJdWzBdLCAyMSwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGRpYWdvbmFsICovLyogZSxnLHAsciAqLwotCi0gICAgICAgIGlmICh4X3BvcyAtIDIgPj0gMCAmJiB4X3BvcyArIDMgKyAoZHggLyAyKSArIGJsa3dpZHRoIDw9IHBpY3dpZHRoICYmCi0gICAgICAgICAgICAgICAgeV9wb3MgLSAyID49IDAgJiYgeV9wb3MgKyAzICsgYmxraGVpZ2h0ICsgKGR5IC8gMikgPD0gcGljaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZWYyID0gcmVmICsgKHlfcG9zICsgKGR5IC8gMikpICogcGljd2lkdGggKyB4X3BvczsKLQotICAgICAgICAgICAgcmVmICs9ICh5X3BvcyAqIHBpY3dpZHRoKSArIHhfcG9zICsgKGR4IC8gMik7Ci0KLSAgICAgICAgICAgIERpYWdvbmFsSW50ZXJwTUMocmVmMiwgcmVmLCBwaWN3aWR0aCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgLyogbmVlZCBwYWRkaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIENyZWF0ZVBhZChyZWYsIHBpY3dpZHRoLCBwaWNoZWlnaHQsIHhfcG9zIC0gMiwgeV9wb3MgLSAyLCAmdGVtcFswXVswXSwgYmxrd2lkdGggKyA1ICsgKGR4IC8gMiksIGJsa2hlaWdodCArIDUgKyAoZHkgLyAyKSk7Ci0KLSAgICAgICAgICAgIHJlZjIgPSAmdGVtcFsyICsgKGR5LzIpXVsyXTsKLQotICAgICAgICAgICAgcmVmID0gJnRlbXBbMl1bMiArIChkeC8yKV07Ci0KLSAgICAgICAgICAgIERpYWdvbmFsSW50ZXJwTUMocmVmMiwgcmVmLCAyNCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIENyZWF0ZUFsaWduKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHlfcG9zLAotICAgICAgICAgICAgICAgICB1aW50OCAqb3V0LCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IG9mZnNldCwgb3V0X29mZnNldDsKLSAgICB1aW50MzIgcHJldl9waXgsIHJlc3VsdCwgcGl4MSwgcGl4MiwgcGl4NDsKLQotICAgIG91dF9vZmZzZXQgPSAyNCAtIGJsa3dpZHRoOwotCi0gICAgLy9zd2l0Y2goeF9wb3MmMHgzKXsKLSAgICBzd2l0Y2ggKCgodWludDMyKXJlZikmMHgzKQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmVmICs9IHlfcG9zICogcGljd2lkdGg7Ci0gICAgICAgICAgICBvZmZzZXQgPSAgcGljd2lkdGggLSBibGt3aWR0aCAtIDM7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGl4MSA9ICpyZWYrKzsKLSAgICAgICAgICAgICAgICBwaXgyID0gKigodWludDE2KilyZWYpOwotICAgICAgICAgICAgICAgIHJlZiArPSAyOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChwaXgyIDw8IDgpIHwgcGl4MTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDM7IGkgPCBibGt3aWR0aDsgaSArPSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4NCA9ICooKHVpbnQzMiopcmVmKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZfcGl4ID0gKHBpeDQgPDwgMjQpICYgMHhGRjAwMDAwMDsgLyogbWFzayBvdXQgYnl0ZSBiZWxvbmcgdG8gcHJldmlvdXMgd29yZCAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gcHJldl9waXg7Ci0gICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHJlc3VsdDsgIC8qIHdyaXRlIDQgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgb3V0ICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBpeDQgPj4gODsgLyogZm9yIHRoZSBuZXh0IGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVmICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBvdXQgKz0gb3V0X29mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWYgKz0geV9wb3MgKiBwaWN3aWR0aDsKLSAgICAgICAgICAgIG9mZnNldCA9ICBwaWN3aWR0aCAtIGJsa3dpZHRoIC0gMjsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAqKCh1aW50MTYqKXJlZik7Ci0gICAgICAgICAgICAgICAgcmVmICs9IDI7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOwotICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCAxNikgJiAweEZGRkYwMDAwOyAvKiBtYXNrIG91dCBieXRlIGJlbG9uZyB0byBwcmV2aW91cyB3b3JkICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBwcmV2X3BpeDsKLSAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gcmVzdWx0OyAgLyogd3JpdGUgNCBieXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBvdXQgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGl4NCA+PiAxNjsgLyogZm9yIHRoZSBuZXh0IGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVmICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBvdXQgKz0gb3V0X29mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByZWYgKz0geV9wb3MgKiBwaWN3aWR0aDsKLSAgICAgICAgICAgIG9mZnNldCA9ICBwaWN3aWR0aCAtIGJsa3dpZHRoIC0gMTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAqcmVmKys7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOwotICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCA4KSAmIDB4RkZGRkZGMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OwotICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIG91dCArPSA0OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDI0OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIENyZWF0ZVBhZCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsIGludCB4X3BvcywgaW50IHlfcG9zLAotICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIGludCB4X2luYzAsIHhfbWlkOwotICAgIGludCB5X2luYywgeV9pbmMwLCB5X2luYzEsIHlfbWlkOwotICAgIGludCBpLCBqOwotICAgIGludCBvZmZzZXQ7Ci0KLSAgICBpZiAoeF9wb3MgPCAwKQotICAgIHsKLSAgICAgICAgeF9pbmMwID0gMDsgIC8qIGluY3JlbWVudCBmb3IgdGhlIGZpcnN0IHBhcnQgKi8KLSAgICAgICAgeF9taWQgPSAoKGJsa3dpZHRoICsgeF9wb3MgPiAwKSA/IC14X3BvcyA6IGJsa3dpZHRoKTsgIC8qIHN0b3BwaW5nIHBvaW50ICovCi0gICAgICAgIHhfcG9zID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeF9wb3MgKyBibGt3aWR0aCA+IHBpY3dpZHRoKQotICAgIHsKLSAgICAgICAgeF9pbmMwID0gMTsgIC8qIGluY3JlYXNpbmcgKi8KLSAgICAgICAgeF9taWQgPSAoKHBpY3dpZHRoID4geF9wb3MpID8gcGljd2lkdGggLSB4X3BvcyAtIDEgOiAwKTsgIC8qIGNsaXAgbmVnYXRpdmUgdG8gemVybywgZW5jb2RlIGZvb2wgcHJvb2YhICovCi0gICAgfQotICAgIGVsc2UgICAgLyogbm9ybWFsIGNhc2UgKi8KLSAgICB7Ci0gICAgICAgIHhfaW5jMCA9IDE7Ci0gICAgICAgIHhfbWlkID0gYmxrd2lkdGg7IC8qIGp1c3Qgb25lIHJ1biAqLwotICAgIH0KLQotCi0gICAgLyogYm91bmRhcnkgZm9yIHlfcG9zLCB0YWtpbmcgdGhlIHJlc3VsdCBmcm9tIHhfcG9zIGludG8gYWNjb3VudCAqLwotICAgIGlmICh5X3BvcyA8IDApCi0gICAgewotICAgICAgICB5X2luYzAgPSAoeF9pbmMwID8gLSB4X21pZCA6IC1ibGt3aWR0aCArIHhfbWlkKTsgLyogb2Zmc2V0IGRlcGVuZGluZyBvbiB4X2luYzEgYW5kIHhfaW5jMCAqLwotICAgICAgICB5X2luYzEgPSBwaWN3aWR0aCArIHlfaW5jMDsKLSAgICAgICAgeV9taWQgPSAoKGJsa2hlaWdodCArIHlfcG9zID4gMCkgPyAteV9wb3MgOiBibGtoZWlnaHQpOyAvKiBjbGlwIHRvIHByZXZlbnQgbWVtb3J5IGNvcnJ1cHRpb24gKi8KLSAgICAgICAgeV9wb3MgPSAwOwotICAgIH0KLSAgICBlbHNlICBpZiAoeV9wb3MgKyBibGtoZWlnaHQgPiBwaWNoZWlnaHQpCi0gICAgewotICAgICAgICB5X2luYzEgPSAoeF9pbmMwID8gLSB4X21pZCA6IC1ibGt3aWR0aCArIHhfbWlkKTsgLyogc2F0dXJhdGUgKi8KLSAgICAgICAgeV9pbmMwID0gcGljd2lkdGggKyB5X2luYzE7ICAgICAgICAgICAgICAgICAvKiBpbmNyZWFzaW5nICovCi0gICAgICAgIHlfbWlkID0gKChwaWNoZWlnaHQgPiB5X3BvcykgPyBwaWNoZWlnaHQgLSAxIC0geV9wb3MgOiAwKTsKLSAgICB9Ci0gICAgZWxzZSAgLyogbm9ybWFsIGNhc2UgKi8KLSAgICB7Ci0gICAgICAgIHlfaW5jMSA9ICh4X2luYzAgPyAtIHhfbWlkIDogLWJsa3dpZHRoICsgeF9taWQpOwotICAgICAgICB5X2luYzAgPSBwaWN3aWR0aCArIHlfaW5jMTsKLSAgICAgICAgeV9taWQgPSBibGtoZWlnaHQ7Ci0gICAgfQotCi0gICAgLyogY2xpcCB5X3BvcyBhbmQgeF9wb3MgKi8KLSAgICBpZiAoeV9wb3MgPiBwaWNoZWlnaHQgLSAxKSB5X3BvcyA9IHBpY2hlaWdodCAtIDE7Ci0gICAgaWYgKHhfcG9zID4gcGljd2lkdGggLSAxKSB4X3BvcyA9IHBpY3dpZHRoIC0gMTsKLQotICAgIHJlZiArPSB5X3BvcyAqIHBpY3dpZHRoICsgeF9wb3M7Ci0KLSAgICB5X2luYyA9IHlfaW5jMDsgIC8qIHN0YXJ0IHdpdGggdG9wIGhhbGYgKi8KLQotICAgIG9mZnNldCA9IDI0IC0gYmxrd2lkdGg7IC8qIHRvIHVzZSBpbiBvZmZzZXQgb3V0ICovCi0gICAgYmxrd2lkdGggLT0geF9taWQ7IC8qIHRvIHVzZSBpbiB0aGUgbG9vcCBsaW1pdCAqLwotCi0gICAgaWYgKHhfaW5jMCA9PSAwKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaiA9PSB5X21pZCkgIC8qIHB1dCBhIGNoZWNrIGhlcmUgdG8gcmVkdWNlIHRoZSBjb2RlIHNpemUgKGZvciB1bnJvbGxpbmcgdGhlIGxvb3ApICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeV9pbmMgPSB5X2luYzE7ICAvKiBzd2l0Y2ggdG8gbG93ZXIgaGFsZiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0geF9taWQ7IGkgPiAwOyBpLS0pICAgLyogZmlyc3Qgb3IgdGhpcmQgcXVhcnRlciAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpvdXQrKyA9ICpyZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGktLSkgIC8qIHNlY29uZCBvciBmb3VydGggcXVhcnRlciAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpvdXQrKyA9ICpyZWYrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCArPSBvZmZzZXQ7Ci0gICAgICAgICAgICByZWYgKz0geV9pbmM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaiA9PSB5X21pZCkgIC8qIHB1dCBhIGNoZWNrIGhlcmUgdG8gcmVkdWNlIHRoZSBjb2RlIHNpemUgKGZvciB1bnJvbGxpbmcgdGhlIGxvb3ApICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeV9pbmMgPSB5X2luYzE7ICAvKiBzd2l0Y2ggdG8gbG93ZXIgaGFsZiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0geF9taWQ7IGkgPiAwOyBpLS0pICAgLyogZmlyc3Qgb3IgdGhpcmQgcXVhcnRlciAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpvdXQrKyA9ICpyZWYrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaS0tKSAgLyogc2Vjb25kIG9yIGZvdXJ0aCBxdWFydGVyICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKnJlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCArPSBvZmZzZXQ7Ci0gICAgICAgICAgICByZWYgKz0geV9pbmM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIEhvcnpJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KQotewotICAgIHVpbnQ4ICpwX3JlZjsKLSAgICB1aW50MzIgKnBfY3VyOwotICAgIHVpbnQzMiB0bXAsIHBrcmVzOwotICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OwotICAgIGludCBqOwotICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7Ci0gICAgaW50MzIgcjEzLCByNjsKLQotICAgIHBfY3VyID0gKHVpbnQzMiopb3V0OyAvKiBhc3N1bWUgaXQncyB3b3JkIGFsaWduZWQgKi8KLSAgICBjdXJyX29mZnNldCA9IChvdXRwaXRjaCAtIGJsa3dpZHRoKSA+PiAyOwotICAgIHBfcmVmID0gaW47Ci0gICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKLQotICAgIGlmIChkeCYxKQotICAgIHsKLSAgICAgICAgZHggPSAoKGR4ID4+IDEpID8gLTMgOiAtNCk7IC8qIHVzZSBpbiAzLzQgcGVsICovCi0gICAgICAgIHBfcmVmIC09IDI7Ci0gICAgICAgIHIxMyA9IDA7Ci0gICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7Ci0gICAgICAgICAgICByMCA9IHBfcmVmWzBdOwotICAgICAgICAgICAgcjEgPSBwX3JlZlsyXTsKLSAgICAgICAgICAgIHIwIHw9IChyMSA8PCAxNik7ICAgICAgICAgICAvKiAwLGMsMCxhICovCi0gICAgICAgICAgICByMSA9IHBfcmVmWzFdOwotICAgICAgICAgICAgcjIgPSBwX3JlZlszXTsKLSAgICAgICAgICAgIHIxIHw9IChyMiA8PCAxNik7ICAgICAgICAgICAvKiAwLGQsMCxiICovCi0gICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7IC8qIG1vdmUgcG9pbnRlciB0byBlICovCi0gICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsyXTsKLSAgICAgICAgICAgICAgICByMiB8PSAocjMgPDwgMTYpOyAgICAgICAgICAgLyogMCxnLDAsZSAqLwotICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMV07Ci0gICAgICAgICAgICAgICAgcjQgPSBwX3JlZlszXTsKLSAgICAgICAgICAgICAgICByMyB8PSAocjQgPDwgMTYpOyAgICAgICAgICAgLyogMCxoLDAsZiAqLwotCi0gICAgICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLwotICAgICAgICAgICAgICAgIHI1ID0gcjAgKyByMTsgICAvKiBjK2QsIGErYiAqLwotICAgICAgICAgICAgICAgIHI2ID0gcjIgKyByMzsgICAvKiBnK2gsIGUrZiAqLwotICAgICAgICAgICAgICAgIHI1ID4+PSAxNjsKLSAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOyAgIC8qIGUrZiwgYytkICovCi0gICAgICAgICAgICAgICAgcjQgKz0gcjUgKiAyMDsgICAgICAvKiBjKzIwKmUrMjAqZitoLCBhKzIwKmMrMjAqZCtmICovCi0gICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCi0gICAgICAgICAgICAgICAgcjUgPSByMSArIHIyOyAgICAgICAvKiBkK2csIGIrZSAqLwotICAgICAgICAgICAgICAgIHI0IC09IHI1ICogNTsgICAgICAgLyogYy01KmQrMjAqZSsyMCpmLTUqZytoLCBhLTUqYisyMCpjKzIwKmQtNSplK2YgKi8KLSAgICAgICAgICAgICAgICByNCA+Pj0gNTsKLSAgICAgICAgICAgICAgICByMTMgfD0gcjQ7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KLQotICAgICAgICAgICAgICAgIHI1ID0gcF9yZWZbZHgrMl07Ci0gICAgICAgICAgICAgICAgcjYgPSBwX3JlZltkeCs0XTsKLSAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOwotICAgICAgICAgICAgICAgIHI0ICs9IHI1OwotICAgICAgICAgICAgICAgIHI0ICs9IDB4MTAwMDE7Ci0gICAgICAgICAgICAgICAgcjQgPSAocjQgPj4gMSkgJiAweEZGMDBGRjsKLQotICAgICAgICAgICAgICAgIHI1ID0gcF9yZWZbNF07ICAvKiBpICovCi0gICAgICAgICAgICAgICAgcjYgPSAocjUgPDwgMTYpOwotICAgICAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KLSAgICAgICAgICAgICAgICByNSArPSByMTsgICAgICAgLyogZCtpLCBiK2cgKi8gLyogcjUgbm90IGZyZWUgKi8KLSAgICAgICAgICAgICAgICByMSA+Pj0gMTY7Ci0gICAgICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAvKiBmK2csIGQrZSAqLwotICAgICAgICAgICAgICAgIHI1ICs9IDIwICogcjE7ICAvKiBkKzIwZisyMGcraSwgYisyMGQrMjBlK2cgKi8KLSAgICAgICAgICAgICAgICByMCA+Pj0gMTY7Ci0gICAgICAgICAgICAgICAgcjAgfD0gKHIyIDw8IDE2KTsgLyogMCxlLDAsYyAqLyAvKiByMCBoYXMgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAvKiBlK2gsIGMrZiAqLwotICAgICAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLwotICAgICAgICAgICAgICAgIHI1IC09IHIwICogNTsgICAgICAgLyogZC01ZSsyMGYrMjBnLTVoK2ksIGItNWMrMjBkKzIwZS01ZitnICovCi0gICAgICAgICAgICAgICAgcjUgPj49IDU7Ci0gICAgICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCi0KLSAgICAgICAgICAgICAgICByMCA9IHBfcmVmW2R4KzNdOwotICAgICAgICAgICAgICAgIHIxID0gcF9yZWZbZHgrNV07Ci0gICAgICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsKLSAgICAgICAgICAgICAgICByNSArPSByMDsKLSAgICAgICAgICAgICAgICByNSArPSAweDEwMDAxOwotICAgICAgICAgICAgICAgIHI1ID0gKHI1ID4+IDEpICYgMHhGRjAwRkY7Ci0KLSAgICAgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLwotICAgICAgICAgICAgICAgICpwX2N1cisrID0gcjQ7Ci0gICAgICAgICAgICAgICAgcjEgPSByMzsKLSAgICAgICAgICAgICAgICByMCA9IHIyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLwotCi0gICAgICAgICAgICBpZiAocjEzJjB4RkYwMDA3MDApIC8qIG5lZWQgY2xpcHBpbmcgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBtb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLwotICAgICAgICAgICAgICAgIHBfcmVmIC09IChyZWZfb2Zmc2V0ICsgYmxrd2lkdGgpOyAgIC8qIGlucHV0ICovCi0gICAgICAgICAgICAgICAgcF9jdXIgLT0gKG91dHBpdGNoID4+IDIpOwotCi0gICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7Ci0gICAgICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgcGtyZXMgPSAocmVzdWx0ID4+IDEpIDsKLSAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOwotICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOwotICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKLSAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7ICAvKiBvZmZzZXQgYmFjayB0byB0aGUgbWlkZGxlIG9mIGZpbHRlciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBfcmVmIC09IDI7Ci0gICAgICAgIHIxMyA9IDA7Ci0gICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7Ci0gICAgICAgICAgICByMCA9IHBfcmVmWzBdOwotICAgICAgICAgICAgcjEgPSBwX3JlZlsyXTsKLSAgICAgICAgICAgIHIwIHw9IChyMSA8PCAxNik7ICAgICAgICAgICAvKiAwLGMsMCxhICovCi0gICAgICAgICAgICByMSA9IHBfcmVmWzFdOwotICAgICAgICAgICAgcjIgPSBwX3JlZlszXTsKLSAgICAgICAgICAgIHIxIHw9IChyMiA8PCAxNik7ICAgICAgICAgICAvKiAwLGQsMCxiICovCi0gICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7IC8qIG1vdmUgcG9pbnRlciB0byBlICovCi0gICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsyXTsKLSAgICAgICAgICAgICAgICByMiB8PSAocjMgPDwgMTYpOyAgICAgICAgICAgLyogMCxnLDAsZSAqLwotICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMV07Ci0gICAgICAgICAgICAgICAgcjQgPSBwX3JlZlszXTsKLSAgICAgICAgICAgICAgICByMyB8PSAocjQgPDwgMTYpOyAgICAgICAgICAgLyogMCxoLDAsZiAqLwotCi0gICAgICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLwotICAgICAgICAgICAgICAgIHI1ID0gcjAgKyByMTsgICAvKiBjK2QsIGErYiAqLwotICAgICAgICAgICAgICAgIHI2ID0gcjIgKyByMzsgICAvKiBnK2gsIGUrZiAqLwotICAgICAgICAgICAgICAgIHI1ID4+PSAxNjsKLSAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOyAgIC8qIGUrZiwgYytkICovCi0gICAgICAgICAgICAgICAgcjQgKz0gcjUgKiAyMDsgICAgICAvKiBjKzIwKmUrMjAqZitoLCBhKzIwKmMrMjAqZCtmICovCi0gICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCi0gICAgICAgICAgICAgICAgcjUgPSByMSArIHIyOyAgICAgICAvKiBkK2csIGIrZSAqLwotICAgICAgICAgICAgICAgIHI0IC09IHI1ICogNTsgICAgICAgLyogYy01KmQrMjAqZSsyMCpmLTUqZytoLCBhLTUqYisyMCpjKzIwKmQtNSplK2YgKi8KLSAgICAgICAgICAgICAgICByNCA+Pj0gNTsKLSAgICAgICAgICAgICAgICByMTMgfD0gcjQ7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KLSAgICAgICAgICAgICAgICByNCAmPSAweEZGMDBGRjsgLyogbWFzayAqLwotCi0gICAgICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KLSAgICAgICAgICAgICAgICByNiA9IChyNSA8PCAxNik7Ci0gICAgICAgICAgICAgICAgcjUgPSByNiB8IChyMiA+PiAxNik7LyogMCxpLDAsZyAqLwotICAgICAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLwotICAgICAgICAgICAgICAgIHIxID4+PSAxNjsKLSAgICAgICAgICAgICAgICByMSB8PSAocjMgPDwgMTYpOyAvKiAwLGYsMCxkICovIC8qIHIxIGhhcyBjaGFuZ2VkICovCi0gICAgICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCi0gICAgICAgICAgICAgICAgcjUgKz0gMjAgKiByMTsgIC8qIGQrMjBmKzIwZytpLCBiKzIwZCsyMGUrZyAqLwotICAgICAgICAgICAgICAgIHIwID4+PSAxNjsKLSAgICAgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCi0gICAgICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgIC8qIGUraCwgYytmICovCi0gICAgICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTA7IC8qIDE2LDE2ICovCi0gICAgICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KLSAgICAgICAgICAgICAgICByNSA+Pj0gNTsKLSAgICAgICAgICAgICAgICByMTMgfD0gcjU7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KLSAgICAgICAgICAgICAgICByNSAmPSAweEZGMDBGRjsgLyogbWFzayAqLwotCi0gICAgICAgICAgICAgICAgcjQgfD0gKHI1IDw8IDgpOyAgICAvKiBwYWNrIHRoZW0gdG9nZXRoZXIgKi8KLSAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHI0OwotICAgICAgICAgICAgICAgIHIxID0gcjM7Ci0gICAgICAgICAgICAgICAgcjAgPSByMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KLQotICAgICAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbW92ZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KLSAgICAgICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLwotICAgICAgICAgICAgICAgIHBfY3VyIC09IChvdXRwaXRjaCA+PiAyKTsKLQotICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOwotICAgICAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOwotICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgcGtyZXMgID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOwotICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOwotICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKLSAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgICAvKiB3cml0ZSA0IHBpeGVscyAqLwotICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSA1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCi0gICAgICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KQotewotICAgIGludCAqcF9yZWY7Ci0gICAgdWludDMyICpwX2N1cjsKLSAgICB1aW50MzIgdG1wLCBwa3JlczsKLSAgICBpbnQgcmVzdWx0LCByZXN1bHQyLCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKLSAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKLQotICAgIHBfY3VyID0gKHVpbnQzMiopb3V0OyAvKiBhc3N1bWUgaXQncyB3b3JkIGFsaWduZWQgKi8KLSAgICBjdXJyX29mZnNldCA9IChvdXRwaXRjaCAtIGJsa3dpZHRoKSA+PiAyOwotICAgIHBfcmVmID0gaW47Ci0gICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKLQotICAgIGlmIChkeCYxKQotICAgIHsKLSAgICAgICAgZHggPSAoKGR4ID4+IDEpID8gLTMgOiAtNCk7IC8qIHVzZSBpbiAzLzQgcGVsICovCi0KLSAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMCA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7Ci0gICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICByMCA9IHBfcmVmWy0yXTsKLSAgICAgICAgICAgICAgICByMSA9IHBfcmVmWy0xXTsKLSAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOwotICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOwotICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQotICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOwotICAgICAgICAgICAgICAgIHBrcmVzID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKLSAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKLSAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOwotICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCi0gICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7Ci0gICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCi0gICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7Ci0gICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBwX3JlZiAtPSAzOyAgLyogb2Zmc2V0IGJhY2sgdG8gdGhlIG1pZGRsZSBvZiBmaWx0ZXIgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCi0gICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwIDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKLSAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOwotICAgICAgICAgICAgICAgIHIxID0gcF9yZWZbLTFdOwotICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7Ci0gICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7Ci0gICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcGtyZXMgID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOwotICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOwotICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOwotICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOwotICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKLSAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAvKiB3cml0ZSA0IHBpeGVscyAqLwotICAgICAgICAgICAgICAgIHBfcmVmIC09IDM7ICAvKiBvZmZzZXQgYmFjayB0byB0aGUgbWlkZGxlIG9mIGZpbHRlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7ICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBIb3J6SW50ZXJwM01DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIHVpbnQ4ICpwX3JlZjsKLSAgICBpbnQgICAqcF9jdXI7Ci0gICAgdWludDMyIHRtcDsKLSAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKLSAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKLQotICAgIHBfY3VyID0gb3V0OwotICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpOwotICAgIHBfcmVmID0gaW47Ci0gICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKLQotICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCi0gICAgewotICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKLSAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOwotICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07Ci0gICAgICAgICAgICByMiA9ICpwX3JlZisrOwotICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKLSAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOwotICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7Ci0gICAgICAgICAgICByMCA9IChyMiArIHIzKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7Ci0gICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKLSAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOwotICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7Ci0gICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKLSAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICByMSA9ICpwX3JlZisrOwotICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOwotICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKLSAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOwotICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OwotICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICByMiA9ICpwX3JlZisrOwotICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOwotICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKLSAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOwotICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OwotICAgICAgICAgICAgcF9yZWYgLT0gMzsgLyogbW92ZSBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGZpbHRlciAqLwotICAgICAgICB9Ci0gICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotdm9pZCBWZXJ0SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKLSAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSkKLXsKLSAgICB1aW50OCAqcF9jdXIsICpwX3JlZjsKLSAgICB1aW50MzIgdG1wOwotICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OwotICAgIGludCBqLCBpOwotICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHIxMzsKLSAgICB1aW50OCAgdG1wX2luWzI0XVsyNF07Ci0KLSAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCi0gICAgaWYgKCgodWludDMyKWluKSYweDMpCi0gICAgewotICAgICAgICBDcmVhdGVBbGlnbihpbiwgaW5waXRjaCwgLTIsICZ0bXBfaW5bMF1bMF0sIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKLSAgICAgICAgaW4gPSAmdG1wX2luWzJdWzBdOwotICAgICAgICBpbnBpdGNoID0gMjQ7Ci0gICAgfQotICAgIHBfY3VyID0gb3V0OwotICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KLSAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCi0KLSAgICBjdXJyX29mZnNldCArPSAzOwotCi0gICAgaWYgKGR5JjEpCi0gICAgewotICAgICAgICBkeSA9IChkeSA+PiAxKSA/IDAgOiAtaW5waXRjaDsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgcjEzID0gMDsKLSAgICAgICAgICAgIHBfcmVmID0gaW47Ci0gICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCi0gICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCi0gICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKLSAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCi0gICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7Ci0KLSAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCi0gICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgICAgIHIwICs9IHIxOwotICAgICAgICAgICAgICAgIHI2ICs9IHI3OwotCi0gICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KLSAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOwotCi0gICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KLSAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIxICs9IHIyOwotCi0gICAgICAgICAgICAgICAgcjcgKz0gcjg7Ci0KLSAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOwotICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7Ci0gICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7Ci0gICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7Ci0KLSAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCi0gICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCi0gICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSArPSByMjsKLQotICAgICAgICAgICAgICAgIHI3ICs9IHI4OwotCi0gICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOwotICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKLQotICAgICAgICAgICAgICAgIHIwID4+PSA1OwotICAgICAgICAgICAgICAgIHI2ID4+PSA1OwotICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KLSAgICAgICAgICAgICAgICByMTMgfD0gcjY7Ci0gICAgICAgICAgICAgICAgcjEzIHw9IHIwOwotICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQotCi0gICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGR5KSk7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMCArPSByMTsKLSAgICAgICAgICAgICAgICByNiArPSByMjsKLSAgICAgICAgICAgICAgICByMCArPSAweDEwMDAxOwotICAgICAgICAgICAgICAgIHI2ICs9IDB4MTAwMDE7Ci0gICAgICAgICAgICAgICAgcjAgPSAocjAgPj4gMSkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByNiA9IChyNiA+PiAxKSAmIDB4RkYwMEZGOwotCi0gICAgICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCi0gICAgICAgICAgICAgICAgKigodWludDMyKikocF9jdXIgKz0gb3V0cGl0Y2gpKSA9IHIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgaWYgKHIxMyAmIDB4RkYwMDA3MDApIC8qIHRoaXMgY29sdW1uIG5lZWQgY2xpcHBpbmcgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX2N1ciAtPSA0OwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwX3JlZiA9IGluICsgaTsKLSAgICAgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCi0gICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgcjEzID0gMDsKLSAgICAgICAgICAgIHBfcmVmID0gaW47Ci0gICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCi0gICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCi0gICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKLSAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCi0gICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7Ci0KLSAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCi0gICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgICAgIHIwICs9IHIxOwotICAgICAgICAgICAgICAgIHI2ICs9IHI3OwotCi0gICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KLSAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOwotCi0gICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KLSAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIxICs9IHIyOwotCi0gICAgICAgICAgICAgICAgcjcgKz0gcjg7Ci0KLSAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOwotICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7Ci0gICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7Ci0gICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7Ci0KLSAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCi0gICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCi0gICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKLSAgICAgICAgICAgICAgICByMSArPSByMjsKLQotICAgICAgICAgICAgICAgIHI3ICs9IHI4OwotCi0gICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOwotICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKLQotICAgICAgICAgICAgICAgIHIwID4+PSA1OwotICAgICAgICAgICAgICAgIHI2ID4+PSA1OwotICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KLSAgICAgICAgICAgICAgICByMTMgfD0gcjY7Ci0gICAgICAgICAgICAgICAgcjEzIHw9IHIwOwotICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQotICAgICAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHI2ICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgICAgIHIwIHw9IChyNiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLwotICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcF9jdXIgLT0gNDsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcF9yZWYgPSBpbiArIGk7Ci0gICAgICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKLSAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOwotICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgVmVydEludGVycDJNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKLXsKLSAgICBpbnQgKnBfY3VyOwotICAgIHVpbnQ4ICpwX3JlZjsKLSAgICB1aW50MzIgdG1wOwotICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OwotICAgIGludCBqLCByMCwgcjEsIHIyLCByMywgcjQsIHI1OwotCi0gICAgcF9jdXIgPSBvdXQ7Ci0gICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IGJhY2sgdXAgYW5kIG9uZSBwaXhlbCB0byByaWdodCAqLwotICAgIHJlZl9vZmZzZXQgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiBmb3IgbGltaXQgKi8KLQotICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaisrKQotICAgIHsKLSAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgcF9yZWYgPSBpbisrOwotCi0gICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCi0gICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KLSAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKLSAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOwotICAgICAgICAgICAgcjIgPSAqcF9yZWY7Ci0gICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLwotICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKLSAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOwotICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7Ci0gICAgICAgICAgICByMCA9IChyMiArIHIzKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7Ci0gICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOwotICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7Ci0gICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKLSAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOwotICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKLSAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgIHIyID0gKHIzICsgcjApOwotICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7Ci0gICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOwotICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKLSAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOwotICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCi0gICAgICAgIH0KLSAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBWZXJ0SW50ZXJwM01DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpCi17Ci0gICAgdWludDggKnBfY3VyOwotICAgIGludCAqcF9yZWY7Ci0gICAgdWludDMyIHRtcDsKLSAgICBpbnQgcmVzdWx0LCByZXN1bHQyLCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKLSAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKLQotICAgIHBfY3VyID0gb3V0OwotICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KLSAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCi0KLSAgICBpZiAoZHkmMSkKLSAgICB7Ci0gICAgICAgIGR5ID0gKGR5ID4+IDEpID8gLShpbnBpdGNoIDw8IDEpIDogLShpbnBpdGNoIDw8IDEpIC0gaW5waXRjaDsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHBfcmVmID0gaW4rKzsKLQotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KLSAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCi0gICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOwotICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOwotICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCi0gICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKLSAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKLSAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7Ci0gICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCi0gICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7Ci0gICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCi0gICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQotICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7Ci0gICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHBfcmVmID0gaW4rKzsKLQotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KLSAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCi0gICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOwotICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOwotICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCi0gICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKLSAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOwotICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOwotICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKLSAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOwotICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOwotICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIERpYWdvbmFsSW50ZXJwTUModWludDggKmluMSwgdWludDggKmluMiwgaW50IGlucGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKLXsKLSAgICBpbnQgaiwgaTsKLSAgICBpbnQgcmVzdWx0OwotICAgIHVpbnQ4ICpwX2N1ciwgKnBfcmVmLCAqcF90bXA4OwotICAgIGludCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKLSAgICB1aW50OCB0bXBfcmVzWzI0XVsyNF0sIHRtcF9pblsyNF1bMjRdOwotICAgIHVpbnQzMiAqcF90bXA7Ci0gICAgdWludDMyIHRtcCwgcGtyZXMsIHRtcF9yZXN1bHQ7Ci0gICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKLSAgICBpbnQzMiByNiwgcjcsIHI4LCByOSwgcjEwLCByMTM7Ci0KLSAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOwotICAgIHBfcmVmID0gaW4xIC0gMjsKLSAgICAvKiBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIC8qIG5vdCB3b3JkLWFsaWduZWQgKi8KLSAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgdGltZSB0byBhdm9pZCBjYWxsaW5nIENyZWF0ZUFsaWduICovCi0gICAgLyogIGlmKCgodWludDMyKXBfcmVmKSYweDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENyZWF0ZUFsaWduKHBfcmVmLGlucGl0Y2gsMCwmdG1wX2luWzBdWzBdLGJsa3dpZHRoKzgsYmxraGVpZ2h0KTsKLSAgICAgICAgICAgIHBfcmVmID0gJnRtcF9pblswXVswXTsKLSAgICAgICAgICAgIHJlZl9vZmZzZXQgPSAyNC1ibGt3aWR0aDsKLSAgICAgICAgfSovCi0KLSAgICBwX3RtcCA9ICh1aW50MzIqKSAmICh0bXBfcmVzWzBdWzBdKTsKLSAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCi0gICAgewotICAgICAgICByMTMgPSAwOwotICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKLQotICAgICAgICAvL3IwID0gKigodWludDMyKilwX3JlZik7ICAgLyogZCxjLGIsYSAqLwotICAgICAgICAvL3IxID0gKHIwPj44KSYweEZGMDBGRjsgICAgLyogMCxkLDAsYiAqLwotICAgICAgICAvL3IwICY9IDB4RkYwMEZGOyAgICAgICAgICAgLyogMCxjLDAsYSAqLwotICAgICAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgYSB0aW1lLCAgKi8KLSAgICAgICAgcjAgPSBwX3JlZlswXTsKLSAgICAgICAgcjEgPSBwX3JlZlsyXTsKLSAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KLSAgICAgICAgcjEgPSBwX3JlZlsxXTsKLSAgICAgICAgcjIgPSBwX3JlZlszXTsKLSAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KLQotICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9yMiA9ICooKHVpbnQzMiopKHBfcmVmKz00KSk7LyogaCxnLGYsZSAqLwotICAgICAgICAgICAgLy9yMyA9IChyMj4+OCkmMHhGRjAwRkY7ICAvKiAwLGgsMCxmICovCi0gICAgICAgICAgICAvL3IyICY9IDB4RkYwMEZGOyAgICAgICAgICAgLyogMCxnLDAsZSAqLwotICAgICAgICAgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IGEgdGltZSwgICovCi0gICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7Ci0gICAgICAgICAgICByMyA9IHBfcmVmWzJdOwotICAgICAgICAgICAgcjIgfD0gKHIzIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KLSAgICAgICAgICAgIHIzID0gcF9yZWZbMV07Ci0gICAgICAgICAgICByNCA9IHBfcmVmWzNdOwotICAgICAgICAgICAgcjMgfD0gKHI0IDw8IDE2KTsgICAgICAgICAgIC8qIDAsaCwwLGYgKi8KLQotICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLwotICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCi0gICAgICAgICAgICByNiA9IHIyICsgcjM7ICAgLyogZytoLCBlK2YgKi8KLSAgICAgICAgICAgIHI1ID4+PSAxNjsKLSAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KLSAgICAgICAgICAgIHI0ICs9IHI1ICogMjA7ICAgICAgLyogYysyMCplKzIwKmYraCwgYSsyMCpjKzIwKmQrZiAqLwotICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCi0gICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCi0gICAgICAgICAgICByNCAtPSByNSAqIDU7ICAgICAgIC8qIGMtNSpkKzIwKmUrMjAqZi01KmcraCwgYS01KmIrMjAqYysyMCpkLTUqZStmICovCi0gICAgICAgICAgICByNCA+Pj0gNTsKLSAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLwotICAgICAgICAgICAgcjQgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KLQotICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KLSAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKLSAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KLSAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLwotICAgICAgICAgICAgcjEgPj49IDE2OwotICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLwotICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCi0gICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCi0gICAgICAgICAgICByMCA+Pj0gMTY7Ci0gICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCi0gICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KLSAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLwotICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KLSAgICAgICAgICAgIHI1ID4+PSA1OwotICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCi0gICAgICAgICAgICByNSAmPSAweEZGMDBGRjsgLyogbWFzayAqLwotCi0gICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLwotICAgICAgICAgICAgKnBfdG1wKysgPSByNDsKLSAgICAgICAgICAgIHIxID0gcjM7Ci0gICAgICAgICAgICByMCA9IHIyOwotICAgICAgICB9Ci0gICAgICAgIHBfdG1wICs9ICgoMjQgLSBibGt3aWR0aCkgPj4gMik7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCi0KLSAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCi0gICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLwotICAgICAgICAgICAgcF90bXAgLT0gNjsgLyogaW50ZXJtZWRpYXRlIG91dHB1dCAqLwotICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7Ci0gICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7Ci0gICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKLSAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcGtyZXMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7Ci0gICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7Ci0gICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgOCk7Ci0gICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgcGtyZXMgfD0gKHJlc3VsdCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7Ci0gICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgMjQpOwotCi0gICAgICAgICAgICAgICAgKnBfdG1wKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbCAqLwotICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX3RtcCArPSAoKDI0IC0gYmxrd2lkdGgpID4+IDIpOyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KLSAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCi0gICAgaWYgKCgodWludDMyKWluMikmMHgzKQotICAgIHsKLSAgICAgICAgQ3JlYXRlQWxpZ24oaW4yLCBpbnBpdGNoLCAtMiwgJnRtcF9pblswXVswXSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOwotICAgICAgICBpbjIgPSAmdG1wX2luWzJdWzBdOwotICAgICAgICBpbnBpdGNoID0gMjQ7Ci0gICAgfQotCi0gICAgcF9jdXIgPSBvdXQ7Ci0gICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IHVwIGFuZCBvbmUgcGl4ZWwgcmlnaHQgKi8KLSAgICBwa3JlcyA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIHJldXNlIGl0IGZvciBsaW1pdCAqLwotCi0gICAgY3Vycl9vZmZzZXQgKz0gMzsKLQotICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0LCBpbjIgKz0gNCkKLSAgICB7Ci0gICAgICAgIHIxMyA9IDA7Ci0gICAgICAgIHBfcmVmID0gaW4yOwotICAgICAgICBwX3RtcDggPSAmKHRtcF9yZXNbMF1bal0pOyAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCi0gICAgICAgIHBfdG1wOCAtPSAyNDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KLSAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCi0gICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcGtyZXMpOyAvKiBsaW1pdCAqLwotICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyogUmVhZCAxIGJ5dGUgYXQgYSB0aW1lIGlzIHRvbyBzbG93LCB0b28gbWFueSByZWFkIGFuZCBwYWNrIG9wcywgbmVlZCB0byBjYWxsIENyZWF0ZUFsaWduLCAgKi8KLSAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYtKGlucGl0Y2g8PDEpOyAgICAgICAgICByMCA9IHBfcmVmOFswXTsgICAgICAgICByMSA9IHBfcmVmOFsyXTsKLSAgICAgICAgICAgIHIwIHw9IChyMTw8MTYpOyAgICAgICAgIHI2ID0gcF9yZWY4WzFdOyAgICAgICAgIHIxID0gcF9yZWY4WzNdOwotICAgICAgICAgICAgcjYgfD0gKHIxPDwxNik7ICAgICAgICAgcF9yZWYrPWlucGl0Y2g7ICovCi0gICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCi0gICAgICAgICAgICBwX3JlZiArPSBpbnBpdGNoOwotICAgICAgICAgICAgcjYgPSAocjAgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLwotICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7Ci0KLSAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYrKGlucGl0Y2g8PDEpOwotICAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07ICAgICAgICAgcjEgfD0gKHI3PDwxNik7Ci0gICAgICAgICAgICByNyA9IHBfcmVmOFsxXTsgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLwotICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIChpbnBpdGNoIDw8IDEpKSk7ICAvKiByMSwgcjcsIHJlZlszXSAqLwotICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOwotCi0gICAgICAgICAgICByMCArPSByMTsKLSAgICAgICAgICAgIHI2ICs9IHI3OwotCi0gICAgICAgICAgICAvKnIyID0gcF9yZWZbMF07ICAgICAgICAgICAgcjggPSBwX3JlZlsyXTsgICAgICAgICAgcjIgfD0gKHI4PDwxNik7Ci0gICAgICAgICAgICByOCA9IHBfcmVmWzFdOyAgICAgICAgICByMSA9IHBfcmVmWzNdOyAgICAgICAgICByOCB8PSAocjE8PDE2KTsqLwotICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KLSAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi1pbnBpdGNoOyAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07Ci0gICAgICAgICAgICByMSB8PSAocjc8PDE2KTsgICAgICAgICByMSArPSByMjsgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOwotICAgICAgICAgICAgcjIgPSBwX3JlZjhbM107ICAgICAgICAgcjcgfD0gKHIyPDwxNik7Ki8KLSAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgLSBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzBdICovCi0gICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7Ci0gICAgICAgICAgICByMSArPSByMjsKLQotICAgICAgICAgICAgcjcgKz0gcjg7Ci0KLSAgICAgICAgICAgIHIwICs9IDIwICogcjE7Ci0gICAgICAgICAgICByNiArPSAyMCAqIHI3OwotICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7Ci0gICAgICAgICAgICByNiArPSAweDEwMDAxMDsKLQotICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi0oaW5waXRjaDw8MSk7ICAgICAgICAgIHIyID0gcF9yZWY4WzBdOyAgICAgICAgIHI4ID0gcF9yZWY4WzJdOwotICAgICAgICAgICAgcjIgfD0gKHI4PDwxNik7ICAgICAgICAgcjggPSBwX3JlZjhbMV07ICAgICAgICAgcjEgPSBwX3JlZjhbM107ICAgICAgICAgcjggfD0gKHIxPDwxNik7Ki8KLSAgICAgICAgICAgIHIyID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiByMiwgcjgsIHJlZlstMV0gKi8KLSAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKLQotICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZitpbnBpdGNoOyAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07Ci0gICAgICAgICAgICByMSB8PSAocjc8PDE2KTsgICAgICAgICByMSArPSByMjsgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOwotICAgICAgICAgICAgcjIgPSBwX3JlZjhbM107ICAgICAgICAgcjcgfD0gKHIyPDwxNik7Ki8KLSAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCi0gICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7Ci0gICAgICAgICAgICByMSArPSByMjsKLQotICAgICAgICAgICAgcjcgKz0gcjg7Ci0KLSAgICAgICAgICAgIHIwIC09IDUgKiByMTsKLSAgICAgICAgICAgIHI2IC09IDUgKiByNzsKLQotICAgICAgICAgICAgcjAgPj49IDU7Ci0gICAgICAgICAgICByNiA+Pj0gNTsKLSAgICAgICAgICAgIC8qIGNsaXAgKi8KLSAgICAgICAgICAgIHIxMyB8PSByNjsKLSAgICAgICAgICAgIHIxMyB8PSByMDsKLSAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQotICAgICAgICAgICAgLyogYWRkIHdpdGggaG9yaXpvbnRhbCByZXN1bHRzICovCi0gICAgICAgICAgICByMTAgPSAqKCh1aW50MzIqKShwX3RtcDggKz0gMjQpKTsKLSAgICAgICAgICAgIHI5ID0gKHIxMCA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICAgICAgcjEwICY9IDB4RkYwMEZGOwotCi0gICAgICAgICAgICByMCArPSByMTA7Ci0gICAgICAgICAgICByMCArPSAweDEwMDAxOwotICAgICAgICAgICAgcjAgPSAocjAgPj4gMSkgJiAweEZGMDBGRjsgICAvKiBtYXNrIHRvIDggYnl0ZXMgKi8KLQotICAgICAgICAgICAgcjYgKz0gcjk7Ci0gICAgICAgICAgICByNiArPSAweDEwMDAxOwotICAgICAgICAgICAgcjYgPSAocjYgPj4gMSkgJiAweEZGMDBGRjsgICAvKiBtYXNrIHRvIDggYnl0ZXMgKi8KLQotICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCi0gICAgICAgICAgICAqKCh1aW50MzIqKShwX2N1ciArPSBvdXRwaXRjaCkpID0gcjA7Ci0gICAgICAgIH0KLSAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLwotICAgICAgICBpZiAocjEzICYgMHhGRjAwMDcwMCkgLyogdGhpcyBjb2x1bW4gbmVlZCBjbGlwcGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwX2N1ciAtPSA0OwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX3JlZiA9IGluMiArIGk7Ci0gICAgICAgICAgICAgICAgcF90bXA4ID0gJih0bXBfcmVzWzBdW2oraV0pOyAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCi0gICAgICAgICAgICAgICAgcF90bXA4IC09IDI0OyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcGtyZXMpOyAvKiBsaW1pdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKSAgLyogdGhlIGxvb3AgdW4tcm9sbGVkICAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOwotICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7Ci0gICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKLSAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKLSAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOwotICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOwotICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OwotICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7Ci0gICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKLSAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOwotICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotLyogcG9zaXRpb24gRyAqLwotdm9pZCBGdWxsUGVsTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAotICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIGludCBpLCBqOwotICAgIGludCBvZmZzZXRfaW4gPSBpbnBpdGNoIC0gYmxrd2lkdGg7Ci0gICAgaW50IG9mZnNldF9vdXQgPSBvdXRwaXRjaCAtIGJsa3dpZHRoOwotICAgIHVpbnQzMiB0ZW1wOwotICAgIHVpbnQ4IGJ5dGU7Ci0KLSAgICBpZiAoKCh1aW50MzIpaW4pJjMpCi0gICAgewotICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaSAtPSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSAqaW4rKzsKLSAgICAgICAgICAgICAgICBieXRlID0gKmluKys7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCA4KTsKLSAgICAgICAgICAgICAgICBieXRlID0gKmluKys7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCAxNik7Ci0gICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOwotICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgMjQpOwotCi0gICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gdGVtcDsgLyogd3JpdGUgNCBieXRlcyAqLwotICAgICAgICAgICAgICAgIG91dCArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ICs9IG9mZnNldF9vdXQ7Ci0gICAgICAgICAgICBpbiArPSBvZmZzZXRfaW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKigodWludDMyKilpbik7Ci0gICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gdGVtcDsKLSAgICAgICAgICAgICAgICBpbiArPSA0OwotICAgICAgICAgICAgICAgIG91dCArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ICs9IG9mZnNldF9vdXQ7Ci0gICAgICAgICAgICBpbiArPSBvZmZzZXRfaW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBDaHJvbWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHJlZCwgaW50IHByZWRfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIGludCBkeCwgZHk7Ci0gICAgaW50IG9mZnNldF9keCwgb2Zmc2V0X2R5OwotICAgIGludCBpbmRleDsKLSAgICB1aW50OCB0ZW1wWzI0XVsyNF07Ci0KLSAgICBkeCA9IHhfcG9zICYgNzsKLSAgICBkeSA9IHlfcG9zICYgNzsKLSAgICBvZmZzZXRfZHggPSAoZHggKyA3KSA+PiAzOwotICAgIG9mZnNldF9keSA9IChkeSArIDcpID4+IDM7Ci0gICAgeF9wb3MgPSB4X3BvcyA+PiAzOyAgLyogcm91bmQgaXQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbiAqLwotICAgIHlfcG9zID0geV9wb3MgPj4gMzsKLQotICAgIGlmICgoeF9wb3MgPj0gMCAmJiB4X3BvcyArIGJsa3dpZHRoICsgb2Zmc2V0X2R4IDw9IHBpY3dpZHRoKSAmJiAoeV9wb3MgPj0gMCAmJiB5X3BvcyArIGJsa2hlaWdodCArIG9mZnNldF9keSA8PSBwaWNoZWlnaHQpKQotICAgIHsKLSAgICAgICAgcmVmICs9IHlfcG9zICogcGljd2lkdGggKyB4X3BvczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ3JlYXRlUGFkKHJlZiwgcGljd2lkdGgsIHBpY2hlaWdodCwgeF9wb3MsIHlfcG9zLCAmdGVtcFswXVswXSwgYmxrd2lkdGggKyBvZmZzZXRfZHgsIGJsa2hlaWdodCArIG9mZnNldF9keSk7Ci0gICAgICAgIHJlZiA9ICZ0ZW1wWzBdWzBdOwotICAgICAgICBwaWN3aWR0aCA9IDI0OwotICAgIH0KLQotICAgIGluZGV4ID0gb2Zmc2V0X2R4ICsgKG9mZnNldF9keSA8PCAxKSArICgoYmxrd2lkdGggPDwgMSkgJiAweDcpOwotCi0gICAgKCooQ2hyb21hTUNfU0lNRFtpbmRleF0pKShyZWYsIHBpY3dpZHRoICwgZHgsIGR5LCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0KTsKLSAgICByZXR1cm4gOwotfQotCi0KLS8qIFNJTUQgcm91dGluZXMsIHVucm9sbCB0aGUgbG9vcHMgaW4gdmVydGljYWwgZGlyZWN0aW9uLCBkZWNyZWFzaW5nIGxvb3BzICh0aGluZ3MgdG8gYmUgZG9uZSkgICovCi12b2lkIENocm9tYURpYWdvbmFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCi17Ci0gICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHJlc3VsdDAsIHJlc3VsdDE7Ci0gICAgdWludDggdGVtcFsyODhdOwotICAgIHVpbnQ4ICpyZWYsICpvdXQ7Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGR4XzggPSA4IC0gZHg7Ci0gICAgaW50IGR5XzggPSA4IC0gZHk7Ci0KLSAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCi0gICAgb3V0ID0gdGVtcDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0ICsgMTsgaSsrKQotICAgIHsKLSAgICAgICAgcmVmID0gcFJlZjsKLSAgICAgICAgcjAgPSByZWZbMF07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICByMCB8PSAocmVmWzJdIDw8IDE2KTsKLSAgICAgICAgICAgIHJlc3VsdDAgPSBkeF84ICogcjA7Ci0KLSAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7Ci0gICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7Ci0gICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MDsKLQotICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMTsKLQotICAgICAgICAgICAgcjIgPSByZWZbNF07Ci0gICAgICAgICAgICByMCA9IHIwID4+IDE2OwotICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7Ci0gICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7Ci0gICAgICAgICAgICAqKGludDMyICopKG91dCArIDE2KSA9IHJlc3VsdDA7Ci0KLSAgICAgICAgICAgIHJlZiArPSA0OwotICAgICAgICAgICAgb3V0ICs9IDQ7Ci0gICAgICAgICAgICByMCA9IHIyOwotICAgICAgICB9Ci0gICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7Ci0gICAgICAgIG91dCArPSAoMzIgLSBibGt3aWR0aCk7Ci0gICAgfQotCi0vLyAgcFJlZiAtPSBzcmNQaXRjaCooYmxraGVpZ2h0KzEpOwotICAgIHJlZiA9IHRlbXA7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCkKLSAgICB7Ci0gICAgICAgIHIwID0gKihpbnQzMiAqKXJlZjsKLSAgICAgICAgcjEgPSAqKGludDMyICopKHJlZiArIDE2KTsKLSAgICAgICAgcmVmICs9IDMyOwotICAgICAgICBvdXQgPSBwT3V0OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGJsa2hlaWdodCA+PiAxKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKLSAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKLSAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKLSAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7Ci0gICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICByMCA9IHIyOwotCi0gICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKLSAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7Ci0gICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7Ci0gICAgICAgICAgICByZXN1bHQxID4+PSA2OwotICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOwotICAgICAgICAgICAgcjEgPSByMzsKLSAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7Ci0gICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOwotICAgICAgICAgICAgcmVmICs9IDMyOwotCi0gICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKLSAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKLSAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKLSAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7Ci0gICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICByMCA9IHIyOwotCi0gICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKLSAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7Ci0gICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7Ci0gICAgICAgICAgICByZXN1bHQxID4+PSA2OwotICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOwotICAgICAgICAgICAgcjEgPSByMzsKLSAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7Ci0gICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOwotICAgICAgICAgICAgcmVmICs9IDMyOwotICAgICAgICB9Ci0gICAgICAgIHBPdXQgKz0gNDsKLSAgICAgICAgcmVmID0gdGVtcCArIDQ7IC8qIHNpbmNlIGl0IGNhbiBvbmx5IGl0ZXJhdGUgdHdpY2UgbWF4ICAqLwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCi17Ci0gICAgT1NDTF9VTlVTRURfQVJHKGR5KTsKLSAgICBpbnQzMiByMCwgcjEsIHIyLCByZXN1bHQwLCByZXN1bHQxOwotICAgIHVpbnQ4ICpyZWYsICpvdXQ7Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IGR4XzggPSA4IC0gZHg7Ci0KLSAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgcmVmID0gcFJlZjsKLSAgICAgICAgb3V0ID0gcE91dDsKLQotICAgICAgICByMCA9IHJlZlswXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHIwIHw9IChyZWZbMl0gPDwgMTYpOwotICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMCArIDB4MDAwNDAwMDQ7Ci0KLSAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7Ci0gICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7Ci0gICAgICAgICAgICByZXN1bHQwID4+PSAzOwotICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOwotCi0gICAgICAgICAgICByZXN1bHQxID0gZHhfOCAqIHIxICsgMHgwMDA0MDAwNDsKLQotICAgICAgICAgICAgcjIgPSByZWZbNF07Ci0gICAgICAgICAgICByMCA9IHIwID4+IDE2OwotICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7Ci0gICAgICAgICAgICByZXN1bHQxICs9IGR4ICogcjE7Ci0gICAgICAgICAgICByZXN1bHQxID4+PSAzOwotICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOwotCi0gICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOwotCi0gICAgICAgICAgICByZWYgKz0gNDsKLSAgICAgICAgICAgIG91dCArPSA0OwotICAgICAgICAgICAgcjAgPSByMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7Ci0gICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgQ2hyb21hVmVydGljYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKLXsKLSAgICBPU0NMX1VOVVNFRF9BUkcoZHgpOwotICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByZXN1bHQwLCByZXN1bHQxOwotICAgIGludCBpLCBqOwotICAgIHVpbnQ4ICpyZWYsICpvdXQ7Ci0gICAgaW50IGR5XzggPSA4IC0gZHk7Ci0gICAgLyogdmVydGljYWwgZmlyc3QgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKLSAgICB7Ci0gICAgICAgIHJlZiA9IHBSZWY7Ci0gICAgICAgIG91dCA9IHBPdXQ7Ci0KLSAgICAgICAgcjAgPSByZWZbMF0gfCAocmVmWzJdIDw8IDE2KTsKLSAgICAgICAgcjEgPSByZWZbMV0gfCAocmVmWzNdIDw8IDE2KTsKLSAgICAgICAgcmVmICs9IHNyY1BpdGNoOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdDAgPSBkeV84ICogcjAgKyAweDAwMDQwMDA0OwotICAgICAgICAgICAgcjIgPSByZWZbMF0gfCAocmVmWzJdIDw8IDE2KTsKLSAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKLSAgICAgICAgICAgIHJlc3VsdDAgPj49IDM7Ci0gICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICByMCA9IHIyOwotCi0gICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDA0MDAwNDsKLSAgICAgICAgICAgIHIzID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7Ci0gICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7Ci0gICAgICAgICAgICByZXN1bHQxID4+PSAzOwotICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOwotICAgICAgICAgICAgcjEgPSByMzsKLSAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7Ci0gICAgICAgICAgICByZWYgKz0gc3JjUGl0Y2g7Ci0gICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOwotICAgICAgICB9Ci0gICAgICAgIHBPdXQgKz0gNDsKLSAgICAgICAgcFJlZiArPSA0OwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgQ2hyb21hRGlhZ29uYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKLXsKLSAgICBPU0NMX1VOVVNFRF9BUkcoYmxrd2lkdGgpOwotICAgIGludDMyIHIwLCByMSwgdGVtcDAsIHRlbXAxLCByZXN1bHQ7Ci0gICAgaW50MzIgdGVtcFs5XTsKLSAgICBpbnQzMiAqb3V0OwotICAgIGludCBpLCByX3RlbXA7Ci0gICAgaW50IGR5XzggPSA4IC0gZHk7Ci0KLSAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCi0gICAgb3V0ID0gdGVtcDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0ICsgMTsgaSsrKQotICAgIHsKLSAgICAgICAgcl90ZW1wID0gcFJlZlsxXTsKLSAgICAgICAgdGVtcDAgPSAocFJlZlswXSA8PCAzKSArIGR4ICogKHJfdGVtcCAtIHBSZWZbMF0pOwotICAgICAgICB0ZW1wMSA9IChyX3RlbXAgPDwgMykgKyBkeCAqIChwUmVmWzJdIC0gcl90ZW1wKTsKLSAgICAgICAgcjAgPSB0ZW1wMCB8ICh0ZW1wMSA8PCAxNik7Ci0gICAgICAgICpvdXQrKyA9IHIwOwotICAgICAgICBwUmVmICs9IHNyY1BpdGNoOwotICAgIH0KLQotICAgIHBSZWYgLT0gc3JjUGl0Y2ggKiAoYmxraGVpZ2h0ICsgMSk7Ci0KLSAgICBvdXQgPSB0ZW1wOwotCi0gICAgcjAgPSAqb3V0Kys7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICByZXN1bHQgPSBkeV84ICogcjAgKyAweDAwMjAwMDIwOwotICAgICAgICByMSA9ICpvdXQrKzsKLSAgICAgICAgcmVzdWx0ICs9IGR5ICogcjE7Ci0gICAgICAgIHJlc3VsdCA+Pj0gNjsKLSAgICAgICAgcmVzdWx0ICY9IDB4MDBGRjAwRkY7Ci0gICAgICAgICooaW50MTYgKilwT3V0ID0gKHJlc3VsdCA+PiA4KSB8IChyZXN1bHQgJiAweEZGKTsKLSAgICAgICAgcjAgPSByMTsKLSAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIE9TQ0xfVU5VU0VEX0FSRyhkeSk7Ci0gICAgT1NDTF9VTlVTRURfQVJHKGJsa3dpZHRoKTsKLSAgICBpbnQgaSwgdGVtcCwgdGVtcDAsIHRlbXAxOwotCi0gICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgIHRlbXAgPSBwUmVmWzFdOwotICAgICAgICB0ZW1wMCA9ICgocFJlZlswXSA8PCAzKSArIGR4ICogKHRlbXAgLSBwUmVmWzBdKSArIDQpID4+IDM7Ci0gICAgICAgIHRlbXAxID0gKCh0ZW1wIDw8IDMpICsgZHggKiAocFJlZlsyXSAtIHRlbXApICsgNCkgPj4gMzsKLQotICAgICAgICAqKGludDE2ICopcE91dCA9IHRlbXAwIHwgKHRlbXAxIDw8IDgpOwotICAgICAgICBwUmVmICs9IHNyY1BpdGNoOwotICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKLQotICAgIH0KLSAgICByZXR1cm47Ci19Ci12b2lkIENocm9tYVZlcnRpY2FsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKLXsKLSAgICBPU0NMX1VOVVNFRF9BUkcoZHgpOwotICAgIE9TQ0xfVU5VU0VEX0FSRyhibGt3aWR0aCk7Ci0gICAgaW50MzIgcjAsIHIxLCByZXN1bHQ7Ci0gICAgaW50IGk7Ci0gICAgaW50IGR5XzggPSA4IC0gZHk7Ci0gICAgcjAgPSBwUmVmWzBdIHwgKHBSZWZbMV0gPDwgMTYpOwotICAgIHBSZWYgKz0gc3JjUGl0Y2g7Ci0gICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZHlfOCAqIHIwICsgMHgwMDA0MDAwNDsKLSAgICAgICAgcjEgPSBwUmVmWzBdIHwgKHBSZWZbMV0gPDwgMTYpOwotICAgICAgICByZXN1bHQgKz0gZHkgKiByMTsKLSAgICAgICAgcmVzdWx0ID4+PSAzOwotICAgICAgICByZXN1bHQgJj0gMHgwMEZGMDBGRjsKLSAgICAgICAgKihpbnQxNiAqKXBPdXQgPSAocmVzdWx0ID4+IDgpIHwgKHJlc3VsdCAmIDB4RkYpOwotICAgICAgICByMCA9IHIxOwotICAgICAgICBwUmVmICs9IHNyY1BpdGNoOwotICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIENocm9tYUZ1bGxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQotewotICAgIE9TQ0xfVU5VU0VEX0FSRyhkeCk7Ci0gICAgT1NDTF9VTlVTRURfQVJHKGR5KTsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgb2Zmc2V0X2luID0gc3JjUGl0Y2ggLSBibGt3aWR0aDsKLSAgICBpbnQgb2Zmc2V0X291dCA9IHByZWRQaXRjaCAtIGJsa3dpZHRoOwotICAgIHVpbnQxNiB0ZW1wOwotICAgIHVpbnQ4IGJ5dGU7Ci0KLSAgICBpZiAoKCh1aW50MzIpcFJlZikmMSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICpwUmVmKys7Ci0gICAgICAgICAgICAgICAgYnl0ZSA9ICpwUmVmKys7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCA4KTsKLSAgICAgICAgICAgICAgICAqKCh1aW50MTYqKXBPdXQpID0gdGVtcDsgLyogd3JpdGUgMiBieXRlcyAqLwotICAgICAgICAgICAgICAgIHBPdXQgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBPdXQgKz0gb2Zmc2V0X291dDsKLSAgICAgICAgICAgIHBSZWYgKz0gb2Zmc2V0X2luOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQxNiopcFJlZik7Ci0gICAgICAgICAgICAgICAgKigodWludDE2KilwT3V0KSA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcFJlZiArPSAyOwotICAgICAgICAgICAgICAgIHBPdXQgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBPdXQgKz0gb2Zmc2V0X291dDsKLSAgICAgICAgICAgIHBSZWYgKz0gb2Zmc2V0X2luOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiA7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvcHJlZF9pbnRyYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvcHJlZF9pbnRyYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjEzYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3ByZWRfaW50cmEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc4NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgImF2Y2RlY19saWIuaCIKLQotI2RlZmluZSBDTElQX0NPTVAgICpjb21wKysgPSAodWludDgpKCgodWludCl0ZW1wPjB4RkYpPyAweEZGJih+KHRlbXA+PjMxKSk6IHRlbXApCi0jZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKHVpbnQpeCA+IDB4RkYpeyBcCi0gICAgICAgICAgICAgICAgIHggPSAweEZGICYgKH4oeD4+MzEpKTt9Ci0KLQotLyogV2Ugc2hvdWxkIGNvbWJpbmUgdGhlIEludHJhNHg0IGZ1bmN0aW9ucyB3aXRoIHJlc2lkdWFsIGRlY29kaW5nIGFuZCBjb21wZW5zYXRpb24gICovCi1BVkNTdGF0dXMgSW50cmFNQlByZWRpY3Rpb24oQVZDQ29tbW9uT2JqICp2aWRlbykKLXsKLSAgICBpbnQgY29tcG9uZW50LCBTdWJCbG9ja19pbmR4LCB0ZW1wOwotICAgIEFWQ1N0YXR1cyBzdGF0dXM7Ci0gICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKLSAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOwotICAgIHVpbnQ4ICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKLSAgICB1aW50OCAqY29tcDsKLSAgICBpbnQgYmxvY2tfeCwgYmxvY2tfeSwgb2Zmc2V0OwotICAgIGludDE2ICpkYXRhQmxvY2sgPSB2aWRlby0+YmxvY2s7Ci0gICAgdWludDggKnByZWRDYiwgKnByZWRDcjsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgIHVpbnQ4ICpwcmVkOwotI2VuZGlmCi0gICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2g7Ci0gICAgdWludDMyIGNicDR4NCA9IHZpZGVvLT5jYnA0eDQ7Ci0KLSAgICBvZmZzZXQgPSAodmlkZW8tPm1iX3kgPDwgNCkgKiBwaXRjaCArICh2aWRlby0+bWJfeCA8PCA0KTsKLSAgICBjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7Ci0KLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gdmlkZW8tPnByZWQgKyA4NDsgIC8qIHBvaW50IHRvIHNlcGFyYXRlIHByZWRpY3Rpb24gbWVtb3J5ICovCi0gICAgcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOwotICAgIHZpZGVvLT5wcmVkX3BpdGNoID0gMjA7Ci0jZWxzZQotICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gY3VyTDsgICAvKiBwb2ludCBkaXJlY3RseSB0byB0aGUgZnJhbWUgYnVmZmVyICovCi0gICAgdmlkZW8tPnByZWRfcGl0Y2ggPSBwaXRjaDsKLSNlbmRpZgotCi0gICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKLSAgICB7Ci0gICAgICAgIC8qIGx1bWluYW5jZSBmaXJzdCAqLwotICAgICAgICBibG9ja194ID0gYmxvY2tfeSA9IDA7Ci0gICAgICAgIGZvciAoY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgNDsgY29tcG9uZW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrX3ggPSAoKGNvbXBvbmVudCAmIDEpIDw8IDEpOwotICAgICAgICAgICAgYmxvY2tfeSA9ICgoY29tcG9uZW50ID4+IDEpIDw8IDEpOwotICAgICAgICAgICAgY29tcCA9IGN1ckw7Ly8gKyAoYmxvY2tfeDw8MikgKyAoYmxvY2tfeTw8MikqY3VyclBpYy0+cGl0Y2g7Ci0KLSAgICAgICAgICAgIGZvciAoU3ViQmxvY2tfaW5keCA9IDA7IFN1YkJsb2NrX2luZHggPCA0OyBTdWJCbG9ja19pbmR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSW50cmFfNHg0KHZpZGVvLCBibG9ja194LCBibG9ja195LCBjb21wKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ19TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogdHJhbnNmb3JtIGZvbGxvd2luZyB0aGUgNHg0IHByZWRpY3Rpb24sIGNhbid0IGJlIFNJTUQKLSAgICAgICAgICAgICAgICB3aXRoIG90aGVyIGJsb2Nrcy4gKi8KLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgICAgIGlmIChjYnA0eDQmKDEgPDwgKChibG9ja195IDw8IDIpICsgYmxvY2tfeCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXRyYW5zKGRhdGFCbG9jaywgcHJlZCwgcHJlZCwgMjApOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYgKGNicDR4NCYoMSA8PCAoKGJsb2NrX3kgPDwgMikgKyBibG9ja194KSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpdHJhbnMoZGF0YUJsb2NrLCBjb21wLCBjb21wLCBwaXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgdGVtcCA9IFN1YkJsb2NrX2luZHggJiAxOwotICAgICAgICAgICAgICAgIGlmICh0ZW1wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tfeSsrOwotICAgICAgICAgICAgICAgICAgICBibG9ja194LS07Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFCbG9jayArPSA2MDsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgICAgICAgICBwcmVkICs9IDc2OwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgY29tcCArPSAoKHBpdGNoIDw8IDIpIC0gNCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tfeCsrOwotICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sgKz0gNDsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgICAgICAgICBwcmVkICs9IDQ7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBjb21wICs9IDQ7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50JjEpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgICAgICAgICBwcmVkIC09IDg7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGN1ckwgKz0gKHBpdGNoIDw8IDMpIC0gODsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGRhdGFCbG9jayAtPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICAgICAgcHJlZCAtPSAxNTI7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGN1ckwgKz0gODsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGRhdGFCbG9jayAtPSAxMjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2JwNHg0ID4+PSAxNjsKLSAgICB9Ci0gICAgZWxzZSAgIC8qIEFWQ19JMTYgKi8KLSAgICB7Ci0jaWZkZWYgTUJfQkFTRURfREVCTE9DSwotICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wID0gdmlkZW8tPmludHJhX3ByZWRfdG9wICsgKHZpZGVvLT5tYl94IDw8IDQpOwotICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdCA9IHZpZGVvLT5pbnRyYV9wcmVkX2xlZnQgKyAxOwotICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0ID0gdmlkZW8tPmludHJhX3ByZWRfbGVmdFswXTsKLSAgICAgICAgcGl0Y2ggPSAxOwotI2Vsc2UKLSAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcCA9IGN1ckwgLSBwaXRjaDsKLSAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQgPSBjdXJMIC0gMTsKLSAgICAgICAgaWYgKHZpZGVvLT5tYl95KQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0ID0gKihjdXJMIC0gcGl0Y2ggLSAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAoY3Vyck1CLT5pMTZNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEFWQ19JMTZfVmVydGljYWw6ICAgICAgLyogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICAgICAgICAgICAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgdG9wICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEludHJhXzE2eDE2X1ZlcnRpY2FsKHZpZGVvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZDX0kxNl9Ib3Jpem9udGFsOiAgICAgICAgLyogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBsZWZ0ICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEludHJhXzE2eDE2X0hvcml6b250YWwodmlkZW8sIHBpdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZDX0kxNl9EQzogICAgICAgIC8qIEludHJhXzE2eDE2X0RDICovCi0gICAgICAgICAgICAgICAgSW50cmFfMTZ4MTZfREModmlkZW8sIHBpdGNoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZDX0kxNl9QbGFuZTogICAgIC8qIEludHJhXzE2eDE2X1BsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSW50cmFfMTZ4MTZfUGxhbmUodmlkZW8sIHBpdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwaXRjaCA9IGN1cnJQaWMtPnBpdGNoOwotCi0gICAgICAgIC8qIHRyYW5zZm9ybSAqLwotICAgICAgICAvKiBjYW4gZ28gaW4gcmFzdGVyIHNjYW4gb3JkZXIgbm93ICovCi0gICAgICAgIC8qIGNhbiBiZSBkb25lIGluIFNJTUQsICAqLwotICAgICAgICBmb3IgKGJsb2NrX3kgPSA0OyBibG9ja195ID4gMDsgYmxvY2tfeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGJsb2NrX3ggPSA0OyBibG9ja194ID4gMDsgYmxvY2tfeC0tKQotICAgICAgICAgICAgewotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXRyYW5zKGRhdGFCbG9jaywgcHJlZCwgcHJlZCwgMjApOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXRyYW5zKGRhdGFCbG9jaywgY3VyTCwgY3VyTCwgcGl0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIGNicDR4NCA+Pj0gMTsKLSAgICAgICAgICAgICAgICBkYXRhQmxvY2sgKz0gNDsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgICAgIHByZWQgKz0gNDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgY3VyTCArPSA0OwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhQmxvY2sgKz0gNDg7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgICAgIHByZWQgKz0gNjQ7Ci0jZWxzZQotICAgICAgICAgICAgY3VyTCArPSAoKHBpdGNoIDw8IDIpIC0gMTYpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvZmZzZXQgPSAob2Zmc2V0ID4+IDIpICsgKHZpZGVvLT5tYl94IDw8IDIpOyAvLygodmlkZW8tPm1iX3kgPDwgMykqIHBpdGNoICsgKHZpZGVvLT5tYl94IDw8IDMpKTsKLSAgICBjdXJDYiA9IGN1cnJQaWMtPlNjYiArIG9mZnNldDsKLSAgICBjdXJDciA9IGN1cnJQaWMtPlNjciArIG9mZnNldDsKLQotI2lmZGVmIE1CX0JBU0VEX0RFQkxPQ0sKLSAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NiID0gdmlkZW8tPmludHJhX3ByZWRfdG9wX2NiICsgKHZpZGVvLT5tYl94IDw8IDMpOwotICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NiID0gdmlkZW8tPmludHJhX3ByZWRfbGVmdF9jYiArIDE7Ci0gICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jYiA9IHZpZGVvLT5pbnRyYV9wcmVkX2xlZnRfY2JbMF07Ci0gICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jciA9IHZpZGVvLT5pbnRyYV9wcmVkX3RvcF9jciArICh2aWRlby0+bWJfeCA8PCAzKTsKLSAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdF9jciA9IHZpZGVvLT5pbnRyYV9wcmVkX2xlZnRfY3IgKyAxOwotICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnRfY3IgPSB2aWRlby0+aW50cmFfcHJlZF9sZWZ0X2NyWzBdOwotICAgIHBpdGNoICA9IDE7Ci0jZWxzZQotICAgIHBpdGNoID4+PSAxOwotICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3BfY2IgPSBjdXJDYiAtIHBpdGNoOwotICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NiID0gY3VyQ2IgLSAxOwotICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3BfY3IgPSBjdXJDciAtIHBpdGNoOwotICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NyID0gY3VyQ3IgLSAxOwotCi0gICAgaWYgKHZpZGVvLT5tYl95KQotICAgIHsKLSAgICAgICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jYiA9ICooY3VyQ2IgLSBwaXRjaCAtIDEpOwotICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NyID0gKihjdXJDciAtIHBpdGNoIC0gMSk7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgIHByZWRDYiA9IHZpZGVvLT5wcmVkICsgNDUyOwotICAgIHByZWRDciA9IHByZWRDYiArIDE0NDsKLSAgICB2aWRlby0+cHJlZF9waXRjaCA9IDEyOwotI2Vsc2UKLSAgICBwcmVkQ2IgPSBjdXJDYjsKLSAgICBwcmVkQ3IgPSBjdXJDcjsKLSAgICB2aWRlby0+cHJlZF9waXRjaCA9IGN1cnJQaWMtPnBpdGNoID4+IDE7Ci0jZW5kaWYKLSAgICAvKiBjaHJvbWluYW5jZSAqLwotICAgIHN3aXRjaCAoY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBBVkNfSUNfREM6ICAgICAvKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICAgICAgICAgIEludHJhX0Nocm9tYV9EQyh2aWRlbywgcGl0Y2gsIHByZWRDYiwgcHJlZENyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWQ19JQ19Ib3Jpem9udGFsOiAgICAgLyogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIGxlZnQgKi8KLSAgICAgICAgICAgICAgICBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCh2aWRlbywgcGl0Y2gsIHByZWRDYiwgcHJlZENyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVkNfSUNfVmVydGljYWw6ICAgICAgIC8qIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgdG9wICovCi0gICAgICAgICAgICAgICAgSW50cmFfQ2hyb21hX1ZlcnRpY2FsKHZpZGVvLCBwcmVkQ2IsIHByZWRDcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZDX0lDX1BsYW5lOiAgICAgIC8qIEludHJhX0Nocm9tYV9QbGFuZSAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgYW5kIGxlZnQgKi8KLSAgICAgICAgICAgICAgICBJbnRyYV9DaHJvbWFfUGxhbmUodmlkZW8sIHBpdGNoLCBwcmVkQ2IsIHByZWRDcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiB0cmFuc2Zvcm0sIGRvbmUgaW4gcmFzdGVyIHNjYW4gbWFubmVyICovCi0gICAgcGl0Y2ggPSBjdXJyUGljLT5waXRjaCA+PiAxOwotCi0gICAgZm9yIChibG9ja195ID0gMjsgYmxvY2tfeSA+IDA7IGJsb2NrX3ktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoYmxvY2tfeCA9IDI7IGJsb2NrX3ggPiAwOyBibG9ja194LS0pCi0gICAgICAgIHsKLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGljdHJhbnMoZGF0YUJsb2NrLCBwcmVkQ2IsIHByZWRDYiwgMTIpOwotICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgIGlmIChjYnA0eDQmMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpY3RyYW5zKGRhdGFCbG9jaywgY3VyQ2IsIGN1ckNiLCBwaXRjaCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGNicDR4NCA+Pj0gMTsKLSAgICAgICAgICAgIGRhdGFCbG9jayArPSA0OwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBwcmVkQ2IgKz0gNDsKLSNlbHNlCi0gICAgICAgICAgICBjdXJDYiArPSA0OwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChibG9ja194ID0gMjsgYmxvY2tfeCA+IDA7IGJsb2NrX3gtLSkKLSAgICAgICAgewotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgICAgICAgICBpZiAoY2JwNHg0JjEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWN0cmFucyhkYXRhQmxvY2ssIHByZWRDciwgcHJlZENyLCAxMik7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgaWYgKGNicDR4NCYxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGljdHJhbnMoZGF0YUJsb2NrLCBjdXJDciwgY3VyQ3IsIHBpdGNoKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgY2JwNHg0ID4+PSAxOwotICAgICAgICAgICAgZGF0YUJsb2NrICs9IDQ7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgICAgIHByZWRDciArPSA0OwotI2Vsc2UKLSAgICAgICAgICAgIGN1ckNyICs9IDQ7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBkYXRhQmxvY2sgKz0gNDg7Ci0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICAgICAgcHJlZENiICs9IDQwOwotICAgICAgICBwcmVkQ3IgKz0gNDA7Ci0jZWxzZQotICAgICAgICBjdXJDYiArPSAoKHBpdGNoIDw8IDIpIC0gOCk7Ci0gICAgICAgIGN1ckNyICs9ICgocGl0Y2ggPDwgMikgLSA4KTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE1CX0JBU0VEX0RFQkxPQ0sKLSAgICBTYXZlTmVpZ2hib3JGb3JJbnRyYVByZWQodmlkZW8sIG9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gQVZDX1NVQ0NFU1M7Ci19Ci0KLSNpZmRlZiBNQl9CQVNFRF9ERUJMT0NLCi12b2lkIFNhdmVOZWlnaGJvckZvckludHJhUHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgb2Zmc2V0KQotewotICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7Ci0gICAgaW50IHBpdGNoOwotICAgIHVpbnQ4ICpwcmVkLCAqcHJlZENiLCAqcHJlZENyOwotICAgIHVpbnQ4ICp0bXBfcHRyLCB0bXBfYnl0ZTsKLSAgICB1aW50MzIgdG1wX3dvcmQ7Ci0gICAgaW50IG1iX3ggPSB2aWRlby0+bWJfeDsKLQotICAgIC8qIHNhdmUgdGhlIHZhbHVlIGZvciBpbnRyYSBwcmVkaWN0aW9uICAqLwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcGl0Y2ggPSAyMDsKLSAgICBwcmVkID0gdmlkZW8tPnByZWQgKyAzODQ7IC8qIGJvdHRvbSBsaW5lIGZvciBZICovCi0gICAgcHJlZENiID0gcHJlZCArIDE1MjsgICAgLyogYm90dG9tIGxpbmUgZm9yIENiICovCi0gICAgcHJlZENyID0gcHJlZENiICsgMTQ0OyAgLyogYm90dG9tIGxpbmUgZm9yIENyICovCi0jZWxzZQotICAgIHBpdGNoID0gY3VyclBpYy0+cGl0Y2g7Ci0gICAgdG1wX3dvcmQgPSBvZmZzZXQgKyAocGl0Y2ggPDwgMikgLSAocGl0Y2ggPj4gMSk7Ci0gICAgcHJlZENiID0gY3VyclBpYy0+U2NiICsgdG1wX3dvcmQ7LyogYm90dG9tIGxpbmUgZm9yIENiICovCi0gICAgcHJlZENyID0gY3VyclBpYy0+U2NyICsgdG1wX3dvcmQ7LyogYm90dG9tIGxpbmUgZm9yIENyICovCi0KLSAgICBvZmZzZXQgPSAob2Zmc2V0IDw8IDIpIC0gKG1iX3ggPDwgNCk7Ci0gICAgcHJlZCA9IGN1cnJQaWMtPlNsICsgb2Zmc2V0ICsgKHBpdGNoIDw8IDQpIC0gcGl0Y2g7LyogYm90dG9tIGxpbmUgZm9yIFkgKi8KLQotI2VuZGlmCi0KLSAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0ID0gdmlkZW8tPmludHJhX3ByZWRfdG9wWyhtYl94PDw0KSsxNV07Ci0gICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jYiA9IHZpZGVvLT5pbnRyYV9wcmVkX3RvcF9jYlsobWJfeDw8MykrN107Ci0gICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jciA9IHZpZGVvLT5pbnRyYV9wcmVkX3RvcF9jclsobWJfeDw8MykrN107Ci0KLSAgICAvKiB0aGVuIGNvcHkgdG8gdmlkZW8tPmludHJhX3ByZWRfdG9wLCBpbnRyYV9wcmVkX3RvcF9jYiwgaW50cmFfcHJlZF90b3BfY3IgKi8KLSAgICAvKm1lbWNweSh2aWRlby0+aW50cmFfcHJlZF90b3AgKyAobWJfeDw8NCksIHByZWQsIDE2KTsKLSAgICBtZW1jcHkodmlkZW8tPmludHJhX3ByZWRfdG9wX2NiICsgKG1iX3g8PDMpLCBwcmVkQ2IsIDgpOwotICAgIG1lbWNweSh2aWRlby0+aW50cmFfcHJlZF90b3BfY3IgKyAobWJfeDw8MyksIHByZWRDciwgOCk7Ki8KLSAgICB0bXBfcHRyID0gdmlkZW8tPmludHJhX3ByZWRfdG9wICsgKG1iX3ggPDwgNCk7Ci0gICAgKigodWludDMyKil0bXBfcHRyKSA9ICooKHVpbnQzMiopcHJlZCk7Ci0gICAgKigodWludDMyKikodG1wX3B0ciArIDQpKSA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7Ci0gICAgKigodWludDMyKikodG1wX3B0ciArIDgpKSA9ICooKHVpbnQzMiopKHByZWQgKyA4KSk7Ci0gICAgKigodWludDMyKikodG1wX3B0ciArIDEyKSkgPSAqKCh1aW50MzIqKShwcmVkICsgMTIpKTsKLSAgICB0bXBfcHRyID0gdmlkZW8tPmludHJhX3ByZWRfdG9wX2NiICsgKG1iX3ggPDwgMyk7Ci0gICAgKigodWludDMyKil0bXBfcHRyKSA9ICooKHVpbnQzMiopcHJlZENiKTsKLSAgICAqKCh1aW50MzIqKSh0bXBfcHRyICsgNCkpID0gKigodWludDMyKikocHJlZENiICsgNCkpOwotICAgIHRtcF9wdHIgPSB2aWRlby0+aW50cmFfcHJlZF90b3BfY3IgKyAobWJfeCA8PCAzKTsKLSAgICAqKCh1aW50MzIqKXRtcF9wdHIpID0gKigodWludDMyKilwcmVkQ3IpOwotICAgICooKHVpbnQzMiopKHRtcF9wdHIgKyA0KSkgPSAqKCh1aW50MzIqKShwcmVkQ3IgKyA0KSk7Ci0KLQotICAgIC8qIG5vdyBzYXZlIGxhc3QgY29sdW1uICovCi0jaWZkZWYgVVNFX1BSRURfQkxPQ0sKLSAgICBwcmVkID0gdmlkZW8tPnByZWQgKyA5OTsgICAgLyogbGFzdCBjb2x1bW4qLwotI2Vsc2UKLSAgICBwcmVkIC09ICgocGl0Y2ggPDwgNCkgLSBwaXRjaCAtIDE1KTsgICAgLyogbGFzdCBjb2x1bW4gKi8KLSNlbmRpZgotICAgIHRtcF9wdHIgPSB2aWRlby0+aW50cmFfcHJlZF9sZWZ0OwotICAgIHRtcF93b3JkID0gdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdDsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDgpOwotICAgIHRtcF9ieXRlID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMTYpOwotICAgIHRtcF9ieXRlID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMjQpOwotICAgICooKHVpbnQzMiopdG1wX3B0cikgPSB0bXBfd29yZDsKLSAgICB0bXBfd29yZCA9ICoocHJlZCArPSBwaXRjaCk7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWQgKz0gcGl0Y2gpOwotICAgIHRtcF93b3JkIHw9ICh0bXBfYnl0ZSA8PCA4KTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZCArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDE2KTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZCArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKSh0bXBfcHRyICs9IDQpKSA9IHRtcF93b3JkOwotICAgIHRtcF93b3JkID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZCArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDgpOwotICAgIHRtcF9ieXRlID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMTYpOwotICAgIHRtcF9ieXRlID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMjQpOwotICAgICooKHVpbnQzMiopKHRtcF9wdHIgKz0gNCkpID0gdG1wX3dvcmQ7Ci0gICAgdG1wX3dvcmQgPSAqKHByZWQgKz0gcGl0Y2gpOwotICAgIHRtcF9ieXRlID0gKihwcmVkICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgOCk7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWQgKz0gcGl0Y2gpOwotICAgIHRtcF93b3JkIHw9ICh0bXBfYnl0ZSA8PCAxNik7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWQgKz0gcGl0Y2gpOwotICAgIHRtcF93b3JkIHw9ICh0bXBfYnl0ZSA8PCAyNCk7Ci0gICAgKigodWludDMyKikodG1wX3B0ciArPSA0KSkgPSB0bXBfd29yZDsKLSAgICAqKHRtcF9wdHIgKz0gNCkgPSAqKHByZWQgKz0gcGl0Y2gpOwotCi0gICAgLyogbm93IGZvciBDYiAqLwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcHJlZENiID0gdmlkZW8tPnByZWQgKyA0NTk7Ci0gICAgcGl0Y2ggPSAxMjsKLSNlbHNlCi0gICAgcGl0Y2ggPj49IDE7Ci0gICAgcHJlZENiIC09ICg3ICogcGl0Y2ggLSA3KTsKLSNlbmRpZgotICAgIHRtcF9wdHIgPSB2aWRlby0+aW50cmFfcHJlZF9sZWZ0X2NiOwotICAgIHRtcF93b3JkID0gdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jYjsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZENiKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgOCk7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDYiArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDE2KTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZENiICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMjQpOwotICAgICooKHVpbnQzMiopdG1wX3B0cikgPSB0bXBfd29yZDsKLSAgICB0bXBfd29yZCA9ICoocHJlZENiICs9IHBpdGNoKTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZENiICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgOCk7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDYiArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDE2KTsKLSAgICB0bXBfYnl0ZSA9ICoocHJlZENiICs9IHBpdGNoKTsKLSAgICB0bXBfd29yZCB8PSAodG1wX2J5dGUgPDwgMjQpOwotICAgICooKHVpbnQzMiopKHRtcF9wdHIgKz0gNCkpID0gdG1wX3dvcmQ7Ci0gICAgKih0bXBfcHRyICs9IDQpID0gKihwcmVkQ2IgKz0gcGl0Y2gpOwotCi0gICAgLyogbm93IGZvciBDciAqLwotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcHJlZENyID0gdmlkZW8tPnByZWQgKyA2MDM7Ci0jZWxzZQotICAgIHByZWRDciAtPSAoNyAqIHBpdGNoIC0gNyk7Ci0jZW5kaWYKLSAgICB0bXBfcHRyID0gdmlkZW8tPmludHJhX3ByZWRfbGVmdF9jcjsKLSAgICB0bXBfd29yZCA9IHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnRfY3I7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDcik7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDgpOwotICAgIHRtcF9ieXRlID0gKihwcmVkQ3IgKz0gcGl0Y2gpOwotICAgIHRtcF93b3JkIHw9ICh0bXBfYnl0ZSA8PCAxNik7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDciArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXRtcF9wdHIpID0gdG1wX3dvcmQ7Ci0gICAgdG1wX3dvcmQgPSAqKHByZWRDciArPSBwaXRjaCk7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDciArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDgpOwotICAgIHRtcF9ieXRlID0gKihwcmVkQ3IgKz0gcGl0Y2gpOwotICAgIHRtcF93b3JkIHw9ICh0bXBfYnl0ZSA8PCAxNik7Ci0gICAgdG1wX2J5dGUgPSAqKHByZWRDciArPSBwaXRjaCk7Ci0gICAgdG1wX3dvcmQgfD0gKHRtcF9ieXRlIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKSh0bXBfcHRyICs9IDQpKSA9IHRtcF93b3JkOwotICAgICoodG1wX3B0ciArPSA0KSA9ICoocHJlZENyICs9IHBpdGNoKTsKLQotICAgIHJldHVybiA7Ci19Ci0jZW5kaWYgLyogTUJfQkFTRURfREVCTE9DSyAqLwotCi1BVkNTdGF0dXMgSW50cmFfNHg0KEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibG9ja194LCBpbnQgYmxvY2tfeSwgdWludDggKmNvbXApCi17Ci0gICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKLSAgICBpbnQgYmxvY2tfb2Zmc2V0OwotICAgIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5IGF2YWlsYWJpbGl0eTsKLSAgICBpbnQgcGl0Y2ggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7Ci0KLSNpZmRlZiBVU0VfUFJFRF9CTE9DSwotICAgIGJsb2NrX29mZnNldCA9IChibG9ja195ICogODApICsgKGJsb2NrX3ggPDwgMik7Ci0jZWxzZQotICAgIGJsb2NrX29mZnNldCA9IChibG9ja195IDw8IDIpICogcGl0Y2ggKyAoYmxvY2tfeCA8PCAyKTsKLSNlbmRpZgotCi0jaWZkZWYgTUJfQkFTRURfREVCTE9DSwotICAgIC8qIGJvdW5kYXJ5IGJsb2NrcyB1c2UgdmlkZW8tPnByZWRfaW50cmFfdG9wLCBwcmVkX2ludHJhX2xlZnQsIHByZWRfaW50cmFfdG9wbGVmdCAqLwotICAgIGlmICghYmxvY2tfeCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0ID0gdmlkZW8tPmludHJhX3ByZWRfbGVmdCArIDEgKyAoYmxvY2tfeSA8PCAyKTsKLSAgICAgICAgcGl0Y2ggPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgYmxvY2tfb2Zmc2V0IC0gMTsKLSAgICAgICAgcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLSAgICB9Ci0KLSAgICBpZiAoIWJsb2NrX3kpCi0gICAgewotICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wID0gdmlkZW8tPmludHJhX3ByZWRfdG9wICsgKGJsb2NrX3ggPDwgMikgKyAodmlkZW8tPm1iX3ggPDwgNCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3AgPSB2aWRlby0+cHJlZF9ibG9jayArIGJsb2NrX29mZnNldCAtIHZpZGVvLT5wcmVkX3BpdGNoOwotICAgIH0KLQotICAgIGlmICghYmxvY2tfeCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQgPSB2aWRlby0+aW50cmFfcHJlZF9sZWZ0W2Jsb2NrX3k8PDJdOwotICAgIH0KLSAgICBlbHNlIGlmICghYmxvY2tfeSkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQgPSB2aWRlby0+aW50cmFfcHJlZF90b3BbKHZpZGVvLT5tYl94PDw0KSsoYmxvY2tfeDw8MiktMV07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQgPSB2aWRlby0+cHJlZF9ibG9ja1tibG9ja19vZmZzZXQgLSB2aWRlby0+cHJlZF9waXRjaCAtIDFdOwotICAgIH0KLQotI2Vsc2UKLSAgICAvKiBub3JtYWwgY2FzZSAqLwotICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3AgPSBjb21wIC0gcGl0Y2g7Ci0gICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQgPSBjb21wIC0gMTsKLSAgICBpZiAodmlkZW8tPm1iX3kgfHwgYmxvY2tfeSkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQgPSAqKGNvbXAgLSBwaXRjaCAtIDEpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3dpdGNoIChjdXJyTUItPmk0TW9kZVsoYmxvY2tfeSA8PCAyKSArIGJsb2NrX3hdKQotICAgIHsKLSAgICAgICAgY2FzZSBBVkNfSTRfVmVydGljYWw6ICAgICAgIC8qIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgICAgICAgICAgaWYgKGJsb2NrX3kgPiAwIHx8IHZpZGVvLT5pbnRyYUF2YWlsQikvKiB0byBwcmV2ZW50IG91dC1vZi1ib3VuZCBhY2Nlc3MqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEludHJhXzR4NF9WZXJ0aWNhbCh2aWRlbywgIGJsb2NrX29mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVkNfSTRfSG9yaXpvbnRhbDogICAgIC8qIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgICAgICAgICBpZiAoYmxvY2tfeCB8fCB2aWRlby0+aW50cmFBdmFpbEEpICAvKiB0byBwcmV2ZW50IG91dC1vZi1ib3VuZCBhY2Nlc3MgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnRyYV80eDRfSG9yaXpvbnRhbCh2aWRlbywgcGl0Y2gsIGJsb2NrX29mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWQ19GQUlMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVkNfSTRfREM6ICAgICAvKiBJbnRyYV80eDRfREMgKi8KLSAgICAgICAgICAgIGF2YWlsYWJpbGl0eS5sZWZ0ID0gVFJVRTsKLSAgICAgICAgICAgIGF2YWlsYWJpbGl0eS50b3AgPSBUUlVFOwotICAgICAgICAgICAgaWYgKCFibG9ja195KQotICAgICAgICAgICAgeyAvKiBjaGVjayBhdmFpbGFiaWxpdHkgdXAgKi8KLSAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkudG9wID0gdmlkZW8tPmludHJhQXZhaWxCIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYmxvY2tfeCkKLSAgICAgICAgICAgIHsgLyogY2hlY2sgYXZhaWxhYmlsaXR5IGxlZnQgKi8KLSAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkubGVmdCA9IHZpZGVvLT5pbnRyYUF2YWlsQSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnRyYV80eDRfREModmlkZW8sIHBpdGNoLCBibG9ja19vZmZzZXQsICZhdmFpbGFiaWxpdHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0OiAgICAgLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgICAgICAgICAgLyogbG9va3VwIHRhYmxlIHdpbGwgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBjYXNlICAqLwotICAgICAgICAgICAgaWYgKGJsb2NrX3kgPT0gMCAmJiAhdmlkZW8tPmludHJhQXZhaWxCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNfRkFJTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IEJsa1RvcFJpZ2h0WyhibG9ja195PDwyKSArIGJsb2NrX3hdOwotCi0gICAgICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPSB2aWRlby0+aW50cmFBdmFpbEI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID09IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50cmFfNHg0X0Rvd25fTGVmdCh2aWRlbywgYmxvY2tfb2Zmc2V0LCAmYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHQ6ICAgICAgICAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgICAgICAgICAgaWYgKChibG9ja195ICYmIGJsb2NrX3gpICAvKiB0byBwcmV2ZW50IG91dC1vZi1ib3VuZCBhY2Nlc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQotICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeCAmJiB2aWRlby0+aW50cmFBdmFpbEIpCi0gICAgICAgICAgICAgICAgICAgIHx8ICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxEICYmIHZpZGVvLT5pbnRyYUF2YWlsQikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQodmlkZW8sIHBpdGNoLCBibG9ja19vZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0OiAgICAgLyogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgICAgICAgICBpZiAoKGJsb2NrX3kgJiYgYmxvY2tfeCkgIC8qIHRvIHByZXZlbnQgb3V0LW9mLWJvdW5kIGFjY2VzcyAqLwotICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeSAmJiB2aWRlby0+aW50cmFBdmFpbEEpCi0gICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKLSAgICAgICAgICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnRyYV80eDRfRGlhZ29uYWxfVmVydGljYWxfUmlnaHQodmlkZW8sIHBpdGNoLCBibG9ja19vZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZDX0k0X0hvcml6b250YWxfRG93bjogICAgICAgIC8qIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICAgICAgICAgIGlmICgoYmxvY2tfeSAmJiBibG9ja194KSAgLyogdG8gcHJldmVudCBvdXQtb2YtYm91bmQgYWNjZXNzICovCi0gICAgICAgICAgICAgICAgICAgIHx8IChibG9ja195ICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3ggJiYgdmlkZW8tPmludHJhQXZhaWxCKQotICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEludHJhXzR4NF9EaWFnb25hbF9Ib3Jpem9udGFsX0Rvd24odmlkZW8sIHBpdGNoLCBibG9ja19vZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZDX0k0X1ZlcnRpY2FsX0xlZnQ6ICAgICAgLyogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICAgICAgICAgIC8qIGxvb2t1cCB0YWJsZSBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBjYXNlICAqLwotICAgICAgICAgICAgaWYgKGJsb2NrX3kgPT0gMCAmJiAhdmlkZW8tPmludHJhQXZhaWxCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNfRkFJTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IEJsa1RvcFJpZ2h0WyhibG9ja195PDwyKSArIGJsb2NrX3hdOwotCi0gICAgICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPSB2aWRlby0+aW50cmFBdmFpbEI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID09IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQodmlkZW8sICBibG9ja19vZmZzZXQsICZhdmFpbGFiaWxpdHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVkNfSTRfSG9yaXpvbnRhbF9VcDogICAgICAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLwotICAgICAgICAgICAgaWYgKGJsb2NrX3ggfHwgdmlkZW8tPmludHJhQXZhaWxBKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwKHZpZGVvLCBwaXRjaCwgYmxvY2tfb2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBBVkNfU1VDQ0VTUzsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJFR0lOIDR4NAotTU9ERVM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIEludHJhXzR4NF9WZXJ0aWNhbChBVkNDb21tb25PYmogKnZpZGVvLCAgaW50IGJsb2NrX29mZnNldCkKLXsKLSAgICB1aW50OCAqY29tcF9yZWYgPSB2aWRlby0+cGludHJhX3ByZWRfdG9wOwotICAgIHVpbnQzMiB0ZW1wOwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2sgKyBibG9ja19vZmZzZXQ7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIC8qUCA9IChpbnQpICpjb21wX3JlZisrOwotICAgIFEgPSAoaW50KSAqY29tcF9yZWYrKzsKLSAgICBSID0gKGludCkgKmNvbXBfcmVmKys7Ci0gICAgUyA9IChpbnQpICpjb21wX3JlZisrOwotICAgIHRlbXAgPSBTfChSPDw4KXwoUTw8MTYpfChQPDwyNCk7Ki8KLSAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZik7Ci0KLSAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7IC8qIHdyaXRlIDQgYXQgYSB0aW1lICovCi0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgICooKHVpbnQzMiopcHJlZCkgPSAgdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIEludHJhXzR4NF9Ib3Jpem9udGFsKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgaW50IGJsb2NrX29mZnNldCkKLXsKLSAgICB1aW50OCAgICpjb21wX3JlZiA9IHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0OwotICAgIHVpbnQzMiB0ZW1wOwotICAgIGludCBQOwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2sgKyBibG9ja19vZmZzZXQ7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIFAgPSAqY29tcF9yZWY7Ci0gICAgdGVtcCA9IFAgfCAoUCA8PCA4KTsKLSAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgY29tcF9yZWYgKz0gcGl0Y2g7Ci0gICAgUCA9ICpjb21wX3JlZjsKLSAgICB0ZW1wID0gUCB8IChQIDw8IDgpOwotICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICBjb21wX3JlZiArPSBwaXRjaDsKLSAgICBQID0gKmNvbXBfcmVmOwotICAgIHRlbXAgPSBQIHwgKFAgPDwgOCk7Ci0gICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7Ci0gICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgIGNvbXBfcmVmICs9IHBpdGNoOwotICAgIFAgPSAqY29tcF9yZWY7Ci0gICAgdGVtcCA9IFAgfCAoUCA8PCA4KTsKLSAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgSW50cmFfNHg0X0RDKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgaW50IGJsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5ICphdmFpbGFiaWxpdHkpCi17Ci0gICAgdWludDggICAqY29tcF9yZWYgPSB2aWRlby0+cGludHJhX3ByZWRfbGVmdDsKLSAgICB1aW50MzIgIHRlbXA7Ci0gICAgaW50IERDOwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2sgKyBibG9ja19vZmZzZXQ7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHktPmxlZnQpCi0gICAgewotICAgICAgICBEQyA9ICpjb21wX3JlZjsKLSAgICAgICAgY29tcF9yZWYgKz0gcGl0Y2g7Ci0gICAgICAgIERDICs9ICpjb21wX3JlZjsKLSAgICAgICAgY29tcF9yZWYgKz0gcGl0Y2g7Ci0gICAgICAgIERDICs9ICpjb21wX3JlZjsKLSAgICAgICAgY29tcF9yZWYgKz0gcGl0Y2g7Ci0gICAgICAgIERDICs9ICpjb21wX3JlZjsKLSAgICAgICAgY29tcF9yZWYgPSB2aWRlby0+cGludHJhX3ByZWRfdG9wOwotCi0gICAgICAgIGlmIChhdmFpbGFiaWxpdHktPnRvcCkKLSAgICAgICAgewotICAgICAgICAgICAgREMgPSAoY29tcF9yZWZbMF0gKyBjb21wX3JlZlsxXSArIGNvbXBfcmVmWzJdICsgY29tcF9yZWZbM10gKyBEQyArIDQpID4+IDM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBEQyA9IChEQyArIDIpID4+IDI7Ci0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHktPnRvcCkKLSAgICB7Ci0gICAgICAgIGNvbXBfcmVmID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcDsKLSAgICAgICAgREMgPSAoY29tcF9yZWZbMF0gKyBjb21wX3JlZlsxXSArIGNvbXBfcmVmWzJdICsgY29tcF9yZWZbM10gKyAyKSA+PiAyOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERDID0gMTI4OwotICAgIH0KLQotICAgIHRlbXAgPSBEQyB8IChEQyA8PCA4KTsKLSAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgSW50cmFfNHg0X0Rvd25fTGVmdChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgYmxvY2tfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ05laWdoYm9yQXZhaWxhYmlsaXR5ICphdmFpbGFiaWxpdHkpCi17Ci0gICAgdWludDggICAqY29tcF9yZWZ4ID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcDsKLSAgICB1aW50MzIgdGVtcDsKLSAgICBpbnQgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3OwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2sgKyBibG9ja19vZmZzZXQ7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIHIwID0gKmNvbXBfcmVmeCsrOwotICAgIHIxID0gKmNvbXBfcmVmeCsrOwotICAgIHIyID0gKmNvbXBfcmVmeCsrOwotICAgIHIzID0gKmNvbXBfcmVmeCsrOwotICAgIGlmIChhdmFpbGFiaWxpdHktPnRvcF9yaWdodCkKLSAgICB7Ci0gICAgICAgIHI0ID0gKmNvbXBfcmVmeCsrOwotICAgICAgICByNSA9ICpjb21wX3JlZngrKzsKLSAgICAgICAgcjYgPSAqY29tcF9yZWZ4Kys7Ci0gICAgICAgIHI3ID0gKmNvbXBfcmVmeCsrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByNCA9IHIzOwotICAgICAgICByNSA9IHIzOwotICAgICAgICByNiA9IHIzOwotICAgICAgICByNyA9IHIzOwotICAgIH0KLQotICAgIHIwICs9IChyMSA8PCAxKTsKLSAgICByMCArPSByMjsKLSAgICByMCArPSAyOwotICAgIHIwID4+PSAyOwotICAgIHIxICs9IChyMiA8PCAxKTsKLSAgICByMSArPSByMzsKLSAgICByMSArPSAyOwotICAgIHIxID4+PSAyOwotICAgIHIyICs9IChyMyA8PCAxKTsKLSAgICByMiArPSByNDsKLSAgICByMiArPSAyOwotICAgIHIyID4+PSAyOwotICAgIHIzICs9IChyNCA8PCAxKTsKLSAgICByMyArPSByNTsKLSAgICByMyArPSAyOwotICAgIHIzID4+PSAyOwotICAgIHI0ICs9IChyNSA8PCAxKTsKLSAgICByNCArPSByNjsKLSAgICByNCArPSAyOwotICAgIHI0ID4+PSAyOwotICAgIHI1ICs9IChyNiA8PCAxKTsKLSAgICByNSArPSByNzsKLSAgICByNSArPSAyOwotICAgIHI1ID4+PSAyOwotICAgIHI2ICs9ICgzICogcjcpOwotICAgIHI2ICs9IDI7Ci0gICAgcjYgPj49IDI7Ci0KLSAgICB0ZW1wID0gcjAgfCAocjEgPDwgOCk7Ci0gICAgdGVtcCB8PSAocjIgPDwgMTYpOwotICAgIHRlbXAgfD0gKHIzIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjQgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyNSA8PCAyNCk7Ci0gICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotCi0gICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI2IDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLCBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfb2Zmc2V0KQotewotICAgIHVpbnQ4ICpjb21wX3JlZnggPSB2aWRlby0+cGludHJhX3ByZWRfdG9wOwotICAgIHVpbnQ4ICpjb21wX3JlZnkgPSB2aWRlby0+cGludHJhX3ByZWRfbGVmdDsKLSAgICB1aW50MzIgdGVtcDsKLSAgICBpbnQgUF94LCBRX3gsIFJfeCwgUF95LCBRX3ksIFJfeSwgRDsKLSAgICBpbnQgeDAsIHgxLCB4MjsKLSAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgYmxvY2tfb2Zmc2V0OwotICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZngpOyAvKiByZWFkIDQgYnl0ZXMgKi8KLSAgICB4MCA9IHRlbXAgJiAweEZGOwotICAgIHgxID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgIHgyID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKLQotICAgIFFfeCA9ICh4MCArIDIgKiB4MSArIHgyICsgMikgPj4gMjsKLSAgICBSX3ggPSAoeDEgKyAyICogeDIgKyAodGVtcCA+PiAyNCkgKyAyKSA+PiAyOwotCi0gICAgeDIgPSB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0OyAvKiByZS11c2UgeDIgaW5zdGVhZCBvZiB5MCAqLwotICAgIFBfeCA9ICh4MiArIDIgKiB4MCArIHgxICsgMikgPj4gMjsKLQotICAgIHgxID0gKmNvbXBfcmVmeTsKLSAgICBjb21wX3JlZnkgKz0gcGl0Y2g7IC8qIHJlLXVzZSB4MSBpbnN0ZWFkIG9mIHkxICovCi0gICAgRCA9ICh4MCArIDIgKiB4MiArIHgxICsgMikgPj4gMjsKLQotICAgIHgwID0gKmNvbXBfcmVmeTsKLSAgICBjb21wX3JlZnkgKz0gcGl0Y2g7IC8qIHJlLXVzZSB4MCBpbnN0ZWFkIG9mIHkyICovCi0gICAgUF95ID0gKHgyICsgMiAqIHgxICsgeDAgKyAyKSA+PiAyOwotCi0gICAgeDIgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsgLyogcmUtdXNlIHgyIGluc3RlYWQgb2YgeTMgKi8KLSAgICBRX3kgPSAoeDEgKyAyICogeDAgKyB4MiArIDIpID4+IDI7Ci0KLSAgICB4MSA9ICpjb21wX3JlZnk7ICAgICAgICAgICAgICAgICAgICAvKiByZS11c2UgeDEgaW5zdGVhZCBvZiB5NCAqLwotICAgIFJfeSA9ICh4MCArIDIgKiB4MiArIHgxICsgMikgPj4gMjsKLQotICAgIC8qIHdlIGNhbiBwYWNrIHRoZXNlICAqLwotICAgIHRlbXAgPSAgRCB8IChQX3ggPDwgOCk7ICAgLy9bRCAgIFBfeCBRX3ggUl94XQotICAgIC8vW1BfeSBEICAgUF94IFFfeF0KLSAgICB0ZW1wIHw9IChRX3ggPDwgMTYpOyAvL1tRX3kgUF95IEQgICBQX3hdCi0gICAgdGVtcCB8PSAoUl94IDw8IDI0KTsgIC8vW1JfeSBRX3kgUF95IEQgIF0KLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gIFBfeSB8IChEIDw8IDgpOwotICAgIHRlbXAgfD0gKFBfeCA8PCAxNik7Ci0gICAgdGVtcCB8PSAoUV94IDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gIFFfeSB8IChQX3kgPDwgOCk7Ci0gICAgdGVtcCB8PSAoRCA8PCAxNik7Ci0gICAgdGVtcCB8PSAoUF94IDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gUl95IHwgKFFfeSA8PCA4KTsKLSAgICB0ZW1wIHw9IChQX3kgPDwgMTYpOwotICAgIHRlbXAgfD0gKEQgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCAgICBJbnRyYV80eDRfRGlhZ29uYWxfVmVydGljYWxfUmlnaHQoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLCBpbnQgYmxvY2tfb2Zmc2V0KQotewotICAgIHVpbnQ4ICAgKmNvbXBfcmVmeCA9IHZpZGVvLT5waW50cmFfcHJlZF90b3A7Ci0gICAgdWludDggICAqY29tcF9yZWZ5ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQ7Ci0gICAgdWludDMyIHRlbXA7Ci0gICAgaW50IFAwLCBRMCwgUjAsIFMwLCBQMSwgUTEsIFIxLCBQMiwgUTIsIEQ7Ci0gICAgaW50IHgwLCB4MSwgeDI7Ci0gICAgdWludDggKnByZWQgPSB2aWRlby0+cHJlZF9ibG9jayArIGJsb2NrX29mZnNldDsKLSAgICBpbnQgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOwotCi0gICAgeDAgPSAqY29tcF9yZWZ4Kys7Ci0gICAgeDEgPSAqY29tcF9yZWZ4Kys7Ci0gICAgUTAgPSB4MCArIHgxICsgMTsKLQotICAgIHgyID0gKmNvbXBfcmVmeCsrOwotICAgIFIwID0geDEgKyB4MiArIDE7Ci0KLSAgICB4MSA9ICpjb21wX3JlZngrKzsgLyogcmV1c2UgeDEgaW5zdGVhZCBvZiB4MyAqLwotICAgIFMwID0geDIgKyB4MSArIDE7Ci0KLSAgICB4MSA9IHZpZGVvLT5pbnRyYV9wcmVkX3RvcGxlZnQ7IC8qIHJldXNlIHgxIGluc3RlYWQgb2YgeTAgKi8KLSAgICBQMCA9IHgxICsgeDAgKyAxOwotCi0gICAgeDIgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsgLyogcmV1c2UgeDIgaW5zdGVhZCBvZiB5MSAqLwotICAgIEQgPSAoeDIgKyAyICogeDEgKyB4MCArIDIpID4+IDI7Ci0KLSAgICBQMSA9IChQMCArIFEwKSA+PiAyOwotICAgIFExID0gKFEwICsgUjApID4+IDI7Ci0gICAgUjEgPSAoUjAgKyBTMCkgPj4gMjsKLQotICAgIFAwID4+PSAxOwotICAgIFEwID4+PSAxOwotICAgIFIwID4+PSAxOwotICAgIFMwID4+PSAxOwotCi0gICAgeDAgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsgLyogcmV1c2UgeDAgaW5zdGVhZCBvZiB5MiAqLwotICAgIFAyID0gKHgxICsgMiAqIHgyICsgeDAgKyAyKSA+PiAyOwotICAgIHgxID0gKmNvbXBfcmVmeTsKLSAgICBjb21wX3JlZnkgKz0gcGl0Y2g7IC8qIHJldXNlIHgxIGluc3RlYWQgb2YgeTMgKi8KLSAgICBRMiA9ICh4MiArIDIgKiB4MCArIHgxICsgMikgPj4gMjsKLQotICAgIHRlbXAgPSAgUDAgfCAoUTAgPDwgOCk7ICAvL1tQMCBRMCBSMCBTMF0KLSAgICAvL1tEICBQMSBRMSBSMV0KLSAgICB0ZW1wIHw9IChSMCA8PCAxNik7IC8vW1AyIFAwIFEwIFIwXQotICAgIHRlbXAgfD0gKFMwIDw8IDI0KTsgLy9bUTIgRCAgUDEgUTFdCi0gICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIHRlbXAgPSAgRCB8IChQMSA8PCA4KTsKLSAgICB0ZW1wIHw9IChRMSA8PCAxNik7Ci0gICAgdGVtcCB8PSAoUjEgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSAgdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gUDIgfCAoUDAgPDwgOCk7Ci0gICAgdGVtcCB8PSAoUTAgPDwgMTYpOwotICAgIHRlbXAgfD0gKFIwIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotCi0gICAgdGVtcCA9IFEyIHwgKEQgPDwgOCk7Ci0gICAgdGVtcCB8PSAoUDEgPDwgMTYpOwotICAgIHRlbXAgfD0gKFExIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gIHRlbXA7Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIEludHJhXzR4NF9EaWFnb25hbF9Ib3Jpem9udGFsX0Rvd24oQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19vZmZzZXQpCi17Ci0gICAgdWludDggICAqY29tcF9yZWZ4ID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcDsKLSAgICB1aW50OCAgICpjb21wX3JlZnkgPSB2aWRlby0+cGludHJhX3ByZWRfbGVmdDsKLSAgICB1aW50MzIgdGVtcDsKLSAgICBpbnQgUDAsIFEwLCBSMCwgUzAsIFAxLCBRMSwgUjEsIFAyLCBRMiwgRDsKLSAgICBpbnQgeDAsIHgxLCB4MjsKLSAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgYmxvY2tfb2Zmc2V0OwotICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7Ci0KLSAgICB4MCA9ICpjb21wX3JlZngrKzsKLSAgICB4MSA9ICpjb21wX3JlZngrKzsKLSAgICB4MiA9ICpjb21wX3JlZngrKzsKLSAgICBRMiA9ICh4MCArIDIgKiB4MSArIHgyICsgMikgPj4gMjsKLQotICAgIHgyID0gdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdDsgLyogcmV1c2UgeDIgaW5zdGVhZCBvZiB5MCAqLwotICAgIFAyID0gKHgyICsgMiAqIHgwICsgeDEgKyAyKSA+PiAyOwotCi0gICAgeDEgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsgLyogcmV1c2UgeDEgaW5zdGVhZCBvZiB5MSAqLwotICAgIEQgPSAoeDEgKyAyICogeDIgKyB4MCArIDIpID4+IDI7Ci0gICAgUDAgPSB4MiArIHgxICsgMTsKLQotICAgIHgwID0gKmNvbXBfcmVmeTsKLSAgICBjb21wX3JlZnkgKz0gcGl0Y2g7IC8qIHJldXNlIHgwIGluc3RlYWQgb2YgeTIgKi8KLSAgICBRMCA9IHgxICsgeDAgKyAxOwotCi0gICAgeDEgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsgLyogcmV1c2UgeDEgaW5zdGVhZCBvZiB5MyAqLwotICAgIFIwID0geDAgKyB4MSArIDE7Ci0KLSAgICB4MiA9ICpjb21wX3JlZnk7ICAgIC8qIHJldXNlIHgyIGluc3RlYWQgb2YgeTQgKi8KLSAgICBTMCA9IHgxICsgeDIgKyAxOwotCi0gICAgUDEgPSAoUDAgKyBRMCkgPj4gMjsKLSAgICBRMSA9IChRMCArIFIwKSA+PiAyOwotICAgIFIxID0gKFIwICsgUzApID4+IDI7Ci0KLSAgICBQMCA+Pj0gMTsKLSAgICBRMCA+Pj0gMTsKLSAgICBSMCA+Pj0gMTsKLSAgICBTMCA+Pj0gMTsKLQotCi0gICAgLyogd2UgY2FuIHBhY2sgdGhlc2UgICovCi0gICAgdGVtcCA9IFAwIHwgKEQgPDwgOCk7ICAgLy9bUDAgRCAgUDIgUTJdCi0gICAgLy9bUTAgUDEgUDAgRCBdCi0gICAgdGVtcCB8PSAoUDIgPDwgMTYpOyAgLy9bUjAgUTEgUTAgUDFdCi0gICAgdGVtcCB8PSAoUTIgPDwgMjQpOyAvL1tTMCBSMSBSMCBRMV0KLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gUTAgfCAoUDEgPDwgOCk7Ci0gICAgdGVtcCB8PSAoUDAgPDwgMTYpOwotICAgIHRlbXAgfD0gKEQgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIHRlbXAgPSBSMCB8IChRMSA8PCA4KTsKLSAgICB0ZW1wIHw9IChRMCA8PCAxNik7Ci0gICAgdGVtcCB8PSAoUDEgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIHRlbXAgPSBTMCB8IChSMSA8PCA4KTsKLSAgICB0ZW1wIHw9IChSMCA8PCAxNik7Ci0gICAgdGVtcCB8PSAoUTEgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBJbnRyYV80eDRfVmVydGljYWxfTGVmdChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgYmxvY2tfb2Zmc2V0LCBBVkNOZWlnaGJvckF2YWlsYWJpbGl0eSAqYXZhaWxhYmlsaXR5KQotewotICAgIHVpbnQ4ICAgKmNvbXBfcmVmeCA9IHZpZGVvLT5waW50cmFfcHJlZF90b3A7Ci0gICAgdWludDMyIHRlbXAxLCB0ZW1wMjsKLSAgICBpbnQgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDY7Ci0gICAgdWludDggKnByZWQgPSB2aWRlby0+cHJlZF9ibG9jayArIGJsb2NrX29mZnNldDsKLSAgICBpbnQgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOwotCi0gICAgeDAgPSAqY29tcF9yZWZ4Kys7Ci0gICAgeDEgPSAqY29tcF9yZWZ4Kys7Ci0gICAgeDIgPSAqY29tcF9yZWZ4Kys7Ci0gICAgeDMgPSAqY29tcF9yZWZ4Kys7Ci0gICAgaWYgKGF2YWlsYWJpbGl0eS0+dG9wX3JpZ2h0KQotICAgIHsKLSAgICAgICAgeDQgPSAqY29tcF9yZWZ4Kys7Ci0gICAgICAgIHg1ID0gKmNvbXBfcmVmeCsrOwotICAgICAgICB4NiA9ICpjb21wX3JlZngrKzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeDQgPSB4MzsKLSAgICAgICAgeDUgPSB4MzsKLSAgICAgICAgeDYgPSB4MzsKLSAgICB9Ci0KLSAgICB4MCArPSB4MSArIDE7Ci0gICAgeDEgKz0geDIgKyAxOwotICAgIHgyICs9IHgzICsgMTsKLSAgICB4MyArPSB4NCArIDE7Ci0gICAgeDQgKz0geDUgKyAxOwotICAgIHg1ICs9IHg2ICsgMTsKLQotICAgIHRlbXAxID0gKHgwID4+IDEpOwotICAgIHRlbXAxIHw9ICgoeDEgPj4gMSkgPDwgOCk7Ci0gICAgdGVtcDEgfD0gKCh4MiA+PiAxKSA8PCAxNik7Ci0gICAgdGVtcDEgfD0gKCh4MyA+PiAxKSA8PCAyNCk7Ci0KLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDE7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotCi0gICAgdGVtcDIgPSAoKHgwICsgeDEpID4+IDIpOwotICAgIHRlbXAyIHw9ICgoKHgxICsgeDIpID4+IDIpIDw8IDgpOwotICAgIHRlbXAyIHw9ICgoKHgyICsgeDMpID4+IDIpIDw8IDE2KTsKLSAgICB0ZW1wMiB8PSAoKCh4MyArIHg0KSA+PiAyKSA8PCAyNCk7Ci0KLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDI7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotCi0gICAgdGVtcDEgPSAodGVtcDEgPj4gOCkgfCAoKHg0ID4+IDEpIDw8IDI0KTsgICAvKiByb3RhdGUgb3V0IG9sZCB2YWx1ZSAqLwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wMTsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wMiA9ICh0ZW1wMiA+PiA4KSB8ICgoKHg0ICsgeDUpID4+IDIpIDw8IDI0KTsgLyogcm90YXRlIG91dCBvbGQgdmFsdWUgKi8KLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDI7Ci0gICAgcHJlZCArPSBwcmVkX3BpdGNoOwotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcChBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIGludCBibG9ja19vZmZzZXQpCi17Ci0gICAgdWludDggICAqY29tcF9yZWZ5ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQ7Ci0gICAgdWludDMyIHRlbXA7Ci0gICAgaW50IFEwLCBSMCwgUTEsIEQwLCBEMSwgUDAsIFAxOwotICAgIGludCB5MCwgeTEsIHkyLCB5MzsKLSAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgYmxvY2tfb2Zmc2V0OwotICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7Ci0KLSAgICB5MCA9ICpjb21wX3JlZnk7Ci0gICAgY29tcF9yZWZ5ICs9IHBpdGNoOwotICAgIHkxID0gKmNvbXBfcmVmeTsKLSAgICBjb21wX3JlZnkgKz0gcGl0Y2g7Ci0gICAgeTIgPSAqY29tcF9yZWZ5OwotICAgIGNvbXBfcmVmeSArPSBwaXRjaDsKLSAgICB5MyA9ICpjb21wX3JlZnk7Ci0KLSAgICBRMCA9ICh5MSArIHkyICsgMSkgPj4gMTsKLSAgICBRMSA9ICh5MSArICh5MiA8PCAxKSArIHkzICsgMikgPj4gMjsKLSAgICBQMCA9ICgoeTAgKyB5MSArIDEpID4+IDEpOwotICAgIFAxID0gKCh5MCArICh5MSA8PCAxKSArIHkyICsgMikgPj4gMik7Ci0KLSAgICB0ZW1wID0gUDAgfCAoUDEgPDwgOCk7ICAgICAgLy8gW1AwIFAxIFEwIFExXQotICAgIHRlbXAgfD0gKFEwIDw8IDE2KTsgICAgIC8vIFtRMCBRMSBSMCBET10KLSAgICB0ZW1wIHw9IChRMSA8PCAyNCk7ICAgICAvLyBbUjAgRDAgRDEgRDFdCi0gICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7ICAgICAgLy8gW0QxIEQxIEQxIEQxXQotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIEQwID0gKHkyICsgMyAqIHkzICsgMikgPj4gMjsKLSAgICBSMCA9ICh5MiArIHkzICsgMSkgPj4gMTsKLQotICAgIHRlbXAgPSBRMCB8IChRMSA8PCA4KTsKLSAgICB0ZW1wIHw9IChSMCA8PCAxNik7Ci0gICAgdGVtcCB8PSAoRDAgPDwgMjQpOwotICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLQotICAgIEQxID0geTM7Ci0KLSAgICB0ZW1wID0gUjAgfCAoRDAgPDwgOCk7Ci0gICAgdGVtcCB8PSAoRDEgPDwgMTYpOwotICAgIHRlbXAgfD0gKEQxIDw8IDI0KTsKLSAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0KLSAgICB0ZW1wID0gRDEgfCAoRDEgPDwgOCk7Ci0gICAgdGVtcCB8PSAodGVtcCA8PCAxNik7Ci0gICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0KLSAgICByZXR1cm4gOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFTkQgNHg0IE1PREVTPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCAgSW50cmFfMTZ4MTZfVmVydGljYWwoQVZDQ29tbW9uT2JqICp2aWRlbykKLXsKLSAgICBpbnQgaTsKLSAgICB1aW50MzIgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgdWludDggICAqY29tcF9yZWYgPSB2aWRlby0+cGludHJhX3ByZWRfdG9wOwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2s7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIHRlbXAxID0gKigodWludDMyKiljb21wX3JlZik7Ci0gICAgY29tcF9yZWYgKz0gNDsKLQotICAgIHRlbXAyID0gKigodWludDMyKiljb21wX3JlZik7Ci0gICAgY29tcF9yZWYgKz0gNDsKLQotICAgIHRlbXAzID0gKigodWludDMyKiljb21wX3JlZik7Ci0gICAgY29tcF9yZWYgKz0gNDsKLQotICAgIHRlbXA0ID0gKigodWludDMyKiljb21wX3JlZik7Ci0gICAgY29tcF9yZWYgKz0gNDsKLQotICAgIGkgPSAxNjsKLSAgICB3aGlsZSAoaSA+IDApCi0gICAgewotICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDE7Ci0gICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSB0ZW1wMjsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHRlbXAzOwotICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHRlbXA0OwotICAgICAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgICAgIGktLTsKLSAgICB9Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIEludHJhXzE2eDE2X0hvcml6b250YWwoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoKQotewotICAgIGludCBpOwotICAgIHVpbnQzMiB0ZW1wOwotICAgIHVpbnQ4ICpjb21wX3JlZiA9IHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0OwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2s7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgdGVtcCA9ICpjb21wX3JlZjsKLSAgICAgICAgdGVtcCB8PSAodGVtcCA8PCA4KTsKLSAgICAgICAgdGVtcCB8PSAodGVtcCA8PCAxNik7Ci0gICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOwotICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gdGVtcDsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHRlbXA7Ci0gICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gdGVtcDsKLSAgICAgICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgICAgICBjb21wX3JlZiArPSBwaXRjaDsKLSAgICB9Ci19Ci0KLQotdm9pZCAgSW50cmFfMTZ4MTZfREMoQVZDQ29tbW9uT2JqICp2aWRlbywgaW50IHBpdGNoKQotewotICAgIGludCBpOwotICAgIHVpbnQzMiB0ZW1wLCB0ZW1wMjsKLSAgICB1aW50OCAqY29tcF9yZWZfeCA9IHZpZGVvLT5waW50cmFfcHJlZF90b3A7Ci0gICAgdWludDggKmNvbXBfcmVmX3kgPSB2aWRlby0+cGludHJhX3ByZWRfbGVmdDsKLSAgICBpbnQgc3VtID0gMDsKLSAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOwotICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7Ci0KLSAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQotICAgIHsKLSAgICAgICAgdGVtcCA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7Ci0gICAgICAgIGNvbXBfcmVmX3ggKz0gNDsKLSAgICAgICAgdGVtcDIgPSAodGVtcCA+PiA4KSAmIDB4RkYwMEZGOwotICAgICAgICB0ZW1wICY9IDB4RkYwMEZGOwotICAgICAgICB0ZW1wICs9IHRlbXAyOwotICAgICAgICBzdW0gPSB0ZW1wICsgKHRlbXAgPj4gMTYpOwotICAgICAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZl94KTsKLSAgICAgICAgY29tcF9yZWZfeCArPSA0OwotICAgICAgICB0ZW1wMiA9ICh0ZW1wID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgJj0gMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgKz0gdGVtcDI7Ci0gICAgICAgIHN1bSArPSB0ZW1wICsgKHRlbXAgPj4gMTYpOwotICAgICAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZl94KTsKLSAgICAgICAgY29tcF9yZWZfeCArPSA0OwotICAgICAgICB0ZW1wMiA9ICh0ZW1wID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgJj0gMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgKz0gdGVtcDI7Ci0gICAgICAgIHN1bSArPSB0ZW1wICsgKHRlbXAgPj4gMTYpOwotICAgICAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZl94KTsKLSAgICAgICAgY29tcF9yZWZfeCArPSA0OwotICAgICAgICB0ZW1wMiA9ICh0ZW1wID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgJj0gMHhGRjAwRkY7Ci0gICAgICAgIHRlbXAgKz0gdGVtcDI7Ci0gICAgICAgIHN1bSArPSB0ZW1wICsgKHRlbXAgPj4gMTYpOwotICAgICAgICBzdW0gJj0gMHhGRkZGOwotCi0gICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bSArPSAoKmNvbXBfcmVmX3kpOwotICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kgKz0gcGl0Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdW0gPSAoc3VtICsgMTYpID4+IDU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW0gPSAoc3VtICsgOCkgPj4gNDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgc3VtICs9ICpjb21wX3JlZl95OwotICAgICAgICAgICAgY29tcF9yZWZfeSArPSBwaXRjaDsKLSAgICAgICAgfQotICAgICAgICBzdW0gPSAoc3VtICsgOCkgPj4gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3VtID0gMTI4OwotICAgIH0KLQotICAgIHRlbXAgPSBzdW0gfCAoc3VtIDw8IDgpOwotICAgIHRlbXAgfD0gKHRlbXAgPDwgMTYpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHRlbXA7Ci0gICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSB0ZW1wOwotICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHRlbXA7Ci0gICAgICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICB9Ci0KLX0KLQotdm9pZCBJbnRyYV8xNngxNl9QbGFuZShBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gpCi17Ci0gICAgaW50IGksIGFfMTYsIGIsIGMsIGZhY3Rvcl9jOwotICAgIHVpbnQ4ICpjb21wX3JlZl94ID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcDsKLSAgICB1aW50OCAqY29tcF9yZWZfeSA9IHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0OwotICAgIHVpbnQ4ICpjb21wX3JlZl94MCwgKmNvbXBfcmVmX3gxLCAqY29tcF9yZWZfeTAsICpjb21wX3JlZl95MTsKLSAgICBpbnQgSCA9IDAsIFYgPSAwICwgdG1wOwotICAgIHVpbnQ4ICpwcmVkID0gdmlkZW8tPnByZWRfYmxvY2s7Ci0gICAgdWludDMyIHRlbXA7Ci0gICAgdWludDggYnl0ZTEsIGJ5dGUyLCBieXRlMzsKLSAgICBpbnQgdmFsdWU7Ci0gICAgaW50IHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLQotICAgIGNvbXBfcmVmX3gwID0gY29tcF9yZWZfeCArIDg7Ci0gICAgY29tcF9yZWZfeDEgPSBjb21wX3JlZl94ICsgNjsKLSAgICBjb21wX3JlZl95MCA9IGNvbXBfcmVmX3kgKyAocGl0Y2ggPDwgMyk7Ci0gICAgY29tcF9yZWZfeTEgPSBjb21wX3JlZl95ICsgNiAqIHBpdGNoOwotCi0gICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKLSAgICB7Ci0gICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtICpjb21wX3JlZl94MS0tKTsKLSAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7Ci0gICAgICAgIGNvbXBfcmVmX3kwICs9IHBpdGNoOwotICAgICAgICBjb21wX3JlZl95MSAtPSBwaXRjaDsKLSAgICB9Ci0KLSAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0KTsKLSAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKLQotCi0gICAgYV8xNiA9ICgoKihjb21wX3JlZl94ICsgMTUpICsgKihjb21wX3JlZl95ICsgMTUgKiBwaXRjaCkpIDw8IDQpICsgMTY7OwotICAgIGIgPSAoNSAqIEggKyAzMikgPj4gNjsKLSAgICBjID0gKDUgKiBWICsgMzIpID4+IDY7Ci0KLSAgICB0bXAgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBmYWN0b3JfYyA9IGFfMTYgKyBjICogKHRtcCsrIC0gNyk7Ci0KLSAgICAgICAgZmFjdG9yX2MgLT0gNyAqIGI7Ci0KLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTEgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTIgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTMgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgdGVtcCA9IGJ5dGUxIHwgKGJ5dGUyIDw8IDgpOwotICAgICAgICB0ZW1wIHw9IChieXRlMyA8PCAxNik7Ci0gICAgICAgIHRlbXAgfD0gKHZhbHVlIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0KLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTEgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTIgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTMgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgdGVtcCA9IGJ5dGUxIHwgKGJ5dGUyIDw8IDgpOwotICAgICAgICB0ZW1wIHw9IChieXRlMyA8PCAxNik7Ci0gICAgICAgIHRlbXAgfD0gKHZhbHVlIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHRlbXA7Ci0KLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTEgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTIgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTMgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgdGVtcCA9IGJ5dGUxIHwgKGJ5dGUyIDw8IDgpOwotICAgICAgICB0ZW1wIHw9IChieXRlMyA8PCAxNik7Ci0gICAgICAgIHRlbXAgfD0gKHZhbHVlIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHRlbXA7Ci0KLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTEgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTIgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgYnl0ZTMgPSB2YWx1ZTsKLSAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgdGVtcCA9IGJ5dGUxIHwgKGJ5dGUyIDw8IDgpOwotICAgICAgICB0ZW1wIHw9IChieXRlMyA8PCAxNik7Ci0gICAgICAgIHRlbXAgfD0gKHZhbHVlIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSB0ZW1wOwotICAgICAgICBwcmVkICs9IHByZWRfcGl0Y2g7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKiogQ2hyb21hIGludHJhIHByZWRpY3Rpb24gKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEludHJhX0Nocm9tYV9EQyhBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIHVpbnQ4ICpwcmVkQ2IsIHVpbnQ4ICpwcmVkQ3IpCi17Ci0gICAgaW50IGk7Ci0gICAgdWludDMyIHRlbXAsIHRlbXAyLCBwcmVkX2EsIHByZWRfYjsKLSAgICB1aW50OCAqY29tcF9yZWZfeCwgKmNvbXBfcmVmX3k7Ci0gICAgdWludDggKmNvbXBfcmVmX2NiX3ggPSB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NiOwotICAgIHVpbnQ4ICpjb21wX3JlZl9jYl95ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY2I7Ci0gICAgdWludDggKmNvbXBfcmVmX2NyX3ggPSB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NyOwotICAgIHVpbnQ4ICpjb21wX3JlZl9jcl95ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY3I7Ci0gICAgaW50ICBjb21wb25lbnQsIGo7Ci0gICAgaW50ICBzdW1feDAsIHN1bV94MSwgc3VtX3kwLCBzdW1feTE7Ci0gICAgaW50IHByZWRfMFsyXSwgcHJlZF8xWzJdLCBwcmVkXzJbMl0sIHByZWRfM1syXTsKLSAgICBpbnQgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOwotICAgIHVpbnQ4ICpwcmVkOwotCi0gICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQiAmIHZpZGVvLT5pbnRyYUF2YWlsQSkKLSAgICB7Ci0gICAgICAgIGNvbXBfcmVmX3ggPSBjb21wX3JlZl9jYl94OwotICAgICAgICBjb21wX3JlZl95ID0gY29tcF9yZWZfY2JfeTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7Ci0gICAgICAgICAgICBjb21wX3JlZl94ICs9IDQ7Ci0gICAgICAgICAgICB0ZW1wMiA9ICh0ZW1wID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgICAgICB0ZW1wICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgdGVtcCArPSB0ZW1wMjsKLSAgICAgICAgICAgIHRlbXAgKz0gKHRlbXAgPj4gMTYpOwotICAgICAgICAgICAgc3VtX3gwID0gdGVtcCAmIDB4RkZGRjsKLQotICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7Ci0gICAgICAgICAgICB0ZW1wMiA9ICh0ZW1wID4+IDgpICYgMHhGRjAwRkY7Ci0gICAgICAgICAgICB0ZW1wICY9IDB4RkYwMEZGOwotICAgICAgICAgICAgdGVtcCArPSB0ZW1wMjsKLSAgICAgICAgICAgIHRlbXAgKz0gKHRlbXAgPj4gMTYpOwotICAgICAgICAgICAgc3VtX3gxID0gdGVtcCAmIDB4RkZGRjsKLQotICAgICAgICAgICAgcHJlZF8xW2ldID0gKHN1bV94MSArIDIpID4+IDI7Ci0KLSAgICAgICAgICAgIHN1bV95MCA9ICpjb21wX3JlZl95OwotICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7Ci0gICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKLSAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOwotCi0gICAgICAgICAgICBzdW1feTEgPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOwotICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7Ci0gICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKLSAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOwotCi0gICAgICAgICAgICBwcmVkXzJbaV0gPSAoc3VtX3kxICsgMikgPj4gMjsKLQotICAgICAgICAgICAgcHJlZF8wW2ldID0gKHN1bV95MCArIHN1bV94MCArIDQpID4+IDM7Ci0gICAgICAgICAgICBwcmVkXzNbaV0gPSAoc3VtX3kxICsgc3VtX3gxICsgNCkgPj4gMzsKLQotICAgICAgICAgICAgY29tcF9yZWZfeCA9IGNvbXBfcmVmX2NyX3g7Ci0gICAgICAgICAgICBjb21wX3JlZl95ID0gY29tcF9yZWZfY3JfeTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKLSAgICB7Ci0gICAgICAgIGNvbXBfcmVmX3kgPSBjb21wX3JlZl9jYl95OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW1feTAgPSAqY29tcF9yZWZfeTsKLSAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOwotICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7Ci0gICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKLQotICAgICAgICAgICAgc3VtX3kxID0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKLSAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOwotICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7Ci0gICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKLQotICAgICAgICAgICAgcHJlZF8wW2ldID0gcHJlZF8xW2ldID0gKHN1bV95MCArIDIpID4+IDI7Ci0gICAgICAgICAgICBwcmVkXzJbaV0gPSBwcmVkXzNbaV0gPSAoc3VtX3kxICsgMikgPj4gMjsKLSAgICAgICAgICAgIGNvbXBfcmVmX3kgPSBjb21wX3JlZl9jcl95OwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKLSAgICB7Ci0gICAgICAgIGNvbXBfcmVmX3ggPSBjb21wX3JlZl9jYl94OwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZl94KTsKLSAgICAgICAgICAgIGNvbXBfcmVmX3ggKz0gNDsKLSAgICAgICAgICAgIHRlbXAyID0gKHRlbXAgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgIHRlbXAgJj0gMHhGRjAwRkY7Ci0gICAgICAgICAgICB0ZW1wICs9IHRlbXAyOwotICAgICAgICAgICAgdGVtcCArPSAodGVtcCA+PiAxNik7Ci0gICAgICAgICAgICBzdW1feDAgPSB0ZW1wICYgMHhGRkZGOwotCi0gICAgICAgICAgICB0ZW1wID0gKigodWludDMyKiljb21wX3JlZl94KTsKLSAgICAgICAgICAgIHRlbXAyID0gKHRlbXAgPj4gOCkgJiAweEZGMDBGRjsKLSAgICAgICAgICAgIHRlbXAgJj0gMHhGRjAwRkY7Ci0gICAgICAgICAgICB0ZW1wICs9IHRlbXAyOwotICAgICAgICAgICAgdGVtcCArPSAodGVtcCA+PiAxNik7Ci0gICAgICAgICAgICBzdW1feDEgPSB0ZW1wICYgMHhGRkZGOwotCi0gICAgICAgICAgICBwcmVkXzBbaV0gPSBwcmVkXzJbaV0gPSAoc3VtX3gwICsgMikgPj4gMjsKLSAgICAgICAgICAgIHByZWRfMVtpXSA9IHByZWRfM1tpXSA9IChzdW1feDEgKyAyKSA+PiAyOwotICAgICAgICAgICAgY29tcF9yZWZfeCA9IGNvbXBfcmVmX2NyX3g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJlZF8wWzBdID0gcHJlZF8wWzFdID0gcHJlZF8xWzBdID0gcHJlZF8xWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfMlswXSA9IHByZWRfMlsxXSA9IHByZWRfM1swXSA9IHByZWRfM1sxXSA9IDEyODsKLSAgICB9Ci0KLSAgICBwcmVkID0gcHJlZENiOwotICAgIGZvciAoY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgMjsgY29tcG9uZW50KyspCi0gICAgewotICAgICAgICBwcmVkX2EgPSBwcmVkXzBbY29tcG9uZW50XTsKLSAgICAgICAgcHJlZF9iID0gcHJlZF8xW2NvbXBvbmVudF07Ci0gICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOwotICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7Ci0gICAgICAgIHByZWRfYiB8PSAocHJlZF9iIDw8IDgpOwotICAgICAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCAxNik7Ci0KLSAgICAgICAgZm9yIChpID0gNDsgaSA8IDY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgLyogNCBsaW5lcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2E7Ci0gICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKLSAgICAgICAgICAgICAgICBwcmVkICs9IHByZWRfcGl0Y2g7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJlZF9hID0gcHJlZF8yW2NvbXBvbmVudF07Ci0gICAgICAgICAgICBwcmVkX2IgPSBwcmVkXzNbY29tcG9uZW50XTsKLSAgICAgICAgICAgIHByZWRfYSB8PSAocHJlZF9hIDw8IDgpOwotICAgICAgICAgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgMTYpOwotICAgICAgICAgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgOCk7Ci0gICAgICAgICAgICBwcmVkX2IgfD0gKHByZWRfYiA8PCAxNik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZCA9IHByZWRDcjsgLyogcG9pbnQgdG8gY3IgKi8KLSAgICB9Ci19Ci0KLXZvaWQgIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBwaXRjaCwgdWludDggKnByZWRDYiwgdWludDggKnByZWRDcikKLXsKLSAgICBpbnQgaTsKLSAgICB1aW50MzIgdGVtcDsKLSAgICB1aW50OCAgICpjb21wX3JlZl9jYl95ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY2I7Ci0gICAgdWludDggICAqY29tcF9yZWZfY3JfeSA9IHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NyOwotICAgIHVpbnQ4ICAqY29tcDsKLSAgICBpbnQgY29tcG9uZW50LCBqOwotICAgIGludCAgICAgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOwotICAgIHVpbnQ4ICAgKnByZWQ7Ci0KLSAgICBjb21wID0gY29tcF9yZWZfY2JfeTsKLSAgICBwcmVkID0gcHJlZENiOwotICAgIGZvciAoY29tcG9uZW50ID0gMDsgY29tcG9uZW50IDwgMjsgY29tcG9uZW50KyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSAqY29tcDsKLSAgICAgICAgICAgICAgICBjb21wICs9IHBpdGNoOwotICAgICAgICAgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgOCk7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAodGVtcCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgcHJlZCArPSBwcmVkX3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbXAgPSBjb21wX3JlZl9jcl95OwotICAgICAgICBwcmVkID0gcHJlZENyOyAvKiBwb2ludCB0byBjciAqLwotICAgIH0KLQotfQotCi12b2lkICBJbnRyYV9DaHJvbWFfVmVydGljYWwoQVZDQ29tbW9uT2JqICp2aWRlbywgdWludDggKnByZWRDYiwgdWludDggKnByZWRDcikKLXsKLSAgICB1aW50MzIgIHRlbXAxLCB0ZW1wMjsKLSAgICB1aW50OCAgICpjb21wX3JlZl9jYl94ID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jYjsKLSAgICB1aW50OCAgICpjb21wX3JlZl9jcl94ID0gdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jcjsKLSAgICB1aW50OCAgICpjb21wX3JlZjsKLSAgICBpbnQgICAgIGNvbXBvbmVudCwgajsKLSAgICBpbnQgICAgIHByZWRfcGl0Y2ggPSB2aWRlby0+cHJlZF9waXRjaDsKLSAgICB1aW50OCAgICpwcmVkOwotCi0gICAgY29tcF9yZWYgPSBjb21wX3JlZl9jYl94OwotICAgIHByZWQgPSBwcmVkQ2I7Ci0gICAgZm9yIChjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCAyOyBjb21wb25lbnQrKykKLSAgICB7Ci0gICAgICAgIHRlbXAxID0gKigodWludDMyKiljb21wX3JlZik7Ci0gICAgICAgIHRlbXAyID0gKigodWludDMyKikoY29tcF9yZWYgKyA0KSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wMTsKLSAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSB0ZW1wMjsKLSAgICAgICAgICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICAgICAgfQotICAgICAgICBjb21wX3JlZiA9IGNvbXBfcmVmX2NyX3g7Ci0gICAgICAgIHByZWQgPSBwcmVkQ3I7IC8qIHBvaW50IHRvIGNyICovCi0gICAgfQotCi19Ci0KLXZvaWQgIEludHJhX0Nocm9tYV9QbGFuZShBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgcGl0Y2gsIHVpbnQ4ICpwcmVkQ2IsIHVpbnQ4ICpwcmVkQ3IpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGFfMTZfQ1syXSwgYl9DWzJdLCBjX0NbMl0sIGFfMTYsIGIsIGMsIGZhY3Rvcl9jOwotICAgIHVpbnQ4ICpjb21wX3JlZl94LCAqY29tcF9yZWZfeSwgKmNvbXBfcmVmX3gwLCAqY29tcF9yZWZfeDEsICAqY29tcF9yZWZfeTAsICpjb21wX3JlZl95MTsKLSAgICBpbnQgY29tcG9uZW50LCBqOwotICAgIGludCBILCBWLCB0bXA7Ci0gICAgdWludDMyIHRlbXA7Ci0gICAgdWludDggYnl0ZTEsIGJ5dGUyLCBieXRlMzsKLSAgICBpbnQgdmFsdWU7Ci0gICAgdWludDggdG9wbGVmdDsKLSAgICBpbnQgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOwotICAgIHVpbnQ4ICpwcmVkOwotCi0gICAgY29tcF9yZWZfeCA9IHZpZGVvLT5waW50cmFfcHJlZF90b3BfY2I7Ci0gICAgY29tcF9yZWZfeSA9IHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NiOwotICAgIHRvcGxlZnQgPSB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NiOwotCi0gICAgZm9yIChjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCAyOyBjb21wb25lbnQrKykKLSAgICB7Ci0gICAgICAgIEggPSBWID0gMDsKLSAgICAgICAgY29tcF9yZWZfeDAgPSBjb21wX3JlZl94ICsgNDsKLSAgICAgICAgY29tcF9yZWZfeDEgPSBjb21wX3JlZl94ICsgMjsKLSAgICAgICAgY29tcF9yZWZfeTAgPSBjb21wX3JlZl95ICsgKHBpdGNoIDw8IDIpOwotICAgICAgICBjb21wX3JlZl95MSA9IGNvbXBfcmVmX3kgKyAocGl0Y2ggPDwgMSk7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtICpjb21wX3JlZl94MS0tKTsKLSAgICAgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOwotICAgICAgICAgICAgY29tcF9yZWZfeTAgKz0gcGl0Y2g7Ci0gICAgICAgICAgICBjb21wX3JlZl95MSAtPSBwaXRjaDsKLSAgICAgICAgfQotICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSB0b3BsZWZ0KTsKLSAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7Ci0KLSAgICAgICAgYV8xNl9DW2NvbXBvbmVudF0gPSAoKCooY29tcF9yZWZfeCArIDcpICsgKihjb21wX3JlZl95ICsgNyAqIHBpdGNoKSkgPDwgNCkgKyAxNjsKLSAgICAgICAgYl9DW2NvbXBvbmVudF0gPSAoMTcgKiBIICsgMTYpID4+IDU7Ci0gICAgICAgIGNfQ1tjb21wb25lbnRdID0gKDE3ICogViArIDE2KSA+PiA1OwotCi0gICAgICAgIGNvbXBfcmVmX3ggPSB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NyOwotICAgICAgICBjb21wX3JlZl95ID0gdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY3I7Ci0gICAgICAgIHRvcGxlZnQgPSB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NyOwotICAgIH0KLQotICAgIHByZWQgPSBwcmVkQ2I7Ci0gICAgZm9yIChjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCAyOyBjb21wb25lbnQrKykKLSAgICB7Ci0gICAgICAgIGFfMTYgPSBhXzE2X0NbY29tcG9uZW50XTsKLSAgICAgICAgYiA9IGJfQ1tjb21wb25lbnRdOwotICAgICAgICBjID0gY19DW2NvbXBvbmVudF07Ci0gICAgICAgIHRtcCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFjdG9yX2MgPSBhXzE2ICsgYyAqICh0bXArKyAtIDMpOwotCi0gICAgICAgICAgICAgICAgZmFjdG9yX2MgLT0gMyAqIGI7Ci0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7Ci0gICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgICAgICAgICBieXRlMSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKLSAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQotICAgICAgICAgICAgICAgIGJ5dGUyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCi0gICAgICAgICAgICAgICAgYnl0ZTMgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7Ci0gICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgICAgICAgICB0ZW1wID0gYnl0ZTEgfCAoYnl0ZTIgPDwgOCk7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZTMgPDwgMTYpOwotICAgICAgICAgICAgICAgIHRlbXAgfD0gKHZhbHVlIDw8IDI0KTsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKLQotICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKLSAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQotICAgICAgICAgICAgICAgIGJ5dGUxID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OwotICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7Ci0gICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCi0gICAgICAgICAgICAgICAgYnl0ZTIgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7Ci0gICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKLSAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKLSAgICAgICAgICAgICAgICBieXRlMyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKLSAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOwotICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQotICAgICAgICAgICAgICAgIHRlbXAgPSBieXRlMSB8IChieXRlMiA8PCA4KTsKLSAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlMyA8PCAxNik7Ci0gICAgICAgICAgICAgICAgdGVtcCB8PSAodmFsdWUgPDwgMjQpOwotICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSB0ZW1wOwotICAgICAgICAgICAgICAgIHByZWQgKz0gcHJlZF9waXRjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmVkID0gcHJlZENyOyAvKiBwb2ludCB0byBjciAqLwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3Jlc2lkdWFsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9yZXNpZHVhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODU1MGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3Jlc2lkdWFsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmNkZWNfbGliLmgiCi0jaW5jbHVkZSAiYXZjZGVjX2JpdHN0cmVhbS5oIgotCi1BVkNEZWNfU3RhdHVzIERlY29kZUludHJhUENNKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKQotewotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotICAgIGludCBqOwotICAgIGludCBtYl94LCBtYl95LCBvZmZzZXQxOwotICAgIHVpbnQ4ICpwRHN0OwotICAgIHVpbnQzMiBieXRlMCwgYnl0ZTE7Ci0gICAgaW50IHBpdGNoOwotCi0gICAgbWJfeCA9IHZpZGVvLT5tYl94OwotICAgIG1iX3kgPSB2aWRlby0+bWJfeTsKLQotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcERzdCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgODQ7Ci0gICAgcGl0Y2ggPSAyMDsKLSNlbHNlCi0gICAgb2Zmc2V0MSA9IChtYl94IDw8IDQpICsgKG1iX3kgPDwgNCkgKiB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMOwotICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2wgKyBvZmZzZXQxOwotICAgIHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOwotI2VuZGlmCi0KLSAgICAvKiBhdCB0aGlzIHBvaW50IGJpdHN0cmVhbSBpcyBieXRlLWFsaWduZWQgKi8KLSAgICBqID0gMTY7Ci0gICAgd2hpbGUgKGogPiAwKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTApOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCA4KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMTYpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopcERzdCkgPSBieXRlMDsKLQotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMCk7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDgpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAxNik7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikocERzdCArIDQpKSA9IGJ5dGUwOwotCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUwKTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgOCk7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDE2KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShwRHN0ICsgOCkpID0gYnl0ZTA7Ci0KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTApOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCA4KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMTYpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKHBEc3QgKyAxMikpID0gYnl0ZTA7Ci0gICAgICAgIGotLTsKLSAgICAgICAgcERzdCArPSBwaXRjaDsKLQotICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCi0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcERzdCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgNDUyOwotICAgIHBpdGNoID0gMTI7Ci0jZWxzZQotICAgIG9mZnNldDEgPSAob2Zmc2V0MSA+PiAyKSArIChtYl94IDw8IDIpOwotICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2NiICsgb2Zmc2V0MTsKLSAgICBwaXRjaCA+Pj0gMTsKLSNlbmRpZgotCi0gICAgaiA9IDg7Ci0gICAgd2hpbGUgKGogPiAwKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTApOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCA4KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMTYpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopcERzdCkgPSBieXRlMDsKLQotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMCk7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDgpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAxNik7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDI0KTsKLSAgICAgICAgKigodWludDMyKikocERzdCArIDQpKSA9IGJ5dGUwOwotCi0gICAgICAgIGotLTsKLSAgICAgICAgcERzdCArPSBwaXRjaDsKLQotICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCi0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotI2lmZGVmIFVTRV9QUkVEX0JMT0NLCi0gICAgcERzdCA9IHZpZGVvLT5wcmVkX2Jsb2NrICsgNTk2OwotICAgIHBpdGNoID0gMTI7Ci0jZWxzZQotICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2NyICsgb2Zmc2V0MTsKLSNlbmRpZgotICAgIGogPSA4OwotICAgIHdoaWxlIChqID4gMCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUwKTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgOCk7Ci0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgOCwgKHVpbnQqKSAmIGJ5dGUxKTsKLSAgICAgICAgYnl0ZTAgfD0gKGJ5dGUxIDw8IDE2KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKXBEc3QpID0gYnl0ZTA7Ci0KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTApOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCA4KTsKLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA4LCAodWludCopICYgYnl0ZTEpOwotICAgICAgICBieXRlMCB8PSAoYnl0ZTEgPDwgMTYpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDgsICh1aW50KikgJiBieXRlMSk7Ci0gICAgICAgIGJ5dGUwIHw9IChieXRlMSA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKHBEc3QgKyA0KSkgPSBieXRlMDsKLQotICAgICAgICBqLS07Ci0gICAgICAgIHBEc3QgKz0gcGl0Y2g7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykgIC8qIGNoZWNrIG9ubHkgb25jZSBwZXIgbGluZSAqLwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSNpZmRlZiBNQl9CQVNFRF9ERUJMT0NLCi0gICAgU2F2ZU5laWdoYm9yRm9ySW50cmFQcmVkKHZpZGVvLCBvZmZzZXQxKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0KLQotLyogc2VlIHN1YmNsYXVzZSA3LjMuNS4zIGFuZCByZWFkQ0JQYW5kQ29lZmZzRnJvbU5BTCgpIGluIEpNKi8KLUFWQ0RlY19TdGF0dXMgcmVzaWR1YWwoQVZDRGVjT2JqZWN0ICpkZWN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQikKLXsKLSAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZGVjdmlkLT5jb21tb247Ci0gICAgaW50MTYgKmJsb2NrOwotICAgIGludCBsZXZlbFsxNl0sIHJ1blsxNl0sIG51bWNvZWZmOyAvKiBvdXRwdXQgZnJvbSByZXNpZHVhbF9ibG9ja19jYXZsYyAqLwotICAgIGludCBibG9ja194LCBpLCBqLCBrLCBpZHgsIGlDYkNyOwotICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeCwgbWJQYXJ0SWR4X1gsIG1iUGFydElkeF9ZOwotICAgIGludCBuQywgbWF4TnVtQ29lZmYgPSAxNjsKLSAgICBpbnQgY29lZmZOdW0sIHN0YXJ0X3NjYW4gPSAwOwotICAgIHVpbnQ4ICp6el9zY2FuOwotICAgIGludCBScSwgUXE7Ci0gICAgdWludDMyIGNicDR4NCA9IDA7Ci0KLSAgICAvKiBpbiA4LjUuNCwgaXQgb25seSBzYXlzIGlmIGl0J3MgZmllbGQgbWFjcm9ibG9jay4gKi8KLQotICAgIHp6X3NjYW4gPSAodWludDgqKSBaWl9TQ0FOX0JMT0NLOwotCi0KLSAgICAvKiBzZWUgOC41LjggZm9yIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGVzZSB2YWx1ZXMgKi8KLSAgICBRcSA9IHZpZGVvLT5RUHlfZGl2XzY7Ci0gICAgUnEgPSB2aWRlby0+UVB5X21vZF82OwotCi0gICAgbWVtc2V0KHZpZGVvLT5ibG9jaywgMCwgc2l6ZW9mKGludDE2KSpOVU1fUElYRUxTX0lOX01CKTsKLQotICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQotICAgIHsKLSAgICAgICAgbkMgPSBwcmVkaWN0X25ueih2aWRlbywgMCwgMCk7Ci0gICAgICAgIGRlY3ZpZC0+cmVzaWR1YWxfYmxvY2soZGVjdmlkLCBuQywgMTYsIGxldmVsLCBydW4sICZudW1jb2VmZik7Ci0gICAgICAgIC8qIHRoZW4gcGVyZm9ybXMgemlnemFnIGFuZCB0cmFuc2Zvcm0gKi8KLSAgICAgICAgYmxvY2sgPSB2aWRlby0+YmxvY2s7Ci0gICAgICAgIGNvZWZmTnVtID0gLTE7Ci0gICAgICAgIGZvciAoaSA9IG51bWNvZWZmIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZWZmTnVtICs9IHJ1bltpXSArIDE7Ci0gICAgICAgICAgICBpZiAoY29lZmZOdW0gPiAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZHggPSB6el9zY2FuW2NvZWZmTnVtXSA8PCAyOwotICAgICAgICAgICAgLyogICAgICAgICAgaWR4ID0gKChpZHg+PjIpPDw2KSArICgoaWR4JjMpPDwyKTsgKi8KLSAgICAgICAgICAgIGJsb2NrW2lkeF0gPSBsZXZlbFtpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGludmVyc2UgdHJhbnNmb3JtIG9uIEludHJhMTZ4MTZEQ0xldmVsICovCi0gICAgICAgIGlmIChudW1jb2VmZikKLSAgICAgICAgewotICAgICAgICAgICAgSW50cmExNkRDVHJhbnMoYmxvY2ssIFFxLCBScSk7Ci0gICAgICAgICAgICBjYnA0eDQgPSAweEZGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgbWF4TnVtQ29lZmYgPSAxNTsKLSAgICAgICAgc3RhcnRfc2NhbiA9IDE7Ci0gICAgfQotCi0gICAgbWVtc2V0KGN1cnJNQi0+bnpfY29lZmYsIDAsIHNpemVvZih1aW50OCkqMjQpOwotCi0gICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKLSAgICB7Ci0gICAgICAgIG1iUGFydElkeF9YID0gKG1iUGFydElkeCAmIDEpIDw8IDE7Ci0gICAgICAgIG1iUGFydElkeF9ZID0gbWJQYXJ0SWR4ICYgLTI7Ci0KLSAgICAgICAgaWYgKGN1cnJNQi0+Q0JQJigxIDw8IG1iUGFydElkeCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgNDsgc3ViTWJQYXJ0SWR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaSA9IG1iUGFydElkeF9YICsgKHN1Yk1iUGFydElkeCAmIDEpOyAgLy8gY2hlY2sgdGhpcwotICAgICAgICAgICAgICAgIGogPSBtYlBhcnRJZHhfWSArIChzdWJNYlBhcnRJZHggPj4gMSk7Ci0gICAgICAgICAgICAgICAgYmxvY2sgPSB2aWRlby0+YmxvY2sgKyAoaiA8PCA2KSArIChpIDw8IDIpOyAgLy8KLSAgICAgICAgICAgICAgICBuQyA9IHByZWRpY3Rfbm56KHZpZGVvLCBpLCBqKTsKLSAgICAgICAgICAgICAgICBkZWN2aWQtPnJlc2lkdWFsX2Jsb2NrKGRlY3ZpZCwgbkMsIG1heE51bUNvZWZmLCBsZXZlbCwgcnVuLCAmbnVtY29lZmYpOwotCi0gICAgICAgICAgICAgICAgLyogY29udmVydCB0byByYXN0ZXIgc2NhbiBhbmQgcXVhbnRpemUqLwotICAgICAgICAgICAgICAgIC8qIE5vdGU6IGZvciBQIG1iIGluIFNQIHNsaWNlIGFuZCBTSSBtYiBpbiBTSSBzbGljZSwKLSAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBjYW5ub3QgYmUgZG9uZSBoZXJlLgotICAgICAgICAgICAgICAgICBibG9ja1tpZHhdIHNob3VsZCBiZSBhc3NpZ25lZCB3aXRoIGxldmVsW2tdLgotICAgICAgICAgICAgICAgIGl0cmFucyB3aWxsIGJlIGRvbmUgYWZ0ZXIgdGhlIHByZWRpY3Rpb24uCi0gICAgICAgICAgICAgICAgVGhlcmUgd2lsbCBiZSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgcHJlZGljdGVkIHZhbHVlLAotICAgICAgICAgICAgICAgIHRoZW4gYWRkaXRpb24gd2l0aCBibG9ja1tpZHhdLCB0aGVuIHRoaXMgcXVhbnRpemF0aW9uCi0gICAgICAgICAgICAgICAgYW5kIHRyYW5zZm9ybS4qLwotCi0gICAgICAgICAgICAgICAgY29lZmZOdW0gPSAtMSArIHN0YXJ0X3NjYW47Ci0gICAgICAgICAgICAgICAgZm9yIChrID0gbnVtY29lZmYgLSAxOyBrID49IDA7IGstLSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZWZmTnVtICs9IHJ1bltrXSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2VmZk51bSA+IDE1KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWR4ID0genpfc2Nhbltjb2VmZk51bV07Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAobGV2ZWxba10gKiBkZXF1YW50X2NvZWZyZXNbUnFdW2NvZWZmTnVtXSkgPDwgUXEgOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbKGo8PDIpK2ldID0gbnVtY29lZmY7Ci0gICAgICAgICAgICAgICAgaWYgKG51bWNvZWZmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2JwNHg0IHw9ICgxIDw8ICgoaiA8PCAyKSArIGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBRcSA9IHZpZGVvLT5RUGNfZGl2XzY7Ci0gICAgUnEgPSB2aWRlby0+UVBjX21vZF82OwotCi0gICAgaWYgKGN1cnJNQi0+Q0JQICYgKDMgPDwgNCkpIC8qIGNocm9tYSBEQyByZXNpZHVhbCBwcmVzZW50ICovCi0gICAgewotICAgICAgICBmb3IgKGlDYkNyID0gMDsgaUNiQ3IgPCAyOyBpQ2JDcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWN2aWQtPnJlc2lkdWFsX2Jsb2NrKGRlY3ZpZCwgLTEsIDQsIGxldmVsLCBydW4sICZudW1jb2VmZik7Ci0gICAgICAgICAgICBibG9jayA9IHZpZGVvLT5ibG9jayArIDI1NiArIChpQ2JDciA8PCAzKTsKLSAgICAgICAgICAgIGNvZWZmTnVtID0gLTE7Ci0gICAgICAgICAgICBmb3IgKGkgPSBudW1jb2VmZiAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvZWZmTnVtICs9IHJ1bltpXSArIDE7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZWZmTnVtID4gMykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxvY2tbKGNvZWZmTnVtPj4xKSo2NCArIChjb2VmZk51bSYxKSo0XSA9IGxldmVsW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaW52ZXJzZSB0cmFuc2Zvcm0gb24gY2hyb21hIERDICovCi0gICAgICAgICAgICAvKiBmb3IgUCBpbiBTUCBhbmQgU0kgaW4gU0ksIHRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgZG9uZSBoZXJlLAotICAgICAgICAgICAgbXVzdCBkbyBwcmVkaWN0aW9uIHRyYW5zZm9ybS9xdWFudCBmaXJzdC4gKi8KLSAgICAgICAgICAgIGlmIChudW1jb2VmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaHJvbWFEQ1RyYW5zKGJsb2NrLCBRcSwgUnEpOwotICAgICAgICAgICAgICAgIGNicDR4NCB8PSAoaUNiQ3IgPyAweGNjMDAwMCA6IDB4MzMwMDAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjdXJyTUItPkNCUCAmICgyIDw8IDQpKQotICAgIHsKLSAgICAgICAgZm9yIChibG9ja194ID0gMDsgYmxvY2tfeCA8IDQ7IGJsb2NrX3ggKz0gMikgLyogZm9yIGlDYkNyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPCA2OyBqKyspICAvKiBmb3IgZWFjaCBibG9jayBpbnNpZGUgQ2Igb3IgQ3IgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBibG9ja194OyBpIDwgYmxvY2tfeCArIDI7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB2aWRlby0+YmxvY2sgKyAoaiA8PCA2KSArIChpIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgIG5DID0gcHJlZGljdF9ubnpfY2hyb21hKHZpZGVvLCBpLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjdmlkLT5yZXNpZHVhbF9ibG9jayhkZWN2aWQsIG5DLCAxNSwgbGV2ZWwsIHJ1biwgJm51bWNvZWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb252ZXJ0IHRvIHJhc3RlciBzY2FuIGFuZCBxdWFudGl6ZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBmb3IgUCBNQiBpbiBTUCBzbGljZSBhbmQgU0kgTUIgaW4gU0kgc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZXF1YW50IGFuZCB0cmFuc2Zvcm0gY2Fubm90IGJlIGRvbmUgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgSXQgbmVlZHMgdGhlIHByZWRpY3Rpb24gdmFsdWVzLiAqLwotICAgICAgICAgICAgICAgICAgICBjb2VmZk51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IG51bWNvZWZmIC0gMTsgayA+PSAwOyBrLS0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmTnVtICs9IHJ1bltrXSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29lZmZOdW0gPiAxNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSB6el9zY2FuW2NvZWZmTnVtXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAobGV2ZWxba10gKiBkZXF1YW50X2NvZWZyZXNbUnFdW2NvZWZmTnVtXSkgPDwgUXE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gdHJhbnNmb3JtICovCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBpdHJhbnMoYmxvY2spOyAvKiB0cmFuc2Zvcm0gKi8KLSAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsoajw8MikraV0gPSBudW1jb2VmZjsgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bWNvZWZmKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYnA0eDQgfD0gKDEgPDwgKChqIDw8IDIpICsgaSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aWRlby0+Y2JwNHg0ID0gY2JwNHg0OwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiBzZWUgc3ViY2xhdXNlIDcuMy41LjMuMSBhbmQgOS4yIGFuZCByZWFkQ29lZmY0eDRfQ0FWTEMoKSBpbiBKTSAqLwotQVZDRGVjX1N0YXR1cyByZXNpZHVhbF9ibG9ja19jYXZsYyhBVkNEZWNPYmplY3QgKmRlY3ZpZCwgaW50IG5DLCBpbnQgbWF4TnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGV2ZWwsIGludCAqcnVuLCBpbnQgKm51bWNvZWZmKQotewotICAgIGludCBpLCBqOwotICAgIGludCBUcmFpbGluZ09uZXMsIFRvdGFsQ29lZmY7Ci0gICAgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0gPSBkZWN2aWQtPmJpdHN0cmVhbTsKLSAgICBpbnQgc3VmZml4TGVuZ3RoOwotICAgIHVpbnQgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcsIGxldmVsX3ByZWZpeCwgbGV2ZWxfc3VmZml4OwotICAgIGludCBsZXZlbENvZGUsIGxldmVsU3VmZml4U2l6ZSwgemVyb3NMZWZ0OwotICAgIGludCBydW5fYmVmb3JlOwotCi0KLSAgICBpZiAobkMgPj0gMCkKLSAgICB7Ci0gICAgICAgIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoc3RyZWFtLCAmVHJhaWxpbmdPbmVzLCAmVG90YWxDb2VmZiwgbkMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzQ2hyb21hREMoc3RyZWFtLCAmVHJhaWxpbmdPbmVzLCAmVG90YWxDb2VmZik7Ci0gICAgfQotCi0gICAgKm51bWNvZWZmID0gVG90YWxDb2VmZjsKLQotICAgIC8qIFRoaXMgcGFydCBpcyBkb25lIHF1aXRlIGRpZmZlcmVudGx5IGluIFJlYWRDb2VmNHg0X0NBVkxDKCkgKi8KLSAgICBpZiAoVG90YWxDb2VmZiA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotICAgIH0KLQotICAgIGlmIChUcmFpbGluZ09uZXMpIC8qIGtlZXAgcmVhZGluZyB0aGUgc2lnbiBvZiB0aG9zZSB0cmFpbGluZyBvbmVzICovCi0gICAgewotICAgICAgICAvKiBpbnN0ZWFkIG9mIHJlYWRpbmcgb25lIGJpdCBhdCBhIHRpbWUsIHJlYWQgdGhlIHdob2xlIHRoaW5nIGF0IG9uY2UgKi8KLSAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCBUcmFpbGluZ09uZXMsICZ0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyk7Ci0gICAgICAgIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnIDw8PSAxOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVHJhaWxpbmdPbmVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxldmVsW2ldID0gMSAtICgodHJhaWxpbmdfb25lc19zaWduX2ZsYWcgPj4gKFRyYWlsaW5nT25lcyAtIGkgLSAxKSkgJiAyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGkgPSBUcmFpbGluZ09uZXM7Ci0gICAgc3VmZml4TGVuZ3RoID0gMTsKLSAgICBpZiAoVG90YWxDb2VmZiA+IFRyYWlsaW5nT25lcykKLSAgICB7Ci0gICAgICAgIGNlX0xldmVsUHJlZml4KHN0cmVhbSwgJmxldmVsX3ByZWZpeCk7Ci0gICAgICAgIGlmIChUb3RhbENvZWZmIDwgMTEgfHwgVHJhaWxpbmdPbmVzID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZXZlbF9wcmVmaXggPCAxNCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBsZXZlbFN1ZmZpeFNpemUgPSAwOwotICAgICAgICAgICAgICAgIGxldmVsQ29kZSA9IGxldmVsX3ByZWZpeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsX3ByZWZpeCA9PSAxNCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBsZXZlbFN1ZmZpeFNpemUgPSA0OwotICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNCwgJmxldmVsX3N1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxDb2RlID0gMTQgKyBsZXZlbF9zdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qIGlmIChsZXZlbF9wcmVmaXggPT0gMTUpICovCi0gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgbGV2ZWxTdWZmaXhTaXplID0gMTI7Ci0gICAgICAgICAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCAxMiwgJmxldmVsX3N1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxDb2RlID0gMzAgKyBsZXZlbF9zdWZmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsgKi8KLSAgICAgICAgICAgIGlmIChsZXZlbF9wcmVmaXggPCAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZXZlbFN1ZmZpeFNpemUgPSBzdWZmaXhMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGV2ZWxTdWZmaXhTaXplID0gMTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIGxldmVsU3VmZml4U2l6ZSwgJmxldmVsX3N1ZmZpeCk7Ci0KLSAgICAgICAgICAgIGxldmVsQ29kZSA9IChsZXZlbF9wcmVmaXggPDwgMSkgKyBsZXZlbF9zdWZmaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVHJhaWxpbmdPbmVzIDwgMykKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWxDb2RlICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBsZXZlbFtpXSA9IChsZXZlbENvZGUgKyAyKSA+PiAxOwotICAgICAgICBpZiAobGV2ZWxbaV0gPiAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxldmVsQ29kZSAmIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxldmVsW2ldID0gLWxldmVsW2ldOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLQotICAgIH0KLQotICAgIGZvciAoaiA9IFRvdGFsQ29lZmYgLSBpOyBqID4gMCA7IGotLSkKLSAgICB7Ci0gICAgICAgIGNlX0xldmVsUHJlZml4KHN0cmVhbSwgJmxldmVsX3ByZWZpeCk7Ci0gICAgICAgIGlmIChsZXZlbF9wcmVmaXggPCAxNSkKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWxTdWZmaXhTaXplID0gc3VmZml4TGVuZ3RoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWxTdWZmaXhTaXplID0gMTI7Ci0gICAgICAgIH0KLSAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCBsZXZlbFN1ZmZpeFNpemUsICZsZXZlbF9zdWZmaXgpOwotCi0gICAgICAgIGxldmVsQ29kZSA9IChsZXZlbF9wcmVmaXggPDwgc3VmZml4TGVuZ3RoKSArIGxldmVsX3N1ZmZpeDsKLSAgICAgICAgbGV2ZWxbaV0gPSAobGV2ZWxDb2RlID4+IDEpICsgMTsKLSAgICAgICAgaWYgKGxldmVsW2ldID4gKDMgPDwgKHN1ZmZpeExlbmd0aCAtIDEpKSAmJiBzdWZmaXhMZW5ndGggPCA2KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWZmaXhMZW5ndGgrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobGV2ZWxDb2RlICYgMSkKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWxbaV0gPSAtbGV2ZWxbaV07Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgIH0KLQotCi0gICAgaWYgKFRvdGFsQ29lZmYgPCBtYXhOdW1Db2VmZikKLSAgICB7Ci0gICAgICAgIGlmIChuQyA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjZV9Ub3RhbFplcm9zKHN0cmVhbSwgJnplcm9zTGVmdCwgVG90YWxDb2VmZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBjZV9Ub3RhbFplcm9zQ2hyb21hREMoc3RyZWFtLCAmemVyb3NMZWZ0LCBUb3RhbENvZWZmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB6ZXJvc0xlZnQgPSAwOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBUb3RhbENvZWZmIC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHplcm9zTGVmdCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNlX1J1bkJlZm9yZShzdHJlYW0sICZydW5fYmVmb3JlLCB6ZXJvc0xlZnQpOwotICAgICAgICAgICAgcnVuW2ldID0gcnVuX2JlZm9yZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJ1bltpXSA9IDA7Ci0gICAgICAgICAgICB6ZXJvc0xlZnQgPSAwOyAvLyBjb3VsZCBiZSBuZWdhdGl2ZSB1bmRlciBlcnJvciBjb25kaXRpb25zCi0gICAgICAgIH0KLQotICAgICAgICB6ZXJvc0xlZnQgPSB6ZXJvc0xlZnQgLSBydW5baV07Ci0gICAgfQotCi0gICAgaWYgKHplcm9zTGVmdCA8IDApCi0gICAgewotICAgICAgICB6ZXJvc0xlZnQgPSAwOwotLy8gICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgcnVuW1RvdGFsQ29lZmYtMV0gPSB6ZXJvc0xlZnQ7Ci0KLSAgICAvKiBsZWF2ZSB0aGUgaW52ZXJzZSB6aWd6YWcgc2NhbiBwYXJ0IGZvciB0aGUgY2FsbGVyICovCi0KLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9zbGljZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9zcmMvc2xpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTJlZjNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy9zbGljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qIE5vdGUgZm9yIG9wdGltaXphdGlvbjogc3ludGF4IGRlY29kaW5nIG9yIG9wZXJhdGlvbnMgcmVsYXRlZCB0byBCX1NMSUNFIHNob3VsZCBiZQotY29tbWVudGVkIG91dCBieSBtYWNybyBkZWZpbml0aW9uIG9yIGZ1bmN0aW9uIHBvaW50ZXJzLiAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhdmNkZWNfbGliLmgiCi0jaW5jbHVkZSAiYXZjZGVjX2JpdHN0cmVhbS5oIgotCi1jb25zdCBzdGF0aWMgaW50IG1iUGFydDJyYXN0ZXJbM11bNF0gPSB7ezAsIDAsIDAsIDB9LCB7MSwgMSwgMCwgMH0sIHsxLCAwLCAxLCAwfX07Ci0vKiBkZWNvZGVfZnJhbWVfc2xpY2UoKSAqLwotLyogZGVjb2RlX29uZV9zbGljZSgpICovCi1BVkNEZWNfU3RhdHVzIERlY29kZVNsaWNlKEFWQ0RlY09iamVjdCAqZGVjdmlkKQotewotICAgIEFWQ0RlY19TdGF0dXMgc3RhdHVzOwotICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBkZWN2aWQtPmNvbW1vbjsKLSAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7Ci0gICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CIDsKLSAgICBBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSA9IGRlY3ZpZC0+Yml0c3RyZWFtOwotICAgIHVpbnQgc2xpY2VfZ3JvdXBfaWQ7Ci0gICAgdWludCBDdXJyTWJBZGRyLCBtb3JlRGF0YUZsYWc7Ci0KLSAgICAvKiBzZXQgdGhlIGZpcnN0IG1iIGluIHNsaWNlICovCi0gICAgQ3Vyck1iQWRkciA9IHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZTsKLSAgICBzbGljZV9ncm91cF9pZCA9IHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcFtDdXJyTWJBZGRyXTsKLQotICAgIGlmICgoQ3Vyck1iQWRkciAmJiAoQ3Vyck1iQWRkciAhPSAodWludCkodmlkZW8tPm1iTnVtICsgMSkpKSAmJiB2aWRlby0+Y3VyclNlcVBhcmFtcy0+Y29uc3RyYWluZWRfc2V0MV9mbGFnID09IDEpCi0gICAgewotICAgICAgICBDb25jZWFsU2xpY2UoZGVjdmlkLCB2aWRlby0+bWJOdW0sIEN1cnJNYkFkZHIpOwotICAgIH0KLQotICAgIG1vcmVEYXRhRmxhZyA9IDE7Ci0gICAgdmlkZW8tPm1iX3NraXBfcnVuID0gLTE7Ci0KLQotICAgIC8qIHdoaWxlIGxvb3AgLCBzZWUgc3ViY2xhdXNlIDcuMy40ICovCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGlmIChDdXJyTWJBZGRyID49IHZpZGVvLT5QaWNTaXplSW5NYnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIGN1cnJNQiA9IHZpZGVvLT5jdXJyTUIgPSAmKHZpZGVvLT5tYmxvY2tbQ3Vyck1iQWRkcl0pOwotICAgICAgICB2aWRlby0+bWJOdW0gPSBDdXJyTWJBZGRyOwotICAgICAgICBjdXJyTUItPnNsaWNlX2lkID0gdmlkZW8tPnNsaWNlX2lkOyAgLy8gIHNsaWNlCi0KLSAgICAgICAgLyogd2UgY2FuIHJlbW92ZSB0aGlzIGNoZWNrIGlmIHdlIGRvbid0IHN1cHBvcnQgTWJhZmYuICovCi0gICAgICAgIC8qIHdlIGNhbiB3cmFwIGJlbG93IGludG8gYW4gaW5pdE1CKCkgZnVuY3Rpb24gd2hpY2ggd2lsbCBhbHNvCi0gICAgICAgIGRvIG5lY2Vzc2FyeSByZXNldCBvZiBtYWNyb2Jsb2NrIHJlbGF0ZWQgcGFyYW1ldGVycy4gKi8KLQotICAgICAgICB2aWRlby0+bWJfeCA9IEN1cnJNYkFkZHIgJSB2aWRlby0+UGljV2lkdGhJbk1iczsKLSAgICAgICAgdmlkZW8tPm1iX3kgPSBDdXJyTWJBZGRyIC8gdmlkZW8tPlBpY1dpZHRoSW5NYnM7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBuZWlnaGJvcmluZyBtYWNyb2Jsb2NrcyAqLwotICAgICAgICBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkodmlkZW8sIEN1cnJNYkFkZHIpOwotCi0gICAgICAgIC8qIHJlYWRfbWFjcm9ibG9jayBhbmQgZGVjb2RlX29uZV9tYWNyb2Jsb2NrKCkgKi8KLSAgICAgICAgc3RhdHVzID0gRGVjb2RlTUIoZGVjdmlkKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotI2lmZGVmIE1CX0JBU0VEX0RFQkxPQ0sKLSAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBNQkluTG9vcERlYmxvY2sodmlkZW8pOyAvKiBNQi1iYXNlZCBkZWJsb2NraW5nICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAvKiB0aGlzIG1vZGUgY2Fubm90IGJlIHVzZWQgaWYgdGhlIG51bWJlciBvZiBzbGljZSBncm91cCBpcyBub3Qgb25lLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICB2aWRlby0+bnVtTUJzLS07Ci0KLSAgICAgICAgbW9yZURhdGFGbGFnID0gbW9yZV9yYnNwX2RhdGEoc3RyZWFtKTsKLQotCi0gICAgICAgIC8qIGdvIHRvIG5leHQgTUIgKi8KLSAgICAgICAgd2hpbGUgKCsrQ3Vyck1iQWRkciA8IHZpZGVvLT5QaWNTaXplSW5NYnMgJiYgdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwW0N1cnJNYkFkZHJdICE9IChpbnQpc2xpY2VfZ3JvdXBfaWQpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHdoaWxlICgobW9yZURhdGFGbGFnICYmIHZpZGVvLT5udW1NQnMgPiAwKSB8fCB2aWRlby0+bWJfc2tpcF9ydW4gPiAwKTsgLyogZXZlbiBpZiBubyBtb3JlIGRhdGEsIGJ1dCBsYXN0IGZldyBNQnMgYXJlIHNraXBwZWQgKi8KLQotICAgIGlmICh2aWRlby0+bnVtTUJzID09IDApCi0gICAgewotICAgICAgICB2aWRlby0+bmV3UGljID0gVFJVRTsKLSAgICAgICAgdmlkZW8tPm1iTnVtID0gMDsgIC8vIF9Db25jZWFsCi0gICAgICAgIHJldHVybiBBVkNERUNfUElDVFVSRV9SRUFEWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLS8qIHJlYWQgTUIgbW9kZSBhbmQgbW90aW9uIHZlY3RvcnMgKi8KLS8qIHBlcmZvcm0gSW50cmEvSW50ZXIgcHJlZGljdGlvbiBhbmQgcmVzaWR1ZSAqLwotLyogdXBkYXRlIHZpZGVvLT5tYl9za2lwX3J1biAqLwotQVZDRGVjX1N0YXR1cyBEZWNvZGVNQihBVkNEZWNPYmplY3QgKmRlY3ZpZCkKLXsKLSAgICBBVkNEZWNfU3RhdHVzIHN0YXR1czsKLSAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZGVjdmlkLT5jb21tb247Ci0gICAgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0gPSBkZWN2aWQtPmJpdHN0cmVhbTsKLSAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COwotICAgIHVpbnQgbWJfdHlwZTsKLSAgICBpbnQgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOwotICAgIGludCB0ZW1wOwotCi0gICAgY3Vyck1CLT5RUHkgPSB2aWRlby0+UVB5OwotICAgIGN1cnJNQi0+UVBjID0gdmlkZW8tPlFQYzsKLQotICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQotICAgIHsKLSAgICAgICAgaWYgKHZpZGVvLT5tYl9za2lwX3J1biA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCAodWludCAqKSYodmlkZW8tPm1iX3NraXBfcnVuKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPm1iX3NraXBfcnVuID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHRoaXMgd2lsbCBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBzbGljZSBlbmRzIHdpdGggYSBtYl9za2lwX3J1biA9PSAwIGFuZCBubyBmb2xsb3dpbmcgTUIgZGF0YSAgKi8KLSAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCAmbWJfdHlwZSk7Ci0gICAgICAgICAgICBpZiAobWJfdHlwZSA+IDMwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEludGVycHJldE1CTW9kZVAoY3Vyck1CLCBtYl90eXBlKTsKLSAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1biA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNCBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdwotICAgICAgICAgICAgbWJfZmllbGRfZGVjb2RpbmdfZmxhZyBpcyBkZXJpdmVkIGluIGNhc2Ugb2Ygc2tpcHBlZCBNQiAqLwotCi0gICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gRkFMU0U7Ci0KLSAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7Ci0gICAgICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKLSAgICAgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKLSAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzBdID0gY3Vyck1CLT5OdW1TdWJNYlBhcnRbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMl0gPSBjdXJyTUItPk51bVN1Yk1iUGFydFszXSA9IDE7IC8vCi0gICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMl0gPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzNdID0gY3Vyck1CLT5NYlBhcnRXaWR0aDsKLSAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzBdID0gY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMl0gPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFszXSA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0OwotCi0gICAgICAgICAgICBtZW1zZXQoY3Vyck1CLT5uel9jb2VmZiwgMCwgc2l6ZW9mKHVpbnQ4KSpOVU1fQkxLU19JTl9NQik7Ci0KLSAgICAgICAgICAgIGN1cnJNQi0+Q0JQID0gMDsKLSAgICAgICAgICAgIHZpZGVvLT5jYnA0eDQgPSAwOwotICAgICAgICAgICAgLyogZm9yIHNraXBwZWQgTUIsIGFsd2F5cyBsb29rIGF0IHRoZSBmaXJzdCBlbnRyeSBpbiBSZWZQaWNMaXN0ICovCi0gICAgICAgICAgICBjdXJyTUItPlJlZklkeFswXSA9IGN1cnJNQi0+UmVmSWR4WzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+UmVmSWR4WzJdID0gY3Vyck1CLT5SZWZJZHhbM10gPSB2aWRlby0+UmVmUGljTGlzdDBbMF0tPlJlZklkeDsKLSAgICAgICAgICAgIEludGVyTUJQcmVkaWN0aW9uKHZpZGVvKTsKLSAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1bi0tOwotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogVGhlbiBkZWNvZGUgbW9kZSBhbmQgTVYgKi8KLSAgICAgICAgdWVfdihzdHJlYW0sICZtYl90eXBlKTsKLSAgICAgICAgaWYgKG1iX3R5cGUgPiAyNSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgICAgICB9Ci0gICAgICAgIEludGVycHJldE1CTW9kZUkoY3Vyck1CLCBtYl90eXBlKTsKLSAgICB9Ci0KLQotICAgIGlmIChjdXJyTUItPm1iTW9kZSAhPSBBVkNfSV9QQ00pCi0gICAgewotCi0gICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDggfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4cmVmMCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gc3ViX21iX3ByZWQodmlkZW8sIGN1cnJNQiwgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1iX3ByZWQodmlkZW8sIGN1cnJNQiwgc3RyZWFtKSA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0RFQ19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlICE9IEFWQ19JMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlZF9ibG9ja19wYXR0ZXJuICovCi0gICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVDQlAoY3Vyck1CLCBzdHJlYW0pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNERUNfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJNQi0+Q0JQID4gMCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBzZV92KHN0cmVhbSwgJnRlbXApOwotICAgICAgICAgICAgaWYgKHRlbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCArPSAodmlkZW8tPlFQeSArIDUyKTsKLSAgICAgICAgICAgICAgICBjdXJyTUItPlFQeSA9IHZpZGVvLT5RUHkgPSB0ZW1wIC0gNTIgKiAodGVtcCAqIDc5ID4+IDEyKTsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5RUHkgPiA1MSB8fCBjdXJyTUItPlFQeSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlby0+UVB5ID0gQVZDX0NMSVAzKDAsIDUxLCB2aWRlby0+UVB5KTsKLS8vICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWRlby0+UVB5X2Rpdl82ID0gKHZpZGVvLT5RUHkgKiA0MykgPj4gODsKLSAgICAgICAgICAgICAgICB2aWRlby0+UVB5X21vZF82ID0gdmlkZW8tPlFQeSAtIDYgKiB2aWRlby0+UVB5X2Rpdl82OwotICAgICAgICAgICAgICAgIGN1cnJNQi0+UVBjID0gdmlkZW8tPlFQYyA9IG1hcFFQaTJRUGNbQVZDX0NMSVAzKDAsIDUxLCB2aWRlby0+UVB5ICsgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpXTsKLSAgICAgICAgICAgICAgICB2aWRlby0+UVBjX2Rpdl82ID0gKHZpZGVvLT5RUGMgKiA0MykgPj4gODsKLSAgICAgICAgICAgICAgICB2aWRlby0+UVBjX21vZF82ID0gdmlkZW8tPlFQYyAtIDYgKiB2aWRlby0+UVBjX2Rpdl82OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIGRlY29kZSByZXNpZHVlIGFuZCBpbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgICAgICBzdGF0dXMgPSByZXNpZHVhbChkZWN2aWQsIGN1cnJNQik7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQVZDREVDX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+Yml0Y250ICYgNykKLSAgICAgICAgewotICAgICAgICAgICAgQml0c3RyZWFtQnl0ZUFsaWduKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZGVjb2RlIHBjbV9ieXRlW2ldICovCi0gICAgICAgIERlY29kZUludHJhUENNKHZpZGVvLCBzdHJlYW0pOwotCi0gICAgICAgIGN1cnJNQi0+UVB5ID0gMDsgIC8qIG5lY2Vzc2FyeSBmb3IgZGVibG9ja2luZyAqLyAvLyBfT1BUSU1JWkUKLSAgICAgICAgY3Vyck1CLT5RUGMgPSBtYXBRUGkyUVBjW0FWQ19DTElQMygwLCA1MSwgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpXTsKLQotICAgICAgICAvKiBkZWZhdWx0IHZhbHVlcywgZG9uJ3Qga25vdyBpZiByZWFsbHkgbmVlZGVkICovCi0gICAgICAgIGN1cnJNQi0+Q0JQID0gMHgzRjsKLSAgICAgICAgdmlkZW8tPmNicDR4NCA9IDB4RkZGRjsKLSAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IFRSVUU7Ci0gICAgICAgIG1lbXNldChjdXJyTUItPm56X2NvZWZmLCAxNiwgc2l6ZW9mKHVpbnQ4KSpOVU1fQkxLU19JTl9NQik7Ci0gICAgICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLSAgICB9Ci0KLQotICAgIC8qIGRvIEludHJhL0ludGVyIHByZWRpY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlIHJlc2lkdWUgY29tcGVuc2F0aW9uICovCi0gICAgLyogVGhpcyBwYXJ0IHNob3VsZCBiZSBjb21tb24gYmV0d2VlbiB0aGUgc2tpcCBhbmQgbm8tc2tpcCAqLwotICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQgfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKLSAgICB7Ci0gICAgICAgIEludHJhTUJQcmVkaWN0aW9uKHZpZGVvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgSW50ZXJNQlByZWRpY3Rpb24odmlkZW8pOwotICAgIH0KLQotCi0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLS8qIHNlZSBzdWJjbGF1c2UgNy4zLjUuMSAqLwotQVZDRGVjX1N0YXR1cyBtYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgaW50IG1iUGFydElkeDsKLSAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7Ci0gICAgdWludCBtYXhfcmVmX2lkeDsKLSAgICBjb25zdCBpbnQgKnRlbXBfMDsKLSAgICBpbnQxNiAqdGVtcF8xOwotICAgIHVpbnQgY29kZTsKLQotICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQgfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKLSAgICB7Ci0KLSAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKLQotICAgICAgICBpZiAoIXZpZGVvLT5jdXJyUGljUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYkF2YWlsQTsKLSAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYkF2YWlsQjsKLSAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYkF2YWlsQzsKLSAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYkF2YWlsRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJfaW50cmE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxCKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iX2ludHJhIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQ10ubWJfaW50cmE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckRdLm1iX2ludHJhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBwZXJmb3JtIHByZWRpY3Rpb24gdG8gZ2V0IHRoZSBhY3R1YWwgaW50cmEgNHg0IHByZWQgbW9kZSAqLwotICAgICAgICAgICAgRGVjb2RlSW50cmE0eDRNb2RlKHZpZGVvLCBjdXJyTUIsIHN0cmVhbSk7Ci0gICAgICAgICAgICAvKiBvdXRwdXQgd2lsbCBiZSBpbiBjdXJyTUItPmk0TW9kZVs0XVs0XSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgdWVfdihzdHJlYW0sICZjb2RlKTsKLQotICAgICAgICBpZiAoY29kZSA+IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCi0gICAgICAgIH0KLSAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gKEFWQ0ludHJhQ2hyb21hUHJlZE1vZGUpY29kZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgICBtZW1zZXQoY3Vyck1CLT5yZWZfaWR4X0wwLCAwLCBzaXplb2YoaW50MTYpKjQpOwotCi0gICAgICAgIC8qIHNlZSBzdWJjbGF1c2UgNy40LjUuMSBmb3IgdGhlIHJhbmdlIG9mIHJlZl9pZHhfbFggKi8KLS8vICAgICAgbWF4X3JlZl9pZHggPSBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKLSAgICAgICAgbWF4X3JlZl9pZHggPSB2aWRlby0+cmVmTGlzdDBTaXplIC0gMTsKLQotICAgICAgICAvKiBkZWNvZGUgcmVmIGluZGV4IGZvciBMMCAqLwotICAgICAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZV92KHN0cmVhbSwgJmNvZGUsIG1heF9yZWZfaWR4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA+ICh1aW50KW1heF9yZWZfaWR4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0RFQ19GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XSA9IGNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwb3B1bGF0ZSByZWZfaWR4X0wwICovCi0gICAgICAgIHRlbXBfMCA9ICZtYlBhcnQycmFzdGVyW2N1cnJNQi0+bWJNb2RlLUFWQ19QMTZdWzBdOwotICAgICAgICB0ZW1wXzEgPSAmY3Vyck1CLT5yZWZfaWR4X0wwWzNdOwotCi0gICAgICAgICp0ZW1wXzEtLSA9IGN1cnJNQi0+cmVmX2lkeF9MMFsqdGVtcF8wKytdOwotICAgICAgICAqdGVtcF8xLS0gPSBjdXJyTUItPnJlZl9pZHhfTDBbKnRlbXBfMCsrXTsKLSAgICAgICAgKnRlbXBfMS0tID0gY3Vyck1CLT5yZWZfaWR4X0wwWyp0ZW1wXzArK107Ci0gICAgICAgICp0ZW1wXzEtLSA9IGN1cnJNQi0+cmVmX2lkeF9MMFsqdGVtcF8wKytdOwotCi0gICAgICAgIC8qIEdsb2JhbCByZWZlcmVuY2UgaW5kZXgsIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCBpbiBkZWJsb2NrICovCi0gICAgICAgIGN1cnJNQi0+UmVmSWR4WzBdID0gdmlkZW8tPlJlZlBpY0xpc3QwW2N1cnJNQi0+cmVmX2lkeF9MMFswXV0tPlJlZklkeDsKLSAgICAgICAgY3Vyck1CLT5SZWZJZHhbMV0gPSB2aWRlby0+UmVmUGljTGlzdDBbY3Vyck1CLT5yZWZfaWR4X0wwWzFdXS0+UmVmSWR4OwotICAgICAgICBjdXJyTUItPlJlZklkeFsyXSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtjdXJyTUItPnJlZl9pZHhfTDBbMl1dLT5SZWZJZHg7Ci0gICAgICAgIGN1cnJNQi0+UmVmSWR4WzNdID0gdmlkZW8tPlJlZlBpY0xpc3QwW2N1cnJNQi0+cmVmX2lkeF9MMFszXV0tPlJlZklkeDsKLQotICAgICAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCi0gICAgICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7Ci0gICAgICAgIC8qIGRlY29kZSBtdmRfbDAgKi8KLSAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlX3Yoc3RyZWFtLCAmKHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVswXVswXSkpOwotICAgICAgICAgICAgc2VfdihzdHJlYW0sICYodmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdWzBdWzFdKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLS8qIHNlZSBzdWJjbGF1c2UgNy4zLjUuMiAqLwotQVZDRGVjX1N0YXR1cyBzdWJfbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKQotewotICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeDsKLSAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7Ci0gICAgdWludCBtYXhfcmVmX2lkeDsKLSAgICB1aW50IHN1Yl9tYl90eXBlWzRdOwotICAgIHVpbnQgY29kZTsKLQotICAgIG1lbXNldChjdXJyTUItPnJlZl9pZHhfTDAsIDAsIHNpemVvZihpbnQxNikqNCk7Ci0KLSAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQotICAgIHsKLSAgICAgICAgdWVfdihzdHJlYW0sICYoc3ViX21iX3R5cGVbbWJQYXJ0SWR4XSkpOwotICAgICAgICBpZiAoc3ViX21iX3R5cGVbbWJQYXJ0SWR4XSA+IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgfQotCi0gICAgfQotICAgIC8qIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHZhbHVlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgdmFsaWQgICovCi0gICAgLyogYXNzaWduIHZhbHVlcyB0byBjdXJyTUItPnN1Yl9tYl90eXBlW10sIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbXVt4XSAqLwotCi0gICAgSW50ZXJwcmV0U3ViTUJNb2RlUChjdXJyTUIsIHN1Yl9tYl90eXBlKTsKLQotCi0gICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLwotLy8gICAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOwotICAgIG1heF9yZWZfaWR4ID0gdmlkZW8tPnJlZkxpc3QwU2l6ZSAtIDE7Ci0KLSAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAwICYmIGN1cnJNQi0+bWJNb2RlICE9IEFWQ19QOHJlZjApCi0gICAgewotICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZV92KHN0cmVhbSwgKHVpbnQqKSZjb2RlLCBtYXhfcmVmX2lkeCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA+IG1heF9yZWZfaWR4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFttYlBhcnRJZHhdID0gY29kZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBzZWUgc3ViY2xhdXNlIDcuNC41LjEgZm9yIHRoZSByYW5nZSBvZiByZWZfaWR4X2xYICovCi0KLSAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOwotICAgIC8qICBpZih2aWRlby0+TWJhZmZGcmFtZUZsYWcgJiYgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKQotICAgICAgICAgICAgbWF4X3JlZl9pZHggPSAyKnNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICsgMTsqLwotICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCi0gICAgewotICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZV92KHN0cmVhbSwgJih2aWRlby0+bXZkX2wwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVswXSkpOwotICAgICAgICAgICAgc2VfdihzdHJlYW0sICYodmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF1bMV0pKTsKLSAgICAgICAgfQotICAgICAgICAvKiB1c2VkIGluIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgY3Vyck1CLT5SZWZJZHhbbWJQYXJ0SWR4XSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XV0tPlJlZklkeDsKLSAgICB9Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi12b2lkIEludGVycHJldE1CTW9kZUkoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50IG1iX3R5cGUpCi17Ci0gICAgbWJsb2NrLT5OdW1NYlBhcnQgPSAxOwotCi0gICAgbWJsb2NrLT5tYl9pbnRyYSA9IFRSVUU7Ci0KLSAgICBpZiAobWJfdHlwZSA9PSAwKSAvKiBJXzR4NCAqLwotICAgIHsKLSAgICAgICAgbWJsb2NrLT5tYk1vZGUgPSBBVkNfSTQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1iX3R5cGUgPCAyNSkgLyogSV9QQ00gKi8KLSAgICB7Ci0gICAgICAgIG1ibG9jay0+bWJNb2RlID0gQVZDX0kxNjsKLSAgICAgICAgbWJsb2NrLT5pMTZNb2RlID0gKEFWQ0ludHJhMTZ4MTZQcmVkTW9kZSkoKG1iX3R5cGUgLSAxKSAmIDB4Myk7Ci0gICAgICAgIGlmIChtYl90eXBlID4gMTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ibG9jay0+Q0JQID0gKCgobWJfdHlwZSAtIDEzKSA+PiAyKSA8PCA0KSArIDB4MEY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtYmxvY2stPkNCUCA9ICgobWJfdHlwZSAtIDEpID4+IDIpIDw8IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWJsb2NrLT5tYk1vZGUgPSBBVkNfSV9QQ007Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBJbnRlcnByZXRNQk1vZGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCBtYl90eXBlKQotewotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMlBhcnRXaWR0aFs1XSA9IHsxNiwgMTYsIDgsIDgsIDh9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMlBhcnRIZWlnaHRbNV0gPSB7MTYsIDgsIDE2LCA4LCA4fTsKLSAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJOdW1QYXJ0WzVdID0gezEsIDIsIDIsIDQsIDR9OwotICAgIGNvbnN0IHN0YXRpYyBBVkNNQk1vZGUgbWFwMm1iTW9kZVs1XSA9IHtBVkNfUDE2LCBBVkNfUDE2eDgsIEFWQ19QOHgxNiwgQVZDX1A4LCBBVkNfUDhyZWYwfTsKLQotICAgIG1ibG9jay0+bWJfaW50cmEgPSBGQUxTRTsKLSAgICBpZiAobWJfdHlwZSA8IDUpCi0gICAgewotICAgICAgICBtYmxvY2stPm1iTW9kZSA9IG1hcDJtYk1vZGVbbWJfdHlwZV07Ci0gICAgICAgIG1ibG9jay0+TWJQYXJ0V2lkdGggPSBtYXAyUGFydFdpZHRoW21iX3R5cGVdOwotICAgICAgICBtYmxvY2stPk1iUGFydEhlaWdodCA9IG1hcDJQYXJ0SGVpZ2h0W21iX3R5cGVdOwotICAgICAgICBtYmxvY2stPk51bU1iUGFydCA9IG1hcDJOdW1QYXJ0W21iX3R5cGVdOwotICAgICAgICBtYmxvY2stPk51bVN1Yk1iUGFydFswXSA9IG1ibG9jay0+TnVtU3ViTWJQYXJ0WzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5OdW1TdWJNYlBhcnRbMl0gPSBtYmxvY2stPk51bVN1Yk1iUGFydFszXSA9IDE7Ci0gICAgICAgIG1ibG9jay0+U3ViTWJQYXJ0V2lkdGhbMF0gPSBtYmxvY2stPlN1Yk1iUGFydFdpZHRoWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPlN1Yk1iUGFydFdpZHRoWzJdID0gbWJsb2NrLT5TdWJNYlBhcnRXaWR0aFszXSA9IG1ibG9jay0+TWJQYXJ0V2lkdGg7Ci0gICAgICAgIG1ibG9jay0+U3ViTWJQYXJ0SGVpZ2h0WzBdID0gbWJsb2NrLT5TdWJNYlBhcnRIZWlnaHRbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPlN1Yk1iUGFydEhlaWdodFsyXSA9IG1ibG9jay0+U3ViTWJQYXJ0SGVpZ2h0WzNdID0gbWJsb2NrLT5NYlBhcnRIZWlnaHQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEludGVycHJldE1CTW9kZUkobWJsb2NrLCBtYl90eXBlIC0gNSk7Ci0gICAgICAgIC8qIHNldCBNViBhbmQgUmVmX0lkeCBjb2RlcyBvZiBJbnRyYSBibG9ja3MgaW4gUC1zbGljZXMgICovCi0gICAgICAgIG1lbXNldChtYmxvY2stPm12TDAsIDAsIHNpemVvZihpbnQzMikqMTYpOwotICAgICAgICBtYmxvY2stPnJlZl9pZHhfTDBbMF0gPSBtYmxvY2stPnJlZl9pZHhfTDBbMV0gPSBtYmxvY2stPnJlZl9pZHhfTDBbMl0gPSBtYmxvY2stPnJlZl9pZHhfTDBbM10gPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBJbnRlcnByZXRNQk1vZGVCKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCBtYl90eXBlKQotewotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMlBhcnRXaWR0aFsyM10gPSB7OCwgMTYsIDE2LCAxNiwgMTYsIDgsIDE2LCA4LCAxNiwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCA4LCAxNiwgOCwgMTYsIDgsIDE2LCA4LCAxNiwgOCwgMTYsIDgsIDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJQYXJ0SGVpZ2h0WzIzXSA9IHs4LCAxNiwgMTYsIDE2LCA4LCAxNiwgOCwgMTYsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDgsIDE2LCA4LCAxNiwgOCwgMTYsIDgsIDE2LCA4LCAxNiwgOCwgMTYsIDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgLyogc2VlIGVudW0gQVZDTUJUeXBlIGRlY2xhcmF0aW9uICovCi0gICAgY29uc3Qgc3RhdGljIEFWQ01CTW9kZSBtYXAybWJNb2RlWzIzXSA9IHtBVkNfQkRpcmVjdDE2LCBBVkNfUDE2LCBBVkNfUDE2LCBBVkNfUDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNfUDE2eDgsIEFWQ19QOHgxNiwgQVZDX1AxNng4LCBBVkNfUDh4MTYsIEFWQ19QMTZ4OCwgQVZDX1A4eDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNfUDE2eDgsIEFWQ19QOHgxNiwgQVZDX1AxNng4LCBBVkNfUDh4MTYsIEFWQ19QMTZ4OCwgQVZDX1A4eDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNfUDE2eDgsIEFWQ19QOHgxNiwgQVZDX1AxNng4LCBBVkNfUDh4MTYsIEFWQ19QMTZ4OCwgQVZDX1A4eDE2LCBBVkNfUDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJQcmVkTW9kZTFbMjNdID0gezMsIDAsIDEsIDIsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIC0xfTsKLSAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJQcmVkTW9kZTJbMjNdID0geyAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMiwgMiwgMiwgMiwgMCwgMCwgMSwgMSwgMiwgMiwgLTF9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMk51bVBhcnRbMjNdID0geyAtMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgNH07Ci0KLSAgICBtYmxvY2stPm1iX2ludHJhID0gRkFMU0U7Ci0KLSAgICBpZiAobWJfdHlwZSA8IDIzKQotICAgIHsKLSAgICAgICAgbWJsb2NrLT5tYk1vZGUgPSBtYXAybWJNb2RlW21iX3R5cGVdOwotICAgICAgICBtYmxvY2stPk51bU1iUGFydCA9IG1hcDJOdW1QYXJ0W21iX3R5cGVdOwotICAgICAgICBtYmxvY2stPk1CUGFydFByZWRNb2RlWzBdWzBdID0gKEFWQ1ByZWRNb2RlKW1hcDJQcmVkTW9kZTFbbWJfdHlwZV07Ci0gICAgICAgIGlmIChtYmxvY2stPk51bU1iUGFydCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbMV1bMF0gPSAoQVZDUHJlZE1vZGUpbWFwMlByZWRNb2RlMlttYl90eXBlXTsKLSAgICAgICAgfQotICAgICAgICBtYmxvY2stPk1iUGFydFdpZHRoID0gbWFwMlBhcnRXaWR0aFttYl90eXBlXTsKLSAgICAgICAgbWJsb2NrLT5NYlBhcnRIZWlnaHQgPSBtYXAyUGFydEhlaWdodFttYl90eXBlXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgSW50ZXJwcmV0TUJNb2RlSShtYmxvY2ssIG1iX3R5cGUgLSAyMyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBJbnRlcnByZXRNQk1vZGVTSShBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgbWJfdHlwZSkKLXsKLSAgICBtYmxvY2stPm1iX2ludHJhID0gVFJVRTsKLQotICAgIGlmIChtYl90eXBlID09IDApCi0gICAgewotICAgICAgICBtYmxvY2stPm1iTW9kZSA9IEFWQ19TSTQ7Ci0gICAgICAgIC8qIG90aGVyIHZhbHVlcyBhcmUgTi9BICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEludGVycHJldE1CTW9kZUkobWJsb2NrLCBtYl90eXBlIC0gMSk7Ci0gICAgfQotICAgIHJldHVybiA7Ci19Ci0KLS8qIGlucHV0IGlzIG1ibG9jay0+c3ViX21iX3R5cGVbXSAqLwotdm9pZCBJbnRlcnByZXRTdWJNQk1vZGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpCi17Ci0gICAgaW50IGksICBzdWJfdHlwZTsKLSAgICAvKiBzZWUgZW51bSBBVkNNQlR5cGUgZGVjbGFyYXRpb24gKi8KLS8vICBjb25zdCBzdGF0aWMgQVZDU3ViTUJNb2RlIG1hcDJzdWJNYk1vZGVbNF0gPSB7QVZDXzh4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzR4NH07Ci0gICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydFdpZHRoWzRdID0gezgsIDgsIDQsIDR9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbNF0gPSB7OCwgNCwgOCwgNH07Ci0gICAgY29uc3Qgc3RhdGljIGludCBtYXAybnVtU3ViUGFydFs0XSA9IHsxLCAyLCAyLCA0fTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0IDsgaSsrKQotICAgIHsKLSAgICAgICAgc3ViX3R5cGUgPSAoaW50KSBzdWJfbWJfdHlwZVtpXTsKLSAgICAgICAgLy8gIG1ibG9jay0+c3ViTWJNb2RlW2ldID0gbWFwMnN1Yk1iTW9kZVtzdWJfdHlwZV07Ci0gICAgICAgIG1ibG9jay0+TnVtU3ViTWJQYXJ0W2ldID0gbWFwMm51bVN1YlBhcnRbc3ViX3R5cGVdOwotICAgICAgICBtYmxvY2stPlN1Yk1iUGFydFdpZHRoW2ldID0gbWFwMnN1YlBhcnRXaWR0aFtzdWJfdHlwZV07Ci0gICAgICAgIG1ibG9jay0+U3ViTWJQYXJ0SGVpZ2h0W2ldID0gbWFwMnN1YlBhcnRIZWlnaHRbc3ViX3R5cGVdOwotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgSW50ZXJwcmV0U3ViTUJNb2RlQihBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKQotewotICAgIGludCBpLCBqLCBzdWJfdHlwZTsKLSAgICAvKiBzZWUgZW51bSBBVkNNQlR5cGUgZGVjbGFyYXRpb24gKi8KLSAgICBjb25zdCBzdGF0aWMgQVZDU3ViTUJNb2RlIG1hcDJzdWJNYk1vZGVbMTNdID0ge0FWQ19CRGlyZWN0OCwgQVZDXzh4OCwgQVZDXzh4OCwKLSAgICAgICAgICAgIEFWQ184eDgsIEFWQ184eDQsIEFWQ180eDgsIEFWQ184eDQsIEFWQ180eDgsIEFWQ184eDQsIEFWQ180eDgsIEFWQ180eDQsIEFWQ180eDQsIEFWQ180eDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJzdWJQYXJ0V2lkdGhbMTNdID0gezQsIDgsIDgsIDgsIDgsIDQsIDgsIDQsIDgsIDQsIDQsIDQsIDR9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbMTNdID0gezQsIDgsIDgsIDgsIDQsIDgsIDQsIDgsIDQsIDgsIDQsIDQsIDR9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMm51bVN1YlBhcnRbMTNdID0gezEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDQsIDQsIDR9OwotICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnByZWRNb2RlWzEzXSA9IHszLCAwLCAxLCAyLCAwLCAwLCAxLCAxLCAyLCAyLCAwLCAxLCAyfTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0IDsgaSsrKQotICAgIHsKLSAgICAgICAgc3ViX3R5cGUgPSAoaW50KSBzdWJfbWJfdHlwZVtpXTsKLSAgICAgICAgbWJsb2NrLT5zdWJNYk1vZGVbaV0gPSBtYXAyc3ViTWJNb2RlW3N1Yl90eXBlXTsKLSAgICAgICAgbWJsb2NrLT5OdW1TdWJNYlBhcnRbaV0gPSBtYXAybnVtU3ViUGFydFtzdWJfdHlwZV07Ci0gICAgICAgIG1ibG9jay0+U3ViTWJQYXJ0V2lkdGhbaV0gPSBtYXAyc3ViUGFydFdpZHRoW3N1Yl90eXBlXTsKLSAgICAgICAgbWJsb2NrLT5TdWJNYlBhcnRIZWlnaHRbaV0gPSBtYXAyc3ViUGFydEhlaWdodFtzdWJfdHlwZV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbaV1bal0gPSAoQVZDUHJlZE1vZGUpbWFwMnByZWRNb2RlW3N1Yl90eXBlXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLS8qIHNlZSBzdWJjbGF1c2UgOC4zLjEgKi8KLUFWQ0RlY19TdGF0dXMgRGVjb2RlSW50cmE0eDRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRGVjQml0c3RyZWFtICpzdHJlYW0pCi17Ci0gICAgaW50IGludHJhNHg0UHJlZE1vZGVBID0gMCwgaW50cmE0eDRQcmVkTW9kZUIgPSAwLCBwcmVkSW50cmE0eDRQcmVkTW9kZSA9IDA7Ci0gICAgaW50IGNvbXBvbmVudCwgU3ViQmxvY2tfaW5keCwgYmxvY2tfeCwgYmxvY2tfeTsKLSAgICBpbnQgZGNPbmx5UHJlZGljdGlvbkZsYWc7Ci0gICAgdWludCAgICBwcmV2X2ludHJhNHg0X3ByZWRfbW9kZV9mbGFnWzE2XTsKLSAgICBpbnQgICAgIHJlbV9pbnRyYTR4NF9wcmVkX21vZGVbMTZdOwotICAgIGludCBiaW5keCA9IDA7Ci0KLSAgICBmb3IgKGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKSAvKiBwYXJ0aXRpb24gaW5kZXggKi8KLSAgICB7Ci0gICAgICAgIGJsb2NrX3ggPSAoKGNvbXBvbmVudCAmIDEpIDw8IDEpOwotICAgICAgICBibG9ja195ID0gKChjb21wb25lbnQgPj4gMSkgPDwgMSk7Ci0KLSAgICAgICAgZm9yIChTdWJCbG9ja19pbmR4ID0gMDsgU3ViQmxvY2tfaW5keCA8IDQ7IFN1YkJsb2NrX2luZHgrKykgLyogc3ViLXBhcnRpdGlvbiBpbmRleCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChzdHJlYW0sICYocHJldl9pbnRyYTR4NF9wcmVkX21vZGVfZmxhZ1tiaW5keF0pKTsKLQotICAgICAgICAgICAgaWYgKCFwcmV2X2ludHJhNHg0X3ByZWRfbW9kZV9mbGFnW2JpbmR4XSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDMsICh1aW50KikmKHJlbV9pbnRyYTR4NF9wcmVkX21vZGVbYmluZHhdKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMDsKLSAgICAgICAgICAgIGlmIChibG9ja194ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IGN1cnJNQi0+aTRNb2RlWyhibG9ja195IDw8IDIpICsgYmxvY2tfeCAtIDEgXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iTW9kZSA9PSBBVkNfSTQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0uaTRNb2RlWyhibG9ja195IDw8IDIpICsgM107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IEFWQ19JNF9EQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmxvY2tfeSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBjdXJyTUItPmk0TW9kZVsoKGJsb2NrX3ktMSkgPDwgMikgKyBibG9ja194XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iTW9kZSA9PSBBVkNfSTQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0uaTRNb2RlWygzIDw8IDIpICsgYmxvY2tfeF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGNPbmx5UHJlZGljdGlvbkZsYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBpbnRyYTR4NFByZWRNb2RlQiA9IEFWQ19JNF9EQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJlZEludHJhNHg0UHJlZE1vZGUgPSBBVkNfTUlOKGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQik7Ci0gICAgICAgICAgICBpZiAocHJldl9pbnRyYTR4NF9wcmVkX21vZGVfZmxhZ1tiaW5keF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gKEFWQ0ludHJhNHg0UHJlZE1vZGUpcHJlZEludHJhNHg0UHJlZE1vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbV9pbnRyYTR4NF9wcmVkX21vZGVbYmluZHhdIDwgcHJlZEludHJhNHg0UHJlZE1vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSAoQVZDSW50cmE0eDRQcmVkTW9kZSlyZW1faW50cmE0eDRfcHJlZF9tb2RlW2JpbmR4XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gKEFWQ0ludHJhNHg0UHJlZE1vZGUpKHJlbV9pbnRyYTR4NF9wcmVkX21vZGVbYmluZHhdICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZHgrKzsKLSAgICAgICAgICAgIGJsb2NrX3kgKz0gKFN1YkJsb2NrX2luZHggJiAxKSA7Ci0gICAgICAgICAgICBibG9ja194ICs9ICgxIC0gMiAqIChTdWJCbG9ja19pbmR4ICYgMSkpIDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci1BVkNEZWNfU3RhdHVzIENvbmNlYWxTbGljZShBVkNEZWNPYmplY3QgKmRlY3ZpZCwgaW50IG1ibnVtX3N0YXJ0LCBpbnQgbWJudW1fZW5kKQotewotICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBkZWN2aWQtPmNvbW1vbjsKLSAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgOwotCi0gICAgaW50IEN1cnJNYkFkZHI7Ci0KLSAgICBpZiAodmlkZW8tPlJlZlBpY0xpc3QwWzBdID09IE5VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gQVZDREVDX0ZBSUw7Ci0gICAgfQotCi0gICAgZm9yIChDdXJyTWJBZGRyID0gbWJudW1fc3RhcnQ7IEN1cnJNYkFkZHIgPCBtYm51bV9lbmQ7IEN1cnJNYkFkZHIrKykKLSAgICB7Ci0gICAgICAgIGN1cnJNQiA9IHZpZGVvLT5jdXJyTUIgPSAmKHZpZGVvLT5tYmxvY2tbQ3Vyck1iQWRkcl0pOwotICAgICAgICB2aWRlby0+bWJOdW0gPSBDdXJyTWJBZGRyOwotICAgICAgICBjdXJyTUItPnNsaWNlX2lkID0gdmlkZW8tPnNsaWNlX2lkKys7ICAvLyAgc2xpY2UKLQotICAgICAgICAvKiB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2hlY2sgaWYgd2UgZG9uJ3Qgc3VwcG9ydCBNYmFmZi4gKi8KLSAgICAgICAgLyogd2UgY2FuIHdyYXAgYmVsb3cgaW50byBhbiBpbml0TUIoKSBmdW5jdGlvbiB3aGljaCB3aWxsIGFsc28KLSAgICAgICAgZG8gbmVjZXNzYXJ5IHJlc2V0IG9mIG1hY3JvYmxvY2sgcmVsYXRlZCBwYXJhbWV0ZXJzLiAqLwotCi0gICAgICAgIHZpZGVvLT5tYl94ID0gQ3Vyck1iQWRkciAlIHZpZGVvLT5QaWNXaWR0aEluTWJzOwotICAgICAgICB2aWRlby0+bWJfeSA9IEN1cnJNYkFkZHIgLyB2aWRlby0+UGljV2lkdGhJbk1iczsKLQotICAgICAgICAvKiBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIG5laWdoYm9yaW5nIG1hY3JvYmxvY2tzICovCi0gICAgICAgIEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSh2aWRlbywgQ3Vyck1iQWRkcik7Ci0KLSAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IEZBTFNFOwotCi0gICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7Ci0gICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSBjdXJyTUItPk1iUGFydEhlaWdodCA9IDE2OwotCi0gICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKLSAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSBjdXJyTUItPk51bVN1Yk1iUGFydFsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzJdID0gY3Vyck1CLT5OdW1TdWJNYlBhcnRbM10gPSAxOwotICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsyXSA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbM10gPSBjdXJyTUItPk1iUGFydFdpZHRoOwotICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFswXSA9IGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMl0gPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFszXSA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0OwotICAgICAgICBjdXJyTUItPlFQeSA9IDI2OwotICAgICAgICBjdXJyTUItPlFQYyA9IDI2OwotICAgICAgICBtZW1zZXQoY3Vyck1CLT5uel9jb2VmZiwgMCwgc2l6ZW9mKHVpbnQ4KSpOVU1fQkxLU19JTl9NQik7Ci0KLSAgICAgICAgY3Vyck1CLT5DQlAgPSAwOwotICAgICAgICB2aWRlby0+Y2JwNHg0ID0gMDsKLSAgICAgICAgLyogZm9yIHNraXBwZWQgTUIsIGFsd2F5cyBsb29rIGF0IHRoZSBmaXJzdCBlbnRyeSBpbiBSZWZQaWNMaXN0ICovCi0gICAgICAgIGN1cnJNQi0+UmVmSWR4WzBdID0gY3Vyck1CLT5SZWZJZHhbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFsyXSA9IGN1cnJNQi0+UmVmSWR4WzNdID0gdmlkZW8tPlJlZlBpY0xpc3QwWzBdLT5SZWZJZHg7Ci0gICAgICAgIEludGVyTUJQcmVkaWN0aW9uKHZpZGVvKTsKLQotICAgICAgICB2aWRlby0+bnVtTUJzLS07Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL3NyYy92bGMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3ZsYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzEyNDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9kZWMvc3JjL3ZsYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJhdmNkZWNfbGliLmgiCi0jaW5jbHVkZSAiYXZjZGVjX2JpdHN0cmVhbS5oIgotCi0vLyNkZWZpbmUgUFZfQVJNX1Y1Ci0jaWZkZWYgUFZfQVJNX1Y1Ci0jZGVmaW5lIFBWX0NMWihBLEIpIF9fYXNte0NMWiAoQSksKEIpfSAgXAotICAgIEEgLT0gMTY7Ci0jZWxzZQotI2RlZmluZSBQVl9DTFooQSxCKSB3aGlsZSAoKChCKSAmIDB4ODAwMCkgPT0gMCkgeyhCKSA8PD0xOyBBKys7fQotI2VuZGlmCi0KLQotI2RlZmluZSBQVl9OT19DTFoKLQotI2lmbmRlZiBQVl9OT19DTFoKLXR5cGVkZWYgc3RydWN0IHRhZ1ZMQ051bUNvZWZmVHJhaWwKLXsKLSAgICBpbnQgdHJhaWxpbmc7Ci0gICAgaW50IHRvdGFsX2NvZWZmOwotICAgIGludCBsZW5ndGg7Ci19IFZMQ051bUNvZWZmVHJhaWw7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ1NoaWZ0T2Zmc2V0Ci17Ci0gICAgaW50IHNoaWZ0OwotICAgIGludCBvZmZzZXQ7Ci19IFNoaWZ0T2Zmc2V0OwotCi1jb25zdCBWTENOdW1Db2VmZlRyYWlsIE51bUNvZWZmVHJhaWxPbmVzWzNdWzY3XSA9Ci17Ci0gICAge3swLCAwLCAxfSwgezEsIDEsIDJ9LCB7MiwgMiwgM30sIHsxLCAyLCA2fSwgezAsIDEsIDZ9LCB7MywgMywgNX0sIHszLCAzLCA1fSwgezMsIDUsIDd9LAotICAgICAgICB7MiwgMywgN30sIHszLCA0LCA2fSwgezMsIDQsIDZ9LCB7MywgNiwgOH0sIHsyLCA0LCA4fSwgezEsIDMsIDh9LCB7MCwgMiwgOH0sIHszLCA3LCA5fSwKLSAgICAgICAgezIsIDUsIDl9LCB7MSwgNCwgOX0sIHswLCAzLCA5fSwgezMsIDgsIDEwfSwgezIsIDYsIDEwfSwgezEsIDUsIDEwfSwgezAsIDQsIDEwfSwgezMsIDksIDExfSwKLSAgICAgICAgezIsIDcsIDExfSwgezEsIDYsIDExfSwgezAsIDUsIDExfSwgezAsIDgsIDEzfSwgezIsIDksIDEzfSwgezEsIDgsIDEzfSwgezAsIDcsIDEzfSwgezMsIDEwLCAxM30sCi0gICAgICAgIHsyLCA4LCAxM30sIHsxLCA3LCAxM30sIHswLCA2LCAxM30sIHszLCAxMiwgMTR9LCB7MiwgMTEsIDE0fSwgezEsIDEwLCAxNH0sIHswLCAxMCwgMTR9LCB7MywgMTEsIDE0fSwKLSAgICAgICAgezIsIDEwLCAxNH0sIHsxLCA5LCAxNH0sIHswLCA5LCAxNH0sIHszLCAxNCwgMTV9LCB7MiwgMTMsIDE1fSwgezEsIDEyLCAxNX0sIHswLCAxMiwgMTV9LCB7MywgMTMsIDE1fSwKLSAgICAgICAgezIsIDEyLCAxNX0sIHsxLCAxMSwgMTV9LCB7MCwgMTEsIDE1fSwgezMsIDE2LCAxNn0sIHsyLCAxNSwgMTZ9LCB7MSwgMTUsIDE2fSwgezAsIDE0LCAxNn0sIHszLCAxNSwgMTZ9LAotICAgICAgICB7MiwgMTQsIDE2fSwgezEsIDE0LCAxNn0sIHswLCAxMywgMTZ9LCB7MCwgMTYsIDE2fSwgezIsIDE2LCAxNn0sIHsxLCAxNiwgMTZ9LCB7MCwgMTUsIDE2fSwgezEsIDEzLCAxNX0sCi0gICAgICAgIHsgLTEsIC0xLCAtMX0sIHsgLTEsIC0xLCAtMX0sIHsgLTEsIC0xLCAtMX19LAotCi0gICAge3sxLCAxLCAyfSwgezAsIDAsIDJ9LCB7MywgNCwgNH0sIHszLCAzLCA0fSwgezIsIDIsIDN9LCB7MiwgMiwgM30sIHszLCA2LCA2fSwgezIsIDMsIDZ9LAotICAgICAgICB7MSwgMywgNn0sIHswLCAxLCA2fSwgezMsIDUsIDV9LCB7MywgNSwgNX0sIHsxLCAyLCA1fSwgezEsIDIsIDV9LCB7MywgNywgNn0sIHsyLCA0LCA2fSwKLSAgICAgICAgezEsIDQsIDZ9LCB7MCwgMiwgNn0sIHszLCA4LCA3fSwgezIsIDUsIDd9LCB7MSwgNSwgN30sIHswLCAzLCA3fSwgezAsIDUsIDh9LCB7MiwgNiwgOH0sCi0gICAgICAgIHsxLCA2LCA4fSwgezAsIDQsIDh9LCB7MywgOSwgOX0sIHsyLCA3LCA5fSwgezEsIDcsIDl9LCB7MCwgNiwgOX0sIHszLCAxMSwgMTF9LCB7MiwgOSwgMTF9LAotICAgICAgICB7MSwgOSwgMTF9LCB7MCwgOCwgMTF9LCB7MywgMTAsIDExfSwgezIsIDgsIDExfSwgezEsIDgsIDExfSwgezAsIDcsIDExfSwgezAsIDExLCAxMn0sIHsyLCAxMSwgMTJ9LAotICAgICAgICB7MSwgMTEsIDEyfSwgezAsIDEwLCAxMn0sIHszLCAxMiwgMTJ9LCB7MiwgMTAsIDEyfSwgezEsIDEwLCAxMn0sIHswLCA5LCAxMn0sIHszLCAxNCwgMTN9LCB7MiwgMTMsIDEzfSwKLSAgICAgICAgezEsIDEzLCAxM30sIHswLCAxMywgMTN9LCB7MywgMTMsIDEzfSwgezIsIDEyLCAxM30sIHsxLCAxMiwgMTN9LCB7MCwgMTIsIDEzfSwgezEsIDE1LCAxNH0sIHswLCAxNSwgMTR9LAotICAgICAgICB7MiwgMTUsIDE0fSwgezEsIDE0LCAxNH0sIHsyLCAxNCwgMTN9LCB7MiwgMTQsIDEzfSwgezAsIDE0LCAxM30sIHswLCAxNCwgMTN9LCB7MywgMTYsIDE0fSwgezIsIDE2LCAxNH0sCi0gICAgICAgIHsxLCAxNiwgMTR9LCB7MCwgMTYsIDE0fSwgezMsIDE1LCAxM319LAotCi0gICAge3szLCA3LCA0fSwgezMsIDYsIDR9LCB7MywgNSwgNH0sIHszLCA0LCA0fSwgezMsIDMsIDR9LCB7MiwgMiwgNH0sIHsxLCAxLCA0fSwgezAsIDAsIDR9LAotICAgICAgICB7MSwgNSwgNX0sIHsyLCA1LCA1fSwgezEsIDQsIDV9LCB7MiwgNCwgNX0sIHsxLCAzLCA1fSwgezMsIDgsIDV9LCB7MiwgMywgNX0sIHsxLCAyLCA1fSwKLSAgICAgICAgezAsIDMsIDZ9LCB7MiwgNywgNn0sIHsxLCA3LCA2fSwgezAsIDIsIDZ9LCB7MywgOSwgNn0sIHsyLCA2LCA2fSwgezEsIDYsIDZ9LCB7MCwgMSwgNn0sCi0gICAgICAgIHswLCA3LCA3fSwgezAsIDYsIDd9LCB7MiwgOSwgN30sIHswLCA1LCA3fSwgezMsIDEwLCA3fSwgezIsIDgsIDd9LCB7MSwgOCwgN30sIHswLCA0LCA3fSwKLSAgICAgICAgezMsIDEyLCA4fSwgezIsIDExLCA4fSwgezEsIDEwLCA4fSwgezAsIDksIDh9LCB7MywgMTEsIDh9LCB7MiwgMTAsIDh9LCB7MSwgOSwgOH0sIHswLCA4LCA4fSwKLSAgICAgICAgezAsIDEyLCA5fSwgezIsIDEzLCA5fSwgezEsIDEyLCA5fSwgezAsIDExLCA5fSwgezMsIDEzLCA5fSwgezIsIDEyLCA5fSwgezEsIDExLCA5fSwgezAsIDEwLCA5fSwKLSAgICAgICAgezEsIDE1LCAxMH0sIHswLCAxNCwgMTB9LCB7MywgMTQsIDEwfSwgezIsIDE0LCAxMH0sIHsxLCAxNCwgMTB9LCB7MCwgMTMsIDEwfSwgezEsIDEzLCA5fSwgezEsIDEzLCA5fSwKLSAgICAgICAgezEsIDE2LCAxMH0sIHswLCAxNSwgMTB9LCB7MywgMTUsIDEwfSwgezIsIDE1LCAxMH0sIHszLCAxNiwgMTB9LCB7MiwgMTYsIDEwfSwgezAsIDE2LCAxMH0sIHsgLTEsIC0xLCAtMX0sCi0gICAgICAgIHsgLTEsIC0xLCAtMX0sIHsgLTEsIC0xLCAtMX0sIHsgLTEsIC0xLCAtMX19Ci19OwotCi0KLWNvbnN0IFNoaWZ0T2Zmc2V0IE51bUNvZWZmVHJhaWxPbmVzX2luZHhbM11bMTVdID0KLXsKLSAgICB7ezE1LCAtMX0sIHsxNCwgMH0sIHsxMywgMX0sIHsxMCwgLTF9LCB7OSwgM30sIHs4LCA3fSwgezcsIDExfSwgezYsIDE1fSwKLSAgICAgICAgezUsIDE5fSwgezMsIDE5fSwgezIsIDI3fSwgezEsIDM1fSwgezAsIDQzfSwgezAsIDU1fSwgezEsIDYyfX0sCi0KLSAgICB7ezE0LCAtMn0sIHsxMiwgLTJ9LCB7MTAsIC0yfSwgezEwLCAxMH0sIHs5LCAxNH0sIHs4LCAxOH0sIHs3LCAyMn0sIHs1LCAyMn0sCi0gICAgICAgIHs0LCAzMH0sIHszLCAzOH0sIHsyLCA0Nn0sIHsyLCA1OH0sIHszLCA2NX0sIHsxNiwgMH0sIHsxNiwgMH19LAotCi0gICAge3sxMiwgLTh9LCB7MTEsIDB9LCB7MTAsIDh9LCB7OSwgMTZ9LCB7OCwgMjR9LCB7NywgMzJ9LCB7NiwgNDB9LCB7NiwgNTJ9LAotICAgICAgICB7NiwgNTh9LCB7NiwgNjF9LCB7MTYsIDB9LCB7MTYsIDB9LCB7MTYsIDB9LCB7MTYsIDB9LCB7MTYsIDB9fQotfTsKLQotY29uc3Qgc3RhdGljIGludCBuQ190YWJsZVs4XSA9IHswLCAwLCAxLCAxLCAyLCAyLCAyLCAyfTsKLQotI2VuZGlmCi0vKioKLVNlZSBhbGdvcml0aG0gaW4gc3ViY2xhdXNlIDkuMSwgVGFibGUgOS0xLCBUYWJsZSA5LTIuICovCi1BVkNEZWNfU3RhdHVzIHVlX3YoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKmNvZGVOdW0pCi17Ci0gICAgdWludCB0ZW1wLCB0bXBfY250OwotICAgIGludCBsZWFkaW5nX3plcm9zID0gMDsKLSAgICBCaXRzdHJlYW1TaG93Qml0cyhiaXRzdHJlYW0sIDE2LCAmdGVtcCk7Ci0gICAgdG1wX2NudCA9IHRlbXAgIHwgMHgxOwotCi0gICAgUFZfQ0xaKGxlYWRpbmdfemVyb3MsIHRtcF9jbnQpCi0KLSAgICBpZiAobGVhZGluZ196ZXJvcyA8IDgpCi0gICAgewotICAgICAgICAqY29kZU51bSA9ICh0ZW1wID4+ICgxNSAtIChsZWFkaW5nX3plcm9zIDw8IDEpKSkgLSAxOwotICAgICAgICBCaXRzdHJlYW1GbHVzaEJpdHMoYml0c3RyZWFtLCAobGVhZGluZ196ZXJvcyA8PCAxKSArIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhiaXRzdHJlYW0sIChsZWFkaW5nX3plcm9zIDw8IDEpICsgMSwgJnRlbXApOwotICAgICAgICAqY29kZU51bSA9IHRlbXAgLSAxOwotICAgIH0KLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyoqCi1TZWUgc3ViY2xhdXNlIDkuMS4xLCBUYWJsZSA5LTMgKi8KLUFWQ0RlY19TdGF0dXMgIHNlX3YoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIGludCAqdmFsdWUpCi17Ci0gICAgdWludCB0ZW1wLCB0bXBfY250OwotICAgIGludCBsZWFkaW5nX3plcm9zID0gMDsKLSAgICBCaXRzdHJlYW1TaG93Qml0cyhiaXRzdHJlYW0sIDE2LCAmdGVtcCk7Ci0gICAgdG1wX2NudCA9IHRlbXAgfCAweDE7Ci0KLSAgICBQVl9DTFoobGVhZGluZ196ZXJvcywgdG1wX2NudCkKLQotICAgIGlmIChsZWFkaW5nX3plcm9zIDwgOCkKLSAgICB7Ci0gICAgICAgIHRlbXAgPj49ICgxNSAtIChsZWFkaW5nX3plcm9zIDw8IDEpKTsKLSAgICAgICAgQml0c3RyZWFtRmx1c2hCaXRzKGJpdHN0cmVhbSwgKGxlYWRpbmdfemVyb3MgPDwgMSkgKyAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoYml0c3RyZWFtLCAobGVhZGluZ196ZXJvcyA8PCAxKSArIDEsICZ0ZW1wKTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSB0ZW1wID4+IDE7Ci0KLSAgICBpZiAodGVtcCAmIDB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsc2IgaXMgc2lnbmVkIGJpdAotICAgICAgICAqdmFsdWUgPSAtKCp2YWx1ZSk7Ci0KLS8vICBsZWFkaW5nX3plcm9zID0gdGVtcCA+PiAxOwotLy8gICp2YWx1ZSA9IGxlYWRpbmdfemVyb3MgLSAobGVhZGluZ196ZXJvcyoyKih0ZW1wJjEpKTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotQVZDRGVjX1N0YXR1cyAgc2VfdjMyYml0KEFWQ0RlY0JpdHN0cmVhbSAqYml0c3RyZWFtLCBpbnQzMiAqdmFsdWUpCi17Ci0gICAgaW50IGxlYWRpbmdaZXJvczsKLSAgICB1aW50MzIgaW5mb2JpdHM7Ci0gICAgdWludDMyIGNvZGVOdW07Ci0KLSAgICBpZiAoQVZDREVDX1NVQ0NFU1MgIT0gR2V0RUdCaXRzdHJpbmczMmJpdChiaXRzdHJlYW0sICZsZWFkaW5nWmVyb3MsICZpbmZvYml0cykpCi0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLQotICAgIGNvZGVOdW0gPSAoMSA8PCBsZWFkaW5nWmVyb3MpIC0gMSArIGluZm9iaXRzOwotCi0gICAgKnZhbHVlID0gKGNvZGVOdW0gKyAxKSAvIDI7Ci0KLSAgICBpZiAoKGNvZGVOdW0gJiAweDAxKSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxzYiBpcyBzaWduZWQgYml0Ci0gICAgICAgICp2YWx1ZSA9IC0oKnZhbHVlKTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotCi1BVkNEZWNfU3RhdHVzIHRlX3YoQVZDRGVjQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKnZhbHVlLCB1aW50IHJhbmdlKQotewotICAgIGlmIChyYW5nZSA+IDEpCi0gICAgewotICAgICAgICB1ZV92KGJpdHN0cmVhbSwgdmFsdWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChiaXRzdHJlYW0sIHZhbHVlKTsKLSAgICAgICAgKnZhbHVlID0gMSAtICgqdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gQVZDREVDX1NVQ0NFU1M7Ci19Ci0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3Igc3ludGF4IHdpdGggcmFuZ2UgZnJvbSAtMl4zMSB0byAyXjMxLTEgKi8KLS8qIG9ubHkgYSBmZXcgb2YgdGhlbSBpbiB0aGUgU1BTIGFuZCBQUFMgKi8KLUFWQ0RlY19TdGF0dXMgR2V0RUdCaXRzdHJpbmczMmJpdChBVkNEZWNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgaW50ICpsZWFkaW5nWmVyb3MsIHVpbnQzMiAqaW5mb2JpdHMpCi17Ci0gICAgaW50IGJpdF92YWx1ZTsKLSAgICB1aW50IGluZm9fdGVtcDsKLQotICAgICpsZWFkaW5nWmVyb3MgPSAwOwotCi0gICAgQml0c3RyZWFtUmVhZDFCaXQoYml0c3RyZWFtLCAodWludCopJmJpdF92YWx1ZSk7Ci0KLSAgICB3aGlsZSAoIWJpdF92YWx1ZSkKLSAgICB7Ci0gICAgICAgICgqbGVhZGluZ1plcm9zKSsrOwotICAgICAgICBCaXRzdHJlYW1SZWFkMUJpdChiaXRzdHJlYW0sICh1aW50KikmYml0X3ZhbHVlKTsKLSAgICB9Ci0KLSAgICBpZiAoKmxlYWRpbmdaZXJvcyA+IDApCi0gICAgewotICAgICAgICBpZiAoc2l6ZW9mKHVpbnQpID09IDQpICAvKiAzMiBiaXQgbWFjaGluZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhiaXRzdHJlYW0sICpsZWFkaW5nWmVyb3MsICh1aW50KikmaW5mb190ZW1wKTsKLSAgICAgICAgICAgICppbmZvYml0cyA9ICh1aW50MzIpaW5mb190ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNpemVvZih1aW50KSA9PSAyKSAvKiAxNiBiaXQgbWFjaGluZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAqaW5mb2JpdHMgPSAwOwotICAgICAgICAgICAgaWYgKCpsZWFkaW5nWmVyb3MgPiAxNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhiaXRzdHJlYW0sIDE2LCAodWludCopJmluZm9fdGVtcCk7Ci0gICAgICAgICAgICAgICAgKCpsZWFkaW5nWmVyb3MpIC09IDE2OwotICAgICAgICAgICAgICAgICppbmZvYml0cyA9ICgodWludDMyKWluZm9fdGVtcCkgPDwgKCpsZWFkaW5nWmVyb3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhiaXRzdHJlYW0sICpsZWFkaW5nWmVyb3MsICh1aW50KikmaW5mb190ZW1wKTsKLSAgICAgICAgICAgICppbmZvYml0cyB8PSAodWludDMyKWluZm9fdGVtcCA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICAqaW5mb2JpdHMgPSAwOwotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiBzZWUgVGFibGUgOS00IGFzc2lnbm1lbnQgb2YgY29kZU51bSB0byB2YWx1ZXMgb2YgY29kZWRfYmxvY2tfcGF0dGVybi4gKi8KLWNvbnN0IHN0YXRpYyB1aW50OCBNYXBDQlBbNDhdWzJdID0KLXsKLSAgICB7NDcsIDB9LCB7MzEsIDE2fSwgezE1LCAxfSwgeyAwLCAyfSwgezIzLCA0fSwgezI3LCA4fSwgezI5LCAzMn0sIHszMCwgM30sIHsgNywgNX0sIHsxMSwgMTB9LCB7MTMsIDEyfSwgezE0LCAxNX0sCi0gICAgezM5LCA0N30sIHs0MywgN30sIHs0NSwgMTF9LCB7NDYsIDEzfSwgezE2LCAxNH0sIHsgMywgNn0sIHsgNSwgOX0sIHsxMCwgMzF9LCB7MTIsIDM1fSwgezE5LCAzN30sIHsyMSwgNDJ9LCB7MjYsIDQ0fSwKLSAgICB7MjgsIDMzfSwgezM1LCAzNH0sIHszNywgMzZ9LCB7NDIsIDQwfSwgezQ0LCAzOX0sIHsgMSwgNDN9LCB7IDIsIDQ1fSwgeyA0LCA0Nn0sIHsgOCwgMTd9LCB7MTcsIDE4fSwgezE4LCAyMH0sIHsyMCwgMjR9LAotICAgIHsyNCwgMTl9LCB7IDYsIDIxfSwgeyA5LCAyNn0sIHsyMiwgMjh9LCB7MjUsIDIzfSwgezMyLCAyN30sIHszMywgMjl9LCB7MzQsIDMwfSwgezM2LCAyMn0sIHs0MCwgMjV9LCB7MzgsIDM4fSwgezQxLCA0MX0sCi19OwotCi1BVkNEZWNfU3RhdHVzIERlY29kZUNCUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtKQotewotICAgIHVpbnQgY29kZU51bTsKLSAgICB1aW50IGNvZGVkX2Jsb2NrX3BhdHRlcm47Ci0KLSAgICB1ZV92KHN0cmVhbSwgJmNvZGVOdW0pOwotCi0gICAgaWYgKGNvZGVOdW0gPiA0NykKLSAgICB7Ci0gICAgICAgIHJldHVybiBBVkNERUNfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBjYW4gZ2V0IHJpZCBvZiB0aGUgaWYgX09QVElNSVpFICovCi0gICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKLSAgICB7Ci0gICAgICAgIGNvZGVkX2Jsb2NrX3BhdHRlcm4gPSBNYXBDQlBbY29kZU51bV1bMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNvZGVkX2Jsb2NrX3BhdHRlcm4gPSBNYXBDQlBbY29kZU51bV1bMV07Ci0gICAgfQotCi0vLyAgY3Vyck1CLT5jYnBMID0gY29kZWRfYmxvY2tfcGF0dGVybiYweEY7ICAvKiBtb2R1bG8gMTYgKi8KLS8vICBjdXJyTUItPmNicEMgPSBjb2RlZF9ibG9ja19wYXR0ZXJuPj40OyAgIC8qIGRpdmlkZSAxNiAqLwotICAgIGN1cnJNQi0+Q0JQID0gY29kZWRfYmxvY2tfcGF0dGVybjsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotCi0vKiBUTyBCRSBPUFRJTUlaRUQgISEhISEgKi8KLUFWQ0RlY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpUcmFpbGluZ09uZXMsIGludCAqVG90YWxDb2VmZiwgaW50IG5DKQotewotI2lmZGVmIFBWX05PX0NMWgotICAgIGNvbnN0IHN0YXRpYyB1aW50OCBUb3RDb2ZOVHJhaWwxWzc1XVszXSA9IHt7MCwgMCwgMTZ9LyplcnJvciAqLywgezAsIDAsIDE2fS8qZXJyb3IgKi8sIHsxLCAxMywgMTV9LCB7MSwgMTMsIDE1fSwgezAsIDE2LCAxNn0sIHsyLCAxNiwgMTZ9LCB7MSwgMTYsIDE2fSwgezAsIDE1LCAxNn0sCi0gICAgICAgIHszLCAxNiwgMTZ9LCB7MiwgMTUsIDE2fSwgezEsIDE1LCAxNn0sIHswLCAxNCwgMTZ9LCB7MywgMTUsIDE2fSwgezIsIDE0LCAxNn0sIHsxLCAxNCwgMTZ9LCB7MCwgMTMsIDE2fSwKLSAgICAgICAgezMsIDE0LCAxNX0sIHsyLCAxMywgMTV9LCB7MSwgMTIsIDE1fSwgezAsIDEyLCAxNX0sIHszLCAxMywgMTV9LCB7MiwgMTIsIDE1fSwgezEsIDExLCAxNX0sIHswLCAxMSwgMTV9LAotICAgICAgICB7MywgMTIsIDE0fSwgezIsIDExLCAxNH0sIHsxLCAxMCwgMTR9LCB7MCwgMTAsIDE0fSwgezMsIDExLCAxNH0sIHsyLCAxMCwgMTR9LCB7MSwgOSwgMTR9LCB7MCwgOSwgMTR9LAotICAgICAgICB7MCwgOCwgMTN9LCB7MiwgOSwgMTN9LCB7MSwgOCwgMTN9LCB7MCwgNywgMTN9LCB7MywgMTAsIDEzfSwgezIsIDgsIDEzfSwgezEsIDcsIDEzfSwgezAsIDYsIDEzfSwKLSAgICAgICAgezMsIDksIDExfSwgezIsIDcsIDExfSwgezEsIDYsIDExfSwgezAsIDUsIDExfSwgezMsIDgsIDEwfSwKLSAgICAgICAgezIsIDYsIDEwfSwgezEsIDUsIDEwfSwgezAsIDQsIDEwfSwgezMsIDcsIDl9LCB7MiwgNSwgOX0sIHsxLCA0LCA5fSwgezAsIDMsIDl9LCB7MywgNiwgOH0sCi0gICAgICAgIHsyLCA0LCA4fSwgezEsIDMsIDh9LCB7MCwgMiwgOH0sIHszLCA1LCA3fSwgezIsIDMsIDd9LCB7MywgNCwgNn0sIHszLCA0LCA2fSwgezEsIDIsIDZ9LAotICAgICAgICB7MSwgMiwgNn0sIHswLCAxLCA2fSwgezAsIDEsIDZ9LCB7MywgMywgNX0sIHszLCAzLCA1fSwgezMsIDMsIDV9LCB7MywgMywgNX0sIHsyLCAyLCAzfSwKLSAgICAgICAgezEsIDEsIDJ9LCB7MSwgMSwgMn0sIHswLCAwLCAxfSwgezAsIDAsIDF9LCB7MCwgMCwgMX0sIHswLCAwLCAxfQotICAgIH07Ci0KLSAgICBjb25zdCBzdGF0aWMgdWludDggVG90Q29mTlRyYWlsMls4NF1bM10gPSB7ezAsIDAsIDE0IC8qIGVycm9yICovfSwgezAsIDAsIDE0LyplcnJvciAqL30sIHszLCAxNSwgMTN9LCB7MywgMTUsIDEzfSwgezMsIDE2LCAxNH0sIHsyLCAxNiwgMTR9LCB7MSwgMTYsIDE0fSwgezAsIDE2LCAxNH0sCi0gICAgICAgIHsxLCAxNSwgMTR9LCB7MCwgMTUsIDE0fSwgezIsIDE1LCAxNH0sIHsxLCAxNCwgMTR9LCB7MiwgMTQsIDEzfSwgezIsIDE0LCAxM30sIHswLCAxNCwgMTN9LCB7MCwgMTQsIDEzfSwKLSAgICAgICAgezMsIDE0LCAxM30sIHsyLCAxMywgMTN9LCB7MSwgMTMsIDEzfSwgezAsIDEzLCAxM30sIHszLCAxMywgMTN9LCB7MiwgMTIsIDEzfSwgezEsIDEyLCAxM30sIHswLCAxMiwgMTN9LAotICAgICAgICB7MCwgMTEsIDEyfSwgezIsIDExLCAxMn0sIHsxLCAxMSwgMTJ9LCB7MCwgMTAsIDEyfSwgezMsIDEyLCAxMn0sIHsyLCAxMCwgMTJ9LCB7MSwgMTAsIDEyfSwgezAsIDksIDEyfSwKLSAgICAgICAgezMsIDExLCAxMX0sIHsyLCA5LCAxMX0sIHsxLCA5LCAxMX0sIHswLCA4LCAxMX0sIHszLCAxMCwgMTF9LCB7MiwgOCwgMTF9LCB7MSwgOCwgMTF9LCB7MCwgNywgMTF9LAotICAgICAgICB7MywgOSwgOX0sIHsyLCA3LCA5fSwgezEsIDcsIDl9LCB7MCwgNiwgOX0sIHswLCA1LCA4fSwgezAsIDUsIDh9LCB7MiwgNiwgOH0sIHsyLCA2LCA4fSwKLSAgICAgICAgezEsIDYsIDh9LCB7MSwgNiwgOH0sIHswLCA0LCA4fSwgezAsIDQsIDh9LCB7MywgOCwgN30sIHsyLCA1LCA3fSwgezEsIDUsIDd9LCB7MCwgMywgN30sCi0gICAgICAgIHszLCA3LCA2fSwgezMsIDcsIDZ9LCB7MiwgNCwgNn0sIHsyLCA0LCA2fSwgezEsIDQsIDZ9LCB7MSwgNCwgNn0sIHswLCAyLCA2fSwgezAsIDIsIDZ9LAotICAgICAgICB7MywgNiwgNn0sIHsyLCAzLCA2fSwgezEsIDMsIDZ9LCB7MCwgMSwgNn0sIHszLCA1LCA1fSwgezMsIDUsIDV9LCB7MSwgMiwgNX0sIHsxLCAyLCA1fSwKLSAgICAgICAgezMsIDQsIDR9LCB7MywgMywgNH0sIHsyLCAyLCAzfSwgezIsIDIsIDN9LCB7MSwgMSwgMn0sIHsxLCAxLCAyfSwgezEsIDEsIDJ9LCB7MSwgMSwgMn0sCi0gICAgICAgIHswLCAwLCAyfSwgezAsIDAsIDJ9LCB7MCwgMCwgMn0sIHswLCAwLCAyfQotICAgIH07Ci0KLSAgICBjb25zdCBzdGF0aWMgdWludDggVG90Q29mTlRyYWlsM1s2NF1bM10gPSB7ezAsIDAsIDEwLyplcnJvciovfSwgezAsIDE2LCAxMH0sIHszLCAxNiwgMTB9LCB7MiwgMTYsIDEwfSwgezEsIDE2LCAxMH0sIHswLCAxNSwgMTB9LCB7MywgMTUsIDEwfSwKLSAgICAgICAgezIsIDE1LCAxMH0sIHsxLCAxNSwgMTB9LCB7MCwgMTQsIDEwfSwgezMsIDE0LCAxMH0sIHsyLCAxNCwgMTB9LCB7MSwgMTQsIDEwfSwgezAsIDEzLCAxMH0sIHsxLCAxMywgOX0sCi0gICAgICAgIHsxLCAxMywgOX0sIHswLCAxMiwgOX0sIHsyLCAxMywgOX0sIHsxLCAxMiwgOX0sIHswLCAxMSwgOX0sIHszLCAxMywgOX0sIHsyLCAxMiwgOX0sIHsxLCAxMSwgOX0sCi0gICAgICAgIHswLCAxMCwgOX0sIHszLCAxMiwgOH0sIHsyLCAxMSwgOH0sIHsxLCAxMCwgOH0sIHswLCA5LCA4fSwgezMsIDExLCA4fSwgezIsIDEwLCA4fSwgezEsIDksIDh9LAotICAgICAgICB7MCwgOCwgOH0sIHswLCA3LCA3fSwgezAsIDYsIDd9LCB7MiwgOSwgN30sIHswLCA1LCA3fSwgezMsIDEwLCA3fSwgezIsIDgsIDd9LCB7MSwgOCwgN30sCi0gICAgICAgIHswLCA0LCA3fSwgezAsIDMsIDZ9LCB7MiwgNywgNn0sIHsxLCA3LCA2fSwgezAsIDIsIDZ9LCB7MywgOSwgNn0sIHsyLCA2LCA2fSwgezEsIDYsIDZ9LAotICAgICAgICB7MCwgMSwgNn0sIHsxLCA1LCA1fSwgezIsIDUsIDV9LCB7MSwgNCwgNX0sIHsyLCA0LCA1fSwgezEsIDMsIDV9LCB7MywgOCwgNX0sIHsyLCAzLCA1fSwKLSAgICAgICAgezEsIDIsIDV9LCB7MywgNywgNH0sIHszLCA2LCA0fSwgezMsIDUsIDR9LCB7MywgNCwgNH0sIHszLCAzLCA0fSwgezIsIDIsIDR9LCB7MSwgMSwgNH0sCi0gICAgICAgIHswLCAwLCA0fQotICAgIH07Ci0jZW5kaWYKLSAgICB1aW50IGNvZGU7Ci0KLSNpZmRlZiBQVl9OT19DTFoKLSAgICB1aW50OCAqcGNvZGU7Ci0gICAgaWYgKG5DIDwgMikKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgMTYsICZjb2RlKTsKLQotICAgICAgICBpZiAoY29kZSA+PSA4MTkyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDFbKGNvZGU+PjEzKSs2NSsyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAyMDQ4KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDFbKGNvZGU+PjkpKzUwKzJdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID49IDEwMjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMVsoY29kZT4+OCkrNDYrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNTEyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDFbKGNvZGU+PjcpKzQyKzJdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID49IDI1NikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwxWyhjb2RlPj42KSszOCsyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAxMjgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMVsoY29kZT4+NSkrMzQrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMVsoY29kZT4+MykrMjIrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMVsoY29kZT4+MikrMTQrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMVsoY29kZT4+MSkrNisyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDFbKGNvZGUtMikrMl1bMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgKlRyYWlsaW5nT25lcyA9IHBjb2RlWzBdOwotICAgICAgICAqVG90YWxDb2VmZiA9IHBjb2RlWzFdOwotCi0gICAgICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHBjb2RlWzJdKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobkMgPCA0KQotICAgIHsKLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCAxNCwgJmNvZGUpOwotCi0gICAgICAgIGlmIChjb2RlID49IDQwOTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMlsoY29kZT4+MTApKzY2KzJdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID49IDIwNDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMlsoY29kZT4+OCkrNTQrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gNTEyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDJbKGNvZGU+PjcpKzQ2KzJdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID49IDEyOCkKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwyWyhjb2RlPj41KSszNCsyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwyWyhjb2RlPj4zKSsyMisyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAzMikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwyWyhjb2RlPj4yKSsxNCsyXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwyWyhjb2RlPj4xKSs2KzJdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsMltjb2RlLTIrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgICpUcmFpbGluZ09uZXMgPSBwY29kZVswXTsKLSAgICAgICAgKlRvdGFsQ29lZmYgPSBwY29kZVsxXTsKLQotICAgICAgICBCaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBwY29kZVsyXSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5DIDwgOCkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgMTAsICZjb2RlKTsKLQotICAgICAgICBpZiAoY29kZSA+PSA1MTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsM1soY29kZT4+NikrNDcrMV1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGUgPj0gMjU2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDNbKGNvZGU+PjUpKzM5KzFdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2RlID49IDEyOCkKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwzWyhjb2RlPj40KSszMSsxXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwzWyhjb2RlPj4zKSsyMysxXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAzMikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwzWyhjb2RlPj4yKSsxNSsxXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWwzWyhjb2RlPj4xKSs3KzFdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90Q29mTlRyYWlsM1tjb2RlLTErMV1bMF0pOwotICAgICAgICB9Ci0gICAgICAgICpUcmFpbGluZ09uZXMgPSBwY29kZVswXTsKLSAgICAgICAgKlRvdGFsQ29lZmYgPSBwY29kZVsxXTsKLQotICAgICAgICBCaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBwY29kZVsyXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHJlYWQgNiBiaXQgRkxDICovCi0gICAgICAgIEJpdHN0cmVhbVJlYWRCaXRzKHN0cmVhbSwgNiwgJmNvZGUpOwotCi0KLSAgICAgICAgKlRyYWlsaW5nT25lcyA9IGNvZGUgJiAzOwotICAgICAgICAqVG90YWxDb2VmZiA9IChjb2RlID4+IDIpICsgMTsKLQotICAgICAgICBpZiAoKlRvdGFsQ29lZmYgPiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgKlRvdGFsQ29lZmYgPSAxNjsgIC8vIF9FUlJPUgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvZGUgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgKlRyYWlsaW5nT25lcyA9IDA7Ci0gICAgICAgICAgICAoKlRvdGFsQ29lZmYpLS07Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotICAgIGNvbnN0IFZMQ051bUNvZWZmVHJhaWwgKnB0cjsKLSAgICBjb25zdCBTaGlmdE9mZnNldCAqcHRyX2luZHg7Ci0gICAgdWludCB0ZW1wLCBsZWFkaW5nX3plcm9zID0gMDsKLQotICAgIGlmIChuQyA8IDgpCi0gICAgewotCi0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgMTYsICZjb2RlKTsKLSAgICAgICAgdGVtcCA9IGNvZGUgfCAxOwotCi0gICAgICAgIFBWX0NMWihsZWFkaW5nX3plcm9zLCB0ZW1wKQotCi0gICAgICAgIHRlbXAgPSBuQ190YWJsZVtuQ107Ci0gICAgICAgIHB0cl9pbmR4ID0gJk51bUNvZWZmVHJhaWxPbmVzX2luZHhbdGVtcF1bbGVhZGluZ196ZXJvc107Ci0gICAgICAgIHB0ciA9ICZOdW1Db2VmZlRyYWlsT25lc1t0ZW1wXVsoY29kZSA+PiBwdHJfaW5keC0+c2hpZnQpICsgcHRyX2luZHgtPm9mZnNldF07Ci0gICAgICAgICpUcmFpbGluZ09uZXMgPSBwdHItPnRyYWlsaW5nOwotICAgICAgICAqVG90YWxDb2VmZiA9IHB0ci0+dG90YWxfY29lZmY7Ci0gICAgICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHB0ci0+bGVuZ3RoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogcmVhZCA2IGJpdCBGTEMgKi8KLSAgICAgICAgQml0c3RyZWFtUmVhZEJpdHMoc3RyZWFtLCA2LCAmY29kZSk7Ci0KLQotICAgICAgICAqVHJhaWxpbmdPbmVzID0gY29kZSAmIDM7Ci0gICAgICAgICpUb3RhbENvZWZmID0gKGNvZGUgPj4gMikgKyAxOwotCi0gICAgICAgIGlmICgqVG90YWxDb2VmZiA+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICAqVG90YWxDb2VmZiA9IDE2OyAgLy8gX0VSUk9SCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29kZSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICAqVHJhaWxpbmdPbmVzID0gMDsKLSAgICAgICAgICAgICgqVG90YWxDb2VmZiktLTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogVE8gQkUgT1BUSU1JWkVEICEhISEhICovCi1BVkNEZWNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXNDaHJvbWFEQyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpUcmFpbGluZ09uZXMsIGludCAqVG90YWxDb2VmZikKLXsKLSAgICBBVkNEZWNfU3RhdHVzIHN0YXR1czsKLQotICAgIGNvbnN0IHN0YXRpYyB1aW50OCBUb3RDb2ZOVHJhaWw1WzIxXVszXSA9Ci0gICAgewotICAgICAgICB7MywgNCwgN30sIHszLCA0LCA3fSwgezIsIDQsIDh9LCB7MSwgNCwgOH0sIHsyLCAzLCA3fSwgezIsIDMsIDd9LCB7MSwgMywgN30sCi0gICAgICAgIHsxLCAzLCA3fSwgezAsIDQsIDZ9LCB7MCwgMywgNn0sIHswLCAyLCA2fSwgezMsIDMsIDZ9LCB7MSwgMiwgNn0sIHswLCAxLCA2fSwKLSAgICAgICAgezIsIDIsIDN9LCB7MCwgMCwgMn0sIHswLCAwLCAyfSwgezEsIDEsIDF9LCB7MSwgMSwgMX0sIHsxLCAxLCAxfSwgezEsIDEsIDF9Ci0gICAgfTsKLQotICAgIHVpbnQgY29kZTsKLSAgICB1aW50OCAqcGNvZGU7Ci0KLSAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0cyhzdHJlYW0sIDgsICZjb2RlKTsKLQotICAgIGlmIChjb2RlID49IDMyKQotICAgIHsKLSAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWw1Wyhjb2RlPj41KSsxM11bMF0pOwotICAgIH0KLSAgICBlbHNlIGlmIChjb2RlID49IDgpCi0gICAgewotICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdENvZk5UcmFpbDVbKGNvZGU+PjIpKzZdWzBdKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RDb2ZOVHJhaWw1W2NvZGVdWzBdKTsKLSAgICB9Ci0KLSAgICAqVHJhaWxpbmdPbmVzID0gcGNvZGVbMF07Ci0gICAgKlRvdGFsQ29lZmYgPSBwY29kZVsxXTsKLQotICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHBjb2RlWzJdKTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIHNlZSBUYWJsZSA5LTYgKi8KLUFWQ0RlY19TdGF0dXMgY2VfTGV2ZWxQcmVmaXgoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgKmNvZGUpCi17Ci0gICAgdWludCB0ZW1wOwotICAgIHVpbnQgbGVhZGluZ196ZXJvcyA9IDA7Ci0gICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCAxNiwgJnRlbXApOwotICAgIHRlbXAgfD0gMSA7Ci0KLSAgICBQVl9DTFoobGVhZGluZ196ZXJvcywgdGVtcCkKLQotICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIGxlYWRpbmdfemVyb3MgKyAxKTsKLSAgICAqY29kZSA9IGxlYWRpbmdfemVyb3M7Ci0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQotCi0vKiBzZWUgVGFibGUgOS03IGFuZCA5LTggKi8KLUFWQ0RlY19TdGF0dXMgY2VfVG90YWxaZXJvcyhBVkNEZWNCaXRzdHJlYW0gKnN0cmVhbSwgaW50ICpjb2RlLCBpbnQgVG90YWxDb2VmZikKLXsKLSAgICBjb25zdCBzdGF0aWMgdWludDggVG90WmVybzFbMjhdWzJdID0ge3sxNSwgOX0sIHsxNCwgOX0sIHsxMywgOX0sIHsxMiwgOH0sCi0gICAgICAgIHsxMiwgOH0sIHsxMSwgOH0sIHsxMSwgOH0sIHsxMCwgN30sIHs5LCA3fSwgezgsIDZ9LCB7OCwgNn0sIHs3LCA2fSwgezcsIDZ9LCB7NiwgNX0sIHs2LCA1fSwKLSAgICAgICAgezYsIDV9LCB7NiwgNX0sIHs1LCA1fSwgezUsIDV9LCB7NSwgNX0sIHs1LCA1fSwgezQsIDR9LCB7MywgNH0sCi0gICAgICAgIHsyLCAzfSwgezIsIDN9LCB7MSwgM30sIHsxLCAzfSwgezAsIDF9Ci0gICAgfTsKLQotICAgIGNvbnN0IHN0YXRpYyB1aW50OCBUb3RaZXJvMm4zWzJdWzE4XVsyXSA9IHt7ezE0LCA2fSwgezEzLCA2fSwgezEyLCA2fSwgezExLCA2fSwKLSAgICAgICAgICAgIHsxMCwgNX0sIHsxMCwgNX0sIHs5LCA1fSwgezksIDV9LCB7OCwgNH0sIHs3LCA0fSwgezYsIDR9LCB7NSwgNH0sIHs0LCAzfSwgezQsIDN9LAotICAgICAgICAgICAgezMsIDN9LCB7MiwgM30sIHsxLCAzfSwgezAsIDN9fSwKLQotICAgICAgICAvKmNvbnN0IHN0YXRpYyB1aW50OCBUb3RaZXJvM1sxOF1bMl09Ki97ezEzLCA2fSwgezExLCA2fSwgezEyLCA1fSwgezEyLCA1fSwgezEwLCA1fSwKLSAgICAgICAgICAgIHsxMCwgNX0sIHs5LCA1fSwgezksIDV9LCB7OCwgNH0sIHs1LCA0fSwgezQsIDR9LCB7MCwgNH0sIHs3LCAzfSwgezcsIDN9LCB7NiwgM30sIHszLCAzfSwKLSAgICAgICAgICAgIHsyLCAzfSwgezEsIDN9fQotICAgIH07Ci0KLSAgICBjb25zdCBzdGF0aWMgdWludDggVG90WmVybzRbMTddWzJdID0ge3sxMiwgNX0sIHsxMSwgNX0sIHsxMCwgNX0sIHswLCA1fSwgezksIDR9LAotICAgICAgICB7OSwgNH0sIHs3LCA0fSwgezcsIDR9LCB7MywgNH0sIHszLCA0fSwgezIsIDR9LCB7MiwgNH0sIHs4LCAzfSwgezYsIDN9LCB7NSwgM30sIHs0LCAzfSwgezEsIDN9Ci0gICAgfTsKLQotICAgIGNvbnN0IHN0YXRpYyB1aW50OCBUb3RaZXJvNVsxM11bMl0gPSB7ezExLCA1fSwgezksIDV9LCB7MTAsIDR9LCB7OCwgNH0sIHsyLCA0fSwKLSAgICAgICAgezEsIDR9LCB7MCwgNH0sIHs3LCAzfSwgezcsIDN9LCB7NiwgM30sIHs1LCAzfSwgezQsIDN9LCB7MywgM30KLSAgICB9OwotCi0gICAgY29uc3Qgc3RhdGljIHVpbnQ4IFRvdFplcm82dG8xMFs1XVsxNV1bMl0gPSB7e3sxMCwgNn0sIHswLCA2fSwgezEsIDV9LCB7MSwgNX0sIHs4LCA0fSwKLSAgICAgICAgICAgIHs4LCA0fSwgezgsIDR9LCB7OCwgNH0sIHs5LCAzfSwgezcsIDN9LCB7NiwgM30sIHs1LCAzfSwgezQsIDN9LCB7MywgM30sIHsyLCAzfX0sCi0KLSAgICAgICAgLypjb25zdCBzdGF0aWMgdWludDggVG90WmVybzdbMTVdWzJdPSove3s5LCA2fSwgezAsIDZ9LCB7MSwgNX0sIHsxLCA1fSwgezcsIDR9LAotICAgICAgICAgICAgezcsIDR9LCB7NywgNH0sIHs3LCA0fSwgezgsIDN9LCB7NiwgM30sIHs0LCAzfSwgezMsIDN9LCB7MiwgM30sIHs1LCAyfSwgezUsIDJ9fSwKLQotICAgICAgICAvKmNvbnN0IHN0YXRpYyB1aW50OCBUb3RaZXJvOFsxNV1bMl09Ki97ezgsIDZ9LCB7MCwgNn0sIHsyLCA1fSwgezIsIDV9LCB7MSwgNH0sCi0gICAgICAgICAgICB7MSwgNH0sIHsxLCA0fSwgezEsIDR9LCB7NywgM30sIHs2LCAzfSwgezMsIDN9LCB7NSwgMn0sIHs1LCAyfSwgezQsIDJ9LCB7NCwgMn19LAotCi0gICAgICAgIC8qY29uc3Qgc3RhdGljIHVpbnQ4IFRvdFplcm85WzE1XVsyXT0qL3t7MSwgNn0sIHswLCA2fSwgezcsIDV9LCB7NywgNX0sIHsyLCA0fSwKLSAgICAgICAgICAgIHsyLCA0fSwgezIsIDR9LCB7MiwgNH0sIHs1LCAzfSwgezYsIDJ9LCB7NiwgMn0sIHs0LCAyfSwgezQsIDJ9LCB7MywgMn0sIHszLCAyfX0sCi0KLSAgICAgICAgLypjb25zdCBzdGF0aWMgdWludDggVG90WmVybzEwWzExXVsyXT0qL3t7MSwgNX0sIHswLCA1fSwgezYsIDR9LCB7NiwgNH0sIHsyLCAzfSwKLSAgICAgICAgICAgIHsyLCAzfSwgezIsIDN9LCB7MiwgM30sIHs1LCAyfSwgezQsIDJ9LCB7MywgMn0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfX0KLSAgICB9OwotCi0gICAgY29uc3Qgc3RhdGljIHVpbnQ4IFRvdFplcm8xMVs3XVsyXSA9IHt7MCwgNH0sIHsxLCA0fSwgezIsIDN9LCB7MiwgM30sIHszLCAzfSwgezUsIDN9LCB7NCwgMX19OwotCi0gICAgY29uc3Qgc3RhdGljIHVpbnQ4IFRvdFplcm8xMnRvMTVbNF1bNV1bMl0gPQotICAgIHsKLSAgICAgICAge3szLCAxfSwgezIsIDJ9LCB7NCwgM30sIHsxLCA0fSwgezAsIDR9fSwKLSAgICAgICAge3syLCAxfSwgezMsIDJ9LCB7MSwgM30sIHswLCAzfSwgezAsIDB9fSwKLSAgICAgICAge3syLCAxfSwgezEsIDJ9LCB7MCwgMn0sIHswLCAwfSwgezAsIDB9fSwKLSAgICAgICAge3sxLCAxfSwgezAsIDF9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9fQotICAgIH07Ci0KLSAgICB1aW50IHRlbXAsIG1hc2s7Ci0gICAgaW50IGluZHg7Ci0gICAgdWludDggKnBjb2RlOwotCi0gICAgaWYgKFRvdGFsQ29lZmYgPT0gMSkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgOSwgJnRlbXApOwotCi0gICAgICAgIGlmICh0ZW1wID49IDI1NikKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RaZXJvMVsyN11bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90WmVybzFbKHRlbXA+PjUpKzE5XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA+PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8xWyh0ZW1wPj4yKSs1XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8xW3RlbXAtMV1bMF0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoVG90YWxDb2VmZiA9PSAyIHx8IFRvdGFsQ29lZmYgPT0gMykKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgNiwgJnRlbXApOwotCi0gICAgICAgIGlmICh0ZW1wID49IDMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8ybjNbVG90YWxDb2VmZi0yXVsodGVtcD4+MykrMTBdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wID49IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90WmVybzJuM1tUb3RhbENvZWZmLTJdWyh0ZW1wPj4yKSs2XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8ybjNbVG90YWxDb2VmZi0yXVt0ZW1wXVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoVG90YWxDb2VmZiA9PSA0KQotICAgIHsKLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCA1LCAmdGVtcCk7Ci0KLSAgICAgICAgaWYgKHRlbXAgPj0gMTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90WmVybzRbKHRlbXA+PjIpKzldWzBdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBjb2RlID0gKHVpbnQ4KikgJiAoVG90WmVybzRbdGVtcF1bMF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFRvdGFsQ29lZmYgPT0gNSkKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgNSwgJnRlbXApOwotCi0gICAgICAgIGlmICh0ZW1wID49IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm81Wyh0ZW1wPj4yKSs1XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA+PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm81Wyh0ZW1wPj4xKSsxXVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm81W3RlbXBdWzBdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChUb3RhbENvZWZmID49IDYgJiYgVG90YWxDb2VmZiA8PSAxMCkKLSAgICB7Ci0gICAgICAgIGlmIChUb3RhbENvZWZmID09IDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0cyhzdHJlYW0sIDUsICZ0ZW1wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgNiwgJnRlbXApOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAodGVtcCA+PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm82dG8xMFtUb3RhbENvZWZmLTZdWyh0ZW1wPj4zKSs3XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm82dG8xMFtUb3RhbENvZWZmLTZdW3RlbXBdWzBdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChUb3RhbENvZWZmID09IDExKQotICAgIHsKLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCA0LCAmdGVtcCk7Ci0KLQotICAgICAgICBpZiAodGVtcCA+PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8xMVs2XVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFRvdFplcm8xMVsodGVtcD4+MSkrMl1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RaZXJvMTFbdGVtcF1bMF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzKHN0cmVhbSwgKDE2IC0gVG90YWxDb2VmZiksICZ0ZW1wKTsKLSAgICAgICAgbWFzayA9IDEgPDwgKDE1IC0gVG90YWxDb2VmZik7Ci0gICAgICAgIGluZHggPSAwOwotICAgICAgICB3aGlsZSAoKHRlbXAmbWFzaykgPT0gMCAmJiBpbmR4IDwgKDE2IC0gVG90YWxDb2VmZikpIC8qIHNlYXJjaCBsb2NhdGlvbiBvZiAxIGJpdCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBtYXNrID4+PSAxOwotICAgICAgICAgICAgaW5keCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RaZXJvMTJ0bzE1W1RvdGFsQ29lZmYtMTJdW2luZHhdKTsKLSAgICB9Ci0KLSAgICAqY29kZSA9IHBjb2RlWzBdOwotICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHBjb2RlWzFdKTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogc2VlIFRhYmxlIDktOSAqLwotQVZDRGVjX1N0YXR1cyBjZV9Ub3RhbFplcm9zQ2hyb21hREMoQVZDRGVjQml0c3RyZWFtICpzdHJlYW0sIGludCAqY29kZSwgaW50IFRvdGFsQ29lZmYpCi17Ci0gICAgY29uc3Qgc3RhdGljIHVpbnQ4IFRvdFplcm9DaHJvbTF0bzNbM11bOF1bMl0gPQotICAgIHsKLSAgICAgICAge3szLCAzfSwgezIsIDN9LCB7MSwgMn0sIHsxLCAyfSwgezAsIDF9LCB7MCwgMX0sIHswLCAxfSwgezAsIDF9fSwKLSAgICAgICAge3syLCAyfSwgezIsIDJ9LCB7MSwgMn0sIHsxLCAyfSwgezAsIDF9LCB7MCwgMX0sIHswLCAxfSwgezAsIDF9fSwKLSAgICAgICAge3sxLCAxfSwgezEsIDF9LCB7MSwgMX0sIHsxLCAxfSwgezAsIDF9LCB7MCwgMX0sIHswLCAxfSwgezAsIDF9fSwKLSAgICB9OwotCi0KLSAgICB1aW50IHRlbXA7Ci0gICAgdWludDggKnBjb2RlOwotCi0gICAgQml0c3RyZWFtU2hvd0JpdHMoc3RyZWFtLCAzLCAmdGVtcCk7Ci0gICAgcGNvZGUgPSAodWludDgqKSAmIChUb3RaZXJvQ2hyb20xdG8zW1RvdGFsQ29lZmYtMV1bdGVtcF0pOwotCi0gICAgKmNvZGUgPSBwY29kZVswXTsKLQotICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHBjb2RlWzFdKTsKLQotICAgIHJldHVybiBBVkNERUNfU1VDQ0VTUzsKLX0KLQotLyogc2VlIFRhYmxlIDktMTAgKi8KLUFWQ0RlY19TdGF0dXMgY2VfUnVuQmVmb3JlKEFWQ0RlY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgKmNvZGUsIGludCB6ZXJvc0xlZnQpCi17Ci0gICAgY29uc3Qgc3RhdGljIGludCBjb2RsZW5bNl0gPSB7MSwgMiwgMiwgMywgMywgM307IC8qIG51bSBiaXRzIHRvIHJlYWQgKi8KLSAgICBjb25zdCBzdGF0aWMgdWludDggUnVuQmVmb3JlVGFiWzZdWzhdWzJdID0ge3t7MSwgMX0sIHswLCAxfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfX0sCi0gICAgICAgIC8qY29uc3Qgc3RhdGljIGludCBSdW5CZWZvcmUyWzRdWzJdPSove3syLCAyfSwgezEsIDJ9LCB7MCwgMX0sIHswLCAxfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9fSwKLSAgICAgICAgLypjb25zdCBzdGF0aWMgaW50IFJ1bkJlZm9yZTNbNF1bMl09Ki97ezMsIDJ9LCB7MiwgMn0sIHsxLCAyfSwgezAsIDJ9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH19LAotICAgICAgICAvKmNvbnN0IHN0YXRpYyBpbnQgUnVuQmVmb3JlNFs3XVsyXT0qL3t7NCwgM30sIHszLCAzfSwgezIsIDJ9LCB7MiwgMn0sIHsxLCAyfSwgezEsIDJ9LCB7MCwgMn0sIHswLCAyfX0sCi0gICAgICAgIC8qY29uc3Qgc3RhdGljIGludCBSdW5CZWZvcmU1WzddWzJdPSove3s1LCAzfSwgezQsIDN9LCB7MywgM30sIHsyLCAzfSwgezEsIDJ9LCB7MSwgMn0sIHswLCAyfSwgezAsIDJ9fSwKLSAgICAgICAgLypjb25zdCBzdGF0aWMgaW50IFJ1bkJlZm9yZTZbN11bMl09Ki97ezEsIDN9LCB7MiwgM30sIHs0LCAzfSwgezMsIDN9LCB7NiwgM30sIHs1LCAzfSwgezAsIDJ9LCB7MCwgMn19Ci0gICAgfTsKLQotICAgIHVpbnQgdGVtcDsKLSAgICB1aW50OCAqcGNvZGU7Ci0gICAgaW50IGluZHg7Ci0KLSAgICBpZiAoemVyb3NMZWZ0IDw9IDYpCi0gICAgewotICAgICAgICBCaXRzdHJlYW1TaG93Qml0cyhzdHJlYW0sIGNvZGxlblt6ZXJvc0xlZnQtMV0sICZ0ZW1wKTsKLQotICAgICAgICBwY29kZSA9ICh1aW50OCopICYgKFJ1bkJlZm9yZVRhYlt6ZXJvc0xlZnQtMV1bdGVtcF1bMF0pOwotCi0gICAgICAgICpjb2RlID0gcGNvZGVbMF07Ci0KLSAgICAgICAgQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgcGNvZGVbMV0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBCaXRzdHJlYW1SZWFkQml0cyhzdHJlYW0sIDMsICZ0ZW1wKTsKLSAgICAgICAgaWYgKHRlbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpjb2RlID0gNyAtIHRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0cyhzdHJlYW0sIDksICZ0ZW1wKTsKLSAgICAgICAgICAgIHRlbXAgPDw9IDc7Ci0gICAgICAgICAgICB0ZW1wIHw9IDE7Ci0gICAgICAgICAgICBpbmR4ID0gMDsKLSAgICAgICAgICAgIFBWX0NMWihpbmR4LCB0ZW1wKQotICAgICAgICAgICAgKmNvZGUgPSA3ICsgaW5keDsKLSAgICAgICAgICAgIEJpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIGluZHggKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIEFWQ0RFQ19TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcAppbmRleCBlMzI5MmU2Li4wMDk2NzYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcApAQCAtNDc1LDcgKzQ3NSw5IEBACiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgdmlkZW8gZnJhbWU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZWFkIGlucHV0IHZpZGVvIGZyYW1lOiAlZCIsIGVycik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawppbmRleCBmZmZiMmFkLi5hZjg3OTVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xLDcgKzEsNyBAQAogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IGNtbk1lbW9yeS5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKaW5kZXggMTg3ZjI1Yy4uM2Q3NTRlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKQEAgLTEsOCArMSw4IEBACi0jCisjIAogIyBUaGlzIGNvbmZpZ3VyZSBmaWxlIGlzIGp1c3QgZm9yIExpbnV4IHByb2plY3RzIGFnYWluc3QgQW5kcm9pZAogIwogCi1WT1BSSiA6PQorVk9QUkogOj0gCiBWT05KIDo9CiAKICMgV0FSTklORzoKQEAgLTIwLDUgKzIwLDUgQEAKIAogVk9URVNUIDo9IDAKIAotVk9fQ0ZMQUdTOj0tRExJTlVYCitWT19DRkxBR1M6PS1ETElOVVggCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0FNUldCLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BTVJXQi5oCmluZGV4IGQzZWI1MzcuLjEzMjkwYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0FNUldCLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQU1SV0IuaApAQCAtMjksMjAgKzI5LDIwIEBACiAjcHJhZ21hIHBhY2socHVzaCwgNCkKIAogLyohKiB0aGUgYml0IHJhdGUgdGhlIGNvZGVjIHN1cHBvcnRzKi8KLXR5cGVkZWYgZW51bSB7Cit0eXBlZGVmIGVudW0geyAKIAlWT0FNUldCX01ETk9ORQkJPSAtMSwJLyohPCBJbnZhbGlkIG1vZGUgKi8KIAlWT0FNUldCX01ENjYJCT0gMCwJLyohPCA2LjYwa2JwcyAgICovCi0JVk9BTVJXQl9NRDg4NQkJPSAxLCAgICAvKiE8IDguODVrYnBzICAgKi8KKwlWT0FNUldCX01EODg1CQk9IDEsICAgIC8qITwgOC44NWticHMgICAqLyAgICAgICAKIAlWT0FNUldCX01EMTI2NQkJPSAyLAkvKiE8IDEyLjY1a2JwcyAgKi8KIAlWT0FNUldCX01EMTQyNQkJPSAzLAkvKiE8IDE0LjI1a2JwcyAgKi8KIAlWT0FNUldCX01EMTU4NQkJPSA0LAkvKiE8IDE1Ljg1YnBzICAgKi8KIAlWT0FNUldCX01EMTgyNQkJPSA1LAkvKiE8IDE4LjI1YnBzICAgKi8KIAlWT0FNUldCX01EMTk4NQkJPSA2LAkvKiE8IDE5Ljg1a2JwcyAgKi8KIAlWT0FNUldCX01EMjMwNQkJPSA3LCAgICAvKiE8IDIzLjA1a2JwcyAgKi8KLQlWT0FNUldCX01EMjM4NSAgICAgICAgICA9IDgsICAgIC8qITwgMjMuODVrYnBzPiAqLworCVZPQU1SV0JfTUQyMzg1ICAgICAgICAgID0gOCwgICAgLyohPCAyMy44NWticHM+ICovCQogCVZPQU1SV0JfTl9NT0RFUyAJPSA5LAkvKiE8IEludmFsaWQgbW9kZSAqLwogCVZPQU1SV0JfTU9ERV9NQVggICAgPSBWT19NQVhfRU5VTV9WQUxVRQotCisJCiB9Vk9BTVJXQk1PREU7CiAKIC8qISogdGhlIGZyYW1lIGZvcm1hdCB0aGUgY29kZWMgc3VwcG9ydHMqLwpAQCAtNTEsMTcgKzUxLDE3IEBACiAJLypPbmUgd29yZCAoMi1ieXRlKSBmb3Igc3luYyB3b3JkICgweDZiMjEpKi8KIAkvKk9uZSB3b3JkICgyLWJ5dGUpIGZvciBmcmFtZSBsZW5ndGggTi4qLwogCS8qTiB3b3JkcyAoMi1ieXRlKSBjb250YWluaW5nIE4gYml0cyAoYml0IDAgPSAweDAwN2YsIGJpdCAxID0gMHgwMDgxKS4qLwotCVZPQU1SV0JfSVRVICAgICAgICAgPSAxLAorCVZPQU1SV0JfSVRVICAgICAgICAgPSAxLCAKIAkvKk9uZSB3b3JkICgyLWJ5dGUpIGZvciBzeW5jIHdvcmQgKDB4NmIyMSkuKi8KLQkvKk9uZSB3b3JkICgyLWJ5dGUpIHRvIGluZGljYXRlIHRoZSBmcmFtZSB0eXBlLiovCisJLypPbmUgd29yZCAoMi1ieXRlKSB0byBpbmRpY2F0ZSB0aGUgZnJhbWUgdHlwZS4qLwkKIAkvKk9uZSB3b3JkICgyLWJ5dGUpIHRvIGluZGljYXRlIHRoZSBtb2RlLiovCiAJLypOIHdvcmRzICAoMi1ieXRlKSBjb250YWluaW5nIE4gYml0cyAoYml0IDAgPSAweGZmODEsIGJpdCAxID0gMHgwMDdmKS4qLwotCVZPQU1SV0JfUkZDMzI2NwkJPSAyLAkvKiBzZWUgUkZDIDMyNjcgKi8KLSAgICBWT0FNUldCX1RNQVggICAgICAgID0gVk9fTUFYX0VOVU1fVkFMVUUKKwlWT0FNUldCX1JGQzMyNjcJCT0gMiwJLyogc2VlIFJGQyAzMjY3ICovICAKKyAgICBWT0FNUldCX1RNQVggICAgICAgID0gVk9fTUFYX0VOVU1fVkFMVUUJCiB9Vk9BTVJXQkZSQU1FVFlQRTsKIAogCi0jZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9Nb2R1bGUJCQkJCQkJMHg0MjI2MTAwMAorI2RlZmluZSAgICBWT19QSURfQU1SV0JfTW9kdWxlCQkJCQkJCTB4NDIyNjEwMDAgCiAjZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIChWT19QSURfQU1SV0JfTW9kdWxlIHwgMHgwMDAyKQogI2RlZmluZSAgICBWT19QSURfQU1SV0JfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgICAoVk9fUElEX0FNUldCX01vZHVsZSB8IDB4MDAwMykKICNkZWZpbmUgICAgVk9fUElEX0FNUldCX1NBTVBMRVJBVEUgICAgICAgICAgICAgICAgICAgICAgKFZPX1BJRF9BTVJXQl9Nb2R1bGUgfCAweDAwMDQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BdWRpby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQXVkaW8uaAppbmRleCBkODYyOGVlLi4yMWQwY2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BdWRpby5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0F1ZGlvLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogCSAqIFxwYXJhbSBwT3V0SW5mbyBbT1VUXSBUaGUgY29kZWMgZmlsbHMgYXVkaW8gZm9ybWF0IGFuZCB0aGUgaW5wdXQgZGF0YSBzaXplIHVzZWQgaW4gY3VycmVudCBjYWxsLgogCSAqCQkJCQkJIHBPdXRJbmZvLT5JbnB1dFVzZWQgaXMgdG90YWwgdXNlZCBpbnB1dCBkYXRhIHNpemUgaW4gYnl0ZS4KIAkgKiBccmV0dmFsICBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0JICoJCQlWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMLiBUaGUgaW5wdXQgd2FzIGZpbmlzaGVkIG9yIHRoZSBpbnB1dCBkYXRhIHdhcyBub3QgZW5vdWdodC4gQ29udGludWUgdG8gaW5wdXQKKwkgKgkJCVZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwuIFRoZSBpbnB1dCB3YXMgZmluaXNoZWQgb3IgdGhlIGlucHV0IGRhdGEgd2FzIG5vdCBlbm91Z2h0LiBDb250aW51ZSB0byBpbnB1dCAKIAkgKgkJCQkJCQkJCQlkYXRhIGJlZm9yZSBuZXh0IGNhbGwuCiAJICovCiAJVk9fVTMyIChWT19BUEkgKiBHZXRPdXRwdXREYXRhKSAoVk9fSEFORExFIGhDb2RlYywgVk9fQ09ERUNCVUZGRVIgKiBwT3V0QnVmZmVyLCBWT19BVURJT19PVVRQVVRJTkZPICogcE91dEluZm8pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvSW5kZXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0luZGV4LmgKaW5kZXggMzIwYTJmOC4uYTQwOWE2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvSW5kZXguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9JbmRleC5oCkBAIC0xNzMsNyArMTczLDcgQEAKIC8vIE1vZHVsZSBvd24gZXJyb3IgSUQKICNkZWZpbmUgVk9fRVJSX01vZHVsZQkJCQkJMHg4eHh4MFgwMAogKi8KLQorIAogI2RlZmluZQlWT19QSURfQ09NTU9OX0JBU0UJCQkJIDB4NDAwMDAwMDAJCQkJCQkvKiE8IFRoZSBiYXNlIG9mIGNvbW1vbiBwYXJhbSBJRCAqLwogI2RlZmluZQlWT19QSURfQ09NTU9OX1FVRVJZTUVNCQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwMSkJLyohPCBRdWVyeSB0aGUgbWVtb3J5IG5lZWRlZDsgUmVzZXJ2ZWQuICovCiAjZGVmaW5lCVZPX1BJRF9DT01NT05fSU5QVVRUWVBFCQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwMikJLyohPCBTZXQgb3IgZ2V0IHRoZSBpbnB1dCBidWZmZXIgdHlwZS4gVk9fSU5QVVRfVFlQRSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawppbmRleCBjZmI5ZmU0Li42NjkyNTMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpAQCAtMiwxMSArMiwxNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgRzcxMURlY29kZXIuY3BwCisgICAgICAgIFNvZnRHNzExLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKIAotTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscwogCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9nNzExZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvRzcxMURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0c3MTFEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxNGU0ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvRzcxMURlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkc3MTFEZWNvZGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRzcxMURlY29kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgPSAxNjM4NDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1HNzExRGVjb2Rlcjo6RzcxMURlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgewotfQotCi1HNzExRGVjb2Rlcjo6fkc3MTFEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBHNzExRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBtSXNNTGF3ID0gZmFsc2U7Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVykpIHsKLSAgICAgICAgbUlzTUxhdyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigKLSAgICAgICAgICAgIG5ldyBNZWRpYUJ1ZmZlcihrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHNzExRGVjb2Rlcjo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gRzcxMURlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLQotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAoc3JjRm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRzcxMURlY29kZXIiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBHNzExRGVjb2Rlcjo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZWVrVGltZVVzID0gLTE7Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmluQnVmZmVyOwotICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmluQnVmZmVyLCBvcHRpb25zKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpID4ga01heE51bVNhbXBsZXNQZXJGcmFtZSkgewotICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBpbkJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBpbkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGluQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICppbnB1dFB0ciA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopaW5CdWZmZXItPmRhdGEoKSArIGluQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgIE1lZGlhQnVmZmVyICpvdXRCdWZmZXI7Ci0gICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0QnVmZmVyKSwgT0spOwotCi0gICAgaWYgKG1Jc01MYXcpIHsKLSAgICAgICAgRGVjb2RlTUxhdygKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90ICo+KG91dEJ1ZmZlci0+ZGF0YSgpKSwKLSAgICAgICAgICAgICAgICBpbnB1dFB0ciwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBEZWNvZGVBTGF3KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDE2X3QgKj4ob3V0QnVmZmVyLT5kYXRhKCkpLAotICAgICAgICAgICAgICAgIGlucHV0UHRyLCBpbkJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIH0KLQotICAgIC8vIEVhY2ggOC1iaXQgYnl0ZSBpcyBjb252ZXJ0ZWQgaW50byBhIDE2LWJpdCBzYW1wbGUuCi0gICAgb3V0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpICogMik7Ci0KLSAgICBvdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLQotICAgIGluQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgaW5CdWZmZXIgPSBOVUxMOwotCi0gICAgKm91dCA9IG91dEJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIEc3MTFEZWNvZGVyOjpEZWNvZGVBTGF3KAotICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7Ci0gICAgd2hpbGUgKGluU2l6ZS0tID4gMCkgewotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7Ci0gICAgICAgIGl4ICY9IDB4N2Y7Ci0KLSAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKLSAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOwotCi0gICAgICAgIGlmIChpZXhwID4gMCkgewotICAgICAgICAgICAgbWFudCArPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7Ci0KLSAgICAgICAgaWYgKGlleHAgPiAxKSB7Ci0gICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEc3MTFEZWNvZGVyOjpEZWNvZGVNTGF3KAotICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7Ci0gICAgd2hpbGUgKGluU2l6ZS0tID4gMCkgewotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7Ci0gICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OwotICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7Ci0gICAgICAgIG1hbnRpc3NhICY9IDB4MGY7Ci0KLSAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OwotCi0gICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOwotCi0gICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTJjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0RzcxMSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRHNzExLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0RzcxMTo6U29mdEc3MTEoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUlzTUxhdyh0cnVlKSwKKyAgICAgIG1OdW1DaGFubmVscygxKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIikpIHsKKyAgICAgICAgbUlzTUxhdyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiKSk7CisgICAgfQorCisgICAgaW5pdFBvcnRzKCk7Cit9CisKK1NvZnRHNzExOjp+U29mdEc3MTEoKSB7Cit9CisKK3ZvaWQgU29mdEc3MTE6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA4MTkyOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0KKyAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KAorICAgICAgICAgICAgICAgIG1Jc01MYXcKKyAgICAgICAgICAgICAgICAgICAgPyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcKKyAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdHNzExOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworCisgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDgwMDA7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEc3MTE6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChtSXNNTGF3KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0cHRyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICBpZiAobUlzTUxhdykgeworICAgICAgICAgICAgRGVjb2RlTUxhdygKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG91dEhlYWRlci0+cEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGlucHV0cHRyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEZWNvZGVBTGF3KAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRwdHIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBpbkhlYWRlci0+bkZpbGxlZExlbiAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0RzcxMTo6RGVjb2RlQUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0RzcxMTo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OworICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgICBtYW50aXNzYSAmPSAweDBmOworCisgICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEc3MTEobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjBjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0c3MTFfSF8KKworI2RlZmluZSBTT0ZUX0c3MTFfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdEc3MTEgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdEc3MTEoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRHNzExKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDE2Mzg0LAorICAgIH07CisKKyAgICBib29sIG1Jc01MYXc7CisgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworCisgICAgc3RhdGljIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyAgICBzdGF0aWMgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEc3MTEpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0c3MTFfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCmluZGV4IDJkOWJjYzYuLjJmZmE1ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAJTTR2SDI2M0RlY29kZXIuY3BwIFwKICAJc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwIFwKICAJc3JjL2JpdHN0cmVhbS5jcHAgXAogIAlzcmMvYmxvY2tfaWRjdC5jcHAgXApAQCAtNDgsMyArNDcsMjkgQEAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRNUEVHNC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9zcmMgXAorCSQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9NNHZIMjYzRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL000dkgyNjNEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkYjNlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL000dkgyNjNEZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTTR2SDI2M0RlY29kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+IC8vIGZvciBmcmVlCi0jaW5jbHVkZSAiRVNEUy5oIgotI2luY2x1ZGUgIk00dkgyNjNEZWNvZGVyLmgiCi0KLSNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCi0KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTTR2SDI2M0RlY29kZXI6Ok00dkgyNjNEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUhhbmRsZShuZXcgdGFndmlkZW9EZWNDb250cm9scyksCi0gICAgICBtSW5wdXRCdWZmZXIoTlVMTCksCi0gICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKLSAgICAgIG1UYXJnZXRUaW1lVXMoLTEpIHsKLQotICAgIExPR1YoIk00dkgyNjNEZWNvZGVyIik7Ci0gICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7Ci0gICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKLQotICAgIC8vIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVdpZHRoKSk7Ci0gICAgLy8gQ0hFQ0sobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOwotCi0gICAgLy8gV2UnbGwgaWdub3JlIHRoZSBkaW1lbnNpb24gYWR2ZXJ0aXNlZCBieSB0aGUgc291cmNlLCB0aGUgZGVjb2RlcgotICAgIC8vIGFwcGVhcnMgdG8gcmVxdWlyZSB1cyB0byBhbHdheXMgc3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBkaW1lbnNpb25zCi0gICAgLy8gb2YgMzUyIHggMjg4IHRvIG9wZXJhdGUgY29ycmVjdGx5IGFuZCBsYXRlciByZWFjdCB0byBjaGFuZ2VzIGluCi0gICAgLy8gdGhlIGRpbWVuc2lvbnMgYXMgbmVlZGVkLgotICAgIG1XaWR0aCA9IDM1MjsKLSAgICBtSGVpZ2h0ID0gMjg4OwotCi0gICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwotICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOwotICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIk00dkgyNjNEZWNvZGVyIik7Ci19Ci0KLU00dkgyNjNEZWNvZGVyOjp+TTR2SDI2M0RlY29kZXIoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUhhbmRsZTsKLSAgICBtSGFuZGxlID0gTlVMTDsKLX0KLQotdm9pZCBNNHZIMjYzRGVjb2Rlcjo6YWxsb2NhdGVGcmFtZXMoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLSAgICBzaXplX3QgZnJhbWVTaXplID0KLSAgICAgICAgKCgod2lkdGggKyAxNSkgJiAtIDE2KSAqICgoaGVpZ2h0ICsgMTUpICYgLSAxNikgKiAzKSAvIDI7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICAgIG1GcmFtZXNbaV0gPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWVTaXplKTsKLSAgICAgICAgbUZyYW1lc1tpXS0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgfQotCi0gICAgUFZTZXRSZWZlcmVuY2VZVVYoCi0gICAgICAgICAgICBtSGFuZGxlLAotICAgICAgICAgICAgKHVpbnQ4X3QgKiltRnJhbWVzWzFdLT5kYXRhKCkpOwotfQotCi1zdGF0dXNfdCBNNHZIMjYzRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKikgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgIE1QNERlY29kaW5nTW9kZSBtb2RlOwotICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKLSAgICAgICAgbW9kZSA9IE1QRUc0X01PREU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0soIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpOwotICAgICAgICBtb2RlID0gSDI2M19NT0RFOwotICAgIH0KLQotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YSA9IE5VTEw7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFdID0gezB9OwotICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOwotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgRVNEUyBlc2RzKChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgIENIRUNLX0VRKGVzZHMuSW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgY29uc3Qgdm9pZCAqY29kZWNfc3BlY2lmaWNfZGF0YTsKLSAgICAgICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKLSAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YSwgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgdm9sX2RhdGFbMF0gPSAodWludDhfdCAqKSBtYWxsb2MoY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgbWVtY3B5KHZvbF9kYXRhWzBdLCBjb2RlY19zcGVjaWZpY19kYXRhLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICB2b2xfc2l6ZSA9IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7Ci0gICAgICAgIHZvbF9zaXplID0gMDsKLQotICAgIH0KLQotICAgIEJvb2wgc3VjY2VzcyA9IFBWSW5pdFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1XaWR0aCwgbUhlaWdodCwgbW9kZSk7Ci0gICAgaWYgKHZvbF9kYXRhWzBdKSBmcmVlKHZvbF9kYXRhWzBdKTsKLQotICAgIGlmIChzdWNjZXNzICE9IFBWX1RSVUUpIHsKLSAgICAgICAgTE9HVygiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1IYW5kbGUpOwotICAgIGlmIChtb2RlICE9IGFjdHVhbE1vZGUpIHsKLSAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBQVlNldFBvc3RQcm9jVHlwZSgoVmlkZW9EZWNDb250cm9scyAqKSBtSGFuZGxlLCAwKTsKLQotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtSGFuZGxlLCAmd2lkdGgsICZoZWlnaHQpOwotICAgIGlmIChtb2RlID09IEgyNjNfTU9ERSAmJiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkpIHsKLSAgICAgICAgd2lkdGggPSAzNTI7Ci0gICAgICAgIGhlaWdodCA9IDI4ODsKLSAgICB9Ci0gICAgYWxsb2NhdGVGcmFtZXMod2lkdGgsIGhlaWdodCk7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE00dkgyNjNEZWNvZGVyOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgcmVsZWFzZUZyYW1lcygpOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gKFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKSA9PSBQVl9UUlVFKT8gT0s6IFVOS05PV05fRVJST1I7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNNHZIMjYzRGVjb2Rlcjo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zdGF0dXNfdCBNNHZIMjYzRGVjb2Rlcjo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgc2Vla2luZyA9IHRydWU7Ci0gICAgICAgIENIRUNLX0VRKChpbnQpUFZSZXNldFZpZGVvRGVjb2RlcihtSGFuZGxlKSwgUFZfVFJVRSk7Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmlucHV0QnVmZmVyID0gTlVMTDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZpbnB1dEJ1ZmZlciwgb3B0aW9ucyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzZWVraW5nKSB7Ci0gICAgICAgIGludDY0X3QgdGFyZ2V0VGltZVVzOwotICAgICAgICBpZiAoaW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgdGFyZ2V0VGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSB0YXJnZXRUaW1lVXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1aW50OF90ICpiaXRzdHJlYW0gPQotICAgICAgICAodWludDhfdCAqKSBpbnB1dEJ1ZmZlci0+ZGF0YSgpICsgaW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgdWludDMyX3QgdGltZXN0YW1wID0gMHhGRkZGRkZGRjsKLSAgICBpbnQzMl90IGJ1ZmZlclNpemUgPSBpbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gMDsKLSAgICBpZiAoUFZEZWNvZGVWaWRlb0ZyYW1lKAotICAgICAgICAgICAgICAgIG1IYW5kbGUsICZiaXRzdHJlYW0sICZ0aW1lc3RhbXAsICZidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiltRnJhbWVzW21OdW1TYW1wbGVzT3V0cHV0ICYgMHgwMV0tPmRhdGEoKSkKLSAgICAgICAgICAgICE9IFBWX1RSVUUpIHsKLSAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKLQotICAgICAgICBpbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBpbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKLSAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtSGFuZGxlLCAmZGlzcF93aWR0aCwgJmRpc3BfaGVpZ2h0KTsKLQotICAgIGludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OwotICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtSGFuZGxlLCAmYnVmX3dpZHRoLCAmYnVmX2hlaWdodCk7Ci0KLSAgICBpZiAoYnVmX3dpZHRoICE9IG1XaWR0aCB8fCBidWZfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsgIC8vIFRoZSBjbGllbnQgd2lsbCBuZXZlciBnZXQgdG8gc2VlIHRoaXMgZnJhbWUuCi0KLSAgICAgICAgaW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgaW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgIG1XaWR0aCA9IGJ1Zl93aWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGJ1Zl9oZWlnaHQ7Ci0gICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKLSAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgbUhlaWdodCk7Ci0KLSAgICAgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKLSAgICAgICAgQ0hFQ0tfTEUoZGlzcF9oZWlnaHQsIGJ1Zl9oZWlnaHQpOwotCi0gICAgICAgIG1Gb3JtYXQtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCAwLCAwLCBkaXNwX3dpZHRoIC0gMSwgZGlzcF9oZWlnaHQgLSAxKTsKLQotICAgICAgICByZXR1cm4gSU5GT19GT1JNQVRfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgaW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICBpbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBib29sIHNraXBGcmFtZSA9IGZhbHNlOwotCi0gICAgaWYgKG1UYXJnZXRUaW1lVXMgPj0gMCkgewotICAgICAgICBDSEVDSyh0aW1lVXMgPD0gbVRhcmdldFRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKHRpbWVVcyA8IG1UYXJnZXRUaW1lVXMpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBmcmFtZSB3aXRoIHRoZSBtYXRjaGluZwotICAgICAgICAgICAgLy8gdGltZXN0YW1wIGFuZCB3ZSB3b24ndCByZXR1cm4gdGhlIGN1cnJlbnQgb25lLgotICAgICAgICAgICAgc2tpcEZyYW1lID0gdHJ1ZTsKLQotICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJmb3VuZCB0YXJnZXQgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChza2lwRnJhbWUpIHsKLSAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqb3V0ID0gbUZyYW1lc1ttTnVtU2FtcGxlc091dHB1dCAmIDB4MDFdOwotICAgICAgICAoKm91dCktPmFkZF9yZWYoKTsKLSAgICAgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgfQotCi0gICAgKyttTnVtU2FtcGxlc091dHB1dDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNNHZIMjYzRGVjb2Rlcjo6cmVsZWFzZUZyYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihtRnJhbWVzKSAvIHNpemVvZihtRnJhbWVzWzBdKTsgKytpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBtRnJhbWVzW2ldOwotCi0gICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoTlVMTCk7Ci0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIG1GcmFtZXNbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBNNHZIMjYzRGVjb2Rlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIExPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkIik7Ci19Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNlZDVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0TVBFRzQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0TVBFRzQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisKKyNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtNNFZQcm9maWxlTGV2ZWxzW10gPSB7CisgICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDAgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMGIgfSwKKyAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMSB9LAorICAgIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyIH0sCisgICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDMgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKKyAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0TVBFRzQ6OlNvZnRNUEVHNCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTW9kZShNT0RFX01QRUc0KSwKKyAgICAgIG1IYW5kbGUobmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHMpLAorICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtV2lkdGgoMzUyKSwKKyAgICAgIG1IZWlnaHQoMjg4KSwKKyAgICAgIG1Dcm9wTGVmdCgwKSwKKyAgICAgIG1Dcm9wVG9wKDApLAorICAgICAgbUNyb3BSaWdodChtV2lkdGggLSAxKSwKKyAgICAgIG1Dcm9wQm90dG9tKG1IZWlnaHQgLSAxKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpLAorICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQoZmFsc2UpLAorICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiKSkgeworICAgICAgICBtTW9kZSA9IE1PREVfSDI2MzsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiKSk7CisgICAgfQorCisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdE1QRUc0Ojp+U29mdE1QRUc0KCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOworICAgIH0KKworICAgIGRlbGV0ZSBtSGFuZGxlOworICAgIG1IYW5kbGUgPSBOVUxMOworfQorCit2b2lkIFNvZnRNUEVHNDo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1JbnB1dEJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9CisgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KQorICAgICAgICAgICAgPyBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICA6IGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9CisgICAgICAgIG1Nb2RlID09IE1PREVfTVBFRzQgPyBPTVhfVklERU9fQ29kaW5nTVBFRzQgOiBPTVhfVklERU9fQ29kaW5nSDI2MzsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bU91dHB1dEJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGRlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRNUEVHNDo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRNUEVHNDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgKG1Nb2RlID09IE1PREVfTVBFRzQpCisgICAgICAgICAgICAgICAgICAgICAgICA/IE9NWF9WSURFT19Db2RpbmdNUEVHNCA6IE9NWF9WSURFT19Db2RpbmdIMjYzOworCisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLX0VRKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCwgMXUpOworCisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopIHBhcmFtczsKKworICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCAhPSAwKSB7ICAvLyBJbnB1dCBwb3J0IG9ubHkKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHBvcnQgaW5kZXg6ICVsZCIsIHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IHByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleDsKKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX0gyNjMpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgblByb2ZpbGVMZXZlbHMgPQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa0gyNjNQcm9maWxlTGV2ZWxzKSAvIHNpemVvZihrSDI2M1Byb2ZpbGVMZXZlbHNbMF0pOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBuUHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBrSDI2M1Byb2ZpbGVMZXZlbHNbaW5kZXhdLm1Qcm9maWxlOworICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZUxldmVsID0ga0gyNjNQcm9maWxlTGV2ZWxzW2luZGV4XS5tTGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNpemVfdCBuUHJvZmlsZUxldmVscyA9CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihrTTRWUHJvZmlsZUxldmVscykgLyBzaXplb2Yoa000VlByb2ZpbGVMZXZlbHNbMF0pOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBuUHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBrTTRWUHJvZmlsZUxldmVsc1tpbmRleF0ubVByb2ZpbGU7CisgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBrTTRWUHJvZmlsZUxldmVsc1tpbmRleF0ubUxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVBFRzQ6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9NUEVHNCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE1QRUc0OjpnZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3A6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgKnJlY3RQYXJhbXMgPSAoT01YX0NPTkZJR19SRUNUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHJlY3RQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY3RQYXJhbXMtPm5MZWZ0ID0gbUNyb3BMZWZ0OworICAgICAgICAgICAgcmVjdFBhcmFtcy0+blRvcCA9IG1Dcm9wVG9wOworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bldpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uSGVpZ2h0ID0gbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDE7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIFBvcnRJbmZvICpwb3J0ID0gZWRpdFBvcnRJbmZvKDEpOworCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPQorICAgICAgICAgICAgcG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChtTnVtU2FtcGxlc091dHB1dCAmIDEpLm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBMaXN0PEJ1ZmZlckluZm8gKj46Oml0ZXJhdG9yIGl0ID0gb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKml0OworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2UoaXQpOworICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV07CisgICAgICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOworCisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CisgICAgICAgICAgICAgICAgdm9sX3NpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVA0RGVjb2RpbmdNb2RlIG1vZGUgPQorICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisKKyAgICAgICAgICAgIEJvb2wgc3VjY2VzcyA9IFBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LCBtb2RlKTsKKworICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgTE9HVygiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobUhhbmRsZSk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBhY3R1YWxNb2RlKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZSgoVmlkZW9EZWNDb250cm9scyAqKSBtSGFuZGxlLCAwKTsKKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFICYmIHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICAgICAgICBQb3J0SW5mbyAqcG9ydCA9IGVkaXRQb3J0SW5mbygxKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KDEpLm1IZWFkZXI7CisKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1IYW5kbGUsIG91dEhlYWRlci0+cEJ1ZmZlcik7CisKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChpbkhlYWRlci0+bk9mZnNldCA9PSAwKTsKKworICAgICAgICAvLyBkZWNvZGVyIGRlYWxzIGluIG1zLCBPTVggaW4gdXMuCisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9CisgICAgICAgICAgICB1c2VFeHRUaW1lc3RhbXAgPyAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMCA6IDB4RkZGRkZGRkY7CisKKyAgICAgICAgaW50MzJfdCBidWZmZXJTaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaWYgKFBWRGVjb2RlVmlkZW9GcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgJmJpdHN0cmVhbSwgJnRpbWVzdGFtcCwgJmJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+cEJ1ZmZlcikgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlY29kZXIgZGVhbHMgaW4gbXMsIE9NWCBpbiB1cy4KKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gdGltZXN0YW1wICogMTAwMDsKKworICAgICAgICBDSEVDS19MRShidWZmZXJTaXplLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gYnVmZmVyU2l6ZTsKKyAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSBidWZmZXJTaXplOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICB3aGlsZSAoKCppdCktPm1IZWFkZXIgIT0gb3V0SGVhZGVyKSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICppdDsKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShpdCk7CisgICAgICAgIG91dEluZm8gPSBOVUxMOworCisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICB9Cit9CisKK2Jvb2wgU29mdE1QRUc0Ojpwb3J0U2V0dGluZ3NDaGFuZ2VkKCkgeworICAgIGludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CisgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobUhhbmRsZSwgJmRpc3Bfd2lkdGgsICZkaXNwX2hlaWdodCk7CisKKyAgICBpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKKyAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobUhhbmRsZSwgJmJ1Zl93aWR0aCwgJmJ1Zl9oZWlnaHQpOworCisgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKKyAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CisKKyAgICBMT0dWKCJkaXNwX3dpZHRoID0gJWQsIGRpc3BfaGVpZ2h0ID0gJWQsIGJ1Zl93aWR0aCA9ICVkLCBidWZfaGVpZ2h0ID0gJWQiLAorICAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CisKKyAgICBpZiAobUNyb3BSaWdodCAhPSBkaXNwX3dpZHRoIC0gMQorICAgICAgICAgICAgfHwgbUNyb3BCb3R0b20gIT0gZGlzcF9oZWlnaHQgLSAxKSB7CisgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgbUNyb3BSaWdodCA9IGRpc3Bfd2lkdGggLSAxOworICAgICAgICBtQ3JvcEJvdHRvbSA9IGRpc3BfaGVpZ2h0IC0gMTsKKworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgaWYgKGJ1Zl93aWR0aCAhPSBtV2lkdGggfHwgYnVmX2hlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGJ1Zl93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGJ1Zl9oZWlnaHQ7CisKKyAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfSDI2MykgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU29mdE1QRUc0OjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQ0hFQ0tfRVEoKGludClQVlJlc2V0VmlkZW9EZWNvZGVyKG1IYW5kbGUpLCAoaW50KVBWX1RSVUUpOworICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0TVBFRzQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgICgoKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICsgMTUpICYgLTE2KQorICAgICAgICAgICAgKiAoKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCArIDE1KSAmIC0xNikgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdE1QRUc0KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMDhhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9NUEVHNF9IXworCisjZGVmaW5lIFNPRlRfTVBFRzRfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRNUEVHNCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0TVBFRzQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRNUEVHNCgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICA9IDQsCisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE1PREVfTVBFRzQsCisgICAgICAgIE1PREVfSDI2MywKKworICAgIH0gbU1vZGU7CisKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptSGFuZGxlOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbTsKKworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisKKyAgICBpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfTVBFRzRfSF8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL000dkgyNjNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTTR2SDI2M0VuY29kZXIuY3BwCmluZGV4IDE1ZWQyMTkuLmQ3MjQ5YzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTTR2SDI2M0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTTR2SDI2M0VuY29kZXIuY3BwCkBAIC0zOTgsMTAgKzM5OCwxMyBAQAogICAgIH0KIAogICAgIC8vIFJlYWR5IGZvciBhY2NlcHRpbmcgYW4gaW5wdXQgdmlkZW8gZnJhbWUKLSAgICBpZiAoT0sgIT0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKSkgewotICAgICAgICBMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGRhdGEgc291cmNlIik7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKKyAgICBpZiAoT0sgIT0gZXJyKSB7CisgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlYWQgZnJvbSBkYXRhIHNvdXJjZSIpOworICAgICAgICB9CiAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKICAgICBpZiAobUlucHV0QnVmZmVyLT5zaXplKCkgLSAoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMykgPj4gMSkgIT0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCmluZGV4IDc1MzUwMGUuLmEwOGM5ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgTVAzRGVjb2Rlci5jcHAgXAogCXNyYy9wdm1wM19ub3JtYWxpemUuY3BwIFwKICAJc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAgXAogIAlzcmMvcHZtcDNfY3JjLmNwcCBcCkBAIC01NywzICs1NiwyNiBAQAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0TVAzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tcDNkZWMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXAzZGVjCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NUDNEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkZDc0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTVAzRGVjb2Rlci5oIgotCi0jaW5jbHVkZSAiaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTVAzRGVjb2Rlcjo6TVAzRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1CdWZmZXJHcm91cChOVUxMKSwKLSAgICAgIG1Db25maWcobmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbCksCi0gICAgICBtRGVjb2RlckJ1ZihOVUxMKSwKLSAgICAgIG1BbmNob3JUaW1lVXMoMCksCi0gICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAotICAgICAgbUlucHV0QnVmZmVyKE5VTEwpIHsKLSAgICBpbml0KCk7Ci19Ci0KLXZvaWQgTVAzRGVjb2Rlcjo6aW5pdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiTVAzRGVjb2RlciIpOwotfQotCi1NUDNEZWNvZGVyOjp+TVAzRGVjb2RlcigpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLQotICAgIGRlbGV0ZSBtQ29uZmlnOwotICAgIG1Db25maWcgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBNUDNEZWNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoNDYwOCAqIDIpKTsKLQotICAgIG1Db25maWctPmVxdWFsaXplclR5cGUgPSBmbGF0OwotICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKLQotICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOwotCi0gICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwotCi0gICAgbVNvdXJjZS0+c3RhcnQoKTsKLQotICAgIG1BbmNob3JUaW1lVXMgPSAwOwotICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVAzRGVjb2Rlcjo6c3RvcCgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyKSB7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGZyZWUobURlY29kZXJCdWYpOwotICAgIG1EZWNvZGVyQnVmID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUDNEZWNvZGVyOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBNUDNEZWNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwotCi0gICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgZG9lcyBub3Qgc3RpbGwKLSAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgotICAgICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2Vla1RpbWVVcyA9IC0xOwotICAgIH0KLQotICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsIG9wdGlvbnMpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBhIG5ldyB0aW1lc3RhbXAgYWZ0ZXIgc2Vla2luZy4KLSAgICAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgT0spOwotCi0gICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0KLSAgICAgICAgKHVpbnQ4X3QgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKLSAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOwotCi0gICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gYnVmZmVyLT5zaXplKCkgLyBzaXplb2YoaW50MTZfdCk7Ci0gICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHN0YXRpY19jYXN0PGludDE2X3QgKj4oYnVmZmVyLT5kYXRhKCkpOwotCi0gICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOwotICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCi0gICAgICAgICAgICAhPSBOT19ERUNPRElOR19FUlJPUikgewotICAgICAgICBMT0dWKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwotCi0gICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAotICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlci0+ZGF0YSgpLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKLQotICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCwKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOwotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLAotICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7Ci0KLSAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIG1OdW1DaGFubmVsczsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZjODhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE1QMyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRNUDMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKKyAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKK30KKworU29mdE1QMzo6U29mdE1QMygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQ29uZmlnKG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwpLAorICAgICAgbURlY29kZXJCdWYoTlVMTCksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1OdW1DaGFubmVscygyKSwKKyAgICAgIG1TYW1wbGluZ1JhdGUoNDQxMDApLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGluaXRQb3J0cygpOworICAgIGluaXREZWNvZGVyKCk7Cit9CisKK1NvZnRNUDM6On5Tb2Z0TVAzKCkgeworICAgIGlmIChtRGVjb2RlckJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICBtRGVjb2RlckJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgZGVsZXRlIG1Db25maWc7CisgICAgbUNvbmZpZyA9IE5VTEw7Cit9CisKK3ZvaWQgU29mdE1QMzo6aW5pdFBvcnRzKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDA7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPQorICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ01QMzsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgIGFkZFBvcnQoZGVmKTsKK30KKwordm9pZCBTb2Z0TVAzOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICBtQ29uZmlnLT5jcmNFbmFibGVkID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRNUDM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIFNvZnRNUDM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworCisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CisKKyAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIExPR1YoIm1wMyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICAgICAgaWYgKG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk91dHB1dCBmcmFtZSBzaXplIGlzIDAiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCisgICAgICAgICAgICBtZW1zZXQob3V0SGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIH0gZWxzZSBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IG1TYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbU51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworCisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKKyAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisKKyAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOworICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgbU51bUZyYW1lc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBtTnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE1QMzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE1QMzo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAocG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRNUDMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQwNjgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9NUDNfSF8KKworI2RlZmluZSBTT0ZUX01QM19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0TVAzIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRNUDMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga091dHB1dEJ1ZmZlclNpemUgPSA0NjA4ICogMgorICAgIH07CisKKyAgICB0UFZNUDNEZWNvZGVyRXh0ZXJuYWwgKm1Db25maWc7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKKworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKKworICAgIGJvb2wgbUNvbmZpZ3VyZWQ7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgdm9pZCBpbml0RGVjb2RlcigpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QMyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfTVAzX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKaW5kZXggYjc2OWYwZC4uMzJiYmQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCkBAIC0yLDE1ICsyLDIzIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgVlBYRGVjb2Rlci5jcHAKLQotTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3ZweGRlYworICAgICAgICBTb2Z0VlBYLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4IFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfY29kZWMgXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9wb3J0cworICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9wb3J0cyBcCisgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCiAKLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJ2cHgKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODMxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdFZQWCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRWUFguaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRWUFg6OlNvZnRWUFgoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUN0eChOVUxMKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdFZQWDo6flNvZnRWUFgoKSB7CisgICAgdnB4X2NvZGVjX2Rlc3Ryb3koKHZweF9jb2RlY19jdHhfdCAqKW1DdHgpOworICAgIGRlbGV0ZSAodnB4X2NvZGVjX2N0eF90ICopbUN0eDsKKyAgICBtQ3R4ID0gTlVMTDsKK30KKwordm9pZCBTb2Z0VlBYOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9WSURFT19WUFgpOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlBYOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGRlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXRpYyBpbnQgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGludCBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIExPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBTb2Z0VlBYOjppbml0RGVjb2RlcigpIHsKKyAgICBtQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICB2cHhfY29kZWNfZGVjX2NmZ190IGNmZzsKKyAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHZweF9jb2RlY19kZWNfY2ZnX3QpKTsKKyAgICBjZmcudGhyZWFkcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIGlmICgodnB4X2VyciA9IHZweF9jb2RlY19kZWNfaW5pdCgKKyAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJnZweF9jb2RlY192cDhfZHhfYWxnbywgJmNmZywgMCkpKSB7CisgICAgICAgIExPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgdnB4X2Vycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0VlBYOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlBYOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXgsIDF1KTsKKworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0VlBYOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLnZweCIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK3ZvaWQgU29mdFZQWDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICAgICAgTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKyAgICAgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKKworICAgICAgICBpZiAoaW1nICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGltZy0+Zm10LCBJTUdfRk1UX0k0MjApOworCisgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gaW1nLT5kX3c7CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgICAgICBpZiAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfWV07CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyk7CisKKyAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ldOworICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfVV07CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oIC8gMjsgKytpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfVV07CisgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93IC8gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfVl07CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oIC8gMjsgKytpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfVl07CisgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93IC8gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBTb2Z0VlBYOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworfQorCit2b2lkIFNvZnRWUFg6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0VlBYOjp1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbygwKS0+bURlZjsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKDEpLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZi0+bkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgKKyAgICAgICAgICAgICogZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRWUFgobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MTRhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX1ZQWF9IXworCisjZGVmaW5lIFNPRlRfVlBYX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRWUFggOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdFZQWChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdFZQWCgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA0CisgICAgfTsKKworICAgIHZvaWQgKm1DdHg7CisKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZQWCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfVlBYX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9WUFhEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1ZQWERlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODllNWFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1ZQWERlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZQWERlY29kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJWUFhEZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0jaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCi0jaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgotI2luY2x1ZGUgInZweC92cDhkeC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZQWERlY29kZXI6OlZQWERlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtQnVmZmVyU2l6ZSgwKSwKLSAgICAgIG1DdHgoTlVMTCksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCi0gICAgICBtVGFyZ2V0VGltZVVzKC0xKSB7Ci0gICAgc3A8TWV0YURhdGE+IGlucHV0Rm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlBYKSk7Ci0KLSAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1IZWlnaHQpKTsKLQotICAgIG1CdWZmZXJTaXplID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7Ci0KLSAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwotICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKLSAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKLSAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOwotICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJWUFhEZWNvZGVyIik7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICB9Ci19Ci0KLVZQWERlY29kZXI6On5WUFhEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWUFhEZWNvZGVyOjpzdGFydChNZXRhRGF0YSAqKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7Ci0gICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7Ci0gICAgaWYgKCh2cHhfZXJyID0gdnB4X2NvZGVjX2RlY19pbml0KAotICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvLCBOVUxMLCAwKSkpIHsKLSAgICAgICAgTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKLQotICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtQnVmZmVyU2l6ZSkpOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobUJ1ZmZlclNpemUpKTsKLQotICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVlBYRGVjb2Rlcjo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIHZweF9jb2RlY19kZXN0cm95KCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4KTsKLSAgICBkZWxldGUgKHZweF9jb2RlY19jdHhfdCAqKW1DdHg7Ci0gICAgbUN0eCA9IE5VTEw7Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVlBYRGVjb2Rlcjo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWUFhEZWNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHNlZWtpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICppbnB1dDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZpbnB1dCwgb3B0aW9ucyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgTE9HVigicmVhZCAlZCBieXRlcyBmcm9tIHNvdXJjZVxuIiwgaW5wdXQtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgIGlmIChzZWVraW5nKSB7Ci0gICAgICAgIGludDY0X3QgdGFyZ2V0VGltZVVzOwotICAgICAgICBpZiAoaW5wdXQtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgdGFyZ2V0VGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSB0YXJnZXRUaW1lVXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgKLSAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKLSAgICAgICAgICAgICAgICAodWludDhfdCAqKWlucHV0LT5kYXRhKCkgKyBpbnB1dC0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgaW5wdXQtPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgMCkpIHsKLSAgICAgICAgTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKLSAgICAgICAgaW5wdXQtPnJlbGVhc2UoKTsKLSAgICAgICAgaW5wdXQgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIExPR1YoInN1Y2Nlc3NmdWxseSBkZWNvZGVkIDEgb3IgbW9yZSBmcmFtZXMuIik7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhpbnB1dC0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgaW5wdXQtPnJlbGVhc2UoKTsKLSAgICBpbnB1dCA9IE5VTEw7Ci0KLSAgICBib29sIHNraXBGcmFtZSA9IGZhbHNlOwotCi0gICAgaWYgKG1UYXJnZXRUaW1lVXMgPj0gMCkgewotICAgICAgICBDSEVDSyh0aW1lVXMgPD0gbVRhcmdldFRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKHRpbWVVcyA8IG1UYXJnZXRUaW1lVXMpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBmcmFtZSB3aXRoIHRoZSBtYXRjaGluZwotICAgICAgICAgICAgLy8gdGltZXN0YW1wIGFuZCB3ZSB3b24ndCByZXR1cm4gdGhlIGN1cnJlbnQgb25lLgotICAgICAgICAgICAgc2tpcEZyYW1lID0gdHJ1ZTsKLQotICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJmb3VuZCB0YXJnZXQgZnJhbWUgYXQgJWxsZCB1cyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChza2lwRnJhbWUpIHsKLSAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7Ci0gICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKLQotICAgIGlmIChpbWcgPT0gTlVMTCkgewotICAgICAgICAvLyBUaGUgVlBYIGZvcm1hdCBzdXBwb3J0cyAiaW50ZXJuYWwtb25seSIgZnJhbWVzIHRoYXQgYXJlCi0gICAgICAgIC8vIHJlZmVyZW5jZWQgYnkgZnV0dXJlIGNvbnRlbnQgYnV0IG5ldmVyIGFjdHVhbGx5IGRpc3BsYXllZCwgc28KLSAgICAgICAgLy8gdGhpcyBpcyBhIHBlcmZlY3RseSB2YWxpZCBzY2VuYXJpby4KLQotICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoaW1nLT5mbXQsIElNR19GTVRfSTQyMCk7Ci0KLSAgICBpbnQzMl90IHdpZHRoID0gaW1nLT5kX3c7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSBpbWctPmRfaDsKLQotICAgIGlmICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgTE9HSSgiSW1hZ2UgZGltZW5zaW9ucyBjaGFuZ2VkLCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCIsCi0gICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgbVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotCi0gICAgICAgIG1CdWZmZXJTaXplID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7Ci0gICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgICAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1CdWZmZXJTaXplKSk7Ci0gICAgICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobUJ1ZmZlclNpemUpKTsKLQotICAgICAgICByZXR1cm4gSU5GT19GT1JNQVRfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0OwotICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dHB1dCksIE9LKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1ldOwotICAgIHVpbnQ4X3QgKmRzdCA9ICh1aW50OF90ICopb3V0cHV0LT5kYXRhKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaDsgKytpKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93KTsKLQotICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ldOwotICAgICAgICBkc3QgKz0gaW1nLT5kX3c7Ci0gICAgfQotCi0gICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfVV07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOwotCi0gICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfVV07Ci0gICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgfQotCi0gICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfVl07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOwotCi0gICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfVl07Ci0gICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgfQotCi0gICAgb3V0cHV0LT5zZXRfcmFuZ2UoMCwgKHdpZHRoICogaGVpZ2h0ICogMykgLyAyKTsKLQotICAgIG91dHB1dC0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgKm91dCA9IG91dHB1dDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNjODc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMjcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCS4vc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgXAorCS4vc291cmNlL2gyNjRic2RfdXRpbC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgXAorCS4vc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgXAorCS4vc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgXAorCS4vc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RwYi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF92dWkuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVjb2Rlci5jIFwKKwkuL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBcCisJU29mdEFWQy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi9pbmMgXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTVlfQVNNIDo9IFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBcCisJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCisKKworTVlfT01YRExfQ19TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCisKK01ZX09NWERMX0FTTV9TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIFwKKworCitpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgICBMT0NBTF9BUk1fTkVPTiAgIDo9IHRydWUKKyMgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtc3RkPWM5OSAtRC5fTkVPTiAtRC5fT01YREwKKyAgICBMT0NBTF9DRkxBR1MgICAgIDo9IC1ESDI2NERFQ19ORU9OIC1ESDI2NERFQ19PTVhETAorICAgIExPQ0FMX1NSQ19GSUxFUyAgKz0gJChNWV9BU00pICQoTVlfT01YRExfQ19TUkMpICQoTVlfT01YRExfQVNNX1NSQykKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYworICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL2FwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvYXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkKK2VuZGlmCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IHV0aWxpdHk6IGRlY29kZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIFRlc3QgYXBwbGljYXRpb24KKyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IC4vc291cmNlL0RlY1Rlc3RCZW5jaC5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKKworTE9DQUxfTU9EVUxFIDo9IGRlY29kZXIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDBjOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdEFWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0QVZDOjpTb2Z0QVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1IYW5kbGUoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbVBpY3R1cmVTaXplKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksCisgICAgICBtQ3JvcExlZnQoMCksCisgICAgICBtQ3JvcFRvcCgwKSwKKyAgICAgIG1Dcm9wV2lkdGgobVdpZHRoKSwKKyAgICAgIG1Dcm9wSGVpZ2h0KG1IZWlnaHQpLAorICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKKyAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCisgICAgICBtUGljSWQoMCksCisgICAgICBtSGVhZGVyc0RlY29kZWQoZmFsc2UpLAorICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0QVZDOjp+U29mdEFWQygpIHsKKyAgICBIMjY0U3dEZWNSZWxlYXNlKG1IYW5kbGUpOworICAgIG1IYW5kbGUgPSBOVUxMOworCisgICAgd2hpbGUgKG1QaWNUb0hlYWRlck1hcC5zaXplKCkgIT0gMCkgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLmVkaXRWYWx1ZUF0KDApOworICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyID0gTlVMTDsKKyAgICB9CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKKyAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOworCisgICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKK30KKwordm9pZCBTb2Z0QVZDOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga0lucHV0UG9ydEluZGV4OworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtSW5wdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAxOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGFkZFBvcnQoZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0ga091dHB1dFBvcnRJbmRleDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOworICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKworICAgIGRlZi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBkZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAoZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0QVZDOjppbml0RGVjb2RlcigpIHsKKyAgICAvLyBGb3JjZSBkZWNvZGVyIHRvIG91dHB1dCBidWZmZXJzIGluIGRpc3BsYXkgb3JkZXIuCisgICAgaWYgKEgyNjRTd0RlY0luaXQoJm1IYW5kbGUsIDApID09IEgyNjRTV0RFQ19PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IGtJbnB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0soZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcHJvZmlsZUxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopIHBhcmFtczsKKworICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCAhPSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHBvcnQgaW5kZXg6ICVsZCIsIHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IHByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleDsKKyAgICAgICAgICAgIHNpemVfdCBuUHJvZmlsZUxldmVscyA9CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihrUHJvZmlsZUxldmVscykgLyBzaXplb2Yoa1Byb2ZpbGVMZXZlbHNbMF0pOworICAgICAgICAgICAgaWYgKGluZGV4ID49IG5Qcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IGtQcm9maWxlTGV2ZWxzW2luZGV4XS5tUHJvZmlsZTsKKyAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZUxldmVsID0ga1Byb2ZpbGVMZXZlbHNbaW5kZXhdLm1MZXZlbDsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmdldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcmVjdFBhcmFtcyA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocmVjdFBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkxlZnQgPSBtQ3JvcExlZnQ7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uVG9wID0gbUNyb3BUb3A7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uV2lkdGggPSBtQ3JvcFdpZHRoOworICAgICAgICAgICAgcmVjdFBhcmFtcy0+bkhlaWdodCA9IG1Dcm9wSGVpZ2h0OworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCisgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKKworICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgeworICAgICAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICsrbVBpY0lkOworICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOworICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIGhlYWRlci0+bkZsYWdzID0gaW5IZWFkZXItPm5GbGFnczsKKyAgICAgICAgbVBpY1RvSGVhZGVyTWFwLmFkZChtUGljSWQsIGhlYWRlcik7CisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBIMjY0U3dEZWNJbnB1dCBpblBpY3R1cmU7CisgICAgICAgIEgyNjRTd0RlY091dHB1dCBvdXRQaWN0dXJlOworICAgICAgICBtZW1zZXQoJmluUGljdHVyZSwgMCwgc2l6ZW9mKGluUGljdHVyZSkpOworICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGluUGljdHVyZS5waWNJZCA9IG1QaWNJZDsKKyAgICAgICAgaW5QaWN0dXJlLmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAxOworICAgICAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY29kZWRQaWN0dXJlOworCisgICAgICAgIHdoaWxlIChpblBpY3R1cmUuZGF0YUxlbiA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShtSGFuZGxlLCAmaW5QaWN0dXJlLCAmb3V0UGljdHVyZSk7CisgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSB8fAorICAgICAgICAgICAgICAgIHJldCA9PSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSkgeworICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuIC09ICh1MzIpKG91dFBpY3R1cmUucFN0cm1DdXJyUG9zIC0gaW5QaWN0dXJlLnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gb3V0UGljdHVyZS5wU3RybUN1cnJQb3M7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNEZWNvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoaXMgb3V0cHV0IGJ1ZmZlcjsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3N0IGR1cmluZyBkeW5hbWljIHBvcnQgcmVjb25maWd1cmF0aW9uIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5NQVggY2xpZW50IHdpbGwgZGVsZXRlIF9hbGxfIG91dHB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5waWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRGVjb2RlciBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaXJzdFBpY3R1cmUgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGRyYWluT25lT3V0cHV0QnVmZmVyKG1GaXJzdFBpY3R1cmVJZCwgbUZpcnN0UGljdHVyZSk7CisgICAgICAgICAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOworICAgICAgICAgICAgbUZpcnN0UGljdHVyZSA9IE5VTEw7CisgICAgICAgICAgICBtRmlyc3RQaWN0dXJlSWQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIG1IZWFkZXJzRGVjb2RlZCAmJgorICAgICAgICAgICAgICAgIEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPT0gSDI2NFNXREVDX1BJQ19SRFkpIHsKKworICAgICAgICAgICAgaW50MzJfdCBwaWNJZCA9IGRlY29kZWRQaWN0dXJlLnBpY0lkOworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIGRlY29kZWRQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOworICAgICAgICAgICAgZHJhaW5PbmVPdXRwdXRCdWZmZXIocGljSWQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVyciwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgU29mdEFWQzo6aGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKSB7CisgICAgaWYgKG1XaWR0aCAhPSBpbmZvLT5waWNXaWR0aCB8fCBtSGVpZ2h0ICE9IGluZm8tPnBpY0hlaWdodCkgeworICAgICAgICBtV2lkdGggID0gaW5mby0+cGljV2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBpbmZvLT5waWNIZWlnaHQ7CisgICAgICAgIG1QaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTb2Z0QVZDOjpoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMgKmNyb3ApIHsKKyAgICBpZiAobUNyb3BMZWZ0ICE9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0IHx8CisgICAgICAgIG1Dcm9wVG9wICE9IGNyb3AtPmNyb3BUb3BPZmZzZXQgfHwKKyAgICAgICAgbUNyb3BXaWR0aCAhPSBjcm9wLT5jcm9wT3V0V2lkdGggfHwKKyAgICAgICAgbUNyb3BIZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgeworICAgICAgICBtQ3JvcExlZnQgPSBjcm9wLT5jcm9wTGVmdE9mZnNldDsKKyAgICAgICAgbUNyb3BUb3AgPSBjcm9wLT5jcm9wVG9wT2Zmc2V0OworICAgICAgICBtQ3JvcFdpZHRoID0gY3JvcC0+Y3JvcE91dFdpZHRoOworICAgICAgICBtQ3JvcEhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7CisKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsCisgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgeworICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7CisgICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7CisKKyAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbbVBpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgbVBpY3R1cmVTaXplKTsKK30KKwordm9pZCBTb2Z0QVZDOjpkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90KiBkYXRhKSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaGVhZGVyLT5uVGltZVN0YW1wOworICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICBkYXRhLCBtUGljdHVyZVNpemUpOworICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKKyAgICBkZWxldGUgaGVhZGVyOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworfQorCitib29sIFNvZnRBVkM6OmRyYWluQWxsT3V0cHV0QnVmZmVycygpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChtSGVhZGVyc0RlY29kZWQgJiYKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZID09CisgICAgICAgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAxIC8qIGZsdXNoICovKSkgeworCisgICAgICAgICAgICBpbnQzMl90IHBpY0lkID0gZGVjb2RlZFBpY3R1cmUucGljSWQ7CisgICAgICAgICAgICBDSEVDSyhtUGljVG9IZWFkZXJNYXAuaW5kZXhPZktleShwaWNJZCkgPj0gMCk7CisKKyAgICAgICAgICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgbVBpY3R1cmVTaXplKTsKKworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOworICAgICAgICAgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOworICAgICAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEOworICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIHN3aXRjaCAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFXQUlUSU5HX0RJU0FCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyghZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlLCAoaW50KUFXQUlUSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgQ0hFQ0soZW5hYmxlZCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aAorICAgICAgICAgICAgKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEFWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M4NWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9BVkNfSF8KKworI2RlZmluZSBTT0ZUX0FWQ19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ICAgPSAwLAorICAgICAgICBrT3V0cHV0UG9ydEluZGV4ICA9IDEsCisgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgID0gOCwKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAyLAorICAgIH07CisKKyAgICBlbnVtIEVPU1N0YXR1cyB7CisgICAgICAgIElOUFVUX0RBVEFfQVZBSUxBQkxFLAorICAgICAgICBJTlBVVF9FT1NfU0VFTiwKKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVELAorICAgIH07CisKKyAgICB2b2lkICptSGFuZGxlOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtUGljdHVyZVNpemU7CisgICAgdWludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcDsKKyAgICB1aW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKKworICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7CisgICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7CisKKyAgICBpbnQzMl90IG1QaWNJZDsgIC8vIFdoaWNoIG91dHB1dCBwaWN0dXJlIGlzIGZvciB3aGljaCBpbnB1dCBidWZmZXI/CisKKyAgICAvLyBPTVhfQlVGRkVSSEVBREVSVFlQRSBtYXkgYmUgb3ZlcmtpbGwsIGJ1dCBpdCBpcyBjb252ZW5pZW50CisgICAgLy8gZm9yIHRyYWNraW5nIHRoZSBmb2xsb3dpbmcgZmllbGRzOiBuRmxhZ3MsIG5UaW1lU3RhbXAsIGV0Yy4KKyAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqPiBtUGljVG9IZWFkZXJNYXA7CisgICAgYm9vbCBtSGVhZGVyc0RlY29kZWQ7CisKKyAgICBFT1NTdGF0dXMgbUVPU1N0YXR1czsKKworICAgIGVudW0gT3V0cHV0UG9ydFNldHRpbmdDaGFuZ2UgeworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH07CisgICAgT3V0cHV0UG9ydFNldHRpbmdDaGFuZ2UgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgIGJvb2wgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCk7CisgICAgdm9pZCBkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpZElkLCB1aW50OF90ICpkYXRhKTsKKyAgICBib29sIGhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyogY3JvcCk7CisgICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfQVZDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvSDI2NFN3RGVjQXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlMTEyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIEhlYWRlcnMKKworICAgIDIuIEVudW1lcmF0aW9ucyB1c2VkIGFzIGEgcmV0dXJuIHZhbHVlIG9yIGEgcGFyYW1ldGVyLgorICAgICAgICAyLjEuIEFQSSdzIHJldHVybiB2YWx1ZSBlbnVtZXJhdGlvbnMuCisKKyAgICAzLiBVc2VyIFN0cnVjdHVyZXMKKyAgICAgICAgMy4xLiBTdHJ1Y3R1cmVzIGZvciBIMjY0U3dEZWNEZWNvZGUoKSBwYXJhbWV0ZXJzLgorICAgICAgICAzLjIuIFN0cnVjdHVyZXMgZm9yIGluZm9ybWF0aW9uIGludGVyY2hhbmdlIHdpdGgKKyAgICAgICAgICAgICBERUMgQVBJIGFuZCB1c2VyIGFwcGxpY2F0aW9uLgorCisgICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNBUElfSAorI2RlZmluZSBIMjY0U1dERUNBUElfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgSGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuMS4gQVBJJ3MgcmV0dXJuIHZhbHVlIGVudW1lcmF0aW9ucy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIEgyNjRTV0RFQ19PSyA9IDAsCisgICAgICAgIEgyNjRTV0RFQ19TVFJNX1BST0NFU1NFRCA9IDEsCisgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZLAorICAgICAgICBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSwKKyAgICAgICAgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZLAorICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSID0gLTEsCisgICAgICAgIEgyNjRTV0RFQ19TVFJNX0VSUiA9IC0yLAorICAgICAgICBIMjY0U1dERUNfTk9UX0lOSVRJQUxJWkVEID0gLTMsCisgICAgICAgIEgyNjRTV0RFQ19NRU1GQUlMID0gLTQsCisgICAgICAgIEgyNjRTV0RFQ19JTklURkFJTCA9IC01LAorICAgICAgICBIMjY0U1dERUNfSERSU19OT1RfUkRZID0gLTYsCisgICAgICAgIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEID0gLTcKKyAgICB9IEgyNjRTd0RlY1JldDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLjEuIFN0cnVjdHVyZXMgZm9yIEgyNjRTd0RlY0RlY29kZSgpIHBhcmFtZXRlcnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogdHlwZWRlZiBvZiB0aGUgRGVjb2RlciBpbnN0YW5jZSAqLworICAgIHR5cGVkZWYgdm9pZCAqSDI2NFN3RGVjSW5zdDsKKworICAgIC8qIElucHV0IHN0cnVjdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1OCAgKnBTdHJlYW07ICAgICAgICAgICAgLyogUG9pbnRlciB0byBzdHJlYW0gdG8gYmUgZGVjb2RlZCAgICAgICAgICAqLworICAgICAgICB1MzIgIGRhdGFMZW47ICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGRlY29kZWQgICAgICAgICAgICAqLworICAgICAgICB1MzIgIHBpY0lkOyAgICAgICAgICAgICAgLyogSWRlbnRpZmllciBmb3IgdGhlIHBpY3R1cmUgdG8gYmUgZGVjb2RlZCAqLworICAgICAgICB1MzIgaW50cmFDb25jZWFsbWVudE1ldGhvZDsgLyogMCA9IEdyYXkgY29uY2VhbG1lbnQgZm9yIGludHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUmVmZXJlbmNlIGNvbmNlYWxtZW50IGZvciBpbnRyYSAqLworCisgICAgfSBIMjY0U3dEZWNJbnB1dDsKKworCisgICAgLyogT3V0cHV0IHN0cnVjdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1OCAgKnBTdHJtQ3VyclBvczsgICAgICAvKiBQb2ludGVyIHRvIHN0cmVhbSBwb3NpdGlvbiB3aGVyZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGVkIHVwICovCisgICAgfSBIMjY0U3dEZWNPdXRwdXQ7CisKKyAgICAvKiBPdXRwdXQgc3RydWN0dXJlIGZvciBIMjY0U3dEZWNOZXh0UGljdHVyZSAqLworICAgIHR5cGVkZWYgc3RydWN0CisgICAgeworICAgICAgICB1MzIgKnBPdXRwdXRQaWN0dXJlOyAgICAvKiBQb2ludGVyIHRvIHRoZSBwaWN0dXJlLCBZVVYgZm9ybWF0ICAgICAgICovCisgICAgICAgIHUzMiBwaWNJZDsgICAgICAgICAgICAgIC8qIElkZW50aWZpZXIgb2YgdGhlIHBpY3R1cmUgdG8gYmUgZGlzcGxheWVkKi8KKyAgICAgICAgdTMyIGlzSWRyUGljdHVyZTsgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgcGljdHVyZSBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZSAqLworICAgICAgICB1MzIgbmJyT2ZFcnJNQnM7ICAgICAgICAvKiBOdW1iZXIgb2YgY29uY2VhbGVkIE1CJ3MgaW4gdGhlIHBpY3R1cmUgICovCisgICAgfSBIMjY0U3dEZWNQaWN0dXJlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuMi4gU3RydWN0dXJlcyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2Ugd2l0aCBERUMgQVBJCisgICAgICAgICBhbmQgdXNlciBhcHBsaWNhdGlvbi4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICB0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICAgICAgdTMyIGNyb3BMZWZ0T2Zmc2V0OworICAgICAgICB1MzIgY3JvcE91dFdpZHRoOworICAgICAgICB1MzIgY3JvcFRvcE9mZnNldDsKKyAgICAgICAgdTMyIGNyb3BPdXRIZWlnaHQ7CisgICAgfSBDcm9wUGFyYW1zOworCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBwcm9maWxlOworICAgICAgICB1MzIgcGljV2lkdGg7CisgICAgICAgIHUzMiBwaWNIZWlnaHQ7CisgICAgICAgIHUzMiB2aWRlb1JhbmdlOworICAgICAgICB1MzIgbWF0cml4Q29lZmZpY2llbnRzOworICAgICAgICB1MzIgcGFyV2lkdGg7CisgICAgICAgIHUzMiBwYXJIZWlnaHQ7CisgICAgICAgIHUzMiBjcm9wcGluZ0ZsYWc7CisgICAgICAgIENyb3BQYXJhbXMgY3JvcFBhcmFtczsKKyAgICB9IEgyNjRTd0RlY0luZm87CisKKyAgICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgdHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHUzMiBtYWpvcjsgICAgLyogRGVjb2RlciBBUEkgbWFqb3IgdmVyc2lvbiAqLworICAgICAgICB1MzIgbWlub3I7ICAgIC8qIERuY29kZXIgQVBJIG1pbm9yIHZlcnNpb24gKi8KKyAgICB9IEgyNjRTd0RlY0FwaVZlcnNpb247CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gUHJvdG90eXBlcyBvZiBEZWNvZGVyIEFQSSBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjRGVjb2RlKEgyNjRTd0RlY0luc3QgICAgICBkZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5wdXQgICAgICpwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNPdXRwdXQgICAgKnBPdXRwdXQpOworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0luaXQoSDI2NFN3RGVjSW5zdCAqZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcpOworCisgICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY05leHRQaWN0dXJlKEgyNjRTd0RlY0luc3QgICAgIGRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAgICAgICAgICAgICAgIGVuZE9mU3RyZWFtKTsKKworICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNHZXRJbmZvKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvICpwRGVjSW5mbyk7CisKKyAgICB2b2lkICBIMjY0U3dEZWNSZWxlYXNlKEgyNjRTd0RlY0luc3QgZGVjSW5zdCk7CisKKyAgICBIMjY0U3dEZWNBcGlWZXJzaW9uIEgyNjRTd0RlY0dldEFQSVZlcnNpb24odm9pZCk7CisKKyAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIEFQSSB0cmFjZSAqLworICAgIHZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqKTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgZnJlZSAqLworICAgIHZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpOworCisgICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgY29weSAqLworICAgIHZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KTsKKworICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgbWVtc2V0ICovCisgICAgdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEgyNjRTV0RFQ0FQSV9IICovCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjNkNTY1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEJBU0VUWVBFX0hfSU5DTFVERUQKKyNkZWZpbmUgQkFTRVRZUEVfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2FybQorI2RlZmluZSBWT0xBVElMRSB2b2xhdGlsZQorI2Vsc2UKKyNkZWZpbmUgVk9MQVRJTEUKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgIGk4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTMyOwordHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTMyOworCisjaWYgZGVmaW5lZChWQzFTV0RFQ18xNkJJVCkgfHwgZGVmaW5lZChNUDRFTkNfQVJNMTEpCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1MTZ4OwordHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2eDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICB1MTZ4OwordHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTE2eDsKKyNlbmRpZgorCisKKyNpZm5kZWYgTlVMTAorI2lmZGVmICBfX2NwbHVzcGx1cworI2RlZmluZSBOVUxMIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAgLyogQkFTRVRZUEVfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U3MGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQKQEAgLTAsMCArMSw2MyBAQAorVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKK29mIEFSTSBvbiAxOS1GZWItMjAwOC4KKworSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KKworVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKK2lzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgorCitJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKK3F1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxMz4uCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworLSBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MQorICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQorICBWNiBvcHRpbWl6ZWQgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKKyAgaW50ZXJuYWwgYWNjZXNzCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKK2JldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCisKK0JldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50CittdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKK3NvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQorY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCitCdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKK3RoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQorYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgordGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKK2F0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCityZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQorZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKK2RhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCitCeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAordG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCitkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAord2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQord2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAorbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KKworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwordHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KKworVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDEzLlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Citub3RlLgorCitUaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxMy5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KKworVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KK01ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCisKK1RoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQorIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6CisKKyAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyMjM4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCkBAIC0wLDAgKzEsOTEgQEAKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAorZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKKzRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCis1M2YyYWU4YTk4NDk1ZjA1ZTI2YTRjZjg2MmE3Zjc1MCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCiszYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKKzUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKKzY5NDI4MWQxMWFmNTJmODhlNmY5ZDRjYjIyNmFjOGE3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCitkNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKzg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCiszODk0NGM1ZTBiYmEwMWUzMmZmMzQ5YzJjODdjNzFiMiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworOTBiMGU2YTA0ZTc2NDkwMmMwYTA5MDM2NDBjMTBiMzIgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKzI4YTE5YWU0ZmUyMjU4NjI4MDgwZDZhODliYjU0YjkxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzk4ZTE5NmI5ZTFmZmViYWY5MWY2MmVhOWQxN2ZiOTdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCiswMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitmMzAxZDVhOTVlMDczNTRmNTkzZWE1NzQ3YzAxY2IwYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworNDRjOWVmMjFlODQwYTEwMDMwMWY3ZDdhNDE4OTk1N2MgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCithMzNiMDNiYmQzMzUyZDI0ZWQ3NDQ3NjllMTJiYjg3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworMDBjMjBiZmRhNjdiYjg2MDk2YjYxNWZjMTdjOTRiMzUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCithMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworZTRmZWNkNjZiYzQ3ZjA3NTM5YmMzMDg5MzVlODRhMWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis3ODgxNWM5ZGY1MGJhNTMxMzFiYjIyZDJiODI5ZTNjMyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworMTkwOWFlMzEyYWM3OWEwM2E1ZmFjMWQxZThiYzAyOTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworM2QyYzQ4NTgwNjU1OTI4MDY1ZGU3ODM5ODY2ZDliYzQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCisyM2FhMmZkZjE1NWQ0ZmE2ZmY3NDVlYWI2ZTAxZjMyYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOTdmMjBhOTNjNDgxZDdmNjE3M2Q5MTlmNDFlNDE1YmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworYmVjZDUxMmRhMjAyNDM2Mjg2ODExYjZhZWMwNjFmNDcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKK2RkMjRhOTlhZTNjZDg0MmRjYWNhZjMxZDQ3ZGU4OGIzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCitjMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzM2MjhmYmRmMGNkMjE3YzI4N2I2Y2NjOTQxMzVkMDZlICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzM1OTliMTA3NDMzMDk2NWM4Y2EyODVkMTY0ZWZjY2ZmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCiszMzM5ZTAyNmM3ZGU2NTVkOTQwMDk0OWViNWU1MTQ1MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCitjYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworY2RmNDEyOTIwYzIwMzdhNzI1ZDA0MjAwMDJiNjc1MmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKK2RiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworYjU1OWI3MWQ1Yzk0NjI3ZjEwZTYxNmZiNzJjMGNlZmMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis0ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworMWU0YzNiZThjNWVkZGMwMGM5ZjA1ZTgzYmNmMzE1ZWYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisxYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisxYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis0ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisyZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworYWNiOTJiZTFkYmNkYjNlYmU4MjRjYmU5ZTI4ZDAzYmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworYTZiNDFmMDFiMWRmN2RkNjU2ZWJkYmEzMDg0YmZhMmEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworZmZlNmI5NmM3NGQ0ODgxZjRkM2M4ZGU4Y2M3Mzc3OTcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis0MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworZmY1OTE1ZDE4MWJmZDJjZDJmMGJkNTg4YmQyMzAwZGMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKzY3NzVlYjBjNTYxZGJhYjk2NWM2MGY4NWIwOGM5NmZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis0NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCis2NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisxMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAorYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisJCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCis1MGNjYTY5NTRjNDQ3YjAxMmFiMzljYTc4NzJlNWU4ZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKK2QxYzNiY2U3N2ZjNTc3NGM4OTliNDQ3ZDEzZjAyY2QwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKK2ZkYWMxZDFiYWQzZmQyM2M4ODBiZWIzOWJjMmU4OWFhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzZkOWFkYzJiZTViZDAzMTE1OTEwMzBkMGM2ZGY3NzFjICBBUk1fREVMSVZFUllfOTc0MTMuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDg2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU0uaApAQCAtMCwwICsxLDc4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTS5oCisgKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKgorICovCisgCisgIAorI2lmbmRlZiBfYXJtQ29tbW9uX0hfCisjZGVmaW5lIF9hcm1Db21tb25fSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorICAgICAgICAKK30gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCisKKworLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCit0eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKKworCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLworI2lmZGVmIEFSTV9ERUJVRworLyogZGVidWcgdmVyc2lvbiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQorI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9CisjZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQorI2Vsc2UgCisvKiByZWxlYXNlIHZlcnNpb24gKi8KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCisjZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCisjZW5kaWYgLyogQVJNX0RFQlVHICovCisKKy8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisjZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQorI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKKyNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCisKKy8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KKworI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnQpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKKyNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKKyNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKKyNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKKyNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCisKKy8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KKworI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQorCisjaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50KShQdHIpKSAlIE4pPT0wKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKCgoKGludCkoUHRyKSkgJSBOKSE9MCkKKyNlbHNlCisjZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQorI2VuZGlmCisKKyNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQorCisjZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQorI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCisjZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKyAKK09NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgICAgICBPTVhfSU5UIG1pbiwKKyAgICAgICAgT01YX0lOVCBtYXgsIAorICAgICAgICBPTVhfUzMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgICAgICBPTVhfRjMyIG1pbiwKKyAgICAgICAgT01YX0YzMiBtYXgsIAorICAgICAgICBPTVhfRjMyIHNyYworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCisgICAgICAgIE9NWF9GMzIgdiwgCisgICAgICAgIE9NWF9JTlQgc2hpZnQsIAorICAgICAgICBPTVhfSU5UIHNhdEJpdHMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCisgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCisgICAgKTsgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0QWRkX1MzMigKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1M2NCBhcm1TYXRBZGRfUzY0KAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWJ1Z2dpbmcgbWFjcm9zCisgKgorICovCisKKworLyoKKyAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5CisgKi8KKyNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAorCisvKgorICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgorICogQWRkIG1vcmUgaWYgbmVlZGVkLgorICovCisjaWZkZWYgREVCVUdfT04KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCisjZWxzZSAvKiBERUJVR19PTiAqLworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAorI2VuZGlmIC8qIERFQlVHX09OICovCisKKworLyoKKyAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucworICoKKyAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgorICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAorICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCisgKi8KKworI2lmZGVmIERFQlVHX0RPTUFJTl9BQworI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fVkMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQworI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JQworLyogVG8gYmUgZmlsbGVkIGluICovCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9TUAorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lQCisjZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLworCisKKyNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCisKKy8qRW5kIG9mIEZpbGUqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjk4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaApAQCAtMCwwICsxLDY3MCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXREZWNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gCis7Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKKzsvLworOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKKzsvLworOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKKzsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQorOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAorOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCis7Ly8KKzsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Cis7Ly8KKzsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Cis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgorOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCis7Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCis7Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQorOy8vCis7Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKKzsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCis7Ly8KKzsvLyBVU0FHRToKKzsvLworOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Cis7Ly8KKzsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCis7Ly8KKzsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCis7Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKKzsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQorOy8vIGNhbGwgTV9CRF9GSU5JLgorOy8vCis7Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKKzsvLworOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCis7Ly8KKzsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgorOy8vCis7Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Cis7Ly8KKzsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgorOy8vCis7Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKKzsvLyB2YXJpYWJsZXM6Cis7Ly8KKworICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCisgICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgorICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAorICAgCis7Ly8gICAgICAgIAorOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCis7Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KKzsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KKzsvLworOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKKzsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKKzsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKKzsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAorOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQorOy8vCis7Ly8KKworICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCisgICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQorICAgICAgICA7Ly8gc2NoZWR1bGluZy4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCisgICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCisgICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCisgICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgorICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAorCitwQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKK0JpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgorQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWQgaW5wdXRzCisgICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKKyAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCisgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQorICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMworICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCisgICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2CisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKKyAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCisgICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCisgICAgICAgIElGICgkTjw9OCkKKyAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgRUxTRSAgICAgICAgCisgICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKKyAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCisgICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCisgICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKKyAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAorICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyBidWZmZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgorICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKKyAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQorICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQorICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCisgICAgICAgIAorICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cworICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKKyAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAorMDEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKKyAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQorICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQorICAgICAgICBCQ1MgICAgICVGVDAyCisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAorICAgICAgICBJRiAoMiokUzAtJFMxPD04KQorICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0CisgICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCisgICAgICAgIEVORElGCisgICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0CisgICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKKzAyCisgICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCisgICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQorICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1CisgICAgICAgIAorICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKKyAgICAgICAgTUVORAorICAgICAgICAKKworICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCisgICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAorCisgICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cworICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAorICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKKyAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAorICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKKworICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAorICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAorICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKKyAgICAgICAgCisgICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KKworICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMworICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3CisgICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIAorICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMworICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNworICAgICAgICAKKyAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0CisgICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKKyAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KKyAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjliYzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkYjMyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGUgICAgICAgICA6IGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIERlc2NyaXB0aW9uICA6IENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0YWJsZXMgZm9yIElEQ1QgY2FsY3VsYXRpb24uCisgKgorICovCisgIAorI2lmbmRlZiBfYXJtQ09NTV9JRENUVGFibGVfSF8KKyNkZWZpbmUgX2FybUNPTU1fSURDVFRhYmxlX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisgICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKKyAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1CisgICAgICAqICBzKDYpPTIuMAorICAgICAgKiAgcyg3KT00LjAKKyAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKKyAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQorCSAgKi8KK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF07CitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XTsKKworI2VuZGlmIC8qIF9hcm1DT01NX0lEQ1RUYWJsZV9IXyAqLworCisKKy8qIEVuZCBvZiBGaWxlICovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y3MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCkBAIC0wLDAgKzEsMTQ0NSBAQAorOy8vCis7Ly8gVGhpcyBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG1heSBiZSB1c2VkIG9ubHkgYXMKKzsvLyBhdXRob3Jpc2VkIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkCis7Ly8gICAoQykgQ09QWVJJR0hUIDIwMDQgQVJNIExpbWl0ZWQKKzsvLyAgICAgICBBTEwgUklHSFRTIFJFU0VSVkVECis7Ly8gVGhlIGVudGlyZSBub3RpY2UgYWJvdmUgbXVzdCBiZSByZXByb2R1Y2VkIG9uIGFsbCBhdXRob3Jpc2VkCis7Ly8gY29waWVzIGFuZCBjb3BpZXMgbWF5IG9ubHkgYmUgbWFkZSB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZAorOy8vIGJ5IGEgbGljZW5zaW5nIGFncmVlbWVudCBmcm9tIEFSTSBMaW1pdGVkLgorOy8vCis7Ly8gSURDVF9zLnMKKzsvLworOy8vIEludmVyc2UgRENUIG1vZHVsZQorOy8vCis7Ly8gCis7Ly8gQUxHT1JJVEhNIERFU0NSSVBUSU9OCis7Ly8KKzsvLyBUaGUgOHg4IDJEIElEQ1QgaXMgcGVyZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIGEgMUQgSURDVCBmb3IgZWFjaAorOy8vIGNvbHVtbiBhbmQgdGhlbiBhIDFEIElEQ1QgZm9yIGVhY2ggcm93LgorOy8vCis7Ly8gVGhlIDgtcG9pbnQgMUQgSURDVCBpcyBkZWZpbmVkIGJ5Cis7Ly8gICBmKHgpID0gKEMoMCkqVCgwKSpjKDAseCkgKyAuLi4gKyBDKDcpKlQoNykqYyg3LHgpKS8yCis7Ly8KKzsvLyAgIEModSkgPSAxL3NxcnQoMikgaWYgdT0wIG9yIDEgaWYgdSE9MAorOy8vICAgYyh1LHgpID0gY29zKCAoMngrMSkqdSpwaS8xNiApCis7Ly8KKzsvLyBXZSBjb21wdXRlIHRoZSA4LXBvaW50IDFEIElEQ1QgdXNpbmcgdGhlIHJldmVyc2Ugb2YKKzsvLyB0aGUgQXJhaS1BZ3VpLU5ha2FqaW1hIGZsb3cgZ3JhcGggd2hpY2ggd2Ugc3BsaXQgaW50bworOy8vIDUgc3RhZ2VzIG5hbWVkIGluIHJldmVyc2Ugb3JkZXIgdG8gaWRlbnRpZnkgd2l0aCB0aGUKKzsvLyBmb3J3YXJkIERDVC4gRGlyZWN0IGludmVyc2lvbiBvZiB0aGUgZm9yd2FyZCBmb3JtdWxhZQorOy8vIGluIGZpbGUgRkRDVF9zLnMgZ2l2ZXM6Cis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpICBbIEEodSk9NCpDKHUpKmModSwwKSBdCis7Ly8gICAgICAgICAgICAgWyBBKDApID0gMipzcXJ0KDIpCis7Ly8gICAgICAgICAgICAgICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkgXQorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSAoajIrajYpLzIgICAgICBpMiA9IChqMi1qNikvMgorOy8vICAgICAgICAgICAgIGk3ID0gKGo1K2ozKS8yICAgICAgaTQgPSAoajUtajMpLzIKKzsvLyAgICAgICAgICAgICBpNSA9IChqMStqNykvMiAgICAgIGk2ID0gKGoxLWo3KS8yCis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IChpMCtpMSkvMiAgICAgIGgxID0gKGkwLWkxKS8yCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAgY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgaDYgPSAtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2Cis7Ly8gICAgICAgICAgICAgWyBUaGUgYWJvdmUgdHdvIGxpbmVzIHJvdGF0ZSBieSAtKHBpLzgpIF0KKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykvc3FydDIgIGg3ID0gKGk1K2k3KS8yIAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gKGgwK2gzKS8yICAgICAgZzMgPSAoaDAtaDMpLzIKKzsvLyAgICAgICAgICAgICBnMSA9IChoMStoMikvMiAgICAgIGcyID0gKGgxLWgyKS8yCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSAoZzArZzcpLzIgICAgICBmNyA9IChnMC1nNykvMgorOy8vICAgICAgICAgICAgIGYxID0gKGcxK2c2KS8yICAgICAgZjYgPSAoZzEtZzYpLzIKKzsvLyAgICAgICAgICAgICBmMiA9IChnMitnNSkvMiAgICAgIGY1ID0gKGcyLWc1KS8yCis7Ly8gICAgICAgICAgICAgZjMgPSAoZzMrZzQpLzIgICAgICBmNCA9IChnMy1nNCkvMgorOy8vCis7Ly8gTm90ZSB0aGF0IG1vc3QgY29lZmZpY2llbnRzIGFyZSBoYWx2ZWQgMyB0aW1lcyBkdXJpbmcgdGhlCis7Ly8gYWJvdmUgY2FsY3VsYXRpb24uIFdlIGNhbiByZXNjYWxlIHRoZSBhbGdvcml0aG0gZGl2aWRpbmcKKzsvLyB0aGUgaW5wdXQgYnkgOCB0byByZW1vdmUgdGhlIGhhbHZpbmdzLgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KS84Cis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IGoyICsgajYgICAgICAgIGkyID0gajIgLSBqNgorOy8vICAgICAgICAgICAgIGk3ID0gajUgKyBqMyAgICAgICAgaTQgPSBqNSAtIGozCis7Ly8gICAgICAgICAgICAgaTUgPSBqMSArIGo3ICAgICAgICBpNiA9IGoxIC0gajcKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gaTAgKyBpMSAgICAgICAgaDEgPSBpMCAtIGkxCis7Ly8gICAgICAgICAgICAgaDIgPSAoaTIqc3FydDIpLWkzICBoMyA9IGkzCis7Ly8gICAgICAgICAgICAgaDQgPSAyKiggY29zKHBpLzgpKmk0ICsgc2luKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg2ID0gMiooLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNSA9IChpNS1pNykqc3FydDIgIGg3ID0gaTUgKyBpNyAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IGgwICsgaDMgICAgICAgIGczID0gaDAgLSBoMworOy8vICAgICAgICAgICAgIGcxID0gaDEgKyBoMiAgICAgICAgZzIgPSBoMSAtIGgyCis7Ly8gICAgICAgICAgICAgZzcgPSBoNyAgICAgICAgICAgICBnNiA9IGg2IC0gaDcKKzsvLyAgICAgICAgICAgICBnNSA9IGg1IC0gZzYgICAgICAgIGc0ID0gaDQgLSBnNQorOy8vCis7Ly8gSVN0YWdlIDE6ICAgZjAgPSBnMCArIGc3ICAgICAgICBmNyA9IGcwIC0gZzcKKzsvLyAgICAgICAgICAgICBmMSA9IGcxICsgZzYgICAgICAgIGY2ID0gZzEgLSBnNgorOy8vICAgICAgICAgICAgIGYyID0gZzIgKyBnNSAgICAgICAgZjUgPSBnMiAtIGc1Cis7Ly8gICAgICAgICAgICAgZjMgPSBnMyArIGc0ICAgICAgICBmNCA9IGczIC0gZzQKKzsvLworOy8vIE5vdGU6Cis7Ly8gMS4gVGhlIHNjYWxpbmcgYnkgQSh1KS84IGNhbiBvZnRlbiBiZSBjb21iaW5lZCB3aXRoIGludmVyc2UKKzsvLyAgICBxdWFudGl6YXRpb24uIFRoZSBjb2x1bW4gYW5kIHJvdyBzY2FsaW5ncyBjYW4gYmUgY29tYmluZWQuCis7Ly8gMi4gVGhlIGZsb3dncmFwaCBpbiB0aGUgQUFOIHBhcGVyIGhhcyBoNCxnNiBuZWdhdGVkIGNvbXBhcmVkCis7Ly8gICAgdG8gdGhlIGFib3ZlIGNvZGUgYnV0IGlzIG90aGVyd2lzZSBpZGVudGljYWwuCis7Ly8gMy4gVGhlIHJvdGF0aW9uIGJ5IC1waS84IGNhbiBiZSBwZWZvcm1lZCB1c2luZyB0aHJlZSBtdWx0aXBsaWVzCis7Ly8gICAgRWcgIGMqaTQrcyppNiA9IChpNi1pNCkqcyArIChjK3MpKmk0Cis7Ly8gICAgICAgLXMqaTQrYyppNiA9IChpNi1pNCkqcyArIChjLXMpKmk2Cis7Ly8gNC4gSWYgfFQodSl8PD0xIHRoZW4gZnJvbSB0aGUgSURDVCBkZWZpbml0aW9uLAorOy8vICAgIHxmKHgpfCA8PSAoKDEvc3FydDIpICsgfGMoMSx4KXwgKyAuLiArIHxjKDcseCl8KS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyBjb3MocGkvMTYpICsgLi4uICsgY29zKDcqcGkvMTYpKS8yCis7Ly8gICAgICAgICAgICA9ICgoMS9zcXJ0MikgKyAoY290KHBpLzMyKS0xKS8yKS8yCis7Ly8gICAgICAgICAgICA9ICgxICsgY29zKHBpLzE2KSArIGNvcygycGkvMTYpICsgY29zKDNwaS8xNikpL3NxcnQoMikKKzsvLyAgICAgICAgICAgID0gKGFwcHJveCkyLjY0Cis7Ly8gICAgU28gdGhlIG1heCBnYWluIG9mIHRoZSAyRCBJRENUIGlzIH54Ny4wID0gMyBiaXRzLgorOy8vICAgIFRoZSB0YWJsZSBiZWxvdyBzaG93cyBpbnB1dCBwYXR0ZXJucyBnZW5lcmF0aW5nIHRoZSBtYXhpbXVtCis7Ly8gICAgdmFsdWUgb2YgfGYodSl8IGZvciBpbnB1dCBpbiB0aGUgcmFuZ2UgfFQoeCl8PD0xLiBNPS0xLCBQPSsxCis7Ly8gICAgSW5wdXRQYXR0ZXJuICAgICAgTWF4IHxmKHgpfAorOy8vICAgICAgUFBQUFBQUFAgICAgICAgIHxmMHwgPSAgMi42NAorOy8vICAgICAgUFBQTU1NTU0gICAgICAgIHxmMXwgPSAgMi42NAorOy8vICAgICAgUFBNTU1QUFAgICAgICAgIHxmMnwgPSAgMi42NAorOy8vICAgICAgUFBNTVBQTU0gICAgICAgIHxmM3wgPSAgMi42NAorOy8vICAgICAgUE1NUFBNTVAgICAgICAgIHxmNHwgPSAgMi42NAorOy8vICAgICAgUE1NUE1NUE0gICAgICAgIHxmNXwgPSAgMi42NAorOy8vICAgICAgUE1QUE1QTVAgICAgICAgIHxmNnwgPSAgMi42NAorOy8vICAgICAgUE1QTVBNUE0gICAgICAgIHxmN3wgPSAgMi42NAorOy8vICAgTm90ZSB0aGF0IHRoaXMgaW5wdXQgcGF0dGVybiBpcyB0aGUgdHJhbnNwb3NlIG9mIHRoZQorOy8vICAgY29ycmVzcG9uZGluZyBtYXggaW5wdXQgcGF0dGVyIGZvciB0aGUgRkRDVC4KKworOy8vIEFyZ3VtZW50cworCitwU3JjICAgIFJOIDAgICAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgorU3RyaWRlICBSTiAxICAgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKK3BEZXN0ICAgUk4gMiAgICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKK3BTY2FsZSAgUk4gMyAgICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCisKKworICAgICAgICA7Ly8gRENUIEludmVyc2UgTWFjcm8KKyAgICAgICAgOy8vIFRoZSBEQ1QgY29kZSBzaG91bGQgYmUgcGFyYW1ldHJpemVkIGFjY29yZGluZworICAgICAgICA7Ly8gdG8gdGhlIGZvbGxvd2luZyBpbnB1dHM6CisgICAgICAgIDsvLyAkb3V0c2l6ZSA9ICJ1OCIgIDogIDgtYml0IHVuc2lnbmVkIGRhdGEgc2F0dXJhdGVkICgwIHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzOSIgIDogMTYtYml0IHNpZ25lZCBkYXRhIHNhdHVyYXRlZCB0byA5LWJpdCAoLTI1NiB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczE2IiA6IDE2LWJpdCBzaWduZWQgZGF0YSBub3Qgc2F0dXJhdGVkIChtYXggc2l6ZSB+Ky8tMTQyNzMpCisgICAgICAgIDsvLyAkaW5zY2FsZSA9ICJzMTYiIDogc2lnbmVkIDE2LWJpdCBhYW4tc2NhbGUgdGFibGUsIFExNSBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gICAgICAgICAgICAiczMyIiA6IHNpZ25lZCAzMi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMjMgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dHM6CisgICAgICAgIDsvLyBwU3JjICAgPSByMCA9IFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICAgICAgICA7Ly8gICAgICAgICAgICAgICBSYW5nZSBpcyAtMjU2IHRvICsyNTUgKDktYml0KQorICAgICAgICA7Ly8gU3RyaWRlID0gcjEgPSBTdHJpZGUgYmV0d2VlbiBpbnB1dCBsaW5lcworICAgICAgICA7Ly8gcERlc3QgID0gcjIgPSBQb2ludGVyIHRvIG91dHB1dCBkYXRhCisgICAgICAgIDsvLyBwU2NhbGUgPSByMyA9IFBvaW50ZXIgdG8gYWFuLXNjYWxlIHRhYmxlIGluIHRoZSBmb3JtYXQgZGVmaW5lZCBieSAkaW5zY2FsZQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1QgICRvdXRzaXplLCAkaW5zY2FsZSwgJHN0cmlkZQorICAgICAgICBMQ0xBICAgIFNISUZUCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vIFJFR0lTVEVSIEFMTE9DQVRJT04KKzsvLyBUaGlzIGlzIGhhcmQgc2luY2Ugd2UgaGF2ZSA4IHZhbHVlcywgOSBmcmVlIHJlZ2lzdGVycyBhbmQgZWFjaAorOy8vIGJ1dHRlcmZseSByZXF1aXJlcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gV2UgYWxzbyB3YW50IHRvIAorOy8vIG1haW50YWluIHJlZ2lzdGVyIG9yZGVyIHNvIHdlIGNhbiB1c2UgTERNL1NUTS4gVGhlIHRhYmxlIGJlbG93Cis7Ly8gc3VtbWFyaXNlcyB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiB0aGF0IG1lZXRzIGFsbCB0aGVzZSBjcml0ZXJpYS4KKzsvLyBhPTFzdGNvbCwgYj0ybmRjb2wsIGYsZyxoLGkgYXJlIGRhdGFmbG93IHBvaW50cyBkZXNjcmliZWQgYWJvdmUuCis7Ly8KKzsvLyByMSAgYTAxICAgICBnMCAgaDAKKzsvLyByNCAgYjAxIGYwICBnMSAgaDEgIGkwCis7Ly8gcjUgIGEyMyBmMSAgZzIgICAgICBpMQorOy8vIHI2ICBiMjMgZjIgIGczICBoMiAgaTIKKzsvLyByNyAgYTQ1IGYzICAgICAgaDMgIGkzCis7Ly8gcjggIGI0NSBmNCAgZzQgIGg0ICBpNAorOy8vIHI5ICBhNjcgZjUgIGc1ICBoNSAgaTUKKzsvLyByMTAgYjY3IGY2ICBnNiAgaDYgIGk2Cis7Ly8gcjExICAgICBmNyAgZzcgIGg3ICBpNworOy8vCityYTAxICAgIFJOIDEKK3JiMDEgICAgUk4gNAorcmEyMyAgICBSTiA1CityYjIzICAgIFJOIDYKK3JhNDUgICAgUk4gNworcmI0NSAgICBSTiA4CityYTY3ICAgIFJOIDkKK3JiNjcgICAgUk4gMTAKK3J0bXAgICAgUk4gMTEKK2NzUGlCeTggUk4gMTIgICA7Ly8gWyAoU2luKHBpLzgpQFExNSksIChDb3MocGkvOClAUTE1KSBdCitMb29wUlIyIFJOIDE0ICAgOy8vIFsgTG9vcE51bWJlcjw8MTMgLCAoMS9TcXJ0KDIpKUBRMTUgXQorOy8vIFRyYW5zcG9zZSBhbGxvY2F0aW9uCit4ZnQgICAgIFJOIHJhMDEKK3hmMCAgICAgUk4gcmIwMQoreGYxICAgICBSTiByYTIzCit4ZjIgICAgIFJOIHJiMjMKK3hmMyAgICAgUk4gcmE0NQoreGY0ICAgICBSTiByYjQ1Cit4ZjUgICAgIFJOIHJhNjcKK3hmNiAgICAgUk4gcmI2NworeGY3ICAgICBSTiBydG1wCis7Ly8gSVN0YWdlIDEgYWxsb2NhdGlvbgoreGcwICAgICBSTiB4ZnQKK3hnMSAgICAgUk4geGYwCit4ZzIgICAgIFJOIHhmMQoreGczICAgICBSTiB4ZjIKK3hndCAgICAgUk4geGYzCit4ZzQgICAgIFJOIHhmNAoreGc1ICAgICBSTiB4ZjUKK3hnNiAgICAgUk4geGY2Cit4ZzcgICAgIFJOIHhmNworOy8vIElTdGFnZSAyIGFsbG9jYXRpb24KK3hoMCAgICAgUk4geGcwCit4aDEgICAgIFJOIHhnMQoreGh0ICAgICBSTiB4ZzIKK3hoMiAgICAgUk4geGczCit4aDMgICAgIFJOIHhndAoreGg0ICAgICBSTiB4ZzQKK3hoNSAgICAgUk4geGc1Cit4aDYgICAgIFJOIHhnNgoreGg3ICAgICBSTiB4ZzcKKzsvLyBJU3RhZ2UgMyw0IGFsbG9jYXRpb24KK3hpdCAgICAgUk4geGgwCit4aTAgICAgIFJOIHhoMQoreGkxICAgICBSTiB4aHQKK3hpMiAgICAgUk4geGgyCit4aTMgICAgIFJOIHhoMworeGk0ICAgICBSTiB4aDQKK3hpNSAgICAgUk4geGg1Cit4aTYgICAgIFJOIHhoNgoreGk3ICAgICBSTiB4aDcKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgcERlc3QsICBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9TVFIgICBTdHJpZGUsIHBTdHJpZGUKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTV9BRFIgICBwRGVzdCwgIHBCbGsKKyAgICAgICAgTERSICAgICBjc1BpQnk4LCA9MHgzMGZjNzY0MgorICAgICAgICBMRFIgICAgIExvb3BSUjIsID0weDAwMDA1YTgyCisgIAordjZfaWRjdF9jb2wkX0YKKyAgICAgICAgOy8vIExvYWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTQsIFtwU3JjXSwgIzQgIDsvLyBqMAorICAgICAgICBMRFIgICAgIHhpNSwgW3BTcmMsICM0KjE2LTRdICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTYsIFtwU3JjLCAjMioxNi00XSAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGk3LCBbcFNyYywgIzYqMTYtNF0gIDsvLyBqNgorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIEV2ZW4gVmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgOy8vIDE2eDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAxMgorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjNAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICM0KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjMioxNi00XQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkzLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTAsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk1LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkzLCB4aTQsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpMSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTYsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTAsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpMiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTcsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkxLCB4aTEsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTEsIHhpNiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgKDEyKzgtMTYpCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGVdLCAjOAorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMwKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNCozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM0KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNCwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlLCAjMiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTEsIFtwU2NhbGUsICMyKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkyLCBbcFNjYWxlLCAjNiozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTMsIFtwU2NhbGUsICM2KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGkwLCB4aTAsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMSwgeGkxLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTIsIHhpMiwgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkzLCB4aTMsIHhpNywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkwLCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgb2RkIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2LTRdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTYtNF0gICAgICA7Ly8gajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNi00XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2LTRdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBJRiAge1RSVUV9CisgICAgICAgICAgICA7Ly8gc2hvcnRjdXQgaWYgb2RkIHZhbHVlcyAwCisgICAgICAgICAgICBURVEgICAgIHhpMCwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkxLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTIsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMywgIzAKKyAgICAgICAgICAgIEJFUSAgICAgdjZPZGRaZXJvJF9GCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgc2NhbGVkIGV2ZW4gdmFsdWVzCisgICAgICAgIFNUTUlBICAgcERlc3QsIHt4aTQsIHhpNSwgeGk2LCB4aTd9CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgb2RkIHZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiCisgICAgICAgICAgICA7Ly8gUGVyZm9ybSBBQU4gU2NhbGUKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSoxNi00XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM3KjE2LTRdICAgICAgICAKKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNSoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTcsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkwLCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpNCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTEsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk3LCB4aTcsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTcsIHhpMCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk1LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGk2LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTUsIHhpNSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNSwgeGkyLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzEqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM3KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzcqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTEsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkxLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkwLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICM1KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzUqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICMzKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpNywgW3BTY2FsZSwgIzMqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTQsIHhpNCwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk1LCB4aTUsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpNiwgeGk2LCB4aTMsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTcsIHhpNywgeGkzLCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTQsIHhpNSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTcsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdCwgIzhdICAgICAgICA7Ly8gajIsajYgc2NhbGVkCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNiAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3RdICAgICAgICAgICAgOy8vIGowLCBqNCBzY2FsZWQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTQUREMTYgIHhmMywgeGczLCB4ZzQKKyAgICAgICAgU1NVQjE2ICB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNBREQxNiAgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTU1VCMTYgIHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0FERDE2ICB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTQUREMTYgIHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU1NVQjE2ICB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICBCICAgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIAordjZPZGRaZXJvJF9GCisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMi1qNikKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhoMCwgeGk0LCB4aTUKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpNCwgeGk1ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgTU9WICB4ZjMsIHhnMworICAgICAgICBNT1YgIHhmNCwgeGczCisgICAgICAgIE1PViAgeGYyLCB4ZzIKKyAgICAgICAgTU9WICB4ZjUsIHhnMgorICAgICAgICBNT1YgIHhmMSwgeGcxCisgICAgICAgIE1PViAgeGY2LCB4ZzEKKyAgICAgICAgTU9WICB4ZjAsIHhnMAorICAgICAgICBNT1YgIHhmNywgeGcwCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9jb2wkX0YKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAKKyAgICAgICAgCit2Nl9pZGN0X3JvdyRfRgorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93czR0bzcgeDEvNAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMxKjE2XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2XSAgICAgIDsvLyA0Kmo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTZdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTZdICAgICAgOy8vIGozCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyAyKmo3CisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo3ICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNIQUREMTYgeGk3LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMioxNl0gICAgICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNioxNl0gICAgICA7Ly8gMipqNgorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNworICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKKyAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2CisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajYKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KSAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM0KjE2XSAgICAgIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmNdLCAjNCAgICAgICAgIDsvLyBqMAorCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgQUREICAgICB4aTAsIHhpMCwgeGl0LCBMU0wgIzIgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMQorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNIQUREMTYgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTSFNVQjE2IHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0hBREQxNiB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNIU1VCMTYgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTSEFERDE2IHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU0hTVUIxNiB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNIQUREMTYgeGYwLCB4ZzAsIHhnNworICAgICAgICBTSFNVQjE2IHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXR1cmF0ZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgVVNBVDE2ICB4ZjAsICM4LCB4ZjAKKyAgICAgICAgICAgIFVTQVQxNiAgeGYxLCAjOCwgeGYxCisgICAgICAgICAgICBVU0FUMTYgIHhmMiwgIzgsIHhmMgorICAgICAgICAgICAgVVNBVDE2ICB4ZjMsICM4LCB4ZjMKKyAgICAgICAgICAgIFVTQVQxNiAgeGY0LCAjOCwgeGY0CisgICAgICAgICAgICBVU0FUMTYgIHhmNSwgIzgsIHhmNQorICAgICAgICAgICAgVVNBVDE2ICB4ZjYsICM4LCB4ZjYKKyAgICAgICAgICAgIFVTQVQxNiAgeGY3LCAjOCwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKKyAgICAgICAgICAgIFNTQVQxNiAgeGYwLCAjOSwgeGYwCisgICAgICAgICAgICBTU0FUMTYgIHhmMSwgIzksIHhmMQorICAgICAgICAgICAgU1NBVDE2ICB4ZjIsICM5LCB4ZjIKKyAgICAgICAgICAgIFNTQVQxNiAgeGYzLCAjOSwgeGYzCisgICAgICAgICAgICBTU0FUMTYgIHhmNCwgIzksIHhmNAorICAgICAgICAgICAgU1NBVDE2ICB4ZjUsICM5LCB4ZjUKKyAgICAgICAgICAgIFNTQVQxNiAgeGY2LCAjOSwgeGY2CisgICAgICAgICAgICBTU0FUMTYgIHhmNywgIzksIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRvIFJvdywgUGFjayBhbmQgc3RvcmUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIE9SUiAgICAgeGYwLCB4ZjAsIHhmMSwgTFNMICM4IDsvLyBbIGIxIGIwIGExIGEwIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGYyLCB4ZjIsIHhmMywgTFNMICM4IDsvLyBbIGIzIGIyIGEzIGEyIF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY0LCB4ZjQsIHhmNSwgTFNMICM4IDsvLyBbIGI1IGI0IGE1IGE0IF0KKyAgICAgICAgICAgIE9SUiAgICAgeGY2LCB4ZjYsIHhmNywgTFNMICM4IDsvLyBbIGI3IGI2IGE3IGE2IF0KKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjIsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYyLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGY0LCB4ZjYsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGY2LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzfQorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpOkxPUjooIiRvdXRzaXplIj0iczE2IikgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3Rfcm93JF9GCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorU3JjMCAgICAgICAgICAgIEVRVSAgNyAgICAgICAgICAgICAgCitTcmMxICAgICAgICAgICAgRVFVICA4ICAgICAgICAgICAgICAKK1NyYzIgICAgICAgICAgICBFUVUgIDkgICAgICAgICAgICAgIAorU3JjMyAgICAgICAgICAgIEVRVSAgMTAgICAgICAgICAgICAgIAorU3JjNCAgICAgICAgICAgIEVRVSAgMTEgICAgICAgICAgICAgIAorU3JjNSAgICAgICAgICAgIEVRVSAgMTIgICAgICAgICAgICAgIAorU3JjNiAgICAgICAgICAgIEVRVSAgMTMKK1NyYzcgICAgICAgICAgICBFUVUgIDE0CitUbXAgICAgICAgICAgICAgRVFVICAxNQorCitxWGowICAgICAgICAgICAgUU4gU3JjMC5TMTYgCitxWGoxICAgICAgICAgICAgUU4gU3JjMS5TMTYKK3FYajIgICAgICAgICAgICBRTiBTcmMyLlMxNgorcVhqMyAgICAgICAgICAgIFFOIFNyYzMuUzE2CitxWGo0ICAgICAgICAgICAgUU4gU3JjNC5TMTYKK3FYajUgICAgICAgICAgICBRTiBTcmM1LlMxNgorcVhqNiAgICAgICAgICAgIFFOIFNyYzYuUzE2CitxWGo3ICAgICAgICAgICAgUU4gU3JjNy5TMTYKK3FYanQgICAgICAgICAgICBRTiBUbXAuUzE2CisKK2RYajBsbyAgICAgICAgICBETiAoU3JjMCoyKS5TMTYKK2RYajBoaSAgICAgICAgICBETiAoU3JjMCoyKzEpLlMxNgorZFhqMWxvICAgICAgICAgIEROIChTcmMxKjIpLlMxNgorZFhqMWhpICAgICAgICAgIEROIChTcmMxKjIrMSkuUzE2CitkWGoybG8gICAgICAgICAgRE4gKFNyYzIqMikuUzE2CitkWGoyaGkgICAgICAgICAgRE4gKFNyYzIqMisxKS5TMTYKK2RYajNsbyAgICAgICAgICBETiAoU3JjMyoyKS5TMTYKK2RYajNoaSAgICAgICAgICBETiAoU3JjMyoyKzEpLlMxNgorZFhqNGxvICAgICAgICAgIEROIChTcmM0KjIpLlMxNgorZFhqNGhpICAgICAgICAgIEROIChTcmM0KjIrMSkuUzE2CitkWGo1bG8gICAgICAgICAgRE4gKFNyYzUqMikuUzE2CitkWGo1aGkgICAgICAgICAgRE4gKFNyYzUqMisxKS5TMTYKK2RYajZsbyAgICAgICAgICBETiAoU3JjNioyKS5TMTYKK2RYajZoaSAgICAgICAgICBETiAoU3JjNioyKzEpLlMxNgorZFhqN2xvICAgICAgICAgIEROIChTcmM3KjIpLlMxNgorZFhqN2hpICAgICAgICAgIEROIChTcmM3KjIrMSkuUzE2CitkWGp0bG8gICAgICAgICAgRE4gKFRtcCoyKS5TMTYKK2RYanRoaSAgICAgICAgICBETiAoVG1wKjIrMSkuUzE2CisKK3FYaTAgICAgICAgICAgICBRTiBxWGowCitxWGkxICAgICAgICAgICAgUU4gcVhqNAorcVhpMiAgICAgICAgICAgIFFOIHFYajIKK3FYaTMgICAgICAgICAgICBRTiBxWGo3CitxWGk0ICAgICAgICAgICAgUU4gcVhqNQorcVhpNSAgICAgICAgICAgIFFOIHFYanQKK3FYaTYgICAgICAgICAgICBRTiBxWGoxCitxWGk3ICAgICAgICAgICAgUU4gcVhqNgorcVhpdCAgICAgICAgICAgIFFOIHFYajMKKworZFhpMGxvICAgICAgICAgIEROIGRYajBsbworZFhpMGhpICAgICAgICAgIEROIGRYajBoaQorZFhpMWxvICAgICAgICAgIEROIGRYajRsbworZFhpMWhpICAgICAgICAgIEROIGRYajRoaQorZFhpMmxvICAgICAgICAgIEROIGRYajJsbworZFhpMmhpICAgICAgICAgIEROIGRYajJoaQorZFhpM2xvICAgICAgICAgIEROIGRYajdsbworZFhpM2hpICAgICAgICAgIEROIGRYajdoaQorZFhpNGxvICAgICAgICAgIEROIGRYajVsbworZFhpNGhpICAgICAgICAgIEROIGRYajVoaQorZFhpNWxvICAgICAgICAgIEROIGRYanRsbworZFhpNWhpICAgICAgICAgIEROIGRYanRoaQorZFhpNmxvICAgICAgICAgIEROIGRYajFsbworZFhpNmhpICAgICAgICAgIEROIGRYajFoaQorZFhpN2xvICAgICAgICAgIEROIGRYajZsbworZFhpN2hpICAgICAgICAgIEROIGRYajZoaQorZFhpdGxvICAgICAgICAgIEROIGRYajNsbworZFhpdGhpICAgICAgICAgIEROIGRYajNoaQorCitxWGgwICAgICAgICAgICAgUU4gcVhpdAorcVhoMSAgICAgICAgICAgIFFOIHFYaTAKK3FYaDIgICAgICAgICAgICBRTiBxWGkyCitxWGgzICAgICAgICAgICAgUU4gcVhpMworcVhoNCAgICAgICAgICAgIFFOIHFYaTcKK3FYaDUgICAgICAgICAgICBRTiBxWGk1CitxWGg2ICAgICAgICAgICAgUU4gcVhpNAorcVhoNyAgICAgICAgICAgIFFOIHFYaTEKK3FYaHQgICAgICAgICAgICBRTiBxWGk2CisKK2RYaDBsbyAgICAgICAgICBETiBkWGl0bG8KK2RYaDBoaSAgICAgICAgICBETiBkWGl0aGkKK2RYaDFsbyAgICAgICAgICBETiBkWGkwbG8KK2RYaDFoaSAgICAgICAgICBETiBkWGkwaGkKK2RYaDJsbyAgICAgICAgICBETiBkWGkybG8KK2RYaDJoaSAgICAgICAgICBETiBkWGkyaGkKK2RYaDNsbyAgICAgICAgICBETiBkWGkzbG8KK2RYaDNoaSAgICAgICAgICBETiBkWGkzaGkKK2RYaDRsbyAgICAgICAgICBETiBkWGk3bG8KK2RYaDRoaSAgICAgICAgICBETiBkWGk3aGkKK2RYaDVsbyAgICAgICAgICBETiBkWGk1bG8KK2RYaDVoaSAgICAgICAgICBETiBkWGk1aGkKK2RYaDZsbyAgICAgICAgICBETiBkWGk0bG8KK2RYaDZoaSAgICAgICAgICBETiBkWGk0aGkKK2RYaDdsbyAgICAgICAgICBETiBkWGkxbG8KK2RYaDdoaSAgICAgICAgICBETiBkWGkxaGkKK2RYaHRsbyAgICAgICAgICBETiBkWGk2bG8KK2RYaHRoaSAgICAgICAgICBETiBkWGk2aGkKKworcVhnMCAgICAgICAgICAgIFFOIHFYaDIKK3FYZzEgICAgICAgICAgICBRTiBxWGh0CitxWGcyICAgICAgICAgICAgUU4gcVhoMQorcVhnMyAgICAgICAgICAgIFFOIHFYaDAKK3FYZzQgICAgICAgICAgICBRTiBxWGg0CitxWGc1ICAgICAgICAgICAgUU4gcVhoNQorcVhnNiAgICAgICAgICAgIFFOIHFYaDYKK3FYZzcgICAgICAgICAgICBRTiBxWGg3CitxWGd0ICAgICAgICAgICAgUU4gcVhoMworCitxWGYwICAgICAgICAgICAgUU4gcVhnNgorcVhmMSAgICAgICAgICAgIFFOIHFYZzUKK3FYZjIgICAgICAgICAgICBRTiBxWGc0CitxWGYzICAgICAgICAgICAgUU4gcVhndAorcVhmNCAgICAgICAgICAgIFFOIHFYZzMKK3FYZjUgICAgICAgICAgICBRTiBxWGcyCitxWGY2ICAgICAgICAgICAgUU4gcVhnMQorcVhmNyAgICAgICAgICAgIFFOIHFYZzAKK3FYZnQgICAgICAgICAgICBRTiBxWGc3CisKKworcVh0MCAgICAgICAgICAgIFFOIDEuUzMyCitxWHQxICAgICAgICAgICAgUU4gMi5TMzIKK3FUMGxvICAgICAgICAgICBRTiAxLlMzMiAgICAgICAgIAorcVQwaGkgICAgICAgICAgIFFOIDIuUzMyICAgICAgICAgCitxVDFsbyAgICAgICAgICAgUU4gMy5TMzIgICAgICAgICAKK3FUMWhpICAgICAgICAgICBRTiA0LlMzMiAgICAgICAgIAorcVNjYWxlbG8gICAgICAgIFFOIDUuUzMyICAgICAgICA7Ly8gdXNlZCB0byByZWFkIHBvc3Qgc2NhbGUgdmFsdWVzCitxU2NhbGVoaSAgICAgICAgUU4gNi5TMzIKK3FUZW1wMCAgICAgICAgICBRTiA1LlMzMiAgICAgICAgIAorcVRlbXAxICAgICAgICAgIFFOIDYuUzMyICAgIAorCisKK1NjYWxlMSAgICAgICAgICBFUVUgNgorU2NhbGUyICAgICAgICAgIEVRVSAxNQorcVNjYWxlMSAgICAgICAgIFFOIFNjYWxlMS5TMTYgICAgIAorcVNjYWxlMiAgICAgICAgIFFOIFNjYWxlMi5TMTYgICAgIAorZFNjYWxlMWxvICAgICAgIEROIChTY2FsZTEqMikuUzE2ICAgICAKK2RTY2FsZTFoaSAgICAgICBETiAoU2NhbGUxKjIrMSkuUzE2CitkU2NhbGUybG8gICAgICAgRE4gKFNjYWxlMioyKS5TMTYgICAgIAorZFNjYWxlMmhpICAgICAgIEROIChTY2FsZTIqMisxKS5TMTYKKworZENvZWZzICAgICAgICAgIEROIDAuUzE2ICAgICAgICA7Ly8gU2NhbGUgY29lZmZpY2llbnRzIGluIGZvcm1hdCB7WzBdIFtDXSBbU10gW0ludlNxcnQyXX0KK0ludlNxcnQyICAgICAgICBETiBkQ29lZnNbMF0gICAgOy8vIDEvc3FydCgyKSBpbiBRMTUKK1MgICAgICAgICAgICAgICBETiBkQ29lZnNbMV0gICAgOy8vIFNpbihQSS84KSBpbiBRMTUKK0MgICAgICAgICAgICAgICBETiBkQ29lZnNbMl0gICAgOy8vIENvcyhQSS84KSBpbiBRMTUKKworcFRlbXAgICAgICAgICAgIFJOIDEyCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgSU1QT1JUICBhcm1DT01NX0lEQ1RDb2VmCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7cVhqMCxxWGoxfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajIscVhqM30sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo0LHFYajV9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNixxWGo3fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFByZVNjYWxlIGFuZCBtdWx0aXBseSB3aXRoIFNyYworICAgICAgICA7Ly8gSVN0YWdlIDQKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDE2WDE2IE11bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDMyWDMyICx1bAorICAgICAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gSVN0YWdlIDMKKyAgICAgICAgVlFSRE1VTEggICAgIHFYaTIsIHFYaTIsIEludlNxcnQyICAgICAgICAgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgVkhBREQgICAgICAgcVhoMCwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYaDEsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMC1pMSkvMgorICAgICAgICBWSEFERCAgICAgICBxWGg3LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVhoNSwgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZRUkRNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCisgICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMworCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMgorICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3CisgICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQorICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3CisgICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKKworICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorWFRSMCAgICAgICAgICAgIEVRVSBTcmM1CitYVFIxICAgICAgICAgICAgRVFVIFRtcAorWFRSMiAgICAgICAgICAgIEVRVSBTcmM2CitYVFIzICAgICAgICAgICAgRVFVIFNyYzcKK1hUUjQgICAgICAgICAgICBFUVUgU3JjMworWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCitYVFI2ICAgICAgICAgICAgRVFVIFNyYzEKK1hUUjcgICAgICAgICAgICBFUVUgU3JjMgorWFRSdCAgICAgICAgICAgIEVRVSBTcmM0CisgICAgICAgICAgICAgICAgCitxQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKK3FBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKK3FBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKK3FBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKK3FBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKK3FBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKK3FBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKK3FBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKKworZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQorZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQorZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQorZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKK2RCNSAgICAgICAgICAgICBETiAgWFRSNSoyCitkQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgorZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKKworICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCisgICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQorICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3CisgICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCisgICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCisgICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2CisgICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKKyAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKKyAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKKyAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKKyAgICAgICAgCisKK3FZajAgICAgICAgICAgICBRTiBxWGYwCitxWWoxICAgICAgICAgICAgUU4gcVhmMQorcVlqMiAgICAgICAgICAgIFFOIHFYZjIKK3FZajMgICAgICAgICAgICBRTiBxWGYzCitxWWo0ICAgICAgICAgICAgUU4gcVhmNAorcVlqNSAgICAgICAgICAgIFFOIHFYZjUKK3FZajYgICAgICAgICAgICBRTiBxWGY2CitxWWo3ICAgICAgICAgICAgUU4gcVhmNworcVlqdCAgICAgICAgICAgIFFOIHFYZnQKKworZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgorZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2CitkWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2CitkWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKK2RZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKK2RZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgorZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgorZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2CitkWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2CitkWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKK2RZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKK2RZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgorZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgorZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2CitkWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2CitkWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKK2RZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKK2RZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgorCitxWWkwICAgICAgICAgICAgUU4gcVlqMAorcVlpMSAgICAgICAgICAgIFFOIHFZajQKK3FZaTIgICAgICAgICAgICBRTiBxWWoyCitxWWkzICAgICAgICAgICAgUU4gcVlqNworcVlpNCAgICAgICAgICAgIFFOIHFZajUKK3FZaTUgICAgICAgICAgICBRTiBxWWp0CitxWWk2ICAgICAgICAgICAgUU4gcVlqMQorcVlpNyAgICAgICAgICAgIFFOIHFZajYKK3FZaXQgICAgICAgICAgICBRTiBxWWozCisKK2RZaTBsbyAgICAgICAgICBETiBkWWowbG8KK2RZaTBoaSAgICAgICAgICBETiBkWWowaGkKK2RZaTFsbyAgICAgICAgICBETiBkWWo0bG8KK2RZaTFoaSAgICAgICAgICBETiBkWWo0aGkKK2RZaTJsbyAgICAgICAgICBETiBkWWoybG8KK2RZaTJoaSAgICAgICAgICBETiBkWWoyaGkKK2RZaTNsbyAgICAgICAgICBETiBkWWo3bG8KK2RZaTNoaSAgICAgICAgICBETiBkWWo3aGkKK2RZaTRsbyAgICAgICAgICBETiBkWWo1bG8KK2RZaTRoaSAgICAgICAgICBETiBkWWo1aGkKK2RZaTVsbyAgICAgICAgICBETiBkWWp0bG8KK2RZaTVoaSAgICAgICAgICBETiBkWWp0aGkKK2RZaTZsbyAgICAgICAgICBETiBkWWoxbG8KK2RZaTZoaSAgICAgICAgICBETiBkWWoxaGkKK2RZaTdsbyAgICAgICAgICBETiBkWWo2bG8KK2RZaTdoaSAgICAgICAgICBETiBkWWo2aGkKK2RZaXRsbyAgICAgICAgICBETiBkWWozbG8KK2RZaXRoaSAgICAgICAgICBETiBkWWozaGkKKworcVloMCAgICAgICAgICAgIFFOIHFZaXQKK3FZaDEgICAgICAgICAgICBRTiBxWWkwCitxWWgyICAgICAgICAgICAgUU4gcVlpMgorcVloMyAgICAgICAgICAgIFFOIHFZaTMKK3FZaDQgICAgICAgICAgICBRTiBxWWk3CitxWWg1ICAgICAgICAgICAgUU4gcVlpNQorcVloNiAgICAgICAgICAgIFFOIHFZaTQKK3FZaDcgICAgICAgICAgICBRTiBxWWkxCitxWWh0ICAgICAgICAgICAgUU4gcVlpNgorCitkWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCitkWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCitkWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCitkWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCitkWWgybG8gICAgICAgICAgRE4gZFlpMmxvCitkWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCitkWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCitkWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCitkWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCitkWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCitkWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCitkWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCitkWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCitkWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCitkWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCitkWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCitkWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCitkWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCisKK3FZZzAgICAgICAgICAgICBRTiBxWWgyCitxWWcxICAgICAgICAgICAgUU4gcVlodAorcVlnMiAgICAgICAgICAgIFFOIHFZaDEKK3FZZzMgICAgICAgICAgICBRTiBxWWgwCitxWWc0ICAgICAgICAgICAgUU4gcVloNAorcVlnNSAgICAgICAgICAgIFFOIHFZaDUKK3FZZzYgICAgICAgICAgICBRTiBxWWg2CitxWWc3ICAgICAgICAgICAgUU4gcVloNworcVlndCAgICAgICAgICAgIFFOIHFZaDMKKworcVlmMCAgICAgICAgICAgIFFOIHFZZzYKK3FZZjEgICAgICAgICAgICBRTiBxWWc1CitxWWYyICAgICAgICAgICAgUU4gcVlnNAorcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKK3FZZjQgICAgICAgICAgICBRTiBxWWczCitxWWY1ICAgICAgICAgICAgUU4gcVlnMgorcVlmNiAgICAgICAgICAgIFFOIHFZZzEKK3FZZjcgICAgICAgICAgICBRTiBxWWcwCitxWWZ0ICAgICAgICAgICAgUU4gcVlnNworCisgICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCisgICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKKyAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2CisgICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMworCisgICAgICAgIFZRUkRNVUxIICAgICBxWWkyLCBxWWkyLCBJbnZTcXJ0MiAgICA7Ly8gaTIvc3FydCgyKQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBUZW1wLCAjMHg0ICAgICAgICAgICAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBWRFVQICAgICAgICBxU2NhbGUxLCBwVGVtcCAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBWQUREICAgICAgICBxWWkwLCBxWWkwLCBxU2NhbGUxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWgwLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZaDEsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAtaTEpLzIKKworICAgICAgICBWSEFERCAgICAgICBxWWg3LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFZaDUsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVloMiwgcVlpMiwgcVlpMyAgICAgICAgOy8vIGgyLCBoMworICAgICAgICBWUVJETVVMSCAgICAgcVloNSwgcVloNSwgSW52U3FydDIgICAgOy8vIGg1L3NxcnQoMikKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk0bG8sIEMgICAgICAgICA7Ly8gYyppNAorICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWWk2bG8sIFMgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWWk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNGxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRZaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk2bG8sIEMgICAgICAgICA7Ly8gYyppNgorICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWWk0bG8sIFMgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWWk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNmxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRZaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWWc2LCBxWWg2LCBxWWg3CisgICAgICAgIFZTVUIgICAgICAgIHFZZzUsIHFZaDUsIHFZZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNCwgcVloNCwgcVlnNQorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBWSEFERCAgICAgICBxWWcxLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZZzIsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMCwgcVloMCwgcVloMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWWczLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisgICAgICAgIAorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWSEFERCAgICAgICAgcVlmMywgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIU1VCICAgICAgICBxWWY0LCBxWWczLCBxWWc0ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjIsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNSwgcVlnMiwgcVlnNSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYxLCBxWWcxLCBxWWc2CisgICAgICAgIFZIU1VCICAgICAgICBxWWY2LCBxWWcxLCBxWWc2ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjAsIHFZZzAsIHFZZzcKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjcsIHFZZzAsIHFZZzcgICAgICAKKworWVRSMCAgICAgICAgICAgIEVRVSBTcmMwCitZVFIxICAgICAgICAgICAgRVFVIFNyYzQKK1lUUjIgICAgICAgICAgICBFUVUgU3JjMQorWVRSMyAgICAgICAgICAgIEVRVSBTcmMyCitZVFI0ICAgICAgICAgICAgRVFVIFNyYzcKK1lUUjUgICAgICAgICAgICBFUVUgU3JjNQorWVRSNiAgICAgICAgICAgIEVRVSBUbXAKK1lUUjcgICAgICAgICAgICBFUVUgU3JjNgorWVRSdCAgICAgICAgICAgIEVRVSBTcmMzCisKK3FDMCAgICAgICAgICAgICBRTiAgWVRSMC5TMzIgICAgICAgICAgICAgICAgOy8vIGZvciBZVFJwb3NlCitxQzEgICAgICAgICAgICAgUU4gIFlUUjEuUzMyCitxQzIgICAgICAgICAgICAgUU4gIFlUUjIuUzMyCitxQzMgICAgICAgICAgICAgUU4gIFlUUjMuUzMyCitxQzQgICAgICAgICAgICAgUU4gIFlUUjQuUzMyCitxQzUgICAgICAgICAgICAgUU4gIFlUUjUuUzMyCitxQzYgICAgICAgICAgICAgUU4gIFlUUjYuUzMyCitxQzcgICAgICAgICAgICAgUU4gIFlUUjcuUzMyCisKK2REMCAgICAgICAgICAgICBETiAgWVRSMCoyKzEgICAgICAgICAgICAgICAgOy8vIGZvciB1c2luZyBWU1dQCitkRDEgICAgICAgICAgICAgRE4gIFlUUjEqMisxCitkRDIgICAgICAgICAgICAgRE4gIFlUUjIqMisxCitkRDMgICAgICAgICAgICAgRE4gIFlUUjMqMisxCitkRDQgICAgICAgICAgICAgRE4gIFlUUjQqMgorZEQ1ICAgICAgICAgICAgIEROICBZVFI1KjIKK2RENiAgICAgICAgICAgICBETiAgWVRSNioyCitkRDcgICAgICAgICAgICAgRE4gIFlUUjcqMgorICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWWYwLCBxWWYxCisgICAgICAgIFZUUk4gICAgICAgIHFZZjIsIHFZZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNCwgcVlmNQorICAgICAgICBWVFJOICAgICAgICBxWWY2LCBxWWY3CisgICAgICAgIFZUUk4gICAgICAgIHFDMCwgcUMyCisgICAgICAgIFZUUk4gICAgICAgIHFDMSwgcUMzCisgICAgICAgIFZUUk4gICAgICAgIHFDNCwgcUM2CisgICAgICAgIFZUUk4gICAgICAgIHFDNSwgcUM3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEQwLCBkRDQKKyAgICAgICAgVlNXUCAgICAgICAgZEQxLCBkRDUKKyAgICAgICAgVlNXUCAgICAgICAgZEQyLCBkRDYKKyAgICAgICAgVlNXUCAgICAgICAgZEQzLCBkRDcKKworICAgICAgICAKK2RZZjBVOCAgICAgICAgICBETiBZVFIwKjIuVTgKK2RZZjFVOCAgICAgICAgICBETiBZVFIxKjIuVTgKK2RZZjJVOCAgICAgICAgICBETiBZVFIyKjIuVTgKK2RZZjNVOCAgICAgICAgICBETiBZVFIzKjIuVTgKK2RZZjRVOCAgICAgICAgICBETiBZVFI0KjIuVTgKK2RZZjVVOCAgICAgICAgICBETiBZVFI1KjIuVTgKK2RZZjZVOCAgICAgICAgICBETiBZVFI2KjIuVTgKK2RZZjdVOCAgICAgICAgICBETiBZVFI3KjIuVTgKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRG8gc2F0dXJhdGlvbiBpZiBvdXRzaXplIGlzIG90aGVyIHRoYW4gUzE2CisgICAgICAgIDsvLworICAgICAgICAKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWzAtMjU1XQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMFU4LCBxWWYwCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYxVTgsIHFZZjEKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjJVOCwgcVlmMgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmM1U4LCBxWWYzCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY0VTgsIHFZZjQKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjVVOCwgcVlmNQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNlU4LCBxWWY2CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY3VTgsIHFZZjcKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFstMjU2IHRvICsyNTVdCisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gU3RvcmUgb3V0cHV0IGRlcGVuZGluZyBvbiB0aGUgU3RyaWRlIHNpemUKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0gICAgICAgICAgICAKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYwVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjFVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYzVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjRVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNVU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY2VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjdVOCwgW3BEZXN0IEA2NF0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICA7Ly8gKCIkb3V0c2l6ZSI9InM5Iikgb3IgKCIkb3V0c2l6ZSI9InMxNiIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ESUYKKworCisKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisKKworCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBTY2FsZSBUV08gaW5wdXQgcm93cyB3aXRoIFRXTyByb3dzIG9mIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgTV9JRENUX1BSRVNDQUxFMTYgdG8gcHJlLXNjYWxlIG9uZSByb3cKKyAgICAgICAgOy8vIGlucHV0IChFaWdodCBpbnB1dCB2YWx1ZXMpIHdpdGggb25lIHJvdyBvZiBzY2FsZSB2YWx1ZXMuIEFsc28gCisgICAgICAgIDsvLyBMb2FkcyBuZXh0IHNjYWxlIHZhbHVlcyBmcm9tIHBTY2FsZSwgaWYgJExhc3RSb3cgZmxhZyBpcyBub3Qgc2V0LgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KKyAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLyBxVDBsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQwaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMWxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gZFNjYWxlMWxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KKyAgICAgICAgOy8vIGRTY2FsZTFoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUybG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLyBkU2NhbGUyaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgRmxhZworICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRMYXN0Um93ICAgICAgICAtIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHJvdyBpcyBsYXN0IHJvdworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4pCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4rMSkKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyBxU2NhbGUxICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93CisgICAgICAgIDsvLyBxU2NhbGUyICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93KzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfU0NBTEUxNiAkZEFsbywgJGRBaGksICRkQmxvLCAkZEJoaSwgJExhc3RSb3cKKyAgICAgICAgVk1VTEwgICAgICAgcVQwbG8sICRkQWxvLCBkU2NhbGUxbG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQwaGksICRkQWhpLCBkU2NhbGUxaGkKKyAgICAgICAgVk1VTEwgICAgICAgcVQxbG8sICRkQmxvLCBkU2NhbGUybG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQxaGksICRkQmhpLCBkU2NhbGUyaGkKKyAgICAgICAgSUYgIiRMYXN0Um93Ij0iMCIKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisxCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMgorICAgICAgICBFTkRJRgorICAgICAgICBWUVJTSFJOICAgICAgICRkQWxvLCBxVDBsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFoaSwgcVQwaGksICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRCbG8sIHFUMWxvLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmhpLCBxVDFoaSwgIzEyICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMTYgYml0IHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgorICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBxWGluICAgICAgICAgICAgLSBuIHRoIG91dHB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGowbG8sIGRYajBoaSwgZFhqMWxvLCBkWGoxaGksIDAgICAgICAgIDsvLyBQcmUgc2NhbGUgcm93IDAgJiAxCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajJsbywgZFhqMmhpLCBkWGozbG8sIGRYajNoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajRsbywgZFhqNGhpLCBkWGo1bG8sIGRYajVoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajZsbywgZFhqNmhpLCBkWGo3bG8sIGRYajdoaSwgMSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFYaTUsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTYsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGkzLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWGkyLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIGoyLWo2CisgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgIFZIQUREICAgICAgIHFYaTcsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTQsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgTUVORCAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDMyIGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIDMyYml0IHNjYWxlIHZhbHVlcyBpbiBRMjMgZm9ybWF0CisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGlubG8gICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKKyAgICAgICAgOy8vIGRYaW5oaSAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorcVNjYWxlMGxvICAgICAgIFFOIDAuUzMyCitxU2NhbGUwaGkgICAgICAgUU4gMS5TMzIKK3FTY2FsZTFsbyAgICAgICBRTiAyLlMzMgorcVNjYWxlMWhpICAgICAgIFFOIDMuUzMyCitxU2NhbGUybG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUyaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGUzbG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUzaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU0bG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGU0aGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU1bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU1aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU2bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU2aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU3bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU3aGkgICAgICAgUU4gcVNjYWxlMGhpCisKK3FTcmMwbG8gICAgICAgICBRTiA0LlMzMgorcVNyYzBoaSAgICAgICAgIFFOIDUuUzMyCitxU3JjMWxvICAgICAgICAgUU4gNi5TMzIKK3FTcmMxaGkgICAgICAgICBRTiBTcmM0LlMzMgorcVNyYzJsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMyaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjM2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzNoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM0bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjNGhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzVsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM1aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjNmxvICAgICAgICAgUU4gcVNyYzFsbworcVNyYzZoaSAgICAgICAgIFFOIHFTcmMxaGkKK3FTcmM3bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjN2hpICAgICAgICAgUU4gcVNyYzBoaQorCitxUmVzMTdsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMTdoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzMjZsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMjZoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzNTNsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzNTNoaSAgICAgICAgUU4gcVNjYWxlMGhpCisKKyAgICAgICAgICAgIEFERCAgICAgICAgIHBUZW1wLCBwU2NhbGUsICM0KjgqNyAgICAgICAgICAgOy8vIEFkZHJlc3Mgb2YgIHBTY2FsZVs3XQorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gUm93IDAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUwbG8sIHFTY2FsZTBoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBsbywgZFhqMGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGhpLCBkWGowaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUxbG8sIHFTY2FsZTFoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBsbywgcVNjYWxlMGxvLCBxU3JjMGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGhpLCBxU2NhbGUwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU3bG8sIHFTY2FsZTdoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWxvLCBkWGoxbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxaGksIGRYajFoaSwgIygxMi0xKSAgICAgICAgICAgIAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGxvLCBxU3JjMGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkwCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3bG8sIGRYajdsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdoaSwgZFhqN2hpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWxvLCBxU2NhbGUxbG8sIHFTcmMxbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxaGksIHFTY2FsZTFoaSwgcVNyYzFoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdsbywgcVNjYWxlN2xvLCBxU3JjN2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2hpLCBxU2NhbGU3aGksIHFTcmM3aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUybG8sIHFTY2FsZTJoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDEgJiA3CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIChqMStqNykvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk1CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1aGksIHFSZXMxN2hpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIGoxLWo3CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk2CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2aGksIHFSZXMxN2hpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmxvLCBkWGoybG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMyaGksIGRYajJoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTZsbywgcVNjYWxlNmhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2bG8sIGRYajZsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZoaSwgZFhqNmhpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmxvLCBxU2NhbGUybG8sIHFTcmMybG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMyaGksIHFTY2FsZTJoaSwgcVNyYzJoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZsbywgcVNjYWxlNmxvLCBxU3JjNmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmhpLCBxU2NhbGU2aGksIHFTcmM2aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUzbG8sIHFTY2FsZTNoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDIgJiA2CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2xvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkzCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzaGksIHFSZXMyNmhpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIGoyLWo2CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmxvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkyaGksIHFSZXMyNmhpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2xvLCBkWGozbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzaGksIGRYajNoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTVsbywgcVNjYWxlNWhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1bG8sIGRYajVsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVoaSwgZFhqNWhpLCAjKDEyLTEpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2xvLCBxU2NhbGUzbG8sIHFTcmMzbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzaGksIHFTY2FsZTNoaSwgcVNyYzNoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVsbywgcVNjYWxlNWxvLCBxU3JjNWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWhpLCBxU2NhbGU1aGksIHFTcmM1aGkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAzICYgNQorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNioyKjIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2hpLCBxUmVzNTNoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyBqNS1qMworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFYajQsIFtwU3JjIEA2NF0KKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGhpLCBxUmVzNTNoaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRsbywgZFhqNGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGhpLCBkWGo0aGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU0bG8sIHFTY2FsZTRoaX0sIFtwU2NhbGVdICAgICAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiAgICAgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRsbywgcVNjYWxlNGxvLCBxU3JjNGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGhpLCBxU2NhbGU0aGksIHFTcmM0aGkKKyAgICAgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgOy8vIFJvdyA0CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxbG8sIHFTcmM0bG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTEKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFoaSwgcVNyYzRoaSAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBNRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYTlkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKKyAqLworIAorCisKKyNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCisjZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXworCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKyAgCisvKiBNYXNrIHRhYmxlICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTViMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCisjaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KKyNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLworI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKKyNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQorCisvKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLworI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQorCisKKy8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCisjZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KKy8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCisKKy8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCisjZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMHAwLTAwYmV0MSIKKworLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY2IgorCisvKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKKworCisjZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYxZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX3MuaApAQCAtMCwwICsxLDExNTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCis7Ly8KKworOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KKyBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICisgR0JMTCBBUk1DT01NX1NfSAorCisgICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgCisgICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKK0FSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KKworOy8vIEdsb2JhbHMKKworICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKKyAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50CisgICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCisgICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCisgICAgICAgIAorICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZworICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCisgICAgICAgIAorICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKKyAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCisgICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50CisgICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQorICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKKyAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAorICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCisgICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAorICAgICAgICAKK19JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KK19TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKK19GICAgICAgICAgICAgICBTRVRBICAgIDAKK19Td051bSAgICAgICAgICBTRVRBICAgIDAKK18zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgorXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQorOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQorOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCitfQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCisgICAgICAgRUxTRQorX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAorICAgICAgIEVORElGCisKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCisgICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cworICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQorICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAorICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCisgICAgICAgIEdCTEwgJHZhcgorICAgICAgICBHQkxMIF9vayR2YXIKKyR2YXIgICAgU0VUTCB7RkFMU0V9CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKworICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0CisgICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAgICAgICAgOy8vIGNvcmUuCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX1ZBUklBTlQgJHYwCisgICAgICAgIF9NX1ZBUklBTlQgJHYxCisgICAgICAgIF9NX1ZBUklBTlQgJHYyCisgICAgICAgIF9NX1ZBUklBTlQgJHYzCisgICAgICAgIF9NX1ZBUklBTlQgJHY0CisgICAgICAgIF9NX1ZBUklBTlQgJHY1CisgICAgICAgIF9NX1ZBUklBTlQgJHY2CisgICAgICAgIF9NX1ZBUklBTlQgJHY3CisgICAgICAgIAorICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKKyAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKK19WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCisgICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUworICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1BOCwgICAgQ29ydGV4QTgsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQ29ydGV4LVI0LCAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTdURE1JCisgICAgICAgIAorICAgICAgICA7Ly8gU2VsZWN0IHRoZSBjb3JyZWN0IHZhcmlhbnQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIElGIF9WYXJpYW50PSIiCisgICAgICAgICAgICBJTkZPIDEsICJObyBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCisgICAgICAgIEVMU0UKKyRfVmFyaWFudCAgIFNFVEwge1RSVUV9CisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBSZWdpc3RlciBhIHZhcmlhbnQgYXMgYXZhaWxhYmxlCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1ZBUklBTlQgJHZhcgorICAgICAgICBJRiAiJHZhciI9IiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGIDpMTk9UOjpERUY6X29rJHZhcgorICAgICAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHZhcmlhbnQgJyR2YXInIgorICAgICAgICBFTkRJRgorJHZhciAgICBTRVRMIHtUUlVFfQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRm9yIGEgZ2l2ZW4gQ1BVLCBzZWUgaWYgYW55IG9mIHRoZSB2YXJpYW50cyBzdXBwb3J0aW5nCisgICAgICAgIDsvLyB0aGlzIENQVSBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgaXMKKyAgICAgICAgOy8vIGNob3NlbgorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkgJGNwdSwgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NworICAgICAgICBJRiAiJGNwdSI8Pl9DUFUKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1RSWTEgJHYwCisgICAgICAgIF9NX1RSWTEgJHYxCisgICAgICAgIF9NX1RSWTEgJHYyCisgICAgICAgIF9NX1RSWTEgJHYzCisgICAgICAgIF9NX1RSWTEgJHY0CisgICAgICAgIF9NX1RSWTEgJHY1CisgICAgICAgIF9NX1RSWTEgJHY2CisgICAgICAgIF9NX1RSWTEgJHY3CisgICAgICAgIDsvLyBDaGVjayBhIG1hdGNoIHdhcyBmb3VuZAorICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gdmFyaWFudCBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1RSWTEgJHZhcgorICAgICAgICBJRiAiJHZhciI9IiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGIChfVmFyaWFudD0iIik6TEFORDokdmFyCitfVmFyaWFudCBTRVRTICIkdmFyIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3RydWN0dXJlIGRlZmluaXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIG9mIGdpdmVuIG5hbWUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJVQ1QgJHNuYW1lCitfU3RydWN0IFNFVFMgIiRzbmFtZSIKK19TdE9mZiAgU0VUQSAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIGZpZWxkCisgICAgICAgIDsvLyBUaGUgZmllbGQgaXMgY2FsbGVkICRzbmFtZV8kZm5hbWUKKyAgICAgICAgOy8vICRzaXplICAgPSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5LCBtdXN0IGJlIHBvd2VyIG9mIDIgCisgICAgICAgIDsvLyAkbnVtYmVyID0gKGlmIHByb3ZpZGVkKSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZm9yIGFuIGFycmF5CisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRklFTEQgJGZuYW1lLCAkc2l6ZSwgJG51bWJlcgorICAgICAgICBJRiAoX1N0T2ZmOkFORDooJHNpemUtMSkpIT0wCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICgkc2l6ZSAtIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkpCisgICAgICAgIEVORElGCiskX1N0cnVjdC5fJGZuYW1lIEVRVSBfU3RPZmYKKyAgICAgICAgSUYgIiRudW1iZXIiPD4iIgorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZSokbnVtYmVyCisgICAgICAgIEVMU0UKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5EU1RSVUNUCitzaXplb2ZfJF9TdHJ1Y3QgRVFVIF9TdE9mZgorX1N0cnVjdCBTRVRTICIiCisgICAgICAgIE1FTkQKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBTd2l0Y2ggYW5kIHRhYmxlIG1hY3JvcworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gU3RhcnQgYSByZWxhdGl2ZSBzd2l0Y2ggdGFibGUgd2l0aCByZWdpc3RlciB0byBzd2l0Y2ggb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkdiA9IHRoZSByZWdpc3RlciB0byBzd2l0Y2ggb24KKyAgICAgICAgOy8vICRzID0gaWYgc3BlY2lmaWVkIG11c3QgYmUgIkwiIHRvIGluZGljYXRlIGxvbmcKKyAgICAgICAgOy8vICAgICAgdGhpcyBhbGxvd3MgYSBncmVhdGVyIHJhbmdlIHRvIHRoZSBjYXNlIGNvZGUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TV0lUQ0ggJHYsICRzCisgICAgICAgIEFTU0VSVCAiJHMiPSIiOkxPUjoiJHMiPSJMIgorX1N3TG9uZyBTRVRMIHtGQUxTRX0KKyAgICAgICAgSUYgIiRzIj0iTCIKK19Td0xvbmcgICAgIFNFVEwge1RSVUV9CisgICAgICAgIEVORElGCitfU3dOdW0gIFNFVEEgX1N3TnVtKzEgICAgICAgIAorICAgICAgICBJRiB7Q09ORklHfT0xNgorICAgICAgICAgICAgOy8vIFRodW1iCisgICAgICAgICAgICBJRiBfU3dMb25nCisgICAgICAgICAgICAgICAgVEJIIFtwYywgJHYsIExTTCMxXQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIFRCQiBbcGMsICR2XQorICAgICAgICAgICAgRU5ESUYKK19Td2l0Y2gkX1N3TnVtCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUk0KKyAgICAgICAgICAgIEFERCBwYywgcGMsICR2LCBMU0wgIzIKKyAgICAgICAgICAgIE5PUAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gQWRkIGEgY2FzZSB0byB0aGUgc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0NBU0UgICRsYWJlbAorICAgICAgICBJRiB7Q09ORklHfT0xNgorICAgICAgICAgICAgOy8vIFRodW1iCisgICAgICAgICAgICBJRiBfU3dMb25nCisgICAgICAgICAgICAgICAgRENXICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIERDQiAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUk0KKyAgICAgICAgICAgIEIgICAkbGFiZWwKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50CisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIEFMSUdOIDIKKyAgICAgICAgTUVORCAgICAgICAKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBEYXRhIGFyZWEgYWxsb2NhdGlvbgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIENvbnN0YW50IHRhYmxlIGFsbG9jYXRvciBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBmb3IgZWFjaCBjb25zdGFudCB0YWJsZQorICAgICAgICA7Ly8gJG5hbWUgaXMgc3ltYm9sIHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZC4KKyAgICAgICAgOy8vICRhbGlnbiBpcyB0aGUgb3B0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSwgbG9nMiBvZiAKKyAgICAgICAgOy8vICB0aGUgYnl0ZSBhbGlnbm1lbnQgLSAkYWxpZ249NCBpcyAxNiBieXRlIGFsaWduZWQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9UQUJMRSAgJG5hbWUsICRhbGlnbgorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAiJGFsaWduIj0iIgorICAgICAgICAgICAgQVJFQSB8LmNvbnN0ZGF0YXwsIFJFQURPTkxZLCBEQVRBCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUkVBcyBpbmhlcml0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgOy8vIFRoZXJlZm9yZSBmb3IgZWFjaCBhbGlnbm1lbnQgc2l6ZSB3ZSBtdXN0IGhhdmUgYW4gYXJlYQorICAgICAgICAgICAgOy8vIG9mIGEgZGlmZmVyZW50IG5hbWUuCisgICAgICAgICAgICBBUkVBIGNvbnN0ZGF0YV9hJGFsaWduLCBSRUFET05MWSwgREFUQSwgQUxJR049JGFsaWduCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBXZSBhbHNvIGZvcmNlIGFsaWdubWVudCBpbmNhc2Ugd2UgYXJlIHRhZ2dpbmcgb250bworICAgICAgICAgICAgOy8vIGFuIGFscmVhZHkgc3RhcnRlZCBhcmVhLgorICAgICAgICAgICAgQUxJR04gKDE8PCRhbGlnbikKKyAgICAgICAgRU5ESUYKKyRuYW1lCisgICAgICAgIE1FTkQKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCis7Ly8KKzsvLyBUaGVzZSBhbGwgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCis7Ly8gYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSAKKzsvLyAzMi1ieXRlIGFsaWdubWVudCBtYWNybyBuZWVkcyB0byB3b3JrIGluIGEKKzsvLyBiaXQgbW9yZSBvZiBhIHNwZWNpYWwgd2F5Li4uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAKKworCisgICAgICAgIDsvLyBBbGxvY2F0ZSAxLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MxICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDItYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MSkhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICgyIC0gKF9TQnl0ZXM6QU5EOjEpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgNC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DNCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDozKSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDQgLSAoX1NCeXRlczpBTkQ6MykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0M4ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMTYpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDE2IGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDE2IGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMTYgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzE2ICAgRVFVIChfU0J5dGVzICsgOCkKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDgKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSszMikgYnl0ZXMuCisgICAgICAgIDsvLyBUaGUgZXh0cmEgMzIgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMzIgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MzMiAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiRfMzIgICBFUVUgKF9TQnl0ZXMgKyAyNCkKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDI0CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFyZ3VtZW50IERlY2xhcmF0aW9uIE1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQWxsb2NhdGUgYW4gYXJndW1lbnQgbmFtZSAkbmFtZQorICAgICAgICA7Ly8gc2l6ZSAkc2l6ZSBieXRlcworICAgICAgICBNQUNSTworICAgICAgICBNX0FSRyAgICAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCBfSW5GdW5jCiskbmFtZSRfRiAgICBFUVUgX0FCeXRlcworX0FCeXRlcyBTRVRBIF9BQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIE1hY3JvcyB0byBhY2Nlc3Mgc3RhY2tlZCB2YXJpYWJsZXMKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBwcm9jZXNzaW5nIG9wZXJhdGlvbgorICAgICAgICA7Ly8gd2l0aCBhIGNvbnN0YW50IHNlY29uZCBvcGVyYW5kCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX09QQyAkb3AsJHJkLCRybiwkY29uc3QKKyAgICAgICAgTENMQSAgICBfc2gKKyAgICAgICAgTENMQSAgICBfY3N0Citfc2ggICAgIFNFVEEgICAgMAorX2NzdCAgICBTRVRBICAgICRjb25zdAorICAgICAgICBJRiBfY3N0PTAKKyAgICAgICAgJG9wICRyZCwgJHJuLCAjX2NzdAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgV0hJTEUgKF9jc3Q6QU5EOjMpPTAKK19jc3QgICAgICAgIFNFVEEgX2NzdD4+MgorX3NoICAgICAgICAgU0VUQSBfc2grMgorICAgICAgICBXRU5ECisgICAgICAgICRvcCAkcmQsICRybiwgIyhfY3N0OkFORDoweDAwMDAwMEZGKTw8X3NoCisgICAgICAgIElGIF9jc3Q+PTI1NgorICAgICAgICAgICAgJG9wICRyZCwgJHJkLCAjKF9jc3Q6QU5EOjB4RkZGRkZGMDApPDxfc2gKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBhY2Nlc3Mgb3BlcmF0aW9uCisgICAgICAgIDsvLyBTdWNoIGFzIExEUiBvciBTVFIKKyAgICAgICAgOy8vIFRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbW9kaWZpZWQgc3VjaCB0aGF0CisgICAgICAgIDsvLyAxLiBJZiBubyBhZGRyZXNzIGlzIGdpdmVuIHRoZW4gdGhlIG5hbWUgaXMgdGFrZW4KKyAgICAgICAgOy8vICAgIGFzIGEgc3RhY2sgb2Zmc2V0CisgICAgICAgIDsvLyAyLiBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZQorICAgICAgICA7Ly8gICAgc3RhdGUgYmVpbmcgYXNzZW1ibGVkIGZvciAoZWcgVGh1bWIpIHRoZW4gYSBzdWl0YWJsZQorICAgICAgICA7Ly8gICAgYWRkcmVzc2luZyBtb2RlIGlzIHN1YnN0aXR1dGVkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE9uIEVudHJ5OgorICAgICAgICA7Ly8gJGkgPSBJbnN0cnVjdGlvbiB0byBwZXJmb3JtIChlZyAiTERSQiIpCisgICAgICAgIDsvLyAkYSA9IFJlcXVpcmVkIGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLyAkciA9IFJlZ2lzdGVyKHMpIHRvIHRyYW5zZmVyIChlZyAicjEiKQorICAgICAgICA7Ly8gJGEwLCRhMSwkYTIuIEFkZHJlc3NpbmcgbW9kZSBhbmQgY29uZGl0aW9uLiBPbmUgb2Y6CisgICAgICAgIDsvLyAgICAgbGFiZWwgeyxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0gICAgICAgICAgICAgICAgICAgIHssLCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0XXshfSAgICAgICAgIHssLGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXQsIHNoaWZ0XXshfSAgeyxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCAgICAgICAgICAgIHssLGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0LCBzaGlmdCAgICAgeyxjY30KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREFUQSAkaSwkYSwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgSUYgIiRhMCI6TEVGVDoxPSJbIgorICAgICAgICAgICAgSUYgIiRhMSI9IiIKKyAgICAgICAgICAgICAgICAkaSRhMyAgICRyLCAkYTAKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBJRiAiJGEwIjpSSUdIVDoxPSJdIgorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICRhMQorICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgorICAgICAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICBMQ0xBICAgIF9PZmZzZXQKK19PZmZzZXQgICAgIFNFVEEgICAgX1dvcmtzcGFjZSArICRhMCRfRgorICAgICAgICAgICAgQVNTRVJUICAoX09mZnNldDpBTkQ6KCRhLTEpKT0wCisgICAgICAgICAgICAkaSRhMSAgICRyLCBbc3AsICNfT2Zmc2V0XQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHBvc3QgaW5kZXhlZCBsb2FkL3N0b3JlcworICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2VdLCBvZmZzZXQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUE9TVElORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGIHtDT05GSUd9PTE2IDsvLyBUaHVtYgorX2Jhc2UgICAgICAgU0VUUyAoIiRhMCI6TEVGVDooOkxFTjoiJGEwIi0xKSk6UklHSFQ6KDpMRU46IiRhMCItMikgICA7Ly8gcmVtb3ZlIFtdCitfb2Zmc2V0ICAgICBTRVRTICIkYTEiCisgICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iKyIKK19vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICRpICAkciwgJGEwCisgICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iLSIKK19vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQorICAgICAgICAgICAgICAgIFNVQiAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRSA7Ly8gQVJNCisgICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBIYW5kbGUgcHJlIGluZGV4ZWQgbG9hZC9zdG9yZQorICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2UsIG9mZnNldF17IX0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUFJFSU5EICRpLCRyLCRhMCwkYTEKKyAgICAgICAgTENMUyBfYmFzZQorICAgICAgICBMQ0xTIF9vZmZzZXQKKyAgICAgICAgSUYgKHtDT05GSUd9PTE2KTpMQU5EOigoIiRhMSI6UklHSFQ6Mik9Il0hIikKK19iYXNlICAgICAgIFNFVFMgIiRhMCI6UklHSFQ6KDpMRU46KCIkYTAiKS0xKQorX29mZnNldCAgICAgU0VUUyAiJGExIjpMRUZUOig6TEVOOigiJGExIiktMikKKyAgICAgICAgICAgICRpICRyLCBbJF9iYXNlLCAkX29mZnNldF0KKyAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHNpZ25lZCBieXRlIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTQiAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0IiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBieXRlIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUlNIICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJTSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIGhhbGYgd29yZCB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFIgICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgZG91YmxlIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBkb3VibGUgd29yZCB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSICAgJGEsICRiLCAkY2MKKyAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRikKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMTYgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIxNiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMTYpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAxNiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgwRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAzMiBieXRlcworICAgICAgICBNQUNSTworICAgICAgICBNX0FEUjMyICRhLCAkYiwgJGNjCisgICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8zMikKKyAgICAgICAgCisgICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDMyIGJ5dGVzCisgICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDFGCisgICAgICAgIE1FTkQKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBGdW5jdGlvbiBoZWFkZXIgYW5kIGZvb3RlciBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gSGVhZGVyIE1hY3JvICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQorICAgICAgICA7Ly8gTm90ZSB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgYWxsIGJlICJzdGFjay1tb3Zlcy1vbmNlIgorICAgICAgICA7Ly8gVGhlIEZOU1RBUlQgYW5kIEZORU5EIG1hY3JvcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2VzCisgICAgICAgIDsvLyB3aGVyZSB0aGUgc3RhY2sgbW92ZXMuCisgICAgICAgIDsvLyAgICAKKyAgICAgICAgOy8vICRuYW1lICA9IGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgOy8vICRycmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImxyIiBzdGFjayAibHIiIG9ubHkKKyAgICAgICAgOy8vICAgICAgICAgICJyTiIgc3RhY2sgcmVnaXN0ZXJzICJyNC1yTixsciIKKyAgICAgICAgOy8vICRkcmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IEQgcmVnaXN0ZXJzCisgICAgICAgIDsvLyAgICAgICAgICAiZE4iIHN0YWNrIHJlZ2lzdGVycyAiZDgtZE4iCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTm90ZTogQVJNIEFyY2hpY3R1cmUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQgQUFQQ1MKKyAgICAgICAgOy8vIHN0YXRlcyB0aGF0IHI0LXIxMSwgc3AsIGQ4LWQxNSBtdXN0IGJlIHByZXNlcnZlZCBieQorICAgICAgICA7Ly8gYSBjb21wbGlhbnQgZnVuY3Rpb24uCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RBUlQgJG5hbWUsICRycmVnLCAkZHJlZworICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBBU1NFUlQgIiRuYW1lIiE9IiIKK19JbkZ1bmMgU0VUTCB7VFJVRX0KK19SQnl0ZXMgU0VUQSAwCitfV29ya3NwYWNlIFNFVEEgMAorCisgICAgICAgIDsvLyBDcmVhdGUgYW4gYXJlYSBmb3IgdGhlIGZ1bmN0aW9uICAgICAgICAKKyAgICAgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisgICAgICAgIEVYUE9SVCAgJG5hbWUKKyRuYW1lICAgRlVOQ1RJT04KKyAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIFIgcmVnaXN0ZXJzCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGIF9SUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFNUTUZEICAgc3AhLCB7JF9SUmVnTGlzdCwgbHJ9CisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIEQgcmVnaXN0ZXJzCisgICAgICAgIF9NX0dFVERSRUdMSVNUICAkZHJlZyAgICAgICAgCisgICAgICAgIElGIF9EUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFZTVE1GRCAgc3AhLCB7JF9EUmVnTGlzdH0KKyAgICAgICAgRU5ESUYgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIEVuc3VyZSBzaXplIGNsYWltZWQgb24gc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKKyAgICAgICAgSUYgKChfU0J5dGVzOkFORDo3KSE9MCkKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgKF9TQnl0ZXMhPTApCisgICAgICAgICAgICBfTV9PUEMgU1VCLCBzcCwgc3AsIF9TQnl0ZXMKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIAorX0FCeXRlcyBTRVRBIF9TQnl0ZXMgKyBfUkJ5dGVzIC0gX1dvcmtzcGFjZQorCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFByaW50IGZ1bmN0aW9uIG5hbWUgaWYgZGVidWcgZW5hYmxlZAorICAgICAgICBNX1BSSU5URiAiJG5hbWVcbiIsCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgUiBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKKyAgICAgICAgSUYgIiRycmVnIj0iIgorX1JSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJHJyZWciPSJsciI6TE9SOiIkcnJlZyI9InI0IgorX1JSZWdMaXN0ICAgU0VUUyAicjQiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjUiOkxPUjoiJHJyZWciPSJyNiIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI2IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyNyI6TE9SOiIkcnJlZyI9InI4IgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjgiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI5IjpMT1I6IiRycmVnIj0icjEwIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEwIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyMTEiOkxPUjoiJHJyZWciPSJyMTIiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCByIHJlZ2lzdGVyIGxpbWl0ICckcnJlZyciCisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBEIHNhdmVkIHJlZ2lzdGVycworICAgICAgICBNQUNSTworICAgICAgICBfTV9HRVREUkVHTElTVCAkZHJlZworICAgICAgICBJRiAiJGRyZWciPSIiCitfRFJlZ0xpc3QgICBTRVRTICIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIElGICIkZHJlZyI9ImQ4IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDkiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kOSIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDEwIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEwIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTEiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTEiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMiIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDEzIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEzIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQ4CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTQiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTQiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxNSIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNSIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys2NAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIGQgcmVnaXN0ZXIgbGltaXQgJyRkcmVnJyIKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFByb2R1Y2UgZnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9ucworICAgICAgICBNQUNSTworICAgICAgICBfTV9SRVQgJGNjCisgICAgICAgIElGIF9EUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFZQT1AkY2MgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGCisgICAgICAgIElGIF9SUmVnTGlzdD0iIgorICAgICAgICAgICAgQlgkY2MgbHIKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNJGNjLkZEIHNwISwgeyRfUlJlZ0xpc3QsIHBjfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBFYXJseSBGdW5jdGlvbiBFeGl0IE1hY3JvCisgICAgICAgIDsvLyAkY2MgPSBjb25kaXRpb24gdG8gZXhpdCB3aXRoCisgICAgICAgIDsvLyAoRXhhbXBsZTogTV9FWElUIEVRKQorICAgICAgICBNQUNSTworICAgICAgICBNX0VYSVQgICRjYworICAgICAgICBBU1NFUlQgIF9JbkZ1bmMKKyAgICAgICAgSUYgIF9TQnl0ZXMhPTAKKyAgICAgICAgICAgIDsvLyBSZXN0b3JlIHN0YWNrIGZyYW1lIGFuZCBleGl0CisgICAgICAgICAgICBCJGNjICBfRW5kJF9GCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBDYW4gcmV0dXJuIGRpcmVjdGx5CisgICAgICAgICAgICBfTV9SRVQgJGNjCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEZvb3RlciBNYWNybyAgICAgICAgCisgICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVwaWxvZ3VlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5ECisgICAgICAgIEFTU0VSVCBfSW5GdW5jCitfSW5GdW5jIFNFVEwge0ZBTFNFfQorX0VuZCRfRgorCisgICAgICAgIDsvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBvbiBmdW5jdGlvbiBlbnRyeQorICAgICAgICBJRiBfU0J5dGVzIT0wCisgICAgICAgICAgICBfTV9PUEMgQURELCBzcCwgc3AsIF9TQnl0ZXMKKyAgICAgICAgRU5ESUYKKyAgICAgICAgX01fUkVUCisgICAgICAgIEVOREZVTkMKKworICAgICAgICA7Ly8gUmVzZXQgdGhlIGdsb2JhbCBzdGFjayB0cmFja2luZyB2YXJpYWJsZXMgYmFjayB0byB0aGVpciAKKyAgICAgICAgOy8vIGluaXRpYWwgdmFsdWVzLCBhbmQgaW5jcmVtZW50IHRoZSBmdW5jdGlvbiBjb3VudAorX1NCeXRlcyAgICAgICAgU0VUQSAwCitfRiAgICAgICAgICAgICBTRVRBIF9GKzEKKyAgICAgICAgTUVORAorCisgICAgICAgICAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIERlYnVnIE1hY3JvcworOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBHQkxMICAgIERFQlVHX09OCitERUJVR19PTiBTRVRMICAge0ZBTFNFfQorICAgICAgICBHQkxMICAgIERFQlVHX1NUQUxMU19PTgorREVCVUdfU1RBTExTX09OIFNFVEwge0ZBTFNFfQorICAgICAgICAKKyAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgOy8vIERlYnVnIGNhbGwgdG8gcHJpbnRmCisgICAgICAgIDsvLyAgTV9QUklOVEYgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEV4YW1wbGVzOgorICAgICAgICA7Ly8gIE1fUFJJTlRGICJ4PSUwOHhcbiIsIHIwCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG9mIGFsbCByZWdpc3RlcnMgaW5jbHVkaW5nIHRoZQorICAgICAgICA7Ly8gZmxhZ3MuCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9QUklOVEYgICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgSUYgREVCVUdfT04KKyAgICAgICAgCisgICAgICAgIElNUE9SVCAgcHJpbnRmCisgICAgICAgIExDTEEgICAgbkFyZ3MKK25BcmdzCVNFVEEgICAgMAorICAgICAgICAKKyAgICAgICAgOy8vIHNhdmUgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IGNvcnJ1cHQgdGhlbQorICAgICAgICBTVE1GRCAgIHNwISwge3IwLXIxMiwgbHJ9CisgICAgICAgIAorICAgICAgICA7Ly8gRHJvcCBzdGFjayB0byBnaXZlIHVzIHNvbWUgd29ya3NwYWNlCisgICAgICAgIFNVQiAgICAgc3AsIHNwLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyB3ZSBuZWVkIHRvIHByaW50IHRvIHRoZSBzdGFjaworICAgICAgICBJRiAiJHZhbDIiIDw+ICIiCisgICAgICAgICAgICBBU1NFUlQgIiR2YWwxIiA8PiAiIgorICAgICAgICAgICAgU1RSICAgICR2YWwyLCBbc3AsICM4XQorbkFyZ3MgICAgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwxIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMCIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMSwgW3NwLCAjNF0KK25BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHZhbDAiPD4iIgorICAgICAgICAgICAgU1RSICAgICR2YWwwLCBbc3BdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgd2UgYXJlIHNhZmUgdG8gY29ycnVwdCByZWdpc3RlcnMKKyAgICAgICAgQURSICAgICByMCwgJUZUMDAKKyAgICAgICAgSUYgbkFyZ3M9MQorICAgICAgICAgIExEUiAgIHIxLCBbc3BdCisgICAgICAgIEVORElGCisgICAgICAgIElGIG5BcmdzPTIKKyAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyfQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0zCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMixyM30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBwcmludCB0aGUgdmFsdWVzCisgICAgICAgIE1SUyAgICAgcjQsIGNwc3IgICAgICAgIDsvLyBwcmVzZXJ2ZSBmbGFncworICAgICAgICBCTCAgICAgIHByaW50ZgorICAgICAgICBNU1IgICAgIGNwc3JfZiwgcjQgICAgICA7Ly8gcmVzdG9yZSBmbGFncworICAgICAgICBCICAgICAgICVGVDAxCiswMCAgICAgIDsvLyBzdHJpbmcgdG8gcHJpbnQKKyAgICAgICAgRENCICAgICAiJGZvcm1hdCIsIDAKKyAgICAgICAgQUxJR04KKzAxICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIEFERCAgICAgc3AsIHNwLCAjMTYKKyAgICAgICAgOy8vIFJlc3RvcmUgcmVnaXN0ZXJzCisgICAgICAgIExETUZECXNwISwge3IwLXIxMixscn0KKworICAgICAgICBFTkRJRiAgIDsvLyBERUJVR19PTgorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8gU3RhbGwgU2ltdWxhdGlvbiBNYWNybworICAgICAgICA7Ly8gSW5zZXJ0cyBhIGdpdmVuIG51bWJlciBvZiBOT1BzIGZvciB0aGUgY3VycmVudGx5CisgICAgICAgIDsvLyAgZGVmaW5lZCBwbGF0Zm9ybQorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQUxMICRwbGF0MXN0YWxsLCAkcGxhdDJzdGFsbCwgJHBsYXQzc3RhbGwsICRwbGF0NHN0YWxsLCAkcGxhdDVzdGFsbCwgJHBsYXQ2c3RhbGwKKyAgICAgICAgSUYgREVCVUdfU1RBTExTX09OCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQxc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQyc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQzc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ0c3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ1c3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ2c3RhbGwgICAgCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdHN0YWxsCisgICAgICAgIElGICIkcGxhdHN0YWxsIiE9IiIKKyAgICAgICAgICAgIExDTEEgX3BsbGVuCisgICAgICAgICAgICBMQ0xTIF9wbAorICAgICAgICAgICAgTENMTCBfcGxsb2cKK19wbGxlbiAgICAgIFNFVEEgOkxFTjoiJHBsYXRzdGFsbCIKK19wbCAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOkxFRlQ6KF9wbGxlbiAtIDIpCisgICAgICAgICAgICBJRiA6REVGOiRfcGwKKyAgICAgICAgICAgICAgICBJRiAkX3BsCisgICAgICAgICAgICAgICAgICAgIExDTFMgX3N0CisgICAgICAgICAgICAgICAgICAgIExDTEEgX3N0bnVtCitfc3QgICAgICAgICAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOlJJR0hUOjEgICAgICAgIAorX3N0bnVtICAgICAgICAgICAgICBTRVRBICRfc3QKKyAgICAgICAgICAgICAgICAgICAgV0hJTEUgX3N0bnVtPjAKKwkJCU1PViBzcCwgc3AKK19zdG51bSAgICAgICAgICAgICAgICAgIFNFVEEgX3N0bnVtIC0gMQorICAgICAgICAgICAgICAgICAgICBXRU5ECisgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7Ly8gRW5kaWFuIEludmFyaWVuY2UgTWFjcm9zCis7Ly8gCis7Ly8gVGhlIGlkZWEgYmVoaW5kIHRoZXNlIG1hY3JvcyBpcyB0aGF0IGlmIGFuIGFycmF5IGlzCis7Ly8gbG9hZGVkIGFzIHdvcmRzIHRoZW4gdGhlIFNNVUwwMCBtYWNybyB3aWxsIG11bHRpcGx5Cis7Ly8gYXJyYXkgZWxlbWVudHMgMCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCis7Ly8gc3lzdGVtLiBGb3IgbGl0dGxlIGVuZGlhbiBTTVVMMDA9U01VTEJCLCBmb3IgYmlnCis7Ly8gZW5kaWFuIFNNVUwwMD1TTVVMVFQgYW5kIHNpbWlsYXJseSBmb3Igb3RoZXIgcGFja2VkIG9wZXJhdGlvbnMuCis7Ly8KKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTQgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgorICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMsICRkCisgICAgICAgIEVMU0UKKyAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBMSUJJMyAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjCisgICAgICAgIEVMU0UKKyAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBeHkgbWFjcm9zCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFCMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVQwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01VTHh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDBUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFCICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMVQgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTEIxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxUMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNTEFXeCwgU01VTFd4IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVcwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFXQiwgU01MQVdULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV1QsIFNNTEFXQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV0IsIFNNVUxXVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxXMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxXVCwgU01VTFdCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBTTUxBTHh5IG1hY3JvcworCisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDBCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxCMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTFQwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgIEVORElGIDsvLyBBUk1DT01NX1NfSAorICAgICAgICAgICAgCisgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyOWY3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1PTVhfUmVsZWFzZVZlcnNpb24uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgorICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAorICoKKyAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQorICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKKyAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldworICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAorICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKKyAqICAgYXQgcnVudGltZS4KKyAqCisgKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAorICogCisgKi8KKworICAKKyNpZm5kZWYgX2FybU9NWF9IXworI2RlZmluZSBfYXJtT01YX0hfCisKKworLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLworI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKKyNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKKworLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KKyNkZWZpbmUgQkFSRV9TVUZGSVggCisKKworCisvKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLworI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKKyNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKKworCisKKworLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLworI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisKKworI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCisKKyNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCisKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisKKworI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI5NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIEZpbGU6IG9teHR5cGVzLmgKKyAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworICAKKyNpZm5kZWYgX09NWFRZUEVTX0hfCisjZGVmaW5lIF9PTVhUWVBFU19IXworCisjaW5jbHVkZSA8bGltaXRzLmg+IAorCisjZGVmaW5lIE9NWF9JTgorI2RlZmluZSBPTVhfT1VUCisjZGVmaW5lIE9NWF9JTk9VVAorCisKK3R5cGVkZWYgZW51bSB7CisgICAgCisgICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KKyAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAorICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAorICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KKyAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCisgICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCisgICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCisJT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLworCisgICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCisgICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLworCisgICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCisKKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLworCisgICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCisKKyAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCisgICAgCisgfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLworCisgCisvKiBPTVhfVTggKi8KKyNpZiBVQ0hBUl9NQVggPT0gMHhmZgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKyNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKKyNlbHNlCisjZXJyb3IgT01YX1U4IHVuZGVmaW5lZAorI2VuZGlmIAorCisgCisvKiBPTVhfUzggKi8KKyNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzggdW5kZWZpbmVkCisjZW5kaWYKKyAKKyAKKy8qIE9NWF9VMTYgKi8KKyNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OworI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMTYgKi8KKyNpZiBTSFJUX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKKyNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1UzMiAqLworI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7CisjZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MzMiAqLworI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7CisjZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCisjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCisgICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCisjZWxzZQorICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQorI2VuZGlmCisKKworLyogT01YX1NDOCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMTYgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MzMiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzY0ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX0YzMiAqLwordHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9GNjQgKi8KK3R5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0lOVCAqLwordHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLworCisKKyNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKKyNkZWZpbmUgT01YX01JTl9VOCAgCQkwCisjZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCisjZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAorI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKKworI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKKyNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCisjZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQorI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCisjZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCisjZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCisKK3R5cGVkZWYgdm9pZCBPTVhWb2lkOworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCisgICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKKyAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAorICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KKwlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCit9T01YUmVjdDsKKworCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KKyBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KKwkKK30gT01YUG9pbnQ7CisKKworLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KKyBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KKwkKK30gT01YU2l6ZTsKKworI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDI0YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlc19zLmgKQEAgLTAsMCArMSw3NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uIAorT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgRVFVICAwICAgIDsvLyBObyBlcnJvciB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAKK09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgIEVRVSAtMiAgICA7Ly8gVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAgICAgCitPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICBFUVUgLTE4MiAgOy8vIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICAgICAKK09NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgIEVRVSAtOSAgICA7Ly8gTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uIAorT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgRVFVIC0xNTkgIDsvLyBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkIAorT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgRVFVIC0xNjcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgIAorT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgRVFVIC0xNjMgIDsvLyBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICBFUVUgLTE2MiAgOy8vIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICAgICAKK09NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgIEVRVSAtMTYwICA7Ly8gQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAKKworOy8vIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24KK09NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgIEVRVSAtNSAgICA7Ly8gQmFkIEFyZ3VtZW50cyAKKworT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgRVFVIC0xNTcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAKK09NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgIEVRVSAtMTU2ICA7Ly8gQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAgICAKK09NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgIEVRVSAtMTU1ICA7Ly8gQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgRVFVIC0xNTQgIDsvLyBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgIEVRVSAtMTUzICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgIEVRVSAtMTUyICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAgIAorCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICBFUVUgLTE4MyAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAKK09NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgIEVRVSAtMTgxICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICBFUVUgLTE3ICAgOy8vIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAKKworT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgRVFVIC0xODAgIDsvLyBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgCisKK09NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgIEVRVSAweDdGRkZGRkZGCisKKworCitPTVhfTUlOX1M4ICAgICAgRVFVIAkgICAJKC0xMjgpCitPTVhfTUlOX1U4ICAJRVFVICAgICAJMAorT01YX01JTl9TMTYJCUVRVSAgICAgIAkoLTMyNzY4KQorT01YX01JTl9VMTYJCUVRVQkgICAgICAgIDAKKworCitPTVhfTUlOX1MzMgkJRVFVCSgtMjE0NzQ4MzY0Ny0xKQorT01YX01JTl9VMzIJCUVRVQkwCisKK09NWF9NQVhfUzgJCUVRVQkoMTI3KQorT01YX01BWF9VOAkJRVFVCSgyNTUpCitPTVhfTUFYX1MxNgkJRVFVCSgzMjc2NykKK09NWF9NQVhfVTE2CQlFUVUJKDB4RkZGRikKK09NWF9NQVhfUzMyCQlFUVUJKDIxNDc0ODM2NDcpCitPTVhfTUFYX1UzMgkJRVFVCSgweEZGRkZGRkZGKQorCitPTVhfVkNfVVBQRVIgICAgRVFVIDB4MSAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKK09NWF9WQ19MRUZUICAgICBFUVUgMHgyICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAKK09NWF9WQ19VUFBFUl9SSUdIVCAgICBFUVUgMHg0MCAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAorCitOVUxMICAgIEVRVSAwCisKKzsvLyBTdHJ1Y3R1cmVzCisKKyAgICBJTkNMVURFICAgICBhcm1DT01NX3MuaAorCisgICAgTV9TVFJVQ1QgICAgT01YUG9pbnQKKyAgICBNX0ZJRUxEICAgICB4LCA0CisgICAgTV9GSUVMRCAgICAgeSwgNAorICAgIE1fRU5EU1RSVUNUCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYnVpbGRfdmMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWFlNzAwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9idWlsZF92Yy5wbApAQCAtMCwwICsxLDExMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIAorIyBGaWxlIE5hbWU6ICBidWlsZF92Yy5wbAorIyBPcGVuTUFYIERMOiB2MS4wLjIKKyMgUmV2aXNpb246ICAgOTY0MQorIyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorIyAKKyMgKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIAorIyAKKyMKKyMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgorIworCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBzdHJpY3Q7CisKK215ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7CisKKyRDQyAgICAgICA9ICdhcm1jYyc7CiskQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMgLWMnOworJEFTICAgICAgID0gJ2FybWFzbSc7CiskQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTExMzZKLVMnOworIyAkTElCICAgICAgPSAnYXJtbGluayc7CisjICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOworIyAkTElCX1RZUEUgPSAnLm8nOworJExJQiAgICAgID0gJ2FybWFyJzsKKyRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7CiskTElCX1RZUEUgPSAnLmEnOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK215IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCitAaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKKworIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCitvcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKK0BmaWxlbGlzdCA9IDxGSUxFUz47CitjbG9zZShGSUxFUyk7CisKKyMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocworZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCit7CisgICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKK30KKworIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCiskaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOworCisjIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCitta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Citta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7CisKKyRvYmpsaXN0ID0gJyc7CisKKyMgQ29tcGlsZSBlYWNoIGZpbGUKK2ZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKK3sKKwlteSAkZjsKKwlteSAkYmFzZTsKKwlteSAkZXh0OworCW15ICRvYmpmaWxlOworCisJY2hvbXAoJGZpbGUpOworCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKKworCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7CisJaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCisJeworCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOworCisJCWlmKCRleHQgZXEgJ2MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2lmKCRleHQgZXEgJ3MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOworCQl9CisJfQorCWVsc2UKKwl7CisJCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOworCX0KK30KKworIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KKyRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOworJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKK3ByaW50ICIkY29tbWFuZFxuIjsKKyhzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNjIzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQKQEAgLTAsMCArMSw3NCBAQAorLi9hcGkvYXJtQ09NTS5oCisuL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKy4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKy4vYXBpL2FybUNPTU1fSURDVF9zLmgKKy4vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKKy4vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKy4vYXBpL2FybUNPTU1fcy5oCisuL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKy4vYXBpL29teHR5cGVzLmgKKy4vYXBpL29teHR5cGVzX3MuaAorLi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworLi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworLi92Yy9hcGkvYXJtVkMuaAorLi92Yy9hcGkvYXJtVkNDT01NX3MuaAorLi92Yy9hcGkvb214VkMuaAorLi92Yy9hcGkvb214VkNfcy5oCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKy4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCisuL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzJhODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU0uYwpAQCAtMCwwICsxLDkzNiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgVmFsdWUgKz0gMC41OworICAgIAorICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0CisgKgorICovCisKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKKyAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQorICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqLyAKKworT01YX0lOVCBhcm1TaWduQ2hlY2sgKAorICAgIE9NWF9TMTYgdmFyCispCisKK3sKKyAgICBPTVhfSU5UIFNpZ247CisgICAgCisgICAgaWYgKHZhciA8IDApCisgICAgeworICAgICAgICBTaWduID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKCB2YXIgPiAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNpZ24gPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gU2lnbjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgT01YX0lOVCBtaW4sCisgICAgT01YX0lOVCBtYXgsIAorICAgIE9NWF9TMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICBPTVhfRjMyIG1pbiwKKyAgICBPTVhfRjMyIG1heCwgCisgICAgT01YX0YzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAorICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KKyAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAorICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCisgKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgorICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQorICovIAorIAorT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAoreworICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7CisgICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7CisgICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOworICAgIE9NWF9VMzIgdkludDsKKyAgICBPTVhfVTMyIHZJbnRTYXQ7CisgICAgCisgICAgaWYodiA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKKyAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7CisgICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOworICAgIHZJbnRTYXQgPSB2SW50OworICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKKyAgICAgICAgdkludFNhdCA9IG1heFY7CisgICAgcmV0dXJuIHZJbnRTYXQ7Cit9CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbSgKKyAgICAgICAgT01YX1U4ICpwQnVmMSwKKyAgICAgICAgT01YX1U4ICpwQnVmMiwKKyAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQorICAgICAgICkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgT01YX1U4IHRlbXA7CisgICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCisgICAgeworICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOworICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7CisgICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKykKK3sKKyAgICBPTVhfUzMyIGEsIGIsIGM7CisgICAgCisgICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOworICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOworICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAorICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKykKK3sKKyAgICBPTVhfVTggaTsgICAgCisgICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKKyAgICB7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQoreworICAgIE9NWF9TNjQgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCisgICAgeworICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKKyAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiovCisKK09NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7CisgICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7CisKKyAgICByZXR1cm4gUmVzdWx0OyAgICAKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQoreworICAgIAorICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCisKKyAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOworICAgIH0KKyAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOworICAgIH0KKworICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7CisgICAgCisgICAgcmV0dXJuIG1hYzsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgorICoKKyAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKK3sKKyAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOworCisgICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7CisgICAgfQorCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKiAgICAgCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMixsbzE7CisgICAgT01YX1UxNiBsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKyAgICAKKyAgICBsbzEgID0gaW5wdXQxOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKKyAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkxLGhpMjsKKyAgICBPTVhfVTE2IGxvMSxsbzI7CisgICAgCisgICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKKyAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gICBoaTEgKiBoaTI7CisgICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7CisgICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKKyAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQorICoKKyAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAorICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCisgKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCisgKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCit7CisgICAgT01YX0Y2NCByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOworICAgIAorICAgIGlmIChyZXN1bHQgPj0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCArPSAwLjU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCAtPSAwLjU7CisgICAgfQorCisgICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOworfQorCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmOTMxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpAQCAtMCwwICsxLDMyOSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uLjMyCisgKgorICogUmV0dXJucyAgVmFsdWUKKyAqLworCitPTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworCitPTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKK3sKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIAorICAgIGlmKE4gPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQoreworICAgIGlmKCpwT2Zmc2V0ID4gMCkKKyAgICB7CisgICAgICAgICpwcEJpdFN0cmVhbSArPSAxOworICAgICAgICAqcE9mZnNldCA9IDA7CisgICAgfSAgICAKK30KKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworCitPTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQoreworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgcENvZGVCb29rCisgKiAKKyAqIFtvdXRdICAgICpwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKyNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKQoreyAgICAKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgIE9NWF9JTlQgSW5kZXg7CisgICAgICAgIAorICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCisgICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKKyAgICB7CisgICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOworICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOworICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIEluZGV4OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcENvZGVCb29rKys7CisgICAgfQorCisgICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLworICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tCaXRzICgKKyAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgT01YX1UzMiBjb2RlV29yZCwgCisgICAgT01YX0lOVCBjb2RlTGVuZ3RoIAorKQoreworICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBPTVhfVTMyIFZhbHVlOworICAgICAgICAKKyAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KKyAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7CisgICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7CisKKyAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KKyAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKKyAgICB7CisgICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOworICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7CisgICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKKyAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCisgICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKKyAgICAKKyAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKQoreworICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOworfQorCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQ2NzljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NX0lEQ1RUYWJsZS5jCisgKiBCcmllZjogRGVmaW5lcyBUYWJsZXMgdXNlZCBpbiBJRENUIGNvbXB1dGF0aW9uCisgKgorICovCisKKyNpbmNsdWRlICJhcm1DT01NX0lEQ1RUYWJsZS5oIgorCisgICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKKyAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1CisgICAgICAqICBzKDYpPTIuMAorICAgICAgKiAgcyg3KT00LjAKKyAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKKyAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQorCSAgKi8KKwkgIAorX19hbGlnbig0KSBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF0gPQoreworICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAorICAgIDB4NThjNSwgMHg3YjIxLCAweDczZmMsIDB4Njg2MiwgMHg1OGM1LCAweDQ1YmYsIDB4NjAxNiwgMHg2MWY4LAorICAgIDB4NTM5ZiwgMHg3M2ZjLCAweDZkNDEsIDB4NjI1NCwgMHg1MzlmLCAweDQxYjMsIDB4NWE4MiwgMHg1YzQ4LAorICAgIDB4NGI0MiwgMHg2ODYyLCAweDYyNTQsIDB4NTg3ZSwgMHg0YjQyLCAweDNiMjEsIDB4NTE3NSwgMHg1MzBkLAorICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAorICAgIDB4MzI0OSwgMHg0NWJmLCAweDQxYjMsIDB4M2IyMSwgMHgzMjQ5LCAweDI3ODIsIDB4MzY2ZCwgMHgzNzdlLAorICAgIDB4MjJhMywgMHgzMDBiLCAweDJkNDEsIDB4MjhiYSwgMHgyMmEzLCAweDFiMzcsIDB4MjU3ZSwgMHgyNjNhLAorICAgIDB4MTFhOCwgMHgxODdlLCAweDE3MTIsIDB4MTRjMywgMHgxMWE4LCAweDBkZTAsIDB4MTMxZCwgMHgxMzdkICAgIAorfTsKKyAgICAvKiBBYm92ZSBhcnJheSBhcm1DT01NX0lEQ1RQcmVTY2FsZSwgIGluIFEyMyBmb3JtYXQgKi8KK2NvbnN0IE9NWF9VMzIgYXJtQ09NTV9JRENUUHJlU2NhbGVVMzIgWzY0XSA9Cit7CisgICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAorICAgIDB4NThjNTQzLCAweDdiMjBkOCwgMHg3M2ZiZmMsIDB4Njg2MjE0LCAweDU4YzU0MywgMHg0NWJmMWYsIDB4NjAxNWE1LCAweDYxZjc4YiwKKyAgICAweDUzOWViYSwgMHg3M2ZiZmMsIDB4NmQ0MTNkLCAweDYyNTNhNiwgMHg1MzllYmEsIDB4NDFiMzI4LCAweDVhODI3YSwgMHg1YzQ4NjksCisgICAgMHg0YjQxOGMsIDB4Njg2MjE0LCAweDYyNTNhNiwgMHg1ODdkZTMsIDB4NGI0MThjLCAweDNiMjBkOCwgMHg1MTc0ZTAsIDB4NTMwZDY5LAorICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDMyNDhkNCwgMHg0NWJmMWYsIDB4NDFiMzI4LCAweDNiMjBkOCwgMHgzMjQ4ZDQsIDB4Mjc4MjFkLCAweDM2NmQ3MiwgMHgzNzdlNmIsCisgICAgMHgyMmEyZjUsIDB4MzAwYWQzLCAweDJkNDEzZCwgMHgyOGJhNzAsIDB4MjJhMmY1LCAweDFiMzZiOSwgMHgyNTdkODYsIDB4MjYzOThkLAorICAgIDB4MTFhODU2LCAweDE4N2RlMywgMHgxNzEyMWEsIDB4MTRjMzVhLCAweDExYTg1NiwgMHgwZGRmOWIsIDB4MTMxY2M3LCAweDEzN2NhMgorfTsKKyAgIAorY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XSA9Cit7CisgICAgMHg1YTgyLCAvKiBJbnZTcXJ0MiAqLworICAgIDB4MzBmYywgLyogU2luUElCeTggKi8KKyAgICAweDc2NDIsIC8qIENvc1BJQnk4ICovCisgICAgMHgwMDAwICAgIAorfTsKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQxZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKworY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCit9OworCitjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhNzcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkMuaApAQCAtMCwwICsxLDExNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiBhcm1WaWRlby5oCisgKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KKyAqCisgKi8KKworCisjaWZuZGVmIF9hcm1WaWRlb19IXworI2RlZmluZSBfYXJtVmlkZW9fSF8KKworI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqCisgKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCisgKi8KKyAKK3N0cnVjdCBtNHAyX01FU3BlYworeworICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKK307CisKK3N0cnVjdCBtNHAxMF9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwordHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQorICogYmVzdCBNViBhbmQgU0FECisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAorICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAorICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAorICovCisKK09NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCisgICAgT01YX1MxNiBtdlgsCisgICAgT01YX1MxNiBtdlksCisgICAgT01YX0lOVCBjYW5kU0FELAorICAgIE9NWF9TMTYgYmVzdE1WWCwKKyAgICBPTVhfUzE2IGJlc3RNVlksCisgICAgT01YX0lOVCBiZXN0U0FEKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCisgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jaworICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCisgKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00CisgKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCisgKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQorICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCisgKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKKyAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cworICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKKyAgICAgT01YX1U4IGZsYWcsCisgICAgIE9NWF9JTlQgKnBTdW1FcnIKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCisgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKKyAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfSU5UICpwcmVkRGlyLAorICAgICBPTVhfSU5UICpwcmVkUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgorICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX1U4IHBhdHRlcm4sCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgT01YX1U4IHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKKyAgICAgT01YX1U4ICBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKKyAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCisgKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKKyAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAorICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCisgKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4CisgKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcworICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKKyAgICBPTVhfVTMyIHN0b3JlUnVuLAorICAgIE9NWF9TMTYgKiBwRHN0LAorICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKKyAgICBPTVhfVTggIHNpZ24sCisgICAgT01YX1U4ICBsYXN0LAorICAgIE9NWF9VOCAgKiBpbmRleCwKKyAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKwkJCSAgT01YX1MxNiAqIHBEc3QsCisJCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKwkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCisJCQkgIE9NWF9VOCAgKiBwTGFzdCwKKwkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisJCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAorICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAorICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCisgKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAorICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgT01YX1UzMiBydW4sCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAorCQkJICBPTVhfVTMyIHJ1blBsdXMsCisgICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKKyAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKKwkJCSAgT01YX1U4ICBsYXN0LAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAorICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQorICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKgorICogICAgICAgICAgICAgICAgICAgICAgCisgKiBSZXR1cm4gVmFsdWU6CisgKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMworICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCisgKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKKyAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KKyAqCisgKi8KKworT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgIE9NWF9VMzIgcnVuLAorICAgICBPTVhfVTMyIHJ1blBsdXMsCisgICAgIE9NWF9TMTYgbGV2ZWwsCisgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAorICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAorICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQorKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKKyAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKKyAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKKyAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCisgKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKKyAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAorICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00CisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCisgKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKKyAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgorICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCisgKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KKyAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKKyAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKKyAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKKyAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKKyAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAorICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAorICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCisgKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCisgKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCisgKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKKyAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cworICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRCwKKyAgICAgT01YX1U4IEJsb2NrU2l6ZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCisgKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jaworICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKKyAgICAgT01YX1U4ICogcFRyYW5zcAorKTsKKworLyogCisgKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCisgKi8KKy8qIERlZmluZXMgKi8KKyNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCisKKworLyogRGVxdWFudCB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107CitleHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOworCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAorICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KKyAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQorICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKworICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBuVGFibGUsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jaworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAorICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKKyAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKKyAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKKyAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcworICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCisgKiAKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLworICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLworICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLworICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLworICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCisgICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KKyAgICBpbnQgQ2hyb21hRmxhZworKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKKwkJT01YX1UzMiAJaVNyY1N0ZXAsIAorCQlPTVhfVTgqIAlwRHN0LCAKKwkJT01YX1UzMiAJaURzdFN0ZXAsIAorCQlPTVhfVTMyIAlpV2lkdGgsIAorCQlPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKKwkgY29uc3QgT01YX1U4KiAJcFNyYywgCisJIE9NWF9VMzIgCWlTcmNTdGVwLCAKKyAJIE9NWF9VOCogCXBEc3QsCisgCSBPTVhfVTMyIAlpRHN0U3RlcCwgCisgCSBPTVhfVTMyIAlpV2lkdGgsIAorIAkgT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgT01YX1MxNiAgbXZYLAorICAgIE9NWF9TMTYgIG12WSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAorICAgIE9NWF9JTlQgY2FuZFNBRCwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jaworICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKKwljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAorCU9NWF9VMzIgCWlTdGVwT3JnLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCisJT01YX1UzMiAJaVN0ZXBSZWYsCisJT01YX1MzMioJcERzdFNBRCwKKwlPTVhfVTMyCQlpSGVpZ2h0LAorCU9NWF9VMzIJCWlXaWR0aCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKKyAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCisgKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpV2lkdGgsCisJIE9NWF9VMzIJCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCisgKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCisgKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQorICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKKyAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAorCWNvbnN0IE9NWF9VOCogCXBTcmMsCisgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQorICAgIE9NWF9VMzIgCWlTcmNTdGVwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCisgICAgT01YX1UzMioJcERzdFNBRCwKKyAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgIE9NWF9VMzIgICAgIGlXaWR0aAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCisgICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgICAgIE9NWF9VMzIgICAgIGR4LAorICAgICAgICBPTVhfVTMyICAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisgICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCisgICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCisgICAgIE9NWF9VOCAgICAgKnBEc3QsCisgICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCisgICAgIE9NWF9VMzIgICAgaVdpZHRoLAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCisgICAgIE9NWF9VMzIgICAgZHgsCisgICAgIE9NWF9VMzIgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4CisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCisgKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgorICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KKyAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCisgKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0CisgKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cworICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCisgICAgIE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2ICpwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfUzE2KiBwREMsCisgICAgIGludCBBQworKTsKKworI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwYTliOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkNDT01NX3MuaApAQCAtMCwwICsxLDcyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggQUMgaGVhZGVyIGZpbGUKKzsvLyAKKzsvLyBGb3JtdWxhIHVzZWQ6Cis7Ly8gTUFDUk8gZm9yIGNhbGN1bGF0aW5nIG1lZGlhbiBmb3IgdGhyZWUgdmFsdWVzLgorCisKKworICAgIElGIDpMTk9UOjpERUY6QVJNVkNDT01NX1NfSAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgTV9WQVJJQU5UUyAgICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTggCisgICAgIAorICAgICA7Ly8vKgorICAgICA7Ly8gKiBNYWNybzogTV9NRURJQU4zCisgICAgIDsvLyAqCisgICAgIDsvLyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAgICAgOy8vICogCisgICAgIDsvLyAqIFJlbWFya3M6CisgICAgIDsvLyAqCisgICAgIDsvLyAqIFBhcmFtZXRlcnM6CisgICAgIDsvLyAqIFtpbl0geCAgICAgRmlyc3QgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCisgICAgIDsvLyAqIFtpbl0geSAgICAgU2Vjb25kIGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIG1heSBiZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZgorICAgICA7Ly8gKiAgICAgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KKyAgICAgOy8vICogW2luXSB6ICAgICBUaGlyZCBlbnRyeSBvZiB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mIHRoZSAKKyAgICAgOy8vICogICAgICAgICAgICBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KKyAgICAgOy8vICogW2luXSB0ICAgICBUZW1wb3Jhcnkgc2NyYXRjaCAgcmVnaXN0ZXIuCisgICAgIDsvLyAqIFtvdXRdeiAgICAgTWVkaWFuIG9mIHRoZSB0aHJlZSBudW1iZXJzLiAgICAgICAKKyAgICAgOy8vICovCisgICAgIAorICAgICBNQUNSTworCisgICAgIE1fTUVESUFOMyAkeCwgJHksICR6LCAkdCAKKyAgICAgCisgICAgIFNVQlMgICR0LCAkeSwgJHo7IC8vIGlmICh5IDwgeikKKyAgICAgQURETFQgJHosICR6LCAkdDsgLy8gIHN3YXAgeSBhbmQgegorICAgICBTVUJMVCAkeSwgJHksICR0OworCisgICAgIDsvLyBOb3cgeicgPD0geScsIHNvIHRoZXJlIGFyZSB0aHJlZSBjYXNlcyBmb3IgdGhlCisgICAgIDsvLyBtZWRpYW4gdmFsdWUsIGRlcGVuZGluZyBvbiB4LgorCisgICAgIDsvLyAxKSB4IDw9IHonICAgICAgPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB6JworICAgICA7Ly8gMikgICAgICB6JyA8PSB4IDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeAorICAgICA7Ly8gMykgICAgICB6JyAgICAgIDw9IHknIDw9IHggOiBtZWRpYW4gdmFsdWUgaXMgeScKKworICAgICBDTVAgICAkeiwgJHg7ICAgICAvLyBpZiAoIHggPiBtaW4oeSx6KSApCisgICAgIE1PVkxUICR6LCAkeDsgICAgIC8vIGFucyA9IHggCisKKyAgICAgQ01QICAgJHgsICR5OyAgICAgLy8gaWYgKCB4ID4gbWF4KHkseikgKQorICAgICBNT1ZHVCAkeiwgJHk7ICAgICAvLyBhbnMgPSBtYXgoeSx6KQorICAgICAKKyAgICAgTUVORAorICAgIEVORElGICAgICAgCisgICAgCisgICAgCisgICAgICAgIAorICAgIEVORElGIDsvLyBBUk1BQ0NPTU1fU19ICisKKyBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzY2M3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkMuaApAQCAtMCwwICsxLDQzODEgQEAKKy8qKgorICogRmlsZTogb214VkMuaAorICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9PTVhWQ19IXworI2RlZmluZSBfT01YVkNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLworLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMTYgZHg7CisgICAgT01YX1MxNiBkeTsKK30gT01YVkNNb3Rpb25WZWN0b3I7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAorICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKKyAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKKyAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAorICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCisgKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCisgKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCisgKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKKyAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAorICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKKyAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKKyAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKKyAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCisgKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAorICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAorICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCisgICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCisgICAgT01YX1UzMiBpRXhwYW5kUGVscywKKyAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAorICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCisgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCisgKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCisgKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCisgKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAorICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAorICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCisgKiAgICAgICAgICAgIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKKyAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAorICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCisgICAgT01YX0lOVCBYY29vcmQsCisgICAgT01YX0lOVCBZY29vcmQsCisgICAgT01YX0lOVCBzaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KKy8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCisgICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAorICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKK307CisKKworCisvKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCisvKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCisKK2VudW0geworICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAorfTsKKworCisKKy8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCisvKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0NFTlRFUiA9IDQsCisgICAgT01YX1ZDX1JJR0hUID0gOCwKKyAgICBPTVhfVkNfTE9XRVIgPSAxNiwKKyAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCisgICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAorfTsKKworCisKKy8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KKyAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAorfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKKworCisKKy8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCisvKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHg7CisgICAgT01YX0lOVCB5OworfSBPTVhWQ000UDJDb29yZGluYXRlOworCisKKworLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMk1FTW9kZTsKKworCisKKy8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KKyAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KKyAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KKyAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLworfSBPTVhWQ000UDJNRVBhcmFtczsKKworCisKKy8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KKyAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCisgKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAorICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCisgKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKKyAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAorICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKKyAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKKyAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKKyAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCisgKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKKyAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKKyAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCisgKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCisgKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAorICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCisgICAgT01YX0lOVCBpQmxrCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAorICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKKyAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKKyAqICAgICAgICAgICAgLTQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCisgKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKKyAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAorICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAorICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKKyAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAorICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCisgKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCisgKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCisgKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAorICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCisgKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAorICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCisgKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKKyAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCisgKiAgICAgICAgICAgIGlnbm9yZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKKyAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCisgKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCisgKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAorICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCisgKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAorICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTE2ICpwRHN0U0FELAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKKyAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAorICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAorICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKKyAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKKyAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCisgKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKKyAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAorICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCisgKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCisgKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCisgKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCisgKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCisgKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCisgKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAorICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKKyAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAorICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCisgKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCisgKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAorICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCisgKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAorICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCisgKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAorICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCisgKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAorICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKKyAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAorICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAorICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKKyAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKKyAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKKyAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCisgKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICBwU3JjLCBwUmVjLiAgCisgKgorICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggKnBSZWMsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKKyAgICBPTVhfSU5UICpwU3VtRXJyLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfVTggY3VyUXAsCisgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKKyAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCisgKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKKyAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgICAgIC0gcFNyYyAKKyAqICAgICAgICAgICAgLSBwRHN0CisgKiAgICAgICAgICAgIC0gcFJlYworICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfUzE2ICpwUmVjLAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCisgKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCisgKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAorICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAorICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCisgKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKKyAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCisgKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKKyAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKKyAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKKyAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgc3ludGF4IAorICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAorICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAorICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCisgKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybworICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gCisgKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAorICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWY6CisgKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCisgKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKKyAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKKyAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAorICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKKyAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKKyAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCisgKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKKyAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKKyAqCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCisgKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAorICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCisgKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKKyAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCisgKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKKyAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKKyAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCisgKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQorICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAorICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwLAorICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgIE9NWF9VOCBjdXJRUCwKKyAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX0lOVCBjdXJRUCwKKyAgICBPTVhfSU5UIHByZWRRUCwKKyAgICBPTVhfSU5UIHByZWREaXIsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAorICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAorICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAorICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAorICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAorICogICAgICAgICAgICA2LjIuMS4yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCisgKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAorICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAorICAgIE9NWF9JTlQgcm5kVmFsCispOworCisKKworLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCisgICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOworCisKKworLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKK30gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KKyAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7CisKKworCisvKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMTBNRU1vZGU7CisKKworCisvKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19QXzE2eDggID0gMSwKKyAgICBPTVhfVkNfUF84eDE2ICA9IDIsCisgICAgT01YX1ZDX1BfOHg4ICA9IDMsCisgICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAorICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCisgICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAorICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAorICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKK30gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKKyAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKKyAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKK30gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLworICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCisgICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCisgICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCisgICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCit9IE9NWFZDTTRQMTBWTENJbmZvOworCisKKworLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLworICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCisgICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KKyAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCisgICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLworICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLworICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KK30gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7CisKKworCisvKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCisgICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Cit9IE9NWFZDTTRQMTBNRVBhcmFtczsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCisgKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCisgKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAorICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAorICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCisgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKKyAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCisgKiAgICAgICAgICAgIDAuLjE1KSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAorICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKKyAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiBOb3RlOiAKKyAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAorICogICAgICAgICAgICAwLi43KS4gCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKKyAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCisgKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCisgKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKKyAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAorICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoIAorICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKKyAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGguIAorICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgorICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKKyAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAorICogICAgICAgICAgICAgIGlzIE5VTEwuIAorICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCisgKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKKyAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCisgKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAorICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCisgKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAorICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKKyAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCisgKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCisgKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAorICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAorICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKKyAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAorICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAorICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKKyAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAorICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAorICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAorICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCisgKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCisgKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAorICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAorICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAorICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCisgKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAorICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAorICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCisgKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCisgKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAorICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAorICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCisgKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAorICoKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIgKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAorICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKKyAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCisgKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKKyAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAorICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKKyAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAorICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCisgKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCisgKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKKyAqIDEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKKyAqICAgICAgICAgICAgZXhpc3QgCisgKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKKyAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKKyAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAorICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwREMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgcHJlZFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKKyAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAorICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAorICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAorICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCisgKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAorICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCisgKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAorICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKKyAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAorICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAorICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKKyAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAorICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKKyAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAorICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKKyAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCisgKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCisgKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKKyAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKKyAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKKyAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCisgKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCisgKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCisgKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKKyAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKKyAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAorICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5URVIuIAorICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRSQS4gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAorICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCisgKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKKyAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKKyAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAorICogICAgICAgICAgICAtICBNYlR5cGUgCisgKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAorICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKKyAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAorICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCisgICAgT01YX1MzMiBTcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKKyAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTMyIExhbWJkYSwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfSU5UICpwRHN0Q29zdCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCisgKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAorICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAorICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfVTMyICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAorICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAorICogICAgICAgICAgICAoLTEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAorICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdExlZnQsCisgICAgT01YX1U4ICpwRHN0UmlnaHQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAorICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RVcCwKKyAgICBPTVhfVTggKnBEc3REb3duLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCisgKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKKyAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCisgKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCisgKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAorICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBtYXRyaXguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKKyAgICBPTVhfVTggKnBEc3RSZWNvbiwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCisgICAgT01YX1U4IGJBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCisgKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCisgKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCisgKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAorICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCisgKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIDQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKKyAqICAgICAgICAgICAgb2YgNC4gCisgKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKKyAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCisgKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKKyAqICAgICAgICAgICAgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKKyAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKKyAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAorICAgIE9NWF9TOCAqcE51bUNvZWZmLAorICAgIE9NWF9VMzIgblRocmVzaFNBRCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCisgKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCisgKiBzdHJ1Y3R1cmUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCisgKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCisgKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCisgKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAorICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCisgKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCisgKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCisgKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAorICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCisgKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAorICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCisgKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCisgICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKKyAgICBPTVhfVTggYkFDLAorICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKKyAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbworKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCisKKy8qKiBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDX3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk3NGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQ19zLmgKQEAgLTAsMCArMSwxMjkgQEAKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworOy8qKiA9PT09PT09PT09PT09PT0gU3RydWN0dXJlIERlZmluaXRpb24gZm9yIFNhbXBsZSBHZW5lcmF0aW9uID09PT09PT09PT09PT09ICovCis7LyoqIHRyYW5zcGFyZW50IHN0YXR1cyAqLworCis7ZW51bSB7CitPTVhfVklERU9fVFJBTlNQQVJFTlQJRVFVIDA7CS8qKiBXaG9sbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19QQVJUSUFMCQlFUVUgMTsJLyoqIFBhcnRpYWxseSB0cmFuc3BhcmVudCAqLworT01YX1ZJREVPX09QQVFVRQkJRVFVIDI7CS8qKiBPcGFxdWUgKi8KKzt9CisKKzsvKiogZGlyZWN0aW9uICovCis7ZW51bSB7CitPTVhfVklERU9fTk9ORQkJCUVRVSAwOworT01YX1ZJREVPX0hPUklaT05UQUwJRVFVIDE7CitPTVhfVklERU9fVkVSVElDQUwJCUVRVSAyOworO30KKworOy8qKiBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUgKi8KKztlbnVtIHsKK09NWF9WSURFT19JTlRFR0VSX1BJWEVMIEVRVSAwOwkvKiogY2FzZSChsGGhsSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIKGwYqGxICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9ZICBFUVUgMjsJLyoqIGNhc2UgobBjobEgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1hZIEVRVSAzOwkvKiogY2FzZSChsGShsSAqLworO30KKworO2VudW0geworT01YX1VQUEVSICAJCQkJRVFVIDE7CQkJLyoqIHNldCBpZiB0aGUgYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9MRUZUICAgCQkJCUVRVSAyOwkJCS8qKiBzZXQgaWYgdGhlIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9DRU5URVIgCQkJCUVRVSA0OworT01YX1JJR0hUCQkJCUVRVSA4OworT01YX0xPV0VSICAJCQkJRVFVCTE2OworT01YX1VQUEVSX0xFRlQgIAkJRVFVIDMyOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX1VQUEVSX1JJR0hUIAkJRVFVIDY0OwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9MT1dFUl9MRUZUICAJCUVRVSAxMjg7CitPTVhfTE9XRVJfUklHSFQgCQlFUVUgMjU2Cis7fQorCis7ZW51bSB7CitPTVhfVklERU9fTFVNSU5BTkNFICAJRVFVIDA7CS8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCitPTVhfVklERU9fQ0hST01JTkFOQ0UgIAlFUVUgMTsJLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0FMUEhBICAJCUVRVSAyOwkJCS8qKiBBbHBoYSBjb21wb25lbnQgKi8KKzt9CisKKztlbnVtIHsKK09NWF9WSURFT19JTlRFUgkJCUVRVSAwOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVJfUQkJRVFVIDE7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUjRWCQlFUVUgMjsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVFJBCQkJRVFVIDM7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLworT01YX1ZJREVPX0lOVFJBX1EJCUVRVSA0OwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUjRWX1EJCUVRVSA1OwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworT01YX1ZJREVPX0RJUkVDVAkJRVFVIDY7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKE1QRUctNCBvbmx5KSAqLworT01YX1ZJREVPX0lOVEVSUE9MQVRFCUVRVSA3OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fQkFDS1dBUkQJCUVRVSA4OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fRk9SV0FSRAkJRVFVIDk7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19OT1RDT0RFRAkJRVFVIDEwOwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCis7fQorCis7ZW51bSB7CitPTVhfMTZYMTZfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfREMgCQkJRVFVIDI7CQkvKiogSW50cmFfMTZ4MTZfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfMTZ4MTZfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKztlbnVtIHsKK09NWF80eDRfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV80eDRfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSE9SICAJCQlFUVUgMTsJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9EQyAgIAkJCUVRVSAyOwkJLyoqIEludHJhXzR4NF9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RMIAkJRVFVIDM7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RJQUdfRFIgCQlFUVUgNDsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X1ZSIAkJCQlFUVUgNTsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hEIAkJCQlFUVUgNjsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WTCAJCQkJRVFVIDc7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hVIAkJCQlFUVUgODsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKztlbnVtIHsKK09NWF9DSFJPTUFfREMgCQkJRVFVIDA7CQkvKiogSW50cmFfQ2hyb21hX0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9WRVJUIAkJRVFVIDI7CS8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhX0Nocm9tYV9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO3R5cGVkZWYJc3RydWN0IHsJCit4CUVRVQkwOworeQlFUVUJNDsKKzt9T01YQ29vcmRpbmF0ZTsKKworO3R5cGVkZWYgc3RydWN0IHsKK2R4CUVRVQkwOworZHkJRVFVCTI7Cis7fU9NWE1vdGlvblZlY3RvcjsKKworO3R5cGVkZWYgc3RydWN0IHsKK3h4CQlFUVUJMDsKK3l5CQlFUVUJNDsKK3dpZHRoCUVRVQk4OworaGVpZ2h0CUVRVQkxMjsKKzt9T01YaVJlY3Q7CisKKzt0eXBlZGVmIGVudW0geworT01YX1ZDX0lOVEVSICAgICAgICAgRVFVIDA7ICAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5URVJfUSAgICAgICBFUVUgMTsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFYgICAgICAgRVFVIDI7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRSQSAgICAgICAgIEVRVSAzOyAgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCitPTVhfVkNfSU5UUkFfUSAgICAgICBFUVUgNDsgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCitPTVhfVkNfSU5URVI0Vl9RICAgICBFUVUgNTsgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KKzt9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOworCis7ZW51bSB7CitPTVhfVkNfTk9ORSAgICAgICAgICBFUVUgMAorT01YX1ZDX0hPUklaT05UQUwgICAgRVFVIDEKK09NWF9WQ19WRVJUSUNBTCAgICAgIEVRVSAyIAorO307CisKKworCUVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2M2E3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpAQCAtMCwwICsxLDE0OCBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5MTZ4MTYKKyA7ICoKKyA7ICogRGVzY3JpcHRpb246CisgOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorIDsgKiBQYXJhbWV0ZXJzOgorIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KKyA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7CisgOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDE2LgorIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorIDsgKiBSZXR1cm4gVmFsdWU6CisgOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKKyA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gIAorIDsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIAorICAgICAKKyAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmMgICAgUk4gMCAgICAgICAgCitwRHN0ICAgIFJOIDEgICAgICAgIAorc3RlcCAgICBSTiAyCisKKzsvL0xvY2FsIFZhcmlhYmxlcworQ291bnQgICBSTiAxNAorWDAgICAgICBSTiAyCitYMSAgICAgIFJOIDQKKworUmV0dXJuICBSTiAwCisgICAgIAorICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYscjUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCICAgQ291bnQsc3RlcCwjOCAgICAgICAgICAgICAgICAgOy8vQ291bnQ9c3RlcC04CisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAgICAgICAgICAgICAgICAgIDsvL3BTcmMgYWZ0ZXIgbG9hZGluZyBwU3JjPXBTcmMrOAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjK3N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgIAorICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisKKyAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKKyAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKKyAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAorCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgCisgICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKworICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorCisgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM4NzNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpAQCAtMCwwICsxLDcyIEBACisgOy8qKgorIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHk4eDgKKyA7ICoKKyA7ICogRGVzY3JpcHRpb246CisgOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7CisgOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gOC4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMTQKK1gwICAgICAgUk4gMgorWDEgICAgICBSTiA0CitSZXR1cm4gIFJOIDAKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OCxyNQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICBDb3VudCxzdGVwICAgICAgICAgICAgICAgICA7Ly9Db3VudD1zdGVwIAorICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50ICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIDogcFNyYz1wU3JjK3N0ZXAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50IAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50CisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKKyAgICAgICAgCisgICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgCisgICAgICAgIExEUkQgIFgwLFtwU3JjXSxDb3VudAorICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50CisgICAgICAgIAorICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiNGIwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKQEAgLTAsMCArMSwxODkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisKKyAgICAKKworCisKKyAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUworICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCisKK3BTcmNEc3RQbGFuZSAgICBSTiAgMAoraUZyYW1lV2lkdGggICAgIFJOICAxCitpRnJhbWVIZWlnaHQgICAgUk4gIDIgICAgCitpRXhwYW5kUGVscyAgICAgUk4gIDMKKworCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKK3Jlc3VsdCAgICAgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCitpUGxhbmVTdGVwICAgICAgUk4gIDQKK3BUb3AgICAgICAgICAgICBSTiAgNQorcEJvdHRvbSAgICAgICAgIFJOICA2CitwQm90dG9tSW5kZXggICAgUk4gIDcKK3ggICAgICAgICAgICAgICBSTiAgOAoreSAgICAgICAgICAgICAgIFJOICA5Cit0ZW1wVG9wICAgICAgICAgUk4gIDEwCit0ZW1wQm90ICAgICAgICAgUk4gIDExCitDb2xTdGVwICAgICAgICAgUk4gIDEyCitwTGVmdCAgICAgICAgICAgUk4gIDUKK3BSaWdodCAgICAgICAgICBSTiAgNgorcFJpZ2h0SW5kZXggICAgIFJOICA3Cit0ZW1wTGVmdDEgICAgICAgUk4gIDEwCit0ZW1wUmlnaHQxICAgICAgUk4gIDExCit0ZW1wTGVmdDIgICAgICAgUk4gIDE0Cit0ZW1wUmlnaHQyICAgICAgUk4gIDIKK2luZGV4WSAgICAgICAgICBSTiAgMTQKK1Jvd1N0ZXAgICAgICAgICBSTiAgMTIKK2V4cGFuZFRvNGJ5dGVzICBSTiAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29weSBhIGJ5dGUgdG8gNCBieXRlcyBvZiBhIHdvcmQKKyAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIGlQbGFuZVN0ZXBPblN0YWNrLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgIGlQbGFuZVN0ZXAsIGlQbGFuZVN0ZXBPblN0YWNrCisgICAgICAgIAorICAgICAgICBNVUwgICAgIHBUb3AsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcAorICAgICAgICBNTEEgICAgIHBCb3R0b20saUZyYW1lSGVpZ2h0LGlQbGFuZVN0ZXAscFNyY0RzdFBsYW5lCisgICAgICAgIFNVQiAgICAgeCxpRnJhbWVXaWR0aCwjNAorICAgICAgICBNT1YgICAgIGluZGV4WSxwVG9wCisgICAgICAgIEFERCAgICAgQ29sU3RlcCxpbmRleFksIzQKKyAgICAgICAgU1VCICAgICBwQm90dG9tSW5kZXgscEJvdHRvbSxpUGxhbmVTdGVwCisgICAgICAgIFNVQiAgICAgcFRvcCxwU3JjRHN0UGxhbmUscFRvcAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRvcCxwVG9wLHgKKyAgICAgICAgQUREICAgICBwQm90dG9tLHBCb3R0b20seAorCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVGhlIGZvbGxvd2luZyBpbXByb3ZlcyB1cG9uIHRoZSBDIGltcGxtZW50YXRpb24KKyAgICAgICAgOy8vIFRoZSB4IGFuZCB5IGxvb3BzIGFyZSBpbnRlcmNoYW5nZWQ6IFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2YWx1ZXMgb2YKKyAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbeF0gYW5kIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIAorICAgICAgICA7Ly8gd2hpY2ggZGVwZW5kIG9ubHkgb24gbG9vcCB2YXJpYWJsZSAneCcgYXJlIGxvYWRlZCBvbmNlIGFuZCB1c2VkIGluIAorICAgICAgICA7Ly8gbXVsdGlwbGUgc3RvcmVzIGluIHRoZSAnWScgbG9vcAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICA7Ly8geGxvb3AKK0V4cGFuZEZyYW1lVG9wQm90WGxvb3AKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgdGVtcFRvcCxbcFNyY0RzdFBsYW5lLHhdCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF0gaXMgc2ltcGxpZmllZCBhczoKKyAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSArIChpRnJhbWVIZWlnaHQgKiBpUGxhbmVTdGVwKSAtIGlQbGFuZVN0ZXAgKyB4ID09CisgICAgICAgIDsvLyBwQm90dG9tIC0gaVBsYW5lU3RlcCArIHggPT0gcEJvdHRvbUluZGV4IFt4XQorICAgICAgICA7Ly8gVGhlIHZhbHVlIG9mIHBCb3R0b21JbmRleCBpcyBjYWxjdWxhdGVkIGFib3ZlIHRoaXMgJ3gnIGxvb3AKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUiAgICAgdGVtcEJvdCxbcEJvdHRvbUluZGV4LHhdCisgICAgICAgIAorICAgICAgICA7Ly8geWxvb3AKKyAgICAgICAgTU9WICAgICB5LGlFeHBhbmRQZWxzCisKK0V4cGFuZEZyYW1lVG9wQm90WWxvb3AgICAgICAgIAorICAgICAgICBTVUJTICAgIHkseSwjMQorICAgICAgICBNX1NUUiAgIHRlbXBUb3AsW3BUb3BdLGlQbGFuZVN0ZXAKKyAgICAgICAgTV9TVFIgICB0ZW1wQm90LFtwQm90dG9tXSxpUGxhbmVTdGVwCisgICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVUb3BCb3RZbG9vcAorICAgICAgICAKKyAgICAgICAgU1VCUyAgICB4LHgsIzQKKyAgICAgICAgU1VCICAgICBwVG9wLHBUb3AsQ29sU3RlcAorICAgICAgICBTVUIgICAgIHBCb3R0b20scEJvdHRvbSxDb2xTdGVwCisgICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVUb3BCb3RYbG9vcAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyB5IGxvb3AKKyAgICAgICAgOy8vIFRoZSBwcm9kdWN0IGlzIGFscmVhZHkgY2FsY3VsYXRlZCBhYm92ZSA6IFJldXNlCisgICAgICAgIDsvL01VTCAgICAgaW5kZXhZLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAgICAgICAKKyAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmNEc3RQbGFuZSxwU3JjRHN0UGxhbmUsaW5kZXhZCisgICAgICAgIFNVQiAgICAgcExlZnQscFNyY0RzdFBsYW5lLGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgICAgOy8vIHBMZWZ0LT5wb2ludHMgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBleHBhbmRlZCBibG9jaworICAgICAgICBBREQgICAgIHBSaWdodCxwU3JjRHN0UGxhbmUsaUZyYW1lV2lkdGgKKyAgICAgICAgU1VCICAgICBwUmlnaHRJbmRleCxwUmlnaHQsIzEgCisgICAgICAgIAorICAgICAgICBBREQgICAgIHksaUZyYW1lSGVpZ2h0LGlFeHBhbmRQZWxzLExTTCAjMQorICAgICAgICBMRFIgICAgIGV4cGFuZFRvNGJ5dGVzLD0weDAxMDEwMTAxCisgICAgICAgIAorICAgICAgICBSU0IgICAgIFJvd1N0ZXAsaUV4cGFuZFBlbHMsaVBsYW5lU3RlcCxMU0wgIzEKKworICAgICAgICA7Ly8gVGhlIFkgTG9vcCBpcyB1bnJvbGxlZCB0d2ljZQorRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcCAgCisgICAgICAgIExEUkIgICAgdGVtcExlZnQyLFtwU3JjRHN0UGxhbmUsaVBsYW5lU3RlcF0gICAgICAgICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcworICAgICAgICBMRFJCICAgIHRlbXBSaWdodDIsW3BSaWdodEluZGV4LGlQbGFuZVN0ZXBdCisgICAgICAgIE1fTERSQiAgdGVtcExlZnQxLFtwU3JjRHN0UGxhbmVdLGlQbGFuZVN0ZXAsTFNMICMxICAgICAgOy8vIFByZUxvYWQgdGhlIHZhbHVlcworICAgICAgICBNX0xEUkIgIHRlbXBSaWdodDEsW3BSaWdodEluZGV4XSxpUGxhbmVTdGVwLExTTCAjMQorICAgICAgICAgICAgICAKKyAgICAgICAgU1VCICAgICB4LGlFeHBhbmRQZWxzLCM0CisgICAgICAgIE1VTCAgICAgdGVtcExlZnQyLHRlbXBMZWZ0MixleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKKyAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQyLHRlbXBSaWdodDIsZXhwYW5kVG80Ynl0ZXMKKyAgICAgICAgTVVMICAgICB0ZW1wTGVmdDEsdGVtcExlZnQxLGV4cGFuZFRvNGJ5dGVzICAgICAgICAgICAgICA7Ly8gQ29weSB0aGUgc2luZ2xlIGJ5dGUgdG8gNCBieXRlcworICAgICAgICBNVUwgICAgIHRlbXBSaWdodDEsdGVtcFJpZ2h0MSxleHBhbmRUbzRieXRlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyB4IGxvb3AKK0V4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AgICAgICAgIAorICAgICAgICBTVUJTICAgIHgseCwjNAorICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MixbcExlZnQsaVBsYW5lU3RlcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCisgICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MixbcFJpZ2h0LGlQbGFuZVN0ZXBdCisgICAgICAgIFNUUiAgICAgdGVtcExlZnQxLFtwTGVmdF0sIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgNCBieXRlcyBhdCBvbmUgZ28KKyAgICAgICAgU1RSICAgICB0ZW1wUmlnaHQxLFtwUmlnaHRdLCM0CisgICAgICAgIEJHRSAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRYbG9vcAorICAgICAgICAKKyAgICAgICAgU1VCUyAgICB5LHksIzIKKyAgICAgICAgQUREICAgICBwTGVmdCxwTGVmdCxSb3dTdGVwCisgICAgICAgIEFERCAgICAgcFJpZ2h0LHBSaWdodCxSb3dTdGVwCisgICAgICAgIEJHVCAgICAgRXhwYW5kRnJhbWVMZWZ0UmlnaHRZbG9vcAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgIAorRW5kICAgICAgICAgICAgIAorICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAorIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQwZjJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCisgKiAKKyAqLworIAorI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisgIAorLyogQ0FWTEMgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2Q5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjIyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworOy8vIEZ1bmN0aW9uczoKKzsvLyAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjxBTElHTk1FTlQ+X3Vuc2FmZSAgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIEF2ZXJhZ2Ugb2YgNHg0IHdpdGggZXF1YXRpb24gYyA9IChhK2IrMSk+PjEuCis7Ly8gRmlyc3Qgb3BlcmFuZCB3aWxsIGJlIGF0IG9mZnNldCBBTElHTk1FTlQgZnJvbSBhbGlnbmVkIGFkZHJlc3MKKzsvLyBTZWNvbmQgb3BlcmFuZCB3aWxsIGJlIGF0IGFsaWduZWQgbG9jYXRpb24gYW5kIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQuCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIyIGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHIzIHN0ZXAgc2l6ZQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjQscjUscjYscjgscjkscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMiAtIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgbG9jYXRpb24KKzsvLyByMyAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BQcmVkMCAgICAgICAgICBSTiAwCitpUHJlZFN0ZXAwICAgICAgUk4gMQorcFByZWQxICAgICAgICAgIFJOIDIKK2lQcmVkU3RlcDEgICAgICBSTiAzCitwRHN0UHJlZCAgICAgICAgUk4gMgoraURzdFN0ZXAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaVByZWRBMCAgICAgICAgIFJOIDEwCitpUHJlZEExICAgICAgICAgUk4gMTEKK2lQcmVkQjAgICAgICAgICBSTiAxMgoraVByZWRCMSAgICAgICAgIFJOIDE0CitUZW1wMSAgICAgICAgICAgUk4gNAorVGVtcDIgICAgICAgICAgIFJOIDUKK1Jlc3VsdEEgICAgICAgICBSTiA1CitSZXN1bHRCICAgICAgICAgUk4gNAorcjB4ODA4MDgwODAgICAgIFJOIDcKKworICAgIElGIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDAgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQwCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDIgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIE1fTERSICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDIKKyAgICAgICAgTV9FTkQKKworCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAzIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyAybmQgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKKworICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMworICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZmU1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpAQCAtMCwwICsxLDMyNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogT3B0aW1pemVkIENBVkxDIHRhYmxlcyBmb3IgSC4yNjQKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKKworLyogNHg0IERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdID0KK3sKKyAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Cit9OworCisvKiAyeDIgRGVaaWdaYWcgdGFibGUgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XSA9Cit7CisgICAgMCwgMSwgMiwgMworfTsKKworCisvKgorICogU3VmZml4IFRvIExldmVsIHRhYmxlCisgKiBXZSBpbmNyZW1lbnQgdGhlIHN1ZmZpeCBsZW5ndGggaWYgCisgKiAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2CisgKiAoTGV2ZWxDb2RlPj4xKT49KDM8PChTdWZmaXhMZW5ndGgtMSkpICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKiAgTGV2ZWxDb2RlICAgID49IDM8PFN1ZmZpeExlbmd0aCAgICAgICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKiAoTGV2ZWxDb2RlKzIpID49ICgzPDxTdWZmaXhMZW5ndGgpKzIgICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKi8KK2NvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN10gPQoreworICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLworICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLworICAgICgzPDwyKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MiAqLworICAgICgzPDwzKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MyAqLworICAgICgzPDw0KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NCAqLworICAgICgzPDw1KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NSAqLworICAgIC0xICAgICAgICAgICAgICAvKiBTdWZmaXhMZW5ndGg9NiAtIG5ldmVyIGluY3JlbWVudCAqLworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMFsxMzJdID0geworICAgIDB4MDAyMCwgMHgwMTAwLCAweDIwMTUsIDB4MjAxNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAorICAgIDB4MDAyOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDMwLCAweDAwZDgsIDB4MDBlMCwgMHgwMGU4LAorICAgIDB4MDAzOCwgMHgwMGEwLCAweDAwYzgsIDB4MDBkMCwgMHgwMDQwLCAweDAwNjgsIDB4MDA5MCwgMHgwMDk4LAorICAgIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgyN2ZmLCAweDI3ZmYsIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA4MSwgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDg3LCAweDAwN2QsIDB4MDA3YiwgMHgwMDcxLAorICAgIDB4MDA3ZiwgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAorICAgIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLAorICAgIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwgMHgyMDViLCAweDIwNWIsIDB4MjA1OSwgMHgyMDU5LAorICAgIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA1MSwgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQ5LAorICAgIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgyMDQxLCAweDIwNDEsIDB4MjA0ZCwgMHgyMDRkLAorICAgIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LAorICAgIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLAorICAgIDB4MjAzMywgMHgyMDMzLCAweDIwMjksIDB4MjAyOSwgMHgwMDQ3LCAweDAwMzUsIDB4MDAyYiwgMHgwMDIxLAorICAgIDB4MjAzZiwgMHgyMDNmLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAxOSwgMHgyMDE5LAorICAgIDB4MDAzNywgMHgwMDI1LCAweDAwMWIsIDB4MDAxMSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxZCwgMHgyMDFkLAorICAgIDB4MDAxMywgMHgwMDA5LCAweDIwMWYsIDB4MjAxZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMVsxMjhdID0geworICAgIDB4MDAyMCwgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMWYsIDB4MjAxNSwgMHgyMDE1LAorICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMGQwLCAweDAwZDgsIDB4MDBlMCwgMHgwMDMwLCAweDAwOTgsIDB4MDBjMCwgMHgwMGM4LAorICAgIDB4MDAzOCwgMHgwMDYwLCAweDAwODgsIDB4MDA5MCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwN2YsIDB4MjA3ZiwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDgxLAorICAgIDB4MDA3YiwgMHgwMDc5LCAweDAwN2QsIDB4MDA3MywgMHgyMDc1LCAweDIwNzUsIDB4MjA3MSwgMHgyMDcxLAorICAgIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2YiwgMHgyMDZiLCAweDIwNjksIDB4MjA2OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwgMHgwMDU5LCAweDAwNWQsIDB4MDA1YiwgMHgwMDUxLAorICAgIDB4MDA2NywgMHgwMDU1LCAweDAwNTMsIDB4MDA0OSwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LAorICAgIDB4MjA1ZiwgMHgyMDVmLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDRiLCAweDIwNGIsIDB4MjA0MSwgMHgyMDQxLAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LAorICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MDAyOSwgMHgwMDM1LCAweDAwMzMsIDB4MDAyMSwgMHgyMDQ3LCAweDIwNDcsIDB4MjAyZCwgMHgyMDJkLAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMTksIDB4MjAxOSwgMHgwMDNmLCAweDAwMjUsIDB4MDAyMywgMHgwMDExLAorICAgIDB4MDAzNywgMHgwMDFkLCAweDAwMWIsIDB4MDAwOSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yWzExMl0gPSB7CisgICAgMHgwMDIwLCAweDAwODgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDNmLCAweDAwMzcsIDB4MDAyZiwgMHgwMDI3LCAweDAwMWYsIDB4MDAxNSwgMHgwMDBiLCAweDAwMDEsCisgICAgMHgwMDI4LCAweDAwNTAsIDB4MDA3OCwgMHgwMDgwLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsCisgICAgMHgwN2ZmLCAweDAwODEsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDdmLCAweDAwN2QsCisgICAgMHgwMDdiLCAweDAwNzEsIDB4MDA3NywgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgyMDZiLCAweDIwNmIsCisgICAgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDIwNjEsIDB4MjA2MSwgMHgyMDZkLCAweDIwNmQsCisgICAgMHgyMDYzLCAweDIwNjMsIDB4MjA1OSwgMHgyMDU5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCisgICAgMHgyMDViLCAweDIwNWIsIDB4MjA1MSwgMHgyMDUxLCAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNDksCisgICAgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQxLCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsCisgICAgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDI5LCAweDIwMjksCisgICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwMDE5LCAweDAwM2QsIDB4MDAzYiwgMHgwMDExLCAweDAwNGYsIDB4MDAzNSwgMHgwMDMzLCAweDAwMDksCisgICAgMHgyMDJiLCAweDIwMmIsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDI1LCAweDIwMjUsCisgICAgMHgyMDFiLCAweDIwMWIsIDB4MjA0NywgMHgyMDQ3LCAweDIwMWQsIDB4MjAxZCwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzNbODBdID0geworICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsIDB4MDA5MCwgMHgwMDk4LAorICAgIDB4MDAwOSwgMHgwMDBiLCAweDA3ZmYsIDB4MDAwMSwgMHgwMDExLCAweDAwMTMsIDB4MDAxNSwgMHgwN2ZmLAorICAgIDB4MDAxOSwgMHgwMDFiLCAweDAwMWQsIDB4MDAxZiwgMHgwMDIxLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LAorICAgIDB4MDAyOSwgMHgwMDJiLCAweDAwMmQsIDB4MDAyZiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzNSwgMHgwMDM3LAorICAgIDB4MDAzOSwgMHgwMDNiLCAweDAwM2QsIDB4MDAzZiwgMHgwMDQxLCAweDAwNDMsIDB4MDA0NSwgMHgwMDQ3LAorICAgIDB4MDA0OSwgMHgwMDRiLCAweDAwNGQsIDB4MDA0ZiwgMHgwMDUxLCAweDAwNTMsIDB4MDA1NSwgMHgwMDU3LAorICAgIDB4MDA1OSwgMHgwMDViLCAweDAwNWQsIDB4MDA1ZiwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY3LAorICAgIDB4MDA2OSwgMHgwMDZiLCAweDAwNmQsIDB4MDA2ZiwgMHgwMDcxLCAweDAwNzMsIDB4MDA3NSwgMHgwMDc3LAorICAgIDB4MDA3OSwgMHgwMDdiLCAweDAwN2QsIDB4MDA3ZiwgMHgwMDgxLCAweDAwODMsIDB4MDA4NSwgMHgwMDg3Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180WzMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDAzOCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwKKyAgICAweDAwMjgsIDB4MDAzMCwgMHgwMDIxLCAweDAwMTksIDB4MjAyNywgMHgyMDI3LCAweDAwMjUsIDB4MDAyMywKKyAgICAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsIDB4MDAxMSwgMHgwMDFmLCAweDAwMTMsIDB4MDAwOQorfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0wICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0zICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTUgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz02ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTggKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz05ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEyICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE1ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180ICAvKiBuQz0tMSAqLworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wWzQwXSA9IHsKKyAgICAweDAwMjAsIDB4MDA0OCwgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDA0MCwgMHgwMDExLCAweDAwMGYsIDB4MDAzMCwgMHgwMDM4LCAweDAwMTksIDB4MDAxNywKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDFmLCAweDIwMWYsIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwKKyAgICAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGYsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDAwMWQsIDB4MDAxYiwgMHgwMDE5LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGIsIDB4MDAwOSwgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDAwMWIsIDB4MDAxNywgMHgyMDE5LCAweDIwMTksIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDEzLCAweDAwMGYsIDB4MDAwNywgMHgwMDA1LCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDIwMTksIDB4MjAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAxNSwgMHgwMDExLCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywKKyAgICAweDIwMTcsIDB4MjAxNywgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNVsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTEsIDB4MjAxMywgMHgyMDEzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsCisgICAgMHgwMDE1LCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzZbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDBmLCAweDIwMTEsIDB4MjAxMSwgMHgyMDBkLCAweDIwMGQsIDB4MjAwOSwgMHgyMDA5LAorICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4MDAxMywgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwKKyAgICAweDAwMTEsIDB4MDAwMSwgMHgyMDA1LCAweDIwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDUsIDB4MjAwYiwgMHgyMDBiLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzlbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDBkLCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMFsxNl0gPSB7CisgICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDcsIDB4MjAwNywgMHgyMDBiLCAweDIwMGIsCisgICAgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDkKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTFbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDksIDB4MjAwOSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyWzE2XSA9IHsKKyAgICAweDIwMDEsIDB4MjAwMSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xM1sxNl0gPSB7CisgICAgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTRbMTZdID0geworICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAorICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzCit9OworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzIsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzUsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzgsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTAsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTMsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNAorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMFsxNl0gPSB7CisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzFbMTZdID0geworICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yWzE2XSA9IHsKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzAsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzBbOF0gPSB7CisgICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMVs4XSA9IHsKKyAgICAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yWzhdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzNbOF0gPSB7CisgICAgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNFs4XSA9IHsKKyAgICAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181WzhdID0geworICAgIDB4MDAwMywgMHgwMDA1LCAweDAwMDksIDB4MDAwNywgMHgwMDBkLCAweDAwMGIsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzZbMjRdID0geworICAgIDB4MDAxMCwgMHgwMDBkLCAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLAorICAgIDB4MDAxOCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwgMHgwMDIwLCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLAorICAgIDB4MDAyOCwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNywgMHgwN2ZmLCAweDAwMWQsIDB4MjAxYiwgMHgyMDFiCit9OworCisvKiBUYWJsZXMgNyB0byAxNCBhcmUgZHVwbGljYXRlcyBvZiB0YWJsZSA2ICovCisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzAsICAvKiBaZXJvc0xlZnQ9MSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzIsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNCwKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzUsICAvKiBaZXJvc0xlZnQ9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD03ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTggKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xNCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiAgIC8qIFplcm9zTGVmdD0xNSAqLworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYmNkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKworICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjM3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDM2NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKworICAgIElGICBBUk0xMTM2SlMKKworTUFTS18xICBFUVUgMHgwMTAxMDEwMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFEwICAgICAgICBSTiAwCitTdGVwQXJnICAgIFJOIDEKK3RDMEFyZyAgICAgUk4gMgorYWxwaGEgICAgICBSTiA2CisKK2JldGEgICAgICAgUk4gMTQKK2JTICAgICAgICAgUk4gMTQKK3RDMCAgICAgICAgUk4gMTQKK3B0QzAgICAgICAgUk4gMQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgUk4gMyAKK3BfMSAgICAgUk4gNSAgCitwXzIgICAgIFJOIDQgIAorcF8zICAgICBSTiAyICAKK3FfMCAgICAgUk4gOCAgCitxXzEgICAgIFJOIDkgIAorcV8yICAgICBSTiAxMCAKK3FfMyAgICAgUk4gMTIgCisKKworOy8vIEZpbHRlcmluZworCithcDBxMCAgIFJOIDEgIAorZmlsdCAgICBSTiAyCisgICAgICAgIAorbTAwICAgICBSTiA3CittMDEgICAgIFJOIDExCisKK2FwZmxnICAgUk4gMCAKK2FxZmxnICAgUk4gNgorCit0QyAgICAgIFJOIDEKKworCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAorCitwb3MgICAgIFJOIDcKK25lZyAgICAgUk4gMTIKKworUDBhICAgICBSTiAxICAgCitQMWEgICAgIFJOIDggICAKK1EwYSAgICAgUk4gNyAgCitRMWEgICAgIFJOIDQgICAKKwordTEgICAgICBSTiAzICAgCittYXggICAgIFJOIDEyCittaW4gICAgIFJOIDIgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKKworcV8zYiAgICBSTiA5ICAgCitwXzNiICAgIFJOIDAKK2FwcWZsZyAgUk4gMTIKKworUDBiICAgICBSTiA2CitQMWIgICAgIFJOIDcgCitQMmIgICAgIFJOIDEKKworUTBiICAgICBSTiA5IAorUTFiICAgICBSTiAwIAorUTJiICAgICBSTiAyCisKKzsvLyBNaXNjZWxsYW5vdXMKKworYSAgICAgICBSTiAwCit0MCAgICAgIFJOIDMgCit0MSAgICAgIFJOIDEyCit0MiAgICAgIFJOIDcKK3QzICAgICAgUk4gMTEKK3Q0ICAgICAgUk4gNCAgIAordDUgICAgICBSTiAxICAgCit0OCAgICAgIFJOIDYgICAKK3Q5ICAgICAgUk4gMTQgIAordDEwICAgICBSTiA1ICAgCit0MTEgICAgIFJOIDkgICAKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gMyw0LDUsOCw5LDEwIC0gSW5wdXQgUGl4ZWxzIChwMC1wMixxMC1xMikKKzsvLyAgICAgICAgLSAyIC0gZmlsdCwgMCAtIGFwZmxnLCA2IC0gYXFmbGcKKzsvLyAgICAgICAgLSAxMSAtIG0wMSwgNyAtIHRDMAorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIDEsOCw3LDExIC0gT3V0cHV0IFBpeGVscyhQMGEsUDFhLFEwYSxRMWEpCis7Ly8KKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkIC0gMC0zLDUtMTIsMTQKKworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZSwgbHIKKworICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKKyAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0CisgICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3CisgICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3CisKKyAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MworICAgICAgICAKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgTVVMICAgICB0QzAsIHQyLCBtMDEKKyAgICAgICAgCisgICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorCisgICAgICAgIFVTVUI4ICAgdDIsIHBfMCwgcV8wCisgICAgICAgIEFORCAgICAgdDIsIHQyLCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQyCisgICAgICAgIFVIU1VCOCAgdDUsIHBfMCwgcV8wCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKKyAgICAgICAgTU9WICAgICBtMDAsICMwCisgICAgICAgIFNBREQ4ICAgdDEsIHQxLCBtMDEKKyAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1CisgICAgICAgIAorICAgICAgICA7Ly8gdEMgPSB0QzAKKyAgICAgICAgOy8vIGlmIChhcCA8IGJldGEpIHRDKys7CisgICAgICAgIDsvLyBpZiAoYXEgPCBiZXRhKSB0QysrOworICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKKyAgICAgICAgU0VMICAgICB0QzAsIHRDMCwgbTAwCisgICAgICAgIFVRQUREOCAgdEMsIHRDMCwgYXBmbGcKKyAgICAgICAgU1NVQjggICB0MSwgdDEsIG0wMAorICAgICAgICBVUUFERDggIHRDLCB0QywgYXFmbGcKKworICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKKyAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKKyAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKKyAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QworICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcworICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCisgICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCisgICAgICAgIAorICAgICAgICA7Ly9SZWxvYWQgbTAxCisgICAgICAgIExEUiAgICAgbTAxLD1NQVNLXzEKKworICAgICAgICBVUUFERDggIFAwYSwgcF8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBRMGEsIHFfMCwgcG9zCisgICAgICAgIFVRU1VCOCAgUDBhLCBQMGEsIG5lZworICAgICAgICBVUUFERDggIFEwYSwgUTBhLCBuZWcKKyAgICAgICAgCisgICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCisgICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKKyAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAorICAgICAgICBTRUwgICAgIFAwYSwgUDBhLCBwXzAKKyAgICAgICAgU0VMICAgICBRMGEsIFEwYSwgcV8wCisgICAgCisgICAgICAgIDsvLyBkZWx0YSA9IChwMiArICgocDArcTArMSk+PjEpIC0gKHAxPDwxKSk+PjE7CisgICAgICAgIDsvLyB1MSA9IChwMCArIHEwICsgMSk+PjEKKyAgICAgICAgOy8vIHUxID0gKCAocV8wIC0gcF8wJyk+PjEgKSBeIDB4ODAKKyAgICAgICAgTVZOICAgICBwXzAsIHBfMAorICAgICAgICBVSFNVQjggIHUxLCBxXzAsIHBfMCAKKyAgICAgICAgVVFBREQ4ICBtYXgsIHBfMSwgdEMwCisgICAgICAgIEVPUiAgICAgdTEsIHUxLCBtMDEgLExTTCAjNworICAgIAorICAgICAgICA7Ly8gQ2FsY3VsYXRlIEEgPSAocDIrdTEpPj4xIAorICAgICAgICA7Ly8gVGhlbiBkZWx0YSA9IENsaXAzKCAtdEMwLCB0QzAsIEEgLSBwMSkKKworICAgICAgICA7Ly8gQ2xpcCBQMQorICAgICAgICBVSEFERDggIFAxYSwgcF8yLCB1MQorICAgICAgICBVUVNVQjggIG1pbiwgcF8xLCB0QzAKKyAgICAgICAgVVNVQjggICB0NCwgUDFhLCBtYXgKKyAgICAgICAgU0VMICAgICBQMWEsIG1heCwgUDFhCisgICAgICAgIFVTVUI4ICAgdDQsIFAxYSwgbWluCisgICAgICAgIFNFTCAgICAgUDFhLCBQMWEsIG1pbgorCisgICAgICAgIDsvLyBDbGlwIFExCisgICAgICAgIFVIQUREOCAgUTFhLCBxXzIsIHUxCisgICAgICAgIFVRQUREOCAgbWF4LCBxXzEsIHRDMAorICAgICAgICBVUVNVQjggIG1pbiwgcV8xLCB0QzAKKyAgICAgICAgVVNVQjggICB0MCwgUTFhLCBtYXgKKyAgICAgICAgU0VMICAgICBRMWEsIG1heCwgUTFhCisgICAgICAgIFVTVUI4ICAgdDAsIFExYSwgbWluCisgICAgICAgIFNFTCAgICAgUTFhLCBRMWEsIG1pbgorICAgICAgICAKKyAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKKyAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAorICAgICAgICBVU1VCOCAgIHQwLCBhcGZsZywgbTAxCisgICAgICAgIFNFTCAgICAgUDFhLCBQMWEsIHBfMQorICAgICAgICBVU1VCOCAgIHQwLCBhcWZsZywgbTAxCisgICAgICAgIFNFTCAgICAgdDMsIFExYSwgcV8xCisgICAgICAgIAorICAgICAgICBNX0VORAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCis7Ly8KKzsvLyBJbnB1dHMgLSAzLDQsNSw4LDksMTAgLSBJbnB1dCBQaXhlbHMgKHAwLXAyLHEwLXEyKQorOy8vICAgICAgICAtIDIgLSBmaWx0LCAwIC0gYXBmbGcsYXFmbGcKKzsvLyAgICAgICAgLSAxIC0gYXAwcTAsIDYgLSBhbHBoYQorOy8vICAgICAgICAtIDcgLSBtMDAsIDExIC0gbTAxCis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gNiw3LDEsOSwwLDIgLSBPdXRwdXQgUGl4ZWxzKFAwYixQMWIsUDJiLCBRMGIsUTFiLFEyYikKKzsvLyAKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkIC0gMC0zLDUtMTIsMTQKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUsIGxyCisgICAgCisgICAgICAgIDsvLyBhcGZsZyA9IGFwZmxnICYmIHxwMC1xMHw8KChhbHBoYT4+MikrMikgCisgICAgICAgIDsvLyBhcGZsZyA9IGFxZmxnICYmIHxwMC1xMHw8KChhbHBoYT4+MikrMikgCisKKyAgICAgICAgTV9BUkcgICBwRHVtbXksNAorICAgICAgICBNX0FSRyAgIHBRXzMsNAorICAgICAgICBNX0FSRyAgIHBQXzMsNAorICAgICAgICAKKyAgICAgICAgVUhBREQ4ICBhbHBoYSwgYWxwaGEsIG0wMAorICAgICAgICBVU1VCOCAgIHQ5LCBwXzIsIHBfMCAgICA7Ly90OSA9IGRwMnAwCisgICAgICAgIFVIQUREOCAgYWxwaGEsIGFscGhhLCBtMDAKKyAgICAgICAgQUREICAgICBhbHBoYSwgYWxwaGEsIG0wMSwgTFNMICMxICAgICAgICAKKyAgICAgICAgVVNVQjggICBhcDBxMCwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgYXBxZmxnLCBtMDAsIGFwZmxnCisKKyAgICAgICAgOy8vIFAwID0gKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+MyAKKyAgICAgICAgOy8vICAgID0gKChwMi1wMCkgKyAyKihwMS1wMCkgKyAocTEtcTApICsgMyoocTAtcDApICsgOCpwMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9IHAwICsgKCgocDItcDApICsgMioocDEtcDApICsgKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zKQorCisgICAgICAgIDsvLyBQMSA9IChwMiArIHAxICsgcTAgKyBwMCArIDIpPj4yCisgICAgICAgIDsvLyAgICA9IHAwICsgKCgocDItcDApICsgKHAxLXAwKSAtIChwMC1xMCkgKyAyKT4+MikKKyAgICAgICAgCisgICAgICAgIDsvLyBQMiA9ICgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9ICgyKihwMy1wMCkgKyAzKihwMi1wMCkgKyAocDEtcDApIC0gKHAwLXEwKSArIDgqcDAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBwMCArICgoKHAzLXAwKSArIChwMi1wMCkgKyB0MiArIDIpPj4yKQorCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVU1VCOCAgIHQyLCBwXzAsIHFfMCAgICAgICAgIAorICAgICAgICBTU1VCOCAgIHQ1LCB0OSwgdDIgICAgICAgICAgIAorCisgICAgICAgIFVTVUI4ICAgdDgsIHFfMSwgcV8wICAgICAgICAgCisgICAgICAgIFNIQUREOCAgdDgsIHQ1LCB0OAorCisgICAgICAgIFVTVUI4ICAgdDksIHBfMSwgcF8wICAgICAgICAgCisgICAgICAgIFNBREQ4ICAgdDgsIHQ4LCB0OQorICAgICAgICBTSFNVQjggIHQ4LCB0OCwgdDIKKyAgICAgICAgU0hBREQ4ICB0NSwgdDUsIHQ5CisgICAgICAgIFNIQUREOCAgdDgsIHQ4LCBtMDEKKyAgICAgICAgU0hBREQ4ICB0OSwgdDUsIG0wMQorICAgICAgICBTQUREOCAgIFAwYiwgcF8wLCB0OCAgICAgICAgIAorICAgICAgICA7Ly8gUDBiIHJlYWR5CisgICAgICAgIAorICAgICAgICA7Ly8gQ29tcHV0ZSBQMWIKKyAgICAgICAgTV9MRFIgICBwXzNiLCBwUF8zCisgICAgICAgIFNBREQ4ICAgUDFiLCBwXzAsIHQ5ICAgICAgICAgCisgICAgICAgIDsvLyBQMWIgcmVhZHkKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFAyYgorICAgICAgICBVU1VCOCAgIHQ5LCBwXzIsIHBfMCAgICAgICAgIAorICAgICAgICBTQUREOCAgIHQ1LCB0NSwgdDkKKyAgICAgICAgVUhTVUI4ICB0OSwgcF8zYiwgcF8wICAgICAgICAKKyAgICAgICAgRU9SICAgICBhLCBwXzNiLCBwXzAgICAgICAgICAKKyAgICAgICAgQU5EICAgICBhLCBhLCBtMDEKKyAgICAgICAgU0hBREQ4ICB0NSwgdDUsIGEKKyAgICAgICAgVUhBREQ4ICBhLCBwXzAsIHFfMQorICAgICAgICBTQUREOCAgIHQ1LCB0NSwgbTAxCisgICAgICAgIFNIQUREOCAgdDUsIHQ1LCB0OQorICAgICAgICBNVk4gICAgIHQ5LCBwXzEKKyAgICAgICAgU0FERDggICBQMmIsIHBfMCwgdDUgICAgICAgICAKKyAgICAgICAgOy8vIFAyYiByZWFkeQorICAgICAgICAKKyAgICAgICAgVUhTVUI4ICBhLCBhLCB0OQorICAgICAgICBPUlIgICAgIHQ5LCBhcHFmbGcsIG0wMQorICAgICAgICBVU1VCOCAgIHQ5LCBhcHFmbGcsIHQ5CisKKyAgICAgICAgRU9SICAgICBhLCBhLCBtMDEsIExTTCAjNworICAgICAgICBTRUwgICAgIFAwYiwgUDBiLCBhCisgICAgICAgIFNFTCAgICAgUDFiLCBQMWIsIHBfMQorICAgICAgICBTRUwgICAgIFAyYiwgUDJiLCBwXzIKKworICAgICAgICBVU1VCOCAgIHQ0LCBmaWx0LCBtMDEKKyAgICAgICAgU0VMICAgICBQMGIsIFAwYiwgcF8wCisKKyAgICAgICAgCisgICAgICAgIDsvLyBRMCA9IChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMgCisgICAgICAgIDsvLyAgICA9ICgocTItcTApICsgMioocTEtcTApICsgKHAxLXAwKSArIDMqKHAwLXEwKSArIDgqcTAgKyA0KT4+MworICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEyLXEwKSArIDIqKHExLXEwKSArIChwMS1wMCkgKyAzKihwMC1xMCkgKyA0KT4+MykKKworICAgICAgICA7Ly8gUTEgPSAocTIgKyBxMSArIHAwICsgcTAgKyAyKT4+MgorICAgICAgICA7Ly8gICAgPSBxMCArICgoKHEyLXEwKSArIChxMS1xMCkgKyAocDAtcTApICsgMik+PjIpCisKKyAgICAgICAgOy8vIFEyID0gKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMKKyAgICAgICAgOy8vICAgID0gKDIqKHEzLXEwKSArIDMqKHEyLXEwKSArIChxMS1xMCkgKyAocDAtcTApICsgOCpxMCArIDQpPj4zCisgICAgICAgIDsvLyAgICA9IHEwICsgKCgocTMtcTApICsgKHEyLXEwKSArIHQyICsgMik+PjIpCisKKworICAgICAgICA7Ly8gQ29tcHV0ZSBRMGIgUTFiCisgICAgICAgIFVTVUI4ICAgdDQsIHFfMiwgcV8wICAgICAgICAgICAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHFfMAorICAgICAgICBVU1VCOCAgIHQ5LCBwXzEsIHBfMAorICAgICAgICBTQUREOCAgIHQwLCB0NCwgYQorICAgICAgICBTSEFERDggIHQ5LCB0MCwgdDkKKyAgICAgICAgVUhBREQ4ICB0MTAsIHFfMCwgcF8xCisgICAgICAgIFNBREQ4ICAgdDksIHQ5LCBhCisgICAgICAgIFVTVUI4ICAgYSwgcV8xLCBxXzAKKyAgICAgICAgU0hBREQ4ICB0OSwgdDksIGEKKyAgICAgICAgU0hBREQ4ICB0MCwgdDAsIGEKKyAgICAgICAgU0hBREQ4ICB0OSwgdDksIG0wMQorICAgICAgICBTSEFERDggIGEsIHQwLCBtMDEKKyAgICAgICAgU0FERDggICB0OSwgcV8wLCB0OSAgICAgICAgICAgIAorICAgICAgICA7Ly8gUTBiIHJlYWR5IC0gdDkKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgdDQsICMwCisgICAgICAgIFVIQUREOCAgYXBxZmxnLCBhcHFmbGcsIHQ0CisgICAgICAgIAorICAgICAgICBTQUREOCAgIFExYiwgcV8wLCBhIAorICAgICAgICA7Ly8gUTFiIHJlYWR5CisgICAgICAgCisgICAgICAgIFVTVUI4ICAgdDQsIGFwcWZsZywgbTAxCisgICAgICAgIFNFTCAgICAgUTFiLCBRMWIsIHFfMQorICAgICAgICBNVk4gICAgIHQxMSwgcV8xCisgICAgICAgIFVIU1VCOCAgdDEwLCB0MTAsIHQxMQorICAgICAgICBNX0xEUiAgIHFfM2IsIHBRXzMKKyAgICAgICAgRU9SICAgICB0MTAsIHQxMCwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICB0OSwgdDksIHQxMCAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUTJiCisgICAgICAgIFVTVUI4ICAgdDQsIHFfMiwgcV8wCisgICAgICAgIFNBREQ4ICAgdDQsIHQwLCB0NAorICAgICAgICBFT1IgICAgIHQwLCBxXzNiLCBxXzAgCisgICAgICAgIEFORCAgICAgdDAsIHQwLCBtMDEKKyAgICAgICAgU0hBREQ4ICB0NCwgdDQsIHQwCisgICAgICAgIFVIU1VCOCAgdDEwLCBxXzNiLCBxXzAKKyAgICAgICAgU0FERDggICB0NCwgdDQsIG0wMQorICAgICAgICBTSEFERDggIHQ0LCB0NCwgdDEwCisKKyAgICAgICAgVVNVQjggICB0MTAsIGZpbHQsIG0wMQorICAgICAgICBTRUwgICAgIFEwYiwgdDksIHFfMAorCisgICAgICAgIFNBREQ4ICAgdDQsIHFfMCwgdDQgICAgICAgICAgICAKKyAgICAgICAgOy8vIFEyYiByZWFkeSAtIHQ0CisKKyAgICAgICAgVVNVQjggICB0MTAsIGFwcWZsZywgbTAxCisgICAgICAgIFNFTCAgICAgUTJiLCB0NCwgcV8yCisKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisgICAgICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NDhhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCkBAIC0wLDAgKzEsMzI1IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKyAgICAgICAgCitMQVNUX0NPRUZGICAgICAgICAgICAgICAgRVFVIDB4MjAgICAgICAgIDsvLyBFbmQgb2YgYmxvY2sgZmxhZworVFdPX0JZVEVfQ09FRkYgICAgICAgICAgIEVRVSAweDEwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwcEJpdFN0cmVhbSAgICAgUk4gMAorcE9mZnNldCAgICAgICAgIFJOIDEKK3BOdW1Db2VmZiAgICAgICBSTiAyCitwcFBvc0NvZWZidWYgICAgUk4gMworbkMgICAgICAgICAgICAgIFJOIDQgOy8vIG51bWJlciBvZiBjb2VmZnMgb3IgMTcgZm9yIGNocm9tYQorc01heE51bUNvZWZmICAgIFJOIDUKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKKworOy8vIExldmVsIGxvb3AKK0NvdW50ICAgICAgICAgICBSTiAwCitUcmFpbGluZ09uZXMgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK0xldmVsU3VmZml4ICAgICBSTiAzCitTdWZmaXhMZW5ndGggICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKKworcFZMRFRhYmxlICAgICAgIFJOIDYKK1N5bWJvbCAgICAgICAgICBSTiA3CitUMSAgICAgICAgICAgICAgUk4gOAorVDIgICAgICAgICAgICAgIFJOIDkKK1JCaXRTdHJlYW0gICAgICBSTiAxMAorUkJpdEJ1ZmZlciAgICAgIFJOIDExCitSQml0Q291bnQgICAgICAgUk4gMTIKK2xyICAgICAgICAgICAgICBSTiAxNAorCis7Ly8gUnVuIGxvb3AKK0NvdW50ICAgICAgICAgICBSTiAwCitaZXJvc0xlZnQgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUnVuVGFibGUgICAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKKworcFZMRFRhYmxlICAgICAgIFJOIDYKK1N5bWJvbCAgICAgICAgICBSTiA3CitUMSAgICAgICAgICAgICAgUk4gOAorVDIgICAgICAgICAgICAgIFJOIDkKK1JCaXRTdHJlYW0gICAgICBSTiAxMAorUkJpdEJ1ZmZlciAgICAgIFJOIDExCitSQml0Q291bnQgICAgICAgUk4gMTIKK2xyICAgICAgICAgICAgICBSTiAxNAorCis7Ly8gRmlsbCBpbiBjb2VmZmljaWVudHMgbG9vcAorcFBvc0NvZWZidWYgICAgIFJOIDAKK3RlbXAgICAgICAgICAgICBSTiAxCitwTGV2ZWwgICAgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK3BSdW4gICAgICAgICAgICBSTiA0CitUb3RhbENvZWZmICAgICAgUk4gNQorcFppZ1phZyAgICAgICAgIFJOIDYKKworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitDb2VmZk51bSAgICAgICAgUk4gMTQKKworCisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M0IHBwcEJpdFN0cmVhbSwgNAorICAgICAgICBNX0FMTE9DNCBwcE9mZnNldCwgNAorICAgICAgICBNX0FMTE9DNCBwcHBQb3NDb2VmYnVmLCA0CisgICAgICAgIE1fQUxMT0M0IHBwTGV2ZWwsIDE2KjIKKyAgICAgICAgTV9BTExPQzQgcHBSdW4sIDE2CisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwTkMsIDQKKyAgICAgICAgTV9BUkcgICBwU01heE51bUNvZWZmLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMCBwcEJpdFN0cmVhbSwgcE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgIExEUiAgICAgICAgcFZMRFRhYmxlLCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgTV9MRFIgICAgICBuQywgcE5DCisgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQxIFQxLCBUMiwgbHIKKyAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIG5DLCBMU0wgIzJdICA7Ly8gRmluZCBWTEQgdGFibGUgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyIFQxLCBUMiwgbHIKKworICAgICAgICA7Ly8gRGVjb2RlIFN5bWJvbCA9IFRvdGFsQ29lZmYqNCArIFRyYWlsaW5nT25lcworICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMgorICAgIAorICAgICAgICBNT1ZTICAgIFRvdGFsQ29lZmYsIFN5bWJvbCwgTFNSICMyICAgIAorICAgICAgICBTVFJCICAgIFRvdGFsQ29lZmYsIFtwTnVtQ29lZmZdICAgIAorICAgICAgICBNX1BSSU5URiAiVG90YWxDb2VmZj0lZFxuIiwgVG90YWxDb2VmZgorICAgICAgICBCRVEuVyAgIEVuZE5vRXJyb3IgICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoZWQgaWYgbm8gY29lZmZpY2llbnRzCisKKyAgICAgICAgQ01QICAgICBTeW1ib2wsICMxNyo0CisgICAgICAgIEJHRS5XICAgRW5kQmFkU3ltYm9sICAgICAgICAgICAgICAgIDsvLyBFcnJvciBpZiBiYWQgc3ltYm9sCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgTV9TVFIgICBwcEJpdFN0cmVhbSwgIHBwcEJpdFN0cmVhbQorICAgICAgICBNX1NUUiAgIHBPZmZzZXQsICAgICAgcHBPZmZzZXQKKyAgICAgICAgTV9TVFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIFRyYWlsaW5nIE9uZXMKKyAgICAgICAgQU5EUyAgICBUcmFpbGluZ09uZXMsIFN5bWJvbCwgIzMKKyAgICAgICAgTV9BRFIgICBwTGV2ZWwsIHBwTGV2ZWwgICAgICAgICAgICAKKyAgICAgICAgTV9QUklOVEYgIlRyYWlsaW5nT25lcz0lZFxuIiwgVHJhaWxpbmdPbmVzCisgICAgICAgIEJFUSAgICAgVHJhaWxpbmdPbmVzRG9uZSAgICAKKyAgICAgICAgTU9WICAgICBDb3VudCwgVHJhaWxpbmdPbmVzCitUcmFpbGluZ09uZXNMb29wICAgIAorICAgICAgICBNX0JEX1JFQUQ4IFN5bWJvbCwgMSwgVDEKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIE1PViAgICAgVDEsICMxCisgICAgICAgIFNVQiAgICAgVDEsIFQxLCBTeW1ib2wsIExTTCAjMQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMgorICAgICAgICBCR1QgICAgIFRyYWlsaW5nT25lc0xvb3AKK1RyYWlsaW5nT25lc0RvbmUgICAgCisgICAgCisgICAgICAgIDsvLyBEZWNvZGUgbGV2ZWwgdmFsdWVzICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXMgICAgIDsvLyBOdW1iZXIgb2YgbGV2ZWxzIHRvIHJlYWQKKyAgICAgICAgQkVRICAgICBEZWNvZGVSdW5zICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTm9uZSBsZWZ0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIFN1ZmZpeExlbmd0aCwgIzEKKyAgICAgICAgQ01QICAgICBUb3RhbENvZWZmLCAjMTAKKyAgICAgICAgTU9WTEUgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIENNUCAgICAgVHJhaWxpbmdPbmVzLCAjMyAgICA7Ly8gaWYgKFRyYWlsaW5nT25lczwzKQorICAgICAgICBNT1ZMVCAgIFRyYWlsaW5nT25lcywgIzQgICAgOy8vIHRoZW4gVHJhaWxpbmdPbmVzID0gKzQKKyAgICAgICAgTU9WR0UgICBUcmFpbGluZ09uZXMsICMyICAgIDsvLyBlbHNlIFRyYWlsaW5nT25lcyA9ICsyCisgICAgICAgIE1PVkdFICAgU3VmZml4TGVuZ3RoLCAjMCAgICA7Ly8gICAgICBTdWZmaXhMZW5ndGggPSAwCisgICAgICAgIAorTGV2ZWxMb29wCisgICAgICAgIE1fQkRfQ0xaMTYgU3ltYm9sLCBUMSwgVDIgICA7Ly8gU3ltYm9sPUxldmVsUHJlZml4CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorICAgICAgICAKKyAgICAgICAgTU9WUyAgICBsciwgU3VmZml4TGVuZ3RoICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKKyAgICAgICAgVEVRRVEgICBTeW1ib2wsICMxNCAgICAgICAgIDsvLyAgIGFuZCAgTGV2ZWxQcmVmaXg9PTE0CisgICAgICAgIE1PVkVRICAgbHIsICM0ICAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT00CisgICAgICAgIFRFUSAgICAgU3ltYm9sLCAjMTUgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0xNQorICAgICAgICBNT1ZFUSAgIGxyLCAjMTIgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9MTIKKyAgICAgICAgCisgICAgICAgIFRFUUVRICAgU3VmZml4TGVuZ3RoLCMwCisgICAgICAgIEFEREVRICAgU3ltYm9sLFN5bWJvbCwjMTUKKyAgICAgICAgCisgICAgICAgIFRFUSAgICAgbHIsICMwICAgICAgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIEJFUSAgICAgTGV2ZWxDb2RlUmVhZCAgICAgICA7Ly8gTGV2ZWxDb2RlID0gTGV2ZWxQcmVmaXgKKyAgICAgICAgCisgICAgICAgIE1fQkRfVlJFQUQxNiBMZXZlbFN1ZmZpeCwgbHIsIFQxLCBUMiAgOy8vIFJlYWQgTGV2ZWwgU3VmZml4CisgICAgICAgIAorICAgICAgICBNT1YgICAgIFN5bWJvbCwgU3ltYm9sLCBMU0wgU3VmZml4TGVuZ3RoCisgICAgICAgIEFERCAgICAgU3ltYm9sLCBMZXZlbFN1ZmZpeCwgU3ltYm9sCisgICAgICAgICAgICAgCitMZXZlbENvZGVSZWFkICAgICAgICAKKyAgICAgICAgOy8vIFN5bWJvbCA9IExldmVsQ29kZQorICAgICAgICBBREQgICAgIFN5bWJvbCwgU3ltYm9sLCBUcmFpbGluZ09uZXMgOy8vICs0IGlmIGxldmVsIGNhbm5vdCBiZSArLy0xLCArMiBvL3cKKyAgICAgICAgTU9WICAgICBUcmFpbGluZ09uZXMsICMyCisgICAgICAgIE1PVlMgICAgVDEsIFN5bWJvbCwgTFNSICMxCisgICAgICAgIFJTQkNTICAgVDEsIFQxLCAjMCAgICAgICAgICAgICAgICAgIDsvLyBJZiBTeW1ib2wgb2RkIHRoZW4gbmVnYXRlCisgICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKKyAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyICAgICAgICAgICAgOy8vIFN0b3JlIGxldmVsLgorICAgICAgICAKKyAgICAgICAgTERSICAgICBUMiwgPWFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgICAgICBMRFJTQiAgIFQxLCBbVDIsIFN1ZmZpeExlbmd0aF0gICAgICA7Ly8gRmluZCBpbmNyZW1lbnQgbGV2ZWwgICAgICAgIAorICAgICAgICBURVEgICAgIFN1ZmZpeExlbmd0aCwgIzAKKyAgICAgICAgTU9WRVEgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgU3ltYm9sLCBUMQorICAgICAgICBBRERDUyAgIFN1ZmZpeExlbmd0aCwgU3VmZml4TGVuZ3RoLCAjMSAgICAgICAgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgCisgICAgICAgIEJHVCAgICAgTGV2ZWxMb29wCisgICAgICAgIAorRGVjb2RlUnVucyAgICAgICAgCisgICAgICAgIDsvLyBGaW5kIG51bWJlciBvZiB6ZXJvcworICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCisgICAgICAgIFNVQiAgICAgQ291bnQsIFRvdGFsQ29lZmYsICMxICAgICAgIDsvLyBOdW1iZXIgb2YgcnVucyBleGNsdWRpbmcgbGFzdAorICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgVDEsIFRvdGFsQ29lZmYgICA7Ly8gTWF4aW11bSBudW1iZXIgb2YgemVyb3MgdGhlcmUgY291bGQgYmUKKyAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgorICAgICAgICBNT1YgICAgIENvZWZmTnVtLFRvdGFsQ29lZmYKKyAgICAgICAgU1VCICAgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gVW5wYWNrIG51bWJlciBvZiB6ZXJvcyBmcm9tIGJpdHN0cmVhbQorICAgICAgICBURVEgICAgIFQxLCAjNCAgICAgICAgCisgICAgICAgIExEUkVRICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzLTQpCisgICAgICAgIExEUk5FICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMtNCkKKyAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIFRvdGFsQ29lZmYsIExTTCAjMl0KKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyIDsvLyBTeW1ib2wgPSBaZXJvc0xlZnQKKyAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2CisgICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCisKKyAgICAgICAgTERSICAgICBwcFJ1blRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMtNCkKKyAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgorICAgICAgICBNT1ZTICAgIFplcm9zTGVmdCwgU3ltYm9sCisKKyAgICAgICAgQUREICAgICBDb2VmZk51bSxDb2VmZk51bSxaZXJvc0xlZnQgICAgICAgIAorCisgICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSB6ZXJvcyBhcmUgbGVmdCBhbmQgbW9yZSB0aGFuIG9uZSBjb2VmZmljaWVudAorUnVuTG9vcCAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcHBSdW5UYWJsZSwgWmVyb3NMZWZ0LCBMU0wjMl0KKyAgICAgICAgQkxUICAgICBMYXN0UnVuCisgICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCAzLCAyIDsvLyBTeW1ib2wgPSBSdW4KKyAgICAgICAgQ01QICAgICBTeW1ib2wsIzE1ICAgICAgICAgCisgICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sICAgICAgICAKKworICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgWmVyb3NMZWZ0LCBTeW1ib2wKKyAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgU3ltYm9sCisgICAgICAgIFNUUkIgICAgU3ltYm9sLCBbcFJ1bl0sICMxCisgICAgICAgIEJHVCAgICAgUnVuTG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIG5vIHplcm9zIGFyZSBsZWZ0CitOb1plcm9zTGVmdCAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFplcm9zTGVmdAorICAgICAgICBTVFJHRUIgIFplcm9zTGVmdCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIE5vWmVyb3NMZWZ0CisKK0xhc3RSdW4gICAgICAgIAorICAgICAgICA7Ly8gRmluYWwgcnVuIGxlbmd0aCBpcyByZW1haW5pbmcgemVyb3MKKyAgICAgICAgTV9QUklOVEYgIkxhc3RSdW49JWRcbiIsIFplcm9zTGVmdAorICAgICAgICBTVFJCICAgIFplcm9zTGVmdCwgW3BSdW5dLCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgY29lZmZpY2llbnRzIHRvIG91dHB1dCBhcnJheQorICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCisgICAgICAgIFRFUSAgICAgVDEsICMxNQorICAgICAgICBBRERFUSAgIENvZWZmTnVtLENvZWZmTnVtLCMxCisgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgcFJ1bixwUnVuLFRvdGFsQ29lZmYKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgIAorICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgIAorCisgICAgICAgIE1fTERSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmCisgICAgICAgIExEUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIFRFUSAgICAgVDEsICM0CisgICAgICAgIExEUkVRICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgICAgICBMRFJORSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKKworICAgICAgICAKKyAgICAgICAgCitPdXRwdXRMb29wCisgICAgICAgIAorICAgICAgICBMRFJCICAgIFQyLCBbcFJ1bl0sIzEKKyAgICAgICAgTERSQiAgICBUMSwgW3BaaWdaYWcsIENvZWZmTnVtXQorICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgIzEgICAgICA7Ly8gU2tpcCBOb24gemVybworICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgVDIgICAgICA7Ly8gU2tpcCBaZXJvIHJ1bgorICAgICAgICAKKyAgICAgICAgTERSU0ggICBUMiwgW3BMZXZlbF0sIzIKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgVG90YWxDb2VmZiwgVG90YWxDb2VmZiwgIzEgICAgICAgCisgICAgICAgIE9SUkVRICAgVDEsIFQxLCAjTEFTVF9DT0VGRgorICAgICAgICAKKyAgICAgICAgQUREICAgICB0ZW1wLCBUMiwgIzEyOAorICAgICAgICBDTVAgICAgIHRlbXAsICMyNTYKKyAgICAgICAgT1JSQ1MgICBUMSwgVDEsICNUV09fQllURV9DT0VGRgorCisgICAgICAgIAorICAgICAgICBURVEgICAgIFRvdGFsQ29lZmYsICMwICAgICAgICAgICAgICA7Ly8gUHJlc2VydmVzIGNhcnJ5ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJPdXRwdXQ9JTAyeCAlMDR4XG4iLCBUMSwgVDIKKyAgICAgICAgU1RSQiAgICBUMSwgW3BQb3NDb2VmYnVmXSwgIzEKKyAgICAgICAgU1RSQiAgICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEKKyAgICAgICAgTU9WICAgICBUMiwgVDIsIExTUiAjOAorICAgICAgICBTVFJDU0IgIFQyLCBbcFBvc0NvZWZidWZdLCAjMSAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICBPdXRwdXRMb29wCisgICAgICAgIAorICAgICAgICA7Ly8gRmluaXNoZWQKKyAgICAgICAgU1RSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KKyAgICAgICAgTV9MRFIgICBwcEJpdFN0cmVhbSwgcHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgcE9mZnNldCwgcHBPZmZzZXQKKyAgICAgICAgQiAgICAgICBFbmROb0Vycm9yCisgICAgICAgICAgICAKK0VuZEJhZFN5bWJvbAorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19FcnIKKyAgICAgICAgQiAgICAgICBFbmQgICAgCisgICAgICAgIAorRW5kTm9FcnJvcgorICAgICAgICA7Ly8gRmluaXNoZWQgcmVhZGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcE9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIgICAgCitFbmQKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmYxODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKQEAgLTAsMCArMSwxMjMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorCisgICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgICAgCisgICAgICAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKworICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICAgICAKKyAKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIERDQiAgMCwgMiwgMCwgMgorICAgICAgICAgRENCICAyLCAxLCAyLCAxCisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIERDQiAgMCwgMgorICAgICAgICAgRENCICAyLCAxCisKKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXgKKyAgICAgICAgIERDQiAgMTAsIDE2LCAxMworICAgICAgICAgRENCICAxMSwgMTgsIDE0CisgICAgICAgICBEQ0IgIDEzLCAyMCwgMTYKKyAgICAgICAgIERDQiAgMTQsIDIzLCAxOAorICAgICAgICAgRENCICAxNiwgMjUsIDIwCisgICAgICAgICBEQ0IgIDE4LCAyOSwgMjMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICAgRENCICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAgICAgIERDQiAgMSwgIDEsICAxLCAgMSwgIDEsICAxCisgICAgICAgICBEQ0IgIDIsICAyLCAgMiwgIDIsICAyLCAgMgorICAgICAgICAgRENCICAzLCAgMywgIDMsICAzLCAgMywgIDMKKyAgICAgICAgIERDQiAgNCwgIDQsICA0LCAgNCwgIDQsICA0CisgICAgICAgICBEQ0IgIDUsICA1LCAgNSwgIDUsICA1LCAgNQorICAgICAgICAgRENCICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKKyAgICAgICAgIERDQiAgNywgIDcsICA3LCAgNywgIDcsICA3CisgICAgICAgICBEQ0IgIDgsICA4LCAgOCwgIDgsICA4LCAgOAorICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCis7Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICBEQ1cgMTAsIDE2LCAxMyAKKyAgICAgICAgIERDVyAxMSwgMTgsIDE0CisgICAgICAgICBEQ1cgMTMsIDIwLCAxNgorICAgICAgICAgRENXIDE0LCAyMywgMTgKKyAgICAgICAgIERDVyAxNiwgMjUsIDIwCisgICAgICAgICBEQ1cgMTgsIDI5LCAyMyAKKyAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgICAgICAKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICAgICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI5NTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBBUk0xMTM2SlMgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gOAoraUhlaWdodCAgICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK3ggICAgICAgICAgICAgICBSTiA3Cit4MCAgICAgICAgICAgICAgUk4gNworeDEgICAgICAgICAgICAgIFJOIDEwCit4MiAgICAgICAgICAgICAgUk4gMTEKK1NjcmF0Y2ggICAgICAgICBSTiAxMgorCis7Ly8gRnVuY3Rpb246IAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIyLHIzLHI0LHI1LHI2Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAorICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKKworU3RhcnRBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMworICAgICAgICAKKyAgICAgICAgTV9TV0lUQ0ggeAorICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5MHRvQWxpZ25lZCAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisgICAgICAKK0NvcHkxdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorCitDb3B5MnRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTN0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAorCitDb3B5RW5kICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgorCisgICAgICAgIE1fRU5ECisgICAgCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCitTdGFydFZBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorQ29weTB0b1ZBbGlnbmVkICAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKyAgICAgIAorQ29weTF0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkydG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKworQ29weTN0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKKworQ29weVZFbmQgIAorCisgICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4CisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKworICAgICAgICBNX0VORAorCisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE0OSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSAKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjEscjMscjQscjUscjYscjcscjEwLHIxMSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByMCxyMixyOCxyOSxyMTIKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworeDAgICAgICAgICAgICAgIFJOIDQKK3gxICAgICAgICAgICAgICBSTiA1Cit4MiAgICAgICAgICAgICAgUk4gOAoreDMgICAgICAgICAgICAgIFJOIDkKK1RlbXAgICAgICAgICAgICBSTiAxMgorCisgICAgSUYgQVJNMTEzNkpTCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSwgcjYKKworQ29weTR4NFN0YXJ0CisgICAgICAgIDsvLyBEbyBDb3B5IGFuZCBicmFuY2ggdG8gRW5kT2ZJbnRlcnBvbGF0aW9uCisgICAgICAgIEFORCAgICAgVGVtcCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgIE1fU1dJVENIIFRlbXAKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMQorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjIKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24zCisgICAgICAgIE1fRU5EU1dJVENICisKK0NvcHk0eDRBbGlnbjAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fTERSICAgeDEsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDEsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHgzLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fU1RSICAgeDMsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0QWxpZ24xCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorICAgICAgCitDb3B5NHg0QWxpZ24yCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMyAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEVuZAorICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTc4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorCis7Ly8gRnVuY3Rpb25zOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlIGFuZAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIHJlLWFycmFuZ2VtZW50IG9mIGRhdGEgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGEgYnVmZmVyIHBvaW50ZWQgYnkgcEJ1Zi4KKzsvLyBUaGlzIHdpbGwgZG8gdGhlIGNvbnZlcnRpb24gb2YgZGF0YSBmcm9tIDE2IGJpdCB0byA4IGJpdCBhbmQgaXQgYWxzbworOy8vIHJlbW92ZSBvZmZzZXQgYW5kIGNoZWNrIGZvciBzYXR1cmF0aW9uLgorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyNyB3aGVyZSByMCBpcyBpbnB1dCBwb2ludGVyIGFuZCByMiBpdHMgc3RlcCBzaXplLCByNyBpcyBvdXRwdXQgcG9pbnRlcgorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjQscjUscjYscjgscjkscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBkZXN0aW5hdGlvbiBsb2NhdGlvbgorCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorICAgICAgICAKK01BU0sgICAgICAgICAgICBFUVUgMHg4MDgwODA4MCAgOy8vIE1hc2sgaXMgdXNlZCB0byBpbXBsZW1lbnQgKGErYisxKS8yCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjMCAgICAgICAgICAgUk4gMAorc3JjU3RlcDAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitUZW1wMyAgICAgICAgICAgUk4gMTAKK1RlbXA0ICAgICAgICAgICBSTiAxMQorcEJ1ZiAgICAgICAgICAgIFJOIDcKK3IweDBmZTAwZmUwICAgICBSTiA2CityMHgwMGZmMDBmZiAgICAgUk4gMTIKK0NvdW50ICAgICAgICAgICBSTiAxNAorVmFsdWVBMCAgICAgICAgIFJOIDEwCitWYWx1ZUExICAgICAgICAgUk4gMTEKKworICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjNCAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAKK0xvb3BTdGFydDEKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUkQgICAgICAgIFZhbHVlQTAsIFtwQnVmXSwgIzggCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydDEKK0VuZDEKKyAgICAgICAgU1VCICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyCisgICAgICAgIE1PViAgICAgICAgc3JjU3RlcDAsICM4CisKKyAgICAgICAgTV9FTkQKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUsIHI2CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYKKyAgICAgICAgTU9WICAgICAgICAgQ291bnQsICMyCisKK0xvb3BTdGFydCAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKworICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICMtNCAgCisKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICM0ICAKKyAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydAorRW5kMgorICAgICAgICBTVUIgICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyLTgKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcDAsICM0CisKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MWZmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwyOTYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisKKworICAgIElGIEFSTTExMzZKUyAKKworCisgICAgICAgIE1fQUxMT0M4IHBwRHN0QXJncywgOAorICAgICAgICBNX0FMTE9DOCBwVGVtcFJlc3VsdDEsIDgKKyAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQyLCA4CisgICAgICAgIE1fQUxMT0M0IHBwU3JjLCA0CisgICAgICAgIE1fQUxMT0M0IHBwRHN0LCA0CisgICAgICAgIE1fQUxMT0M0IHBEc3RTdGVwLCA0CisgICAgICAgIE1fQUxMT0M0IHBTcmNTdGVwLCA0CisgICAgICAgIE1fQUxMT0M0IHBDb3VudGVyLCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICA7Ly8gRnVuY3Rpb246IAorICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEltcGxlbWVudHMgZGlhZ29uYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCisgICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMsIHI4IHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBzdGVwIHNpemUsIHI4IGludGVybWVkaWF0ZS1idWYgcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0CisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCisgICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHI2CisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworQWNjMCAgICAgICAgICAgIFJOIDQKK0FjYzEgICAgICAgICAgICBSTiA1CitBY2MyICAgICAgICAgICAgUk4gNgorQWNjMyAgICAgICAgICAgIFJOIDcKKworVmFsQSAgICAgICAgICAgIFJOIDQKK1ZhbEIgICAgICAgICAgICBSTiA1CitWYWxDICAgICAgICAgICAgUk4gNgorVmFsRCAgICAgICAgICAgIFJOIDcKK1ZhbEUgICAgICAgICAgICBSTiA4CitWYWxGICAgICAgICAgICAgUk4gOQorVmFsRyAgICAgICAgICAgIFJOIDEyCitWYWxIICAgICAgICAgICAgUk4gMTQKK1ZhbEkgICAgICAgICAgICBSTiAxCisKK1RlbXAxICAgICAgICAgICBSTiAzCitUZW1wMiAgICAgICAgICAgUk4gMQorVGVtcDMgICAgICAgICAgIFJOIDEyCitUZW1wNCAgICAgICAgICAgUk4gNworVGVtcDUgICAgICAgICAgIFJOIDUKK3IweDBmZTAwZmUwICAgICBSTiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQorcjB4MDBmZjAwZmYgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0CitDb3VudGVyICAgICAgICAgUk4gMTEKK3BJbnRlckJ1ZiAgICAgICBSTiA4CisKK1ZhbENBICAgICAgICAgICBSTiA4CitWYWxEQiAgICAgICAgICAgUk4gOQorVmFsR0UgICAgICAgICAgIFJOIDEwCitWYWxIRiAgICAgICAgICAgUk4gMTEKK3IweDAwMTQwMDAxICAgICBSTiAxMgorcjB4MDAxNGZmZmIgICAgIFJOIDE0CisKK3IweDAwMDFmYzAwICAgICBSTiAxMQorCitBY2N4ICAgICAgICAgICAgUk4gOAorQWNjeSAgICAgICAgICAgIFJOIDkKK1RlbXA2ICAgICAgICAgICBSTiAxNAorCisgICAgICAgIE1fU1RSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworCisgICAgICAgIE1PViAgICAgICAgIHBEc3QsIHBJbnRlckJ1ZiAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgZHN0U3RlcCwgIzE2CisKKyAgICAgICAgOy8vIFNldCB1cCBjb3VudGVyIG9mIGZvcm1hdCwgWzBdICBbMF0gIFsxIChoZWlnaHQpXSAgWzggKHdpZHRoKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKKyAgICAgICAgTV9TVFIgICAgICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBzcmNTdGVwLCBwU3JjU3RlcCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKKworSGVpZ2h0TG9vcAorTmV4dFR3b1Jvd3NMb29wCisgICAgICAgIExEUiAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtkMSBjMSBiMSBhMV0KKyAgICAgICAgTERSICAgICBWYWxBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2QwIGMwIGIwIGEwXQorICAgICAgICBMRFIgICAgIFZhbEgsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gxIGcxIGYxIGUxXSAgICAgICAgCisgICAgICAgIExEUiAgICAgVmFsRSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDAgZzAgZjAgZTBdCisgICAgICAgIExEUkIgICAgVGVtcDIsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAxIFtsMSBrMSBqMSBpMV0KKyAgICAgICAgTERSQiAgICBUZW1wMSwgW3BTcmNdLCAjLTggICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDAgW2wwIGswIGowIGkwXQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBWYWxCLCBWYWxBLCBWYWxELCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtiMSBhMSBiMCBhMF0KKyAgICAgICAgUEtIVEIgICBWYWxELCBWYWxELCBWYWxBLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtkMSBjMSBkMCBjMF0KKyAgICAgICAgVVhUQUIxNiBWYWxBLCByMHgwMGZmMDBmZiwgVmFsQiAgICAgICAgICAgICAgICAgOy8vIFswMCBhMSAwMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgVmFsQywgcjB4MDBmZjAwZmYsIFZhbEQgICAgICAgICAgICAgICAgIDsvLyBbMDAgYzEgMDAgYzBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBQS0hCVCAgIFZhbEksIFRlbXAxLCBUZW1wMiwgTFNMICMxNiAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFZhbEYsIFZhbEUsIFZhbEgsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2YxIGUxIGYwIGUwXQorICAgICAgICBQS0hUQiAgIFZhbEgsIFZhbEgsIFZhbEUsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2gxIGcxIGgwIGcwXQorICAgICAgICBVWFRBQjE2IFZhbEUsIHIweDAwZmYwMGZmLCBWYWxGICAgICAgICAgICAgICAgICA7Ly8gWzAwIGUxIDAwIGUwXSArIFswIDI1NSAwIDI1NV0KKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzAKKyAgICAgICAgOy8vIEFjYzAgPSBhIC0gNSpiICsgMjAqYyArIDIwKmQgLSA1KmUgKyBmCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEMsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxFLCBWYWxCLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgQWNjMCwgVmFsQSwgVmFsRiwgUk9SICM4CisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MwLCBBY2MwLCBUZW1wMSAgICAgICAKKworICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzEKKyAgICAgICAgOy8vIEFjYzEgPSBiIC0gNSpjICsgMjAqZCArIDIwKmUgLSA1KmYgKyBnCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAzLCBWYWxDLCBWYWxGLCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDMsIFRlbXAxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBWYWxHLCByMHgwMGZmMDBmZiwgVmFsSCAgICAgICAgICAgICAgICAgOy8vIFswMCBnMSAwMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MxLCBWYWxHLCBWYWxCLCBST1IgIzgKKyAgICAgICAgQUREICAgICBBY2MxLCBBY2MxLCBUZW1wMSAgICAgICAgCisKKyAgICAgICAgVVhUQUIxNiBBY2MyLCBWYWxDLCBWYWxILCBST1IgIzggICAgICAgIAorICAgICAgICBBREQgICAgIFZhbEksIHIweDAwZmYwMGZmLCBWYWxJICAgICAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MyCisgICAgICAgIDsvLyBBY2MyID0gYyAtIDUqZCArIDIwKmUgKyAyMCpmIC0gNSpnICsgaAorICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxHLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBBY2MzLCBWYWxJLCBWYWxELCBST1IgIzgKKyAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRSwgVmFsRiwgUk9SICM4CisgICAgICAgIAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMiAgICAgICAgCisgICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEcsIFZhbEYsIFJPUiAjOAorICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIEFERCAgICAgQWNjMiwgQWNjMiwgVGVtcDEgICAgICAgIAorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMworICAgICAgICA7Ly8gQWNjMyA9IGQgLSA1KmUgKyAyMCpmICsgMjAqZyAtIDUqaCArIGkKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsSCwgUk9SICM4CisgICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMiwgTFNMICMyCisgICAgICAgIEFERCAgICAgVGVtcDEsIFRlbXAxLCBUZW1wMSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MzLCBBY2MzLCBUZW1wMQorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLCBwRHN0U3RlcCAgICAgICAgCisgICAgICAgIE1fTERSICAgc3JjU3RlcCwgcFNyY1N0ZXAKKworICAgICAgICA7Ly8gSWYgQ291bnRlciBpcyBldmVuIHN0b3JlIEFjYzAtQWNjMyBpbiBhIHRlbXBvcmFyeSBidWZmZXIKKyAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgb2ZmIHN0b3JlIEFjYzAtQWNjMyBhbmQgcHJldmlvdXMgQWNjMC1BY2MzIGluIGEgaW50ZXJtZWRpYXRlIGJ1ZiAKKyAgICAgICAgQU5EUyAgICAgICAgVGVtcDMsIENvdW50ZXIsICMxCisgICAgICAgIEJFUSAgICAgICAgIE5vUHJvY2Vzc2luZyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUGFja2luZyBwcmV2aW91cyBhbmQgY3VycmVudCBBY2MwLUFjYzMgdmFsdWVzCisgICAgICAgIE1fTERSRCAgICAgIEFjY3gsIEFjY3ksIHBUZW1wUmVzdWx0MQorICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeCwgQWNjMCwgTFNMICMxNiAgICAgICAgICA7Ly9bMCBhMiAwIGEwXSA9IFswIGEzIDAgYTJdIFswIGExIDAgYTBdCisgICAgICAgIFBLSFRCICAgICAgIEFjYzAsIEFjYzAsIEFjY3gsIEFTUiAjMTYgICAgICAgICAgIDsvL1swIGEzIDAgYTFdID0gWzAgYTEgMCBhMF0gWzAgYTMgMCBhMl0gCisgICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3ksIEFjYzEsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYjIgMCBiMF0gPSBbMCBiMyAwIGIyXSBbMCBiMSAwIGIwXQorICAgICAgICBQS0hUQiAgICAgICBBY2MxLCBBY2MxLCBBY2N5LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYjMgMCBiMV0gPSBbMCBiMSAwIGIwXSBbMCBiMyAwIGIyXQorICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDIKKyAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzIsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYzIgMCBjMF0gPSBbMCBjMyAwIGMyXSBbMCBjMSAwIGMwXQorICAgICAgICBQS0hUQiAgICAgICBBY2MyLCBBY2MyLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICAgOy8vWzAgYzMgMCBjMV0gPSBbMCBjMSAwIGMwXSBbMCBjMyAwIGMyXQorICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MzLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGQyIDAgZDBdID0gWzAgZDMgMCBkMl0gWzAgZDEgMCBkMF0KKyAgICAgICAgUEtIVEIgICAgICAgQWNjMywgQWNjMywgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGQzIDAgZDFdID0gWzAgZDEgMCBkMF0gWzAgZDMgMCBkMl0KKyAgICAgICAgU1RSICAgICAgICAgQWNjMywgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICMtMTIKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBBZnRlclN0b3JlCisKK05vUHJvY2Vzc2luZworICAgICAgICBNX1NUUkQgICAgICBBY2MwLCBBY2MxLCBwVGVtcFJlc3VsdDEKKyAgICAgICAgTV9TVFJEICAgICAgQWNjMiwgQWNjMywgcFRlbXBSZXN1bHQyCitBZnRlclN0b3JlCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxICAgICAgICAgICAgICAgIDsvLyBMb29wIHRpbGwgaGVpZ2h0IGlzIDEwCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCUEwgICAgICAgICBIZWlnaHRMb29wCisKKyAgICAgICAgU1RSICAgICAgICAgQWNjMCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vWzAgYTEgMCBhMF0KKyAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3RdLCAjNAorICAgICAgICBTVFIgICAgICAgICBBY2MyLCBbcERzdF0sICM0CisgICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0XSwgIy0xMgorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KKyAgICAgICAgOy8vCisgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwLCAjMTYKKyAgICAgICAgTV9MRFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCisKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAxNGZmZmIsID0weDAwMTRmZmZiCisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTQwMDAxLCA9MHgwMDE0MDAwMQorCitIZWlnaHRMb29wMQorICAgICAgICBNX1NUUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgorCisgICAgICAgIE1fTERSICAgICAgIFZhbENBLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgYyAwIGFdCisgICAgICAgIE1fTERSICAgICAgIFZhbERCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZCAwIGJdCisgICAgICAgIE1fTERSICAgICAgIFZhbEdFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZyAwIGVdCisgICAgICAgIE1fTERSICAgICAgIFZhbEhGLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgaCAwIGZdCisKKworICAgICAgICA7Ly8gQWNjMCA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgYyAwIGFdICsgWzAgZCAwIGZdKSkgLSAoNSAqIChiICsgZSkpIAorICAgICAgICA7Ly8gQWNjMSA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZSAwIGddICsgWzAgZCAwIGJdKSkgLSAoNSAqIChjICsgZikpIAorICAgICAgICA7Ly8gQWNjMiA9IHNtdWFkIChbMCAxIDAgMjBdLCBhZGQoWzAgYyAwIGVdICsgWzAgaCAwIGZdKSkgLSAoNSAqIChkICsgZykpIAorICAgICAgICA7Ly8gQWNjMyA9IHNtdWFkIChbMCAyMCAwIDFdLCBhZGQoWzAgZCAwIGZdICsgWzAgaSAwIGddKSkgLSAoNSAqIChlICsgaCkpIAorCisgICAgICAgIFNNVUFEICAgICAgIEFjYzAsIFZhbENBLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MwICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMSwgVmFsREIsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzEgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQorICAgICAgICBTTVVBRFggICAgICBBY2MyLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMiAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTVVBRCAgICAgICBBY2MzLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMyAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQorCisgICAgICAgIFNNTEFEICAgICAgIEFjYzAsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGQgMCBiXSAqIFswIDIwIDAgLTVdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzEsIFZhbEdFLCByMHgwMDE0MDAwMSwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGcgMCBlXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMiwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAxXQorICAgICAgICBTTUxBRFggICAgICBBY2MzLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIC01XQorCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEdFLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGcgMCBlXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMSwgVmFsQ0EsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XQorICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMywgVmFsREIsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisKKyAgICAgICAgTERSSCAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIDggPSBzcmNTdGVwIC0gMTYKKyAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgaCAwIGZdICogWzAgMCAwIDFdICAgICAgICAKKyAgICAgICAgU01MQUJCICAgICAgQWNjMSwgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgaCAwIGZdICogWzAgMCAwIC01XQorICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdICAgICAgICAKKyAgICAgICAgU01MQUJCICAgICAgQWNjMywgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgZCAwIGJdICogWzAgMCAwIDFdCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMDAxZmMwMCwgPTB4MDAwMWZjMDAgICAgICAgICAgICA7Ly8gKDB4ZmYgKiAxNiAqIDMyKSAtIDUxMgorICAgICAgICBTVUIgICAgICAgICBBY2MwLCBBY2MwLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzEsIEFjYzEsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMiwgQWNjMiwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MzLCBBY2MzLCByMHgwMDAxZmMwMCAgICAgICAgCisKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMCwgIzE4LCBBY2MwCisgICAgICAgIFVTQVQgICAgICAgIEFjYzEsICMxOCwgQWNjMQorICAgICAgICBVU0FUICAgICAgICBBY2MyLCAjMTgsIEFjYzIKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMywgIzE4LCBBY2MzCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBBY2MwLCBBY2MwLCBMU1IgIzEwCisgICAgICAgIE1fU1RSQiAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgICAgICBBY2MxLCBBY2MxLCBMU1IgIzEwCisgICAgICAgIE1fU1RSQiAgICAgIEFjYzEsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgICAgICBBY2MyLCBBY2MyLCBMU1IgIzEwCisgICAgICAgIE1fU1RSQiAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgICAgICBBY2MzLCBBY2MzLCBMU1IgIzEwCisgICAgICAgIE1fU1RSQiAgICAgIEFjYzMsIFtwRHN0XSwgZHN0U3RlcAorCisKKyAgICAgICAgTV9MRFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKKyAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjMQorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMQorICAgICAgICBCR1QgICAgICAgICBIZWlnaHRMb29wMQorRW5kCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsICM0CisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ4ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjc2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAKKyAgICAKKyAgICAKKworICAgIElGIEFSTTExMzZKUyAKKyAgICAgICAgCisgICAgICAgIE1fQUxMT0M4IHBwRHN0QXJncywgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAorICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAorICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEZ1bmN0aW9uOgorICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEltcGxlbWVudHMgZGlhZ29uYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCisgICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMsIHI4IHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBzdGVwIHNpemUsIHI4IGludGVybWVkaWF0ZS1idWYgcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0CisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCisgICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUsIHI2CisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK1ZhbEEgICAgICAgICAgICBSTiA1CitWYWxBMCAgICAgICAgICAgUk4gNAorVmFsQTEgICAgICAgICAgIFJOIDUKK1ZhbEFGMCAgICAgICAgICBSTiA0CitWYWxBRjEgICAgICAgICAgUk4gNQorCitWYWxCICAgICAgICAgICAgUk4gMTEKKworVmFsQyAgICAgICAgICAgIFJOIDUKK1ZhbEMwICAgICAgICAgICBSTiA0CitWYWxDMSAgICAgICAgICAgUk4gNQorVmFsQ0QwICAgICAgICAgIFJOIDEyCitWYWxDRDEgICAgICAgICAgUk4gMTQKK1ZhbENGMCAgICAgICAgICBSTiA0CitWYWxDRjEgICAgICAgICAgUk4gNQorCitWYWxEICAgICAgICAgICAgUk4gMTAKKworVmFsRSAgICAgICAgICAgIFJOIDcKK1ZhbEUwICAgICAgICAgICBSTiA2CitWYWxFMSAgICAgICAgICAgUk4gNworVmFsRUIwICAgICAgICAgIFJOIDEwCitWYWxFQjEgICAgICAgICAgUk4gMTEKK1ZhbEVEMCAgICAgICAgICBSTiA2CitWYWxFRDEgICAgICAgICAgUk4gNworCitWYWxGICAgICAgICAgICAgUk4gMTAKKworVmFsRyAgICAgICAgICAgIFJOIDE0CitWYWxHMCAgICAgICAgICAgUk4gMTIKK1ZhbEcxICAgICAgICAgICBSTiAxNAorVmFsR0IwICAgICAgICAgIFJOIDEyCitWYWxHQjEgICAgICAgICAgUk4gMTQKKworQWNjMCAgICAgICAgICAgIFJOIDQKK0FjYzEgICAgICAgICAgICBSTiA1CitBY2MyICAgICAgICAgICAgUk4gNgorQWNjMyAgICAgICAgICAgIFJOIDcKKworVGVtcCAgICAgICAgICAgIFJOIDcKK1N0ZXAgICAgICAgICAgICBSTiA2CisKK3BJbnRlckJ1ZiAgICAgICBSTiA4CitDb3VudGVyICAgICAgICAgUk4gOAorcjB4MDBmZjAwZmYgICAgIFJOIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAorcjB4MDAwMWZjMDAgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQorCisgICAgCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworVmFsQ0EgICAgICAgICAgIFJOIDgKK1ZhbERCICAgICAgICAgICBSTiA5CitWYWxHRSAgICAgICAgICAgUk4gMTAKK1ZhbEhGICAgICAgICAgICBSTiAxMQorcjB4MDAxNDAwMDEgICAgIFJOIDEyCityMHgwMDE0ZmZmYiAgICAgUk4gMTQKKworcjB4MDAwMDAyMDAgICAgIFJOIDEyCityMHgwMDAwMDBmZiAgICAgUk4gMTIKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncworICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMyNAorCisgICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMxCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgVGVtcCwgQ291bnRlciwgTFNMICM4ICAgICAgICA7Ly8gWzAgMCBIIFddICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAorV2lkdGhMb29wCisgICAgICAgIE1fU1RSICAgICAgIHBTcmMsIHBwU3JjCisgICAgICAgIE1fU1RSICAgICAgIHBEc3QsIHBwRHN0CitIZWlnaHRMb29wCitUd29Sb3dzTG9vcAorICAgICAgICBNX0xEUiAgICAgICBWYWxDLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtjMyBjMiBjMSBjMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsRCwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2UzIGUyIGUxIGUwXSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQzAsIHIweDAwZmYwMGZmLCBWYWxDICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQzEsIHIweDAwZmYwMGZmLCBWYWxDLCBST1IgIzggICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxCLCBbcFNyY10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFMCwgcjB4MDBmZjAwZmYsIFZhbEUgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFMSwgcjB4MDBmZjAwZmYsIFZhbEUsIFJPUiAjOCAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENEMCwgVmFsQzAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QxLCBWYWxDMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMCwgVmFsRTAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KKyAgICAgICAgUlNCICAgICAgICAgVmFsQ0QwLCBWYWxFQjAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrQytEKSAtIChPZmYrQitFKQorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMSwgVmFsRTEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBSU0IgICAgICAgICBWYWxDRDEsIFZhbEVCMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEYsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2YzIGYyIGYxIGYwXQorICAgICAgICBNX0xEUiAgICAgICBWYWxCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFZhbENEMCwgVmFsQ0QwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrQytEKSAtIChPZmYrQitFKV0KKyAgICAgICAgQUREICAgICAgICAgVmFsQ0QxLCBWYWxDRDEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YxLCBWYWxDMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENGMCwgVmFsQzAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0gICAgICAgIAorICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQorICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgQWNjMSwgVmFsQ0QxLCBWYWxBRjEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsRywgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZzMgZzIgZzEgZzBdCisgICAgICAgIEFERCAgICAgICAgIEFjYzAsIFZhbENEMCwgVmFsQUYwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMCA9IDE2Kk9mZiArIChBK0YpICsgMjAqKEMrRCkgLSA1KihCK0UpICAgICAgICAKKyAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgorICAgICAgICBNX1NUUiAgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQorICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdCwgIzRdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEgPDwgOCAgICAgICAgICAgICAgIDsvLyBMb29wIHRpbGwgaGVpZ2h0IGlzIDEwCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCUEwgICAgICAgICBIZWlnaHRMb29wCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwU3JjLCBwcFNyYworICAgICAgICBNX0xEUiAgICAgICBwRHN0LCBwcERzdAorICAgICAgICBBRERTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjKDEgPDwgOCktNCAgICAgICAgICAgOy8vIExvb3AgdGlsbCB3aWR0aCBpcyAxMgorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjNAorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjOAorICAgICAgICBBREQgICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMTw8OAorICAgICAgICBCUEwgICAgICAgICBXaWR0aExvb3AKKyAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KKyAgICAgICAgOy8vCisgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBEc3QsICMyNAorICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwLCAjMjQKKyAgICAgICAgTV9MRFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCisKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKKyAgICAgICAgTERSICAgICAgICAgcjB4MDAxNGZmZmIsID0weDAwMTRmZmZiCisgICAgICAgIExEUiAgICAgICAgIHIweDAwMTQwMDAxLCA9MHgwMDE0MDAwMQorCitIZWlnaHRMb29wMQorICAgICAgICBNX1NUUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgorCisKKyAgICAgICAgTERSICAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQorICAgICAgICBMRFIgICAgICAgICBWYWxEQiwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZCAwIGJdCisgICAgICAgIExEUiAgICAgICAgIFZhbEdFLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBnIDAgZV0KKyAgICAgICAgTERSICAgICAgICAgVmFsSEYsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQorCisgICAgICAgIDsvLyBBY2MwID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBjIDAgYV0gKyBbMCBkIDAgZl0pKSAtICg1ICogKGIgKyBlKSkgCisgICAgICAgIDsvLyBBY2MxID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBlIDAgZ10gKyBbMCBkIDAgYl0pKSAtICg1ICogKGMgKyBmKSkgCisgICAgICAgIDsvLyBBY2MyID0gc211YWQgKFswIDEgMCAyMF0sIGFkZChbMCBjIDAgZV0gKyBbMCBoIDAgZl0pKSAtICg1ICogKGQgKyBnKSkgCisgICAgICAgIDsvLyBBY2MzID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBkIDAgZl0gKyBbMCBpIDAgZ10pKSAtICg1ICogKGUgKyBoKSkgCisgICAgICAgIFNNVUFEICAgICAgIEFjYzAsIFZhbENBLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MwICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01VQUQgICAgICAgQWNjMSwgVmFsREIsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzEgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQorICAgICAgICBTTVVBRFggICAgICBBY2MyLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMiAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQorICAgICAgICBTTVVBRCAgICAgICBBY2MzLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMyAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQorCisgICAgICAgIFNNTEFEICAgICAgIEFjYzAsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGQgMCBiXSAqIFswIDIwIDAgLTVdCisgICAgICAgIFNNTEFEWCAgICAgIEFjYzEsIFZhbEdFLCByMHgwMDE0MDAwMSwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGcgMCBlXSAqIFswIDIwIDAgMV0KKyAgICAgICAgU01MQURYICAgICAgQWNjMiwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAxXQorICAgICAgICBTTUxBRFggICAgICBBY2MzLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIC01XQorCisgICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEdFLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGcgMCBlXSAqIFswIDAgMCAtNV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMSwgVmFsQ0EsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XQorICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KKyAgICAgICAgU01MQVRCICAgICAgQWNjMywgVmFsREIsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCisKKyAgICAgICAgTERSSCAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzggICAgICAgICAgICAgICAgICAgOy8vIDggPSBzcmNTdGVwIC0gMTYKKyAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgaCAwIGZdICogWzAgMCAwIDFdICAgICAgICAKKyAgICAgICAgU01MQUJCICAgICAgQWNjMSwgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgaCAwIGZdICogWzAgMCAwIC01XQorICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdICAgICAgICAKKyAgICAgICAgU01MQUJCICAgICAgQWNjMywgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgZCAwIGJdICogWzAgMCAwIDFdCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwMDAxZmMwMCwgPTB4MDAwMWZjMDAgICAgICAgICAgICA7Ly8gKDB4ZmYgKiAxNiAqIDMyKSAtIDUxMgorICAgICAgICBTVUIgICAgICAgICBBY2MwLCBBY2MwLCByMHgwMDAxZmMwMCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIEFjYzEsIEFjYzEsIHIweDAwMDFmYzAwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgQWNjMiwgQWNjMiwgcjB4MDAwMWZjMDAgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBBY2MzLCBBY2MzLCByMHgwMDAxZmMwMCAgICAgICAgCisKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMCwgIzE4LCBBY2MwCisgICAgICAgIFVTQVQgICAgICAgIEFjYzEsICMxOCwgQWNjMQorICAgICAgICBVU0FUICAgICAgICBBY2MyLCAjMTgsIEFjYzIKKyAgICAgICAgVVNBVCAgICAgICAgQWNjMywgIzE4LCBBY2MzCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBBY2MwLCBBY2MwLCBMU1IgIzEwCisgICAgICAgIE1PViAgICAgICAgIEFjYzEsIEFjYzEsIExTUiAjMTAKKyAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAorICAgICAgICBNT1YgICAgICAgICBBY2MzLCBBY2MzLCBMU1IgIzEwCisKKyAgICAgICAgTV9MRFIgICAgICAgQ291bnRlciwgcENvdW50ZXIgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzgKKyAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCisgICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzIsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEJHVCAgICAgICAgIEhlaWdodExvb3AxCitFbmQKKyAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5MGNlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjM5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vIEZ1bmN0aW9uOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKKzsvLyBiZSBhbGlnbmVkLiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKKworCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCitBY2MwICAgICAgICAgICAgUk4gNAorQWNjMSAgICAgICAgICAgIFJOIDUKK0FjYzIgICAgICAgICAgICBSTiA2CitBY2MzICAgICAgICAgICAgUk4gNworCitWYWxBICAgICAgICAgICAgUk4gNAorVmFsQiAgICAgICAgICAgIFJOIDUKK1ZhbEMgICAgICAgICAgICBSTiA2CitWYWxEICAgICAgICAgICAgUk4gNworVmFsRSAgICAgICAgICAgIFJOIDgKK1ZhbEYgICAgICAgICAgICBSTiA5CitWYWxHICAgICAgICAgICAgUk4gMTIKK1ZhbEggICAgICAgICAgICBSTiAxNAorVmFsSSAgICAgICAgICAgIFJOIDEKKworVGVtcDEgICAgICAgICAgIFJOIDMKK1RlbXAyICAgICAgICAgICBSTiAxCitUZW1wMyAgICAgICAgICAgUk4gMTIKK1RlbXA0ICAgICAgICAgICBSTiA3CitUZW1wNSAgICAgICAgICAgUk4gNQorcjB4MGZlMDBmZTAgICAgIFJOIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCityMHgwMGZmMDBmZiAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKK0NvdW50ZXIgICAgICAgICBSTiAxMQorCitIZWlnaHQgICAgICAgICAgUk4gMworCisgICAgICAgIE1fQUxMT0M0IHBEc3RTdGVwLCA0CisgICAgICAgIE1fQUxMT0M0IHBTcmNTdGVwLCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlLCByNgorICAgICAgICAKKyAgICAgICAgTU9WICAgICBDb3VudGVyLCAjMgorICAgICAgICBNX1NUUiAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKKyAgICAgICAgTV9TVFIgICBzcmNTdGVwLCBwU3JjU3RlcCAgICAgICAgCisgICAgICAgIExEUiAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAorCitOZXh0VHdvUm93c0xvb3AKKyAgICAgICAgTERSICAgICBWYWxELCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2QxIGMxIGIxIGExXQorICAgICAgICBMRFIgICAgIFZhbEEsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbZDAgYzAgYjAgYTBdCisgICAgICAgIExEUiAgICAgVmFsSCwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbaDEgZzEgZjEgZTFdICAgICAgICAKKyAgICAgICAgTERSICAgICBWYWxFLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMCBnMCBmMCBlMF0KKyAgICAgICAgTERSQiAgICBUZW1wMiwgW3BTcmMsIHNyY1N0ZXBdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcm93IDEgW2wxIGsxIGoxIGkxXQorICAgICAgICBMRFJCICAgIFRlbXAxLCBbcFNyY10sICMtOCAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMCBbbDAgazAgajAgaTBdCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFZhbEIsIFZhbEEsIFZhbEQsIExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gW2IxIGExIGIwIGEwXQorICAgICAgICBQS0hUQiAgIFZhbEQsIFZhbEQsIFZhbEEsIEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gW2QxIGMxIGQwIGMwXQorICAgICAgICBVWFRBQjE2IFZhbEEsIHIweDAwZmYwMGZmLCBWYWxCICAgICAgICAgICAgICAgICA7Ly8gWzAwIGExIDAwIGEwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiBWYWxDLCByMHgwMGZmMDBmZiwgVmFsRCAgICAgICAgICAgICAgICAgOy8vIFswMCBjMSAwMCBjMF0gKyBbMCAyNTUgMCAyNTVdCisgICAgICAgIFBLSEJUICAgVmFsSSwgVGVtcDEsIFRlbXAyLCBMU0wgIzE2ICAgICAgICAgICAgIDsvLyBbMDAgaTEgMDAgaTBdICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgVmFsRiwgVmFsRSwgVmFsSCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbZjEgZTEgZjAgZTBdCisgICAgICAgIFBLSFRCICAgVmFsSCwgVmFsSCwgVmFsRSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbaDEgZzEgaDAgZzBdCisgICAgICAgIFVYVEFCMTYgVmFsRSwgcjB4MDBmZjAwZmYsIFZhbEYgICAgICAgICAgICAgICAgIDsvLyBbMDAgZTEgMDAgZTBdICsgWzAgMjU1IDAgMjU1XQorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMAorICAgICAgICA7Ly8gQWNjMCA9IGEgLSA1KmIgKyAyMCpjICsgMjAqZCAtIDUqZSArIGYKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsQywgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEUsIFZhbEIsIFJPUiAjOAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MwLCBWYWxBLCBWYWxGLCBST1IgIzgKKyAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAorICAgICAgICBBREQgICAgIEFjYzAsIEFjYzAsIFRlbXAxICAgICAgIAorCisgICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMQorICAgICAgICA7Ly8gQWNjMSA9IGIgLSA1KmMgKyAyMCpkICsgMjAqZSAtIDUqZiArIGcKKyAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRSwgVmFsRCwgUk9SICM4CisgICAgICAgIFVYVEFCMTYgVGVtcDMsIFZhbEMsIFZhbEYsIFJPUiAjOAorICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMywgVGVtcDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2IFZhbEcsIHIweDAwZmYwMGZmLCBWYWxIICAgICAgICAgICAgICAgICA7Ly8gWzAwIGcxIDAwIGcwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAorICAgICAgICBVWFRBQjE2IEFjYzEsIFZhbEcsIFZhbEIsIFJPUiAjOAorICAgICAgICBBREQgICAgIEFjYzEsIEFjYzEsIFRlbXAxICAgICAgICAKKworICAgICAgICBMRFIgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMCAgICAgICAgICAgICAgICA7Ly8gMHgwZmUwMGZlMCA9ICgxNiAqIE9mZnNldCkgLSAxNiB3aGVyZSBPZmZzZXQgaXMgMjU1ICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBBY2MyLCBWYWxDLCBWYWxILCBST1IgIzggICAgICAgIAorICAgICAgICBBREQgICAgIFZhbEksIHIweDAwZmYwMGZmLCBWYWxJICAgICAgICAgICAgICAgICA7Ly8gWzAwIGkxIDAwIGkwXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBVUVNVQjE2IEFjYzAsIEFjYzAsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMAorICAgICAgICBVU0FUMTYgIEFjYzAsICMxMywgQWNjMAorICAgICAgICBVU0FUMTYgIEFjYzEsICMxMywgQWNjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzIKKyAgICAgICAgOy8vIEFjYzIgPSBjIC0gNSpkICsgMjAqZSArIDIwKmYgLSA1KmcgKyBoCisgICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEcsIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IEFjYzMsIFZhbEksIFZhbEQsIFJPUiAjOAorICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxFLCBWYWxGLCBST1IgIzgKKyAgICAgICAgQU5EICAgICBBY2MxLCByMHgwMGZmMDBmZiwgQWNjMSwgTFNSICM1CisgICAgICAgIEFORCAgICAgQWNjMCwgcjB4MDBmZjAwZmYsIEFjYzAsIExTUiAjNQorICAgICAgICBPUlIgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgCisgICAgICAgIFJTQiAgICAgVGVtcDUsIFRlbXAxLCBUZW1wMiwgTFNMICMyICAgICAgICAKKyAgICAgICAgVVhUQUIxNiBUZW1wMiwgVmFsRywgVmFsRiwgUk9SICM4CisgICAgICAgIEFERCAgICAgVGVtcDUsIFRlbXA1LCBUZW1wNSwgTFNMICMyICAgICAgICAKKyAgICAgICAgQUREICAgICBBY2MyLCBBY2MyLCBUZW1wNSAgICAgICAgCisKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MzCisgICAgICAgIDsvLyBBY2MzID0gZCAtIDUqZSArIDIwKmYgKyAyMCpnIC0gNSpoICsgaQorICAgICAgICBVWFRBQjE2IFRlbXA1LCBWYWxFLCBWYWxILCBST1IgIzgKKyAgICAgICAgUlNCICAgICBUZW1wNSwgVGVtcDUsIFRlbXAyLCBMU0wgIzIKKyAgICAgICAgTERSICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgQUREICAgICBUZW1wNSwgVGVtcDUsIFRlbXA1LCBMU0wgIzIgICAgICAgIAorICAgICAgICBBREQgICAgIEFjYzMsIEFjYzMsIFRlbXA1CisgICAgICAgIAorICAgICAgICBVUVNVQjE2IEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiBBY2MyLCBBY2MyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVTQVQxNiAgQWNjMywgIzEzLCBBY2MzCisgICAgICAgIFVTQVQxNiAgQWNjMiwgIzEzLCBBY2MyICAgICAgICAKKworICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsIHBEc3RTdGVwCisgICAgICAgIEFORCAgICAgQWNjMywgcjB4MDBmZjAwZmYsIEFjYzMsIExTUiAjNQorICAgICAgICBBTkQgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUKKyAgICAgICAgT1JSICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzgKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgQ291bnRlciwgQ291bnRlciwgIzEKKyAgICAgICAgTV9MRFIgICBzcmNTdGVwLCBwU3JjU3RlcAorICAgICAgICBQS0hCVCAgIEFjYzEsIEFjYzAsIEFjYzIsIExTTCAjMTYgICAKKyAgICAgICAgTV9TVFIgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdDEKKyAgICAgICAgUEtIVEIgICBBY2MyLCBBY2MyLCBBY2MwLCBBU1IgIzE2ICAgCisgICAgICAgIE1fU1RSICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQyCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIAorICAgICAgICBCR1QgICAgIE5leHRUd29Sb3dzTG9vcAorRW5kCisgICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyCisKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3Y2QwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTg1IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisKKworICAgIAorICAgIElGIEFSTTExMzZKUworICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uOiAKKyAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW1wbGVtZW50cyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGZvciBhIGJsb2NrIG9mIHNpemUgNHg0LiBJbnB1dCBhbmQgb3V0cHV0IHNob3VsZCAKKyAgICAgICAgOy8vIGJlIGFsaWduZWQuIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCisgICAgICAgIDsvLyByMCxyMSxyMixyMyB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgY29ycmVzcG9uZGluZyBzdGVwIHNpemUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycworICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByNgorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCitWYWxBICAgICAgICAgICAgUk4gNQorVmFsQTAgICAgICAgICAgIFJOIDQKK1ZhbEExICAgICAgICAgICBSTiA1CitWYWxBRjAgICAgICAgICAgUk4gNAorVmFsQUYxICAgICAgICAgIFJOIDUKKworVmFsQiAgICAgICAgICAgIFJOIDExCisKK1ZhbEMgICAgICAgICAgICBSTiA1CitWYWxDMCAgICAgICAgICAgUk4gNAorVmFsQzEgICAgICAgICAgIFJOIDUKK1ZhbENEMCAgICAgICAgICBSTiAxMgorVmFsQ0QxICAgICAgICAgIFJOIDE0CitWYWxDRjAgICAgICAgICAgUk4gNAorVmFsQ0YxICAgICAgICAgIFJOIDUKKworVmFsRCAgICAgICAgICAgIFJOIDEwCisKK1ZhbEUgICAgICAgICAgICBSTiA3CitWYWxFMCAgICAgICAgICAgUk4gNgorVmFsRTEgICAgICAgICAgIFJOIDcKK1ZhbEVCMCAgICAgICAgICBSTiAxMAorVmFsRUIxICAgICAgICAgIFJOIDExCitWYWxFRDAgICAgICAgICAgUk4gNgorVmFsRUQxICAgICAgICAgIFJOIDcKKworVmFsRiAgICAgICAgICAgIFJOIDEwCisKK1ZhbEcgICAgICAgICAgICBSTiAxNAorVmFsRzAgICAgICAgICAgIFJOIDEyCitWYWxHMSAgICAgICAgICAgUk4gMTQKK1ZhbEdCMCAgICAgICAgICBSTiAxMgorVmFsR0IxICAgICAgICAgIFJOIDE0CisKK0FjYzAgICAgICAgICAgICBSTiA0CitBY2MxICAgICAgICAgICAgUk4gNQorQWNjMiAgICAgICAgICAgIFJOIDYKK0FjYzMgICAgICAgICAgICBSTiA3CisKK1RlbXAgICAgICAgICAgICBSTiA3CitIZWlnaHQgICAgICAgICAgUk4gMworU3RlcCAgICAgICAgICAgIFJOIDYKKworQ291bnRlciAgICAgICAgIFJOIDgKK3IweDAwZmYwMGZmICAgICBSTiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIHdoZXJlIDI1NSBpcyBvZmZzZXQKK3IweDBmZTAwZmUwICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAgICAgICAgIDsvLyBbMCAyNTUgMCAyNTVdIDI1NSBpcyBvZmZzZXQgdG8gYXZvaWQgbmVnYXRpdmUgcmVzdWx0cyAKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzIKKyAgICAgICAgCitUd29Sb3dzTG9vcAorICAgICAgICBNX0xEUiAgICAgICBWYWxDLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtjMyBjMiBjMSBjMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsRCwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCisgICAgICAgIE1fTERSICAgICAgIFZhbEUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2UzIGUyIGUxIGUwXSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgVmFsQiwgW3BTcmNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQzAsIHIweDAwZmYwMGZmLCBWYWxDICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQzEsIHIweDAwZmYwMGZmLCBWYWxDLCBST1IgIzggICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTAsIHIweDAwZmYwMGZmLCBWYWxFICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRTEsIHIweDAwZmYwMGZmLCBWYWxFLCBST1IgIzggICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDAsIFZhbEMwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENEMSwgVmFsQzEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjAsIFZhbEUwLCBWYWxCICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGIyIDAgYjBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbENEMCwgVmFsRUIwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzFdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxFQjEsIFZhbEUxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCICAgICAgICAgVmFsQ0QxLCBWYWxFQjEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMCwgVmFsRTAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRUQxLCBWYWxFMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBWYWxGLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtmMyBmMiBmMSBmMF0KKyAgICAgICAgTV9MRFIgICAgICAgVmFsQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYjMgYjIgYjEgYjBdICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxDRDAsIFZhbENEMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0MrRCkgLSAoT2ZmK0IrRSldCisgICAgICAgIEFERCAgICAgICAgIFZhbENEMSwgVmFsQ0QxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFVYVEFCMTYgICAgIFZhbENGMSwgVmFsQzEsIFZhbEYsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjMgMCBmMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjAsIFZhbEMwLCBWYWxGICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGMyIDAgYzBdICsgWzAgMjU1IDAgMjU1XSArIFswIGYyIDAgZjBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbEVEMSwgVmFsQ0YxLCBWYWxFRDEsIExTTCAjMiAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBWYWxBLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTERSICAgICAgICAgVmFsQSwgW1ZhbEFdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYTMgYTIgYTEgYTBdCisgICAgICAgIFJTQiAgICAgICAgIFZhbEVEMCwgVmFsQ0YwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRikgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBWYWxFRDEsIFZhbEVEMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFZhbEVEMCwgVmFsRUQwLCBWYWxFRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrRStEKSAtIChPZmYrQytGKV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQTAsIHIweDAwZmYwMGZmLCBWYWxBICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQTEsIHIweDAwZmYwMGZmLCBWYWxBLCBST1IgIzggICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYwLCBWYWxBMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBhMiAwIGEwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxBRjEsIFZhbEExLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGEzIDAgYTFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMCAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCisgICAgICAgIEFERCAgICAgICAgIEFjYzEsIFZhbENEMSwgVmFsQUYxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFZhbEcsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2czIGcyIGcxIGcwXQorICAgICAgICBBREQgICAgICAgICBBY2MwLCBWYWxDRDAsIFZhbEFGMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzAgPSAxNipPZmYgKyAoQStGKSArIDIwKihDK0QpIC0gNSooQitFKSAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzEsIEFjYzEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMSAtPSAoMTYqT2ZmIC0gMTYpCisgICAgICAgIFVRU1VCMTYgICAgIEFjYzAsIEFjYzAsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRzAsIHIweDAwZmYwMGZmLCBWYWxHICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsRzEsIHIweDAwZmYwMGZmLCBWYWxHLCBST1IgIzggICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0KKyAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IwLCBWYWxHMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBnMiAwIGcwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQorICAgICAgICBVWFRBQjE2ICAgICBWYWxHQjEsIFZhbEcxLCBWYWxCLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGczIDAgZzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGIzIDAgYjFdICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIEFjYzIsIFZhbEVEMCwgVmFsR0IwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMiA9IDE2Kk9mZiArIChCK0cpICsgMjAqKEQrRSkgLSA1KihDK0YpCisgICAgICAgIEFERCAgICAgICAgIEFjYzMsIFZhbEVEMSwgVmFsR0IxICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgQWNjMywgQWNjMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIDsvLyBBY2MzIC09ICgxNipPZmYgLSAxNikKKyAgICAgICAgVVFTVUIxNiAgICAgQWNjMiwgQWNjMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBBY2MxLCAjMTMsIEFjYzEgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdHVyYXRlIHRvIDgrNSA9IDEzIGJpdHMKKyAgICAgICAgVVNBVDE2ICAgICAgQWNjMCwgIzEzLCBBY2MwCisgICAgICAgIFVTQVQxNiAgICAgIEFjYzMsICMxMywgQWNjMyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIEFjYzIsICMxMywgQWNjMgorICAgICAgICBBTkQgICAgICAgICBBY2MxLCByMHgwMGZmMDBmZiwgQWNjMSwgTFNSICM1ICAgICAgICAgOy8vIFswIGEzIDAgYTFdCisgICAgICAgIEFORCAgICAgICAgIEFjYzAsIHIweDAwZmYwMGZmLCBBY2MwLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0KKyAgICAgICAgT1JSICAgICAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYTMgYTIgYTEgYTBdCisgICAgICAgIEFORCAgICAgICAgIEFjYzMsIHIweDAwZmYwMGZmLCBBY2MzLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjMgMCBiMV0KKyAgICAgICAgQU5EICAgICAgICAgQWNjMiwgcjB4MDBmZjAwZmYsIEFjYzIsIExTUiAjNSAgICAgICAgIDsvLyBbMCBiMiAwIGIwXQorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgorICAgICAgICBPUlIgICAgICAgICBBY2MyLCBBY2MyLCBBY2MzLCBMU0wgIzggICAgICAgICAgICAgICAgOy8vIFtiMyBiMiBiMSBiMF0gICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKKyAgICAgICAgQkdUICAgICAgICAgVHdvUm93c0xvb3AKK0VuZAorICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgorCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWQxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpAQCAtMCwwICsxLDI3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUworCis7Ly8gaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmMgICAgICAgICAgICAgICAgIFJOIDAKK2lTcmNTdGVwICAgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICAgICAgIFJOIDMKK2lXaWR0aCAgICAgICAgICAgICAgIFJOIDQKK2lIZWlnaHQgICAgICAgICAgICAgIFJOIDUKK2R4ICAgICAgICAgICAgICAgICAgIFJOIDYKK2R5ICAgICAgICAgICAgICAgICAgIFJOIDcKKworCis7Ly8gbG9jYWwgdmFyaWFibGUgcmVnaXN0ZXJzCit0ZW1wICAgICAgICAgICAgICAgICBSTiAxMQorcjB4MjAgICAgICAgICAgICAgICAgUk4gMTIKK3RtcDB4MjAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICBSTiAwCitkeFBsdXNkeSAgICAgICAgICAgICBSTiAxMAorRWlnaHRNaW51c2R4ICAgICAgICAgUk4gOCAKK0VpZ2h0TWludXNkeSAgICAgICAgIFJOIDkKK2R4RWlnaHRNaW51c2R4ICAgICAgIFJOIDgKK0JBQ29lZmYgICAgICAgICAgICAgIFJOIDYKK0RDQ29lZmYgICAgICAgICAgICAgIFJOIDcKKyAgICAgICAgICAgICAgICAgICAgIAoraURzdFN0ZXB4Mk1pbnVzV2lkdGggUk4gOAoraVNyY1N0ZXB4Mk1pbnVzV2lkdGggUk4gOQoraVNyY1N0ZXAxICAgICAgICAgICAgUk4gMTAKKworcFNyYzEgICAgICAgICAgICAgICAgUk4gMQorcFNyYzIgICAgICAgICAgICAgICAgUk4gOAorcERzdDEgICAgICAgICAgICAgICAgUk4gOAorcERzdDIgICAgICAgICAgICAgICAgUk4gMTIKKyAgICAgICAgICAgICAgICAgICAgIAorcGl4MDAgICAgICAgICAgICAgICAgUk4gOAorcGl4MDEgICAgICAgICAgICAgICAgUk4gOQorcGl4MTAgICAgICAgICAgICAgICAgUk4gMTAKK3BpeDExICAgICAgICAgICAgICAgIFJOIDExCisKK091dDAxMDAgICAgICAgICAgICAgIFJOIDggIAorT3V0MTExMCAgICAgICAgICAgICAgUk4gMTAgCisKK3gwMCAgICAgICAgICAgICAgICAgIFJOIDgKK3gwMSAgICAgICAgICAgICAgICAgIFJOIDEwCit4MDIgICAgICAgICAgICAgICAgICBSTiAxMgoreDEwICAgICAgICAgICAgICAgICAgUk4gOQoreDExICAgICAgICAgICAgICAgICAgUk4gMTEKK3gxMiAgICAgICAgICAgICAgICAgIFJOIDE0Cit4MjAgICAgICAgICAgICAgICAgICBSTiAxMAoreDIxICAgICAgICAgICAgICAgICAgUk4gMTIKK3gyMiAgICAgICAgICAgICAgICAgIFJOIDE0CisgICAgICAgICAgICAgICAgICAgICAKK3gwMXgwMCAgICAgICAgICAgICAgIFJOIDggIAoreDAyeDAxICAgICAgICAgICAgICAgUk4gMTAgCit4MTF4MTAgICAgICAgICAgICAgICBSTiA5ICAKK3gxMngxMSAgICAgICAgICAgICAgIFJOIDExIAoreDIxeDIwICAgICAgICAgICAgICAgUk4gMTAgCit4MjJ4MjEgICAgICAgICAgICAgICBSTiAxMiAKKyAgICAgICAgICAgICAgICAgICAgIAorT3V0Um93MDAgICAgICAgICAgICAgUk4gMTIKK091dFJvdzAxICAgICAgICAgICAgIFJOIDE0CitPdXRSb3cxMCAgICAgICAgICAgICBSTiAxMAorT3V0Um93MTEgICAgICAgICAgICAgUk4gMTIKKyAgICAgICAgICAgICAgICAgICAgIAorT3V0Um93MDEwMCAgICAgICAgICAgUk4gMTIKK091dFJvdzExMTAgICAgICAgICAgIFJOIDEyCisgICAgICAgICAgICAgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIFdpZHRoLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICBIZWlnaHQsICAgICA0CisgICAgICAgIE1fQVJHICAgRHgsICAgICAgICAgNAorICAgICAgICBNX0FSRyAgIER5LCAgICAgICAgIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgIFdpZHRoICAKKyAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBIZWlnaHQgIAorICAgICAgICBNX0xEUiAgIGR4LCAgICAgIER4IAorICAgICAgICBNX0xEUiAgIGR5LCAgICAgIER5CisgICAgICAgIAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R4ID0gOCAtIGR4CisgICAgICAgIDsvLyBFaWdodE1pbnVzZHkgPSA4IC0gZHkKKyAgICAgICAgCisgICAgICAgIDsvLyBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHkKKyAgICAgICAgOy8vIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeQorICAgICAgICA7Ly8gRENvZWZmID0gZHggKiBkeQorICAgICAgICAKKyAgICAgICAgQUREICAgICBwU3JjMSwgcFNyYywgaVNyY1N0ZXAKKyAgICAgICAgU1VCICAgICB0ZW1wLCBpV2lkdGgsICMxCisgICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R4LCBkeCwgIzggCisgICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R5LCBkeSwgIzgKKyAgICAgICAgQ01OICAgICBkeCxkeQorICAgICAgICBBREQgICAgIGR4RWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHgsIGR4LCBMU0wgIzE2CisgICAgICAgIE9SUiAgICAgaVdpZHRoLCBpV2lkdGgsIHRlbXAsIExTTCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBQYWNrZWQgQ29lZmZzLgorICAgICAgICAKKyAgICAgICAgTVVMICAgICBCQUNvZWZmLCBkeEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R5CisgICAgICAgIE1VTCAgICAgRENDb2VmZiwgZHhFaWdodE1pbnVzZHgsIGR5ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2tpbmcgZWl0aGVyIG9mIGR4IGFuZCBkeSBiZWluZyBub24temVybworICAgICAgICAKKyAgICAgICAgQkVRICAgICBNVklzWmVybworICAgICAgICAKKzsvLyBQaXhlbCBsYXlvdXQ6Cis7Ly8KKzsvLyAgIHgwMCB4MDEgeDAyCis7Ly8gICB4MTAgeDExIHgxMgorOy8vICAgeDIwIHgyMSB4MjIKKworOy8vIElmIGZyYWN0aW9ubCBtdiBpcyBub3QgKDAsIDApCisgICAgICAgIAorT3V0ZXJMb29wTVZJc05vdFplcm8KKworSW5uZXJMb29wTVZJc05vdFplcm8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDAwLCBbcFNyYywgICMrMF0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MTAsIFtwU3JjMSwgIyswXSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgwMSwgW3BTcmMsICAjKzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICB4MTEsIFtwU3JjMSwgIysxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDAyLCBbcFNyYywgICMrMl0hICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDEyLCBbcFNyYzEsICMrMl0hICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgeDAxeDAwLCB4MDAsIHgwMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgwMngwMSwgeDAxLCB4MDIsIExTTCAjMTYgICAgICAgIAorICAgICAgICAgICAgICAgIE1PViAgICAgcjB4MjAsICAjMzIKKyAgICAgICAgICAgICAgICBPUlIgICAgIHgxMXgxMCwgeDEwLCB4MTEsIExTTCAjMTYgICAgCisgICAgICAgICAgICAgICAgT1JSICAgICB4MTJ4MTEsIHgxMSwgeDEyLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgwMXgwMCwgeDAxeDAwLCBCQUNvZWZmLCByMHgyMAorICAgICAgICAgICAgICAgIFNNTEFEICAgeDAyeDAxLCB4MDJ4MDEsIEJBQ29lZmYsIHIweDIwICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDsvLyBpV2lkdGggcGFja2VkIHdpdGggTVNCICh0b3AgMTYgYml0cykgCisgICAgICAgICAgICAgICAgOy8vIGFzIGlubmVyIGxvb3AgY291bnRlciB2YWx1ZSBpLmUgCisgICAgICAgICAgICAgICAgOy8vIChpV2lkdGggLTEpIGFuZCBMU0IgKGxvd2VyIDE2IGJpdHMpCisgICAgICAgICAgICAgICAgOy8vIGFzIG9yaWdpbmFsIHdpZHRoCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE3CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cwMCwgeDExeDEwLCBEQ0NvZWZmLCB4MDF4MDAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzAxLCB4MTJ4MTEsIERDQ29lZmYsIHgwMngwMSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFJTQiAgICAgcFNyYzIsIHBTcmMsIHBTcmMxLCBMU0wgIzEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzAwLCBPdXRSb3cwMCwgTFNSICM2CisgICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cwMSwgT3V0Um93MDEsIExTUiAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIExEUkIgICAgeDIwLFtwU3JjMiwgIy0yXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0Um93MDEwMCwgT3V0Um93MDAsIE91dFJvdzAxLCBMU0wgIzgKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dFJvdzAxMDAsIFtwRHN0XSwgIzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBMRFJCICAgIHgyMSxbcFNyYzIsICMtMV0KKyAgICAgICAgICAgICAgICBMRFJCICAgIHgyMixbcFNyYzIsICMrMF0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEc3QxLCBwRHN0LCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgeDIxeDIwLCB4MjAsIHgyMSwgTFNMICMxNgorICAgICAgICAgICAgICAgIE9SUiAgICAgeDIyeDIxLCB4MjEsIHgyMiwgTFNMICMxNiAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTU9WICAgICB0bXAweDIwLCAjMzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gUmV1c2luZyB0aGUgcGFja2VkIGRhdGEgeDExeDEwIGFuZCB4MTJ4MTEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgxMXgxMCwgIHgxMXgxMCwgIEJBQ29lZmYsIHRtcDB4MjAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIHgxMngxMSwgIHgxMngxMSwgIEJBQ29lZmYsIHRtcDB4MjAKKyAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzEwLCB4MjF4MjAsIERDQ29lZmYsIHgxMXgxMCAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MTEsIHgyMngyMSwgRENDb2VmZiwgeDEyeDExCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cxMCwgT3V0Um93MTAsIExTUiAjNgorICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MTEsIE91dFJvdzExLCBMU1IgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT1JSICAgICBPdXRSb3cxMTEwLCBPdXRSb3cxMCwgT3V0Um93MTEsIExTTCAjOAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNUUkggICAgT3V0Um93MTExMCwgW3BEc3QxLCAjLTJdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBJbm5lckxvb3BNVklzTm90WmVybworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICBBREQgICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTYKKyAgICAgICAgICAgICAgICBSU0IgICAgIGlEc3RTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlEc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgICAgICAgICBTVUIgICAgIGlTcmNTdGVwMSwgcFNyYzEsIHBTcmMKKyAgICAgICAgICAgICAgICBTVUIgICAgIHRlbXAsIGlXaWR0aCwgIzEKKyAgICAgICAgICAgICAgICBSU0IgICAgIGlTcmNTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlTcmNTdGVwMSwgTFNMICMxCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCBpRHN0U3RlcHgyTWludXNXaWR0aAorICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMxLCBpU3JjU3RlcHgyTWludXNXaWR0aAorICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2CisgICAgICAgICAgICAgICAgQkdUICAgICBPdXRlckxvb3BNVklzTm90WmVybworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKworOy8vIElmIGZyYWN0aW9ubCBtdiBpcyAoMCwgMCkKKworTVZJc1plcm8KKyAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorT3V0ZXJMb29wTVZJc1plcm8KKworSW5uZXJMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTERSQiAgICBwaXgwMCwgW3BTcmNdLCAgIysxCisgICAgICAgICAgICAgICAgTERSQiAgICBwaXgwMSwgW3BTcmNdLCAgIysxCisgICAgICAgICAgICAgICAgTERSQiAgICBwaXgxMCwgW3BTcmMxXSwgIysxCisgICAgICAgICAgICAgICAgTERSQiAgICBwaXgxMSwgW3BTcmMxXSwgIysxCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0MiwgIHBEc3QsIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzE8PDE3ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9SUiAgICAgT3V0MDEwMCwgcGl4MDAsIHBpeDAxLCBMU0wgIzggCisgICAgICAgICAgICAgICAgT1JSICAgICBPdXQxMTEwLCBwaXgxMCwgcGl4MTEsIExTTCAjOAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNUUkggICAgT3V0MDEwMCwgW3BEc3RdLCAgIzIKKyAgICAgICAgICAgICAgICBTVFJIICAgIE91dDExMTAsIFtwRHN0Ml0sICMyCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBJbm5lckxvb3BNVklzWmVybworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICBBREQgICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTYKKyAgICAgICAgICAgICAgICBSU0IgICAgIGlEc3RTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlEc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgICAgICAgICBTVUIgICAgIGlTcmNTdGVwMSwgcFNyYzEsIHBTcmMKKyAgICAgICAgICAgICAgICBTVUIgICAgIHRlbXAsIGlXaWR0aCwgIzEKKyAgICAgICAgICAgICAgICBSU0IgICAgIGlTcmNTdGVweDJNaW51c1dpZHRoLCBpV2lkdGgsIGlTcmNTdGVwMSwgTFNMICMxCisgICAgICAgICAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCBpRHN0U3RlcHgyTWludXNXaWR0aAorICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYzEsIHBTcmMxLCBpU3JjU3RlcHgyTWludXNXaWR0aAorICAgICAgICAgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgKKyAgICAgICAgICAgICAgICBPUlIgICAgIGlXaWR0aCwgaVdpZHRoLCB0ZW1wLCBMU0wgIzE2CisgICAgICAgICAgICAgICAgQkdUICAgICBPdXRlckxvb3BNVklzWmVybworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VORAorCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgICAgRU5ECisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjJmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsNzQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKKzsvLyAKKzsvLyAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKKyAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisgICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNworICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5CisgICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAorICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKKyAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCisgICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMworICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCisgICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQorICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKKyAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCisgICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgorICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKKyAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCisgICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQorICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKKyAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVORAorICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxZDE4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKQEAgLTAsMCArMSw0MDcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworOy8vIAorOy8vIAorCisgICAgICAgIAorOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTIAorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwRHN0ICAgICAgICAgICAgICAgIFJOICAwCitwU3JjICAgICAgICAgICAgICAgIFJOICAxCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAoraW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCitpbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KK2luMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQoraW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCitpbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQoraW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KK2luMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCisKKzsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCit0clJvdzAwICAgICAgICAgICAgIFJOICAyCit0clJvdzEwICAgICAgICAgICAgIFJOICAxMAordHJSb3cwMiAgICAgICAgICAgICBSTiAgMwordHJSb3cxMiAgICAgICAgICAgICBSTiAgNQordHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKK3RyUm93MzAgICAgICAgICAgICAgUk4gIDEyCit0clJvdzMyICAgICAgICAgICAgIFJOICAxNAordHJSb3cyMiAgICAgICAgICAgICBSTiAgNworCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworZTAgICAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK2UxICAgICAgICAgICAgICAgICAgUk4gIDYKK2UyICAgICAgICAgICAgICAgICAgUk4gIDgKK2UzICAgICAgICAgICAgICAgICAgUk4gIDkKK2NvbnN0WmVybyAgICAgICAgICAgUk4gIDEKKworOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKK3Jvd09wMDAgICAgICAgICAgICAgUk4gIDIKK3Jvd09wMTAgICAgICAgICAgICAgUk4gIDEwCityb3dPcDIwICAgICAgICAgICAgIFJOICAxMQorcm93T3AzMCAgICAgICAgICAgICBSTiAgMTIKK3Jvd09wMDIgICAgICAgICAgICAgUk4gIDMKK3Jvd09wMTIgICAgICAgICAgICAgUk4gIDUKK3Jvd09wMjIgICAgICAgICAgICAgUk4gIDcKK3Jvd09wMzIgICAgICAgICAgICAgUk4gIDE0CisKKzsvLyBUcmFuc3Bvc2UgZm9yIGNvbHVsbW4gb3BlcmF0aW9ucwordHJDb2wwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK3RyQ29sMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCit0ckNvbDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAordHJDb2wxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK3RyQ29sMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCit0ckNvbDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAordHJDb2wzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzIgICAgICAgICAgICAgUk4gIDkgIAorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworZzAgICAgICAgICAgICAgICAgICBSTiAgMTAKK2cxICAgICAgICAgICAgICAgICAgUk4gIDExCitnMiAgICAgICAgICAgICAgICAgIFJOICAxMgorZzMgICAgICAgICAgICAgICAgICBSTiAgMTQgICAKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitjb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK2NvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitjb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitjb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCisKKwordGVtcDEgICAgICAgICAgICAgICBSTiAgMTAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCitjb25zdDEgICAgICAgICAgICAgIFJOICAxMSAgICAgIAorY29uc3QyICAgICAgICAgICAgICBSTiAgMTIKK21hc2sgICAgICAgICAgICAgICAgUk4gIDE0CisKKzsvLyBPdXRwdXQgcGl4ZWxzCitvdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK291dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitvdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK291dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitvdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCisgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LHIxMQorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIAorICAgICAgICBMRE1JQSAgIHBTcmMse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICBjb25zdFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKKyAgICAgICAgO0xEUiAgICAgICBjb25zdFplcm8sPTB4MDAwMDAwMDAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKKyAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAorICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAorICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKKyAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKKyAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKKyAgICAgICAgOy8vCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIExMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgZDAgZDEgLSAtCisgICAgICAgIDsvLyAgIGQ0IGQ1IC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MTAsaW4xMCxpbjAwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdICAgIAorICAgICAgICBQS0hCVCAgIHRyUm93MDAsaW4wMCxpbjEwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzEgMF0gPSBbZjQ6ZjBdICAKKyAgICAgICAgCisgICAgICAgIDsvLyBITCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICBkOCAgZDkgIC0gLQorICAgICAgICA7Ly8gICBkMTIgZDEzICAtIC0KKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFBLSFRCICAgdHJSb3czMCxpbjEyLGluMDIsQVNSICMxNiAgICAgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQorICAgICAgICAgUEtIQlQgICB0clJvdzIwLGluMDIsaW4xMixMU0wgIzE2ICAgICAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAyLGluMjAsaW4zMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFszIDJdID0gW2YxMjpmOF0gIAorICAgICAgICBQS0hUQiAgIHRyUm93MTIsaW4zMCxpbjIwLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCisgICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJSb3czMixpbjMyLGluMjIsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQorICAgICAgICBQS0hCVCAgIHRyUm93MjIsaW4yMixpbjMyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KKyAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zKHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgZTAsIHRyUm93MDAsdHJSb3cyMCAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgU1NVQjE2ICAgIGUxLCB0clJvdzAwLHRyUm93MjAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgIAorICAgICAgICBTSEFERDE2ICAgZTIsIHRyUm93MTAsY29uc3RaZXJvICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgU0hBREQxNiAgIGUzLCB0clJvdzMwLGNvbnN0WmVybyAgICAgICAgICAgICAgICAgOy8vICBhdm9pZCBwaXBlbGluZSBzdGFsbHMgZm9yIGUyIGFuZCBlMworICAgICAgICBTU1VCMTYgICAgZTIsIGUyLCB0clJvdzMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzICAKKyAgICAgICAgU0FERDE2ICAgIGUzLCBlMywgdHJSb3cxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAgCisgICAgICAgIFNBREQxNiAgICByb3dPcDAwLCBlMCwgZTMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzICAKKyAgICAgICAgU0FERDE2ICAgIHJvd09wMTAsIGUxLCBlMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIgIAorICAgICAgICBTU1VCMTYgICAgcm93T3AyMCwgZTEsIGUyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMiAgCisgICAgICAgIFNTVUIxNiAgICByb3dPcDMwLCBlMCwgZTMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgZTAsIHRyUm93MDIsdHJSb3cyMgorICAgICAgICBTU1VCMTYgICAgZTEsIHRyUm93MDIsdHJSb3cyMgorICAgICAgICBTSEFERDE2ICAgZTIsIHRyUm93MTIsY29uc3RaZXJvICAgICAgICAgICAgICAgICA7Ly8oZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBTSEFERDE2ICAgZTMsIHRyUm93MzIsY29uc3RaZXJvCisgICAgICAgIFNTVUIxNiAgICBlMiwgZTIsIHRyUm93MzIKKyAgICAgICAgU0FERDE2ICAgIGUzLCBlMywgdHJSb3cxMgorICAgICAgICBTQUREMTYgICAgcm93T3AwMiwgZTAsIGUzCisgICAgICAgIFNBREQxNiAgICByb3dPcDEyLCBlMSwgZTIKKyAgICAgICAgU1NVQjE2ICAgIHJvd09wMjIsIGUxLCBlMgorICAgICAgICBTU1VCMTYgICAgcm93T3AzMiwgZTAsIGUzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCisgICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQorICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucworICAgICAgICAKKyAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgZzAsIHRyQ29sMDAsdHJDb2wyMAorICAgICAgICBTU1VCMTYgICAgZzEsIHRyQ29sMDAsdHJDb2wyMAorICAgICAgICBTSEFERDE2ICAgZzIsIHRyQ29sMTAsY29uc3RaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFNIQUREMTYgICBnMywgdHJDb2wzMCxjb25zdFplcm8KKyAgICAgICAgU1NVQjE2ICAgIGcyLCBnMiwgdHJDb2wzMAorICAgICAgICBTQUREMTYgICAgZzMsIGczLCB0ckNvbDEwCisgICAgICAgIFNBREQxNiAgICBjb2xPcDAwLCBnMCwgZzMKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTAsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AyMCwgZzEsIGcyCisgICAgICAgIFNTVUIxNiAgICBjb2xPcDMwLCBnMCwgZzMKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucworICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgZzAsIHRyQ29sMDIsdHJDb2wyMgorICAgICAgICBTU1VCMTYgICAgZzEsIHRyQ29sMDIsdHJDb2wyMgorICAgICAgICBTSEFERDE2ICAgZzIsIHRyQ29sMTIsY29uc3RaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFNIQUREMTYgICBnMywgdHJDb2wzMixjb25zdFplcm8KKyAgICAgICAgU1NVQjE2ICAgIGcyLCBnMiwgdHJDb2wzMgorICAgICAgICBTQUREMTYgICAgZzMsIGczLCB0ckNvbDEyCisgICAgICAgIFNBREQxNiAgICBjb2xPcDAyLCBnMCwgZzMKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTIsIGcxLCBnMgorICAgICAgICBTU1VCMTYgICAgY29sT3AyMiwgZzEsIGcyCisgICAgICAgIFNTVUIxNiAgICBjb2xPcDMyLCBnMCwgZzMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgOy8vIGNvbnN0MTogU2VydmVzIGR1YWwgcHVycG9zZSAKKyAgICAgICAgOy8vICgxKSBBZGQgIzMyIHRvIGJvdGggdGhlIGxvd2VyIGFuZCBoaWdoZXIgMTZiaXRzIG9mIHRoZSBTSU1EIHJlc3VsdCAKKyAgICAgICAgOy8vICgyKSBDb252ZXJ0IHRoZSBsb3dlciAxNiBiaXQgdmFsdWUgdG8gYW4gdW5zaWduZWQgbnVtYmVyIChBZGQgMzI3NjgpCisgICAgICAgIAorICAgICAgICBMRFIgICAgIGNvbnN0MSwgPTB4MDAyMDgwMjAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgIG1hc2ssID0weGZmZmYwM2ZmICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byBtYXNrIHRoZSBkb3duIHNoaWZ0ZWQgNiBiaXRzICAKKyAgICAgICAgCisgICAgICAgIDsvLyBjb25zdDIoIzUxMik6IHVzZWQgdG8gY29udmVydCB0aGUgbG93ZXIgMTZiaXQgbnVtYmVyIGJhY2sgdG8gc2lnbmVkIHZhbHVlIAorICAgICAgCisgICAgICAgIE1PViAgICAgY29uc3QyLCMweDIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb25zdDIgPSAyXjkKKyAgICAgICAgCisgICAgICAgIDsvLyBGaXJzdCBSb3cgCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgY29sT3AwMCwgY29sT3AwMCwgY29uc3QxCisgICAgICAgIFNBREQxNiAgICBjb2xPcDAyLCBjb2xPcDAyLCBjb25zdDEKKyAgICAgICAgQU5EICAgICBjb2xPcDAwLCBtYXNrLCBjb2xPcDAwLCBBU1IgIzYKKyAgICAgICAgQU5EICAgICBjb2xPcDAyLCBtYXNrLCBjb2xPcDAyLCBBU1IgIzYKKyAgICAgICAgU1NVQjE2ICBvdXQwMCxjb2xPcDAwLGNvbnN0MgorICAgICAgICBTU1VCMTYgIG91dDAyLGNvbE9wMDIsY29uc3QyICAgIAorICAgICAgICAKKworICAgICAgICA7Ly8gU2Vjb25kIFJvdworICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMTAsIGNvbE9wMTAsIGNvbnN0MQorICAgICAgICBTQUREMTYgICAgY29sT3AxMiwgY29sT3AxMiwgY29uc3QxCisgICAgICAgIEFORCAgICAgY29sT3AxMCwgbWFzaywgY29sT3AxMCwgQVNSICM2CisgICAgICAgIEFORCAgICAgY29sT3AxMiwgbWFzaywgY29sT3AxMiwgQVNSICM2CisgICAgICAgIFNTVUIxNiAgb3V0MTAsY29sT3AxMCxjb25zdDIKKyAgICAgICAgU1NVQjE2ICBvdXQxMixjb2xPcDEyLGNvbnN0MiAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVGhpcmQgUm93CisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgY29sT3AyMCwgY29sT3AyMCwgY29uc3QxCisgICAgICAgIFNBREQxNiAgICBjb2xPcDIyLCBjb2xPcDIyLCBjb25zdDEKKyAgICAgICAgQU5EICAgICBjb2xPcDIwLCBtYXNrLCBjb2xPcDIwLCBBU1IgIzYKKyAgICAgICAgQU5EICAgICBjb2xPcDIyLCBtYXNrLCBjb2xPcDIyLCBBU1IgIzYKKyAgICAgICAgU1NVQjE2ICBvdXQyMCxjb2xPcDIwLGNvbnN0MgorICAgICAgICBTU1VCMTYgIG91dDIyLGNvbE9wMjIsY29uc3QyCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZvdXJ0aCBSb3cgICAKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICBjb2xPcDMwLCBjb2xPcDMwLCBjb25zdDEKKyAgICAgICAgU0FERDE2ICAgIGNvbE9wMzIsIGNvbE9wMzIsIGNvbnN0MQorICAgICAgICBBTkQgICAgIGNvbE9wMzAsIG1hc2ssIGNvbE9wMzAsIEFTUiAjNgorICAgICAgICBBTkQgICAgIGNvbE9wMzIsIG1hc2ssIGNvbE9wMzIsIEFTUiAjNgorICAgICAgICBTU1VCMTYgIG91dDMwLGNvbE9wMzAsY29uc3QyCisgICAgICAgIFNTVUIxNiAgb3V0MzIsY29sT3AzMixjb25zdDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcERzdCx7b3V0MDAsb3V0MDIsb3V0MTAsb3V0MTIsb3V0MjAsb3V0MjIsb3V0MzAsb3V0MzJ9CisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKK0VuZCAgICAgICAgICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAKKyAgICAKKyAgICAKKworCisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE2ZDljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwpAQCAtMCwwICsxLDkyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKK3BEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcworRmxhZyAgICAgICAgICAgIFJOIDMgICAgCitWYWx1ZSAgICAgICAgICAgUk4gNCAgICAKK1ZhbHVlMiAgICAgICAgICBSTiA1ICAgIAorc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCitjc3RPZmZzZXQgICAgICAgUk4gNyAgICAKKworICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNworICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKyAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKKyAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAorICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCisgICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKKyAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAorICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCisgICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAordW5wYWNrTG9vcAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKKyAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOworICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgorICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjM4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBsdW1hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sKKyAqKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgaW1hZ2Ugd2lkdGgKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCBob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IHZhbHVlcyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMgb3IgcEJTIGlzIE5VTEwuCisgKiAgICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCisuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKKwljb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWYyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgcmFzdGVyIHNjYW4gb3JkZXIsIG5hbWVseSBwb3NpdGlvbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbQorICoJCQkJCQkJCWJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqCQkJCQkJCQlwb2ludGVkIHRvIGJ5ICpwcEJpdFN0cmVhbQorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cworICoJCQkJCQkJCWluIHRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKKyApCisKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCAxNywgNCk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliYjRjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCisgKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCisgKiBvZiBwb3NpdGlvbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jaworICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCisgKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAorICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKKyAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKQoreworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcxNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpAQCAtMCwwICsxLDQ4MCBAQAorOy8vCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCisgICAgICAgIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCisgICAgICAgIAorICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTLCBBUk0xMTM2SlNfVQorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTIAorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwU3JjRHN0ICAgICAgIFJOICAwCitRUCAgICAgICAgICAgIFJOICAxCisKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwUVBkaXYgICAgICAgICAgUk4gIDQKK3BRUG1vZCAgICAgICAgICBSTiAgNQorcFZSb3cgICAgICAgICAgIFJOICAyCitRUG1vZCAgICAgICAgICAgUk4gIDYKK3NoaWZ0ICAgICAgICAgICBSTiAgMworcm93THVtYTAxICAgICAgIFJOICAxCityb3dMdW1hMjMgICAgICAgUk4gIDQKKworU3JjRHN0MDAgICAgICAgIFJOICA1CitTcmNEc3QwMiAgICAgICAgUk4gIDYKK1NyY0RzdDEwICAgICAgICBSTiAgNworU3JjRHN0MTIgICAgICAgIFJOICA4CitTcmNEc3QyMCAgICAgICAgUk4gIDkKK1NyY0RzdDIyICAgICAgICBSTiAgMTAKK1NyY0RzdDMwICAgICAgICBSTiAgMTEKK1NyY0RzdDMyICAgICAgICBSTiAgMTIKKwordGVtcDEgICAgICAgICAgIFJOICAyCit0ZW1wMiAgICAgICAgICAgUk4gIDMKK3RlbXAzICAgICAgICAgICBSTiAgMTQKKyAgICAKKyAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQscjExCisgICAgICAgICAKKyAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCisgICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKyAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgorICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFJIICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzAwfDBhXQorICAgICAgICBMRFJIICAgIHRlbXAzLFtwVlJvdywjMl0gICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDMgICAgID0gWzAwfDBiXSAgIAorICAgICAgICBMRFJIICAgIHJvd0x1bWEyMyxbcFZSb3csIzRdICAgICAgICAgICAgICAgICA7Ly8gcm93THVtYTIzID0gWzAwfDBjXSAKKyAgICAgICAgT1JSICAgICByb3dMdW1hMDEscm93THVtYTAxLHRlbXAzLExTTCAjMTYgICAgOy8vIHJvd0x1bWEwMSA9IFswYnwwYV0gICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCisgICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKKyAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0CisgICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5CisgICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQorICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKKyAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgorICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKKyAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKKyAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKKyAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbworICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAzICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDQgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAgCisgICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2CisgICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKKyAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlNfVQorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwU3JjRHN0ICAgICAgIFJOICAwCitRUCAgICAgICAgICAgIFJOICAxCisKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwUVBkaXYgICAgICAgICAgUk4gIDQKK3BRUG1vZCAgICAgICAgICBSTiAgNQorcFZSb3cgICAgICAgICAgIFJOICAyCitRUG1vZCAgICAgICAgICAgUk4gIDYKK3NoaWZ0ICAgICAgICAgICBSTiAgMworcm93THVtYTAxICAgICAgIFJOICAxCityb3dMdW1hMjMgICAgICAgUk4gIDQKKworU3JjRHN0MDAgICAgICAgIFJOICA1CitTcmNEc3QwMiAgICAgICAgUk4gIDYKK1NyY0RzdDEwICAgICAgICBSTiAgNworU3JjRHN0MTIgICAgICAgIFJOICA4CitTcmNEc3QyMCAgICAgICAgUk4gIDkKK1NyY0RzdDIyICAgICAgICBSTiAgMTAKK1NyY0RzdDMwICAgICAgICBSTiAgMTEKK1NyY0RzdDMyICAgICAgICBSTiAgMTIKKwordGVtcDEgICAgICAgICAgIFJOICAyCit0ZW1wMiAgICAgICAgICAgUk4gIDMKK3RlbXAzICAgICAgICAgICBSTiAgMTQKKyAgICAKKyAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQscjExCisgICAgICAgICAKKyAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCisgICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICAKKyAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgorICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgcm93THVtYTAxLFtwVlJvdyxRUG1vZF0hICAgICAgICAgICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdCisgICAgICAgIExEUiAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswZHwwY10gICAgCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSAxNiAnc3JjJyB2YWx1ZXMKKyAgICAgICAgTERNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAnU2hpZnQnIHJhbmdlcyBiZXR3ZWVuIFswLDhdIAorICAgICAgICA7Ly8gU28gd2UgY2FuIHNoaWZ0IHRoZSBwYWNrZWQgcm93THVtYSB2YWx1ZXMgWzBifDBhXSB3aXRoIGEgc2luZ2xlIExTTCBvcGVyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgTFNMICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsc2hpZnQKKyAgICAgICAgTFNMICAgIHJvd0x1bWEyMyxyb3dMdW1hMjMsc2hpZnQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhlIGlkZWEgaXMgdG8gdW5yb2xsIHRoZSBMb29wIGNvbXBsZXRlbHkKKyAgICAgICAgOy8vIEFsbCB0aGUgMTYgc3JjIHZhbHVlcyBhcmUgbG9hZGVkIGF0IG9uY2UgaW50byA4IHJlZ2lzdGVycyA6IFNyY0RzdDx5Pjx4PiAoYWJvdmUpCisgICAgICAgIDsvLyAwPD0gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV0gPD0yIGZvciBhbnkgJ2k8MTYnIAorICAgICAgICA7Ly8gU28gdGhlIG9ubHkgdmFsdWVzIG9mIHBWUm93W2ldIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYXJlIGZvciBpPTAsMSwyCisgICAgICAgIDsvLyBUaGVzZSAzIHZhbHVlcyBhcmUgbG9hZGVkIGludG8gcm93THVtYTAxIGFuZCByb3dMdW1hMjMgKGFib3ZlKQorICAgICAgICA7Ly8gV2UgZmlyc3QgY2FsY3VsYXRlIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQgd2hpY2ggZml0cyBpbnRvIDE2IGJpdHMgKGFib3ZlKQorICAgICAgICA7Ly8gVGhlbiB0aGUgcHJvZHVjdCBwU3JjRHN0W2ldICogKHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSA8PCBTaGlmdCkgaXMgY2FsY3VsYXRlZAorICAgICAgICA7Ly8gSGVyZSB3ZSBpbnRlcmxlYXZlIHRoZSBQS0hCVCBvcGVyYXRpb25zIGZvciB2YXJpb3VzIHJvd3MgIHRvIGF2b2lkZSBwaXBlbGluZSBzdGFsbHMKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gV2UgdGhlbiBwYWNrIHRoZSB0d28gMTYgYml0IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpbnRvIGEgd29yZCBhbmQgc3RvcmUgYXQgb25lIGdvCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAxCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QwMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzFdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDAsU3JjRHN0MDAscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MDIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFszXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAyLFNyY0RzdDAyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMl0gKiAocFZSb3dbMF08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QwMCxTcmNEc3QwMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBmaXJzdCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMgorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDEwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDEwLFNyY0RzdDEwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNF0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QwMixTcmNEc3QwMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICBTTVVMVFQgIHRlbXAyLFNyY0RzdDEyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbN10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDEyLFNyY0RzdDEyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNl0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMCxTcmNEc3QxMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDMgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDIwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOV0gKiAocFZSb3dbMl08PFNoaWZ0KSAgICAgICAgIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIwLFNyY0RzdDIwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTIsU3JjRHN0MTIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDIyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTFdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjIsU3JjRHN0MjIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMF0gKiAocFZSb3dbMF08PFNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjAsU3JjRHN0MjAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgNCAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QzMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEzXSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MzAsU3JjRHN0MzAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMl0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgU01VTFRUICB0ZW1wMyxTcmNEc3QzMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MzIsU3JjRHN0MzIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNF0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIyLFNyY0RzdDIyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIHJlbWFpbmluZyBwcm9kdWN0IHZhbHVlcworICAgICAgICBQS0hCVCAgIFNyY0RzdDMwLFNyY0RzdDMwLHRlbXAxLExTTCAjMTYKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMixTcmNEc3QzMix0ZW1wMyxMU0wgIzE2CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlNfVSAgICAgICAgCisKKworCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUworICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICBSTiAgMAorcFByZWQgICAgICAgUk4gIDEKK3BEQyAgICAgICAgIFJOICAyCitwRHN0ICAgICAgICBSTiAgMworICAgCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRGVsdGEgICAgICBSTiAgNAorcERlbHRhVG1wICAgUk4gIDYKK0FDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjaworcFByZWRUZW1wICAgUk4gIDcKK3BEQ1RlbXAgICAgIFJOICA4CitwRHN0VGVtcCAgICBSTiAgOQorcERlbHRhQXJnMSAgUk4gIDEKK3BEZWx0YUFyZzAgIFJOICAwCitRUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK0RDdmFsICAgICAgIFJOICAxMCAgCitEQ3ZhbENvcHkgICBSTiAgMTEKK3ByZWRzdGVwICAgIFJOICAxCitkc3RTdGVwICAgICBSTiAgMTAKK3ljb3VudGVyICAgIFJOICAwCitQcmVkVmFsMSAgICBSTiAgMworUHJlZFZhbDIgICAgUk4gIDUKK0RlbHRhVmFsMSAgIFJOICAyCitEZWx0YVZhbDIgICBSTiAgMTEKK1ByZWRWYWwgICAgIFJOICA4Cit0bXBEZWx0YVZhbCBSTiAgNgorc3VtMSAgICAgICAgUk4gIDEyCitzdW0yICAgICAgICBSTiAgMTQKKyAgICAKKyAgICAKKyAgICAgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgTV9BTExPQzggcEJ1ZmZlciwgMzIKKyAgICAgICAgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQscjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHByZWRTdGVwT25TdGFjaywgNAorICAgICAgICBNX0FSRyAgIGRzdFN0ZXBPblN0YWNrLDQKKyAgICAgICAgTV9BUkcgICBRUE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBBQ09uU3RhY2ssNAorICAKKyAgICAgICAgCisgICAgICAgIE1fQURSICAgcERlbHRhLHBCdWZmZXIgCisgICAgICAgIE1fTERSICAgQUMsQUNPblN0YWNrIAorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgcjEscjIscjMgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgICAgCisgICAgICAgIE1PViAgICAgcFByZWRUZW1wLHBQcmVkCisgICAgICAgIE1PViAgICAgcERDVGVtcCxwREMKKyAgICAgICAgTU9WICAgICBwRHN0VGVtcCxwRHN0CisgICAgICAgIAorICAgICAgICBDTVAgICAgIEFDLCMwCisgICAgICAgIEJFUSAgICAgRENjYXNlCisgICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgRGVxdWFudEx1bWFBQzR4NAorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgRGVxdWFudEx1bWFBQzR4NAorCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBwRENUZW1wLCMwCisgICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCisgICAgICAgIE1PViAgICAgcERlbHRhQXJnMCxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIwIGZvciBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIFNUUkhORSAgREN2YWwsW3BEZWx0YV0KKyAgICAgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBCICAgICAgIE91dERDY2FzZSAKKyAgICAgICAgCisKK0RDY2FzZQorICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKKyAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCisgICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKKyAgICAgICAgUEtIQlQgICBEQ3ZhbCxEQ3ZhbCxEQ3ZhbCxMU0wgIzE2ICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0aW5nIHRoZSBMb3dlciBoYWxmd29yZAorICAgICAgICBNT1YgICAgIERDdmFsQ29weSwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTmVlZGVkIGZvciBTVFJECisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMwXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjOF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzRdICA9IHBEZWx0YVs1XSAgPSBwRGVsdGFbNl0gID0gcERlbHRhWzddID0gREN2YWwKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzE2XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs4XSAgPSBwRGVsdGFbOV0gID0gcERlbHRhWzEwXSA9IHBEZWx0YVsxMV0gPSBEQ3ZhbAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMjRdICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCitPdXREQ2Nhc2UgICAgICAKKyAgICAgICAgTV9MRFIgICBwcmVkc3RlcCxwcmVkU3RlcE9uU3RhY2sKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLGRzdFN0ZXBPblN0YWNrCisgICAgICAgIAorICAgICAgICBMRE1JQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgICAgOy8vIFByZSBsb2FkCisgICAgICAgIE1PViAgICAgeWNvdW50ZXIsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ291bnRlciBmb3IgdGhlIFByZWRQbHVzRGVsdGFMb29wCisgICAgICAgIExEUiAgICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKworUHJlZFBsdXNEZWx0YUxvb3AKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIFNVQlMgICAgeWNvdW50ZXIseWNvdW50ZXIsIzEKKyAgICAgICAgQUREICAgICBwUHJlZFRlbXAscFByZWRUZW1wLHByZWRzdGVwICAgICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcFByZWQgcHRyCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIERlbHRhVmFsMSx0bXBEZWx0YVZhbCxEZWx0YVZhbDIsTFNMICMxNiAgICAgOy8vIERlbHRhdmFsMSA9IFtDIEFdICAgCisgICAgICAgIFBLSFRCICAgRGVsdGFWYWwyLERlbHRhVmFsMix0bXBEZWx0YVZhbCxBU1IgIzE2ICAgICA7Ly8gRGVsdGFWYWwyID0gW0QgQl0KKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgUHJlZFZhbDEsUHJlZFZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDEgPSBbMGMwYV0KKyAgICAgICAgVVhUQjE2ICBQcmVkVmFsMixQcmVkVmFsLFJPUiAjOCAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmVkVmFsMiA9IFswZDBiXQorICAgICAgICAKKyAgICAgICAgTERSR1QgICBQcmVkVmFsLFtwUHJlZFRlbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAorICAgICAgICAKKyAgICAgICAgUUFERDE2ICBzdW0yLERlbHRhVmFsMixQcmVkVmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBBZGQgYW5kIHNhdHVyYXRlIHRvIDE2IGJpdHMKKyAgICAgICAgUUFERDE2ICBzdW0xLERlbHRhVmFsMSxQcmVkVmFsMQorICAgICAgICAKKyAgICAgICAgVVNBVDE2ICBzdW0yLCM4LHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhcm1DbGlwKDAsMjU1LHN1bTIpCisgICAgICAgIFVTQVQxNiAgc3VtMSwjOCxzdW0xCisgICAgICAgIAorICAgICAgICBMRE1HVElBICAgcERlbHRhISx7dG1wRGVsdGFWYWwsRGVsdGFWYWwyfSAgICAgICAgICAgOy8vIFByZSBsb2FkCisgICAgICAgICAgCisgICAgICAgIE9SUiAgICAgc3VtMSxzdW0xLHN1bTIsTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IFtkY2JhXQorICAgICAgICBTVFIgICAgIHN1bTEsW3BEc3RUZW1wXQorICAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VGVtcCxwRHN0VGVtcCxkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBwdHIKKyAgICAgICAgQkdUICAgICBQcmVkUGx1c0RlbHRhTG9vcCAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAKKyAgICAKKyAgICAKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTYwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMzM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitMT09QX0NPVU5UICBFUVUgMHg1MDAwMDAwMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhQXJnICAgUk4gMgorcEJldGFBcmcgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA2CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAxMAorCithbHBoYSAgICAgICBSTiA2CithbHBoYTAgICAgICBSTiA2CithbHBoYTEgICAgICBSTiA4CisKK2JldGEgICAgICAgIFJOIDcKK2JldGEwICAgICAgIFJOIDcKK2JldGExICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgICAgICBSTiAzICAKK3BfMSAgICAgICAgIFJOIDUgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKKworOy8vIEZpbHRlcmluZworCitkcDBxMCAgICAgICBSTiAxMgorZHAxcDAgICAgICAgUk4gMTIKK2RxMXEwICAgICAgIFJOIDEyCisKK2FwMHEwICAgICAgIFJOIDQgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCitwUTAgICAgICAgICBSTiAwCitTdGVwICAgICAgICBSTiAxCisgICAgICAgICAgICAKKzsvLyBPdXRwdXQKKyAgICAgICAgICAgIAorUF8wICAgICAgICAgUk4gNgorUV8wICAgICAgICAgUk4gNyAKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKwordEMgICAgICAgICAgUk4gMTIKK3RDMCAgICAgICAgIFJOIDUKK3RDMSAgICAgICAgIFJOIDEyCitwb3MgICAgICAgICBSTiA1CituZWcgICAgICAgICBSTiA5CisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAorCithICAgICAgICAgICBSTiAxMAordDEgICAgICAgICAgUk4gMTAKK3QyICAgICAgICAgIFJOIDEyCit0MyAgICAgICAgICBSTiAxNAordDQgICAgICAgICAgUk4gNgordDUgICAgICAgICAgUk4gNQorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisgICAgICAgIAorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCisgICAgICAgIExEUiAgICAgYSw9TUFTS18xCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KKworICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKKworICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKK0xvb3BZCitMb29wWAorOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjMgorICAgICAgICAKKyAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICBwXzEsIFtwUTBdLHNyY2RzdFN0ZXAKKworICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzEsIFtwUTBdCisgICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIAorICAgICAgICA7Ly8gcF8wID0gW3IzcDAgcjJwMCByMXAwIHIwcDBdCisgICAgICAgIDsvLyBwXzEgPSBbcjNwMSByMnAxIHIxcDEgcjBwMV0KKyAgICAgICAgOy8vIHFfMCA9IFtyM3EwIHIycTAgcjFxMCByMHEwXQorICAgICAgICA7Ly8gcV8xID0gW3IzcTEgcjJxMSByMXExIHIwcTFdCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAorCisgICAgICAgIE1PViAgICAgZmlsdCwgbTAxCisgICAgICAgIFRTVCAgICAgYlMsICMweGZmMDAKKyAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2CisgICAgICAgIFRTVCAgICAgYlMsICMweGZmCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgorICAgICAgICBUU1QgICAgIGJTLCAjNAorCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgTVZOICAgICB0MiwgcF8xCisgICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKKyAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3CisKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzIKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEwYiAKKyAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKKyAgICAgICAgTVZOICAgICB0MywgcV8xCisgICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKKyAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEIgICAgICAgU3RvcmVSZXN1bHRBbmRFeGl0CisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyRmlsdDAKK05vRmlsdGVyQlMwCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKworICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWQorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorICAgICAgICAKK2JTTFQ0ICAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICAKKyAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93CisgICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAorICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNworICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNworCisgICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKKworICAgICAgICBVU1VCOCAgIHQxLCBwXzEsIHBfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgdEMwLCBbcFRocmVzaG9sZHNdLCMxCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwjMQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKKyAgICAgICAgT1JSICAgICB0QywgdEMwLCB0QzEsIExTTCAjMTYKKyAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKKyAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKKyAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAorCisgICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAorCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKKyAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKKyAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QworICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcworICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCisgICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCisgICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcworICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCisgICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZworICAgICAgICAKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisKKyAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKKyAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAorICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCisgICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAorICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKKyAgICAKK1N0b3JlUmVzdWx0QW5kRXhpdAorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorCisgICAgICAgIE1fU1RSICAgUF8wLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBTVFIgICAgIFFfMCwgW3BRMF0sICM0CisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisKK0V4aXRMb29wWQorICAgICAgICBBREQgICAgIHBCUywgcEJTLCAjNAorICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRiAgICAgICAgCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzgzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNDM3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLXzIgICAgICBFUVUgMHgwMDAwZmYwMAorTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNgorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMgorYlNUZW1wICAgICAgUk4gMTAKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCisKKzsvLyBVbnBhY2tpbmcKK21hc2sgICAgICAgIFJOIDExIAorCityb3cwICAgICAgICBSTiAyCityb3cxICAgICAgICBSTiA0Cityb3cyICAgICAgICBSTiA1Cityb3czICAgICAgICBSTiAzCisKK3JvdzQgICAgICAgIFJOIDgKK3JvdzUgICAgICAgIFJOIDkKK3JvdzYgICAgICAgIFJOIDEwCityb3c3ICAgICAgICBSTiAxMgorCit0dW5wazAgICAgICBSTiAyCit0dW5wazIgICAgICBSTiAxMAordHVucGszICAgICAgUk4gMTIKKwordHVucGs0ICAgICAgUk4gNAordHVucGs1ICAgICAgUk4gNQordHVucGs2ICAgICAgUk4gMTQKK3R1bnBrNyAgICAgIFJOIDIgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorCithcDBxMCAgICAgICBSTiA0ICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorcFEwICAgICAgICAgUk4gMAorU3RlcCAgICAgICAgUk4gMQorICAgICAgICAgICAgCis7Ly8gT3V0cHV0CisgICAgICAgICAgICAKK1BfMCAgICAgICAgIFJOIDYKK1FfMCAgICAgICAgIFJOIDcgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDICAgICAgICAgIFJOIDEyCit0QzAgICAgICAgICBSTiA1Cit0QzEgICAgICAgICBSTiAxMgorcG9zICAgICAgICAgUk4gNQorbmVnICAgICAgICAgUk4gOQorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKKworYSAgICAgICAgICAgUk4gMTAKK3QxICAgICAgICAgIFJOIDEwCit0MiAgICAgICAgICBSTiAxMgordDMgICAgICAgICAgUk4gMTQKK3Q0ICAgICAgICAgIFJOIDYKK3Q1ICAgICAgICAgIFJOIDUKKworCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCisgICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAorICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTERSICAgICBhLD1NQVNLXzEKKyAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorCisgICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIGEKKyAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgYQorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgYQorCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKyAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorCisgICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKKyAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICAKKyAgICAgICAgCitMb29wWQorTG9vcFgKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjOAorICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKKworICAgICAgICBNX0xEUkggIHJvdzQsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIENNUCAgICAgYlMsICMwCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSSCAgcm93NSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQkVRLlcgICBOb0ZpbHRlckJTMAorICAgICAgICBMRFJIICAgIHJvdzYsIFtwUTBdCisgICAgICAgIExEUkggICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KKworICAgICAgICA7Ly8gcm93NCA9IFswIDAgcjBxMCByMHExXQorICAgICAgICA7Ly8gcm93NSA9IFswIDAgcjFxMCByMXExXQorICAgICAgICA7Ly8gcm93NiA9IFswIDAgcjJxMCByMnExXQorICAgICAgICA7Ly8gcm93NyA9IFswIDAgcjNxMCByM3ExXQorCisgICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0CisgICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNSwgdHVucGs1LCByb3c1CisgICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2CisgICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNywgdHVucGs3LCByb3c3CisKKyAgICAgICAgOy8vIHR1bnBrNCA9IFswIDAgcjBxMCByMXEwXQorICAgICAgICA7Ly8gdHVucGs1ID0gWzAgMCByMHExIHIxcTFdCisgICAgICAgIDsvLyB0dW5wazYgPSBbMCAwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIHR1bnBrNyA9IFswIDAgcjJxMSByM3ExXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMgorCisgICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2CisgICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2CisKKyAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisKKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIE1fTERSSCAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIE1fTERSSCAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIExEUkggICAgcm93MiwgW3BRMF0KKyAgICAgICAgTERSSCAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICAKKyAgICAgICAgOy8vIHJvdzAgPSBbMCAwIHIwcDAgcjBwMV0KKyAgICAgICAgOy8vIHJvdzEgPSBbMCAwIHIxcDAgcjFwMV0KKyAgICAgICAgOy8vIHJvdzIgPSBbMCAwIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHJvdzMgPSBbMCAwIHIzcDAgcjNwMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MAorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazIsIHR1bnBrMiwgcm93MSwgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93MQorCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrLCByb3cyCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrLCByb3cyLCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrMCwgdHVucGswLCByb3czLCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrMywgdHVucGszLCByb3czCisKKyAgICAgICAgOy8vIHR1bnBrMiA9IFswIDAgcjBwMCByMXAwXQorICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMHAxIHIxcDFdCisgICAgICAgIDsvLyB0dW5wazAgPSBbMCAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHR1bnBrMyA9IFswIDAgcjJwMSByM3AxXQorCisgICAgICAgIFBLSEJUICAgcF8wLCB0dW5wazAsIHR1bnBrMiwgTFNMIzE2CisgICAgICAgIE1fTERSICAgYlNUZW1wLCBwcEJTCisgICAgICAgIFBLSEJUICAgcF8xLCB0dW5wazMsIHR1bnBrNiwgTFNMIzE2CisKKyAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xCisgICAgICAgIExEUkggICAgYlNUZW1wLCBbYlNUZW1wICwjLThdCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgZmlsdCwgbTAxCisgICAgICAgIFRTVCAgICAgYlNUZW1wLCAjMHhmZjAwCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYKKyAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2CisgICAgICAgIFRTVCAgICAgYlNUZW1wLCAjNAorCisgICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAorICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKKyAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIEJFUSAgICAgYlNMVDQgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBDTVAgICAgIGZpbHQsICMwCisKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgOy8vIENvbXB1dGUgUDBiCisgICAgICAgIFVIQUREOCAgdDEsIHBfMCwgcV8xCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICBNVk4gICAgIHQyLCBwXzEKKyAgICAgICAgVUhTVUI4ICB0MSwgdDEsIHQyCisgICAgICAgIFVTVUI4ICAgdDIsIGZpbHQsIG0wMQorICAgICAgICBFT1IgICAgIHQxLCB0MSwgbTAxLCBMU0wgIzcKKworICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLHBUaHJlc2hvbGRzLCAjNAorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUTBiIAorICAgICAgICBVSEFERDggIHQyLCBxXzAsIHBfMQorICAgICAgICBNVk4gICAgIHQzLCBxXzEKKyAgICAgICAgVUhTVUI4ICB0MiwgdDIsIHQzCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTRUwgICAgIFBfMCwgdDEsIHBfMAorICAgICAgICBFT1IgICAgIHQyLCB0MiwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICBRXzAsIHQyLCBxXzAKKworICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICMyCitOb0ZpbHRlckJTMAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWQorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorICAgICAgICAKK2JTTFQ0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIAorCisgICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdworICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKKyAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKKyAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKKworICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCisKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwgIzEKKyAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCisgICAgICAgIExEUkIgICAgdEMxLCBbcFRocmVzaG9sZHNdLCAjMworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKKyAgICAgICAgT1JSICAgICB0QywgdEMxLCB0QzAsIExTTCAjMTYKKyAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKKyAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKKyAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAorCisgICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAorCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKKyAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKKyAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QworICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcworICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCisgICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCisgICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcworICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCisgICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZworICAgICAgICAKKyAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKKyAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAorICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCisgICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAorICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKKyAgICAKK1N0b3JlUmVzdWx0QW5kRXhpdAorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgICAgIHBRMCwgcFEwLCAjMSAgICAgIAorIAorICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMjQKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMyNAorICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAorCisgICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICMxNgorICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0KKyAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzE2CisgICAgICAgIE1fU1RSQiAgdDEsIFtwUTBdLCBzcmNkc3RTdGVwCisKKyAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzgKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMF0KKyAgICAgICAgU1RSQiAgICBQXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCisgICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICM4CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXSEKKyAgICAgICAgU1RSQiAgICBRXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisKK0V4aXRMb29wWQorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE0IAorICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzYKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODQwODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDMzMSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAKKworICAgIElGIEFSTTExMzZKUworCisKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDE0CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAyCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitwXzIgICAgICAgICBSTiA0ICAKK3BfMyAgICAgICAgIFJOIDIgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKK3FfMiAgICAgICAgIFJOIDEwIAorcV8zICAgICAgICAgUk4gMTIgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorZHAycDAgICAgICAgUk4gMTIKK2RxMnEwICAgICAgIFJOIDEyCisgICAgICAgICAgICAKK2FwMHEwICAgICAgIFJOIDEgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCithcGZsZyAgICAgICBSTiAwIAorYXFmbGcgICAgICAgUk4gNgorYXBxZmxnICAgICAgUk4gMAorICAgICAgICAgICAgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDMCAgICAgICAgIFJOIDcKK3B0QzAgICAgICAgIFJOIDEKKworcFEwYSAgICAgICAgUk4gMCAgICAKK1N0ZXBhICAgICAgIFJOIDEgICAgCittYXNrYSAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGEgICAgICAgICBSTiAxCitQMWEgICAgICAgICBSTiA4CitRMGEgICAgICAgICBSTiA3CitRMWEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCitwUTBiICAgICAgICBSTiAwCitTdGVwYiAgICAgICBSTiAxCittYXNrYiAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGIgICAgICAgICBSTiA2CitQMWIgICAgICAgICBSTiA3CitQMmIgICAgICAgICBSTiAxCitQM2IgICAgICAgICBSTiAzCisgICAgICAgICAgICAKK1EwYiAgICAgICAgIFJOIDkgCitRMWIgICAgICAgICBSTiAwICAgCitRMmIgICAgICAgICBSTiAyIAorUTNiICAgICAgICAgUk4gMyAKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAordDAgICAgICAgICAgUk4gMyAKK3QxICAgICAgICAgIFJOIDEyCit0MiAgICAgICAgICBSTiAxNAordDcgICAgICAgICAgUk4gNwordDQgICAgICAgICAgUk4gNAordDUgICAgICAgICAgUk4gMSAgCit0OCAgICAgICAgICBSTiA2ICAKK2EgICAgICAgICAgIFJOIDAKKworICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCisgICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0CisgICAgICAgIE1fQUxMT0M0IHBRXzMsNAorICAgICAgICBNX0FMTE9DNCBwUF8zLDQKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4CisgICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKKyAgICAgICAgTV9BTExPQzQgcHBCUyw0CisgICAgICAgIE1fQUxMT0M4IHBwUTBTdGVwLDQKKyAgICAgICAgTV9BTExPQzQgcFN0ZXAsNAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisKKyAgICAgICAgTERSICAgICB0NCw9TUFTS18xCisKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0CisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAorICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKKworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworTG9vcFkKK0xvb3BYCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCisgICAgICAgIE1fTERSICAgcF8zLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHBfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9TVFIgICBwXzMsIHBQXzMKKyAgICAgICAgTERSQiAgICBiUywgW3BCU10sICMxCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX0xEUiAgIHBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8xLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHFfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzMsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgQ01QICAgICBiUywgIzQKKyAgICAgICAgTV9TVFIgICBxXzMsIHBRXzMKKworOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQorCisgICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgorICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKKyAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKKyAgICAgICAgTU9WICAgICB0NywjMAorCisgICAgICAgIEJMVCAgICAgYlNMVDQgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIHQxLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE9SUiAgICAgYXBxZmxnLCBhcGZsZywgdDEsIExTTCAjMQorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNT1YgICAgIHBfMiwgUTFiCisgICAgICAgIE1PViAgICAgcF8xLCBQMmIKKyAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgcF8xLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBNX1NUUiAgIFAxYiwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgTV9TVFIgICBQMGIsIFtwUTBiLCBTdGVwYl0hCisgICAgICAgIE1fU1RSICAgUTBiLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBTVFIgICAgIHBfMiwgW3BRMGIsIFN0ZXBiXQorICAgICAgICBTVFIgICAgIFEyYiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCisKKworICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYiwgTFNMICMyCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyQlMwCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMworTm9GaWx0ZXJGaWx0MAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjMQorICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcworCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNT1YgICAgIHBfMiwgUDBhCisgICAgICAgIE1fTERSRCAgcFEwYSwgU3RlcGEsIHBwUTBTdGVwCisgICAgICAgIE1fU1RSICAgUDFhLCBbcFEwYSwgU3RlcGEsIExTTCAjMV0hCisgICAgICAgIE1fU1RSICAgcF8yLCBbcFEwYSwgU3RlcGFdIQorICAgICAgICBNX1NUUiAgIFEwYSwgW3BRMGEsIFN0ZXBhXSEKKyAgICAgICAgU1RSICAgICBRMWEsIFtwUTBhLCBTdGVwYV0KKyAgICAgICAKKyAgICAgICAgOy8vIExvYWQgY291bnRlcgorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzIKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICAKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCitFeGl0TG9vcFkKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzE2CisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBNX1NUUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIEJORSAgICAgTG9vcFkKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRiAgICAgICAgCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdkZGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKQEAgLTAsMCArMSw1NTAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAorTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gMTQKK3BCUyAgICAgICAgIFJOIDkKK3BRMCAgICAgICAgIFJOIDAKK2JTICAgICAgICAgIFJOIDIKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3BfMiAgICAgICAgIFJOIDQgIAorcF8zICAgICAgICAgUk4gMiAgCitxXzAgICAgICAgICBSTiA4ICAKK3FfMSAgICAgICAgIFJOIDkgIAorcV8yICAgICAgICAgUk4gMTAgCitxXzMgICAgICAgICBSTiAxMiAKKworOy8vIFVucGFja2luZworbWFzayAgICAgICAgUk4gMTEgCisKK3JvdzAgICAgICAgIFJOIDIKK3JvdzEgICAgICAgIFJOIDQKK3JvdzIgICAgICAgIFJOIDUKK3JvdzMgICAgICAgIFJOIDMKKworcm93NCAgICAgICAgUk4gOAorcm93NSAgICAgICAgUk4gOQorcm93NiAgICAgICAgUk4gMTAKK3JvdzcgICAgICAgIFJOIDEyCityb3c4ICAgICAgICBSTiAxNAorcm93OSAgICAgICAgUk4gNworICAgICAgICAgICAgCit0dW5wazAgICAgICBSTiA4Cit0dW5wazEgICAgICBSTiA5Cit0dW5wazIgICAgICBSTiAxMAordHVucGszICAgICAgUk4gMTIKK3R1bnBrNCAgICAgIFJOIDAKKwordHVucGs1ICAgICAgUk4gMQordHVucGs2ICAgICAgUk4gMTQKK3R1bnBrNyAgICAgIFJOIDIgCit0dW5wazggICAgICBSTiA1IAordHVucGs5ICAgICAgUk4gNiAKKyAKKworOy8vIEZpbHRlcmluZworCitkcDBxMCAgICAgICBSTiAxMgorZHAxcDAgICAgICAgUk4gMTIKK2RxMXEwICAgICAgIFJOIDEyCitkcDJwMCAgICAgICBSTiAxMgorZHEycTAgICAgICAgUk4gMTIKKyAgICAgICAgICAgIAorYXAwcTAgICAgICAgUk4gMSAgCitmaWx0ICAgICAgICBSTiAyCisgICAgICAgIAorbTAwICAgICAgICAgUk4gMTQKK20wMSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKK2FwZmxnICAgICAgIFJOIDAgCithcWZsZyAgICAgICBSTiA2CithcHFmbGcgICAgICBSTiAwCisgICAgICAgICAgICAKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKwordEMwICAgICAgICAgUk4gNworcHRDMCAgICAgICAgUk4gMQorCitwUTBhICAgICAgICBSTiAwICAgIAorU3RlcGEgICAgICAgUk4gMSAgICAKK21hc2thICAgICAgIFJOIDE0CisgICAgICAgICAgICAKK1AwYSAgICAgICAgIFJOIDEKK1AxYSAgICAgICAgIFJOIDgKK1EwYSAgICAgICAgIFJOIDcKK1ExYSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKK3BRMGIgICAgICAgIFJOIDAKK1N0ZXBiICAgICAgIFJOIDEKK21hc2tiICAgICAgIFJOIDE0CisgICAgICAgICAgICAKK1AwYiAgICAgICAgIFJOIDYKK1AxYiAgICAgICAgIFJOIDcKK1AyYiAgICAgICAgIFJOIDEKK1AzYiAgICAgICAgIFJOIDMKKyAgICAgICAgICAgIAorUTBiICAgICAgICAgUk4gOSAKK1ExYiAgICAgICAgIFJOIDAgICAKK1EyYiAgICAgICAgIFJOIDIgCitRM2IgICAgICAgICBSTiAzIAorCis7Ly8gTWlzY2VsbGFub3VzCitYWSAgICAgICAgICBSTiA4Cit0MCAgICAgICAgICBSTiAzIAordDEgICAgICAgICAgUk4gMTIKK3QyICAgICAgICAgIFJOIDE0Cit0NyAgICAgICAgICBSTiA3Cit0NCAgICAgICAgICBSTiA0Cit0NSAgICAgICAgICBSTiAxICAKK3Q4ICAgICAgICAgIFJOIDYgIAorYSAgICAgICAgICAgUk4gMAorCisgICAgICAgICAgICAKKworICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DNCBwUV8zLDQKKyAgICAgICAgTV9BTExPQzQgcFBfMyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0CisgICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorICAgICAgICAKKyAgICAgICAgTERSICAgICB0NCw9TUFTS18xCisKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0CisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAorICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKKworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjNAorTG9vcFkKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBwMC1wMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICByb3cwLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKKyAgICAgICAgTV9MRFIgICByb3cxLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKKyAgICAgICAgTERSICAgICByb3cyLCBbcFEwXQorICAgICAgICBMRFIgICAgIHJvdzMsIFtwUTAsIHNyY2RzdFN0ZXBdCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgOy8vIHJvdzAgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KKyAgICAgICAgOy8vIHJvdzEgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KKyAgICAgICAgOy8vIHJvdzIgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHJvdzMgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KKworICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MAorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgcm93MSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93MQorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MgorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgcm93MywgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgcm93MworCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMXAwIHIwcDIgcjFwMl0KKyAgICAgICAgOy8vIHR1bnBrNiA9IFtyMHAxIHIxcDEgcjBwMyByMXAzXQorICAgICAgICA7Ly8gdHVucGsyID0gW3IycDAgcjNwMCByMnAyIHIzcDJdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjJwMSByM3AxIHIycDMgcjNwM10KKworICAgICAgICBQS0hUQiAgIHBfMCwgdHVucGswLCB0dW5wazIsIEFTUiMxNgorICAgICAgICBQS0hUQiAgIHBfMSwgdHVucGs2LCB0dW5wazMsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHBfMiwgdHVucGsyLCB0dW5wazAsIExTTCMxNgorICAgICAgICBQS0hCVCAgIHBfMywgdHVucGszLCB0dW5wazYsIExTTCMxNgorCisKKyAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisgICAgICAgIDsvLyBwXzIgPSBbcjBwMiByMXAyIHIycDEgcjNwMl0KKyAgICAgICAgOy8vIHBfMyA9IFtyMHAzIHIxcDMgcjJwMyByM3AzXQorCisgICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCisKKzsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHEwLXEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xvb3BYCisgICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjNAorICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKKyAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCisgICAgICAgIENNUCAgICAgYlMsICMwCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisKKyAgICAgICAgTERSICAgICByb3c0LCBbcFEwLCAjNF0hCisgICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgTV9MRFIgICByb3c1LCBbcFEwLCBzcmNkc3RTdGVwXSEKKyAgICAgICAgTV9MRFIgICByb3c2LCBbcFEwLCBzcmNkc3RTdGVwXSEKKyAgICAgICAgTV9MRFIgICByb3c3LCBbcFEwLCBzcmNkc3RTdGVwXQorCisgICAgICAgIDsvLyByb3c0ID0gW3IwcTMgcjBxMiByMHExIHIwcTBdCisgICAgICAgIDsvLyByb3c1ID0gW3IxcTMgcjFxMiByMXExIHIxcTBdCisgICAgICAgIDsvLyByb3c2ID0gW3IycTMgcjJxMiByMnExIHIycTBdCisgICAgICAgIDsvLyByb3c3ID0gW3IzcTMgcjNxMiByM3ExIHIzcTBdCisgICAgCisgICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0CisgICAgICAgIENNUCAgICAgYlMsICM0CisgICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNSwgdHVucGs1LCByb3c1CisgICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2CisgICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNywgdHVucGs3LCByb3c3CisKKyAgICAgICAgOy8vIHR1bnBrNCA9IFtyMHEwIHIxcTAgcjBxMiByMXEyXQorICAgICAgICA7Ly8gdHVucGs1ID0gW3IwcTEgcjFxMSByMHEzIHIxcTNdCisgICAgICAgIDsvLyB0dW5wazYgPSBbcjJxMCByM3EwIHIycTIgcjNxMl0KKyAgICAgICAgOy8vIHR1bnBrNyA9IFtyMnExIHIzcTEgcjJxMyByM3EzXQorCisgICAgICAgIFBLSFRCICAgcV8zLCB0dW5wazQsIHR1bnBrNiwgQVNSIzE2CisgICAgICAgIFBLSFRCICAgcV8yLCB0dW5wazUsIHR1bnBrNywgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2CisgICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCisgICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2CisKKworICAgICAgICA7Ly8gcV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBxXzEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKyAgICAgICAgOy8vIHFfMiA9IFtyMHEyIHIxcTIgcjJxMSByM3EyXQorICAgICAgICA7Ly8gcV8zID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCisKKworOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQorCisgICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgorICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKKyAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKKyAgICAgICAgTU9WICAgICB0NywjMAorICAgICAgICAKKworICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKKyAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIExEUiAgICAgbWFza2IsPU1BU0tfMgorCisgICAgICAgIDsvLyBQMGIgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFAxYiA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorICAgICAgICA7Ly8gUDJiID0gW3IwcDIgcjFwMiByMnAyIHIzcDJdCisgICAgICAgIDsvLyBQM2IgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KKworICAgICAgICBNX0xEUiAgIFAzYiwgcFBfMyAgIAorICAgICAgICBNX1NUUiAgIFEwYiwgcFBfMyAgIAorCisgICAgICAgIDsvLy0tLS0tLVBhY2sgcDAtcDMtLS0tLS0KKyAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2tiLCBQMGIKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2tiLCBQMGIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIFAxYiwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFiCisKKyAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2tiLCBQMmIKKyAgICAgICAgQU5EICAgICB0dW5wazgsIG1hc2tiLCBQMmIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFAzYiwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazgsIHR1bnBrOCwgUDNiCisKKyAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHAwIHIwcDEgcjJwMCByMnAxXQorICAgICAgICA7Ly8gdHVucGsyID0gW3IxcDAgcjFwMSByM3AwIHIzcDFdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjBwMiByMHAzIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHR1bnBrOCA9IFtyMXAyIHIxcDMgcjNwMiByM3AzXQorCisgICAgICAgIE1PViAgICAgcF8yLCBRMWIKKyAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKKworICAgICAgICBQS0hUQiAgIHJvdzksIHR1bnBrMCwgdHVucGszLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazMsIHR1bnBrMCwgTFNMIzE2CisgICAgICAgIFBLSFRCICAgcm93MywgdHVucGsyLCB0dW5wazgsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrOCwgdHVucGsyLCBMU0wjMTYKKworICAgICAgICA7Ly8gcm93OSA9IFtyMHAwIHIwcDEgcjBwMiByMHAzXQorICAgICAgICA7Ly8gcm93MyA9IFtyMXAwIHIxcDEgcjFwMiByMXAzXQorICAgICAgICA7Ly8gcm93NyA9IFtyMnAwIHIycDEgcjJwMiByMnAzXQorICAgICAgICA7Ly8gcm93NiA9IFtyM3AwIHIzcDEgcjNwMiByM3AzXQorCisgICAgICAgIE1fU1RSICAgcm93OSwgW3BRMGJdLCBTdGVwYgorICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KKyAgICAgICAgU1RSICAgICByb3czLCBbcFEwYl0sICM0CisgICAgICAgIAorICAgICAgICBNX0xEUiAgIFEzYiwgcFFfMworCisgICAgICAgIDsvLyBRMGIgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIFExYiA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQorICAgICAgICA7Ly8gUTJiID0gW3IwcTIgcjFxMiByMnEyIHIzcTJdCisgICAgICAgIDsvLyBRM2IgPSBbcjBxMyByMXEzIHIycTMgcjNxM10KKworICAgICAgICA7Ly8tLS0tLS1QYWNrIHEwLXEzLS0tLS0tCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgcF8yCisgICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgcF8yLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBRMGIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFEwYgorCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUTNiCisgICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUTNiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMmIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFEyYgorCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBxMSByMHEwIHIycTEgcjJxMF0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXExIHIxcTAgcjNxMSByM3EwXQorICAgICAgICA7Ly8gdHVucGszID0gW3IwcTMgcjBxMiByMnEzIHIycTJdCisgICAgICAgIDsvLyB0dW5wazggPSBbcjFxMyByMXEyIHIzcTMgcjNxMl0KKworICAgICAgICBQS0hUQiAgIHJvdzgsIHR1bnBrMywgdHVucGswLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazAsIHR1bnBrMywgTFNMIzE2CisgICAgICAgIFBLSFRCICAgcm93NCwgdHVucGs4LCB0dW5wazIsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrMiwgdHVucGs4LCBMU0wjMTYKKworICAgICAgICA7Ly8gcm93OCA9IFtyMHEwIHIwcTEgcjBxMiByMHEzXQorICAgICAgICA7Ly8gcm93NCA9IFtyMXEwIHIxcTEgcjFxMiByMXEzXQorICAgICAgICA7Ly8gcm93NyA9IFtyMnEwIHIycTEgcjJxMiByMnEzXQorICAgICAgICA7Ly8gcm93NiA9IFtyM3EwIHIzcTEgcjNxMiByM3EzXQorCisgICAgICAgIFNUUiAgICAgcm93NCwgW3BRMGJdCisgICAgICAgIFNUUiAgICAgcm93NywgW3BRMGIsIFN0ZXBiXQorICAgICAgICBTVFIgICAgIHJvdzYsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYgorICAgICAgICBNT1YgICAgIHBfMSwgUTJiCisKKyAgICAgICAgU1RSICAgICByb3c4LCBbcFEwXQorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICM0CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyRmlsdDAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKK05vRmlsdGVyQlMwCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjNAorICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcworCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8tLS0tLS0tLVBhY2sgcDEscDAscTEscTAtLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvL0xvYWQgZGVzdGluYXRpb24gcG9pbnRlcgorICAgICAgICBMRFIgICAgIG1hc2thLD1NQVNLXzIKKyAgICAgICAgTV9TVFIgICBRMGEsIHBQXzMKKyAgICAgICAgTU9WICAgICBwXzEsIHFfMgorCisgICAgICAgIDsvLyBQMWEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KKyAgICAgICAgOy8vIFAwYSA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gUTBhID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBRMWEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrMSwgbWFza2EsIFAwYQorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2EsIFAwYSwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazEsIHR1bnBrMSwgUDFhLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBQMWEKKworICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAorCisgICAgICAgIEFORCAgICAgdHVucGs5LCBtYXNrYSwgUTFhCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYSwgUTFhLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrOSwgdHVucGs5LCBRMGEsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFEwYQorCisgICAgICAgIDsvLyB0dW5wazEgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQorICAgICAgICA7Ly8gdHVucGs5ID0gW3IwcTEgcjBxMCByMnExIHIycTBdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KKworICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazEsIExTUiAjMTYKKyAgICAgICAgTU9WICAgICB0MCwgdHVucGs5LCBMU1IgIzE2CisKKyAgICAgICAgU1RSSCAgICB0NCxbcFEwYSwgIzJdISAgICAgICAgICA7Ly9TdG9yZXMgW3IwcDAgcjBwMV0KKyAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IwcTAgcjBxMV0KKworICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazIsIExTUiAjMTYKKyAgICAgICAgTU9WICAgICB0MCwgdHVucGszLCBMU1IgIzE2CisKKyAgICAgICAgTV9TVFJIICB0NCxbcFEwYSwgU3RlcGFdISAgICAgICA7Ly9TdG9yZXMgW3IxcDAgcjFwMV0KKyAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IxcTAgcjFxMV0KKyAgICAgICAgCisgICAgICAgIE1fU1RSSCAgdHVucGsxLFtwUTBhLCBTdGVwYV0hICAgOy8vU3RvcmVzIFtyMnAwIHIycDFdCisgICAgICAgIFNUUkggICAgdHVucGsyLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3AwIHIzcDFdCisgICAgICAgIFNUUkggICAgdHVucGs5LFtwUTBhLCAjMl0hICAgICAgICA7Ly9TdG9yZXMgW3IycTAgcjJxMV0KKyAgICAgICAgU1RSSCAgICB0dW5wazMsW3BRMGEsIFN0ZXBhXSAgICA7Ly9TdG9yZXMgW3IzcTAgcjNxMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMQorCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworCisgICAgICAgIDsvLyBSZWxvYWQgUGl4ZWxzCisgICAgICAgIE1fTERSICAgcF8wLCBwUV8zCisgICAgICAgIE1PViAgICAgcF8yLCBRMWEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICAKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworRXhpdExvb3BZCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE1CisgICAgICAgIFNVQiAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTUKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBFTkRJRiAgICAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MzViZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKyAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCisgKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KKyAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgorICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKKyAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KKyAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KKyAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCisgICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2MTFhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCkBAIC0wLDAgKzEsNDI2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCis7Ly8KKzsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCis7Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgorOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKzsvLyBQYXJhbWV0ZXJzOgorOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKzsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKKzsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKKzsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KKzsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8KKzsvLyBSZXR1cm4gVmFsdWU6Cis7Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Cis7Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KKzsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KKzsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgorOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCis7Ly8KKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICBFTkRJRgorCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgRU5ESUYKKyAgICAKKyAgICAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworaUhlaWdodCAgICAgICAgIFJOIDQKK2lXaWR0aCAgICAgICAgICBSTiA1CisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKKworICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4CisgICAgICAgICAgICAgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgSUYgQVJNMTEzNkpTCisKKworICAgICAgICBNX0FMTE9DNCBwcERzdCwgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgOAorICAgICAgICBNX0FMTE9DNCBwcEFyZ3MsIDE2CisgICAgICAgIE1fQUxMT0M0IHBCdWZmZXIsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxMjAgPSAxMngxMAorICAgICAgICBNX0FMTE9DOCBwSW50ZXJCdWYsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTIqNSoyCisgICAgICAgIE1fQUxMT0M4IHBUZW1wQnVmLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMiA9ICA4KjQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgorICAgICAgICA7Ly8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgbW90aW9uIHZlY3RvciBmcmFjdGlvbmFsIHBhcnRzIChkeCxkeSksIG9uZSBvdXQgb2YgMTYgY2FzZXMgd2lsbCBiZSBwcm9jZXNzZWQuCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcjQsIHI1LCByNiB0byBiZSBwcmVzZXJ2ZWQgYnkgaW50ZXJuYWwgdW5zYWZlIGZ1bmN0aW9ucworICAgICAgICA7Ly8gcjQgLSBpSGVpZ2h0CisgICAgICAgIDsvLyByNSAtIGlXaWR0aAorICAgICAgICA7Ly8gcjYgLSBpbmRleAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaWR4ICAgICAgICAgICAgIFJOIDYKK2lkeSAgICAgICAgICAgICBSTiA3CitpbmRleCAgICAgICAgICAgUk4gNgorVGVtcCAgICAgICAgICAgIFJOIDEyCitwQXJncyAgICAgICAgICAgUk4gMTEKKworcEJ1ZiAgICAgICAgICAgIFJOIDgKK0hlaWdodCAgICAgICAgICBSTiA5IAorYnVmU3RlcCAgICAgICAgIFJOIDkKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHRyaWR4LCA0CisgICAgICAgIE1fQVJHICAgcHRyaWR5LCA0ICAgICAgICAKKyAgICAgICAgTV9BUkcgICBwdHJXaWR0aCwgNAorICAgICAgICBNX0FSRyAgIHB0ckhlaWdodCwgNCAgICAgICAgCisKKyAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKKyAgICAgICAgTV9MRFIgICBpZHgsIHB0cmlkeAorICAgICAgICBNX0xEUiAgIGlkeSwgcHRyaWR5CisgICAgICAgIE1fTERSICAgaVdpZHRoLCBwdHJXaWR0aAorICAgICAgICBNX0xEUiAgIGlIZWlnaHQsIHB0ckhlaWdodAorICAgICAgICAKKyAgICAgICAgTV9QUklOVEYgInJvaS53aWR0aCAlZFxuIiwgaVdpZHRoCisgICAgICAgIE1fUFJJTlRGICJyb2kuaGVpZ2h0ICVkXG4iLCBpSGVpZ2h0CisKKyAgICAgICAgQUREICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKworSW50ZXJwb2xhdGVMdW1hCitCbG9jazR4NFdpZHRoTG9vcAorQmxvY2s0eDRIZWlnaHRMb29wCisKKyAgICAgICAgU1RNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKKyAgICAgICAgTV9TV0lUQ0ggaW5kZXgsIEwKKyAgICAgICAgTV9DQVNFICBDYXNlXzAKKyAgICAgICAgTV9DQVNFICBDYXNlXzEKKyAgICAgICAgTV9DQVNFICBDYXNlXzIKKyAgICAgICAgTV9DQVNFICBDYXNlXzMKKyAgICAgICAgTV9DQVNFICBDYXNlXzQKKyAgICAgICAgTV9DQVNFICBDYXNlXzUKKyAgICAgICAgTV9DQVNFICBDYXNlXzYKKyAgICAgICAgTV9DQVNFICBDYXNlXzcKKyAgICAgICAgTV9DQVNFICBDYXNlXzgKKyAgICAgICAgTV9DQVNFICBDYXNlXzkKKyAgICAgICAgTV9DQVNFICBDYXNlX2EKKyAgICAgICAgTV9DQVNFICBDYXNlX2IKKyAgICAgICAgTV9DQVNFICBDYXNlX2MKKyAgICAgICAgTV9DQVNFICBDYXNlX2QKKyAgICAgICAgTV9DQVNFICBDYXNlX2UKKyAgICAgICAgTV9DQVNFICBDYXNlX2YKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ2FzZV8wCisgICAgICAgIDsvLyBDYXNlIEcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCisKK0Nhc2VfMQorICAgICAgICA7Ly8gQ2FzZSBhCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzIKKyAgICAgICAgOy8vIENhc2UgYgorICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfMworICAgICAgICA7Ly8gQ2FzZSBjCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzQKKyAgICAgICAgOy8vIENhc2UgZAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV81CisgICAgICAgIDsvLyBDYXNlIGUKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIAorCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzYKKyAgICAgICAgOy8vIENhc2UgZgorICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV83CisgICAgICAgIDsvLyBDYXNlIGcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzgKKyAgICAgICAgOy8vIENhc2UgaAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfOQorICAgICAgICA7Ly8gQ2FzZSBpCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2EKKyAgICAgICAgOy8vIENhc2UgagorICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYgorICAgICAgICA7Ly8gQ2FzZSBrCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9jCisgICAgICAgIDsvLyBDYXNlIG4KKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgcFNyYyB0byBvbmUgcm93IGRvd24KKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZAorICAgICAgICA7Ly8gQ2FzZSBwCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2UKKyAgICAgICAgOy8vIENhc2UgcQorICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9mCisgICAgICAgIDsvLyBDYXNlIHIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorCitCbG9jazR4NExvb3BFbmQKKworICAgICAgICA7Ly8gV2lkdGggTG9vcAorICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjNAorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAorICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsICM0CisgICAgICAgIEJHVCAgICAgQmxvY2s0eDRXaWR0aExvb3AKKworICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCisgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVdpZHRoCisgICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgaVdpZHRoCisgICAgICAgIEJHVCAgICAgQmxvY2s0eDRIZWlnaHRMb29wCisKK0VuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBNT1YgICAgIHIwLCAjMAorICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAgICAgCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZWRkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpAQCAtMCwwICsxLDQ5NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgCisgICAgIEFSRUEgdGFibGUsIERBVEEgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCisgICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCisgICAgCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCisgICAgRENXICAgMywgMiwgMSw0IAorICAgIERDVyAgLTMsLTIsLTEsMAorICAgIERDVyAgIDEsIDIsIDMsNAorICAgIAorICAgIElGIEFSTTExMzZKUworICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gQ29uc3RhbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisKK0JMS19TSVpFICAgICAgICBFUVUgMHg4CitNVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKK01BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgorTVVMX0NPTlNUMSAgICAgIEVRVSAweDgwODA4MDgwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCityZXR1cm4gICAgICAgICAgUk4gMCAgICAKK3BTcmNMZWZ0MiAgICAgICBSTiAxICAgIAorcERzdDIgICAgICAgICAgIFJOIDIgICAgCitzdW0xICAgICAgICAgICAgUk4gNiAgICAKK3N1bTIgICAgICAgICAgICBSTiA3ICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCitkc3RTdGVweDIgICAgICAgUk4gMTEgICAKK2xlZnRTdGVweDIgICAgICBSTiAxNCAgIAorb3V0ZXJDb3VudCAgICAgIFJOIDE0ICAgCityMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKK3IweDAwRkYwMEZGICAgICBSTiAxMSAgIAorCit0VmFsMCAgICAgICAgICAgUk4gMCAgICAKK3RWYWwxICAgICAgICAgICBSTiAxICAgIAordFZhbDIgICAgICAgICAgIFJOIDIgICAgCit0VmFsMyAgICAgICAgICAgUk4gMyAgICAKK3RWYWw0ICAgICAgICAgICBSTiA0ICAgIAordFZhbDUgICAgICAgICAgIFJOIDUgICAgCit0VmFsNiAgICAgICAgICAgUk4gNiAgICAKK3RWYWw3ICAgICAgICAgICBSTiA3ICAgIAordFZhbDggICAgICAgICAgIFJOIDggICAgCit0VmFsOSAgICAgICAgICAgUk4gOSAgICAKK3RWYWwxMCAgICAgICAgICBSTiAxMCAgIAordFZhbDExICAgICAgICAgIFJOIDExICAgCit0VmFsMTIgICAgICAgICAgUk4gMTIgICAKK3RWYWwxNCAgICAgICAgICBSTiAxNCAgIAorCitiICAgICAgICAgICAgICAgUk4gMTQgICAKK2MgICAgICAgICAgICAgICBSTiAxMiAgIAorCitwMnAwICAgICAgICAgICAgUk4gMCAgICAKK3AzcDEgICAgICAgICAgICBSTiAxICAgIAorcDZwNCAgICAgICAgICAgIFJOIDIgICAgCitwN3A1ICAgICAgICAgICAgUk4gNCAgICAKKworcHAycHAwICAgICAgICAgIFJOIDYgICAgCitwcDNwcDEgICAgICAgICAgUk4gNyAgICAKK3BwNnBwNCAgICAgICAgICBSTiA4ICAgIAorcHA3cHA1ICAgICAgICAgIFJOIDkgICAgCisKK3AzMjEwICAgICAgICAgICBSTiAxMCAgIAorcDc2NTQgICAgICAgICAgIFJOIDEwICAgCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKK09NWF9WQ19DSFJPTUFfREMKKyAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCBhdmFpbGFiaWxpdHksIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKSA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgKCNPTVhfVkNfVVBQRVIgfCAjT01YX1ZDX0xFRlQpKQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAKKyAgICAgICAgQk5FICAgICAgVFNUX1VQUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgc3VtMSwgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHN1bTIsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIFVYVEggICAgIHN1bTEsIHN1bTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBVWFRIICAgICBzdW0yLCBzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0yIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQorICAgICAgICBBREQgICAgICB0VmFsMTQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgIHRWYWw0LCBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCisgICAgICAgIExEUkIgICAgIHRWYWwxMixbcFNyY0xlZnQyXSAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsMTQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKKyAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWwxNCwgIzIgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gbGVmdHN1bTIgKyAyCisgICAgICAgIEFERCAgICAgIHRWYWw5LCBzdW0yLCAgICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHVwc3VtMiArIDIKKyAgICAgICAgQUREICAgICAgc3VtMSwgIHN1bTEsIHRWYWwyICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSB1cHN1bTEgKyBsZWZ0c3VtMQorICAgICAgICBBREQgICAgICBzdW0yLCAgc3VtMiwgdFZhbDE0ICAgICAgICAgICAgICAgICA7Ly8gc3VtMiA9IHVwc3VtMiArIGxlZnRzdW0yCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpCisgICAgICAgIE1PViAgICAgIHN1bTEsICBzdW0xLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpPj4zCisgICAgICAgIE1PViAgICAgIHRWYWw5LCB0VmFsOSwgTFNSICMyICAgICAgICAgICAgICAgIDsvLyAodFZhbDkgKyAyKT4+MgorICAgICAgICBNT1YgICAgICB0VmFsOCwgdFZhbDgsIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw4ICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgIHN1bTIsICBMU1IgIzMgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHRWYWwwLCBzdW0xLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWwxLCB0VmFsOSxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw5LCBzdW0yLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDAgdG8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorVFNUX1VQUEVSCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIAorICAgICAgICBCTkUgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5fSAgICAgICAgICAgICA7Ly8gdFZhbCA4IHRvIDkgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWw4LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICBzdW0xLCAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KKyAgICAgICAgVUFERDE2ICAgc3VtMiwgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIAorICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIAorICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSArIDIKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTIgKyAyCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBzdW0xLCBzdW0xLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyAyKT4+MgorICAgICAgICBNT1YgICAgICBzdW0yLCBzdW0yLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyAyKT4+MgorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgc3VtMSwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgc3VtMiwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorVFNUX0xFRlQgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zICAgICAgIAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQk5FICAgICAgVFNUX0NPVU5UMAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDQsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEyLFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbM10KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWw4ICsgdFZhbDkKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzRdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzVdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHN1bTEsICB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKKyAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgQUREICAgICAgc3VtMiwgIHRWYWw4LCB0VmFsNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgID0gc3VtKHBTcmNMZWZ0WzRdIHRvIHBTcmNMZWZ0WzddKQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCBzdW0xLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCBzdW0yLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBNT1YgICAgICB0VmFsNyx0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCisgICAgICAgIE1PViAgICAgIHRWYWw5LHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IHN1bTIKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworVFNUX0NPVU5UMAorICAgICAgICBMRFIgICAgICBzdW0xLCA9TVVMX0NPTlNUMSAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gMHg4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHRWYWw3LCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHN1bTEKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitPTVhfVkNfQ0hST01BX0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgCisgICAgICAgIAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCwgbGVmdFN0ZXAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IGxlZnRTdGVwICogMgorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDIgPSBwRHN0ICsgZHN0U3RlcAorICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICM0ICAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyA0CisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCA9TVVMX0NPTlNUMCAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbM10KKyAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFs0XQorICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDcgPSBwU3JjTGVmdFs1XQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs2XQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs3XQorICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsNywgdFZhbDcsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw2LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQorICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorT01YX1ZDX0NIUk9NQV9WRVJUCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NCAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsN30gICAgICAgICAgICA7Ly8gdFZhbCA2IHRvIDcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ19DSFJPTUFfUExBTkUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICMzICA7Ly8gNypsZWZ0U3RlcAorICAgICAgICBMRFJCICAgICB0VmFsNywgW3BTcmNBYm92ZSwgIys3XSAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzddCisgICAgICAgIExEUkIgICAgIHRWYWw2LCBbcFNyY0xlZnQsICt0VmFsMTRdICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICBMRFJCICAgICB0VmFsOCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwgIys2IF0gICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdCisgICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMF0KKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCisgICAgICAgIFNVQiAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBWMCA9IHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gSDAgPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdICAgICAgICAKKyAgICAgICAgTFNMICAgICAgdFZhbDIsIHRWYWwyLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIGEgPSAxNiAqIChwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbFNdKQorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsICMxNiAgICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSx0VmFsMTAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmUsIys1XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzFdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzFdCisgICAgICAgIEFERCAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDksIExTTCAjMSAgICAgICAgIDsvLyBIMSA9IDMgKiAocFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdKQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDksIHRWYWw3LCBMU0wgIzIgICAgICAgICA7Ly8gSCA9IEgxICsgSDAKKyAgICAgICAgU1VCICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQorICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwjKzRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdCisgICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlLCMrMl0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMl0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIEggPSBIICsgSDIKKyAgICAgICAgU1VCICAgICAgdFZhbDExLCB0VmFsMTQsbGVmdFN0ZXAgICAgICAgICAgICAgOy8vIDYqbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgdFZhbDExLCBwU3JjTGVmdCwgdFZhbDExICAgICAgICAgICAgOy8vIHBTcmNMZWZ0ICsgNipsZWZ0U3RlcAorICAgICAgICBNT1YgICAgICB0VmFsMTIsIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnQKKyAgICAgICAgU1VCICAgICAgdFZhbDksIHRWYWw5LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gSCA9IEggKyBIMworICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjNCAgICAgICAgIDsvLyAxNyAqIEgKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3ICogSCArIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCisgICAgICAgIEFTUiAgICAgIGIsIHRWYWw3LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBiID0gKDE3ICogSCArIDE2KSA+PiA1CisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBWMSA9IDMgKiAocFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw4LCB0VmFsNiwgTFNMICMyICAgICAgICAgOy8vIFYgPSBWMCArVjEKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYgorICAgICAgICBTVUIgICAgICB0VmFsMiwgdFZhbDIsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2IC0gMypiCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNywgTFNMICMxICAgICAgICAgOy8vIFYgPSBWICsgVjIKKyAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsID1NQVNLX0NPTlNUICAgICAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gViA9IFYgKyBWNworICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNCAgICAgICAgICAgICAgICA7Ly8gZHN0U3RlcCAtIDQKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNiwgTFNMICM0ICAgICAgICAgOy8vIDE3KlYKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3KlYgKyAxNgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgIGMsIHRWYWw2LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjID0gKDE3KlYgKyAxNik+PjUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsNiwgYywgYywgTFNMICMxICAgICAgICAgICAgICAgICA7Ly8gMypjCisgICAgICAgIFVYVEggICAgIGMsIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvbmx5IGluIGhhbGYgd29yZAorICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gYSAtIDMqYiAtIDMqYyArIDE2CisgICAgICAgIE9SUiAgICAgIGMsIGMsIGMsIExTTCAjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBjIGMKKyAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDJiCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBwcDIgPSBkICsgMipiCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgYiAgICAgICAgICAgICAgICAgICAgIDsvLyAzYgorICAgICAgICBPUlIgICAgICBwMnAwLCAgIHRWYWw2LCAgdFZhbDIsICBMU0wgIzE2ICAgICA7Ly8gcDJwMCAgID0gcGFjayB7cDIsIHAwfQorICAgICAgICBVWFRIICAgICBiLCBiCisgICAgICAgIFVYVEggICAgIHRWYWw3LCB0VmFsNworICAgICAgICBPUlIgICAgICBiLCBiLCBiLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8ge2IsYn0KKyAgICAgICAgT1JSICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsNywgTFNMICMxNiAgICAgICAgOy8vIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwMnAwLCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHAzcDEgICA9IHAycDAgKyB7YixifQorICAgICAgICBTQUREMTYgICBwNnA0LCAgIHAzcDEsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcDZwNCAgID0gcDNwMSArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwNnA0LCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHA3cDUgICA9IHA2cDQgKyB7YixifQorICAgICAgICBNT1YgICAgICBvdXRlckNvdW50LCAjQkxLX1NJWkUgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudCAgICAgICAgCisgICAgICAgIAorTE9PUF9QTEFORSAgICAgICAgCisKKyAgICAgICAgVVNBVDE2ICAgcDdwNSwgICAjMTMsIHA3cDUgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDcpIGNsaXAxMyhwNSkKKyAgICAgICAgVVNBVDE2ICAgcDZwNCwgICAjMTMsIHA2cDQgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDYpIGNsaXAxMyhwNCkKKyAgICAgICAgVVNBVDE2ICAgcDNwMSwgICAjMTMsIHAzcDEgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDMpIGNsaXAxMyhwMSkKKyAgICAgICAgVVNBVDE2ICAgcDJwMCwgICAjMTMsIHAycDAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDIpIGNsaXAxMyhwMCkKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgIHBwN3BwNSwgcjB4MDBGRjAwRkYsIHA3cDUsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDcpIGNsaXA4KHA1KQorICAgICAgICBBTkQgICAgICBwcDZwcDQsIHIweDAwRkYwMEZGLCBwNnA0LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA2KSBjbGlwOChwNCkKKyAgICAgICAgQU5EICAgICAgcHAzcHAxLCByMHgwMEZGMDBGRiwgcDNwMSwgQVNSICM1ICAgIDsvLyBjbGlwOChwMykgY2xpcDgocDEpCisgICAgICAgIEFORCAgICAgIHBwMnBwMCwgcjB4MDBGRjAwRkYsIHAycDAsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDIpIGNsaXA4KHAwKQorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgb3V0ZXJDb3VudCwgb3V0ZXJDb3VudCwgIzEgICAgICAgICAgIDsvLyBvdXRlckNvdW50LS0KKyAgICAgIAorICAgICAgICBPUlIgICAgICBwMzIxMCwgcHAycHAwLCBwcDNwcDEsIExTTCAjOCAgICAgICAgOy8vIHBhY2sge3AzLHAyLCBwMSwgcDB9CisgICAgICAgIFNUUiAgICAgIHAzMjEwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3BEc3RbMF0gdG8gcERzdFszXX0gIAorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgcDc2NTQsIHBwNnBwNCwgcHA3cHA1LCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwNyxwNiwgcDUsIHA0fQorICAgICAgICBNX1NUUiAgICBwNzY1NCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzRdIHRvIHBEc3RbN119CisKKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDcgKyBjfSwge3A1ICsgY30KKyAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwNnA0LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDYgKyBjfSwge3A0ICsgY30KKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDMgKyBjfSwge3AxICsgY30KKyAgICAgICAgU0FERDE2ICAgcDJwMCwgICBwMnAwLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDIgKyBjfSwge3AwICsgY30KKyAgICAgIAorICAgICAgICBCTkUgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDggdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTcyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpAQCAtMCwwICsxLDUwMSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUyAgICAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAorICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorICAgIAorICAgIElGIEFSTTExMzZKUworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cyAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICBFUVUgMHgxMAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKK01VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQorTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoreSAgICAgICAgICAgICAgIFJOIDEyICAgCitwYyAgICAgICAgICAgICAgUk4gMTUgICAKKworcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitpbm5lckNvdW50ICAgICAgUk4gMCAgICAKK291dGVyQ291bnQgICAgICBSTiAxICAgIAorcFNyY0xlZnQyICAgICAgIFJOIDEgICAgCitwRHN0MiAgICAgICAgICAgUk4gMiAgICAKK3N1bSAgICAgICAgICAgICBSTiA2ICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCit0ZW1wMSAgICAgICAgICAgUk4gMTAgICAKK3RlbXAyICAgICAgICAgICBSTiAxMiAgIAorY011bDEgICAgICAgICAgIFJOIDExICAgCitjTXVsMiAgICAgICAgICAgUk4gMTIgICAKK2NvdW50ICAgICAgICAgICBSTiAxMiAgIAorZHN0U3RlcHgyICAgICAgIFJOIDExICAgCitsZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKK3IweDAxMDEwMTAxICAgICBSTiAxMCAgIAorcjB4MDBGRjAwRkYgICAgIFJOIDExCisKK3RWYWwwICAgICAgICAgICBSTiAwICAgIAordFZhbDEgICAgICAgICAgIFJOIDEgICAgCit0VmFsMiAgICAgICAgICAgUk4gMiAgICAKK3RWYWwzICAgICAgICAgICBSTiAzICAgIAordFZhbDQgICAgICAgICAgIFJOIDQgICAgCit0VmFsNSAgICAgICAgICAgUk4gNSAgICAKK3RWYWw2ICAgICAgICAgICBSTiA2ICAgIAordFZhbDcgICAgICAgICAgIFJOIDcgICAgCit0VmFsOCAgICAgICAgICAgUk4gOCAgICAKK3RWYWw5ICAgICAgICAgICBSTiA5ICAgIAordFZhbDEwICAgICAgICAgIFJOIDEwICAgCit0VmFsMTEgICAgICAgICAgUk4gMTEgICAKK3RWYWwxMiAgICAgICAgICBSTiAxMiAgIAordFZhbDE0ICAgICAgICAgIFJOIDE0ICAgCisKK2IgICAgICAgICAgICAgICBSTiAxMiAgIAorYyAgICAgICAgICAgICAgIFJOIDE0ICAgCisKK3AycDAgICAgICAgICAgICBSTiAwICAgIAorcDNwMSAgICAgICAgICAgIFJOIDEgICAgCitwNnA0ICAgICAgICAgICAgUk4gMiAgICAKK3A3cDUgICAgICAgICAgICBSTiA0ICAgIAorcDEwcDggICAgICAgICAgIFJOIDYgICAgCitwMTFwOSAgICAgICAgICAgUk4gNyAgICAKK3AxNHAxMiAgICAgICAgICBSTiA4ICAgIAorcDE1cDEzICAgICAgICAgIFJOIDkgICAgCisKK3AzMjEwICAgICAgICAgICBSTiAxMCAgIAorcDc2NTQgICAgICAgICAgIFJOIDEwICAgCitwMTExMDk4ICAgICAgICAgUk4gMTAgICAKK3AxNTE0MTMxMiAgICAgICBSTiAxMCAgIAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfVkVSVAorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX07Ly8gdFZhbCA2IHRvIDkgPSBwU3JjQWJvdmVbMCB0byAxNV0KKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0YWxsIG91dHNpZGUgdGhlIGxvb3AKKworTE9PUF9WRVJUCisgICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIEJORSAgICAgIExPT1BfVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfSE9SCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKKyAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1PViAgICAgIHksICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWwxID0gcFNyY0xlZnRbNCB0byA3XQorICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICMxMiAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyAxMgorICAgICAgIAorTE9PUF9IT1IgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswIHRvIDNdCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzAgdG8gM10gCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs4IHRvIDExXQorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls4IHRvIDExXQorICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCBkc3RTdGVweDIgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzEyIHRvIDE1XQorICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KKyAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNCB0byA3XQorICAgICAgICBCTkUgICAgICBMT09QX0hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMyB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9EQworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIEJFUSAgICAgIFRTVF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCisgICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDksdFZhbDEwLHRWYWwxMX07Ly8gdFZhbCA4IHRvIDExID0gcFNyY0Fib3ZlWzAgdG8gMTVdCisgICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdICsgcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVs3XSkKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOCwgMTBdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTIsIDE0XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXSArIHBTcmNBYm92ZVsxMiwgMTRdCisgICAgICAgIFVYVEIxNiAgIHRWYWwxMCwgdFZhbDEwLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOSwgMTFdCisgICAgICAgIFVYVEIxNiAgIHRWYWwxMSwgdFZhbDExLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTMsIDE1XQorICAgICAgICBVQUREMTYgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXSArIHBTcmNBYm92ZVsxMywgMTVdCisgICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzhdIHRvIHBTcmNBYm92ZVsxNV0pCisgICAgICAgIAorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDIsIExTUiAjMTYgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVsxNV0pCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4dHJhY3QgdGhlIGxvd2VyIGhhbGYgZm9yIHJlc3VsdAorICAgICAgICAKK1RTVF9MRUZUICAgICAgICAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UCisgICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBJbmMgQ291bnRlciBpZiBMZWZ0IGlzIGF2YWlsYWJsZQorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSB0VmFsOCArIHRWYWwxMAorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNworICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNworICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKworVFNUX0NPVU5UICAgICAgICAKKyAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCisgICAgICAgIE1PVkVRICAgIHN1bSwgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSAxMjggaWYoY291bnQgPT0gMCkKKyAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAxKQorICAgICAgICBBRERFUSAgICBzdW0sIHN1bSwgIzggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDggaWYoY291bnQgPT0gMSkKKyAgICAgICAgQURETkUgICAgc3VtLCBzdW0sIHRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bWxlZnQgKyBzdW11cHBlcgorICAgICAgICBBRERORSAgICBzdW0sIHN1bSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDE2IGlmKGNvdW50ID09IDIpCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtLCBzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSBvbmx5IGJ5dGUgcmVzdCBjbGVhcmVkCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTFNSRVEgICAgc3VtLCBzdW0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA0IGlmKGNvdW50ID09IDEpCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTFNSTkUgICAgc3VtLCBzdW0sICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA1IGlmKGNvdW50ID09IDIpCisKK1RTVF9DT1VOVDAKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBPUlIgICAgICBzdW0sIHN1bSwgc3VtLCBMU0wgIzggICAgICAgICAgICAgICA7Ly8gc3VtIHJlcGxpY2F0ZWQgaW4gdHdvIGhhbGZ3b3JkCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgdFZhbDYsIHN1bSwgc3VtLCBMU0wgIzE2ICAgICAgICAgICAgOy8vIHN1bSAgcmVwbGljYXRlZCBpbiBhbGwgYnl0ZXMKKyAgICAgICAgQ1BZICAgICAgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gdFZhbDAKKyAgICAgICAgQ1BZICAgICAgdFZhbDgsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gdFZhbDAKKyAgICAgICAgQ1BZICAgICAgdFZhbDksIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwzID0gdFZhbDAKKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIAorTE9PUF9EQyAgICAgICAgCisgICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIEJORSAgICAgIExPT1BfREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCitPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIFJTQiAgICAgIHRWYWwxNCwgbGVmdFN0ZXAsIGxlZnRTdGVwLCBMU0wgIzQgIDsvLyB0VmFsMTQgPSAxNSpsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgTERSQiAgICAgdFZhbDEwLCBbcFNyY0xlZnQsICB0VmFsMTRdICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQorICAgICAgICBMRFJCICAgICB0VmFsMTEsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBMRFJCICAgICB0VmFsMTIsIFtwU3JjQWJvdmUsICMxNV0KKworICAgICAgICBBREQgICAgICB0VmFsMiwgIHRWYWwxMiwgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gcFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQorICAgICAgICBTVUIgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gVjAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDEyLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTEgPSBIMCA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDIsICAgTFNMICM0ICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSkKKworICAgICAgICBNT1YgICAgIHRWYWwxMSwgdFZhbDExLCBMU0wgIzMgICAgICAgICAgICAgIDsvLyA4KlsxNV0tWy0xXQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMF0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzE0XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgUlNCICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzMgICAgICAgICA7Ly8gNypbMTRdLVswXQorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMV0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEzXQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDYqWzEzXS1bMV0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzJdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMl0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMyICAgICAgICAgOy8vIDUqWzEyXS1bMl0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzNdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMV0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCBMU0wgIzIgICAgICAgOy8vICsgNCpbMTFdLVszXQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNF0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEwXQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gMypbMTBdLVs0XQorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNV0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzldCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMxICAgICAgIDsvLyArIDIqWzldLVs1XQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNl0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzhdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIDEqWzhdLVs2XQorICAgICAgICBBREQgICAgIHRWYWw3LCB0VmFsMTEsIHRWYWw4CisKKyAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMiwgICAjMTYgICAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgKyAxNgorICAgICAgICBNT1YgICAgICB0VmFsMSwgIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgID0gcFNyY0xlZnQKKyAgICAgICAgU1VCICAgICAgdFZhbDksICB0VmFsMTQsICAgbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw5ICA9IDE0KmxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHRWYWw5LCAgcFNyY0xlZnQsIHRWYWw5ICAgICAgICAgICAgIDsvLyB0VmFsOSAgPSBwU3JjTGVmdCArIDE0KmxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTQqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTEgPSBwU3JjTGVmdFswXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgdFZhbDcsICBMU0wgIzIgICAgICA7Ly8gdFZhbDcgID0gNSAqIEgKKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICMzMiAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IDUgKiBIICsgMzIKKyAgICAgICAgU1VCICAgICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCisgICAgICAgIEFTUiAgICAgIHRWYWwxMiwgdFZhbDcsICAjNiAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBiID0gKDUgKiBIICsgMzIpID4+IDYKKyAgICAgICAgCisgICAgICAgIFJTQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsOCwgIExTTCAjMyAgICAgIDsvLyB0VmFsOCAgPSBWMSA9IDcqIChwU3JjTGVmdFsxNCpsZWZ0U3RlcF0tcFNyY0xlZnRbMF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsMTAsIExTTCAjMyAgICAgIDsvLyB0VmFsNiAgPSBWID0gVjAgK1YxCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBSU0IgICAgICB0VmFsNywgIHRWYWwxMiwgIHRWYWwxMiwgIExTTCAjMyAgICA7Ly8gdFZhbDcgID0gNypiCisgICAgICAgIFNVQiAgICAgIHRWYWwyLCAgdFZhbDIsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYgLSA3KmIKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTIqbFNdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSAyICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw3ICA9IDYgKiAocFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMgorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzExKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw3ICA9IDUgKiAocFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFYzCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMyICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNAorICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjMTYgICAgICAgICAgICAgICA7Ly8gdFZhbDUgID0gZHN0U3RlcCAtIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSAzICogKHBTcmNMZWZ0WzEwKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNQorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY2CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNiwgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IDUqVgorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgICMzMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gNSpWICsgMzIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIEFTUiAgICAgIHRWYWwxNCwgdFZhbDYsICAgIzYgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSBjID0gKDUqViArIDMyKT4+NgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgUlNCICAgICAgdFZhbDYsICB0VmFsMTQsICB0VmFsMTQsIExTTCAjMyAgICAgOy8vIHRWYWw2ICA9IDcqYworICAgICAgICBVWFRIICAgICB0VmFsMTQsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEyLCAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMTAgPSAyKmIKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMTQsICB0VmFsMTQsIExTTCAjMTYgICAgOy8vIHRWYWwxNCA9IHtjICAsICBjfQorICAgICAgICBTVUIgICAgICB0VmFsNiwgIHRWYWwyLCAgIHRWYWw2ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gZCA9IGEgLSA3KmIgLSA3KmMgKyAxNgorICAgICAgICBBREQgICAgICB0VmFsMSwgIHRWYWw2LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcHAyID0gZCArIDIqYgorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0zKmIKKyAgICAgICAgT1JSICAgICAgdFZhbDAsICB0VmFsNiwgICB0VmFsMSwgIExTTCAjMTYgICAgOy8vIHR2YWwwICA9IHAycDAgICA9IHBhY2sge3AyLCBwMH0KKyAgICAgICAgVVhUSCAgICAgdFZhbDEyLCB0VmFsMTIgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBVWFRIICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCisgICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDEyLCAgdFZhbDEyLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTIgPSB7YiAgLCAgYn0KKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTAsIExTTCAjMTYgICAgOy8vIHRWYWwxMCA9IHszYiAsIDNifQorICAgICAgICBTQUREMTYgICB0VmFsMSwgIHRWYWwwLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcDNwMSAgID0gcDJwMCAgICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDIsICB0VmFsMSwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHA2cDQgICA9IHAzcDEgICArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDQsICB0VmFsMiwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHA3cDUgICA9IHA2cDQgICArIHtiLGJ9CisgICAgICAgIFNBREQxNiAgIHRWYWw2LCAgdFZhbDQsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBwMTBwOCAgPSBwN3A1ICAgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHRWYWw3LCAgdFZhbDYsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwMTFwOSAgPSBwMTBwOCAgKyB7YixifQorICAgICAgICBTQUREMTYgICB0VmFsOCwgIHRWYWw3LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDggID0gcDE0cDEyID0gcDExcDkgICsgezNiLDNifQorICAgICAgICBTQUREMTYgICB0VmFsOSwgIHRWYWw4LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcDE1cDEzID0gcDE0cDEyICsge2IsYn0KKyAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsICAgICA9TUFTS19DT05TVCAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgorICAgICAgICAKK0xPT1BfUExBTkUgICAgICAgIAorCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAzcDEKKyAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDJwMAorICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAzcDEsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHA3cDUKKyAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDZwNAorICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA3cDUsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxMXA5CisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxMHA4CisgICAgICAgIFNBREQxNiAgIHAxMXA5LCAgcDExcDksICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgcDEwcDgsICBwMTBwOCwgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKKyAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1CisgICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAorICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAorICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDE1cDEzCisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxNHAxMgorICAgICAgICBTQUREMTYgICBwMTVwMTMsIHAxNXAxMywgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAxNHAxMiwgcDE0cDEyLCBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIEFERFMgICAgIHIweDAwRkYwMEZGLCByMHgwMEZGMDBGRiwgIzE8PDI4ICAgICA7Ly8gTG9vcCBjb3VudGVyIHZhbHVlIGluIHRvcCA0IGJpdHMKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBCQ0MgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworICAgICAgICAgICAgCisgICAgICAgIEVORAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKQEAgLTAsMCArMSw1NjcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAorICAgIERDRCAgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IgCisgICAgRENEICBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKKyAgICBEQ0QgIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKKyAgICBEQ0QgIE9NWF9WQ180eDRfSEQsICAgICAgIE9NWF9WQ180eDRfVkwKKyAgICBEQ0QgIE9NWF9WQ180eDRfSFUgICAKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorQkxLX1NJWkUgICAgICAgICAgICAgIEVRVSAweDgKK01VTF9DT05TVDAgICAgICAgICAgICBFUVUgMHgwMTAxMDEwMQorQUREX0NPTlNUMSAgICAgICAgICAgIEVRVSAweDgwODA4MDgwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JldHVybiAgICAgICAgICBSTiAwCitwVGFibGUgICAgICAgICAgUk4gOQorcGMgICAgICAgICAgICAgIFJOIDE1CityMHgwMTAxMDEwMSAgICAgUk4gMQorcjB4ODA4MDgwODAgICAgIFJOIDAKKwordFZhbDAgICAgICAgICAgIFJOIDAKK3RWYWwxICAgICAgICAgICBSTiAxCit0VmFsMiAgICAgICAgICAgUk4gMgordFZhbDQgICAgICAgICAgIFJOIDQKK3RWYWw2ICAgICAgICAgICBSTiA2Cit0VmFsNyAgICAgICAgICAgUk4gNwordFZhbDggICAgICAgICAgIFJOIDgKK3RWYWw5ICAgICAgICAgICBSTiA5Cit0VmFsMTAgICAgICAgICAgUk4gMTAKK3RWYWwxMSAgICAgICAgICBSTiAxMQordFZhbDEyICAgICAgICAgIFJOIDEyCit0VmFsMTQgICAgICAgICAgUk4gMTQKKworT3V0MCAgICAgICAgICAgIFJOIDYKK091dDEgICAgICAgICAgICBSTiA3CitPdXQyICAgICAgICAgICAgUk4gOAorT3V0MyAgICAgICAgICAgIFJOIDkKKworTGVmdDAgICAgICAgICAgIFJOIDYKK0xlZnQxICAgICAgICAgICBSTiA3CitMZWZ0MiAgICAgICAgICAgUk4gOAorTGVmdDMgICAgICAgICAgIFJOIDkKKworQWJvdmUwMTIzICAgICAgIFJOIDEyCitBYm92ZTQ1NjcgICAgICAgUk4gMTQKKworQWJvdmVMZWZ0ICAgICAgIFJOIDEwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCitPTVhfVkNfNHg0X1ZFUlQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFswICB0byAzXSAgPSBBYm92ZTAxMjMKKyAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbNCAgdG8gN10gID0gQWJvdmUwMTIzCisgICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzggIHRvIDExXSA9IEFib3ZlMDEyMworICAgICAgICBTVFIgICAgICBBYm92ZTAxMjMsICBbcERzdF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMiB0byAxNV0gPSBBYm92ZTAxMjMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitPTVhfVkNfNHg0X0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgTGVmdDAsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIE91dDEsICAgTGVmdDEsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIE91dDIsICAgTGVmdDIsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdIAorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9IGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfREMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02CisgICAgICAgIAorICAgICAgICBBTkQgICAgICBhdmFpbGFiaWxpdHksICBhdmFpbGFiaWxpdHksICAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKQorICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKQorICAgICAgICBCTkUgICAgICBVcHBlck9yTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgYm90aAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIHRWYWwxMSwgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KKyAgICAgICAgQUREICAgICAgdFZhbDExLCB0VmFsMTEsICBMU1IgIzE2ICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBVWFRIICAgICB0VmFsMTEsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgQUREICAgICAgdFZhbDYsICBMZWZ0MCwgIExlZnQxICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gTGVmdDAgKyBMZWZ0MQorICAgICAgICBBREQgICAgICB0VmFsNywgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBMZWZ0MiArIExlZnQzCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWw2ICsgdFZhbDcKKyAgICAgICAgQUREICAgICAgT3V0MCwgICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIE91dDAgID0gdFZhbDYgKyB0VmFsMTEgICAKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICM0ICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDQKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgTFNSICMzICAgICAgICAgICAgICAgOy8vIE91dDAgPSAoT3V0MCArIDQpPj4zCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitVcHBlck9yTGVmdE9yTm9uZUF2YWlsYWJsZQorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIEJORSAgICAgIExlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgID0gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgUk9SICM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgT3V0MCwgICB0VmFsNiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMxNiAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgT3V0MCwgICBPdXQwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjMiAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyAyCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMiAgICAgICAgICAgICAgOy8vIE91dDAgID0gKE91dDAgKyAyKT4+MgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCAgdG8gNyBdIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIAorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJORSAgICAgIE5vbmVBdmFpbGFibGUKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgQUREICAgICAgT3V0MCwgICBMZWZ0MCwgIExlZnQxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gTGVmdDAgKyBMZWZ0MQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIE91dDEsICAgTGVmdDIsICBMZWZ0MyAgICAgICAgICAgICAgIDsvLyBPdXQxICA9IExlZnQyICsgTGVmdDMKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIE91dDEgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCAgKyBPdXQxCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjMiAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyAyCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMiAgICAgICAgICAgICAgOy8vIE91dDAgID0gKE91dDAgKyAyKT4+MgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK05vbmVBdmFpbGFibGUKKyAgICAgICAgTU9WICAgICAgT3V0MCwgICAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dDAgPSAxMjggaWYoY291bnQgPT0gMCkKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz01CisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICByMHgwMTAxMDEwMSAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfRElBR19ETAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBmID0gKGErMipiK2MrMik+PjIKKyAgICAgICAgOy8vIENhbGN1bGF0ZSBhczoKKyAgICAgICAgOy8vIGQgPSAoYSArIGMgKT4+MQorICAgICAgICA7Ly8gZSA9IChkIC0gYicpPj4xCisgICAgICAgIDsvLyBmID0gZSArIDEyOAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCAge0Fib3ZlMDEyMywgQWJvdmU0NTY3fSAgOy8vIEFib3ZlMDEyMywgQWJvdmU0NTY3ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgQk5FICAgICAgRExVcHBlclJpZ2h0QXZhaWxhYmxlCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1PViAgICAgIHRWYWw3LCAgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB7MDAsICAwMCwgIDAwLCAgVTMgfQorICAgICAgICBNT1YgICAgICB0VmFsMTEsIHRWYWw3LCAgTFNMICMyNCAgICAgICAgICAgICA7Ly8ge1UzLCAgMDAsICAwMCwgIDAwIH0KKyAgICAgICAgTVVMICAgICAgT3V0MywgICB0VmFsNywgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHtVMywgIFUzLCAgVTMsICBVMyB9IAorICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMTYgICAgICAgICA7Ly8gezAwLCAgMDAsICBVMywgIFUyIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHswMCwgIFUzLCAgVTIsICBVMSB9CisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB7MDAnLCBVMycsIFUyJywgVTEnfQorICAgICAgICBVSEFERDggICB0VmFsOCwgIHRWYWw4LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBkMSwgIGQwIH0KKyAgICAgICAgVUhBREQ4ICAgdFZhbDYsICBBYm92ZTAxMjMsICB0VmFsOSAgICAgICAgICAgOy8vIHt4eCwgIGQyLCAgeHgsICB4eCB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7eHgsICB4eCwgIGUxLCAgZTAgfQorICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgZTIsICB4eCwgIHh4IH0KKyAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZjEsICBmMCB9CisgICAgICAgIFVBREQ4ICAgIHRWYWw2LCAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICBmMiwgIHh4LCAgeHggfQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsNiAgICAgICAgICAgICAgIDsvLyB7eHgsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICBCSUMgICAgICB0VmFsNiwgIHRWYWw2LCAgIzB4RkYwMDAwMDAgICAgICAgICA7Ly8gezAwLCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHtVMywgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICAgT3V0MSwgICBPdXQzLCAgIE91dDAsICBBU1IgIzggICAgICAgOy8vIHtVMywgIFUzLCAgZjIsICBmMSB9CisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgUEtIVEIgICAgT3V0MiwgICBPdXQzLCAgIE91dDEsICBBU1IgIzggICAgICAgOy8vIHtVMywgIFUzLCAgVTMsICBmMiB9CisgICAgICAgIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YzIHRvIGYwfSBhdCBwRHN0WzMgIHRvIDAgXQorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y0IHRvIGYxfSBhdCBwRHN0WzcgIHRvIDQgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y1IHRvIGYyfSBhdCBwRHN0WzExIHRvIDggXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y2IHRvIGYzfSBhdCBwRFN0WzE1IHRvIDEyXQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworRExVcHBlclJpZ2h0QXZhaWxhYmxlICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB7MDAsICAwMCwgIDAwLCAgVTMgfQorICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMywgIExTUiAjMTYgICAgICAgICA7Ly8gezAwLCAgMDAsICBVMywgIFUyIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHswMCwgIFUzLCAgVTIsICBVMSB9CisgICAgICAgIE9SUiAgICAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZTQ1NjcsIExTTCAjOCAgIDsvLyB7VTYsICBVNSwgIFU0LCAgVTMgfQorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgQWJvdmU0NTY3LCBMU0wgIzI0ICA7Ly8ge1U0LCAgVTMsICBVMiwgIFUxIH0KKyAgICAgICAgUEtIQlQgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NywgTFNMICMxNiAgOy8vIHtVNSwgIFU0LCAgVTMsICBVMiB9CisgICAgICAgIE1WTiAgICAgIHRWYWwxLCAgdFZhbDggICAgICAgICAgICAgICAgICAgICAgIDsvLyB7VTYnLCBVNScsIFU0JywgVTMnfQorICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U0JywgVTMnLCBVMicsIFUxJ30KKyAgICAgICAgTVZOICAgICAgdFZhbDIsICBBYm92ZTQ1NjcgICAgICAgICAgICAgICAgICAgOy8vIHtVNycsIFU2JywgVTUnLCBVNCd9CisgICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7ZDMsICBkMiwgIGQxLCAgZDAgfQorICAgICAgICBVSEFERDggICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3ICAgICAgICAgICA7Ly8ge2Q1LCAgZDQsICBkMywgIGQyIH0KKyAgICAgICAgVUhBREQ4ICAgdFZhbDgsICBBYm92ZTQ1NjcsICB0VmFsOCAgICAgICAgICAgOy8vIHtkNiwgIHh4LCAgeHgsICB4eCB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7ZTMsICBlMiwgIGUxLCAgZTAgfQorICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWw5LCAgdFZhbDEgICAgICAgICAgICAgICA7Ly8ge2U1LCAgZTQsICBlMywgIGUyIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHtlNiwgIHh4LCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjMsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICBVQUREOCAgICB0VmFsOSwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2Y2LCAgeHgsICB4eCwgIHh4IH0KKyAgICAgICAgVUFERDggICAgT3V0MiwgICB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNSwgIGY0LCAgZjMsICBmMiB9CisgICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU1IgIzggICAgICAgICAgICAgIDsvLyB7MDAsICBmMywgIGYyLCAgZjEgfQorICAgICAgICBBTkQgICAgICB0VmFsOSwgIHRWYWw5LCAgIzB4RkYwMDAwMDAgICAgICAgICA7Ly8ge2Y2LCAgMDAsICAwMCwgIDAwIH0KKyAgICAgICAgUEtIQlQgICAgT3V0MSwgICB0VmFsNywgIE91dDIsICBMU0wgIzggICAgICAgOy8vIHtmNCwgIGYzLCAgZjIsICBmMSB9CisgICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICBPdXQyLCAgTFNSICM4ICAgICAgIDsvLyB7ZjYsICBmNSwgIGY0LCAgZjMgfQorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YzIHRvIGYwfSBhdCBwRHN0WzMgIHRvIDAgXQorICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y0IHRvIGYxfSBhdCBwRHN0WzcgIHRvIDQgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y1IHRvIGYyfSBhdCBwRHN0WzExIHRvIDggXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y2IHRvIGYzfSBhdCBwRFN0WzE1IHRvIDEyXQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKKworT01YX1ZDXzR4NF9ESUFHX0RSCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IHBTcmNBYm92ZUxlZnRbMF0KKyAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MSwgIExlZnQwLCAgTFNMICM4ICAgICAgOy8vIHRWYWw3ID0gMDAgMDAgTDAgTDEKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCA9QUREX0NPTlNUMSAgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWw4LCAgTGVmdDMsICBMZWZ0MiwgIExTTCAjOCAgICAgIDsvLyB0VmFsOCA9IDAwIDAwIEwyIEwzCisgICAgICAgIFBLSEJUICAgIHRWYWw3LCAgdFZhbDgsICB0VmFsNywgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IEwwIEwxIEwyIEwzCisgICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsOCA9IFUyIFUxIFUwIDAwCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgdFZhbDcsICBMU1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIEwwIEwxIEwyCisgICAgICAgIE9SUiAgICAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZUxlZnQgICAgICAgICAgIDsvLyB0VmFsOCA9IFUyIFUxIFUwIFVMCisgICAgICAgIE9SUiAgICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZUxlZnQsIExTTCAjMjQgIDsvLyB0VmFsOSA9IFVMIEwwIEwxIEwyCisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNMICMyNCAgICAgICAgIDsvLyB0VmFsMTA9IFUwIDAwIDAwIDAwCisgICAgICAgIFVYVEIgICAgIHRWYWwxMSwgdFZhbDcsICBST1IgIzI0ICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIDAwIEwwCisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSwgIExTUiAjOCAgICAgIDsvLyB0VmFsMTA9IFUwIFVMIEwwIEwxCisgICAgICAgIE9SUiAgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgIExTTCAjOCAgICAgIDsvLyB0VmFsMTE9IFUxIFUwIFVMIEwwCisgICAgICAgIFVIQUREOCAgIHRWYWwxMSwgQWJvdmUwMTIzLCAgdFZhbDExICAgICAgICAgIDsvLyB0VmFsMTE9IGQxIGQwIGRMIGcwCisgICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDcsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGcwIGcxIGcyIGczCisgICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDggICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IFUyJ1UxJ1UwJ1VMJworICAgICAgICBNVk4gICAgICB0VmFsOSwgIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBVTCdMMCdMMSdMMicKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gZTEgZTAgZUwgaDAKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWw5ICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gaDAgaDEgaDIgaDMKKyAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsMTAsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDMgID0gaTAgaTEgaTIgaTMKKyAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDAgID0gZjEgZjAgZkwgaTAKKyAgICAgICAgVVhUSCAgICAgdFZhbDExLCBPdXQzLCAgIFJPUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgaTEgaTIKKyAgICAgICAgTU9WICAgICAgdFZhbDcsICBPdXQwLCAgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gZjAgZkwgaTAgMDAKKyAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsNywgIHRWYWwxMSwgIExTUiAjOCAgICAgOy8vIE91dDEgID0gZjAgZkwgaTAgaTEKKyAgICAgICAgUEtIQlQgICAgT3V0MiwgICB0VmFsMTEsIE91dDAsICAgIExTTCAjMTYgICAgOy8vIE91dDIgID0gZkwgaTAgaTEgaTIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMSB0byBpMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMCB0byBpMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmTCB0byBpMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMCB0byBpM30gYXQgcERzdFsxNSB0byAxMl0gCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitPTVhfVkNfNHg0X1ZSCisKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAorICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsICBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gMDAgMDAgMDAgVUwKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwICAgICA9IDAwIDAwIDAwIEwwCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSAgICAgPSAwMCAwMCAwMCBMMQorICAgICAgICBMRFJCICAgICBMZWZ0MiwgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDIgICAgID0gMDAgMDAgMDAgTDIKKyAgICAgICAgTU9WICAgICAgdFZhbDAsICBBYm92ZTAxMjMsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWwwICAgICA9IFUyIFUxIFUwIDAwCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBVMyBVMiBVMSBVMCAKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMCwgICBBYm92ZUxlZnQgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUyIFUxIFUwIFVMCisgICAgICAgIE1WTiAgICAgIHRWYWwxMSwgdFZhbDE0ICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTEgICAgPSBVMidVMSdVMCdVTCcKKyAgICAgICAgTU9WICAgICAgdFZhbDIsICB0VmFsMTQsICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIDAwCisgICAgICAgIFVIU1VCOCAgIHRWYWwxLCAgQWJvdmUwMTIzLCAgdFZhbDExICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBkMiBkMSBkMCBkTAorICAgICAgICBVSEFERDggICB0VmFsMTAsIEFib3ZlTGVmdCwgTGVmdDEgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gMDAgMDAgMDAgajEgICAgICAgCisgICAgICAgIE1WTiAgICAgIHRWYWw0LCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBMMCcKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsMTAsICB0VmFsNCAgICAgICAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIGsxCisgICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDAsICAgTGVmdDAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgICAgPSBVMiBVMSBVMCBMMAorICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwyLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEgVTAgVUwgTDAKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCB0VmFsOSwgICB0VmFsMTQgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGczIGcyIGcxIGcwCisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDEsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQwICAgICAgPSBlMiBlMSBlMCBlTAorICAgICAgICBVSFNVQjggICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gaDMgaDIgaDEgaDAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtlMiB0byBlTH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTU9WICAgICAgdFZhbDEsICB0VmFsMTQsICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IFUwIFVMIEwwIDAwCisgICAgICAgIE1PViAgICAgIHRWYWw2LCAgT3V0MCwgICAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsNiAgICAgPSBlMSBlMCBlTCAwMAorICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWwyLCAgIExlZnQxICAgICAgICAgICAgICA7Ly8gdFZhbDIgICAgID0gVTEgVTAgVUwgTDEKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIGwxICAgICAgICAKKyAgICAgICAgVUFERDggICAgT3V0MSwgICB0VmFsMTAsICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDEgICAgICA9IGkzIGkyIGkxIGkwCisgICAgICAgIE1WTiAgICAgIHRWYWwyLCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMSdVMCdVTCdMMScKKyAgICAgICAgT1JSICAgICAgdFZhbDEsICB0VmFsMSwgICBMZWZ0MiAgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IFUwIFVMIEwwIEwyCisgICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDYsICAgdFZhbDQgICAgICAgICAgICAgIDsvLyBPdXQyICAgICAgPSBlMSBlMCBlTCBsMQorICAgICAgICBVSEFERDggICB0VmFsMSwgIHRWYWwxLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZzIgZzEgZzAgajIKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtpMyB0byBpMH0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtlMSB0byBsMX0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDksICB0VmFsMSwgICB0VmFsMiAgICAgICAgICAgICAgOy8vIHRWYWw5ICAgICA9IGgyIGgxIGgwIGsyCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDksICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQzICAgICAgPSBpMiBpMSBpMCBsMgorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2kyIHRvIGwyfSBhdCBwRHN0WzE1IHRvIDEyXSAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9IRAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAorICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsICBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gMDAgMDAgMDAgVUwKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gMDAgMDAgMDAgTDAKKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gMDAgMDAgMDAgTDEKKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gMDAgMDAgMDAgTDIKKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gMDAgMDAgMDAgTDMKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICBBYm92ZUxlZnQsIEFib3ZlMDEyMywgTFNMICM4Oy8vIHRWYWwyID0gVTIgVTEgVTAgVUwKKyAgICAgICAgTVZOICAgICAgdFZhbDEsICBMZWZ0MCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgTDAnCisgICAgICAgIE9SUiAgICAgIHRWYWw0LCAgTGVmdDAsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyB0VmFsNCA9IFUxIFUwIFVMIEwwCisgICAgICAgIE1WTiAgICAgIHRWYWwyLCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IFUyJ1UxJ1UwJ1VMJworICAgICAgICBVSEFERDggICB0VmFsNCwgIHRWYWw0LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDQgPSBnMyBnMiBnMSBnMAorICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlTGVmdCwgIHRWYWwxICAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBkTAorICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWw0LCAgdFZhbDIgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBoMyBoMiBoMSBoMAorICAgICAgICBVQUREOCAgICB0VmFsMSwgIHRWYWwxLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBlTAorICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDQgPSBpMyBpMiBpMSBpMAorICAgICAgICBPUlIgICAgICB0VmFsMiwgIExlZnQwLCAgQWJvdmVMZWZ0LCAgTFNMICMxNiA7Ly8gdFZhbDIgPSAwMCBVTCAwMCBMMAorICAgICAgICBNT1YgICAgICB0VmFsNCwgIHRWYWw0LCAgTFNMICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMiBpMSBpMCAwMAorICAgICAgICBPUlIgICAgICB0VmFsMTEsIExlZnQxLCAgTGVmdDAsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDExPSAwMCBMMCAwMCBMMQorICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQyLCAgTGVmdDEsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSAwMCBMMSAwMCBMMgorICAgICAgICBPUlIgICAgICB0VmFsMTAsIExlZnQzLCAgTGVmdDIsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDEwPSAwMCBMMiAwMCBMMworICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw0LCAgdFZhbDEgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBpMiBpMSBpMCBlTAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0gCisgICAgICAgIE1PViAgICAgIHRWYWw0LCAgT3V0MCwgICBMU0wgIzE2ICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGkxIGkwIDAwIDAwCisgICAgICAgIFVIQUREOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGoxIDAwIGoyCisgICAgICAgIFVIQUREOCAgIHRWYWw2LCAgdFZhbDExLCB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGoyIDAwIGozCisgICAgICAgIE1WTiAgICAgIHRWYWwxMiwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIEwwJzAwIEwxJworICAgICAgICBNVk4gICAgICB0VmFsMTQsIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSAwMCBMMScwMCBMMicKKyAgICAgICAgVUhTVUI4ICAgdFZhbDIsICB0VmFsMiwgIHRWYWwxMiAgICAgICAgICAgICAgOy8vIHRWYWwyID0gMDAgazEgMDAgazIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsNywgIHRWYWwxMiAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZDEgMDAgZDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsNiwgIHRWYWwxNCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgazIgMDAgazMKKyAgICAgICAgVUhTVUI4ICAgdFZhbDksICB0VmFsMTAsIHRWYWwxNCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgZDIgMDAgZDMKKyAgICAgICAgVUFERDggICAgdFZhbDIsICB0VmFsMiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwyID0gMDAgbDEgMDAgbDIKKyAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTEgMDAgZTIKKyAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgbDIgMDAgbDMKKyAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw5ID0gMDAgZTIgMDAgZTMKKyAgICAgICAgT1JSICAgICAgT3V0MiwgICB0VmFsOCwgIHRWYWwyLCAgTFNMICM4ICAgICAgOy8vIE91dDIgID0gbDEgZTEgbDIgZTIKKyAgICAgICAgT1JSICAgICAgT3V0MywgICB0VmFsOSwgIHRWYWwxMSwgTFNMICM4ICAgICAgOy8vIE91dDMgID0gbDIgZTIgbDMgZTMKKyAgICAgICAgUEtIVEIgICAgT3V0MSwgICB0VmFsNCwgIE91dDIsICAgQVNSICMxNiAgICAgOy8vIE91dDEgID0gaTEgaTAgbDEgZTEKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSAgYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gIGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9ICBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9WTAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwge0Fib3ZlMDEyMywgQWJvdmU0NTY3fSAgIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNT1YgICAgICB0VmFsMTEsIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBVMworICAgICAgICBNVUxFUSAgICBBYm92ZTQ1NjcsIHRWYWwxMSwgcjB4MDEwMTAxMDEgICAgICA7Ly8gQWJvdmU0NTY3ID0gVTMgVTMgVTMgVTMKKyAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHRWYWw5ID0gMDAgVTMgVTIgVTEKKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gVTMnVTInVTEnVTAnCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgdFZhbDksICBBYm92ZTQ1NjcsICBMU0wgIzI0IDsvLyB0VmFsMiA9IFU0IFUzIFUyIFUxCisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDIsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGQ0IGQzIGQyIGQxCisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwID0gZTQgZTMgZTIgZTEKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgdFZhbDksICBMU1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIDAwIFUzIFUyCisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmU0NTY3LCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMTA9IFU2IFU1IFU0IDAwCisgICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB0VmFsOSA9IFU1IFU0IFUzIFUyCisgICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFU2IFU1IFU0IFUzCisgICAgICAgIFVIQUREOCAgIHRWYWwxMSwgdFZhbDksICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB0VmFsMTE9IGc1IGc0IGczIGcyCisgICAgICAgIFVIQUREOCAgIHRWYWwxNCwgdFZhbDIsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTQ9IGc2IGc1IGc0IGczCisgICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IFU0J1UzJ1UyJ1UxJworICAgICAgICBNVk4gICAgICB0VmFsNywgIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBVNSdVNCdVMydVMicKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gZDUgZDQgZDMgZDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gaDUgaDQgaDMgaDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDIsICB0VmFsMTQsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gaDYgaDUgaDQgaDMKKyAgICAgICAgVUFERDggICAgT3V0MSwgICB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDEgID0gaTUgaTQgaTMgaTIKKyAgICAgICAgVUFERDggICAgT3V0MiwgICB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDIgID0gZTUgZTQgZTMgZTIKKyAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsMiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDMgID0gaTYgaTUgaTQgaTMKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgTV9TVFIgICAgT3V0MywgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0hVCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgTU9WICAgICAgcjB4ODA4MDgwODAsICByMHgwMTAxMDEwMSwgTFNMICM3ICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgT1JSICAgICAgdFZhbDYsICBMZWZ0MCwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw2ID0gMDAgTDEgMDAgTDAKKyAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MSwgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDIgMDAgTDEKKyAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MiwgIExlZnQzLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDMgMDAgTDIKKyAgICAgICAgTVVMICAgICAgT3V0MywgICBMZWZ0MywgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIE91dDMgID0gTDMgTDMgTDMgTDMKKyAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gMDAgTDInMDAgTDEnCisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IDAwIEwzJzAwIEwyJworICAgICAgICBVSEFERDggICB0VmFsNCwgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBnMyAwMCBnMgorICAgICAgICBVWFRCMTYgICB0VmFsMTIsIE91dDMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMyAwMCBMMworICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWw0LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBoMyAwMCBoMgorICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSAwMCBkMiAwMCBkMQorICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBkMyAwMCBkMgorICAgICAgICBVSEFERDggICB0VmFsMTIsIHRWYWwxMiwgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBnNCAwMCBnMworICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBpMyAwMCBpMgorICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWwxMiwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBoNCAwMCBoMworICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBlMiAwMCBlMQorICAgICAgICBVQUREOCAgICB0VmFsMTEsIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBlMyAwMCBlMgorICAgICAgICBVQUREOCAgICB0VmFsMTIsIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBpNCAwMCBpMworICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw4LCAgdFZhbDQsICBMU0wgIzggICAgICA7Ly8gT3V0MCAgPSBpMyBlMiBpMiBlMQorICAgICAgICBPUlIgICAgICBPdXQxLCAgIHRWYWwxMSwgdFZhbDEyLCBMU0wgIzggICAgICA7Ly8gT3V0MSAgPSBpNCBlMyBpMyBlMgorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgUEtIVEIgICAgT3V0MiwgICBPdXQzLCAgIE91dDEsICAgQVNSICMxNiAgICAgOy8vIE91dDIgID0gTDMgTDMgaTQgZTMKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSAgYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gIGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9ICBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKworICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1OTdhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSwxMjggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgCisKKyAgICBJRiBBUk0xMTM2SlMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgIFJOIDAKK3BEc3QgICAgICAgIFJOIDEKK1FQICAgICAgICAgIFJOIDIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBVbnBhY2syeDIgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyYyAgICAgICAgUk4gOQorVmFsdWUgICAgICAgUk4gNAorVmFsdWUyICAgICAgUk4gNQorRmxhZyAgICAgICAgUk4gNgorc3RyT2Zmc2V0ICAgUk4gNworY3N0T2Zmc2V0ICAgUk4gOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityMHcwICAgICAgICBSTiAgMworcjB3MSAgICAgICAgUk4gIDQKKworYzB3MCAgICAgICAgUk4gIDUKK2MxdzAgICAgICAgIFJOICA2CisKK3JldHVybiAgICAgIFJOICAwCitwUVBEaXZUYWJsZSBSTiAgNQorcFFQTW9kVGFibGUgICAgUk4gIDYKK1NoaWZ0ICAgICAgICBSTiAgOQorU2NhbGUgICAgICAgIFJOICAyCisKK1RlbXAxICAgICAgIFJOICAzCitUZW1wMiAgICAgICBSTiAgNAorVGVtcDMgICAgICAgUk4gIDcKK1RlbXA0ICAgICAgIFJOICA4CisKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIHI5CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG8gYmUgdXNlZCBpbiB0aGUgbG9vcCwgdG8gY29tcHV0ZSBvZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIE1PViAgICAgIFZhbHVlMiwgICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKKyAgICAgICAgCisKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MKKyAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKKyAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKKyAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQorICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+CisgICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwRHN0LCB7cjB3MCwgcjB3MX0gICAgICAgICAgICAgICAgICA7Ly8gcjB3MCA9IHxjMXxjMHwgJiByMHcxID0gfGMzfGMyfAorCisKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFIgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgU0FERFNVQlggcjB3MCwgcjB3MCwgIHIwdzAgICAgICAgICAgICAgICAgICAgOy8vIFsgYzAwK2MwMSwgYzAwLWMwMSBdCisgICAgICAgIFNBRERTVUJYIHIwdzEsIHIwdzEsICByMHcxICAgICAgICAgICAgICAgICAgIDsvLyBbIGMxMCtjMTEsIGMxMC1jMTEgXQorICAgICAgICAKKyAgICAgICAgTERSU0IgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIExEUlNCICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgYzB3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwK2QxMCwgZDAxK2QxMSBdCisgICAgICAgIFNTVUIxNiAgIGMxdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMC1kMTAsIGQwMS1kMTEgXQorICAgICAgICAKKyAgICAgICAgTFNMICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgIFRlbXAyLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZQorICAgICAgICBTTVVMVEIgICBUZW1wNCwgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUKKyAgICAgICAgU01VTEJCICAgVGVtcDEsIGMwdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlCisgICAgICAgIFNNVUxCQiAgIFRlbXAzLCBjMXcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZQorICAgICAgICBNT1YgICAgICBUZW1wMiwgVGVtcDIsIEFTUiAjMSAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUZW1wMiA+PiAxICYgVGVtcDEgPSAoVGVtcDEgPj4gMSkgPDwgMTYKKyAgICAgICAgTU9WICAgICAgVGVtcDQsIFRlbXA0LCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVGVtcDQgPj4gMSAmIFRlbXAzID0gKFRlbXAzID4+IDEpIDw8IDE2CisgICAgICAgIFBLSEJUICAgIGMwdzAsICBUZW1wMiwgVGVtcDEsIExTTCAjMTUgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDEgfCBUZW1wMiB8CisgICAgICAgIFBLSEJUICAgIGMxdzAsICBUZW1wNCwgVGVtcDMsIExTTCAjMTUgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDMgfCBUZW1wNCB8CisgICAgICAgIFNUTUlBICAgIHBEc3QsIHtjMHcwLCBjMXcwfSAgICAgICAgICAgICAgICAgIDsvLyBTdG9yaW5nIGFsbCB0aGUgY29lZmZpY2llbnRzIGF0IG9uY2UKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczY2FlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDQ2OSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCis7Ly8gCis7Ly8gCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIEltcG9ydC9FeHBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tL3RvIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0IAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgIAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKUyAKKworCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BEYXRhICAgICAgICAgICAgICAgUk4gIDAKK1FQICAgICAgICAgICAgICAgICAgUk4gIDEKKworOy8vT3V0cHV0IFJlZ2lzdGVycworCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCisKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitpbjAwICAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMF0gJiBTcmNbMV0gCitpbjAyICAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMl0gJiBTcmNbM10KK2luMTAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s0XSAmIFNyY1s1XQoraW4xMiAgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzZdICYgU3JjWzddCitpbjIwICAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbOF0gJiBTcmNbOV0KK2luMjIgICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMF0gJiBTcmNbMTFdCitpbjMwICAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTJdICYgU3JjWzEzXQoraW4zMiAgICAgICAgICAgICAgICBSTiAgOSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzE0XSAmIFNyY1sxNV0KKworOy8vIFRyYW5zcG9zZSBmb3IgUm93IG9wZXJhdGlvbnMgKFJvd3MgdG8gY29scykKK3RyUm93MDAgICAgICAgICAgICAgUk4gIDIKK3RyUm93MTAgICAgICAgICAgICAgUk4gIDEwCit0clJvdzAyICAgICAgICAgICAgIFJOICAzCit0clJvdzEyICAgICAgICAgICAgIFJOICA1Cit0clJvdzIwICAgICAgICAgICAgIFJOICAxMQordHJSb3czMCAgICAgICAgICAgICBSTiAgMTIKK3RyUm93MzIgICAgICAgICAgICAgUk4gIDE0Cit0clJvdzIyICAgICAgICAgICAgIFJOICA3CisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCityb3dTdW0xICAgICAgICAgICAgIFJOICA0Cityb3dTdW0yICAgICAgICAgICAgIFJOICA2Cityb3dEaWZmMSAgICAgICAgICAgIFJOICA4Cityb3dEaWZmMiAgICAgICAgICAgIFJOICA5CisKKworOy8vIFJvdyBvcGVyYXRlZCBwaXhlbHMKK3Jvd09wMDAgICAgICAgICAgICAgUk4gIDIKK3Jvd09wMTAgICAgICAgICAgICAgUk4gIDEwCityb3dPcDIwICAgICAgICAgICAgIFJOICAxMQorcm93T3AzMCAgICAgICAgICAgICBSTiAgMTIKK3Jvd09wMDIgICAgICAgICAgICAgUk4gIDMKK3Jvd09wMTIgICAgICAgICAgICAgUk4gIDUKK3Jvd09wMjIgICAgICAgICAgICAgUk4gIDcKK3Jvd09wMzIgICAgICAgICAgICAgUk4gIDE0CisKKzsvLyBUcmFuc3Bvc2UgZm9yIGNvbHVsbW4gb3BlcmF0aW9ucwordHJDb2wwMCAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICAKK3RyQ29sMDIgICAgICAgICAgICAgUk4gIDMgICAgICAgICAgICAgICAgICAgCit0ckNvbDEwICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAordHJDb2wxMiAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICAKK3RyQ29sMjAgICAgICAgICAgICAgUk4gIDYgICAgICAgICAgICAgICAgICAgCit0ckNvbDIyICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIAordHJDb2wzMCAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzIgICAgICAgICAgICAgUk4gIDkgIAorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworY29sU3VtMSAgICAgICAgICAgICBSTiAgMTAKK2NvbFN1bTIgICAgICAgICAgICAgUk4gIDExCitjb2xEaWZmMSAgICAgICAgICAgIFJOICAxMgorY29sRGlmZjIgICAgICAgICAgICBSTiAgMTQKKworCis7Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKK2NvbE9wMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCitjb2xPcDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAorY29sT3AxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK2NvbE9wMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCitjb2xPcDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAorY29sT3AyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK2NvbE9wMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCitjb2xPcDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIFRlbXBvcmFyeSBzY3JhdGNoIHZhcmFpYmxlcworcFFQRGl2VGFibGUgICAgICAgICBSTiAgMAorcFFQTW9kVGFibGUgICAgICAgICBSTiAgMTEKK1NoaWZ0ICAgICAgICAgICAgICAgUk4gIDEwCitTY2FsZSAgICAgICAgICAgICAgIFJOICAxNAorUm91bmQgICAgICAgICAgICAgICBSTiAgMAorCit0ZW1wMSAgICAgICAgICAgICAgIFJOICAxMAordGVtcDIgICAgICAgICAgICAgICAgUk4gIDExCit0ZW1wMyAgICAgICAgICAgICAgIFJOICAxMgordGVtcDQgICAgICAgICAgICAgICBSTiAgMQorCisKKworOy8vIEludlRyYW5zZm9ybWVkIGFuZCBEZXF1YW50aXplZCBwaXhlbHMKK291dDAwICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCitvdXQwMiAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAorb3V0MTAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK291dDEyICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCitvdXQyMCAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAorb3V0MjIgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK291dDMwICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCitvdXQzMiAgICAgICAgICAgICAgIFJOICA5ICAKKyAgICAgIAorICAgICAgICAKKworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M0ICAgIHBEYXRhT25TdGFjaywgNAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NCxyMTEKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRoZSBzdHJhdGVneSB1c2VkIGluIGltcGxlbWVudGluZyB0aGUgdHJhbnNmb3JtIGlzIGFzIGZvbGxvd3M6KgorICAgICAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gOCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSByb3cgb3BlcmF0aW9ucyAob24gY29sdW1ucykgdXNpbmcgU0lNRCAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICA7Ly8gU3RvcmUgdGhlIDR4NCBibG9jayBhdCBvbmUgZ28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICAKKyAgICAgICAgTERNSUEgICBwRGF0YSx7aW4wMCxpbjAyLGluMTAsaW4xMixpbjIwLGluMjIsaW4zMCxpbjMyfQorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIG1hdHJpeCBpbm9yZGVyIHRvIHBlcmZvcm0gcm93IG9wcyBhcyBjb2xvdW1uIG9wcworICAgICAgICA7Ly8gSW5wdXQ6ICAgaW5bXVtdID0gb3JpZ2luYWwgbWF0cml4CisgICAgICAgIDsvLyBPdXRwdXQ6ICB0clJvd1tdW109IHRyYW5zcG9zZWQgbWF0cml4CisgICAgICAgIDsvLyBTdGVwMTogT2J0YWluIHRoZSBMTCBwYXJ0IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeAorICAgICAgICA7Ly8gU3RlcDI6IE9idGFpbiB0aGUgSEwgcGFydAorICAgICAgICA7Ly8gc3RlcDM6IE9idGFpbiB0aGUgTEggcGFydAorICAgICAgICA7Ly8gU3RlcDQ6IE9idGFpbiB0aGUgSEggcGFydAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIGQwIGQxIC0gLQorICAgICAgICA7Ly8gICBkNCBkNSAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEwLGluMTAsaW4wMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXSAgICAKKyAgICAgICAgUEtIQlQgICB0clJvdzAwLGluMDAsaW4xMCxMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCisgICAgICAgIAorICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KKyAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBQS0hUQiAgIHRyUm93MzAsaW4xMixpbjAyLEFTUiAjMTYgICAgICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJSb3cyMCxpbjAyLGluMTIsTFNMICMxNiAgICAgICAgICAgICAgOy8vIFs5IDhdID0gWzYgMl0gCisgICAgICAgIAorICAgICAgICA7Ly8gTEggMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICAtIC0gZDIgZDMgCisgICAgICAgIDsvLyAgIC0gLSBkNiBkNyAKKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgOy8vICAgLSAtIC0gIC0KKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMixpbjIwLGluMzAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKKyAgICAgICAgUEtIVEIgICB0clJvdzEyLGluMzAsaW4yMCxBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyUm93MzIsaW4zMixpbjIyLEFTUiAjMTYgICAgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0clJvdzIyLGluMjIsaW4zMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAwLHRyUm93MTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIwLHRyUm93MzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMCxyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMCxyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICBTQUREMTYgICAgICByb3dTdW0xLHRyUm93MDIsdHJSb3cxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQorICAgICAgICBTQUREMTYgICAgICByb3dTdW0yLHRyUm93MjIsdHJSb3czMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQorICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQorICAgICAgICBTU1VCMTYgICAgICByb3dEaWZmMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQorICAgICAgICBTQUREMTYgICAgICByb3dPcDAyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQorICAgICAgICBTU1VCMTYgICAgICByb3dPcDEyLHJvd1N1bTEscm93U3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQorICAgICAgICBTU1VCMTYgICAgICByb3dPcDIyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQorICAgICAgICBTQUREMTYgICAgICByb3dPcDMyLHJvd0RpZmYxLHJvd0RpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7Ly8gSW5wdXQ6ICByb3dPcFtdW10KKyAgICAgICAgOy8vIE91dHB1dDogdHJDb2xbXVtdIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIGQwIGQxIC0gLQorICAgICAgICA7Ly8gICBkNCBkNSAtIC0KKyAgICAgICAgOy8vICAgLSAgLSAgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDEwLHJvd09wMTAscm93T3AwMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdCisgICAgICAgIFBLSEJUICAgdHJDb2wwMCxyb3dPcDAwLHJvd09wMTAsTFNMICMxNiAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCisgICAgICAgIAorICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KKyAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBQS0hUQiAgIHRyQ29sMzAscm93T3AxMixyb3dPcDAyLEFTUiAjMTYgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQorICAgICAgICAgUEtIQlQgICB0ckNvbDIwLHJvd09wMDIscm93T3AxMixMU0wgIzE2ICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAorICAgICAgICAKKyAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgLSAtIGQyIGQzIAorICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHRyQ29sMDIscm93T3AyMCxyb3dPcDMwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKKyAgICAgICAgUEtIVEIgICB0ckNvbDEyLHJvd09wMzAscm93T3AyMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCisgICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJDb2wzMixyb3dPcDMyLHJvd09wMjIsQVNSICMxNiAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQorICAgICAgICBQS0hCVCAgIHRyQ29sMjIscm93T3AyMixyb3dPcDMyLExTTCAjMTYgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KKyAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBTdG9yZSBwRGF0YShSTjApIG9uIHN0YWNrIGFuZCByZXN0b3JlIGl0IG9ubHkgYXQgdGhlIGZpbmFsIHN0b3JlIGJhY2sKKyAgICAgICAgOy8vIFRoaXMgZnJlZXMgdXAgYSByZWdpc3RlciAoUk4wKSB3aGljaCBpcyB1c2VkIHRvIHJlZHVjZSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIHN0YWxscyAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9TVFIgICAgICAgcERhdGEscERhdGFPblN0YWNrCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBmaXJzdCB0d28gY29sdW1ucyh0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAgICAgICAgIAorICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDAsdHJDb2wxMCAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQorICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjAsdHJDb2wzMCAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQorICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQorICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQorICAgICAgICBTQUREMTYgICAgICBjb2xPcDAwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQorICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEwLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQorICAgICAgICBTU1VCMTYgICAgICBjb2xPcDIwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxLWMyK2MzKQorICAgICAgICBTQUREMTYgICAgICBjb2xPcDMwLGNvbERpZmYxLGNvbERpZmYyICAgICAgICAgICAgICA7Ly8gKGMwLWMxK2MyLWMzKQorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zKG5leHQgdHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHBRUERpdlRhYmxlLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBTQUREMTYgICAgICBjb2xTdW0xLHRyQ29sMDIsdHJDb2wxMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxKQorICAgICAgICBTQUREMTYgICAgICBjb2xTdW0yLHRyQ29sMjIsdHJDb2wzMiAgICAgICAgICAgICAgICA7Ly8gKGMyK2MzKQorICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICA7Ly8gKGMwLWMxKQorICAgICAgICBTU1VCMTYgICAgICBjb2xEaWZmMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICA7Ly8gKGMyLWMzKQorICAgICAgICBTQUREMTYgICAgICBjb2xPcDAyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxK2MyK2MzKQorICAgICAgICBTU1VCMTYgICAgICBjb2xPcDEyLGNvbFN1bTEsY29sU3VtMiAgICAgICAgICAgICAgICA7Ly8gKGMwK2MxLWMyLWMzKQorICAgICAgICBMRFIgICAgICAgICBwUVBNb2RUYWJsZSwgPWFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUgOy8vIFFQIE1vZHVsbyBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFJTQiAgICAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMixjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgTERSU0IgICAgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIDxEZXF1YW50aXplPiBpbXByb3ZlcyBvbiB0aGUgYy1yZWZlcmVuY2UgY29kZQorICAgICAgICA7Ly8gQm90aCB0aGUgIGNhc2VzIGkuZS4sIFNoaWZ0Pj0wIGFuZCBTaGlmdDwwIGNhc2VzIGFyZSBjb3ZlcmVkIHRvZ2V0aGVyCisgICAgICAgIDsvLyBXZSBkbyBub3Qgc3VidHJhY3QgMiBmcm9tIFNoaWZ0IGFzIGluIEMgcmVmZXJlbmNlLCBpbnN0ZWFkIHBlcmZvcm0gYQorICAgICAgICA7Ly8gU2NhbGUgPDwgU2hpZnQgb25jZSBpbiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBhIHJpZ2h0IHNoaWZ0IGJ5IGEgCisgICAgICAgIDsvLyBjb25zdGFudCAyIGFmdGVyIHRoZSBNdWx0aXBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIFJvdW5kIHdvdWxkIGJlIDIgCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIEJ5IGRvaW5nIHRoaXMgd2UgYXZpb2QgdGhlIEJyYW5jaGVzIHJlcXVpcmVkIGFuZCBhbHNvIAorICAgICAgICA7Ly8gcmVkdWNlIHRoZSBjb2RlIHNpemUgc3Vic3RhbnRpYWxseQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJvdW5kLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUm91bmQgPSAyCisgICAgICAgIExTTCAgICAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAorICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAxCisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AwMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMDIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgQVNSICAgICB0ZW1wMSwgdGVtcDEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IFRlbXAxID4+IDIKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQwMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MDIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMgorICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMTAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDEyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MTAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDEyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMworICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMjAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDIyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyIAorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDIwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQyMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDQKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDMwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AzMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBNX0xEUiAgIHBEYXRhLHBEYXRhT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERhdGEgcG9pbnRlciBmcm9tIHN0YWNrCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MzAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDMyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworc3RvcmVfY29lZmYKKyAgICAgICAgCisgICAgICAgIFNUTUlBICAgcERhdGEse291dDAwLG91dDAyLG91dDEwLG91dDEyLG91dDIwLG91dDIyLG91dDMwLG91dDMyfQorICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5EICAgICAgICAKKyAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgCisgICAgCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgICAgIAorCisKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIKKyAgICAKKzsvL0lucHV0IFJlZ2lzdGVycworcHBTcmMgICAgICAgICAgICAgICBSTiAgMAorcERzdCAgICAgICAgICAgICAgICBSTiAgMQorUVBSMiAgICAgICAgICAgICAgICBSTiAgMgorCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCityZXN1bHQgICAgICAgICAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCitwRHN0UjQgICAgICAgICAgICAgIFJOICA0CitwRHN0UjAgICAgICAgICAgICAgIFJOICAwCitRUFIxICAgICAgICAgICAgICAgIFJOICAxCitRUFI1ICAgICAgICAgICAgICAgIFJOICA1CisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcixyNQorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwRHN0UjQscERzdCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIxCisgICAgICAgIE1PViAgICAgUVBSNSxRUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFIwLHBEc3RSNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjAKKyAgICAgICAgTU9WICAgICBRUFIxLFFQUjUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgCisgICAgCisKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjExNWQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCisgKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCisgKgorICovCisgCisjaWZuZGVmIF9PTVhIVUZGVEFCX0hfCisjZGVmaW5lIF9PTVhIVUZGVEFCX0hfCisKKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdOworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXTsKKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMzJdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XTsKKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M107CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0KKworI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Zjg2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApAQCAtMCwwICsxLDI1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKKyNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOworLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAxZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKQEAgLTAsMCArMSw3NSBAQAorOyAvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBDbGlwcGluZyAxNiBiaXQgdmFsdWUgdG8gWzAsMjU1XSBSYW5nZQorOyAqLyAKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIAorCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIAorICAgICAKKyAgICAgIElGIEFSTTExMzZKUworIAorOy8vSW5wdXQgQXJndW1lbnRzCisKK3BTcmMgICAgICAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDEKK3N0ZXAgICAgICAgICAgICAgICAgIFJOIDIKKworOy8vIExvY2FsIHZhcmlhYmxlcworCit4MCAgICAgICAgICAgICAgICAgICBSTiAzCit4MSAgICAgICAgICAgICAgICAgICBSTiA0Cit4MiAgICAgICAgICAgICAgICAgICBSTiA1Cit4MyAgICAgICAgICAgICAgICAgICBSTiA2CisKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDE0CisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgscjYKKyAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgQ291bnQsIzgKK2xvb3AKKworICAgICAgICBMRE1JQSAgICAgICAgcFNyYyEse3gwLCB4MX0KKyAgICAgICAgU1VCUyAgICAgICAgIENvdW50LENvdW50LCAjMSAgICAgICAgICA7Ly8gY291bnQgZG93bgorICAgICAgICBMRE1JQSAgICAgICAgcFNyYyEse3gyLCB4M30KKyAgICAgICAgVVNBVDE2ICAgICAgIHgwLCAjOCwgeDAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KKyAgICAgICAgVVNBVDE2ICAgICAgIHgxLCAjOCwgeDEgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdF0KKyAgICAgICAgTU9WICAgICAgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDAsIFtwRHN0LCMxXQorICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMyXQorICAgICAgICBNT1YgICAgICAgICAgeDEsIHgxLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MSwgW3BEc3QsIzNdCisgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgICB4MiwgIzgsIHgyICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFVTQVQxNiAgICAgICB4MywgIzgsIHgzICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzRdCisgICAgICAgIE1PViAgICAgICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgyLCBbcERzdCwjNV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjNl0KKyAgICAgICAgTU9WICAgICAgICAgIHgzLCB4MywgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDMsIFtwRHN0LCM3XQorICAgICAgICBBREQgICAgICAgICAgcERzdCxwRHN0LHN0ZXAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwRHN0IGJ5IHN0ZXAgdmFsdWUKKyAgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICAgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbnRpbnVlIGxvb3AgdW50aWwgQ291bnQgcmVhY2hlcyA2NCAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTMwOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpAQCAtMCwwICsxLDM5OCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyLCBpbnRyYSBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiAKKzsgKgorOyAqIAorOyAqCis7ICogCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisgICAgIAorICAgICAgICAKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorCitmdHlwZSAgICAgICAgICAgICAgICBSTiAwCit0ZW1wMyAgICAgICAgICAgICAgICBSTiA0Cit0ZW1wICAgICAgICAgICAgICAgICBSTiA1CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CitFc2NhcGUgICAgICAgICAgICAgICBSTiA1CisKKzsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgoremlnemFnICAgICAgICAgICAgICAgUk4gMAorc3RvcmVMZXZlbCAgICAgICAgICAgUk4gMQordGVtcDIgICAgICAgICAgICAgICAgUk4gNAordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorc2lnbiAgICAgICAgICAgICAgICAgUk4gNQorTGFzdCAgICAgICAgICAgICAgICAgUk4gNworc3RvcmVSdW4gICAgICAgICAgICAgUk4gMTQKKworCitwYWNrUmV0SW5kZXggICAgICAgICBSTiA1CisKKworbWFya2VyYml0ICAgICAgICAgICAgUk4gNQorCis7Ly8gU2NyYXRjaCBSZWdpc3RlcnMKKworUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAorUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQorUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKKworVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKK1QyICAgICAgICAgICAgICAgICAgIFJOIDEyCitMUiAgICAgICAgICAgICAgICAgICBSTiAxNCAgICAgICAgCisgICAgICAgIAorCisKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcE9mZnNldCw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwTGlua1JlZ2lzdGVyLDQgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKyAgICAgICAgOy8vIGdldCB0aGUgdGFibGUgYWRkcmVzc2VzIGZyb20gc3RhY2sgICAgICAgCisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwWmlnemFnVGFibGUsNAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIEFMTCB6ZXJvcyBhdCBwRHN0CisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgQ291bnQgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgICAgICBMYXN0LCMwCisgICAgICAgIE1fU1RSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTGluayBSZWdpc3RlciBvbiBTdGFjaworICAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDIsIzAKKyAgICAgICAgTU9WICAgICAgICAgICAgIExSLCMwICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIE1hY3JvIGFuZCBTdG9yZSBhbGwgemVyb3MgdG8gcERzdCAKKyAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0gICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50ICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwcEJpdHN0cmVhbSBvbiBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBCaXRPZmZzZXQgb24gc3RhY2sKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICAKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgCisgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICAgICAgcERzdCxwRHN0LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJlc3RvcmUgcERzdAorCisgICAgICAgIDsvLyBUaGUgYXJtVkNNNFAyX0dldFZMQ0JpdHMgYmVnaW5zCisKK2dldFZMQ2JpdHMKKyAgICAgICAgCisgICAgICAgIE1fQkRfTE9PSzggICAgICBFc2NhcGUsNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBFc2NhcGUgVmFsdWUKKyAgICAgICAgTFNSICAgICAgICAgICAgIEVzY2FwZSxFc2NhcGUsIzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIEVzY2FwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBmb3IgZXNjYXBlIG1vZGUKKyAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMwCisgICAgICAgIEJORSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIGlmIG5vdCBpbiBFc2NhcGUgbW9kZSAzCisKKyAgICAgICAgTV9CRF9WU0tJUDggICAgICM3LFQxCisgICAgICAgIENNUCAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgc2hvcnRWaWRlb0hlYWRlciBmbGFnIHRvIGtub3cgdGhlIHR5cGUgb2YgRXNjYXBlIG1vZGUKKyAgICAgICAgQkVRICAgICAgICAgICAgIGVuZEZpbGxWTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBFc2NhcGUgTW9kZSA0CisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVMZXZlbCw4LFQxCisKKyAgICAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayB3aGV0aGVyIHRoZSBSZXNlcnZlZCB2YWx1ZXMgZm9yIExldmVsIGFyZSB1c2VkIGFuZCBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBpdCBpcyBzbworCisgICAgICAgIFRFUSAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIFRFUU5FICAgICAgICAgICBzdG9yZUxldmVsLCMxMjggICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50CisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKKyAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBlcnJvciBpZiBDb3VudCtzdG9yZVJ1biA+PSA2NAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZGluZyB0aGUgQWRkcmVzcyBvZiBaaWd6YWcgdGFibGUKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1hUQiAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTaWduIEV4dGVuZCBzdG9yZUxldmVsIHRvIDMyIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ3RoCisKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCisgICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgTGV2ZWwKKyAgICAgICAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKKyAgICAgICAKKyAgICAgICAgCisKK2VuZEZpbGxWTEQKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgRnR5cGUoIEVzY2FwZSBNb2RlKSB2YWx1ZSBiYXNlZCBvbiB0aGUgdHdvIHN1Y2Nlc3NpdmUgYml0cyBpbiB0aGUgYml0c3RyZWFtCisgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMSAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMxCisgICAgICAgIEJFUSAgICAgICAgICAgICBub3RFc2NhcGVtb2RlCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMQorICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzMKKyAgICAgICAgTU9WTkUgICAgICAgICAgIGZ0eXBlLCMyCisgICAgICAgIAorCitub3RFc2NhcGVtb2RlCisKKyAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgdGFibGUgd2l0aCBsYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIENvbWJpbmVkIFZMQyBUYWJsZQorICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGZ0eXBlID49MyBnZXQgcGVyZm9ybSBGaXhlZCBMZW5ndGggRGVjb2RpbmcgKEVzY2FwZSBNb2RlIDMpCisgICAgICAgIEJHRSAgICAgICAgICAgICBFc2NhcGVNb2RlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBjb250aW51ZSBub3JtYWwgVkxDIERlY29kaW5nCisgICAgICAgIAorICAgICAgICA7Ly8gVmFyaWFibGUgbGVuZ2ggZGVjb2RpbmcsICJhcm1VblBhY2tWTEMzMiIgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIHBhY2tSZXRJbmRleCxUMSxUMixwVmxjVGFibGVMMEwxLDQsMgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wMyw9MHhGRkYKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBwYWNrUmV0SW5kZXgsdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgZm9yIGludmFsaWQgc3ltYm9sCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgaW52YWxpZCBzeW1ib2wgb2NjdXJzIGV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICAgICAgTGFzdCxwYWNrUmV0SW5kZXgsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBMYXN0IGZyb20gcGFja2VkIEluZGV4CisgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgIAorCisgICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZVJ1bixwYWNrUmV0SW5kZXgsIzcgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IFJ1biBWYWx1ZSBmcm9tIFBhY2tlZCBpbmRleAorICAgICAgICBBTkQgICAgICAgICAgICAgc3RvcmVMZXZlbCxwYWNrUmV0SW5kZXgsIzB4N2MgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlTGV2ZWw9cGFja1JldEluZGV4WzItNl0sc3RvcmVMZXZlbFswLTFdPTAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIHRhYmxlCisgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExldmVsIHZhbHVlCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBmdHlwZTIKKyAgICAgICAgCisgICAgICAgIDsvLyBmdHlwZT09MTsgRXNjYXBlIG1vZGUgPTEKKyAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwTE1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgIDsvLyBJZiB0aGUgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCisgICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsc3RvcmVSdW5dCisKKyAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlTGV2ZWwsdGVtcDEsc3RvcmVMZXZlbCAgICAgICAgICAgICAgICAgICAgIAorCitmdHlwZTIKKworICAgICAgICA7Ly8gZnR5cGUgPTI7IEVzY2FwZSBtb2RlID0yCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMyCisgICAgICAgIEJORSAgICAgICAgICAgICBGaWxsVkxETDEKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcFJNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICAgOy8vIElmIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBTVUIgICAgICAgICAgICAgdGVtcDIsc3RvcmVMZXZlbCwjMQorICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHRlbXAyXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bixzdG9yZVJ1biwjMQorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sdGVtcDEKKyAgICAgICAgCitGaWxsVkxETDEgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorCisgICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzaWduLDEsVDEKKworICAgICAgICBDTVAgICAgICAgICAgICAgc2lnbiwjMQorICAgICAgICBSU0JFUSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCMwCisgCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSxzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCisgICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjNjQKKyAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmdodAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorIAorc3RvcmVMZXZlbEwxCisgICAgICAgIAorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIExldmVsIHZhbCBpcyBMYXN0IG5vbiB6ZXJvIHZhbAorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgTFNSICAgICAgICAgICAgIExhc3QsTGFzdCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgCisKKworICAgICAgICA7Ly8gRml4ZWQgTGVuZ2ggRGVjb2RpbmcgRXNjYXBlIE1vZGUgMworCitFc2NhcGVNb2RlMworCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKKyAgICAgICAgVEVRICAgICAgICAgICAgIG1hcmtlcmJpdCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBtYXJrZXIgYml0IGlzIHplcm8KKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEMTYgICAgIHN0b3JlTGV2ZWwsMTIsVDEKKworICAgICAgICBUU1QgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMHg4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlc3QgaWYgdGhlIGxldmVsIGlzIG5lZ2F0aXZlCisgICAgICAgIFNVQk5FICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzQwOTYKKyAgICAgICAgQ01QICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKKyAgICAgICAgQ01QTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIy0yMDQ4CisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgTGV2ZWw9PTAgb3IgIC0yMDQ4IAorCisgICAgICAgIE1fTERSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgbWFya2VyYml0LDEsVDEKKyAgICAgICAgICAgCisKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyICggU2lnbiBub3QgdXNlZCBhcyBzdG9yZUxldmVsIGlzIHByZXByb2Nlc3NlZCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCisKKyAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVuIExlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorCisKKyAKK3N0b3JlTGV2ZWxMYXN0CisgICAgICAgIAorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZCAKKyAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgIAorZW5kCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL1J1biB0aGUgTG9vcCB1bnRpbGwgQ291bnQgcmVhY2hlcyA2NAorCisgICAgICAgIEJMVCAgICAgICAgICAgICBnZXRWTENiaXRzCisKKyAgICAgICAgCitFeGl0T2sKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBWTEMgRGVjb2RpbmcgaXMgZG9uZSBTdWNjZXNzZnVsbHkgCisgICAKKyAgICAgICAgOy8vIExvYWRpbmcgcHBCaXRTdHJlYW0gYW5kIHBCaXRPZmZzZXQgZnJvbSBzdGFjaworICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorCisgICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKworICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAorICAgICAgICAgICAgIAorICAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgIE1PVk5FICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisgICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBMaW5rIFJlZ2lzdGVyIEJhY2sKKyAgICAgICAgQiAgICAgICAgICAgICAgIGV4aXQyCisKK0V4aXRFcnJvcgorICAgICAgICA7Ly8gRXhpdCBXaGVuIGFuIEVycm9yIG9jY3VycyAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0CisgICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKworICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlcgorICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorCitleGl0MgorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCkBAIC0wLDAgKzEsMjExIEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKworCisKKy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQorCisvLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAorLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gCisvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8CisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCisvLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cworLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKKy8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKKy8vCisvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKKy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKy8vCisvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCisvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCisvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCisKKy8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCisvLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KKy8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgorIAorCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKKyAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKKyAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKKyAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKKyAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKKyAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKKyAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKKyAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKKyAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKKyAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQorfTsKKworCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKKyAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKKyAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKKyAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKKyAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKKyAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKKyAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKKyAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKKyAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKKyAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKKyAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKKyAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKKyAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQorfTsKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0geworICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAorICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAorICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAorCisJMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCisgICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0geworICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAorICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAorICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAorICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAorICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAorICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAorICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAorICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAorICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAorICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAorICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAorICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCit7CisgICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAorICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKworCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwKKwkKKwkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZjhkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCkBAIC0wLDAgKzEsNzUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIExvb2t1cCB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworICAgIC8qICogVGFibGUgRW50cmllcyBjb250YWluIERjIFNjYWxlciB2YWx1ZXMKKyAgICAgICAqIGFybVZDTTRQMl9EQ1NjYWxlcltpXT0gOCAgICAgICAgICAgZm9yIGk9MSAgdG8gIDQgYW5kIGk9MzMgdG8gMzYKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippICAgICAgICAgZm9yIGk9NSAgdG8gIDgKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaSs4ICAgICAgICAgZm9yIGk9OSAgdG8gIDI1CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaS0xNiAgICAgIGZvciBpPTI2IHRvICAzMQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAoaS0zMisxMykvMiBmb3IgaT0zNyB0byAgNTkKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaS02LTMyICAgICAgZm9yIGk9NjAgdG8gIDYzCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgIGZvciBpPTAgYW5kIGk9MzIKKyAgICAgICAqLworICAgICAgIAorY29uc3QgT01YX1U4IGFybVZDTTRQMl9EQ1NjYWxlcls2NF09eworCTB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4YSwgIDB4YywgIDB4ZSwgIAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAorICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisgICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwKKyAgICAweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweDksICAweDksICAweGEsICAKKyAgICAweGEsICAweGIsICAweGIsICAweGMsICAweGMsICAweGQsICAweGQsICAweGUsICAKKyAgICAweGUsICAweGYsICAweGYsICAweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAKKyAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAorCit9OworCisgICAgICAgICAgICAgIAorICAgICAvKiAgVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2W2ldPXJvdW5kKDMyNzY3L2kpCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbMF09IDAKKyAgICAgICovCisKK2NvbnN0IE9NWF9TMTYgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzY0XT17CisJMHgwMDAwLDB4N2ZmZiwweDQwMDAsMHgyYWFhLDB4MjAwMCwweDE5OTksMHgxNTU1LDB4MTI0OSwKKyAgICAweDEwMDAsMHgwZTM5LDB4MGNjZCwweDBiYTMsMHgwYWFiLDB4MDlkOSwweDA5MjUsMHgwODg4LAorICAgIDB4MDgwMCwweDA3ODcsMHgwNzFjLDB4MDZiZCwweDA2NjYsMHgwNjE4LDB4MDVkMSwweDA1OTEsCisgICAgMHgwNTU1LDB4MDUxZiwweDA0ZWMsMHgwNGJlLDB4MDQ5MiwweDA0NmEsMHgwNDQ0LDB4MDQyMSwKKyAgICAweDA0MDAsMHgwM2UxLDB4MDNjNCwweDAzYTgsMHgwMzhlLDB4MDM3NiwweDAzNWUsMHgwMzQ4LAorICAgIDB4MDMzMywweDAzMWYsMHgwMzBjLDB4MDJmYSwweDAyZTksMHgwMmQ4LDB4MDJjOCwweDAyYjksCisgICAgMHgwMmFiLDB4MDI5ZCwweDAyOGYsMHgwMjgyLDB4MDI3NiwweDAyNmEsMHgwMjVmLDB4MDI1NCwKKyAgICAweDAyNDksMHgwMjNmLDB4MDIzNSwweDAyMmIsMHgwMjIyLDB4MDIxOSwweDAyMTEsMHgwMjA4CisJICAgCit9OworICAgICAKKyAgICAgIC8qIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMltpXT1yb3VuZCgxMzEwNzEvaSkKKyAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMlswXT0gMAorICAgICAgICovCisKK2NvbnN0IE9NWF9TMzIgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzY0XT17CisJMHgwMDAwMDAwMCwweDAwMDFmZmZmLDB4MDAwMTAwMDAsMHgwMDAwYWFhYSwgMHgwMDAwODAwMCwgMHgwMDAwNjY2NiwgMHgwMDAwNTU1NSwgMHgwMDAwNDkyNCwKKyAgICAweDAwMDA0MDAwLDB4MDAwMDM4ZTMsMHgwMDAwMzMzMywweDAwMDAyZThjLCAweDAwMDAyYWFiLCAweDAwMDAyNzYyLCAweDAwMDAyNDkyLCAweDAwMDAyMjIyLAorICAgIDB4MDAwMDIwMDAsMHgwMDAwMWUxZSwweDAwMDAxYzcyLDB4MDAwMDFhZjIsIDB4MDAwMDE5OWEsIDB4MDAwMDE4NjEsIDB4MDAwMDE3NDYsIDB4MDAwMDE2NDMsCisgICAgMHgwMDAwMTU1NSwweDAwMDAxNDdiLDB4MDAwMDEzYjEsMHgwMDAwMTJmNiwgMHgwMDAwMTI0OSwgMHgwMDAwMTFhOCwgMHgwMDAwMTExMSwgMHgwMDAwMTA4NCwKKyAgICAweDAwMDAxMDAwLDB4MDAwMDBmODQsMHgwMDAwMGYwZiwweDAwMDAwZWExLCAweDAwMDAwZTM5LCAweDAwMDAwZGQ2LCAweDAwMDAwZDc5LCAweDAwMDAwZDIxLAorICAgIDB4MDAwMDBjY2QsMHgwMDAwMGM3ZCwweDAwMDAwYzMxLDB4MDAwMDBiZTgsIDB4MDAwMDBiYTMsIDB4MDAwMDBiNjEsIDB4MDAwMDBiMjEsIDB4MDAwMDBhZTUsCisgICAgMHgwMDAwMGFhYiwweDAwMDAwYTczLDB4MDAwMDBhM2QsMHgwMDAwMGEwYSwgMHgwMDAwMDlkOSwgMHgwMDAwMDlhOSwgMHgwMDAwMDk3YiwgMHgwMDAwMDk0ZiwKKyAgICAweDAwMDAwOTI1LDB4MDAwMDA4ZmIsMHgwMDAwMDhkNCwweDAwMDAwOGFlLCAweDAwMDAwODg5LCAweDAwMDAwODY1LCAweDAwMDAwODQyLCAweDAwMDAwODIwCisJCit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5MmQ4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKQEAgLTAsMCArMSwxMDQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsgKioKKzsgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKzsgKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKzsgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCis7ICogW291dF1wcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbb3V0XXByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCis7ICogICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKzsgKgorOyAqLworCisgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKKworCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworCisgICAgICAgSUYgQVJNMTEzNkpTCisgCis7Ly8gSW5wdXQgQXJndW1lbnRzCitCbG9ja0luZGV4ICAgICAgICAgUk4gMAorcENvZWZCdWZSb3cgICAgICAgIFJOIDEKK3BDb2VmQnVmQ29sICAgICAgICBSTiAyCitwcmVkRGlyICAgICAgICAgICAgUk4gMworcHJlZFFQICAgICAgICAgICAgIFJOIDQKK3BRcEJ1ZiAgICAgICAgICAgICBSTiA1CisKKzsvLyBMb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgIFJOIDAKK2Jsb2NrRENMZWZ0ICAgICAgICBSTiA2ICAKK2Jsb2NrRENUb3AgICAgICAgICBSTiA3CitibG9ja0RDVG9wTGVmdCAgICAgUk4gOAordGVtcDEgICAgICAgICAgICAgIFJOIDkKK3RlbXAyICAgICAgICAgICAgICBSTiAxNAorCisgICAgICAgTV9TVEFSVCAgICBhcm1WQ000UDJfU2V0UHJlZERpcixyOQorCisgICAgICAgTV9BUkcgICAgICAgcHByZWRRUCw0CisgICAgICAgTV9BUkcgICAgICAgcHBRcEJ1Ziw0CisgICAgCisgICAgICAgTERSSCAgICAgICAgYmxvY2tEQ1RvcExlZnQsW3BDb2VmQnVmUm93LCMtMTZdCisgICAgICAgTERSSCAgICAgICAgYmxvY2tEQ0xlZnQsW3BDb2VmQnVmQ29sXQorICAgICAgIAorICAgICAgIFRFUSAgICAgICAgIEJsb2NrSW5kZXgsIzMKKyAgICAgICBMRFJFUUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZkNvbCwjLTE2XQorICAgICAgIExEUk5FSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmUm93XQorICAgICAgICAgICAgIAorICAgICAgIFNVQlMgICAgICAgIHRlbXAxLGJsb2NrRENMZWZ0LGJsb2NrRENUb3BMZWZ0CisgICAgICAgUlNCTFQgICAgICAgdGVtcDEsdGVtcDEsIzAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMixibG9ja0RDVG9wTGVmdCxibG9ja0RDVG9wCisgICAgICAgUlNCTFQgICAgICAgdGVtcDIsdGVtcDIsIzAKKyAgICAgIAorICAgICAgIE1fTERSICAgICAgIHBRcEJ1ZixwcFFwQnVmCisgICAgICAgTV9MRFIgICAgICAgcHJlZFFQLHBwcmVkUVAKKyAgICAgICBDTVAgICAgICAgICB0ZW1wMSx0ZW1wMgorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfVkVSVElDQUwKKyAgICAgICBMRFJMVEIgICAgICB0ZW1wMSxbcFFwQnVmLCMxXQorICAgICAgIFNUUkxUICAgICAgIHRlbXAyLFtwcmVkRGlyXQorICAgICAgIFNUUkxUICAgICAgIHRlbXAxLFtwcmVkUVBdCisgICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19IT1JJWk9OVEFMICAgICAgICAgICAKKyAgICAgICBMRFJHRUIgICAgICB0ZW1wMSxbcFFwQnVmXQorICAgICAgIFNUUkdFICAgICAgIHRlbXAyLFtwcmVkRGlyXQorICAgICAgIE1PViAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIFNUUkdFICAgICAgIHRlbXAxLFtwcmVkUVBdIAorCisgICAgICAgICAKKyAgICAKKyAgICAgICBNX0VORAorIAorICAgICAgIEVORElGCisKKyAgICAgICBFTkQgICAgCisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTdmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpAQCAtMCwwICsxLDYxIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKKyAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCisgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAoreworICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAorICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCisgICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAorICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKKyAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCisgICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKKyAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCisgICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKKworCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCisgICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCisgICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAorICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAorICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCisgICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAorICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKKyAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAorCisgICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKKyAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCisgICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAorICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKKyAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCisgICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKKyAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCisgICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKKworCit9OworCisKKworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzZDI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAorICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkKKyAqIG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yCisgKiBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10KKyAqIFtpbl0JUVAJCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBpbmRpY2F0ZXMgdXNpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBkZWZpbmVkIGluIHNob3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGhlYWRlciBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBpbmRpY2F0ZXMgbm9ybWFpbCBxdWFudGl6YXRpb24gbWV0aG9kLgorICogW291dF0gcHBCaXRTdHJlYW0gCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdIHBEc3QJCQlwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGRhdGEgdHlwZSkuIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6CisgKiAgIC0gKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgUVAgPD0gMDsKKyAqCSAtIHBEc3Qgbm90IDE2LWJ5dGUgYWxpZ25lZAorICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAorICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLworICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07CisgICAgT01YX1MxNiAqcFRlbXBCdWYxOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKKyAgICAKKyAgICAKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgUVApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKwkgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwOWE2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZyYW1lL3BsYW5lIG9uCisgKiBhIHBpeGVsIGJhc2lzLiBGb3IgSU5UUkEgYmxvY2ssIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBjbGlwcGVkIHRvIFswLCAyNTVdIGFuZAorICogd3JpdHRlbiB0byBjb3JyZXNwb25kaW5nIGJsb2NrIGJ1ZmZlciB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10uCisgKiBbaW5dCXN0ZXAJCQl3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUKKyAqIFtpbi9vdXRdCXBDb2VmQnVmUm93CQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgcndvIGJ1ZmZlcgorICogW2luL291dF0JcENvZWZCdWZDb2wJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dCWN1clFQCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaAorICoJCQkJCQkJCXRoZSBjdXJyZW50IGJsb2NrIGJlbG9uZ3MgdG8KKyAqIFtpbl0JcFFwQnVmCQkgUG9pbnRlciB0byBhIDItZWxlbWVudCBRUCBhcnJheS4gcFFwQnVmWzBdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGxlZnQgdG8KKyAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrKFFQYSkuIHBRcEJ1ZlsxXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBqdXN0IGFib3ZlIHRoZQorICogICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jayhRUGMpLgorICogICAgICAgICAgICAgICAgICAgTm90ZSwgaW4gY2FzZSB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpcyBvdXQgb2YgVk9QIGJvdW5kLCB0aGUgUVAgdmFsdWUgd2lsbCBoYXZlCisgKiAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgdG8gdGhlIGludHJhLXByZWRpY3Rpb24gcHJvY2Vzcy4gUmVmZXIgdG8gc3ViY2xhdXNlICAiNy40LjMuMyBBZGFwdGl2ZQorICogICAgICAgICAgICAgICAgICAgYWMgY29lZmZpY2llbnQgcHJlZGljdGlvbiIgb2YgSVNPL0lFQyAxNDQ5Ni0yKE1QRUc0IFBhcnQyKSBmb3IgYWNjdXJhdGUgZGVzY3JpcHRpb24uCisgKiBbaW5dCWJsb2NrSW5kZXgJCWJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICoJCQkJCQkJCXBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsCisgKgkJCQkJCQkJRmlndXJlIDYtNSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlpbnRyYURDVkxDCQlhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4KKyAqCQkJCQkJCQlUaGlzIGFsbG93cyBhIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDCisgKgkJCQkJCQkJZm9yIGNvZGluZyBvZiBJbnRyYSBEQyBjb2VmZmljaWVudHMgYXMgcGVyIFRhYmxlCisgKgkJCQkJCQkJNi0yMSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlBQ1ByZWRGbGFnCQlhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcKKyAqCQkJCQkJCQlpZiB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QKKyAqCQkJCQkJCQljb2x1bW4gYXJlIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZAorICoJCQkJCQkJCW1hY3JvYmxvY2suCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCisgKgkJCQkJCQlhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICoJCQkJCQkJCWRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqCQkJCQkJCQlpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdCXBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkJCSpwcEJpdFN0cmVhbQorICogW291dF0JcERzdAkJCXBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCQkJCQkJCQlwRHN0IHNob3VsZCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwQ29lZkJ1ZlJvdwkJcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0JQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUVBCdWYsIHBEc3QuCisgKiAgICAgIG9yCisgKiAgIC0gIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZTogKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgY3VyUVAgZXhjZWVkcyAoMSwgMzEpLAorICogICAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsOV0sIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4LCBpbnRyYURDVkxDIGlzIHplcm8gd2hpbGUKKyAqICAgICAgYmxvY2tJbmRleCBncmVhdGVyIHRoYW4gNS4KKyAqICAgICAgb3IKKyAqICAgLQlwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgT01YX0lOVCBzdGVwLAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9VOCBjdXJRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKyAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKKyAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpcjsKKyAgICBPTVhfSU5UICBwcmVkUVA7CisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgCisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7CisgICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOworICAgIAorICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLworICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgICZwcmVkRGlyLAorICAgICAgICAmcHJlZFFQLAorICAgICAgICBwUVBCdWYpOworCisgICAgcHJlZEFDRGlyID0gcHJlZERpcjsKKworICAgIAorICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIAorCWFybVZDTTRQMl9DbGlwOChwVGVtcEJ1ZjIscERzdCxzdGVwKTsKKwkKKwkKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg2MWRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpAQCAtMCwwICsxLDM2NCBAQAorOyAqKioqKioqKioqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICoqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBEZWNvZGVzIGFuZCBwYWRzIGZvdXIgbW90aW9uIHZlY3RvcnMgb2YgdGhlIG5vbi1pbnRyYSBtYWNyb2Jsb2NrIGluIFAtVk9QLgorOyAqIFRoZSBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgcHJvY2VzcyBpcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNi4xLjYgb2YKKzsgKiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKzsgKiBbaW5dICAgIHBTcmNNVkxlZnRNQiAgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJNQiAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyIHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgcFNyY01WVXBwZXJSaWdodE1CIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaworOyAqICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorOyAqIFtpbl0gICAgZmNvZGVGb3J3YXJkICAgICAgIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQKKzsgKiAgICAgICAgICAgICAgICAgICAgIGJpdCBzdHJlYW0gc3ludGF4Cis7ICogW2luXSAgICBNQlR5cGUgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uCis7ICogICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCBmaWxsZWQgd2l0aCB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNhbWUgZGVjb2RlZCB2ZWN0b3IuCis7ICogW291dF0gICBwcEJpdFN0cmVhbSAgICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLAorOyAqICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Cis7ICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgcERzdE1WQ3VyTUIgICAgICAgICBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayB3aGljaCBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC1ubyBlcnJvcgorOyAqIAorOyAqICAgICAgICAgICAgICAgICAgICAgCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKgorOyAqCisgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIElOQ0xVREUgb214VkNfcy5oCisgICAgICAgIAorICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgCisgICAgICAgICAgICAgICAgCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICAgUk4gMQorcFNyY01WTGVmdE1CICAgICAgICAgIFJOIDIKK3BTcmNNVlVwcGVyTUIgICAgICAgICBSTiAzCitwU3JjTVZVcHBlclJpZ2h0TUIgICAgUk4gNAorcERzdE1WQ3VyTUIgICAgICAgICAgIFJOIDUKK2Zjb2RlRm9yd2FyZCAgICAgICAgICBSTiA2CitNQlR5cGUgICAgICAgICAgICAgICAgUk4gNworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworemVybyAgICAgICAgICAgICAgICAgIFJOIDQKK29uZSAgICAgICAgICAgICAgICAgICBSTiA0CitzY2FsZUZhY3RvciAgICAgICAgICAgUk4gMQorCisKK1JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKK1ZsY01WRCAgICAgICAgICAgICAgICBSTiAwCitpbmRleCAgICAgICAgICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgIFJOIDcKKworbXZIb3JEYXRhICAgICAgICAgICAgIFJOIDQKK212SG9yUmVzaWR1YWwgICAgICAgICBSTiAwCisKK212VmVyRGF0YSAgICAgICAgICAgICBSTiA0ICAgICAgICAgICAgIAorbXZWZXJSZXNpZHVhbCAgICAgICAgIFJOIDAKKwordGVtcCAgICAgICAgICAgICAgICAgIFJOIDEKKwordGVtcDEgICAgICAgICAgICAgICAgIFJOIDMKK0hpZ2ggICAgICAgICAgICAgICAgICBSTiA0CitMb3cgICAgICAgICAgICAgICAgICAgUk4gMgorUmFuZ2UgICAgICAgICAgICAgICAgIFJOIDEKKworQmxrQ291bnQgICAgICAgICAgICAgIFJOIDE0CisKK2RpZmZNVmR4ICAgICAgICAgICAgICBSTiAwCitkaWZmTVZkeSAgICAgICAgICAgICAgUk4gMQorCis7Ly8gU2NyYXRjaCBSZWdpc3RlcnMKKworUkJpdFN0cmVhbSAgICAgICAgICAgIFJOIDgKK1JCaXRDb3VudCAgICAgICAgICAgICBSTiA5CitSQml0QnVmZmVyICAgICAgICAgICAgUk4gMTAKKworVDEgICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICAgUk4gMTIKK0xSICAgICAgICAgICAgICAgICAgICBSTiAxNAorCisgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZECisgICAgICAgSU1QT1JUICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5ICAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBEc3RNVkN1ck1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcERzdE1WUHJlZE1FLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEJsa0NvdW50LDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBCaXRPZmZzZXQsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WTGVmdE1CLDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVlVwcGVyTUIsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHgsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwZGlmZk1WZHksNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwSGlnaCw0CisgICAgICAgCisgICAgICAgICAgICAgIAorCisKKyAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AscjExCisgICAgICAgCisgICAgICAgTV9BUkcgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2ssNCAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gIHBTcmNNVlVwcGVyUmlnaHRNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBwRHN0TVZDdXJNQm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIHBEc3RNVkN1ck1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIGZjb2RlRm9yd2FyZG9uU3RhY2ssNCAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gZmNvZGVGb3J3YXJkIG9uIHN0YWNrIAorICAgICAgIE1fQVJHICAgICAgICAgICBNQlR5cGVvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIE1CVHlwZSBvbiBzdGFjaworCisgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICAKKyAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRTdHJlYW0gTWFjcm8KKworICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTUJUeXBlIGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgcERzdE1WQ3VyTUIscERzdE1WQ3VyTUJvblN0YWNrICAgICAgICA7Ly8gTG9hZCBwRHN0TVZDdXJNQiBmcm9tIHN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHplcm8sIzAKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQSAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBX1EgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkFfUQorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICBNT1ZFUSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgTU9WICAgICAgICAgICAgIEJsa0NvdW50LCMwCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0T0sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFYKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0Vl9RICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzQKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVJfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjMQorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBmY29kZUZvcndhcmQsZmNvZGVGb3J3YXJkb25TdGFjayAgICAgIDsvLyBMb2FkIGZjb2RlRm9yd2FyZCAgZnJvbSBzdGFjaworCisgICAgICAgOy8vIFN0b3JpbmcgdGhlIHZhbHVlcyB0ZW1wb3JhcmlseSBvbiBzdGFjaworCisgICAgICAgTV9TVFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbSAgICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICAgICAgIAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9ZmNvZGVGb3J3YXJkLTEKKyAgICAgICBNT1YgICAgICAgICAgICAgb25lLCMxCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLG9uZSx0ZW1wICAgICAgICAgICAgICAgICAgOy8vIHNjYWxlRmFjdG9yPTE8PChmY29kZUZvcndhcmQtMSkKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixzY2FsZUZhY3RvciwjNSAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBzY2FsZUZhY3RvcixwSGlnaCAgICAgICAgICAgICAgICAgICAgIDsvLyBbcEhpZ2hdPTMyKnNjYWxlRmFjdG9yCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBWTEQgRGVjb2RpbmcKKworCitMb29wCisKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkIHRoZSBvcHRpbWl6ZWQgTVZEIFZMQyB0YWJsZQorCisgICAgICAgOy8vIEhvcml6b250YWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyB2YXJpYWJsZSBsZW5naHQgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiB0aGUgZGVjb2RlZCBzeW1ib2wgaXMgYW4gaW52YWxpZWQgc3ltYm9sIAorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsIzEgICAgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yUmVzaWR1YWw9MQorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12SG9yRGF0YT0wIGRpZmZNVmR4PW12SG9yRGF0YSAgICAgICAgIAorICAgICAgIEJFUSAgICAgICAgICAgICBWZXJ0aWNhbERhdGEKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZIb3JSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gZ2V0IG12SG9yUmVzaWR1YWwgZnJvbSBiaXRzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG12SG9yRGF0YSE9MCAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdkhvckRhdGEsbXZIb3JEYXRhLCMwICAgICAgICAgICAgICAgIDsvLyBtdkhvckRhdGE9YWJzKG12SG9yRGF0YSkKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCxtdkhvclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEsZmNvZGVGb3J3YXJkLG12SG9yUmVzaWR1YWwgOy8vIGRpZmZNVmR4PWFicyhtdkhvckRhdGEpKmZjb2RlRm9yd2FyZCttdkhvclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCwjMAorICAgICAgIAorICAgICAgIDsvLyBWZXJ0aWNhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCitWZXJ0aWNhbERhdGEKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgZGlmZk1WZHggb24gc3RhY2sKKyAgICAgICBMRFIgICAgICAgICAgICAgVmxjTVZELCA9YXJtVkNNNFAyX2FWbGNNVkQgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBhZGRyZXNzIG9mIG9wdGltaXplZCBWTEMgdGFibGVzCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gVkxDIGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGFuIEludmFsaWVkIFN5bWJvbCBvY2N1cnMKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZWZXJEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLCMxICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeSA9IG12VmVyRGF0YSBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdlZlckRhdGE9MAorICAgICAgIEJFUSAgICAgICAgICAgICBGaW5kTVZQcmVkCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEKKyAgICAgICBNX0JEX1ZSRUFEOCAgICAgbXZWZXJSZXNpZHVhbCx0ZW1wLFQxLFQyICAgICAgICAgICAgICA7Ly8gR2V0IG12VmVyUmVzaWR1YWwgZnJvbSBiaXQgc3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtblZlckRhdGEhPTAKKyAgICAgICAgICAgICAKKworICAgICAgIENNUCAgICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZWZXJEYXRhLG12VmVyRGF0YSwjMAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlclJlc2lkdWFsLG12VmVyUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSxmY29kZUZvcndhcmQsbXZWZXJSZXNpZHVhbCA7Ly8gZGlmZk1WZHk9YWJzKG12VmVyRGF0YSkqZmNvZGVGb3J3YXJkK212VmVyUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR5LGRpZmZNVmR5LCMwCisKKyAgICAgICA7Ly9DYWxsaW5nIHRoZSBGdW5jdGlvbiBvbXhWQ000UDJfRmluZE1WcHJlZAorICAgICAgICAKK0ZpbmRNVlByZWQKKworICAgICAgIE1fU1RSICAgICAgICAgICBkaWZmTVZkeSxwZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxwRHN0TVZDdXJNQixCbGtDb3VudCxMU0wgIzIgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwcERzdE1WQ3VyTUIgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcCBvbiBzdGFjayBmb3IgcGFzc2luZyBhcyBhbiBhcmd1bWVudCB0byBGaW5kTVZQcmVkCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAsIzAKKyAgICAgICBNX1NUUiAgICAgICAgICAgdGVtcCxwRHN0TVZQcmVkTUUgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzcyBwRHN0TVZQcmVkTUU9TlVMTCBhcyBhbiBhcmd1bWVudCAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzcyBCbGtDb3VudCBhcyBBcmd1bWVudCB0aHJvdWdoIHN0YWNrCisKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCxwU3JjTVZMZWZ0TUIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcCAoUk4gMSk9cFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyUmlnaHRNQixwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVkxlZnRNQixwU3JjTVZVcHBlck1CICAgICAgICAgICAgOy8vIHBTcmNNVkxlZnRNQiAoIFJOIDIpID0gcFNyY01WVXBwZXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwcEJpdFN0cmVhbSxwRHN0TVZDdXJNQiAgICAgICAgICAgICAgIDsvLyBwcEJpdFN0cmVhbSAgKCBSTiAwKSA9IHBEc3RNVkN1ck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscFNyY01WVXBwZXJSaWdodE1CICAgICAgOy8vIHBTcmNNVlVwcGVyTUIoIFJOIDMpID0gcFNyY01WVXBwZXJSaWdodE1CICAgICAgCisgICAgICAgQkwgICAgICAgICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHN1YnJvdXRpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBTdG9yZSBIb3Jpem9udGFsIE1vdGlvbiBWZWN0b3IKKyAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQmxrQ291bnQgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBIaWdoLHBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPTMyKnNjYWxlRmFjdG9yCisgICAgICAgTFNMICAgICAgICAgICAgIHRlbXAxLEJsa0NvdW50LCMyICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9QmxrQ291bnQqNAorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHggICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR4CisgICAgICAgCisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgCisgICAgICAgCisgICAgICAgUlNCICAgICAgICAgICAgIExvdyxIaWdoLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvdyA9IC0zMipzY2FsZUZhY3RvcgorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeD1wRHN0TVZDdXJNQltCbGtDb3VudF0rZGlmZk1WZHgKKyAgICAgICBBREQgICAgICAgICAgICAgUmFuZ2UsSGlnaCxIaWdoICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmFuZ2U9NjQqU2NhbGVGYWN0b3IKKyAgICAgICBTVUIgICAgICAgICAgICAgSGlnaCxIaWdoLCMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0gMzIqc2NhbGVGYWN0b3ItMQorCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4PExvdyAgICAgICAgICAKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHgrPVJhbmdlCisgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeCA+IEhpZ2ggZGlmZk1WZHgtPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0KKworICAgICAgIDsvLyBTdG9yZSBWZXJ0aWNhbAorCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHRlbXAxLCMyICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPTQqQmxrQ291bnQrMgorICAgICAgIE1fTERSICAgICAgICAgICBkaWZmTVZkeCxwZGlmZk1WZHkgICAgICAgICAgICAgICAgICAgIDsvLyBMYWFkIGRpZmZNVmR5CisgICAgICAgTERSU0ggICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAgICAgICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdLmRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIEJsa0NvdW50LEJsa0NvdW50LCMxICAgICAgICAgICAgICAgICAgOy8vIEJsa0NvdW50PUJsa0NvdW50KzEKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93CisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5PExvdyAgZGlmZk1WZHkrPVJhbmdlICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxIaWdoCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR5ID4gSGlnaCBkaWZmTVZkeS09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXSAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgQmxrQ291bnQsQ291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJNQixwcFNyY01WVXBwZXJNQgorCisgICAgICAgQkxUICAgICAgICAgICAgIExvb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIEJsa0NvdW50PENvdW50IENvbnRpbnVlIHRoZSBMb29wCisKKworICAgICAgIDsvLyBJZiBNQlR5cGU9T01YX1ZDX0lOVEVSIG9yIE1CdHlwZT1PTVhfVkNfSU5URVJfUSBjb3B5IHBEc3RNVkN1ck1CWzBdIHRvCisgICAgICAgOy8vIHBEc3RNVkN1ck1CWzFdLCBwRHN0TVZDdXJNQlsyXSwgcERzdE1WQ3VyTUJbM10gCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sKKworICAgICAgIFRFUSAgICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQl0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIAorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjOF0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzEyXQorICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoaW5nIHRoZSBNYWNybyAgICAgICAKKworICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgCitFeGl0RXJyb3IKKworICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCisKK0V4aXRPSyAgICAgICAgICAgICAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNiMjUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCkBAIC0wLDAgKzEsMTMyIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXIgY29kZWQgYmxvY2suCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKzsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCis7ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKzsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKKzsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCis7ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCis7ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCis7ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQorOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAorOyAqCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAKKworCisKKyAgICAgSUYgQVJNMTEzNkpTCisgICAgIAorICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCisKKyAgICAgICAgCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgdGhlIFZMQyxaaWd6YWcsTE1BWCBhbmQgUk1BWCB0YWJsZXMKKyAgICAgCisgICAgICAgIAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIscjEyCisKKyAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgOy8vIExvYWQgemlnemFnIHRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sgdG8gcGFzcyBhcyBhcmd1bWVudCB0byB1bnNhZmUgZnVuY3Rpb24KKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgVkxDIHRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBvcHRpbWl6ZWQgVkxDIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBMTUFYIFRhYmxlcworICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgUk1BWCBUYWJsZXMKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHNldCBzdGFydD0wCisgICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBSTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgICAKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgIDsvLyBjYWxsIFVuc2FmZSBGdW5jdGlvbiBmb3IgVkxDIFppZ3phZyBEZWNvZGluZworICAgICAgICAgCisgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY3MjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKQEAgLTAsMCArMSwxMzYgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK1ByZWREaXIgICAgICAgICAgICAgIFJOIDMKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBJbnB1dCBBcmd1bWVudCBvbiBzdGFjayAgICAgICAgICAgCisKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIExvYWQgQWRkcmVzcyBvZiB0aGUgWmlnemFnIHRhYmxlICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgOy8vIExvYWRpbmcgRGlmZmVyZW50IHR5cGUgb2YgemlnemFnIHRhYmxlcyBiYXNlZCBvbiBQcmVkRGlyCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgWmlnemFnIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgVGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBWTEMgVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCBUYWJsZSBhZGRyZXNzIG9uIFN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQ9MCAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgOy8vIGdldCB0aGUgSW5wdXQgQXJndW1lbnQgZnJvbSBzdGFjaworCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgIDsvLyBDYWxsIFVuc2FmZSBGdW5jdGlvbgorCisKKworICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTljYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKQEAgLTAsMCArMSwyMjQgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisgICAgICAKKworCisgICAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKKyAgICAgICAgCisKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCit2aWRlb0NvbXAgICAgICAgICAgICBSTiA1Cis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwRENMdW1hQ2hyb21hSW5kZXggICBSTiA0CitwRENDaHJvbWFJbmRleCAgICAgICBSTiA3CitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CitEQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Citwb3dPZlNpemUgICAgICAgICAgICBSTiA3Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CisKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCisgICAgIAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKKyAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKKworICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKKworICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KKworICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCisKKyAgICAKKyAgICAgICAKKworRGVjb2RlREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCisgICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAorICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAorICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KKyAgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAorICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKKyAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KKworQ2hlY2tEQ1ZhbHVlU2l6ZQorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0CisKKyAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIAorCisgICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKKworQUNEZWNvZGUKKworICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjaworICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KKyAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQorICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCisgICAgICAgIAorICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjaworICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCisgICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAgICAgICAgCisgICAgICAgICAgICAgIAorCitFeGl0RXJyb3IKKyAKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAorRXhpdE9LCisgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiZmE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKQEAgLTAsMCArMSwxOTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1WQ0NPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCisgICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKKyAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3BTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAorcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCitwU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKK3BTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMworcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0CitwRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKK2lCbGsgICAgICAgICAgICAgICAgICAgUk4gNgorCitwVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKK0NhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKKworcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3CitwQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKK3BDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQorCitDYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCitDYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCitDYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKK0NhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMworQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAorQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQorCit0ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3plcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKK3JldHVybiAgICAgICAgICAgICAgICAgUk4gMAorICAgICAgICAKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNYWluIHJvdXRpbmUKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCisKKyAgICAgICAgTV9BTExPQzQgTVYsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0CisgICAgICAgIE1fQVJHICAgQmxrLCA0CisgICAgICAgIAorICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCisgICAgICAgIE1PViAgIHplcm8sICMwCisgICAgICAgIE1fTERSIGlCbGssIEJsaworICAgICAgICAKKyAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKKyAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKKyAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgorICAgIAorICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQorCisgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgorICAgICAgICBNX1NXSVRDSCBpQmxrCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9FTkRTV0lUQ0gKKyAgICAgICAgCitPTVhWQ0JsazAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4CisKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKKyAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorICAgIAorT01YVkNCbGsxCisgICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAorICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCisgICAgCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKKyAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCisgICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKKyAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMworICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4CisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgCitCbGtFbmQKKworICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCisgICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCisgICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKKyAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCisKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCisgICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQorICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KKworICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCisKKyAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAorICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAorCisgICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAorICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQorICAgICAgICAgICAKKyAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKKyAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKKworICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAorCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCisgICAgCisgICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCisgICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KKworICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgIAorICAgICAgICBNX0VORAorICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmViNTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpAQCAtMCwwICsxLDczIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBJTkNMVURFIGFybUNPTU1fSURDVF9zLmggICAgICAgIAorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybUNPTU1fSURDVFByZVNjYWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRnVuY3Rpb24gcHJvdG90eXBlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gICAgIE9NWFJlc3VsdAorICAgICAgICA7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrKGNvbnN0IE9NWF9TMTYqIHBTcmMsCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYqIHBEc3QpCisgICAgICAgIDsvLyAgICAKKyAgICAgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKKyAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKKyAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4CisgICAgRU5ESUYKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfSURDVDh4OGJsaywgcjExCisgICAgRU5ESUYKKyAgICAKKyAgICAgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworUmVzdWx0ICAgICAgICAgIFJOIDAKKworOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCis7Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKKzsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKKzsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCitwU3JjICAgIFJOIDAgICAgCitTdHJpZGUgIFJOIDEgICAgCitwRGVzdCAgIFJOIDIgICAgCitwU2NhbGUgIFJOIDMgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0CisgICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKKyAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORCAgICAgICAKKyAgICBFTkRJRiAgCisgICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTY1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKQEAgLTAsMCArMSw3MTMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLworOy8vCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKyAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKworICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBBUk0xMTM2SlMgaW1wbGVtZW50YXRpb24KKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBJRiAgQVJNMTEzNkpTCisgICAgCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gTUFDUk8gREVGSU5JVElPTlMKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vCisgICAgOy8vICAgZGVzdFtqXSA9ICh4W2pdICsgeVtqXSArIHJvdW5kKSA+PiAxLCAgIGo9MC4uMworICAgIDsvLworICAgIDsvLyBTaW1pbGFyIHRvIFVIQUREOCBpbnN0cnVjdGlvbiwgYnV0IHdpdGggYSByb3VuZGluZyB2YWx1ZSBvZiAxIGFkZGVkIHRvCisgICAgOy8vIGVhY2ggc3VtIGJlZm9yZSBkaXZpZGluZyBieSB0d28sIGlmIHJvdW5kIGlzIDEKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX1VIQUREOFIgICAkZGVzdCwgJHgsICR5LCAkcm91bmQsICRtYXNrCisgICAgOy8vCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHggICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHhbM10gOiAgeFsyXSAgOiAgeFsxXSAgOiAgeFswXQorICAgIDsvLyAkeSAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgeVszXSA6ICB5WzJdICA6ICB5WzFdICA6ICB5WzBdCisgICAgOy8vICRyb3VuZCAgICAwIGlmIG5vIHJvdW5kaW5nIHRvIGJlIGFkZGVkLCAxIGlmIHJvdW5kaW5nIHRvIGJlIGRvbmUKKyAgICA7Ly8gJG1hc2sgICAgIHNvbWUgcmVnaXN0ZXIgc2V0IHRvIDB4ODA4MDgwODAKKyAgICA7Ly8KKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJGRlc3QgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQorCisgICAgTUFDUk8KKyAgICBNX1VIQUREOFIgICAkZGVzdCwgJHgsICR5LCAkcm91bmQsICRtYXNrCisgICAgSUYgJHJvdW5kID0gMQorICAgICAgICBJRiAgJGRlc3QgLz0gJHkKKyAgICAgICAgICAgIE1WTiAgICAgICAgICRkZXN0LCAkeAorICAgICAgICAgICAgVUhTVUI4ICAgICAgJGRlc3QsICR5LCAkZGVzdAorICAgICAgICAgICAgRU9SICAgICAgICAgJGRlc3QsICRkZXN0LCAkbWFzaworICAgICAgICBFTFNFCisgICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHkKKyAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeCwgJGRlc3QKKyAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKKyAgICAgICAgRU5ESUYKKyAgICBFTFNFCisgICAgICAgIFVIQUREOCAgICAgICRkZXN0LCAkeCwgJHkKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIExvYWQgOCBieXRlcyBmcm9tICRwU3JjIChhbGlnbmVkIG9yIHVuYWxpZ25lZCBsb2NhdGlvbnMpCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9MT0FEX1ggICAgJHBTcmMsICRzcmNTdGVwLCAkb3V0MCwgJG91dDEsICRzY3JhdGNoLCAkb2Zmc2V0CisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwU3JjICAgICAgIDQgYnl0ZSBhbGlnbmVkIHNvdXJjZSBwb2ludGVyIHRvIGFuIGFkZHJlc3MganVzdCBsZXNzIHRoYW4gCisgICAgOy8vICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBkYXRhIGxvY2F0aW9uCisgICAgOy8vICRzcmNTdGVwICAgIFRoZSBzdHJpZGUgb24gc291cmNlCisgICAgOy8vICRzY3JhdGNoICAgIEEgc2NyYXRjaCByZWdpc3RlciwgdXNlZCBpbnRlcm5hbGx5IGZvciB0ZW1wIGNhbGN1bGF0aW9ucworICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgorICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQorICAgIDsvLworICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICBJbiBjYXNlIHRoZSBtYWNybyBhY2NlcHRzIHN0cmlkZSwgaXQgaW5jcmVtZW50cyB0aGUgcFNyYyBieSAKKyAgICA7Ly8gICAgICAgICAgICAgdGhhdCB2YWx1ZSwgZWxzZSB1bmNoYW5nZWQKKyAgICA7Ly8gJG91dDAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgelszXSA6ICB6WzJdICA6ICB6WzFdICA6ICB6WzBdCisgICAgOy8vICRvdXQxICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbN10gOiAgels2XSAgOiAgels1XSAgOiAgels0XQorICAgIDsvLworICAgIDsvLyBOb3RlOiB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZworICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcuIEluIGNhc2Ugb2Zmc2V0IGlzIDAsICRzY3JhdGNoIGlzIG5vdCBtb2RpZmllZC4KKworICAgIE1BQ1JPCisgICAgTV9MT0FEX1ggICAgJHBTcmMsICRzcmNTdGVwLCAkb3V0MCwgJG91dDEsICRzY3JhdGNoLCAkb2Zmc2V0CisgICAgICAgIElGICRvZmZzZXQgPSAwCisgICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyRvdXQwLCAkb3V0MX0KKyAgICAgICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDEsICRzY3JhdGNofSAKKyAgICAgICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDAsICRvdXQwLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MCwgJG91dDAsICRvdXQxLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisgICAgICAgICAgICBNT1YgICAgICAgICAkb3V0MSwgJG91dDEsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICRvdXQxLCAkb3V0MSwgJHNjcmF0Y2gsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKyAgICAgICAgRU5ESUYKKyAgICBNRU5ECisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIExvYWRzIHRocmVlIHdvcmRzIGZvciBYIGludGVycG9sYXRpb24sIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgcm93LiBGb3IgCisgICAgOy8vIFggaW50ZXJwb2xhdGlvbiwgZ2l2ZW4gYSB0cnVuY2F0ZWQtNGJ5dGVBbGlnbmVkIHNvdXJjZSBwb2ludGVyLCAKKyAgICA7Ly8gaW52YXJpYWJseSB0aHJlZSBjb250aW5vdXMgd29yZHMgYXJlIHJlcXVpcmVkIGZyb20gdGhlcmUgdG8gZ2V0IHRoZQorICAgIDsvLyBuaW5lIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBwb2ludGVyIGZvciBmaWx0ZXJpbmcuIAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTE9BRF9YSU5UICRwU3JjLCAkc3JjU3RlcCwgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwU3JjICAgICAgIDQgYnl0ZSBhbGlnbmVkIHNvdXJjZSBwb2ludGVyIHRvIGFuIGFkZHJlc3MganVzdCBsZXNzIHRoYW4gCisgICAgOy8vICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBkYXRhIGxvY2F0aW9uCisgICAgOy8vCisgICAgOy8vICRzcmNTdGVwICAgIFRoZSBzdHJpZGUgb24gc291cmNlCisgICAgOy8vCisgICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCisgICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCisgICAgOy8vCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRwU3JjICAgICAgIEluY3JlbWVudGVkIGJ5ICRzcmNTdGVwCisgICAgOy8vCisgICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAgICAgICAgICAgICBUaHJlZSBvZiB0aGVzZSBhcmUgb3V0cHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAorICAgIDsvLyAgICAgICAgICAgICBUaGUgb3V0cHV0cyBhcmUgc3BlY2lmaWNhbGx5IGdlbmVyYXRlZCB0byBiZSBwcm9jZXNzZWQgYnkgCisgICAgOy8vICAgICAgICAgICAgIHRoZSBNX0VYVF9YSU5UIG1hY3JvLiBGb2xsb3dpbmcgaXMgdGhlIGlsbHVzdHJhdGlvbiB0byBzaG93IAorICAgIDsvLyAgICAgICAgICAgICBob3cgdGhlIG5pbmUgYnl0ZXMgYXJlIHNwYW5uZWQgZm9yIGRpZmZlcmVudCBvZmZzZXRzIGZyb20gCisgICAgOy8vICAgICAgICAgICAgIG5vdFRydW5jYXRlZEZvckFsaWdubWVudFNvdXJjZVBvaW50ZXIuCisgICAgOy8vCisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gICAgICAgICAgICAgfCBPZmZzZXQgfCBBbGlnbmVkIFB0ciB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKKyAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAwICAgfCAgICAgICAwICAgICB8IDAxMjMgIHwgNDU2NyAgfCA4eHh4ICB8ICAgICAgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAxICAgfCAgICAgIC0xICAgICB8IHgwMTIgIHwgMzQ1NiAgfCA3OHh4ICB8ICAgICAgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAyICAgfCAgICAgIC0yICAgICB8IHh4MDEgIHwgMjM0NSAgfCA2Nzh4ICB8ICAgICAgIHwKKyAgICA7Ly8gICAgICAgICAgICAgfCAgICAzICAgfCAgICAgIC0zICAgICB8IHh4eDAgIHwgICAgICAgfCAxMjM0ICB8IDU2NzggIHwKKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAKKyAgICA7Ly8gICAgICAgICAgICAgd2hlcmUgdGhlIG51bWJlcmluZyAoMC04KSBpcyB0byBkZXNpZ25hdGUgdGhlIDkgYnl0ZXMgZnJvbQorICAgIDsvLyAgICAgICAgICAgICBzdGFydCBvZiBhIHBhcnRpY3VsYXIgcm93LiBUaGUgaWxsdXN0cmF0aW9uIGRvZXNuJ3QgdGFrZSBpbiAKKyAgICA7Ly8gICAgICAgICAgICAgYWNjb3VudCB0aGUgcG9zaXRpb25pbmcgb2YgYnl0ZXMgd2l0aCBpbiB0aGUgd29yZCBhbmQgdGhlIAorICAgIDsvLyAgICAgICAgICAgICBtYWNybyBjb21iaW5hdGlvbiB3aXRoIE1fRVhUX1hJTlQgd2lsbCB3b3JrIG9ubHkgaW4gbGl0dGxlIAorICAgIDsvLyAgICAgICAgICAgICBlbmRpYW4gZW52aXJvbnMKKyAgICA7Ly8gCisgICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCisKKyAgICBNQUNSTworICAgIE1fTE9BRF9YSU5UICRwU3JjLCAkc3JjU3RlcCwgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgICAgIElGICRvZmZzZXQgLz0gMworICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMSwgJHdvcmQyfQorICAgICAgICBFTFNFCisgICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyR3b3JkMCwgJHdvcmQyLCAkd29yZDN9CisgICAgICAgIEVORElGCisgICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKKyAgICBNRU5ECisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIEV4dHJhY3QgZm91ciByZWdpc3RlcnMgb2YgZm91ciBwaXhlbHMgZm9yIFggaW50ZXJwb2xhdGlvbiAKKyAgICA7Ly8gCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9FWFRfWElOVCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKKyAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKKyAgICA7Ly8gCisgICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAgICAgICAgICAgICBUaHJlZSBvZiB0aGVzZSBhcmUgaW5wdXRzIGJhc2VkIG9uIHRoZSAkb2Zmc2V0IHBhcmFtZXRlci4gCisgICAgOy8vICAgICAgICAgICAgIFRoZSBpbnB1dHMgYXJlIHNwZWNpZmljYWxseSBzZWxlY3RlZCB0byBiZSBwcm9jZXNzZWQgYnkgCisgICAgOy8vICAgICAgICAgICAgIHRoZSBNX0VYVF9YSU5UIG1hY3JvLgorICAgIDsvLworICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8CisgICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCB5eXl5ICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCB5eXl5ICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCB5eXl5ICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8IHl5eXkgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAgICAgICAgICAgICBCeXRlcyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgcG9pbnRlciAobm90IHRydW5jYXRlZCBmb3IKKyAgICA7Ly8gICAgICAgICAgICAgNCBieXRlIGFsaWdubWVudCkgYXMgc2hvd24gaW4gdGhlIHRhYmxlLiAKKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gICAgICAgICAgICAgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8CisgICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIDsvLyAgICAgICAgICAgICB8IDAxMjMgIHwgNDU2NyAgfCAxMjM0ICB8IDU2NzggIHwKKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8KKyAgICA7Ly8gTm90ZTogeyR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkM30gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZworICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcKKworICAgIE1BQ1JPCisgICAgTV9FWFRfWElOVCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICAgICAgSUYgJG9mZnNldCA9IDAKKyAgICAgICAgICAgIDsgJHdvcmQwIGFuZCAkd29yZDEgYXJlIG9rCisgICAgICAgICAgICA7ICR3b3JkMiwgJHdvcmQzIGFyZSBqdXN0IDggc2hpZnRlZCB2ZXJzaW9ucworICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQzLCAkd29yZDEsIExTUiAjOAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQzLCAkd29yZDMsICR3b3JkMiwgTFNMICMyNAorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQyLCAkd29yZDAsIExTUiAjOAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQyLCAkd29yZDIsICR3b3JkMSwgTFNMICMyNAorICAgICAgICBFTElGICRvZmZzZXQgPSAzCisgICAgICAgICAgICA7ICR3b3JkMiBhbmQgJHdvcmQzIGFyZSBvayAodGFrZW4gY2FyZSB3aGlsZSBsb2FkaW5nIGl0c2VsZikKKyAgICAgICAgICAgIDsgc2V0ICR3b3JkMCAmICR3b3JkMQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjMjQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDIsIExTTCAjOAorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQxLCAkd29yZDIsIExTUiAjMjQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMSwgJHdvcmQxLCAkd29yZDMsIExTTCAjOAorICAgICAgICBFTFNFCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDAsICR3b3JkMCwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQwLCAkd29yZDAsICR3b3JkMSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQxLCAkd29yZDEsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMSwgJHdvcmQxLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKworICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQzLCAkd29yZDEsIExTUiAjOAorICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQzLCAkd29yZDMsICR3b3JkMiwgTFNMICMoMzIgLSA4ICogKCgkb2Zmc2V0KSsxKSkKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKKyAgICAgICAgRU5ESUYKKyAgICBNRU5ECisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIENvbXB1dGVzIGhhbGYtc3VtIGFuZCB4b3Igb2YgdHdvIGlucHV0cyBhbmQgcHV0cyB0aGVtIGluIHRoZSBpbnB1dCAKKyAgICA7Ly8gcmVnaXN0ZXJzIGluIHRoYXQgb3JkZXIKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0hTVU1fWE9SICAgICAgJHYwLCAkdjEsICR0bXAKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHYwICAgICAgICAgYSwgZmlyc3QgaW5wdXQKKyAgICA7Ly8gJHYxICAgICAgICAgYiwgc2Vjb25kIGlucHV0CisgICAgOy8vICR0bXAgICAgICAgIHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICR2MCAgICAgICAgIChhICsgYikvMgorICAgIDsvLyAkdjEgICAgICAgICBhIF4gYgorCisgICAgTUFDUk8KKyAgICBNX0hTVU1fWE9SICAgICAgJHYwLCAkdjEsICR0bXAKKyAgICAgICAgVUhBREQ4ICAgICAgJHRtcCwgJHYwLCAkdjEgICAgIDsvLyBzMCA9IGEgKyBiCisgICAgICAgIEVPUiAgICAgICAgICR2MSwgJHYwLCAkdjEgICAgICA7Ly8gbDAgPSBhIF4gYgorICAgICAgICBNT1YgICAgICAgICAkdjAsICR0bXAgICAgICAgICAgOy8vIHMwCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gQ2FsY3VsYXRlcyBhdmVyYWdlIG9mIDQgdmFsdWVzIChhLGIsYyxkKSBmb3IgSGFsZlBpeGVsWFkgcHJlZGljdCB0eXBlIGluIAorICAgIDsvLyBtY1JlY29uQmxvY2sgbW9kdWxlLiBWZXJ5IHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgZG9uZSBoZXJlLiBVc2VzICJ0bXAiIGFzIHNjcmF0Y2ggcmVnaXN0ZXIgYW5kIAorICAgIDsvLyAieU1hc2siIGZvciBtYXNrIHZhcmlhYmxlICIweDEwMTAxMDF4IiBzZXQgaW4gaXQuIEluIHlNYXNrIDQgbHNicyBhcmUgCisgICAgOy8vIG5vdCBzaWduaWZpY2FudCBhbmQgYXJlIHVzZWQgYnkgdGhlIGNhbGxlZSBmb3Igcm93IGNvdW50ZXIgKHkpCisgICAgOy8vCisgICAgOy8vIFNvbWUgcG9pbnRzIHRvIG5vdGUgYXJlOgorICAgIDsvLyAxLiBJbnB1dCBpcyBwYWlyIG9mIHBhaXItYXZlcmFnZXMgYW5kIFhvcnMKKyAgICA7Ly8gMi4gJHN1bTEgYW5kICRsc2IxIGFyZSBub3QgbW9kaWZpZWQgYW5kIGhlbmNlIGNhbiBiZSByZXVzZWQgaW4gYW5vdGhlciAKKyAgICA7Ly8gICAgcnVubmluZyBhdmVyYWdlCisgICAgOy8vIDMuIE91dHB1dCBpcyBpbiB0aGUgZmlyc3QgYXJndW1lbnQKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0FWRzQgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkc3VtMCAgICAgICAoYSArIGIpID4+IDEsIHdoZXJlIGEgYW5kIGIgYXJlIDFzdCBhbmQgMm5kIGlucHV0cyB0byBiZSBhdmVyYWdlZAorICAgIDsvLyAkbHNiMCAgICAgICAoYSBeIGIpCisgICAgOy8vICRzdW0xICAgICAgIChjICsgZCkgPj4gMS4gTm90IG1vZGlmaWVkCisgICAgOy8vICRsc2IxICAgICAgIChjIF4gZCkgICAgICAgTm90IG1vZGlmaWVkCisgICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkc3VtMCAgICAgICAoYSArIGIgKyBjICsgZCArIDEpIC8gNCA6IElmIG5vIHJvdW5kaW5nCisgICAgOy8vICAgICAgICAgICAgIChhICsgYiArIGMgKyBkICsgMikgLyA0IDogSWYgcm91bmRpbmcKKworICAgIE1BQ1JPCisgICAgTV9BVkc0ICAgICAgICAgICRzdW0wLCAkbHNiMCwgJHN1bTEsICRsc2IxLCAkcm5kVmFsCisgICAgICAgIExDTFMgT1AxCisgICAgICAgIExDTFMgT1AyCisgICAgICAgIElGICRybmRWYWwgPSAwIDsvLyByb3VuZGluZyBjYXNlCitPUDEgU0VUUyAiQU5EIgorT1AyIFNFVFMgIk9SUiIKKyAgICAgICAgRUxTRSAgICAgICAgICAgOy8vIE5vdCByb3VuZGluZyBjYXNlCitPUDEgU0VUUyAiT1JSIgorT1AyIFNFVFMgIkFORCIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIExDTFMgbHNiMgorICAgICAgICBMQ0xTIHN1bTIKKyAgICAgICAgTENMUyBkZXN0CisgICAgCitsc2IyICBTRVRTICJ0bXAiCitzdW0yICBTRVRTICIkbHNiMCIKK2Rlc3QgIFNFVFMgIiRzdW0wIgorCisgICAgICAgICRPUDEgICAgICAgICRsc2IwLCAkbHNiMCwgJGxzYjEgICAgICAgICAgOy8vIGUwID0gZTAgJiBlMQorICAgICAgICBFT1IgICAgICAgICAkbHNiMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBlMiA9IHMwIF4gczEKKyAgICAgICAgJE9QMiAgICAgICAgJGxzYjIsICRsc2IyLCAkbHNiMCAgICAgICAgICA7Ly8gZTIgPSBlMiB8IGUwCisgICAgICAgIEFORCAgICAgICAgICRsc2IyLCAkbHNiMiwgeU1hc2ssIExTUiAjIDQgOy8vIGUyID0gZTIgJiBtYXNrCisgICAgICAgIFVIQUREOCAgICAgICRzdW0yLCAkc3VtMCwgJHN1bTEgICAgICAgICAgOy8vIHMyID0gKHMwICsgczEpLzIKKyAgICAgICAgVUFERDggICAgICAgJGRlc3QsICRzdW0yLCAkbHNiMiAgICAgICAgICA7Ly8gZGVzdCA9ICBzMiArIGUyCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1vdGlvbiBjb21wZW5zYXRpb24gaGFuZGxlciBtYWNyb3MKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIEltcGxlbWVudCBtb3Rpb24gY29tcGVuc2F0aW9uIHJvdXRpbmVzIHVzaW5nIHRoZSBuYW1lZCByZWdpc3RlcnMgaW4gCisgICAgOy8vIGNhbGxlZSBmdW5jdGlvbi4gRWFjaCBvZiB0aGUgZm9sbG93aW5nIDQgaW1wbGVtZW50IHRoZSA0IHByZWRpY3QgdHlwZQorICAgIDsvLyBFYWNoIGhhbmRsZXMgOCBjYXNlcyBlYWNoIGllIGFsbCB0aGUgY29tYmluYXRpb25zIG9mIDQgdHlwZXMgb2Ygc291cmNlIAorICAgIDsvLyBhbGlnbm1lbnQgb2Zmc2V0cyBhbmQgMiB0eXBlcyBvZiByb3VuZGluZyBmbGFnCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAgICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAgICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgICRybmRWYWwsICRvZmZzZXQKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHJuZFZhbCAgICAgQXNzZW1ibGVyIFZhcmlhYmxlLiAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKKyAgICA7Ly8gJG9mZnNldCAgICAgJHBTcmMgTU9EIDQgdmFsdWUuIE9mZnNldCBmcm9tIDQgYnl0ZSBhbGlnbmVkIGxvY2F0aW9uLgorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gT3V0cHV0cyBjb21lIGluIHRoZSBuYW1lZCByZWdpc3RlcnMgb2YgdGhlIGNhbGxlZSBmdW5jdGlvbnMKKyAgICA7Ly8gVGhlIG1hY3JvIGxvYWRzIHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBwb2ludGVyLCBwcm9jZXNzZXMgaXQgYW5kIAorICAgIDsvLyBzdG9yZXMgaW4gdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIuIERvZXMgdGhlIHdob2xlIHByZWRpY3Rpb24gY3ljbGUKKyAgICA7Ly8gb2YgTW90aW9uIENvbXBlbnNhdGlvbiByb3V0aW5lIGZvciBhIHBhcnRpY3VsYXIgcHJlZGljdFR5cGUKKyAgICA7Ly8gQWZ0ZXIgdGhpcyBvbmx5IHJlc2lkdWUgYWRkaXRpb24gdG8gdGhlIHByZWRpY3RlZCB2YWx1ZXMgcmVtYWluCisKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgorICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSW50ZWdlclBpeGVsIHByZWRpY3RUeXBlLiBCb3RoCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUgYmFzZS4gSXQgaXMganVzdCBhIGNvcHkKKyAgICA7Ly8gZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uIFR3byBsaW5lcyBhcmUgZG9uZSBwZXIgbG9vcCB0byByZWR1Y2UgCisgICAgOy8vIHN0YWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgYXMgd2VsbCBmb3IgdGhhdCBwdXJwb3NlLgorICAgIDsvLyAKKyAgICA7Ly8gTV9MT0FEX1ggbG9hZHMgYSB3aG9sZSByb3cgaW4gdHdvIHJlZ2lzdGVycyBhbmQgdGhlbiB0aGV5IGFyZSBzdG9yZWQKKyAgICAKK0Nhc2VJbnRlZ2VyUGl4ZWxSbmQwT2Zmc2V0JG9mZnNldAorQ2FzZUludGVnZXJQaXhlbFJuZDFPZmZzZXQkb2Zmc2V0CisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wMywgJG9mZnNldAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKK1lsb29wSW50ZWdlclBpeGVsT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMyCisgICAgU1RSRCAgICAgICAgdG1wMSwgdG1wMiwgW3BEc3RdLCBkc3RTdGVwCisgICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wMywgJG9mZnNldAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKKyAgICBCR1QgICAgICAgICBZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgorICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWCBwcmVkaWN0VHlwZS4gVGhlIHR3bworICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKKyAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBMb29wIGhhcyBiZWVuIHNvZnR3YXJlIHBpcGVsaW5lZCB0byByZWR1Y2UgCisgICAgOy8vIHN0YWxscy4KKyAgICA7Ly8gCisgICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IGhvcml6b250YWwgcGl4ZWwuCisgICAgOy8vIE1fTE9BRF9YSU5UIGFuZCBNX0VYVF9YSU5UIGNvbWJpbmF0aW9uIGdlbmVyYXRlIDQgcmVnaXN0ZXJzLCAyIHdpdGggCisgICAgOy8vIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIGVhY2ggcmVnaXN0ZXIgYW5kIGFub3RoZXIgMgorICAgIDsvLyByZWdpc3RlcnMgd2l0aCBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBvbmUgaG9yaXpvbnRhbGx5IHNoaWZ0ZWQgcGl4ZWwKKyAgICA7Ly8gY29ycmVzcG9uZGluZyB0byB0aGUgaW5pdGlhbCByb3cgcGl4ZWxzLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCAKKyAgICA7Ly8gcmVnaXN0ZXJzIGFwcHJvcHJpYXRlIHRvIGRvIDQgbGFuZSBTSU1ELgorICAgIDsvLyBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgb2YgdGhlIAorICAgIDsvLyByb3VuZGluZyBhcyByZXF1aXJlZAorICAgIAorQ2FzZUhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBJRiAkcm5kVmFsID0gMAorICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKKyAgICBFTkRJRgorCisgICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgU1VCUyAgICAgICAgeSwgeSwgIzEKKyAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgTV9VSEFERDhSICAgdG1wNSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBNX1VIQUREOFIgICB0bXA2LCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzaworICAgIFNUUkQgICAgICAgIHRtcDUsIHRtcDYsIFtwRHN0XSwgZHN0U3RlcAorICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgorICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWSBwcmVkaWN0VHlwZS4gVGhlIHR3bworICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKKyAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBQcmVMb2FkaW5nIGlzIHVzZWQgdG8gYXZvaWQgcmVsb2FkIG9mIHNhbWUgZGF0YS4gCisgICAgOy8vIAorICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCB2ZXJ0aWNhbCBwaXhlbC4KKyAgICA7Ly8gTV9MT0FEX1ggZ2VuZXJhdGVzIDIgcmVnaXN0ZXJzIHdpdGggYWxsIHBpeGVscyBpbiBhIHJvdyB3aXRoIDQgcGl4ZWwgaW4gCisgICAgOy8vIGVhY2ggcmVnaXN0ZXIuIFRoZXNlIGFyZSBzZXQgb2YgcGFja2VkIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyAKKyAgICA7Ly8gNCBsYW5lIFNJTUQuIEFmdGVyIHRoYXQgTV9VSEFERDhSIG1hY3JvIGRvZXMgdGhlIGF2ZXJhZ2luZyB0YWtpbmcgY2FyZSAKKyAgICA7Ly8gb2YgdGhlIHJvdW5kaW5nIGFzIHJlcXVpcmVkCisgICAgCitDYXNlSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIElGICRybmRWYWwgPSAwCisgICAgICAgIExEUiBtYXNrLCA9MHg4MDgwODA4MAorICAgIEVORElGCisKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXA1LCAkb2Zmc2V0IDsvLyBQcmUtbG9hZAorWWxvb3BIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgU1VCUyAgICAgICAgeSwgeSwgIzIKKyAgICA7Ly8gUHJvY2Vzc2luZyBvbmUgbGluZQorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKKyAgICBNX1VIQUREOFIgICB0bXAxLCB0bXAxLCB0bXAzLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIE1fVUhBREQ4UiAgIHRtcDIsIHRtcDIsIHRtcDQsICgxLSRybmRWYWwpLCBtYXNrCisgICAgU1RSRCAgICAgICAgdG1wMSwgdG1wMiwgW3BEc3RdLCBkc3RTdGVwCisgICAgOy8vIFByb2Nlc3NpbmcgYW5vdGhlciBsaW5lCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldAorICAgIE1fVUhBREQ4UiAgIHRtcDMsIHRtcDMsIHRtcDEsICgxLSRybmRWYWwpLCBtYXNrCisgICAgTV9VSEFERDhSICAgdG1wNCwgdG1wNCwgdG1wMiwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBTVFJEICAgICAgICB0bXAzLCB0bXA0LCBbcERzdF0sIGRzdFN0ZXAKKworICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgorICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWFkgcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAorICAgIDsvLyAKKyAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwsIGhvcml6b250YWwgCisgICAgOy8vIGFuZCByaWdodC1kb3duIGRpYWdvbmFsIHBpeGVscy4gSnVzdCBhcyBpbiBIYWxmUGl4ZWxYIGNhc2UsIE1fTE9BRF9YSU5UCisgICAgOy8vIGFuZCBNX0VYVF9YSU5UIGNvbWJpbmF0aW9uIGdlbmVyYXRlcyA0IHJlZ2lzdGVycyB3aXRoIGEgcm93IGFuZCBpdHMKKyAgICA7Ly8gMSBwaXhlbCByaWdodCBzaGlmdGVkIHZlcnNpb24sIHdpdGggNCBwaXhlbHMgaW4gb25lIHJlZ2lzdGVyLiBBbm90aGVyIAorICAgIDsvLyBjYWxsIG9mIHRoYXQgbWFjcm8tY29tYmluYXRpb24gZ2V0cyBhbm90aGVyIHJvdy4gVGhlbiBNX0hTVU1fWE9SIGlzIAorICAgIDsvLyBjYWxsZWQgdG8gZ2V0IG11dHVhbCBoYWxmLXN1bSBhbmQgeG9yIGNvbWJpbmF0aW9ucyBvZiBhIHJvdyB3aXRoIGl0cworICAgIDsvLyBzaGlmdGVkIHZlcnNpb24gYXMgdGhleSBhcmUgaW5wdXRzIHRvIHRoZSBNX0FWRzQgbWFjcm8gd2hpY2ggY29tcHV0ZXMKKyAgICA7Ly8gdGhlIDQgZWxlbWVudCBhdmVyYWdlIHdpdGggcm91bmRpbmcuIE5vdGUgdGhhdCBpdCBpcyB0aGUgaGFsZi1zdW0veG9yIAorICAgIDsvLyB2YWx1ZXMgdGhhdCBhcmUgcHJlc2VydmVkIGZvciBuZXh0IHJvdyBhcyB0aGV5IGNhbiBiZSByZS11c2VkIGluIHRoZSAKKyAgICA7Ly8gbmV4dCBjYWxsIHRvIHRoZSBNX0FWRzQgYW5kIHNhdmVzIHJlY29tcHV0YXRpb24uCisgICAgOy8vIER1ZSB0byBsYWNrIG9mIHJlZ2lzdGVyLCB0aGUgcm93IGNvdW50ZXIgYW5kIGEgbWFza2luZyB2YWx1ZSByZXF1aXJlZCAKKyAgICA7Ly8gaW4gTV9BVkc0IGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSByZWdpc3RlciB5TWFzayB3aGVyZSB0aGUgbGFzdCBuaWJibGUKKyAgICA7Ly8gaG9sZHMgdGhlIHJvdyBjb3VudGVyIHZhbHVlcyBhbmQgcmVzdCBob2xkcyB0aGUgbWFza2luZyB2YXJpYWJsZSBsZWZ0IAorICAgIDsvLyBzaGlmdGVkIGJ5IDQKKyAgICAKK0Nhc2VIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIExEUiAgICAgICAgIHlNYXNrLCA9KCgweDAxMDEwMTAxIDw8IDQpICsgOCkKKworICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMSA7Ly8gTG9hZCBhLCBhJywgYiwgYicKKyAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEKKyAgICBNX0hTVU1fWE9SICB0MDAsIHQxMCwgdG1wICAgICAgICAgICAgICAgOy8vIHMwLCBsMAorICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAgICAgICAgICAgICAgICA7Ly8gczAnLCBsMCcKKworWWxvb3BIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIDsvLyBQcm9jZXNzc2luZyBvbmUgbGluZQorICAgIDsvLyB0MDAsIHQwMSwgdDEwLCB0MTEgcmVxdWlyZWQgZnJvbSBwcmV2aW91cyBsb29wCisgICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxIDsvLyBMb2FkIGMsIGMnLCBkLCBkJworICAgIFNVQiAgICAgICAgIHlNYXNrLCB5TWFzaywgIzIKKyAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MjAsIHQyMSwgdDMwLCB0MzEKKyAgICBNX0hTVU1fWE9SICB0MjAsIHQzMCwgdG1wICAgICAgICAgICAgICAgOy8vIHMxLCBsMQorICAgIE1fSFNVTV9YT1IgIHQyMSwgdDMxLCB0bXAgICAgICAgICAgICAgICA7Ly8gczEnLCBsMScKKyAgICBNX0FWRzQgICAgICB0MDAsIHQxMCwgdDIwLCB0MzAsICRybmRWYWwgOy8vIHMwLCBsMCwgczEsIGwxCisgICAgTV9BVkc0ICAgICAgdDAxLCB0MTEsIHQyMSwgdDMxLCAkcm5kVmFsIDsvLyBzMCcsIGwwJywgczEnLCBsMScKKyAgICBTVFJEICAgICAgICB0MDAsIHQwMSwgW3BEc3RdLCBkc3RTdGVwICAgOy8vIHN0b3JlIHRoZSBhdmVyYWdlCisgICAgCisgICAgOy8vIFByb2Nlc3NzaW5nIGFub3RoZXIgbGluZQorICAgIDsvLyB0MjAsIHQyMSwgdDMwLCB0MzEgcmVxdWlyZWQgZnJvbSBhYm92ZQorICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMSA7Ly8gTG9hZCBhLCBhJywgYiwgYicKKyAgICBUU1QgICAgICAgICB5TWFzaywgIzcKKyAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEKKyAgICBNX0hTVU1fWE9SICB0MDAsIHQxMCwgdG1wCisgICAgTV9IU1VNX1hPUiAgdDAxLCB0MTEsIHRtcAorICAgIE1fQVZHNCAgICAgIHQyMCwgdDMwLCB0MDAsIHQxMCwgJHJuZFZhbAorICAgIE1fQVZHNCAgICAgIHQyMSwgdDMxLCB0MDEsIHQxMSwgJHJuZFZhbAorICAgIFNUUkQgICAgICAgIHQyMCwgdDIxLCBbcERzdF0sIGRzdFN0ZXAKKworICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKworICAgIElGICRvZmZzZXQvPTMgOkxPUjogJHJuZFZhbC89MQorICAgICAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIEVORElGCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1vdGlvbiBjb21wZW5zYXRpb24gaGFuZGxlciBtYWNyb3MgZW5kIGhlcmUKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIFBvcHVsYXRlcyBhbGwgNCBraW5kcyBvZiBvZmZzZXRzICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgYW5kIHJuZFZhbAorICAgIDsvLyBjb21iaW5hdGlvbiBpbiB0aGUgInN3aXRjaCIgdG8gcHJlZGljdGlvbiBwcm9jZXNzaW5nIGNvZGUgc2VnbWVudAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRybmQgICAgICAgICAgICAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKKyAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0UicyBmb3IgdGhlICJNX1NXSVRDSCIgbWFjcm8KKworICAgIE1BQ1JPCisgICAgTV9DQVNFX09GRlNFVCAkcm5kLCAkcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDEKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDIKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDMKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDIga2luZHMgb2Ygcm91bmRpbmcgImNhc2VzIiBmb3IgZWFjaCBwcmVkaWN0VHlwZSBpbiB0aGUgCisgICAgOy8vICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRwcmVkaWN0VHlwZQorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQorICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fQ0FTRV9PRkZTRVQiIG1hY3JvcworCisgICAgTUFDUk8KKyAgICBNX0NBU0VfTUNSRUNPTkJMT0NLICRwcmVkaWN0VHlwZQorICAgICAgICBNX0NBU0VfT0ZGU0VUICAwLCAkcHJlZGljdFR5cGUgOy8vIDAgZm9yIHJvdW5kaW5nCisgICAgICAgIE1fQ0FTRV9PRkZTRVQgIDEsICRwcmVkaWN0VHlwZSA7Ly8gMSBmb3Igbm8gcm91bmRpbmcKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDgga2luZHMgb2Ygcm91bmRpbmcgYW5kIG9mZnNldCBjb21iaW5hdGlvbnMgaGFuZGxpbmcgbWFjcm9zIAorICAgIDsvLyBmb3IgdGhlIHNwZWNpZmllZCBwcmVkaWN0VHlwZS4gSW4gY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZSwgCisgICAgOy8vIHJvdW5kaW5nIGlzIG5vdCByZXF1aXJlZCBzbyBzYW1lIGNvZGUgc2VnbWVudCBoYW5kbGVzIGJvdGggY2FzZXMKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX01DUkVDT05CTE9DSyAgICAkcHJlZGljdFR5cGUKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX01DUkVDT05CTE9DS188cHJlZGljdFR5cGU+IiBtYWNyb3MgZm9yIHNwZWNpZmllZCAKKyAgICA7Ly8gcHJlZGljdFR5cGUuIEVhY2ggCisgICAgOy8vICAgICAgICAgICAgICAgICBNX01DUkVDT05CTE9DS188cHJlZGljdFR5cGU+ICRybmQsICRvZmZzZXQgCisgICAgOy8vIGlzIGFuIGNvZGUgc2VnbWVudCAoc3RhcnRpbmcgd2l0aCBhIGxhYmVsIGluZGljYXRpbmcgdGhlIHByZWRpY3RUeXBlLCAKKyAgICA7Ly8gcm91bmRpbmcgYW5kIG9mZnNldCBjb21iaW5hdGlvbikKKyAgICA7Ly8gRm91ciBjYWxscyBvZiB0aGlzIG1hY3JvIHdpdGggdGhlIDQgcHJlZGljdGlvbiBtb2RlcyBwb3B1bGF0ZSBhbGwgdGhlIDMyIAorICAgIDsvLyBoYW5kbGVycworCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDAKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDEKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDIKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDMKKyAgICBJRiAiJHByZWRpY3RUeXBlIiAvPSAiSW50ZWdlclBpeGVsIiA7Ly8gSWYgbm90IEludGVnZXJQaXhlbCB0aGVuIHJvdW5kaW5nIG1ha2VzIGEgZGlmZmVyZW5jZQorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMAorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMQorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMgorICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMworICAgIEVORElGCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIElucHV0L091dHB1dCBSZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgICAgICAgUk4gMQorYXJnX3BTcmNSZXNpZHVlICAgICAgIFJOIDIKK3BTcmNSZXNpZHVlICAgICAgICAgICBSTiAxMgorcERzdCAgICAgICAgICAgICAgICAgIFJOIDMKK2RzdFN0ZXAgICAgICAgICAgICAgICBSTiAyCitwcmVkaWN0VHlwZSAgICAgICAgICAgUk4gMTAKK3JuZFZhbCAgICAgICAgICAgICAgICBSTiAxMQorbWFzayAgICAgICAgICAgICAgICAgIFJOIDExCisKKzsvLyBMb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworemVybyAgICAgICAgICAgICAgICAgIFJOIDEyCit5ICAgICAgICAgICAgICAgICAgICAgUk4gMTQKKwordG1wMSAgICAgICAgICAgICAgICAgIFJOIDQKK3RtcDIgICAgICAgICAgICAgICAgICBSTiA1Cit0bXAzICAgICAgICAgICAgICAgICAgUk4gNgordG1wNCAgICAgICAgICAgICAgICAgIFJOIDcKK3RtcDUgICAgICAgICAgICAgICAgICBSTiA4Cit0bXA2ICAgICAgICAgICAgICAgICAgUk4gOQordG1wNyAgICAgICAgICAgICAgICAgIFJOIDEwCit0bXA4ICAgICAgICAgICAgICAgICAgUk4gMTEKK3RtcDkgICAgICAgICAgICAgICAgICBSTiAxMgorCit0MDAgICAgICAgICAgICAgICAgICAgUk4gNAordDAxICAgICAgICAgICAgICAgICAgIFJOIDUKK3QxMCAgICAgICAgICAgICAgICAgICBSTiA2Cit0MTEgICAgICAgICAgICAgICAgICAgUk4gNwordDIwICAgICAgICAgICAgICAgICAgIFJOIDgKK3QyMSAgICAgICAgICAgICAgICAgICBSTiA5Cit0MzAgICAgICAgICAgICAgICAgICAgUk4gMTAKK3QzMSAgICAgICAgICAgICAgICAgICBSTiAxMQordG1wICAgICAgICAgICAgICAgICAgIFJOIDEyCisKK3lNYXNrICAgICAgICAgICAgICAgICBSTiAxNAorCitkc3QgICAgICAgICAgICAgICAgICAgUk4gMQorcmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworICAgIDsvLyBBbGxvY2F0ZSBtZW1vcnkgb24gc3RhY2sKKyAgICBNX0FMTE9DNCAgICBTdGtfcERzdCwgICAgICAgICAgIDQKKyAgICBNX0FMTE9DNCAgICBTdGtfcFNyY1Jlc2lkdWUsICAgIDQKKyAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgTV9TVEFSVCAgICAgb214VkNNNFAyX01DUmVjb25CbG9jaywgcjExCisgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKKyAgICA7Ly8gU2F2ZSBvbiBzdGFjaworICAgIE1fU1RSICAgICAgIHBEc3QsIFN0a19wRHN0CisgICAgTV9TVFIgICAgICAgYXJnX3BTcmNSZXNpZHVlLCBTdGtfcFNyY1Jlc2lkdWUKKyAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCisgICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQorICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAorICAgIAorICAgIE1PViAgICAgICAgIHksICM4CisgICAgCisgICAgQU5EICAgICAgICAgdG1wMSwgcFNyYywgIzMKKyAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgdG1wMSwgcHJlZGljdFR5cGUsIExTTCAjMworICAgIE9SUiAgICAgICAgIHByZWRpY3RUeXBlLCBwcmVkaWN0VHlwZSwgcm5kVmFsLCBMU0wgIzIKKyAgICA7Ly8gVHJ1bmNhdGluZyBzb3VyY2UgcG9pbnRlciB0byBhbGlnbiB0byA0IGJ5dGUgbG9jYXRpb24KKyAgICBCSUMgICAgICAgICBwU3JjLCBwU3JjLCAjMworCisgICAgOy8vIEltcGxlbWVudGF0aW9uIHRha2VzIGNhcmUgb2YgYWxsIGNvbWJpbmF0aW9ucyBvZiBkaWZmZXJlbnQgCisgICAgOy8vIHByZWRpY3RUeXBlcywgcm91bmRpbmcgY2FzZXMgYW5kIHNvdXJjZSBwb2ludGVyIG9mZnNldHMgdG8gYWxpZ25tZW50IAorICAgIDsvLyBvZiA0IGJ5dGVzIGluIGRpZmZlcmVudCBjb2RlIGJhc2VzIHVubGVzcyBvbmUgb2YgdGhlc2UgcGFyYW1ldGVyIHdhc24ndCAKKyAgICA7Ly8gbWFraW5nIGFueSBkaWZmZXJlbmNlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4gQmVsb3cgTV9DQVNFX01DUkVDT05CTE9DSworICAgIDsvLyBtYWNyb3MgYnJhbmNoIGludG8gOCBNX0NBU0UgbWFjcm9zIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRoZSAyIAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhbmQgNCBvZmZzZXRzIG9mIHRoZSBwU3JjIHBvaW50ZXIgdG8gdGhlIDQgYnl0ZSAKKyAgICA7Ly8gYWxpZ25tZW50LiAKKyAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxZCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWFkKKyAgICBNX0VORFNXSVRDSAorCisgICAgOy8vIFRoZSBNX01DUkVDT05CTE9DSyBtYWNyb3MgcG9wdWxhdGUgdGhlIGNvZGUgYmFzZXMgYnkgY2FsbGluZyBhbGwgOCAKKyAgICA7Ly8gcGFydGljdWxhciBtYWNyb3MgKDQgaW4gY2FzZSBvZiBJbnRlZ2VyUGl4ZWwgYXMgcm91bmRpbmcgbWFrZXMgbm8gCisgICAgOy8vIGRpZmZlcmVuY2UgdGhlcmUpIHRvIGdlbmVyYXRlIHRoZSBjb2RlIGZvciBhbGwgY2FzZXMgb2Ygcm91bmRpbmcgYW5kIAorICAgIDsvLyBvZmZzZXRzLiBMVE9SRyBpcyB1c2VkIHRvIHNlZ21lbnQgdGhlIGNvZGUgYXMgY29kZSBzaXplIGJsb2F0ZWQgYmV5b25kIAorICAgIDsvLyA0S0IuCisgICAgTV9NQ1JFQ09OQkxPQ0sgSW50ZWdlclBpeGVsCisgICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWAorICAgIExUT1JHCisgICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQorICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCitTd2l0Y2hQcmVkaWN0VHlwZUVuZAorCisgICAgOy8vIFJlc2lkdWUgQWRkaXRpb24KKyAgICA7Ly8gVGhpcyBpcyBkb25lIGluIDIgbGFuZSBTSU1EIHRob3VnaCBsb2FkcyBhcmUgZnVydGhlciBvcHRpbWl6ZWQgYW5kCisgICAgOy8vIDQgYnl0ZXMgYXJlIGxvYWRlZCBpbiBjYXNlIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlci4gQWxnb3JpdGhtaWMgCisgICAgOy8vIGRldGFpbHMgYXJlIGluIGlubGluZWQgY29tbWVudHMKKyAgICBNX0xEUiAgICAgICBwU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCisgICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCisgICAgQkVRICAgICAgICAgcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKK3BTcmNSZXNpZHVlTm90TnVsbCAgICAKKyAgICBNX0xEUiAgICAgICBwRHN0LCBTdGtfcERzdAorICAgIE1PViAgICAgICAgIHksICM4CisgICAgU1VCICAgICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQKK1lsb29wX3BTcmNSZXNpZHVlTm90TnVsbAorICAgIFNVQlMgICAgICAgIHksIHksICMxCisgICAgTERSICAgICAgICAgZHN0LCBbcERzdF0gICAgICAgICAgICAgICAgOy8vIGRzdCA9IFtkY2JhXQorICAgIExETUlBICAgICAgIHBTcmNSZXNpZHVlISwge3RtcDEsIHRtcDJ9IDsvLyB0bXAxPVtEQ10gdG1wMj1bQkFdCisgICAgUEtIQlQgICAgICAgdG1wMywgdG1wMSwgdG1wMiwgTFNMICMxNiAgOy8vIERlbHRhdmFsMSA9IFtDIEFdCisgICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNiAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCisgICAgVVhUQjE2ICAgICAgdG1wMSwgZHN0ICAgICAgICAgICAgICAgICAgOy8vIHRtcDEgPSBbMGMwYV0KKyAgICBVWFRCMTYgICAgICB0bXAyLCBkc3QsIFJPUiAjOCAgICAgICAgICA7Ly8gdG1wMiA9IFswZDBiXQorICAgIFFBREQxNiAgICAgIHRtcDEsIHRtcDEsIHRtcDMgICAgICAgICAgIDsvLyBBZGQgYW5kIHNhdHVyYXRlIHRvIDE2IGJpdHMKKyAgICBRQUREMTYgICAgICB0bXAyLCB0bXAyLCB0bXA0CisgICAgVVNBVDE2ICAgICAgdG1wMSwgIzgsIHRtcDEKKyAgICBVU0FUMTYgICAgICB0bXAyLCAjOCwgdG1wMiAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLCAyNTUsIHRtcDIpCisgICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4ICAgOy8vIHRtcDEgPSBbZGNiYV0KKyAgICBTVFIgICAgICAgICB0bXAxLCBbcERzdF0sICM0CisgICAgCisgICAgTERSICAgICAgICAgZHN0LCBbcERzdF0KKyAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfQorICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYKKyAgICBQS0hUQiAgICAgICB0bXA0LCB0bXAyLCB0bXAxLCBBU1IgIzE2CisgICAgVVhUQjE2ICAgICAgdG1wMSwgZHN0CisgICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzgKKyAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzCisgICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAorICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCisgICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIKKyAgICBPUlIgICAgICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKyAgICBTVFIgICAgICAgICB0bXAxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAKKyAgICBCR1QgICAgICAgICBZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKK3BTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCisKKyAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisKKyAgICBNX0VORAorICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcnRleEE4IGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gb214VkNNNFAyX01DUmVjb25CbG9jayBlbmRzCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzNDQ0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpAQCAtMCwwICsxLDI4MyBAQAorOyAqKioqKioqKioqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KKzsgKgorOyAqIAorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKzsgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorOyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCAKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGhlIAorOyAqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIAorOyAqICAgICAgICAgICAgICAgICAgICBbLTIwNDgsIDIwNDddLgorOyAqIFtpbl0gIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgCis7ICogICAgICAgICAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgY3VyUVAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSAKKzsgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSAgcHJlZFFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtpbl0gIHByZWREaXIgICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKzsgKiBbaW5dICBBQ1ByZWRGbGFnICAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKzsgKiAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorOyAqIFtpbl0gIHZpZGVvQ29tcCAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorOyAqICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKzsgKiBbb3V0XSBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2sKKzsgKiBbb3V0XSBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW291dF0gcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4KKzsgKiAtIEF0IGxlYXN0IG9uZSB0aGUgZm9sbG93aW5nIGNhc2VzOiBjdXJRUCA8PSAwLCBwcmVkUVAgPD0gMCwgY3VyUVAgPjMxLCAKKzsgKiAgIHByZWRRUCA+IDMxLCBwcmVEaXIgZXhjZWVkcyBbMSwyXS4KKzsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCAKKzsgKiAgIDQtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICoqKioqKioqKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgIAorICAgICAgICAgICAgIAorCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICAgCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKworCis7Ly8gSW5wdXQgQXJndW1lbnRzCisKK3BTcmNEc3QgICAgICAgICAgUk4gMAorcFByZWRCdWZSb3cgICAgICBSTiAxCitwUHJlZEJ1ZkNvbCAgICAgIFJOIDIKK2N1clFQICAgICAgICAgICAgUk4gMworUVAgICAgICAgICAgICAgICBSTiAzCitwcmVkUVAgICAgICAgICAgIFJOIDQKK3ByZWREaXIgICAgICAgICAgUk4gNQorQUNQcmVkRmxhZyAgICAgICBSTiA2Cit2aWRlb0NvbXAgICAgICAgIFJOIDcgIAorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK3RlbXAyICAgICAgICAgICAgUk4gNQorbmVnQ3VyUVAgICAgICAgICBSTiA3CituZWdkY1NjYWxlciAgICAgIFJOIDcKK3RlbXBQcmVkICAgICAgICAgUk4gOAorCitkY1NjYWxlciAgICAgICAgIFJOIDQKK0NvZWZmVGFibGUgICAgICAgUk4gOQorYWJzQ29lZmZEQyAgICAgICBSTiA5Cit0ZW1wMyAgICAgICAgICAgIFJOIDYKK2Fic0NvZWZmQUMgICAgICAgUk4gNgorCitzaG9ydFZpZGVvSGVhZGVyIFJOIDkKK3ByZWRDb2VmZlRhYmxlICAgUk4gMTAKK0NvdW50ICAgICAgICAgICAgUk4gMTAKK3RlbXAxICAgICAgICAgICAgUk4gMTIKK2luZGV4ICAgICAgICAgICAgUk4gMTIKK1JlbSAgICAgICAgICAgICAgUk4gMTQKK3RlbXAgICAgICAgICAgICAgUk4gMTEKK1JldHVybiAgICAgICAgICAgUk4gMAorCisgICAgICAgCisKKyAgICAgICBNX1NUQVJUICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSxyMTIKKyAgICAgICAKKyAgICAgICA7Ly8gQXNzaWduaW5nIHBvaW50ZXJzIHRvIElucHV0IGFyZ3VtZW50cyBvbiBTdGFjaworICAgIAorICAgICAgIE1fQVJHICAgICAgICAgICBwcmVkUVBvblN0YWNrLDQgIAorICAgICAgIE1fQVJHICAgICAgICAgICBwcmVkRGlyb25TdGFjayw0CisgICAgICAgTV9BUkcgICAgICAgICAgIEFDUHJlZEZsYWdvblN0YWNrLDQKKyAgICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25TdGFjayw0CisgICAgICAgCisgICAgICAgOy8vIERDIFByZWRpY3Rpb24KKworICAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25TdGFjayAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZpZGVvQ29tcCBGcm9tIFN0YWNrICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHByZWREaXIscHJlZERpcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgUHJlZGljdGlvbiBkaXJlY3Rpb24KKyAgICAgICAKKyAgICAgICA7Ly8gZGNTY2FsZXIgQ2FsY3VsYXRpb24KKworICAgICAgIExEUiAgICAgICAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgIEFERCAgICAgICAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICAgTERSQiAgICAgICAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KKyAgICAgICAgICAgCisgICAgCitjYWxEQ1ZhbAorICAgICAgCisgICAgICAgCisgICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2ICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAzMjc2Ny8oMSB0byA2MykgCisgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIHZlcnRpY2FsCisKKyAgICAgICA7Ly8gQ2F1bHVjYXRlIHRlbXAgcHJlZCBieSBwZXJmb3JtaW5nIERpdmlzaW9uCisgICAgICAgICAgICAKKyAgICAgICBMRFJFUVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdmV0aWNhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIFJvdyBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgIExEUk5FU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBob3Jpem9udGFsIGxvYWQgdGhlIGNvZWZmIGZyb20gY29sdW1uIFByZWRpY3Rpb24gQnVmZmVyCisgICAgICAgCisgICAgICAgUlNCICAgICAgICAgICAgIG5lZ2RjU2NhbGVyLGRjU2NhbGVyLCMwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5lZ2RjU2NhbGVyPS1kY1NjYWxlciAgCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXByZWRpY3Rpb24gY29lZmYKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZEQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9hYnNDb2VmZkRDPWFicyh0ZW1wMSkKKyAgICAgICAKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCxkY1NjYWxlcixkY1NjYWxlcgorICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwcmVkQ29lZmZUYWJsZSx0ZW1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHZhbHVlIGZyb20gY29lZmYgdGFibGUgZm9yIHBlcmZvcm1pbmcgZGl2aXNpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KKyAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcFByZWQsdGVtcCxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXSozMjc2Ny9kY1NjYWxlcgorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMyxkY1NjYWxlciwjMQorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdL2RjU2NhbGVyICAgICAgICAgIAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMyx0ZW1wMywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMz1yb3VuZChkY1NjYWxlci8yKQorICAgICAgIAorICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnZGNTY2FsZXIsdGVtcFByZWQsYWJzQ29lZmZEQyAgICAgICAgICAgIDsvLyBSZW0gPSBwUHJlZEJ1ZlJvdyhDb2wpWzBdLXRlbXBQcmVkKmRjU2NhbGVyICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmQ29sXQorICAgICAgIENNUCAgICAgICAgICAgICBSZW0sdGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBSZW0+PXJvdW5kKGRjU2NhbGVyLzIpO3RlbXBQcmVkPXRlbXBQcmVkKzEKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8gaWYgcFByZWRCdWZSb3coQ29sKVswXTwwOyB0ZW1wUHJlZD0tdGVtcFByZWQKKyAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZSb3csIy0xNl0gICAgICAKKworICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0KKyAgICAgICBNX0xEUiAgICAgICAgICAgQUNQcmVkRmxhZyxBQ1ByZWRGbGFnb25TdGFjaworICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbMF0rdGVtcFByZWQKKyAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQorICAgICAgIAorICAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wMSx0ZW1wLGRjU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1jbGlwcGVkKHBTcmNEc3RbMF0pKmRjU2NhbGVyICAgICAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgcHJlZFFQLHByZWRRUG9uU3RhY2sKKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgQUNQcmVkRmxhZywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIEFDIHByZWRpY3Rpb24gZmxhZyBpcyBzZXQgb3Igbm90CisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAxLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAxIHRvIHBQcmVkQnVmQ29sCisgCisgICAgICAgOy8vIEFDIFByZWRpY3Rpb24KKworICAgICAgICAgICAgICAKKyAgICAgICBCTkUgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgbm90IHNldCBFeGl0CisgICAgICAgCisgICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAweDFmZmZmLygxIHRvIDYzKQorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjNAorICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wMSxjdXJRUCx0ZW1wMQorICAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24KKyAgICAgICBSU0IgICAgICAgICAgICAgbmVnQ3VyUVAsY3VyUVAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTERSICAgICAgICAgICAgIENvZWZmVGFibGUsW3ByZWRDb2VmZlRhYmxlLHRlbXAxXSAgICAgICAgICAgICAgOy8vIENvZWZmVGFibGU9MHgxZmZmZi9jdXJRUAorICAgICAgIEFERCAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1jdXJRUCsxCisgICAgICAgTFNSICAgICAgICAgICAgIGN1clFQLGN1clFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPXJvdW5kKGN1clFQLzIpICAgICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIExvb3AgQ291bnQKKyAgICAgICBCTkUgICAgICAgICAgICAgSG9yaXpvbnRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIGhvcml6b250YWwgYnJhbmNoIHRvIEhvcml6b250YWwKKworICAgICAgIAorCitsb29wMSAgICAgICAKKyAgICAgICA7Ly8gQ2FsY3VsYXRlIHRlbXBQcmVkCisgICAgICAgCisgICAgICAgTERSU0ggICAgICAgICAgIGFic0NvZWZmQUMsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9cFByZWRCdWZSb3dbaV0sIDE9PGk8PTcKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQworICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NworICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPSBhYnMocFByZWRCdWZSb3dbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIFNNVUxCQiAgICAgICAgICBhYnNDb2VmZkFDLGFic0NvZWZmQUMscHJlZFFQICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wUHJlZEJ1ZlJvd1tpXSpwcmVkUVAKKyAgICAgICBNVUwgICAgICAgICAgICAgdGVtcFByZWQsYWJzQ29lZmZBQyxDb2VmZlRhYmxlICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3dbaV0qcHJlZFFQKjB4MWZmZmYvY3VyUVAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE3ICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnQ3VyUVAsdGVtcFByZWQsYWJzQ29lZmZBQyAgICAgICAgICAgICAgIDsvLyBSZW09YWJzKHBQcmVkQnVmUm93W2ldKS10ZW1wUHJlZCpjdXJRUAorICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0sMTw9aTw4CisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUAorICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBSZW0+PXJvdW5kKGN1clFQLzIpOyB0ZW1wUHJlZD10ZW1wUHJlZCsxCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmUm93W2ldPDAgOyB0ZW1wUHJlZD0tdGVtcFByZWQKKyAgICAgICAgICAgICAgCisgICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKKyAgICAgICAKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD10ZW1wUHJlZCtwU3JjRHN0W2ldCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0KKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZSb3csQ291bnRdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFByZWRCdWZSb3dbaV09dGVtcAorICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpPWkrMQorICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIGlmIGk9OAorICAgICAgIEJMVCAgICAgICAgICAgICBsb29wMQorICAgICAgIEIgICAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdAorCitIb3Jpem9udGFsCisKKyAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIGk9OAorCitsb29wMiAgCisgICAgIAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMixDb3VudCwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMj1pPj4zCisgICAgICAgCisgICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAorICAgICAgIAorICAgICAgIExEUkggICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmQUM9cFByZWRCdWZDb2xbaT4+M10gICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkFDCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgcFByZWRCdWZSb3dbaV0gd2l0aCB6ZXJvLCAxPTxpPD03CisgICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmQUMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9YWJzKHBQcmVkQnVmQ29sW2k+PjNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQCisgICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUCoweDFmZmZmL2N1clFQCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUC9jdXJRUAorICAgICAgIAorICAgICAgIE1MQSAgICAgICAgICAgICBSZW0sbmVnQ3VyUVAsdGVtcFByZWQsYWJzQ29lZmZBQworICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0KKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgUmVtLGN1clFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBSZW0gd2l0aCByb3VuZChjdXJRUC8yKQorICAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD10ZW1wUHJlZCsxIGlmIFJlbT49cm91bmQoY3VyUVAvMikKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgcFByZWRCdWZDb2xbaT4+MyA8MCB0ZW1wUHJlZD0tdGVtcFByZWQKKyAgICAgICAKKyAgICAgICA7Ly8gVXBkYXRlIHNvdXJjZSBhbmQgUm93IFByZWRpY3Rpb24gYnVmZmVycworICAgICAgIAorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXBTcmNEc3RbaV0rdGVtcFByZWQKKyAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdPSBjbGlwcGVkIHZhbHVlCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmQ29sLHRlbXAyXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmQ29sW2k+PjNdPXRlbXAKKyAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzgKKyAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpIHdpdGggNjQKKyAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDIKKworICAgICAgICAgICAgIAorRXhpdAorICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyIAorCisgICAgICAgTV9FTkQKKyAgICAgICBFTkRJRgorICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTkxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKQEAgLTAsMCArMSwxNDEgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50ZXJfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSBwU3JjRHN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiBbaW5dIFFQICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCis7ICogW2luXSB2aWRlb0NvbXAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKKzsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCis7ICogICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgICAKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKKworOy8vTG9jYWwgVmFyaWFibGVzCitSZXR1cm4gICAgICAgICAgICAgUk4gMAorQ291bnQgICAgICAgICAgICAgIFJOIDQgICAgICAKK3RlbXBWYWwyMSAgICAgICAgICBSTiAyCit0ZW1wVmFsNDMgICAgICAgICAgUk4gMworUVAxICAgICAgICAgICAgICAgIFJOIDUKK1gyICAgICAgICAgICAgICAgICBSTiA2CitYMyAgICAgICAgICAgICAgICAgUk4gMTQKK1Jlc3VsdDEgICAgICAgICAgICBSTiA4CitSZXN1bHQyICAgICAgICAgICAgUk4gOQordHdvICAgICAgICAgICAgICAgIFJOIDcKKworICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSxyOQorICAgICAgIAorICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgVFNUICAgICAgUVAsIzEKKyAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkcyBmaXJzdCB0d28gdmFsdWVzIG9mIHBTcmNEc3QgdG8gdGVtcFZhbDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5leHQgdHdvIHZhbHVlcyB0byB0ZW1wVmFsNDMKKyAgICAgICAgU1VCRVEgICAgUVAxLFFQLCMxICAgICAgICAgICAgICAgIDsvLyBRUDE9UVAgaWYgUVAgaXMgb2RkICwgUVAxPVFQLTEgaWYgUVAgaXMgZXZlbgorICAgICAgICBNT1ZORSAgICBRUDEsUVAKKyAgICAgICAgTU9WICAgICAgdHdvLCMyCisgICAgICAgIAorICAgICAgICAKKworTG9vcAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBDTVAgICAgICBYMiwjMAorICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAgICAgICAgICAgICAgICAgIDsvLyBYMj1hYnNvbHV0ZXZhbChmaXJzdCB2YWwpCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMSAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUCBpZiBRUCBpcyBvZGQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWDI9MiphYnN2YWwoZmlyc3QgdmFsKSpRUCtRUC0xIGlmIFFQIGlzIGV2ZW4gCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWwyMSx0d28gICAgICAgICA7Ly8gWDM9IHNlY29uZCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIAorICAgICAgICBDTVAgICAgICBYMywjMAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgUEtIQlQgICAgUmVzdWx0MSxYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQxWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDFbMTYtMzFdPVgzWzE2LTMxXQorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsNDMpKjIKKyAgICAgICAgU1NBVDE2ICAgUmVzdWx0MSwjMTIsUmVzdWx0MSAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQorICAgICAgICBDTVAgICAgICBYMiwjMAorICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMRSAgICBYMixYMiwjMAorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICBDTVAgICAgICBYMywjMAorICAgICAgICAKKyAgICAgICAgTERSRCAgICAgdGVtcFZhbDIxLFtwU3JjRHN0LCM4XSAgIDsvLyBMb2FkIG5leHQgZm91ciBWYWx1ZXMgdG8gdGVtcFZhbDIxLHRlbXBWYWw0MworICAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgUEtIQlQgICAgUmVzdWx0MixYMixYMyxMU0wgIzE2ICAgIDsvLyBSZXN1bHQyWzAtMTVdPVgyWzAtMTVdLFJlc3VsdDJbMTYtMzFdPVgzWzAtMTVdCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgTG9vcAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIEVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyOGUwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpAQCAtMCwwICsxLDE4OCBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKzsgKiAKKzsgKgorOyAqCis7ICoKKzsgKgorOyAqIAorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KKzsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAorOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCis7ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiBbaW5dICAgIFFQICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQorOyAqIFtpbl0gICAgdmlkZW9Db21wICAgICAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgorOyAqIFtpbl0gICAgc2hvcnRWaWRlb0hlYWRlciAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorOyAqICAgICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAgLSAgICBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiAgICAgIG9yCis7ICogICAgLSBJZiBRUCA8PSAwLgorOyAqICAgICAgb3IKKzsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgorOyAqCisgCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAKKyAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAKKyAgIAorICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAKKyAgICAgICAgIAorCisgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmNEc3QgICAgICAgICAgICBSTiAwCitRUCAgICAgICAgICAgICAgICAgUk4gMQordmlkZW9Db21wICAgICAgICAgIFJOIDIKK3Nob3J0VmlkZW9IZWFkZXIgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICAgICAgICAgICAgIFJOIDAKK2RjU2NhbGVyICAgICAgICAgICBSTiA0Cit0ZW1wICAgICAgICAgICAgICAgUk4gMTIKK2luZGV4ICAgICAgICAgICAgICBSTiA2CisgICAgICAKK3RlbXBWYWwyMSAgICAgICAgICBSTiA0Cit0ZW1wVmFsNDMgICAgICAgICAgUk4gNQorUVAxICAgICAgICAgICAgICAgIFJOIDYKK1gyICAgICAgICAgICAgICAgICBSTiA3CitYMyAgICAgICAgICAgICAgICAgUk4gMTQKK1Jlc3VsdDEgICAgICAgICAgICBSTiA4CitSZXN1bHQyICAgICAgICAgICAgUk4gOQordHdvICAgICAgICAgICAgICAgIFJOIDEwCitDb3VudCAgICAgICAgICAgICAgUk4gMTEKKworCisKKyAgIAorICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyMTEKKworCisgICAgICAgIAorICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgREMgY29lZmZpY2llbnQKKworICAgICAgICBURVEgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgIDsvLyBUZXN0IGlmIHNob3J0IFZpZGVvIEhlYWRlciBmbGFnID0wICAgICAgICAgICAgIAorICAgICAgICBNT1ZORSAgICAgZGNTY2FsZXIsIzggICAgICAgICAgICAgIDsvLyBpZiBzaG9ydFZpZGVvSGVhZGVyIGlzIG5vbiB6ZXJvIGRjU2NhbGVyPTgKKyAgICAgICAgQk5FICAgICAgIGNhbERDVmFsCisgICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisKKworICAgICAgICA7Ly9NX0NhbERDU2NhbGFyICBzaG9ydFZpZGVvSGVhZGVyLHZpZGVvQ29tcCwgUVAKKworY2FsRENWYWwKKworICAgICAgICBMRFJIICAgICB0ZW1wLFtwU3JjRHN0XQorICAgICAgICBTTVVMQkIgICB0ZW1wLHRlbXAsZGNTY2FsZXIgICAgICAgOy8vIGRjQ29lZmYgPSBkY1NjYWxlciAqIFF1YW50aXplZCBEQyBjb2VmZmljaWVudChmcm9tIG1lbW9yeSkKKyAgICAgICAgU1NBVCAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgIDsvLyBTYXR1cmF0aW5nIHRvIDEyIGJpdHMKKyAgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgIFRTVCAgICAgIFFQLCMxCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCisgICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KKyAgICAgICAgTU9WTkUgICAgUVAxLFFQCisgICAgICAgIE1PViAgICAgIHR3bywjMgorCisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisKK0xvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1sxNi0zMV0KKyAgICAgICAgU1NBVDE2ICAgUmVzdWx0MiwjMTIsUmVzdWx0MiAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzQgICAgICAgICAgIDsvLyBEZWNyZW1lbnQgQ291bnQgYnkgNCBhbmQgY29udGludWUgaWYgaXQgaGFzIG5vdCByZWFjaGVkIDAgICAgICAgICAKKyAgICAgICAgU1RSRCAgICAgUmVzdWx0MSxbcFNyY0RzdF0sIzggICAgIDsvLyBTdG9yZSBEb3VibGUgd29yZHMgYW5kIGluY3JlbWVudCB0aGUgcG9pbnRlciB0byBwb2ludCB0aGUgbmV4dCBzdG9yZSBhZGRyZXNzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBCR1QgICAgICBMb29wCisKKyAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yaW5nIHRoZSBJbnZlcnNlIFF1YW50aXplZCBEQyBjb2VmZmljaWVudAorCisgICAgICAgIFNUUkggICAgIHRlbXAsW3BTcmNEc3RdLCMyCisgICAgICAgIAorICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIEVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgorCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKK2NvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKKyNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX0RFTElWRVJZLlRYVApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzJkNzBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKQEAgLTAsMCArMSw2MyBAQAorVGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQgYnkgSGVkbGV5IEZyYW5jaXMKK29mIEFSTSBvbiAxOS1GZWItMjAwOC4KKworSXQgY29udGFpbnMgdGhlIEFSTSBkYXRhIHZlcnNpb25zIGxpc3RlZCBiZWxvdy4KKworVGhpcyBkYXRhLCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgaXMgQVJNIFByb3ByaWV0YXJ5IGFuZCBhY2Nlc3MgdG8gaXQKK2lzIHN1YmplY3QgdG8gdGhlIGFncmVlbWVudHMgaW5kaWNhdGVkIGJlbG93LgorCitJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoaXMgZGF0YSwgcGxlYXNlIGNvbnRhY3QgQVJNIHN1cHBvcnQKK3F1b3RpbmcgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIDw5NzQxND4uCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworLSBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MQorICBWaWRlbyBjb2RlY3MgLSBvcHRpbWlzZWQgY29kZQorICBWNyBjb2RlIHJlbGVhc2UgZm9yIEhhbnRybyAoVmVyIDEuMC4yKQorICBpbnRlcm5hbCBhY2Nlc3MKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zIGRlbGl2ZXJhYmxlcyB3aGljaCBhcmUgZGVzaWduYXRlZCBhcyBiZWluZyBvZgorYmV0YSByZWxlYXNlIHN0YXR1cyAoQkVUKS4KKworQmV0YSByZWxlYXNlIHN0YXR1cyBoYXMgYSBwYXJ0aWN1bGFyIG1lYW5pbmcgdG8gQVJNIG9mIHdoaWNoIHRoZSByZWNpcGllbnQKK211c3QgYmUgYXdhcmUuIEJldGEgaXMgYSBwcmUtcmVsZWFzZSBzdGF0dXMgaW5kaWNhdGluZyB0aGF0IHRoZSBkZWxpdmVyYWJsZQorc28gZGVzY3JpYmVkIGlzIGJlbGlldmVkIHRvIHJvYnVzdGx5IGRlbW9uc3RyYXRlIHNwZWNpZmllZCBiZWhhdmlvdXIsIHRvIGJlCitjb25zaXN0ZW50IGFjcm9zcyBpdHMgaW5jbHVkZWQgYXNwZWN0cyBhbmQgYmUgcmVhZHkgZm9yIGdlbmVyYWwgZGVwbG95bWVudC4KK0J1dCBCZXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgcHJlLXJlbGVhc2UgcmVsaWFiaWxpdHkgdHJpYWxzIGFyZSBvbmdvaW5nIGFuZAordGhhdCBpdCBpcyBwb3NzaWJsZSByZXNpZHVhbCBkZWZlY3RzIG9yIGVycm9ycyBpbiBvcGVyYXRpb24sIGNvbnNpc3RlbmN5CithbmQgZG9jdW1lbnRhdGlvbiBtYXkgc3RpbGwgYmUgZW5jb3VudGVyZWQuIFRoZSByZWNpcGllbnQgc2hvdWxkIGNvbnNpZGVyCit0aGlzIHBvc2l0aW9uIHdoZW4gdXNpbmcgdGhpcyBCZXRhIG1hdGVyaWFsIHN1cHBsaWVkLiBBUk0gd2lsbCBub3JtYWxseQorYXR0ZW1wdCB0byBwcm92aWRlIGZpeGVzIG9yIGEgd29yay1hcm91bmQgZm9yIGRlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUKK3JlY2lwaWVudCwgYnV0IHRoZSBwcm92aXNpb24gb3IgdGltZWxpbmVzcyBvZiB0aGlzIHN1cHBvcnQgY2Fubm90IGJlCitndWFyYW50ZWVkLiBBUk0gc2hhbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciBkaXJlY3Qgb3IgY29uc2VxdWVudGlhbAorZGFtYWdlcyBhcyBhIHJlc3VsdCBvZiBlbmNvdW50ZXJpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UgcmVzaWR1YWwgZGVmZWN0cy4KK0J5IGFjY2VwdGluZyBhIEJldGEgcmVsZWFzZSwgdGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gdGhlc2UgY29uc3RyYWludHMgYW5kCit0byBwcm92aWRpbmcgcmVhc29uYWJsZSBpbmZvcm1hdGlvbiB0byBBUk0gdG8gZW5hYmxlIHRoZSByZXBsaWNhdGlvbiBvZiB0aGUKK2RlZmVjdHMgaWRlbnRpZmllZCBieSB0aGUgcmVjaXBpZW50LiBUaGUgc3BlY2lmaWMgQmV0YSB2ZXJzaW9uIHN1cHBsaWVkCit3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYWZ0ZXIgcmVsZWFzZSBvZiBhIGxhdGVyIG9yIGhpZ2hlciBzdGF0dXMgdmVyc2lvbi4KK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IFN1cHBvcnQgZm9yIHRoZSBCZXRhIHJlbGVhc2Ugb2YgdGhlIGRlbGl2ZXJhYmxlCit3aWxsIG9ubHkgYmUgcHJvdmlkZWQgYnkgQVJNIHRvIGEgcmVjaXBpZW50IHdobyBoYXMgYSBjdXJyZW50IHN1cHBvcnQgYW5kCittYWludGVuYW5jZSBjb250cmFjdCBmb3IgdGhlIGRlbGl2ZXJhYmxlLgorCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSW4gYWRkaXRpb24gdG8gdGhlIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGFib3ZlLCB0aGlzIHRyYW5zYWN0aW9uIGNvbnRhaW5zCit0d28gYWRkaXRpb25hbCBmaWxlcyBhdCB0aGUgdG9wIGxldmVsLgorCitUaGUgZmlyc3QgaXMgdGhpcyBmaWxlLCBBUk1fREVMSVZFUllfOTc0MTQuVFhULCB3aGljaCBpcyB0aGUgZGVsaXZlcnkKK25vdGUuCisKK1RoZSBzZWNvbmQgaXMgQVJNX01BTklGRVNUXzk3NDE0LlRYVCB3aGljaCBjb250YWlucyBhIG1hbmlmZXN0IG9mIGFsbCB0aGUKK2ZpbGVzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24sIHRvZ2V0aGVyIHdpdGggdGhlaXIgY2hlY2tzdW1zLgorCitUaGUgY2hlY2tzdW1zIHByb3ZpZGVkIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobS4KKworVGhlIGNoZWNrc3VtcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGlzIGRhdGEgdXNpbmcgdGhlCisibWQ1c3VtIiB0b29sICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBHTlUgInRleHR1dGlscyIgcGFja2FnZSkgYnkgcnVubmluZzoKKworICAlIG1kNXN1bSAtLWNoZWNrIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzEwZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKQEAgLTAsMCArMSw5MSBAQAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCitlMDQ5NzkxY2ZhYjYwNjBhMDhjYmFjN2IzYWQ3NjdkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fcy5oCitlZDc5OGZhY2UyNTQ5N2IyNzAzZWRlNzM2ZDZkNTJiNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzX3MuaAorNGVlYmQ2M2FmMDg3Mzc2ODExZDY3NDlmMDY0NmI4NjQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKzQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCis4ZjI0OGNlYWFjOGY2MDJlMjc3YTUyMWI2NzlkY2JiZSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKKzhhYzVmYTgwZWE5OGUzOTFmNTczMGEzNzUyODBiNWJkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKzNhMmY0MjBkZGY2YTFiOTUwNDcwYmQwZjVlYmQ1YzYyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUX3MuaAorNTExYzBiYjUzNGZlMjIzNTk5ZTJjODRlZmYyNGM5ZWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCis4OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKK2Y4N2ZlZGQ5Y2E0MzJmZWZhNzU3MDA4MTc2ODY0ZWY4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtT01YLmgKKzhlNDk4OTlhNDI4ODIyYzM2ZWY5ZGQ5NGUwZTA1ZjE4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXMuaAorMzIzMDA4YjcyZTlmMDQwOTlhOGNiNDJlOTlhMWZhY2UgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2J1aWxkX3ZjLnBsCitlNzJkOTZjMGE0MTU0NTk3NDhkZjk4MDdmM2RhZTcyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvZmlsZWxpc3RfdmMudHh0CisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvCis1ZWVhZTY1OWEyOTQ3N2Y1YzUyMjk2ZDI0YWZmZmQzYyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKK2Q2NGNkY2YzOGY3NzQ5ZGM3Zjc3NDY1ZTViN2QzNTZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KK2U3ZTBjMzIwOTc4NTY0YTdjOWIyYzcyMzc0OWE5OGQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCis0YWRjZDBkZjA4MTk5MGJkZmM0NzI5MDQxYTJhOTE1MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworODUyZTA0MDQxNDI5NjVkYzFmM2FhN2YwMGVlNTEyN2IgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworNzA1NDE1MWM1YmZlYTZiNWU3NGZlZWU4NmIyZDdiMDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKzVmNzIxM2E0ZjM3NjI3YjNjNThmNjI5NGJhNDc3ZTMwICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworMzJmZjRiOGJlNjJlMmYwZjNlNzY0YjgzYzFlNWUyZmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCitkMDY2ZTNjODFkODI2MTZmMzdlYzE4MTBlYTQ5ZTdiNyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworZmU2MjlhM2U5ZDU1Mzk1YTYwOThiZGYyNDMxYjVmMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworNWIxM2ZiOTU0Yjc2NzlkZTIwMDc2YmI2YTdmNGVlMWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKzAxYmE2MGVmZjY2ZWE0OWE0ZjgzM2NlNjI3OWY4ZTJmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKK2ZhMTA3MmNmMWQxN2U5NjY2YzlmMWUyMTVmYTMwMmIxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCitkYjM4N2I5ZTY2ZDMyNzg3ZjQ3ZWY5Y2YwMzQ3ZGEyYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKK2VhNTM3ZTRlMmFkMDNhMTk0MDk4MTA1NWZhM2FjZTAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCisyOWE0MjgzODg1Yjk0NzNhMzU1MGE4MWVmZjI1NTlkMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisyZGRjYWY2MGE4ZWExZTZlNmI3NzczN2Y3NjhiZmI5ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCitjMzAwMmFhZDU2MDBmODcyYjcwYTVkN2ZlMzkxNTg0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKK2EyOTAwZjJjNDdmMWM2MWQyMGJkNmMxZWRhMzNkNmQ0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCitjOTIxZGY3MzM5N2EzMmM5NDdkYzk5NmJhNjg1ODU1MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKzM3NjllMTRmMmZjM2Y1MTRkMDI1ZmU2YWI3M2ZmNjdhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCitjMDI5ZDFjZWJlYTBhMDllMWQyMzVhMzdlMjE1NTAwMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCiswNzZhMDMzZjgxNjE3NTBhNjg1NzU2ZjlmNTFmMDRjOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKK2M1YjVkMjI4NDI4MjJlNmU1ZTMxMDk0ODgyY2JlYjQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCitmNmJkZjZkOTE0YTRhMTQ3OWY1MjQ5NTFhMzQwOTg0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCitlYmViMDcxM2E5YjJlYTI1OTg2MzYwZWYyNjIxMzhjNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworNzhlZDllYTIwMGZhYTdiZTY2NTQ0NWE3MTM4NTlhZjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKK2MyZDk5NWY3ODdiNmY0NGVmMTBjNzUxYzEyZDE5MzVmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworNDBiZWQ2NzlhOWY2ZTBkM2VmZTIxNmI3ZDRhOWNmNDUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCis0YTUyYjNlOWUyNjhiOGE4ZjA3ODI5YmY1MDBkMDNhZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworMTEyNDlmOGE5OGM1ZDRiODRjYjU1NzViMGUzN2NhOWMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworMjUxM2I2MDU1OWJhNzFhZTQ5NWM2MDUzZmI3NzlmYTkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKzJmYjFlZTE3YzM2ZTNjMTQ2OWMxNzBmNmRhYzExYmYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKK2NjNGE2ZjMyZGIwYjcyYTkxZDNmMjc4ZjY4NTVkZjY5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS8KKzZlNTMwZGRhYTdjMmI1N2ZmZTg4MTYyYzAyMGNiNjYyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvCitiZWM2ZGUzNDhiMTEzNDM4NDk4ODY3Yjg2OTAwMTYyMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworZGJhOTgyNGU5NTliMjFkNDAxY2FjOTI1ZTY4YTExYTYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCitkZmE3ZTViNTgwMjdiZTM1NDJkZGEwNTkzYjc3YjJkMyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKzRmYmE0YzQzMWE3ODNhNzhhMmViNjQ5N2E5NGFjOTY3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCiszOTk5MTk2MTE3OWNhMDNiNjM4MWI2ZTY1M2IxZjE0YiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKzFiMGIyOTkwYzI2NjlkZmI4N2NmNmI4MTA2MTFjMDFiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKzFjOWI4N2FiZjMyODNlOTU3ODE2YjM5MzdjNjgwNzAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKzRmZTFhZmNhNjU5YTkwNTVmYzExNzJlNThmNzhhNTA2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKzJlYTA2N2YwNDM2ZjkxYmExMzUxZWRhZjQxMWNiNGVhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCis2Y2UzNjNhYWRjOWQ2NWMzMDhiNDBjY2E4OTAyZTRmNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCitiZjIxMmY3ODY3NzJhZWQyYmM3MDVkMjJmZjRlNzRmNSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisyOTNhNDhhNjQ4YTMwODU0NTZlNjY2NWJiNzM2NmZhZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisyYmI0N2VkOWM5ZTI1YzU3MDljNmQ5YjRhZDM5YTM4YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzQzN2RmYTIwNDUwODg1MGQ2MWQ0Yjg3MDkxNDQ2ZTlmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCitiYzk3Nzg4OThkZDQxMTAxZGMwZmIwMTM5ZWFmODNjYyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworZmMxOTFlZWFlNDNmOGNlNzM1ZGJkMzExY2M3YmNiOGQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCithMGQ4NWY0ZjUxN2M5NDVhNGM5MzE3YWMwMjFmMmQwOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCiszODYwMjBkZWU4YjcyNWM3ZmUyNTI2ZjFmYzIxMWQ3ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS8KKzQ2MjRlN2M4MzhlMTBhMjQ5YWJjYzNkM2Y0ZjQwNzQ4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKzY1ZTEwNTdkMDRlMmNiODQ0NTU5ZGM5ZjZlMDk3OTVhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvCitlNjI3YjMzNDZiMGRjOWFmZjE0NDQ2MDA1Y2UwZmE0MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpLworN2NhOTRiMWMzM2FjMDIxMWUxN2QzOGJhYWRkN2QxZGQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQy5oCisxMmNmNzU5NmVkYmJmNjA0OGI2MjZkMTVlOGQwZWQ0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDLmgKKzExNzI2ZTI4NmE4MTI1N2NiNDVmNTU0N2ZiNGQzNzRjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkNfcy5oCithNWIyYWY2MDVjMzE5Y2QyNDkxMzE5ZTQzMDc0MTM3NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDQ09NTV9zLmgKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy8KKzFmODExODdiNDg0ODdhOGVhNmRiYzMyNzY0OGUzZTRmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworOTM2ZDNmMjAzOGE2Zjg2MTNlYzI1ZTUwY2M2MDFmZTggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworOGY2NzA4YTI0OTEzMDk2MmUwYmM1YzA0NGFjNmRkOTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworYWFiNzcxMzQxNDQyOGU5NWRlMGJhNzk5YTI2NzliMzYgIEFSTV9ERUxJVkVSWV85NzQxNC5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjRjMTk1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCkBAIC0wLDAgKzEsNzg1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogICAKKyAqIEZpbGU6IGFybUNPTU0uaAorICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICoKKyAqLworIAorICAKKyNpZm5kZWYgX2FybUNvbW1vbl9IXworI2RlZmluZSBfYXJtQ29tbW9uX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwordHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07CisKKworI2luY2x1ZGUgImFybU9NWC5oIgorCisjZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBBUk1fREVCVUcKKy8qIGRlYnVnIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KKyNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQorI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCisjZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKKyNlbHNlIAorLyogcmVsZWFzZSB2ZXJzaW9uICovCisjZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQorI2VuZGlmIC8qIEFSTV9ERUJVRyAqLworCisvKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKKyNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCisjZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQorCisvKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCisjZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCisjZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCisjZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCisjZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQorCisvKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCisKKyNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKyNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKworI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludCkoUHRyKSkgJSBOKT09MCkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnQpKFB0cikpICUgTikhPTApCisjZWxzZQorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKKworI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQorI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisgCitPTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICAgICAgT01YX0lOVCBtaW4sCisgICAgICAgIE9NWF9JTlQgbWF4LCAKKyAgICAgICAgT01YX1MzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICAgICAgT01YX0YzMiBtaW4sCisgICAgICAgIE9NWF9GMzIgbWF4LCAKKyAgICAgICAgT01YX0YzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAorICAgICAgICBPTVhfRjMyIHYsIAorICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKKyAgICAgICAgT01YX0lOVCBzYXRCaXRzCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOworCisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorICAgICk7ICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TNjQgYXJtU2F0QWRkX1M2NCgKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRGVidWdnaW5nIG1hY3JvcworICoKKyAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQorICovCisjZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKKworLyoKKyAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KKyAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KKyAqLworI2lmZGVmIERFQlVHX09OCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQorI2Vsc2UgLyogREVCVUdfT04gKi8KKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKKyNlbmRpZiAvKiBERUJVR19PTiAqLworCisKKy8qCisgKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKKyAqCisgKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KKyAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKKyAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgorICovCisKKyNpZmRlZiBERUJVR19ET01BSU5fQUMKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1ZDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSUMKKy8qIFRvIGJlIGZpbGxlZCBpbiAqLworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fU1AKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2CisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JUAorI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KKworCisjZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLworCisvKkVuZCBvZiBGaWxlKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzM4ZjcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKQEAgLTAsMCArMSw2NzAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fQml0RGVjX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gCis7Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKKzsvLworOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKKzsvLworOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKKzsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQorOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAorOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCis7Ly8KKzsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Cis7Ly8KKzsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Cis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgorOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCis7Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCis7Ly8KKzsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCis7Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQorOy8vCis7Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKKzsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCis7Ly8KKzsvLyBVU0FHRToKKzsvLworOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Cis7Ly8KKzsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCis7Ly8KKzsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCis7Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKKzsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQorOy8vIGNhbGwgTV9CRF9GSU5JLgorOy8vCis7Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKKzsvLworOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCis7Ly8KKzsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgorOy8vCis7Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Cis7Ly8KKzsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgorOy8vCis7Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKKzsvLyB2YXJpYWJsZXM6Cis7Ly8KKworICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCisgICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgorICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAorICAgCis7Ly8gICAgICAgIAorOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCis7Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KKzsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KKzsvLworOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKKzsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKKzsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKKzsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAorOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQorOy8vCis7Ly8KKworICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCisgICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQorICAgICAgICA7Ly8gc2NoZWR1bGluZy4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCisgICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCisgICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCisgICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgorICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAorCitwQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKK0JpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgorQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIGxvYWQgaW5wdXRzCisgICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKKyAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCisgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQorICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMworICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCisgICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2CisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKKyAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCisgICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCisgICAgICAgIElGICgkTjw9OCkKKyAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgRUxTRSAgICAgICAgCisgICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKKyAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCisgICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCisgICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAorICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgorICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKKyAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAorICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAKKworCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyBidWZmZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgorICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKKyAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQorICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQorICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCisgICAgICAgIAorICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cworICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKKyAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAorMDEKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKKyAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQorICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQorICAgICAgICBCQ1MgICAgICVGVDAyCisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAorICAgICAgICBJRiAoMiokUzAtJFMxPD04KQorICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKKyAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0CisgICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCisgICAgICAgIEVORElGCisgICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0CisgICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKKzAyCisgICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCisgICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQorICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1CisgICAgICAgIAorICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKKyAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKKyAgICAgICAgTUVORAorICAgICAgICAKKworICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCisgICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAorCisgICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cworICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAorICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKKyAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAorICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKKworICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAorICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4CisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAorICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCisgICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKKyAgICAgICAgCisgICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKKyAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KKworICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMworICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3CisgICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIAorICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMworICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNworICAgICAgICAKKyAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0CisgICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKKyAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KKyAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjk5MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiBhcm1DT01NX0JpdHN0cmVhbS5oCisgKiBCcmllZjogRGVjbGFyZXMgY29tbW9uIEFQSSdzL0RhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NYXggRW5jb2RlcnMvRGVjb2RlcnMuCisgKgorICovCisKKyNpZm5kZWYgX2FybUNvZGVjX0hfCisjZGVmaW5lIF9hcm1Db2RlY19IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCAgIGNvZGVMZW47CisgICAgT01YX1UzMgkgY29kZVdvcmQ7Cit9IEFSTV9WTEMzMjsKKworLyogVGhlIGFib3ZlIHNob3VsZCBiZSByZW5hbWVkIGFzICJBUk1fVkxDMzIiICovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KTsKKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6ICJBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAweEZGRkYiIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKworI2RlZmluZSBBUk1fTk9fQ09ERUJPT0tfSU5ERVggKE9NWF9VMTYpKDB4RkZGRikKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwT2Zmc2V0CSAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQljb2RlV29yZAkJQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0JY29kZUxlbmd0aAkJTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKyk7CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKTsKKworI2VuZGlmICAgICAgLypfYXJtQ29kZWNfSF8qLworCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGNmZGFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlICAgICAgICAgOiBhcm1DT01NX0lEQ1RUYWJsZS5oCisgKiBEZXNjcmlwdGlvbiAgOiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGFibGVzIGZvciBJRENUIGNhbGN1bGF0aW9uLgorICoKKyAqLworICAKKyNpZm5kZWYgX2FybUNPTU1fSURDVFRhYmxlX0hfCisjZGVmaW5lIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdOworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF07CisKKyNlbmRpZiAvKiBfYXJtQ09NTV9JRENUVGFibGVfSF8gKi8KKworCisvKiBFbmQgb2YgRmlsZSAqLworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGJhYTA4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaApAQCAtMCwwICsxLDE0NTEgQEAKKzsvLworOy8vIFRoaXMgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBvbmx5IGFzCis7Ly8gYXV0aG9yaXNlZCBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZAorOy8vICAgKEMpIENPUFlSSUdIVCAyMDA0IEFSTSBMaW1pdGVkCis7Ly8gICAgICAgQUxMIFJJR0hUUyBSRVNFUlZFRAorOy8vIFRoZSBlbnRpcmUgbm90aWNlIGFib3ZlIG11c3QgYmUgcmVwcm9kdWNlZCBvbiBhbGwgYXV0aG9yaXNlZAorOy8vIGNvcGllcyBhbmQgY29waWVzIG1heSBvbmx5IGJlIG1hZGUgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQKKzsvLyBieSBhIGxpY2Vuc2luZyBhZ3JlZW1lbnQgZnJvbSBBUk0gTGltaXRlZC4KKzsvLworOy8vIElEQ1Rfcy5zCis7Ly8KKzsvLyBJbnZlcnNlIERDVCBtb2R1bGUKKzsvLworOy8vIAorOy8vIEFMR09SSVRITSBERVNDUklQVElPTgorOy8vCis7Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKKzsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KKzsvLworOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQorOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgorOy8vCis7Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKKzsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQorOy8vCis7Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCis7Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KKzsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCis7Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKKzsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgorOy8vCis7Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQorOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQorOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKKzsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCis7Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgorOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgorOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgorOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKKzsvLyAgICAgICAgICAgICAKKzsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCis7Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKKzsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCis7Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgorOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKKzsvLworOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQorOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCis7Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAorOy8vCis7Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Cis7Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKKzsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMworOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Cis7Ly8KKzsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQorOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMworOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKKzsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKKzsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgorOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Cis7Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKKzsvLworOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Cis7Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKKzsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQorOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Cis7Ly8KKzsvLyBOb3RlOgorOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCis7Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgorOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAorOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgorOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcworOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAorOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgorOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKKzsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgorOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgorOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCis7Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAorOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KKzsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQorOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQorOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKKzsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKKzsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKKzsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKKzsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKKzsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKKzsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKKzsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKKzsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCisKKzsvLyBBcmd1bWVudHMKKworcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKK1N0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCitwRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCitwU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCisKKyAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCisgICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKKyAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgorICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQorICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQorICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKKyAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXRzOgorICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKKyAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKKyAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQorICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKKyAgICAgICAgTENMQSAgICBTSElGVAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCis7Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKKzsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKKzsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdworOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCis7Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgorOy8vCis7Ly8gcjEgIGEwMSAgICAgZzAgIGgwCis7Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAorOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKKzsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCis7Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMworOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKKzsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Cis7Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgorOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKKzsvLworcmEwMSAgICBSTiAxCityYjAxICAgIFJOIDQKK3JhMjMgICAgUk4gNQorcmIyMyAgICBSTiA2CityYTQ1ICAgIFJOIDcKK3JiNDUgICAgUk4gOAorcmE2NyAgICBSTiA5CityYjY3ICAgIFJOIDEwCitydG1wICAgIFJOIDExCitjc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQorTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KKzsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoreGZ0ICAgICBSTiByYTAxCit4ZjAgICAgIFJOIHJiMDEKK3hmMSAgICAgUk4gcmEyMworeGYyICAgICBSTiByYjIzCit4ZjMgICAgIFJOIHJhNDUKK3hmNCAgICAgUk4gcmI0NQoreGY1ICAgICBSTiByYTY3Cit4ZjYgICAgIFJOIHJiNjcKK3hmNyAgICAgUk4gcnRtcAorOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KK3hnMCAgICAgUk4geGZ0Cit4ZzEgICAgIFJOIHhmMAoreGcyICAgICBSTiB4ZjEKK3hnMyAgICAgUk4geGYyCit4Z3QgICAgIFJOIHhmMworeGc0ICAgICBSTiB4ZjQKK3hnNSAgICAgUk4geGY1Cit4ZzYgICAgIFJOIHhmNgoreGc3ICAgICBSTiB4ZjcKKzsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCit4aDAgICAgIFJOIHhnMAoreGgxICAgICBSTiB4ZzEKK3hodCAgICAgUk4geGcyCit4aDIgICAgIFJOIHhnMworeGgzICAgICBSTiB4Z3QKK3hoNCAgICAgUk4geGc0Cit4aDUgICAgIFJOIHhnNQoreGg2ICAgICBSTiB4ZzYKK3hoNyAgICAgUk4geGc3Cis7Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCit4aXQgICAgIFJOIHhoMAoreGkwICAgICBSTiB4aDEKK3hpMSAgICAgUk4geGh0Cit4aTIgICAgIFJOIHhoMgoreGkzICAgICBSTiB4aDMKK3hpNCAgICAgUk4geGg0Cit4aTUgICAgIFJOIHhoNQoreGk2ICAgICBSTiB4aDYKK3hpNyAgICAgUk4geGg3CisgICAgICAgIAorICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCisgICAgICAgIEVORElGCisgICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCisgICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKKyAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgorICAKK3Y2X2lkY3RfY29sJF9GCisgICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCisgICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKKyAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcworICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKK1NISUZUICAgICAgIFNFVEEgICAgMTIKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQorICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKKyAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3CisgICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgSUYgIHtUUlVFfQorICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAorICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCisgICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcworICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgorICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQorICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKKyAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50CisgICAgICAgIFNBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTUsIHhpdAorICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgU0FERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU0hBREQxNiB4aTcsIHhpNywgeGl0CisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMworICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCisgICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKKyAgICAgICAgCisgICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KKyAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQorICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAorICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQorICAgICAgICAgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAorICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80CisgICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdCwgIzhdICAgICAgICA7Ly8gajIsajYgc2NhbGVkCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNiAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQorICAgICAgICAgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICAKK3Y2T2RkWmVybyRfRgorICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCisgICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMworICAgICAgICAKKyAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1CisgICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIE1PViAgeGYzLCB4ZzMKKyAgICAgICAgTU9WICB4ZjQsIHhnMworICAgICAgICBNT1YgIHhmMiwgeGcyCisgICAgICAgIE1PViAgeGY1LCB4ZzIKKyAgICAgICAgTU9WICB4ZjEsIHhnMQorICAgICAgICBNT1YgIHhmNiwgeGcxCisgICAgICAgIE1PViAgeGYwLCB4ZzAKKyAgICAgICAgTU9WICB4ZjcsIHhnMAorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cworICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgIAorICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCisgICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKKyAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0CisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgCisgICAgICAgIAordjZfaWRjdF9yb3ckX0YKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKKyAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQorICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMworICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNworICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNworICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKKyAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3CisgICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2CisgICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKKyAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKKworICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKKyAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCisgICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMworICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKKyAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0CisgICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQorICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKKyAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2CisgICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgorICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKKyAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3CisgICAgICAgIAorICAgICAgICA7Ly8gU2F0dXJhdGUKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCisgICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQorICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKKyAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCisgICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAorICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKKyAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2CisgICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAorICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKKyAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCisgICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMworICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKKyAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1CisgICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgorICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCisgICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCisgICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCisgICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2CisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9CisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCisgICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgorICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKworICAgICAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKK1NyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAorU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCitTcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKK1NyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKK1NyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKK1NyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKK1NyYzYgICAgICAgICAgICBFUVUgIDEzCitTcmM3ICAgICAgICAgICAgRVFVICAxNAorVG1wICAgICAgICAgICAgIEVRVSAgMTUKKworcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAorcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2CitxWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKK3FYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgorcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2CitxWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKK3FYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgorcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2CitxWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgorCitkWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2CitkWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKK2RYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKK2RYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgorZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgorZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2CitkWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2CitkWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKK2RYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKK2RYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgorZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgorZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2CitkWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2CitkWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKK2RYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKK2RYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgorZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2CitkWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgorCitxWGkwICAgICAgICAgICAgUU4gcVhqMAorcVhpMSAgICAgICAgICAgIFFOIHFYajQKK3FYaTIgICAgICAgICAgICBRTiBxWGoyCitxWGkzICAgICAgICAgICAgUU4gcVhqNworcVhpNCAgICAgICAgICAgIFFOIHFYajUKK3FYaTUgICAgICAgICAgICBRTiBxWGp0CitxWGk2ICAgICAgICAgICAgUU4gcVhqMQorcVhpNyAgICAgICAgICAgIFFOIHFYajYKK3FYaXQgICAgICAgICAgICBRTiBxWGozCisKK2RYaTBsbyAgICAgICAgICBETiBkWGowbG8KK2RYaTBoaSAgICAgICAgICBETiBkWGowaGkKK2RYaTFsbyAgICAgICAgICBETiBkWGo0bG8KK2RYaTFoaSAgICAgICAgICBETiBkWGo0aGkKK2RYaTJsbyAgICAgICAgICBETiBkWGoybG8KK2RYaTJoaSAgICAgICAgICBETiBkWGoyaGkKK2RYaTNsbyAgICAgICAgICBETiBkWGo3bG8KK2RYaTNoaSAgICAgICAgICBETiBkWGo3aGkKK2RYaTRsbyAgICAgICAgICBETiBkWGo1bG8KK2RYaTRoaSAgICAgICAgICBETiBkWGo1aGkKK2RYaTVsbyAgICAgICAgICBETiBkWGp0bG8KK2RYaTVoaSAgICAgICAgICBETiBkWGp0aGkKK2RYaTZsbyAgICAgICAgICBETiBkWGoxbG8KK2RYaTZoaSAgICAgICAgICBETiBkWGoxaGkKK2RYaTdsbyAgICAgICAgICBETiBkWGo2bG8KK2RYaTdoaSAgICAgICAgICBETiBkWGo2aGkKK2RYaXRsbyAgICAgICAgICBETiBkWGozbG8KK2RYaXRoaSAgICAgICAgICBETiBkWGozaGkKKworcVhoMCAgICAgICAgICAgIFFOIHFYaXQKK3FYaDEgICAgICAgICAgICBRTiBxWGkwCitxWGgyICAgICAgICAgICAgUU4gcVhpMgorcVhoMyAgICAgICAgICAgIFFOIHFYaTMKK3FYaDQgICAgICAgICAgICBRTiBxWGk3CitxWGg1ICAgICAgICAgICAgUU4gcVhpNQorcVhoNiAgICAgICAgICAgIFFOIHFYaTQKK3FYaDcgICAgICAgICAgICBRTiBxWGkxCitxWGh0ICAgICAgICAgICAgUU4gcVhpNgorCitkWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCitkWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCitkWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCitkWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCitkWGgybG8gICAgICAgICAgRE4gZFhpMmxvCitkWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCitkWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCitkWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCitkWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCitkWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCitkWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCitkWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCitkWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCitkWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCitkWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCitkWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCitkWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCitkWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCisKK3FYZzAgICAgICAgICAgICBRTiBxWGgyCitxWGcxICAgICAgICAgICAgUU4gcVhodAorcVhnMiAgICAgICAgICAgIFFOIHFYaDEKK3FYZzMgICAgICAgICAgICBRTiBxWGgwCitxWGc0ICAgICAgICAgICAgUU4gcVhoNAorcVhnNSAgICAgICAgICAgIFFOIHFYaDUKK3FYZzYgICAgICAgICAgICBRTiBxWGg2CitxWGc3ICAgICAgICAgICAgUU4gcVhoNworcVhndCAgICAgICAgICAgIFFOIHFYaDMKKworcVhmMCAgICAgICAgICAgIFFOIHFYZzYKK3FYZjEgICAgICAgICAgICBRTiBxWGc1CitxWGYyICAgICAgICAgICAgUU4gcVhnNAorcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKK3FYZjQgICAgICAgICAgICBRTiBxWGczCitxWGY1ICAgICAgICAgICAgUU4gcVhnMgorcVhmNiAgICAgICAgICAgIFFOIHFYZzEKK3FYZjcgICAgICAgICAgICBRTiBxWGcwCitxWGZ0ICAgICAgICAgICAgUU4gcVhnNworCisKK3FYdDAgICAgICAgICAgICBRTiAxLlMzMgorcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCitxVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKK3FUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAorcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCitxVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKK3FTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcworcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCitxVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKK3FUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKKworCitTY2FsZTEgICAgICAgICAgRVFVIDYKK1NjYWxlMiAgICAgICAgICBFUVUgMTUKK3FTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKK3FTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKK2RTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCitkU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgorZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKK2RTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2CisKK2RDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19CitJbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1CitTICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1CitDICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1CisKK3BUZW1wICAgICAgICAgICBSTiAxMgorCisgICAgICAgICAgICAgICAgCisgICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKKyAgICAgICAgOy8vIElTdGFnZSA0CisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKKyAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIElTdGFnZSAzCisgICAgICAgIFZRRE1VTEggICAgIHFYaTIsIHFYaTIsIEludlNxcnQyICAgICAgICAgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgVkhBREQgICAgICAgcVhoMCwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwK2kxKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYaDEsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMC1pMSkvMgorICAgICAgICBWSEFERCAgICAgICBxWGg3LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVhoNSwgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZRRE1VTEggICAgIHFYaDUsIHFYaDUsIEludlNxcnQyICAgICAgICAgICAgOy8vIGg1L3NxcnQoMikKKyAgICAgICAgVlNVQiAgICAgICAgcVhoMiwgcVhpMiwgcVhpMyAgICAgICAgICAgICAgICA7Ly8gaDIsIGgzCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNGxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNAorICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWGk2bG8sIFMgICAgICAgICAgICAgICAgIDsvLyBjKmk0K3MqaTYKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNGhpLCBDCisgICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRYaTZoaSwgUworICAgICAgICBWU0hSTiAgICAgICBkWGg0bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWGg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNmxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNgorICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWGk0bG8sIFMgICAgICAgICAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNmhpLCBDCisgICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRYaTRoaSwgUworICAgICAgICBWU0hSTiAgICAgICBkWGg2bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWGg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyCisgICAgICAgIFZTVUIgICAgICAgIHFYZzYsIHFYaDYsIHFYaDcKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNSwgcVhoNSwgcVhnNgorICAgICAgICBWU1VCICAgICAgICBxWGc0LCBxWGg0LCBxWGc1CisgICAgICAgIFZIQUREICAgICAgIHFYZzEsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEraDIpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVhnMiwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMS1oMikvMgorICAgICAgICBWSEFERCAgICAgICBxWGcwLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwK2gzKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzMsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkFERCAgICAgICAgcVhmMywgcVhnMywgcVhnNCAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjQsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYyLCBxWGcyLCBxWGc1ICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNSwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIHFYZjEsIHFYZzEsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNiwgcVhnMSwgcVhnNiAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIHFYZjAsIHFYZzAsIHFYZzcKKyAgICAgICAgVlNVQiAgICAgICAgcVhmNywgcVhnMCwgcVhnNyAgICAgIAorCisgICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCitYVFIwICAgICAgICAgICAgRVFVIFNyYzUKK1hUUjEgICAgICAgICAgICBFUVUgVG1wCitYVFIyICAgICAgICAgICAgRVFVIFNyYzYKK1hUUjMgICAgICAgICAgICBFUVUgU3JjNworWFRSNCAgICAgICAgICAgIEVRVSBTcmMzCitYVFI1ICAgICAgICAgICAgRVFVIFNyYzAKK1hUUjYgICAgICAgICAgICBFUVUgU3JjMQorWFRSNyAgICAgICAgICAgIEVRVSBTcmMyCitYVFJ0ICAgICAgICAgICAgRVFVIFNyYzQKKyAgICAgICAgICAgICAgICAKK3FBMCAgICAgICAgICAgICBRTiAgWFRSMC5TMzIgIDsvLyBmb3IgWFRScG9zZQorcUExICAgICAgICAgICAgIFFOICBYVFIxLlMzMgorcUEyICAgICAgICAgICAgIFFOICBYVFIyLlMzMgorcUEzICAgICAgICAgICAgIFFOICBYVFIzLlMzMgorcUE0ICAgICAgICAgICAgIFFOICBYVFI0LlMzMgorcUE1ICAgICAgICAgICAgIFFOICBYVFI1LlMzMgorcUE2ICAgICAgICAgICAgIFFOICBYVFI2LlMzMgorcUE3ICAgICAgICAgICAgIFFOICBYVFI3LlMzMgorCitkQjAgICAgICAgICAgICAgRE4gIFhUUjAqMisxICAgICAgOy8vIGZvciB1c2luZyBWU1dQCitkQjEgICAgICAgICAgICAgRE4gIFhUUjEqMisxCitkQjIgICAgICAgICAgICAgRE4gIFhUUjIqMisxCitkQjMgICAgICAgICAgICAgRE4gIFhUUjMqMisxCitkQjQgICAgICAgICAgICAgRE4gIFhUUjQqMgorZEI1ICAgICAgICAgICAgIEROICBYVFI1KjIKK2RCNiAgICAgICAgICAgICBETiAgWFRSNioyCitkQjcgICAgICAgICAgICAgRE4gIFhUUjcqMgorCisgICAgICAgICAgCisgICAgICAgIFZUUk4gICAgICAgIHFYZjAsIHFYZjEKKyAgICAgICAgVlRSTiAgICAgICAgcVhmMiwgcVhmMworICAgICAgICBWVFJOICAgICAgICBxWGY0LCBxWGY1CisgICAgICAgIFZUUk4gICAgICAgIHFYZjYsIHFYZjcKKyAgICAgICAgVlRSTiAgICAgICAgcUEwLCBxQTIKKyAgICAgICAgVlRSTiAgICAgICAgcUExLCBxQTMKKyAgICAgICAgVlRSTiAgICAgICAgcUE0LCBxQTYKKyAgICAgICAgVlRSTiAgICAgICAgcUE1LCBxQTcgICAgICAgIAorICAgICAgICBWU1dQICAgICAgICBkQjAsIGRCNAorICAgICAgICBWU1dQICAgICAgICBkQjEsIGRCNQorICAgICAgICBWU1dQICAgICAgICBkQjIsIGRCNgorICAgICAgICBWU1dQICAgICAgICBkQjMsIGRCNworICAgICAgICAKKworcVlqMCAgICAgICAgICAgIFFOIHFYZjAKK3FZajEgICAgICAgICAgICBRTiBxWGYxCitxWWoyICAgICAgICAgICAgUU4gcVhmMgorcVlqMyAgICAgICAgICAgIFFOIHFYZjMKK3FZajQgICAgICAgICAgICBRTiBxWGY0CitxWWo1ICAgICAgICAgICAgUU4gcVhmNQorcVlqNiAgICAgICAgICAgIFFOIHFYZjYKK3FZajcgICAgICAgICAgICBRTiBxWGY3CitxWWp0ICAgICAgICAgICAgUU4gcVhmdAorCitkWWowbG8gICAgICAgICAgRE4gKFhUUjAqMikuUzE2CitkWWowaGkgICAgICAgICAgRE4gKFhUUjAqMisxKS5TMTYKK2RZajFsbyAgICAgICAgICBETiAoWFRSMSoyKS5TMTYKK2RZajFoaSAgICAgICAgICBETiAoWFRSMSoyKzEpLlMxNgorZFlqMmxvICAgICAgICAgIEROIChYVFIyKjIpLlMxNgorZFlqMmhpICAgICAgICAgIEROIChYVFIyKjIrMSkuUzE2CitkWWozbG8gICAgICAgICAgRE4gKFhUUjMqMikuUzE2CitkWWozaGkgICAgICAgICAgRE4gKFhUUjMqMisxKS5TMTYKK2RZajRsbyAgICAgICAgICBETiAoWFRSNCoyKS5TMTYKK2RZajRoaSAgICAgICAgICBETiAoWFRSNCoyKzEpLlMxNgorZFlqNWxvICAgICAgICAgIEROIChYVFI1KjIpLlMxNgorZFlqNWhpICAgICAgICAgIEROIChYVFI1KjIrMSkuUzE2CitkWWo2bG8gICAgICAgICAgRE4gKFhUUjYqMikuUzE2CitkWWo2aGkgICAgICAgICAgRE4gKFhUUjYqMisxKS5TMTYKK2RZajdsbyAgICAgICAgICBETiAoWFRSNyoyKS5TMTYKK2RZajdoaSAgICAgICAgICBETiAoWFRSNyoyKzEpLlMxNgorZFlqdGxvICAgICAgICAgIEROIChYVFJ0KjIpLlMxNgorZFlqdGhpICAgICAgICAgIEROIChYVFJ0KjIrMSkuUzE2CisKK3FZaTAgICAgICAgICAgICBRTiBxWWowCitxWWkxICAgICAgICAgICAgUU4gcVlqNAorcVlpMiAgICAgICAgICAgIFFOIHFZajIKK3FZaTMgICAgICAgICAgICBRTiBxWWo3CitxWWk0ICAgICAgICAgICAgUU4gcVlqNQorcVlpNSAgICAgICAgICAgIFFOIHFZanQKK3FZaTYgICAgICAgICAgICBRTiBxWWoxCitxWWk3ICAgICAgICAgICAgUU4gcVlqNgorcVlpdCAgICAgICAgICAgIFFOIHFZajMKKworZFlpMGxvICAgICAgICAgIEROIGRZajBsbworZFlpMGhpICAgICAgICAgIEROIGRZajBoaQorZFlpMWxvICAgICAgICAgIEROIGRZajRsbworZFlpMWhpICAgICAgICAgIEROIGRZajRoaQorZFlpMmxvICAgICAgICAgIEROIGRZajJsbworZFlpMmhpICAgICAgICAgIEROIGRZajJoaQorZFlpM2xvICAgICAgICAgIEROIGRZajdsbworZFlpM2hpICAgICAgICAgIEROIGRZajdoaQorZFlpNGxvICAgICAgICAgIEROIGRZajVsbworZFlpNGhpICAgICAgICAgIEROIGRZajVoaQorZFlpNWxvICAgICAgICAgIEROIGRZanRsbworZFlpNWhpICAgICAgICAgIEROIGRZanRoaQorZFlpNmxvICAgICAgICAgIEROIGRZajFsbworZFlpNmhpICAgICAgICAgIEROIGRZajFoaQorZFlpN2xvICAgICAgICAgIEROIGRZajZsbworZFlpN2hpICAgICAgICAgIEROIGRZajZoaQorZFlpdGxvICAgICAgICAgIEROIGRZajNsbworZFlpdGhpICAgICAgICAgIEROIGRZajNoaQorCitxWWgwICAgICAgICAgICAgUU4gcVlpdAorcVloMSAgICAgICAgICAgIFFOIHFZaTAKK3FZaDIgICAgICAgICAgICBRTiBxWWkyCitxWWgzICAgICAgICAgICAgUU4gcVlpMworcVloNCAgICAgICAgICAgIFFOIHFZaTcKK3FZaDUgICAgICAgICAgICBRTiBxWWk1CitxWWg2ICAgICAgICAgICAgUU4gcVlpNAorcVloNyAgICAgICAgICAgIFFOIHFZaTEKK3FZaHQgICAgICAgICAgICBRTiBxWWk2CisKK2RZaDBsbyAgICAgICAgICBETiBkWWl0bG8KK2RZaDBoaSAgICAgICAgICBETiBkWWl0aGkKK2RZaDFsbyAgICAgICAgICBETiBkWWkwbG8KK2RZaDFoaSAgICAgICAgICBETiBkWWkwaGkKK2RZaDJsbyAgICAgICAgICBETiBkWWkybG8KK2RZaDJoaSAgICAgICAgICBETiBkWWkyaGkKK2RZaDNsbyAgICAgICAgICBETiBkWWkzbG8KK2RZaDNoaSAgICAgICAgICBETiBkWWkzaGkKK2RZaDRsbyAgICAgICAgICBETiBkWWk3bG8KK2RZaDRoaSAgICAgICAgICBETiBkWWk3aGkKK2RZaDVsbyAgICAgICAgICBETiBkWWk1bG8KK2RZaDVoaSAgICAgICAgICBETiBkWWk1aGkKK2RZaDZsbyAgICAgICAgICBETiBkWWk0bG8KK2RZaDZoaSAgICAgICAgICBETiBkWWk0aGkKK2RZaDdsbyAgICAgICAgICBETiBkWWkxbG8KK2RZaDdoaSAgICAgICAgICBETiBkWWkxaGkKK2RZaHRsbyAgICAgICAgICBETiBkWWk2bG8KK2RZaHRoaSAgICAgICAgICBETiBkWWk2aGkKKworcVlnMCAgICAgICAgICAgIFFOIHFZaDIKK3FZZzEgICAgICAgICAgICBRTiBxWWh0CitxWWcyICAgICAgICAgICAgUU4gcVloMQorcVlnMyAgICAgICAgICAgIFFOIHFZaDAKK3FZZzQgICAgICAgICAgICBRTiBxWWg0CitxWWc1ICAgICAgICAgICAgUU4gcVloNQorcVlnNiAgICAgICAgICAgIFFOIHFZaDYKK3FZZzcgICAgICAgICAgICBRTiBxWWg3CitxWWd0ICAgICAgICAgICAgUU4gcVloMworCitxWWYwICAgICAgICAgICAgUU4gcVlnNgorcVlmMSAgICAgICAgICAgIFFOIHFZZzUKK3FZZjIgICAgICAgICAgICBRTiBxWWc0CitxWWYzICAgICAgICAgICAgUU4gcVlndAorcVlmNCAgICAgICAgICAgIFFOIHFZZzMKK3FZZjUgICAgICAgICAgICBRTiBxWWcyCitxWWY2ICAgICAgICAgICAgUU4gcVlnMQorcVlmNyAgICAgICAgICAgIFFOIHFZZzAKK3FZZnQgICAgICAgICAgICBRTiBxWWc3CisKKyAgICAgICAgVlJTSFIgICAgICAgcVlqNywgcVlqNywgIzIKKyAgICAgICAgVlJTSFIgICAgICAgcVlqNiwgcVlqNiwgIzEKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFZaTUsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNSA9IChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk2LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTYgPSBqMS1qNworICAgICAgICBWSEFERCAgICAgICBxWWkzLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTMgPSAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpMiwgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkyID0gajItajYKKyAgICAgICAgVkhBREQgICAgICAgcVlpNywgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk3ID0gKGo1K2ozKS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTQsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNCA9IGo1LWozCisKKyAgICAgICAgVlFETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKKyAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQorICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCisKKyAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAorICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKKyAgICAgICAgVlFETVVMSCAgICAgcVloNSwgcVloNSwgSW52U3FydDIgICAgOy8vIGg1L3NxcnQoMikKKworICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk0bG8sIEMgICAgICAgICA7Ly8gYyppNAorICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWWk2bG8sIFMgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWWk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNGxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg0CisgICAgICAgIFZTSFJOICAgICAgIGRZaDRoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk2bG8sIEMgICAgICAgICA7Ly8gYyppNgorICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWWk0bG8sIFMgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWWk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFloNmxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg2CisgICAgICAgIFZTSFJOICAgICAgIGRZaDZoaSwgcVh0MSwgIzE2CisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWWc2LCBxWWg2LCBxWWg3CisgICAgICAgIFZTVUIgICAgICAgIHFZZzUsIHFZaDUsIHFZZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNCwgcVloNCwgcVlnNQorICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgorICAgICAgICBWSEFERCAgICAgICBxWWcxLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFZZzIsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMCwgcVloMCwgcVloMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWWczLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisgICAgICAgIAorCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBWSEFERCAgICAgICAgcVlmMywgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIU1VCICAgICAgICBxWWY0LCBxWWczLCBxWWc0ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjIsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNSwgcVlnMiwgcVlnNSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYxLCBxWWcxLCBxWWc2CisgICAgICAgIFZIU1VCICAgICAgICBxWWY2LCBxWWcxLCBxWWc2ICAgICAgICAKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjAsIHFZZzAsIHFZZzcKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjcsIHFZZzAsIHFZZzcgICAgICAKKworWVRSMCAgICAgICAgICAgIEVRVSBTcmMwCitZVFIxICAgICAgICAgICAgRVFVIFNyYzQKK1lUUjIgICAgICAgICAgICBFUVUgU3JjMQorWVRSMyAgICAgICAgICAgIEVRVSBTcmMyCitZVFI0ICAgICAgICAgICAgRVFVIFNyYzcKK1lUUjUgICAgICAgICAgICBFUVUgU3JjNQorWVRSNiAgICAgICAgICAgIEVRVSBUbXAKK1lUUjcgICAgICAgICAgICBFUVUgU3JjNgorWVRSdCAgICAgICAgICAgIEVRVSBTcmMzCisKK3FDMCAgICAgICAgICAgICBRTiAgWVRSMC5TMzIgICAgICAgICAgICAgICAgOy8vIGZvciBZVFJwb3NlCitxQzEgICAgICAgICAgICAgUU4gIFlUUjEuUzMyCitxQzIgICAgICAgICAgICAgUU4gIFlUUjIuUzMyCitxQzMgICAgICAgICAgICAgUU4gIFlUUjMuUzMyCitxQzQgICAgICAgICAgICAgUU4gIFlUUjQuUzMyCitxQzUgICAgICAgICAgICAgUU4gIFlUUjUuUzMyCitxQzYgICAgICAgICAgICAgUU4gIFlUUjYuUzMyCitxQzcgICAgICAgICAgICAgUU4gIFlUUjcuUzMyCisKK2REMCAgICAgICAgICAgICBETiAgWVRSMCoyKzEgICAgICAgICAgICAgICAgOy8vIGZvciB1c2luZyBWU1dQCitkRDEgICAgICAgICAgICAgRE4gIFlUUjEqMisxCitkRDIgICAgICAgICAgICAgRE4gIFlUUjIqMisxCitkRDMgICAgICAgICAgICAgRE4gIFlUUjMqMisxCitkRDQgICAgICAgICAgICAgRE4gIFlUUjQqMgorZEQ1ICAgICAgICAgICAgIEROICBZVFI1KjIKK2RENiAgICAgICAgICAgICBETiAgWVRSNioyCitkRDcgICAgICAgICAgICAgRE4gIFlUUjcqMgorICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWWYwLCBxWWYxCisgICAgICAgIFZUUk4gICAgICAgIHFZZjIsIHFZZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNCwgcVlmNQorICAgICAgICBWVFJOICAgICAgICBxWWY2LCBxWWY3CisgICAgICAgIFZUUk4gICAgICAgIHFDMCwgcUMyCisgICAgICAgIFZUUk4gICAgICAgIHFDMSwgcUMzCisgICAgICAgIFZUUk4gICAgICAgIHFDNCwgcUM2CisgICAgICAgIFZUUk4gICAgICAgIHFDNSwgcUM3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEQwLCBkRDQKKyAgICAgICAgVlNXUCAgICAgICAgZEQxLCBkRDUKKyAgICAgICAgVlNXUCAgICAgICAgZEQyLCBkRDYKKyAgICAgICAgVlNXUCAgICAgICAgZEQzLCBkRDcKKworICAgICAgICAKK2RZZjBVOCAgICAgICAgICBETiBZVFIwKjIuVTgKK2RZZjFVOCAgICAgICAgICBETiBZVFIxKjIuVTgKK2RZZjJVOCAgICAgICAgICBETiBZVFIyKjIuVTgKK2RZZjNVOCAgICAgICAgICBETiBZVFIzKjIuVTgKK2RZZjRVOCAgICAgICAgICBETiBZVFI0KjIuVTgKK2RZZjVVOCAgICAgICAgICBETiBZVFI1KjIuVTgKK2RZZjZVOCAgICAgICAgICBETiBZVFI2KjIuVTgKK2RZZjdVOCAgICAgICAgICBETiBZVFI3KjIuVTgKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRG8gc2F0dXJhdGlvbiBpZiBvdXRzaXplIGlzIG90aGVyIHRoYW4gUzE2CisgICAgICAgIDsvLworICAgICAgICAKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWzAtMjU1XQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMFU4LCBxWWYwCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYxVTgsIHFZZjEKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjJVOCwgcVlmMgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmM1U4LCBxWWYzCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY0VTgsIHFZZjQKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjVVOCwgcVlmNQorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNlU4LCBxWWY2CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY3VTgsIHFZZjcKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFstMjU2IHRvICsyNTVdCisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKKyAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gU3RvcmUgb3V0cHV0IGRlcGVuZGluZyBvbiB0aGUgU3RyaWRlIHNpemUKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sIFN0cmlkZQorICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0gICAgICAgICAgICAKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYwVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjFVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYzVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjRVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNVU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY2VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjdVOCwgW3BEZXN0IEA2NF0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICA7Ly8gKCIkb3V0c2l6ZSI9InM5Iikgb3IgKCIkb3V0c2l6ZSI9InMxNiIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ESUYKKworCisKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisKKworCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBTY2FsZSBUV08gaW5wdXQgcm93cyB3aXRoIFRXTyByb3dzIG9mIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgTV9JRENUX1BSRVNDQUxFMTYgdG8gcHJlLXNjYWxlIG9uZSByb3cKKyAgICAgICAgOy8vIGlucHV0IChFaWdodCBpbnB1dCB2YWx1ZXMpIHdpdGggb25lIHJvdyBvZiBzY2FsZSB2YWx1ZXMuIEFsc28gCisgICAgICAgIDsvLyBMb2FkcyBuZXh0IHNjYWxlIHZhbHVlcyBmcm9tIHBTY2FsZSwgaWYgJExhc3RSb3cgZmxhZyBpcyBub3Qgc2V0LgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KKyAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLyBxVDBsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQwaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMWxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gZFNjYWxlMWxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KKyAgICAgICAgOy8vIGRTY2FsZTFoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUybG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLyBkU2NhbGUyaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgRmxhZworICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRMYXN0Um93ICAgICAgICAtIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHJvdyBpcyBsYXN0IHJvdworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4pCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4rMSkKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyBxU2NhbGUxICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93CisgICAgICAgIDsvLyBxU2NhbGUyICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93KzEKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfU0NBTEUxNiAkZEFsbywgJGRBaGksICRkQmxvLCAkZEJoaSwgJExhc3RSb3cKKyAgICAgICAgVk1VTEwgICAgICAgcVQwbG8sICRkQWxvLCBkU2NhbGUxbG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQwaGksICRkQWhpLCBkU2NhbGUxaGkKKyAgICAgICAgVk1VTEwgICAgICAgcVQxbG8sICRkQmxvLCBkU2NhbGUybG8KKyAgICAgICAgVk1VTEwgICAgICAgcVQxaGksICRkQmhpLCBkU2NhbGUyaGkKKyAgICAgICAgSUYgIiRMYXN0Um93Ij0iMCIKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisxCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMgorICAgICAgICBFTkRJRgorICAgICAgICBWUVJTSFJOICAgICAgICRkQWxvLCBxVDBsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFoaSwgcVQwaGksICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRCbG8sIHFUMWxvLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmhpLCBxVDFoaSwgIzEyICAgICAgICAKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMTYgYml0IHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgorICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBxWGluICAgICAgICAgICAgLSBuIHRoIG91dHB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGowbG8sIGRYajBoaSwgZFhqMWxvLCBkWGoxaGksIDAgICAgICAgIDsvLyBQcmUgc2NhbGUgcm93IDAgJiAxCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajJsbywgZFhqMmhpLCBkWGozbG8sIGRYajNoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajRsbywgZFhqNGhpLCBkWGo1bG8sIGRYajVoaSwgMCAgICAgICAgCisgICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajZsbywgZFhqNmhpLCBkWGo3bG8sIGRYajdoaSwgMSAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFYaTUsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTYsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGkzLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIChqMitqNikvMgorICAgICAgICBWU1VCICAgICAgICBxWGkyLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIGoyLWo2CisgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCisgICAgICAgIFZIQUREICAgICAgIHFYaTcsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFZTVUIgICAgICAgIHFYaTQsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgTUVORCAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDMyIGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIDMyYml0IHNjYWxlIHZhbHVlcyBpbiBRMjMgZm9ybWF0CisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGlubG8gICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKKyAgICAgICAgOy8vIGRYaW5oaSAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorcVNjYWxlMGxvICAgICAgIFFOIDAuUzMyCitxU2NhbGUwaGkgICAgICAgUU4gMS5TMzIKK3FTY2FsZTFsbyAgICAgICBRTiAyLlMzMgorcVNjYWxlMWhpICAgICAgIFFOIDMuUzMyCitxU2NhbGUybG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUyaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGUzbG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGUzaGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU0bG8gICAgICAgUU4gcVNjYWxlMWxvCitxU2NhbGU0aGkgICAgICAgUU4gcVNjYWxlMWhpCitxU2NhbGU1bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU1aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU2bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU2aGkgICAgICAgUU4gcVNjYWxlMGhpCitxU2NhbGU3bG8gICAgICAgUU4gcVNjYWxlMGxvCitxU2NhbGU3aGkgICAgICAgUU4gcVNjYWxlMGhpCisKK3FTcmMwbG8gICAgICAgICBRTiA0LlMzMgorcVNyYzBoaSAgICAgICAgIFFOIDUuUzMyCitxU3JjMWxvICAgICAgICAgUU4gNi5TMzIKK3FTcmMxaGkgICAgICAgICBRTiBTcmM0LlMzMgorcVNyYzJsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMyaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjM2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzNoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM0bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjNGhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzVsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM1aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjNmxvICAgICAgICAgUU4gcVNyYzFsbworcVNyYzZoaSAgICAgICAgIFFOIHFTcmMxaGkKK3FTcmM3bG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjN2hpICAgICAgICAgUU4gcVNyYzBoaQorCitxUmVzMTdsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMTdoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzMjZsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzMjZoaSAgICAgICAgUU4gcVNjYWxlMGhpCitxUmVzNTNsbyAgICAgICAgUU4gcVNjYWxlMGxvCitxUmVzNTNoaSAgICAgICAgUU4gcVNjYWxlMGhpCisKKyAgICAgICAgICAgIEFERCAgICAgICAgIHBUZW1wLCBwU2NhbGUsICM0KjgqNyAgICAgICAgICAgOy8vIEFkZHJlc3Mgb2YgIHBTY2FsZVs3XQorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gUm93IDAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUwbG8sIHFTY2FsZTBoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBsbywgZFhqMGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGhpLCBkWGowaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUxbG8sIHFTY2FsZTFoaX0sIFtwU2NhbGVdIQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBsbywgcVNjYWxlMGxvLCBxU3JjMGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGhpLCBxU2NhbGUwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU3bG8sIHFTY2FsZTdoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWxvLCBkWGoxbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxaGksIGRYajFoaSwgIygxMi0xKSAgICAgICAgICAgIAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGxvLCBxU3JjMGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkwCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwaGksIHFTcmMwaGkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3bG8sIGRYajdsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdoaSwgZFhqN2hpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWxvLCBxU2NhbGUxbG8sIHFTcmMxbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxaGksIHFTY2FsZTFoaSwgcVNyYzFoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdsbywgcVNjYWxlN2xvLCBxU3JjN2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2hpLCBxU2NhbGU3aGksIHFTcmM3aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUybG8sIHFTY2FsZTJoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDEgJiA3CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIChqMStqNykvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk1CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1aGksIHFSZXMxN2hpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIGoxLWo3CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk2CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2aGksIHFSZXMxN2hpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmxvLCBkWGoybG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMyaGksIGRYajJoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTZsbywgcVNjYWxlNmhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2bG8sIGRYajZsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZoaSwgZFhqNmhpLCAjKDEyLTEpCisgICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmxvLCBxU2NhbGUybG8sIHFTcmMybG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMyaGksIHFTY2FsZTJoaSwgcVNyYzJoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZsbywgcVNjYWxlNmxvLCBxU3JjNmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmhpLCBxU2NhbGU2aGksIHFTcmM2aGkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUzbG8sIHFTY2FsZTNoaX0sIFtwU2NhbGVdIQorCisgICAgICAgICAgICA7Ly8gUm93IDIgJiA2CisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIChqMitqNikvMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2xvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkzCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzaGksIHFSZXMyNmhpICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIGoyLWo2CisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmxvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkyaGksIHFSZXMyNmhpICAgICAgCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2xvLCBkWGozbG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzaGksIGRYajNoaSwgIygxMi0xKQorICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTVsbywgcVNjYWxlNWhpfSwgW3BUZW1wXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1bG8sIGRYajVsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVoaSwgZFhqNWhpLCAjKDEyLTEpCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2xvLCBxU2NhbGUzbG8sIHFTcmMzbG8KKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzaGksIHFTY2FsZTNoaSwgcVNyYzNoaQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVsbywgcVNjYWxlNWxvLCBxU3JjNWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWhpLCBxU2NhbGU1aGksIHFTcmM1aGkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAzICYgNQorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyAoajUrajMpLzIKKyAgICAgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNioyKjIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2hpLCBxUmVzNTNoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyBqNS1qMworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHFYajQsIFtwU3JjIEA2NF0KKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGhpLCBxUmVzNTNoaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRsbywgZFhqNGxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGhpLCBkWGo0aGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU0bG8sIHFTY2FsZTRoaX0sIFtwU2NhbGVdICAgICAgICAgICAgCisgICAgICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiAgICAgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRsbywgcVNjYWxlNGxvLCBxU3JjNGxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGhpLCBxU2NhbGU0aGksIHFTcmM0aGkKKyAgICAgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICAgICAgOy8vIFJvdyA0CisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxbG8sIHFTcmM0bG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTEKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFoaSwgcVNyYzRoaSAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBNRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTExMThmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheQorICovCisgCisKKworI2lmbmRlZiBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KKyNkZWZpbmUgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCisKKyNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgorICAKKy8qIE1hc2sgdGFibGUgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDFiM2UxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLyogR3VhcmQgdGhlIGhlYWRlciBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gKi8KKyNpZm5kZWYgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworI2RlZmluZSBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCisKKworLyogVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBpbiBvbXh0eXBlcy5oIGJ1dCBoYXNuJ3QgYmVlbiBhcHByb3ZlZCBieSBPcGVuTUFYIHlldCAqLworI2RlZmluZSBPTVhfVkVSU0lPTiAxMDIKKworLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgbWFjcm9zIGluIG9yZGVyIHRvIGNvbnZlcnQgYSAjZGVmaW5lIG51bWJlciBpbnRvIGEgI2RlZmluZSBzdHJpbmcuICovCisjZGVmaW5lIEFSTV9RVU9URShhKSAjYQorI2RlZmluZSBBUk1fSU5ESVJFQ1QoQSkgQVJNX1FVT1RFKEEpCisKKy8qIENvbnZlcnQgdGhlIE9NWF9WRVJTSU9OIG51bWJlciBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcmludCBpdCBvdXQuICovCisjZGVmaW5lIEFSTV9WRVJTSU9OX1NUUklORyBBUk1fSU5ESVJFQ1QoT01YX1ZFUlNJT04pCisKKworLyogRGVmaW5lIHRoaXMgaW4gb3JkZXIgdG8gdHVybiBvbiBBUk0gdmVyc2lvbi9yZWxlYXNlL2J1aWxkIHN0cmluZ3MgaW4gZWFjaCBkb21haW4gKi8KKyNkZWZpbmUgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214QUNfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJUF9WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214U1BfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLworCisKKy8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IHRoZSByZWxlYXNlIHNjcmlwdCAqLworLyogVGhleSBhcmUgdXNlZCBpbiB0aGUgQVJNIHZlcnNpb24gc3RyaW5ncyBkZWZpbmVkIGZvciBlYWNoIGRvbWFpbi4gICAgICAgICAgICAgKi8KKworLyogVGhlIHJlbGVhc2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuIC0gdXNlZCBmb3Igc291cmNlIGFuZCBvYmplY3QgcmVsZWFzZXMgKi8KKyNkZWZpbmUgT01YX0FSTV9SRUxFQVNFX1RBRyAgInIxcDAtMDBiZXQwIgorCisvKiBUaGUgQVJNIGFyY2hpdGVjdHVyZSB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIkFSTSBBcmNoaXRlY3R1cmUgVjcgd2l0aCBORU9OIgorCisvKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KKyNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKKworCisjZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTU2YmQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaApAQCAtMCwwICsxLDExNTcgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybUNPTU1fcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBjb21tb24gaGVhZGVyIGZpbGUKKzsvLworCis7Ly8gUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbgorIElGIDpMTk9UOjpERUY6QVJNQ09NTV9TX0gKKyBHQkxMIEFSTUNPTU1fU19ICisKKyAgICAgICAgUkVRVUlSRTggICAgICAgICAgICA7Ly8gUmVxdWlyZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAorICAgICAgICBQUkVTRVJWRTggICAgICAgICAgIDsvLyBQcmVzZXJ2ZXMgOC1ieXRlIHN0YWNrIGFsaWdubWVudAorICAgICAgICAKKyAgICAgICAgR0JMTCAgICBBUk1fRVJST1JDSEVDSworQVJNX0VSUk9SQ0hFQ0sgIFNFVEwge0ZBTFNFfQorCis7Ly8gR2xvYmFscworCisgICAgICAgIEdCTFMgICAgX1JSZWdMaXN0ICAgOy8vIFIgc2F2ZWQgcmVnaXN0ZXIgbGlzdAorICAgICAgICBHQkxTICAgIF9EUmVnTGlzdCAgIDsvLyBEIHNhdmVkIHJlZ2lzdGVyIGxpc3QKKyAgICAgICAgR0JMUyAgICBfVmFyaWFudCAgICA7Ly8gU2VsZWN0ZWQgcHJvY2Vzc29yIHZhcmlhbnQKKyAgICAgICAgR0JMUyAgICBfQ1BVICAgICAgICA7Ly8gQ1BVIG5hbWUKKyAgICAgICAgR0JMUyAgICBfU3RydWN0ICAgICA7Ly8gU3RydWN0dXJlIG5hbWUKKyAgICAgICAgCisgICAgICAgIEdCTEwgICAgX0luRnVuYyAgICAgOy8vIEluc2lkZSBmdW5jdGlvbiBhc3NlbWJseSBmbGFnCisgICAgICAgIEdCTEwgICAgX1N3TG9uZyAgICAgOy8vIExvbmcgc3dpdGNoIGZsYWcKKyAgICAgICAgCisgICAgICAgIEdCTEEgICAgX1JCeXRlcyAgICAgOy8vIE51bWJlciBvZiByZWdpc3RlciBieXRlcyBvbiBzdGFjaworICAgICAgICBHQkxBICAgIF9TQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2Ygc2NyYXRjaCBieXRlcyBvbiBzdGFjayAKKyAgICAgICAgR0JMQSAgICBfQUJ5dGVzICAgICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIG5leHQgYXJndW1lbnQKKyAgICAgICAgR0JMQSAgICBfV29ya3NwYWNlICA7Ly8gU3RhY2sgb2Zmc2V0IG9mIHNjcmF0Y2ggd29ya3NwYWNlCisgICAgICAgIEdCTEEgICAgX0YgICAgICAgICAgOy8vIEZ1bmN0aW9uIG51bWJlcgorICAgICAgICBHQkxBICAgIF9TdE9mZiAgICAgIDsvLyBTdHJ1Y3Qgb2Zmc2V0CisgICAgICAgIEdCTEEgICAgX1N3TnVtICAgICAgOy8vIFN3aXRjaCBudW1iZXIKKyAgICAgICAgR0JMUyAgICBfMzIgICAgICAgICA7Ly8gU3VmZml4IGZvciAzMiBieXRlIGFsaWdubW5ldAorICAgICAgICBHQkxTICAgIF8xNiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDE2IGJ5dGUgYWxpZ25tbmV0CisgICAgICAgIAorX0luRnVuYyAgICAgICAgIFNFVEwgICAge0ZBTFNFfQorX1NCeXRlcyAgICAgICAgIFNFVEEgICAgMAorX0YgICAgICAgICAgICAgIFNFVEEgICAgMAorX1N3TnVtICAgICAgICAgIFNFVEEgICAgMAorXzMyICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMzIiCitfMTYgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04xNiIKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIE92ZXJyaWRlIHRoZSB0b29scyBzZXR0aW5ncyBvZiB0aGUgQ1BVIGlmIHRoZSAjZGVmaW5lCis7Ly8gVVNFQ1BVIGlzIHNldCwgb3RoZXJ3aXNlIHVzZSB0aGUgQ1BVIGRlZmluZWQgYnkgdGhlCis7Ly8gYXNzZW1ibGVyIHNldHRpbmdzLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgSUYgOkRFRjogT1ZFUlJJREVDUFUKK19DUFUgICAgICAgU0VUUyAgT1ZFUlJJREVDUFUKKyAgICAgICBFTFNFCitfQ1BVICAgICAgIFNFVFMgICAge0NQVX0gICAgICAgCisgICAgICAgRU5ESUYKKworCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBXb3JrIG91dCB3aGljaCBjb2RlIHRvIGJ1aWxkCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgSUYgOkRFRjpBUk0xMTM2SlM6TE9SOjpERUY6Q29ydGV4QTg6TE9SOjpERUY6QVJNX0dFTkVSSUMKKyAgICAgICAgICAgIElORk8gMSwiUGxlYXNlIHN3aXRjaCB0byB1c2luZyBNX1ZBUklBTlRTIgorICAgICAgICBFTkRJRgorCisgICAgICAgIDsvLyBEZWZpbmUgYW5kIHJlc2V0IGFsbCBvZmZpY2lhbGx5IHJlY29uZ25pc2VkIHZhcmlhbnRzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk05MjZFSlMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKU19VCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIENvcnRleEE4CisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTdURE1JCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RFRl9WQVJJQU5UICR2YXIKKyAgICAgICAgR0JMTCAkdmFyCisgICAgICAgIEdCTEwgX29rJHZhcgorJHZhciAgICBTRVRMIHtGQUxTRX0KKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorCisgICAgICAgIDsvLyBWYXJpYW50IGRlY2xhcmF0aW9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVmaW5lIGEgbGlzdCBvZiBjb2RlIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICAgIDsvLyBzb3VyY2UgZmlsZS4gVGhpcyBtYWNybyB0aGVuIGNob29zZXMgdGhlIG1vc3QKKyAgICAgICAgOy8vIGFwcHJvcHJpYXRlIHZhcmlhbnQgdG8gYnVpbGQgZm9yIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZAorICAgICAgICA7Ly8gY29yZS4KKyAgICAgICAgOy8vICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9WQVJJQU5UUyAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3ICAgICAgICAKKyAgICAgICAgOy8vIFNldCB0byBUUlVFIHZhcmlhbnRzIHRoYXQgYXJlIHN1cHBvcnRlZAorICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgX01fVkFSSUFOVCAkdjAKKyAgICAgICAgX01fVkFSSUFOVCAkdjEKKyAgICAgICAgX01fVkFSSUFOVCAkdjIKKyAgICAgICAgX01fVkFSSUFOVCAkdjMKKyAgICAgICAgX01fVkFSSUFOVCAkdjQKKyAgICAgICAgX01fVkFSSUFOVCAkdjUKKyAgICAgICAgX01fVkFSSUFOVCAkdjYKKyAgICAgICAgX01fVkFSSUFOVCAkdjcKKyAgICAgICAgCisgICAgICAgIDsvLyBMb29rIGZvciBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCB0byBtYXRjaCBhIENQVQorICAgICAgICA7Ly8gX01fVFJZIGNwdSwgdmFyaWFudCBmYWxsIGJhY2sgbGlzdAorX1ZhcmlhbnQgU0VUUyAiIiAgICAgICAgICAgICAgICAKKyAgICAgICAgX01fVFJZIEFSTTkyNkVKLVMsICAgQVJNOTI2RUpTCisgICAgICAgIF9NX1RSWSBBUk0xMTc2SlotUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE3NkpaRi1TLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNTZUMi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTU2VDJGLVMsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTEzNkotUywgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExMzZKRi1TLCAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBNUENvcmUsICAgICAgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgZmFsY29uLXZmcCwgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBmYWxjb24tZnVsbC1uZW9uLCBDb3J0ZXhBOAorICAgICAgICBfTV9UUlkgQ29ydGV4LUE4Tm9OZW9uLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1BOCwgICAgQ29ydGV4QTgsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQ29ydGV4LVI0LCAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTdURE1JCisgICAgICAgIAorICAgICAgICA7Ly8gU2VsZWN0IHRoZSBjb3JyZWN0IHZhcmlhbnQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIElGIF9WYXJpYW50PSIiCisgICAgICAgICAgICBJTkZPIDEsICJObyBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCisgICAgICAgIEVMU0UKKyRfVmFyaWFudCAgIFNFVEwge1RSVUV9CisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBSZWdpc3RlciBhIHZhcmlhbnQgYXMgYXZhaWxhYmxlCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1ZBUklBTlQgJHZhcgorICAgICAgICBJRiAiJHZhciI9IiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGIDpMTk9UOjpERUY6X29rJHZhcgorICAgICAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHZhcmlhbnQgJyR2YXInIgorICAgICAgICBFTkRJRgorJHZhciAgICBTRVRMIHtUUlVFfQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRm9yIGEgZ2l2ZW4gQ1BVLCBzZWUgaWYgYW55IG9mIHRoZSB2YXJpYW50cyBzdXBwb3J0aW5nCisgICAgICAgIDsvLyB0aGlzIENQVSBhcmUgYXZhaWxhYmxlLiBUaGUgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgaXMKKyAgICAgICAgOy8vIGNob3NlbgorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkgJGNwdSwgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NworICAgICAgICBJRiAiJGNwdSI8Pl9DUFUKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1RSWTEgJHYwCisgICAgICAgIF9NX1RSWTEgJHYxCisgICAgICAgIF9NX1RSWTEgJHYyCisgICAgICAgIF9NX1RSWTEgJHYzCisgICAgICAgIF9NX1RSWTEgJHY0CisgICAgICAgIF9NX1RSWTEgJHY1CisgICAgICAgIF9NX1RSWTEgJHY2CisgICAgICAgIF9NX1RSWTEgJHY3CisgICAgICAgIDsvLyBDaGVjayBhIG1hdGNoIHdhcyBmb3VuZAorICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gdmFyaWFudCBtYXRjaCBmb3VuZCBmb3IgQ1BVICckX0NQVSciCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1RSWTEgJHZhcgorICAgICAgICBJRiAiJHZhciI9IiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGIChfVmFyaWFudD0iIik6TEFORDokdmFyCitfVmFyaWFudCBTRVRTICIkdmFyIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3RydWN0dXJlIGRlZmluaXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIG9mIGdpdmVuIG5hbWUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJVQ1QgJHNuYW1lCitfU3RydWN0IFNFVFMgIiRzbmFtZSIKK19TdE9mZiAgU0VUQSAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNsYXJlIGEgc3RydWN0dXJlIGZpZWxkCisgICAgICAgIDsvLyBUaGUgZmllbGQgaXMgY2FsbGVkICRzbmFtZV8kZm5hbWUKKyAgICAgICAgOy8vICRzaXplICAgPSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5LCBtdXN0IGJlIHBvd2VyIG9mIDIgCisgICAgICAgIDsvLyAkbnVtYmVyID0gKGlmIHByb3ZpZGVkKSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZm9yIGFuIGFycmF5CisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRklFTEQgJGZuYW1lLCAkc2l6ZSwgJG51bWJlcgorICAgICAgICBJRiAoX1N0T2ZmOkFORDooJHNpemUtMSkpIT0wCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICgkc2l6ZSAtIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkpCisgICAgICAgIEVORElGCiskX1N0cnVjdC5fJGZuYW1lIEVRVSBfU3RPZmYKKyAgICAgICAgSUYgIiRudW1iZXIiPD4iIgorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZSokbnVtYmVyCisgICAgICAgIEVMU0UKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5EU1RSVUNUCitzaXplb2ZfJF9TdHJ1Y3QgRVFVIF9TdE9mZgorX1N0cnVjdCBTRVRTICIiCisgICAgICAgIE1FTkQKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBTd2l0Y2ggYW5kIHRhYmxlIG1hY3JvcworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gU3RhcnQgYSByZWxhdGl2ZSBzd2l0Y2ggdGFibGUgd2l0aCByZWdpc3RlciB0byBzd2l0Y2ggb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkdiA9IHRoZSByZWdpc3RlciB0byBzd2l0Y2ggb24KKyAgICAgICAgOy8vICRzID0gaWYgc3BlY2lmaWVkIG11c3QgYmUgIkwiIHRvIGluZGljYXRlIGxvbmcKKyAgICAgICAgOy8vICAgICAgdGhpcyBhbGxvd3MgYSBncmVhdGVyIHJhbmdlIHRvIHRoZSBjYXNlIGNvZGUKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TV0lUQ0ggJHYsICRzCisgICAgICAgIEFTU0VSVCAiJHMiPSIiOkxPUjoiJHMiPSJMIgorX1N3TG9uZyBTRVRMIHtGQUxTRX0KKyAgICAgICAgSUYgIiRzIj0iTCIKK19Td0xvbmcgICAgIFNFVEwge1RSVUV9CisgICAgICAgIEVORElGCitfU3dOdW0gIFNFVEEgX1N3TnVtKzEgICAgICAgIAorICAgICAgICBJRiB7Q09ORklHfT0xNgorICAgICAgICAgICAgOy8vIFRodW1iCisgICAgICAgICAgICBJRiBfU3dMb25nCisgICAgICAgICAgICAgICAgVEJIIFtwYywgJHYsIExTTCMxXQorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIFRCQiBbcGMsICR2XQorICAgICAgICAgICAgRU5ESUYKK19Td2l0Y2gkX1N3TnVtCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUk0KKyAgICAgICAgICAgIEFERCBwYywgcGMsICR2LCBMU0wgIzIKKyAgICAgICAgICAgIE5PUAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gQWRkIGEgY2FzZSB0byB0aGUgc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0NBU0UgICRsYWJlbAorICAgICAgICBJRiB7Q09ORklHfT0xNgorICAgICAgICAgICAgOy8vIFRodW1iCisgICAgICAgICAgICBJRiBfU3dMb25nCisgICAgICAgICAgICAgICAgRENXICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgorICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgIERDQiAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUk0KKyAgICAgICAgICAgIEIgICAkbGFiZWwKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50CisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIEFMSUdOIDIKKyAgICAgICAgTUVORCAgICAgICAKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBEYXRhIGFyZWEgYWxsb2NhdGlvbgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIENvbnN0YW50IHRhYmxlIGFsbG9jYXRvciBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENyZWF0ZXMgYSBuZXcgc2VjdGlvbiBmb3IgZWFjaCBjb25zdGFudCB0YWJsZQorICAgICAgICA7Ly8gJG5hbWUgaXMgc3ltYm9sIHRocm91Z2ggd2hpY2ggdGhlIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZC4KKyAgICAgICAgOy8vICRhbGlnbiBpcyB0aGUgb3B0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSB0YWJsZSwgbG9nMiBvZiAKKyAgICAgICAgOy8vICB0aGUgYnl0ZSBhbGlnbm1lbnQgLSAkYWxpZ249NCBpcyAxNiBieXRlIGFsaWduZWQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9UQUJMRSAgJG5hbWUsICRhbGlnbgorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAiJGFsaWduIj0iIgorICAgICAgICAgICAgQVJFQSB8LmNvbnN0ZGF0YXwsIFJFQURPTkxZLCBEQVRBCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBBUkVBcyBpbmhlcml0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGRlY2xhcmF0aW9uLgorICAgICAgICAgICAgOy8vIFRoZXJlZm9yZSBmb3IgZWFjaCBhbGlnbm1lbnQgc2l6ZSB3ZSBtdXN0IGhhdmUgYW4gYXJlYQorICAgICAgICAgICAgOy8vIG9mIGEgZGlmZmVyZW50IG5hbWUuCisgICAgICAgICAgICBBUkVBIGNvbnN0ZGF0YV9hJGFsaWduLCBSRUFET05MWSwgREFUQSwgQUxJR049JGFsaWduCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBXZSBhbHNvIGZvcmNlIGFsaWdubWVudCBpbmNhc2Ugd2UgYXJlIHRhZ2dpbmcgb250bworICAgICAgICAgICAgOy8vIGFuIGFscmVhZHkgc3RhcnRlZCBhcmVhLgorICAgICAgICAgICAgQUxJR04gKDE8PCRhbGlnbikKKyAgICAgICAgRU5ESUYKKyRuYW1lCisgICAgICAgIE1FTkQKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrCis7Ly8KKzsvLyBUaGVzZSBhbGwgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCis7Ly8gYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSAKKzsvLyAzMi1ieXRlIGFsaWdubWVudCBtYWNybyBuZWVkcyB0byB3b3JrIGluIGEKKzsvLyBiaXQgbW9yZSBvZiBhIHNwZWNpYWwgd2F5Li4uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAKKworCisgICAgICAgIDsvLyBBbGxvY2F0ZSAxLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MxICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDItYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MSkhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICgyIC0gKF9TQnl0ZXM6QU5EOjEpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgNC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DNCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDozKSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDQgLSAoX1NCeXRlczpBTkQ6MykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0M4ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMTYpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDE2IGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDE2IGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMTYgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzE2ICAgRVFVIChfU0J5dGVzICsgOCkKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDgKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSszMikgYnl0ZXMuCisgICAgICAgIDsvLyBUaGUgZXh0cmEgMzIgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMzIgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MzMiAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiRfMzIgICBFUVUgKF9TQnl0ZXMgKyAyNCkKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKSArIDI0CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFyZ3VtZW50IERlY2xhcmF0aW9uIE1hY3JvCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQWxsb2NhdGUgYW4gYXJndW1lbnQgbmFtZSAkbmFtZQorICAgICAgICA7Ly8gc2l6ZSAkc2l6ZSBieXRlcworICAgICAgICBNQUNSTworICAgICAgICBNX0FSRyAgICAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCBfSW5GdW5jCiskbmFtZSRfRiAgICBFUVUgX0FCeXRlcworX0FCeXRlcyBTRVRBIF9BQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIE1hY3JvcyB0byBhY2Nlc3Mgc3RhY2tlZCB2YXJpYWJsZXMKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBwcm9jZXNzaW5nIG9wZXJhdGlvbgorICAgICAgICA7Ly8gd2l0aCBhIGNvbnN0YW50IHNlY29uZCBvcGVyYW5kCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX09QQyAkb3AsJHJkLCRybiwkY29uc3QKKyAgICAgICAgTENMQSAgICBfc2gKKyAgICAgICAgTENMQSAgICBfY3N0Citfc2ggICAgIFNFVEEgICAgMAorX2NzdCAgICBTRVRBICAgICRjb25zdAorICAgICAgICBJRiBfY3N0PTAKKyAgICAgICAgJG9wICRyZCwgJHJuLCAjX2NzdAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgV0hJTEUgKF9jc3Q6QU5EOjMpPTAKK19jc3QgICAgICAgIFNFVEEgX2NzdD4+MgorX3NoICAgICAgICAgU0VUQSBfc2grMgorICAgICAgICBXRU5ECisgICAgICAgICRvcCAkcmQsICRybiwgIyhfY3N0OkFORDoweDAwMDAwMEZGKTw8X3NoCisgICAgICAgIElGIF9jc3Q+PTI1NgorICAgICAgICAgICAgJG9wICRyZCwgJHJkLCAjKF9jc3Q6QU5EOjB4RkZGRkZGMDApPDxfc2gKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBNYWNybyB0byBwZXJmb3JtIGEgZGF0YSBhY2Nlc3Mgb3BlcmF0aW9uCisgICAgICAgIDsvLyBTdWNoIGFzIExEUiBvciBTVFIKKyAgICAgICAgOy8vIFRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbW9kaWZpZWQgc3VjaCB0aGF0CisgICAgICAgIDsvLyAxLiBJZiBubyBhZGRyZXNzIGlzIGdpdmVuIHRoZW4gdGhlIG5hbWUgaXMgdGFrZW4KKyAgICAgICAgOy8vICAgIGFzIGEgc3RhY2sgb2Zmc2V0CisgICAgICAgIDsvLyAyLiBJZiB0aGUgYWRkcmVzc2luZyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZQorICAgICAgICA7Ly8gICAgc3RhdGUgYmVpbmcgYXNzZW1ibGVkIGZvciAoZWcgVGh1bWIpIHRoZW4gYSBzdWl0YWJsZQorICAgICAgICA7Ly8gICAgYWRkcmVzc2luZyBtb2RlIGlzIHN1YnN0aXR1dGVkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE9uIEVudHJ5OgorICAgICAgICA7Ly8gJGkgPSBJbnN0cnVjdGlvbiB0byBwZXJmb3JtIChlZyAiTERSQiIpCisgICAgICAgIDsvLyAkYSA9IFJlcXVpcmVkIGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLyAkciA9IFJlZ2lzdGVyKHMpIHRvIHRyYW5zZmVyIChlZyAicjEiKQorICAgICAgICA7Ly8gJGEwLCRhMSwkYTIuIEFkZHJlc3NpbmcgbW9kZSBhbmQgY29uZGl0aW9uLiBPbmUgb2Y6CisgICAgICAgIDsvLyAgICAgbGFiZWwgeyxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0gICAgICAgICAgICAgICAgICAgIHssLCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0XXshfSAgICAgICAgIHssLGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXQsIHNoaWZ0XXshfSAgeyxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCAgICAgICAgICAgIHssLGNjfQorICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0LCBzaGlmdCAgICAgeyxjY30KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fREFUQSAkaSwkYSwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgSUYgIiRhMCI6TEVGVDoxPSJbIgorICAgICAgICAgICAgSUYgIiRhMSI9IiIKKyAgICAgICAgICAgICAgICAkaSRhMyAgICRyLCAkYTAKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBJRiAiJGEwIjpSSUdIVDoxPSJdIgorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUE9TVElORCAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICRhMQorICAgICAgICAgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgICAgICAgICBfTV9QUkVJTkQgICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgorICAgICAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICBMQ0xBICAgIF9PZmZzZXQKK19PZmZzZXQgICAgIFNFVEEgICAgX1dvcmtzcGFjZSArICRhMCRfRgorICAgICAgICAgICAgQVNTRVJUICAoX09mZnNldDpBTkQ6KCRhLTEpKT0wCisgICAgICAgICAgICAkaSRhMSAgICRyLCBbc3AsICNfT2Zmc2V0XQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHBvc3QgaW5kZXhlZCBsb2FkL3N0b3JlcworICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2VdLCBvZmZzZXQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUE9TVElORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGIHtDT05GSUd9PTE2IDsvLyBUaHVtYgorX2Jhc2UgICAgICAgU0VUUyAoIiRhMCI6TEVGVDooOkxFTjoiJGEwIi0xKSk6UklHSFQ6KDpMRU46IiRhMCItMikgICA7Ly8gcmVtb3ZlIFtdCitfb2Zmc2V0ICAgICBTRVRTICIkYTEiCisgICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iKyIKK19vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICRpICAkciwgJGEwCisgICAgICAgICAgICBJRiBfb2Zmc2V0OkxFRlQ6MT0iLSIKK19vZmZzZXQgICAgICAgICBTRVRTIF9vZmZzZXQ6UklHSFQ6KDpMRU46X29mZnNldC0xKQorICAgICAgICAgICAgICAgIFNVQiAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRSA7Ly8gQVJNCisgICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBIYW5kbGUgcHJlIGluZGV4ZWQgbG9hZC9zdG9yZQorICAgICAgICA7Ly8gb3AgIHJlZywgW2Jhc2UsIG9mZnNldF17IX0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUFJFSU5EICRpLCRyLCRhMCwkYTEKKyAgICAgICAgTENMUyBfYmFzZQorICAgICAgICBMQ0xTIF9vZmZzZXQKKyAgICAgICAgSUYgKHtDT05GSUd9PTE2KTpMQU5EOigoIiRhMSI6UklHSFQ6Mik9Il0hIikKK19iYXNlICAgICAgIFNFVFMgIiRhMCI6UklHSFQ6KDpMRU46KCIkYTAiKS0xKQorX29mZnNldCAgICAgU0VUUyAiJGExIjpMRUZUOig6TEVOOigiJGExIiktMikKKyAgICAgICAgICAgICRpICRyLCBbJF9iYXNlLCAkX29mZnNldF0KKyAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHNpZ25lZCBieXRlIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTQiAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0IiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBieXRlIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSQiAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUkIiLDEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIHNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUlNIICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJTSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIGhhbGYgd29yZCB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgd29yZCBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFN0b3JlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFIgICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIExvYWQgZG91YmxlIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBkb3VibGUgd29yZCB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkQgICRyMCwkcjEsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUkQiLDgsIiRyMCwkcjEiLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSICAgJGEsICRiLCAkY2MKKyAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRikKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMTYgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIxNiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMTYpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAxNiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgwRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAzMiBieXRlcworICAgICAgICBNQUNSTworICAgICAgICBNX0FEUjMyICRhLCAkYiwgJGNjCisgICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8zMikKKyAgICAgICAgCisgICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDMyIGJ5dGVzCisgICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDFGCisgICAgICAgIE1FTkQKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBGdW5jdGlvbiBoZWFkZXIgYW5kIGZvb3RlciBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gSGVhZGVyIE1hY3JvICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZQorICAgICAgICA7Ly8gTm90ZSB0aGF0IGZ1bmN0aW9ucyBzaG91bGQgYWxsIGJlICJzdGFjay1tb3Zlcy1vbmNlIgorICAgICAgICA7Ly8gVGhlIEZOU1RBUlQgYW5kIEZORU5EIG1hY3JvcyBzaG91bGQgYmUgdGhlIG9ubHkgcGxhY2VzCisgICAgICAgIDsvLyB3aGVyZSB0aGUgc3RhY2sgbW92ZXMuCisgICAgICAgIDsvLyAgICAKKyAgICAgICAgOy8vICRuYW1lICA9IGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgOy8vICRycmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImxyIiBzdGFjayAibHIiIG9ubHkKKyAgICAgICAgOy8vICAgICAgICAgICJyTiIgc3RhY2sgcmVnaXN0ZXJzICJyNC1yTixsciIKKyAgICAgICAgOy8vICRkcmVnICA9ICIiICAgZG9uJ3Qgc3RhY2sgYW55IEQgcmVnaXN0ZXJzCisgICAgICAgIDsvLyAgICAgICAgICAiZE4iIHN0YWNrIHJlZ2lzdGVycyAiZDgtZE4iCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTm90ZTogQVJNIEFyY2hpY3R1cmUgcHJvY2VkdXJlIGNhbGwgc3RhbmRhcmQgQUFQQ1MKKyAgICAgICAgOy8vIHN0YXRlcyB0aGF0IHI0LXIxMSwgc3AsIGQ4LWQxNSBtdXN0IGJlIHByZXNlcnZlZCBieQorICAgICAgICA7Ly8gYSBjb21wbGlhbnQgZnVuY3Rpb24uCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RBUlQgJG5hbWUsICRycmVnLCAkZHJlZworICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBBU1NFUlQgIiRuYW1lIiE9IiIKK19JbkZ1bmMgU0VUTCB7VFJVRX0KK19SQnl0ZXMgU0VUQSAwCitfV29ya3NwYWNlIFNFVEEgMAorCisgICAgICAgIDsvLyBDcmVhdGUgYW4gYXJlYSBmb3IgdGhlIGZ1bmN0aW9uICAgICAgICAKKyAgICAgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisgICAgICAgIEVYUE9SVCAgJG5hbWUKKyRuYW1lICAgRlVOQ1RJT04KKyAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIFIgcmVnaXN0ZXJzCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGIF9SUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFNUTUZEICAgc3AhLCB7JF9SUmVnTGlzdCwgbHJ9CisgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIEQgcmVnaXN0ZXJzCisgICAgICAgIF9NX0dFVERSRUdMSVNUICAkZHJlZyAgICAgICAgCisgICAgICAgIElGIF9EUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFZTVE1GRCAgc3AhLCB7JF9EUmVnTGlzdH0KKyAgICAgICAgRU5ESUYgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIEVuc3VyZSBzaXplIGNsYWltZWQgb24gc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKKyAgICAgICAgSUYgKChfU0J5dGVzOkFORDo3KSE9MCkKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgKF9TQnl0ZXMhPTApCisgICAgICAgICAgICBfTV9PUEMgU1VCLCBzcCwgc3AsIF9TQnl0ZXMKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIAorX0FCeXRlcyBTRVRBIF9TQnl0ZXMgKyBfUkJ5dGVzIC0gX1dvcmtzcGFjZQorCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFByaW50IGZ1bmN0aW9uIG5hbWUgaWYgZGVidWcgZW5hYmxlZAorICAgICAgICBNX1BSSU5URiAiJG5hbWVcbiIsCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgUiBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKKyAgICAgICAgSUYgIiRycmVnIj0iIgorX1JSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJHJyZWciPSJsciI6TE9SOiIkcnJlZyI9InI0IgorX1JSZWdMaXN0ICAgU0VUUyAicjQiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjUiOkxPUjoiJHJyZWciPSJyNiIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI2IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyNyI6TE9SOiIkcnJlZyI9InI4IgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjgiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI5IjpMT1I6IiRycmVnIj0icjEwIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEwIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyMTEiOkxPUjoiJHJyZWciPSJyMTIiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCByIHJlZ2lzdGVyIGxpbWl0ICckcnJlZyciCisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBEIHNhdmVkIHJlZ2lzdGVycworICAgICAgICBNQUNSTworICAgICAgICBfTV9HRVREUkVHTElTVCAkZHJlZworICAgICAgICBJRiAiJGRyZWciPSIiCitfRFJlZ0xpc3QgICBTRVRTICIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIElGICIkZHJlZyI9ImQ4IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrOAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDkiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kOSIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDEwIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEwIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTEiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTEiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMiIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDEzIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEzIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQ4CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTQiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTQiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxNSIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNSIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys2NAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIGQgcmVnaXN0ZXIgbGltaXQgJyRkcmVnJyIKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFByb2R1Y2UgZnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9ucworICAgICAgICBNQUNSTworICAgICAgICBfTV9SRVQgJGNjCisgICAgICAgIElGIF9EUmVnTGlzdDw+IiIKKyAgICAgICAgICAgIFZQT1AkY2MgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGCisgICAgICAgIElGIF9SUmVnTGlzdD0iIgorICAgICAgICAgICAgQlgkY2MgbHIKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNJGNjLkZEIHNwISwgeyRfUlJlZ0xpc3QsIHBjfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBFYXJseSBGdW5jdGlvbiBFeGl0IE1hY3JvCisgICAgICAgIDsvLyAkY2MgPSBjb25kaXRpb24gdG8gZXhpdCB3aXRoCisgICAgICAgIDsvLyAoRXhhbXBsZTogTV9FWElUIEVRKQorICAgICAgICBNQUNSTworICAgICAgICBNX0VYSVQgICRjYworICAgICAgICBBU1NFUlQgIF9JbkZ1bmMKKyAgICAgICAgSUYgIF9TQnl0ZXMhPTAKKyAgICAgICAgICAgIDsvLyBSZXN0b3JlIHN0YWNrIGZyYW1lIGFuZCBleGl0CisgICAgICAgICAgICBCJGNjICBfRW5kJF9GCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDsvLyBDYW4gcmV0dXJuIGRpcmVjdGx5CisgICAgICAgICAgICBfTV9SRVQgJGNjCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEZvb3RlciBNYWNybyAgICAgICAgCisgICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVwaWxvZ3VlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fRU5ECisgICAgICAgIEFTU0VSVCBfSW5GdW5jCitfSW5GdW5jIFNFVEwge0ZBTFNFfQorX0VuZCRfRgorCisgICAgICAgIDsvLyBSZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBvbiBmdW5jdGlvbiBlbnRyeQorICAgICAgICBJRiBfU0J5dGVzIT0wCisgICAgICAgICAgICBfTV9PUEMgQURELCBzcCwgc3AsIF9TQnl0ZXMKKyAgICAgICAgRU5ESUYKKyAgICAgICAgX01fUkVUCisgICAgICAgIEVOREZVTkMKKworICAgICAgICA7Ly8gUmVzZXQgdGhlIGdsb2JhbCBzdGFjayB0cmFja2luZyB2YXJpYWJsZXMgYmFjayB0byB0aGVpciAKKyAgICAgICAgOy8vIGluaXRpYWwgdmFsdWVzLCBhbmQgaW5jcmVtZW50IHRoZSBmdW5jdGlvbiBjb3VudAorX1NCeXRlcyAgICAgICAgU0VUQSAwCitfRiAgICAgICAgICAgICBTRVRBIF9GKzEKKyAgICAgICAgTUVORAorCisgICAgICAgICAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIERlYnVnIE1hY3JvcworOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgICBHQkxMICAgIERFQlVHX09OCitERUJVR19PTiBTRVRMICAge0ZBTFNFfQorICAgICAgICBHQkxMICAgIERFQlVHX1NUQUxMU19PTgorREVCVUdfU1RBTExTX09OIFNFVEwge0ZBTFNFfQorICAgICAgICAKKyAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgOy8vIERlYnVnIGNhbGwgdG8gcHJpbnRmCisgICAgICAgIDsvLyAgTV9QUklOVEYgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEV4YW1wbGVzOgorICAgICAgICA7Ly8gIE1fUFJJTlRGICJ4PSUwOHhcbiIsIHIwCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG9mIGFsbCByZWdpc3RlcnMgaW5jbHVkaW5nIHRoZQorICAgICAgICA7Ly8gZmxhZ3MuCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9QUklOVEYgICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgSUYgREVCVUdfT04KKyAgICAgICAgCisgICAgICAgIElNUE9SVCAgcHJpbnRmCisgICAgICAgIExDTEEgICAgbkFyZ3MKK25BcmdzCVNFVEEgICAgMAorICAgICAgICAKKyAgICAgICAgOy8vIHNhdmUgcmVnaXN0ZXJzIHNvIHdlIGRvbid0IGNvcnJ1cHQgdGhlbQorICAgICAgICBTVE1GRCAgIHNwISwge3IwLXIxMiwgbHJ9CisgICAgICAgIAorICAgICAgICA7Ly8gRHJvcCBzdGFjayB0byBnaXZlIHVzIHNvbWUgd29ya3NwYWNlCisgICAgICAgIFNVQiAgICAgc3AsIHNwLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyB3ZSBuZWVkIHRvIHByaW50IHRvIHRoZSBzdGFjaworICAgICAgICBJRiAiJHZhbDIiIDw+ICIiCisgICAgICAgICAgICBBU1NFUlQgIiR2YWwxIiA8PiAiIgorICAgICAgICAgICAgU1RSICAgICR2YWwyLCBbc3AsICM4XQorbkFyZ3MgICAgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwxIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMCIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMSwgW3NwLCAjNF0KK25BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHZhbDAiPD4iIgorICAgICAgICAgICAgU1RSICAgICR2YWwwLCBbc3BdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgd2UgYXJlIHNhZmUgdG8gY29ycnVwdCByZWdpc3RlcnMKKyAgICAgICAgQURSICAgICByMCwgJUZUMDAKKyAgICAgICAgSUYgbkFyZ3M9MQorICAgICAgICAgIExEUiAgIHIxLCBbc3BdCisgICAgICAgIEVORElGCisgICAgICAgIElGIG5BcmdzPTIKKyAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyfQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0zCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMixyM30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBwcmludCB0aGUgdmFsdWVzCisgICAgICAgIE1SUyAgICAgcjQsIGNwc3IgICAgICAgIDsvLyBwcmVzZXJ2ZSBmbGFncworICAgICAgICBCTCAgICAgIHByaW50ZgorICAgICAgICBNU1IgICAgIGNwc3JfZiwgcjQgICAgICA7Ly8gcmVzdG9yZSBmbGFncworICAgICAgICBCICAgICAgICVGVDAxCiswMCAgICAgIDsvLyBzdHJpbmcgdG8gcHJpbnQKKyAgICAgICAgRENCICAgICAiJGZvcm1hdCIsIDAKKyAgICAgICAgQUxJR04KKzAxICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIEFERCAgICAgc3AsIHNwLCAjMTYKKyAgICAgICAgOy8vIFJlc3RvcmUgcmVnaXN0ZXJzCisgICAgICAgIExETUZECXNwISwge3IwLXIxMixscn0KKworICAgICAgICBFTkRJRiAgIDsvLyBERUJVR19PTgorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8gU3RhbGwgU2ltdWxhdGlvbiBNYWNybworICAgICAgICA7Ly8gSW5zZXJ0cyBhIGdpdmVuIG51bWJlciBvZiBOT1BzIGZvciB0aGUgY3VycmVudGx5CisgICAgICAgIDsvLyAgZGVmaW5lZCBwbGF0Zm9ybQorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQUxMICRwbGF0MXN0YWxsLCAkcGxhdDJzdGFsbCwgJHBsYXQzc3RhbGwsICRwbGF0NHN0YWxsLCAkcGxhdDVzdGFsbCwgJHBsYXQ2c3RhbGwKKyAgICAgICAgSUYgREVCVUdfU1RBTExTX09OCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQxc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQyc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQzc3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ0c3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ1c3RhbGwgICAgCisgICAgICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXQ2c3RhbGwgICAgCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdHN0YWxsCisgICAgICAgIElGICIkcGxhdHN0YWxsIiE9IiIKKyAgICAgICAgICAgIExDTEEgX3BsbGVuCisgICAgICAgICAgICBMQ0xTIF9wbAorICAgICAgICAgICAgTENMTCBfcGxsb2cKK19wbGxlbiAgICAgIFNFVEEgOkxFTjoiJHBsYXRzdGFsbCIKK19wbCAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOkxFRlQ6KF9wbGxlbiAtIDIpCisgICAgICAgICAgICBJRiA6REVGOiRfcGwKKyAgICAgICAgICAgICAgICBJRiAkX3BsCisgICAgICAgICAgICAgICAgICAgIExDTFMgX3N0CisgICAgICAgICAgICAgICAgICAgIExDTEEgX3N0bnVtCitfc3QgICAgICAgICAgICAgICAgIFNFVFMgIiRwbGF0c3RhbGwiOlJJR0hUOjEgICAgICAgIAorX3N0bnVtICAgICAgICAgICAgICBTRVRBICRfc3QKKyAgICAgICAgICAgICAgICAgICAgV0hJTEUgX3N0bnVtPjAKKwkJCU1PViBzcCwgc3AKK19zdG51bSAgICAgICAgICAgICAgICAgIFNFVEEgX3N0bnVtIC0gMQorICAgICAgICAgICAgICAgICAgICBXRU5ECisgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7Ly8gRW5kaWFuIEludmFyaWVuY2UgTWFjcm9zCis7Ly8gCis7Ly8gVGhlIGlkZWEgYmVoaW5kIHRoZXNlIG1hY3JvcyBpcyB0aGF0IGlmIGFuIGFycmF5IGlzCis7Ly8gbG9hZGVkIGFzIHdvcmRzIHRoZW4gdGhlIFNNVUwwMCBtYWNybyB3aWxsIG11bHRpcGx5Cis7Ly8gYXJyYXkgZWxlbWVudHMgMCByZWdhcmRsZXNzIG9mIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCis7Ly8gc3lzdGVtLiBGb3IgbGl0dGxlIGVuZGlhbiBTTVVMMDA9U01VTEJCLCBmb3IgYmlnCis7Ly8gZW5kaWFuIFNNVUwwMD1TTVVMVFQgYW5kIHNpbWlsYXJseSBmb3Igb3RoZXIgcGFja2VkIG9wZXJhdGlvbnMuCis7Ly8KKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTQgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgorICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMsICRkCisgICAgICAgIEVMU0UKKyAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBMSUJJMyAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjCisgICAgICAgIEVMU0UKKyAgICAgICAgJGNvbWxpLiRjYyAkYSwgJGIsICRjCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBeHkgbWFjcm9zCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFCMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVQwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01VTHh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDBUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFCICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMVQgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTEIxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxUMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNTEFXeCwgU01VTFd4IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQVcwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFXQiwgU01MQVdULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV1QsIFNNTEFXQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV0IsIFNNVUxXVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxXMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxXVCwgU01VTFdCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBTTUxBTHh5IG1hY3JvcworCisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDBCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMUIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxCMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTFQwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgIEVORElGIDsvLyBBUk1DT01NX1NfSAorICAgICAgICAgICAgCisgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2E2OGQxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1PTVhfUmVsZWFzZVZlcnNpb24uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBUaGlzIGZpbGUgYWxsb3dzIGEgdmVyc2lvbiBvZiB0aGUgT01YIERMIGxpYnJhcmllcyB0byBiZSBidWlsdCB3aGVyZSBzb21lIG9yCisgKiBhbGwgb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBnaXZlbiBhIHVzZXIgc3BlY2lmaWVkIHN1ZmZpeC4gCisgKgorICogWW91IG1pZ2h0IHdhbnQgdG8gdXNlIGl0IHdoZXJlOgorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGEgZnVuY3Rpb24gIm91dCBvZiB0aGUgd2F5IiBzbyB0aGF0IHlvdSBjb3VsZCByZXBsYWNlCisgKiAgIGEgZnVuY3Rpb24gd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uICh0aGUgb3JpZ2luYWwgdmVyc2lvbiB3b3VsZCBzdGlsbCBiZQorICogICBpbiB0aGUgbGlicmFyeSBqdXN0IHdpdGggYSBkaWZmZXJlbnQgbmFtZSAtIHNvIHlvdSBjb3VsZCBkZWJ1ZyB0aGUgbmV3CisgKiAgIHZlcnNpb24gYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBvdXRwdXQgb2YgdGhlIG9sZCkKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhbGwgdGhlIGZ1bmN0aW9ucyB0byB2ZXJzaW9ucyB3aXRoIGEgc3VmZml4IHNvIHRoYXQgCisgKiAgIHlvdSBjYW4gaW5jbHVkZSB0d28gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgYW5kIGNob29zZSBiZXR3ZWVuIGZ1bmN0aW9ucworICogICBhdCBydW50aW1lLgorICoKKyAqICAgICBlLmcuIG9teElQQk1fQ29weV9VOF9DMVIgY291bGQgYmUgcmVuYW1lZCBvbXhJUEJNX0NvcHlfVThfQzFSX0NvcnRleEE4CisgKiAKKyAqLworCisgIAorI2lmbmRlZiBfYXJtT01YX0hfCisjZGVmaW5lIF9hcm1PTVhfSF8KKworCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGVzZSB0d28gbWFjcm9zIGluIG9yZGVyIHRvIGV4cGFuZCBhbmQgY29uY2F0ZW5hdGUgdGhlIG5hbWVzICovCisjZGVmaW5lIE9NWENBVDJCQVIoQSwgQikgb214ICMjIEEgIyMgQgorI2RlZmluZSBPTVhDQVRCQVIoQSwgQikgT01YQ0FUMkJBUihBLCBCKQorCisvKiBEZWZpbmUgdGhlIHN1ZmZpeCB0byBhZGQgdG8gYWxsIGZ1bmN0aW9ucyAtIHRoZSBkZWZhdWx0IGlzIG5vIHN1ZmZpeCAqLworI2RlZmluZSBCQVJFX1NVRkZJWCAKKworCisKKy8qIERlZmluZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGJhcmUgc3VmZml4LWxlc3MgZnVuY3Rpb25zLCBkb3duIHRvIHRoZSBzdWItZG9tYWluIGFjY3VyYWN5ICovCisjZGVmaW5lIE9NWEFDQUFDX1NVRkZJWCAgICBCQVJFX1NVRkZJWCAgIAorI2RlZmluZSBPTVhBQ01QM19TVUZGSVggICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSUNKUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQk1fU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUENTX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBQUF9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFNQX1NVRkZJWCAgICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ0NPTU1fU1VGRklYICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAxMF9TVUZGSVggIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMl9TVUZGSVggICBCQVJFX1NVRkZJWAorCisKKworCisvKiBEZWZpbmUgd2hhdCB0aGUgZWFjaCBiYXJlLCB1bi1zdWZmaXhlZCBPcGVuTUFYIEFQSSBmdW5jdGlvbiBuYW1lcyBpcyB0byBiZSByZW5hbWVkICovCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUNoYW5QYWlyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZURhdFN0ckVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZURhdFN0ckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVGaWxsRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVGaWxsRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUlzU3RlcmVvX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1BOU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVNc1N0ZXJlb19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVQcmdDZmdFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVQcmdDZmdFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlaW50ZXJsZWF2ZVNwZWN0cnVtX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19FbmNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19FbmNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1QcmVkaWN0X1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVJlY29uc3RydWN0X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RGd2RfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RGd2RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX01EQ1RJbnZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX01EQ1RJbnZfUzMyX1MxNiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Ob2lzZWxlc3NEZWNvZGUsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfUXVhbnRJbnZfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfUXVhbnRJbnZfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURJRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURJRkhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRFRTRnJhbWVIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKworCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX0h1ZmZtYW5EZWNvZGVTZmJNYnBfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX01EQ1RJbnZfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX01EQ1RJbnZfUzMyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZVNmYl9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19TeW50aFBRTUZfUzMyX1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19TeW50aFBRTUZfUzMyX1MxNiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tGcmFtZUhlYWRlciwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzggICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTY2FsZUZhY3RvcnNfUzgsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2lkZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2lkZUluZm8sIE9NWEFDTVAzX1NVRkZJWCkKKworI2RlZmluZSBvbXhJQ0pQX0NvcHlFeHBhbmRfVThfQzMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0NvcHlFeHBhbmRfVThfQzMsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUSW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUSW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkVGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9NdWx0aXBsZV9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52VGFibGVJbml0LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuOHg4X0RpcmVjdF9TMTZfVTFfQzEsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjR2V0QnVmU2l6ZV9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNJbml0X1U4LCBPTVhJQ0pQX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUEJNX0FkZENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0FkZENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzNSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NaXJyb3JfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NaXJyb3JfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9NdWxDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9NdWxDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorCisjZGVmaW5lIG9teElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ29sb3JUd2lzdFExNF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjBMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIyTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQ0NExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyUnN6Q3NjUm90QkdSX1U4X1UxNl9DMlIsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I1NjVfVThfVTE2X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSODg4X1U4X0MyQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfQzJQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjg4OF9VOF9DM1IsIE9NWElQQ1NfU1VGRklYKQorCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19Ib3JFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfVmVyRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJGSVJfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJGSVJfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9GaWx0ZXJNZWRpYW5fVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRDZW50cmFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0U3BhdGlhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEdldFN0YXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEdldFN0YXRlU2l6ZSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50SW5pdCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzNSLCBPTVhJUFBQX1NVRkZJWCkKKworI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0NvcHlfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0NvcHlfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0RvdFByb2RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0RvdFByb2RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MxNlMzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ1RvQ19TQzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzJfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2ssIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTE2eDE2LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29weTh4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29weTh4OCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0V4cGFuZEZyYW1lX0ksIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9MaW1pdE1WVG9SZWN0LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzE2eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF84eCwgT01YVkNDT01NX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0F2ZXJhZ2VfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0x1bWFfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkIE9NWENBVEJBUihWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9HZXRWTENJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9HZXRWTENJbmZvLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVHZXRCdWZTaXplLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUluaXQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzE2eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl84eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FURF80eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FURF80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZU1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZU1WLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0ZpbmRNVnByZWQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9JRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9JRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUNSZWNvbkJsb2NrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVHZXRCdWZTaXplLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTUVJbml0LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRlcl9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfUXVhbnRJbnZJbnRyYV9JLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKworCisjZW5kaWYgLyogX2FybU9NWF9oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMjk1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qKgorICogRmlsZTogb214dHlwZXMuaAorICogQnJpZWY6IERlZmluZXMgYmFzaWMgRGF0YSB0eXBlcyB1c2VkIGluIE9wZW5NQVggdjEuMC4yIGhlYWRlciBmaWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisgIAorI2lmbmRlZiBfT01YVFlQRVNfSF8KKyNkZWZpbmUgX09NWFRZUEVTX0hfCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gCisKKyNkZWZpbmUgT01YX0lOCisjZGVmaW5lIE9NWF9PVVQKKyNkZWZpbmUgT01YX0lOT1VUCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICAKKyAgICAvKiBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAqLworICAgIE9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgID0gIDAsICAgIC8qIE5vIGVycm9yLCB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworICAgIE9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgID0gLTIsICAgIC8qIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgKi8gICAgCisgICAgT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgPSAtMTgyLCAgLyogSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgKi8gICAgCisgICAgT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgPSAtOSwgICAgLyogTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uICovCisgICAgT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgPSAtMTU5LCAgLyogQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAqLworICAgIE9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgID0gLTE2NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgKi8KKyAgICBPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICA9IC0xNjMsICAvKiBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICovICAgICAKKyAgICBPTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICA9IC0xNjIsICAvKiBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAqLyAgICAKKwlPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICA9IC0xNjAsICAvKiBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yICovCisKKyAgICAvKiBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uKi8KKyAgICBPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICA9IC01LCAgICAvKiBCYWQgQXJndW1lbnRzICovCisKKyAgICBPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICA9IC0xNTcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgID0gLTE1NiwgIC8qIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgKi8gICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICA9IC0xNTUsICAvKiBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICA9IC0xNTQsICAvKiBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLworICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgID0gLTE1MywgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8gICAgICAgICAgICAgICAgICAKKyAgICBPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICA9IC0xNTIsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICovICAKKworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgID0gLTE4MywgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAqLworICAgIE9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgID0gLTE4MSwgIC8qIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgPSAtMTcsICAgLyogQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uICovCisKKyAgICBPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICA9IC0xODAsICAvKiBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgKi8KKworICAgIE9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgID0gSU5UX01BWCAgLypQbGFjZWhvbGRlciwgZm9yY2VzIGVudW0gb2Ygc2l6ZSBPTVhfSU5UKi8KKyAgICAKKyB9IE9NWFJlc3VsdDsgICAgICAgICAgLyoqIFJldHVybiB2YWx1ZSBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24uIElkZW50aWNhbCB0byBPTVhfSU5UICovCisKKyAKKy8qIE9NWF9VOCAqLworI2lmIFVDSEFSX01BWCA9PSAweGZmCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OworI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTggdW5kZWZpbmVkCisjZW5kaWYgCisKKyAKKy8qIE9NWF9TOCAqLworI2lmIFNDSEFSX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7CisjZWxpZiBTSFJUX01BWCA9PSAweDdmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCisjZWxzZQorI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKKyNlbmRpZgorIAorIAorLyogT01YX1UxNiAqLworI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7CisjZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MxNiAqLworI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OworI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTMyICovCisjaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzMyICovCisjaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKKyNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKKyAgICB0eXBlZGVmIF9faW50NjQgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMGk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKKyNlbHNlCisgICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCisjZW5kaWYKKworCisvKiBPTVhfU0M4ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MxNiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzMyICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDNjQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfRjMyICovCit0eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0Y2NCAqLwordHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfSU5UICovCit0eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCisKKworI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQorI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKKyNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKKyNkZWZpbmUgT01YX01JTl9VMTYJCQkwCisjZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAorCisjZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQorI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKKyNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCisjZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKKyNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKKyNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKKwordHlwZWRlZiB2b2lkIE9NWFZvaWQ7CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICgodm9pZCopMCkKKyNlbmRpZgorCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKKyAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgorICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCisgICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLworCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KK31PTVhSZWN0OworCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLworIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLworCQorfSBPTVhQb2ludDsKKworCisvKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLworIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLworCQorfSBPTVhTaXplOworCisjZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NzAzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApAQCAtMCwwICsxLDc3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXh0eXBlc19zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKK09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCitPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAorT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCitPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKK09NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKK09NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKK09NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCitPTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCisKKzsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCitPTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCisKK09NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCitPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCitPTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKKworT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCitPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCisKK09NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAorCitPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgorCisKKworT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQorT01YX01JTl9VOCAgCUVRVSAgICAgCTAKK09NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKK09NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCisKKworT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKK09NWF9NSU5fVTMyCQlFUVUJMAorCitPTVhfTUFYX1M4CQlFUVUJKDEyNykKK09NWF9NQVhfVTgJCUVRVQkoMjU1KQorT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCitPTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCitPTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQorT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKKworT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCitPTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCitPTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKKworTlVMTCAgICBFUVUgMAorCis7Ly8gU3RydWN0dXJlcworCisgICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKKworICAgIE1fU1RSVUNUICAgIE9NWFBvaW50CisgICAgTV9GSUVMRCAgICAgeCwgNAorICAgIE1fRklFTEQgICAgIHksIDQKKyAgICBNX0VORFNUUlVDVAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0OWU3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwKQEAgLTAsMCArMSwxMTMgQEAKKyMhL3Vzci9iaW4vcGVybAorIworIyAKKyMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKKyMgT3Blbk1BWCBETDogdjEuMC4yCisjIFJldmlzaW9uOiAgIDEyMjkwCisjIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorIyAKKyMgKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIAorIyAKKyMKKyMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgorIworCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBzdHJpY3Q7CisKK215ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7CisKKyRDQyAgICAgICA9ICdhcm1jYyc7CiskQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCAtYyc7CiskQVMgICAgICAgPSAnYXJtYXNtJzsKKyRBU19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQ29ydGV4LUE4JzsKKyMgJExJQiAgICAgID0gJ2FybWxpbmsnOworIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKKyMgJExJQl9UWVBFID0gJy5vJzsKKyRMSUIgICAgICA9ICdhcm1hcic7CiskTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOworJExJQl9UWVBFID0gJy5hJzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgorQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7CitAZmlsZWxpc3QgPSA8RklMRVM+OworY2xvc2UoRklMRVMpOworCisjIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKK2ZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQoreworICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Cit9CisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKKworIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQorbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOworbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOworCiskb2JqbGlzdCA9ICcnOworCisjIENvbXBpbGUgZWFjaCBmaWxlCitmb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCit7CisJbXkgJGY7CisJbXkgJGJhc2U7CisJbXkgJGV4dDsKKwlteSAkb2JqZmlsZTsKKworCWNob21wKCRmaWxlKTsKKwkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7CisKKwkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOworICAgICRmPX5zL1tcblxmXHJdLy9nOyAjIFJlbW92ZSBhbnkgZW5kLW9mLWxpbmUgY2hhcmFjdGVycworCisJaWYoKCRiYXNlLCAkZXh0KSA9ICRmID1+IC8oLispXC4oXHcpJC8pCisJeworCQkkb2JqZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ29iaicsICRiYXNlLicubycpOworCisJCWlmKCRleHQgZXEgJ2MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJENDLicgJy4kQ0NfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2lmKCRleHQgZXEgJ3MnKQorCQl7CisJCQkkb2JqbGlzdCAuPSAiJG9iamZpbGUgIjsKKwkJCSRjb21tYW5kID0gJEFTLicgJy4kQVNfT1BUUy4nICcuJGhkLicgLW8gJy4kb2JqZmlsZS4nICcuJGZpbGU7CisJCQlwcmludCAiJGNvbW1hbmRcbiI7CisJCQlzeXN0ZW0oJGNvbW1hbmQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnQgIklnbm9yaW5nIGZpbGU6ICRmXG4iOworCQl9CisJfQorCWVsc2UKKwl7CisJCWRpZSAiTm8gZmlsZSBleHRlbnNpb24gZm91bmQ6ICRmXG4iOworCX0KK30KKworIyBEbyB0aGUgZmluYWwgbGluayBzdGFnZSB0byBjcmVhdGUgdGhlIGxpYnJhcmllcy4KKyRsaWJmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnbGliJywgJ29teFZDJy4kTElCX1RZUEUpOworJGNvbW1hbmQgPSAkTElCLicgJy4kTElCX09QVFMuJyAnLiRsaWJmaWxlLicgJy4kb2JqbGlzdDsKK3ByaW50ICIkY29tbWFuZFxuIjsKKyhzeXN0ZW0oJGNvbW1hbmQpID09IDApIGFuZCBwcmludCAiQnVpbGQgc3VjY2Vzc2Z1bFxuIjsKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRiOGVlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQKQEAgLTAsMCArMSw3NSBAQAorLi9hcGkvYXJtQ09NTS5oCisuL2FwaS9hcm1DT01NX0JpdERlY19zLmgKKy4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKy4vYXBpL2FybUNPTU1fSURDVF9zLmgKKy4vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKKy4vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKy4vYXBpL2FybUNPTU1fcy5oCisuL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKy4vYXBpL29teHR5cGVzLmgKKy4vYXBpL29teHR5cGVzX3MuaAorLi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworLi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworLi92Yy9hcGkvYXJtVkMuaAorLi92Yy9hcGkvYXJtVkNDT01NX3MuaAorLi92Yy9hcGkvb214VkMuaAorLi92Yy9hcGkvb214VkNfcy5oCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKy4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTcyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgVmFsdWUgKz0gMC41OworICAgICAgICAKKyAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAwLjU7CisKKyAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0CisgKgorICovCisKK09NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0CisgKgorICovCisKK09NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQoreworICAgIFZhbHVlICs9IDAuNTsKKyAgICAKKyAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAorICoKKyAqLworCitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBpZiAoVmFsdWUgPiAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisKK09NWF9JTlQgYXJtU2lnbkNoZWNrICgKKyAgICBPTVhfUzE2IHZhcgorKQorCit7CisgICAgT01YX0lOVCBTaWduOworICAgIAorICAgIGlmICh2YXIgPCAwKQorICAgIHsKKyAgICAgICAgU2lnbiA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICggdmFyID4gMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTaWduID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFNpZ247Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXAKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybUNsaXAgKAorICAgIE9NWF9JTlQgbWluLAorICAgIE9NWF9JTlQgbWF4LCAKKyAgICBPTVhfUzMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgT01YX0YzMiBtaW4sCisgICAgT01YX0YzMiBtYXgsIAorICAgIE9NWF9GMzIgc3JjIAorKQorIAoreworICAgIGlmIChzcmMgPiBtYXgpCisgICAgeworICAgICAgICBzcmMgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKKyAgICB7CisgICAgICAgIHNyYyA9IG1pbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNyYzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKK3sKKyAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOworICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOworICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKKyAgICBPTVhfVTMyIHZJbnQ7CisgICAgT01YX1UzMiB2SW50U2F0OworICAgIAorICAgIGlmKHYgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7CisgICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOworICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKKyAgICB2SW50U2F0ID0gdkludDsKKyAgICBpZih2SW50U2F0ID4gbWF4VikgCisgICAgICAgIHZJbnRTYXQgPSBtYXhWOworICAgIHJldHVybiB2SW50U2F0OworfQorCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgorICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgorICovCitPTVhSZXN1bHQgYXJtU3dhcEVsZW0oCisgICAgICAgIE9NWF9VOCAqcEJ1ZjEsCisgICAgICAgIE9NWF9VOCAqcEJ1ZjIsCisgICAgICAgIE9NWF9JTlQgZWxlbVNpemUKKyAgICAgICApCit7CisgICAgT01YX0lOVCBpOworICAgIE9NWF9VOCB0ZW1wOworICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKKyAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOworICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycworICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKKyAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKKyAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtTWVkaWFuT2YzICgKKyAgICBPTVhfUzMyIGZFbnRyeSwKKyAgICBPTVhfUzMyIHNFbnRyeSwgCisgICAgT01YX1MzMiB0RW50cnkgCispCit7CisgICAgT01YX1MzMiBhLCBiLCBjOworICAgIAorICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKKyAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7CisgICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKKyAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgorICovIAorIAorT01YX1U4IGFybUxvZ1NpemUgKAorICAgIE9NWF9VMTYgdmFsdWUgCispCit7CisgICAgT01YX1U4IGk7ICAgIAorICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCisgICAgeworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKKyAgICB7CisgICAgICAgIC8qU2FtZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKK3sKKyAgICBPTVhfUzY0IFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKyAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICAKK30KKworLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKKyAqIAorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKKworICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQorICAgIHsKKyAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KKyAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCisgICAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCit7CisgICAgT01YX1MzMiBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOworICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOworCisgICAgcmV0dXJuIFJlc3VsdDsgICAgCit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKK3sKKyAgICAKKyAgICBPTVhfUzMyIHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAorCisgICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKKyAgICB9CisgICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKKyAgICB9CisKKyAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOworICAgIAorICAgIHJldHVybiBtYWM7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgorICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCit7CisgICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKKworICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OworICAgIH0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICogICAgIAorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKK3sKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgaWYgKFNoaWZ0IDwgMCkKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OworICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7CisgICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTIsbG8xOworICAgIE9NWF9VMTYgbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7CisgICAgT01YX1MzMiByZXN1bHQ7CisgICAgCisgICAgbG8xICA9IGlucHV0MTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSBoaTIgKiBsbzE7CisgICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7CisKKyAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKK3sKKyAgICBPTVhfUzE2IGhpMSxoaTI7CisgICAgT01YX1UxNiBsbzEsbG8yOworICAgIAorICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7CisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7CisgICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOworCisgICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOworICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKKyAgICAKKyAgICB0ZW1wMSA9ICAgaGkxICogaGkyOworICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OworICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7CisgICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQoreworICAgIE9NWF9GNjQgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKKyAgICAKKyAgICBpZiAocmVzdWx0ID49IDApCisgICAgeworICAgICAgICByZXN1bHQgKz0gMC41OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgLT0gMC41OworICAgIH0KKworICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllZjkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIGJpdHN0cmVhbSBlbmNvZGUgYW5kIGRlY29kZSBmdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBjb2RlY3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pCit7CisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAKKyAgICBpZihOID09IDApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKKworICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOworICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7CisKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7CisKKyAgICAvKiBSZXR1cm4gTiBiaXRzICovCisgICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCkKK3sKKyAgICBpZigqcE9mZnNldCA+IDApCisgICAgeworICAgICAgICAqcHBCaXRTdHJlYW0gKz0gMTsKKyAgICAgICAgKnBPZmZzZXQgPSAwOworICAgIH0gICAgCit9CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTikKK3sKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgIAorICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCisgICAgT2Zmc2V0ICs9IE47CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOworICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCisgKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKKyAqIHBvaW50ZWQgYnkgcENvZGVCb29rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiBBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAtMSBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisjaWZuZGVmIENfT1BUSU1JWkVEX0lNUExFTUVOVEFUSU9OIAorCitPTVhfVTE2IGFybVVuUGFja1ZMQzMyKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBPZmZzZXQsCisgICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKKykKK3sgICAgCisgICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICBPTVhfSU5UIEluZGV4OworICAgICAgICAKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogU2VhcmNoIHRocm91Z2ggdGhlIGNvZGVib29rICovICAgIAorICAgIGZvciAoSW5kZXg9MDsgcENvZGVCb29rLT5jb2RlTGVuICE9IDA7IEluZGV4KyspCisgICAgeworICAgICAgICBpZiAocENvZGVCb29rLT5jb2RlV29yZCA9PSAoVmFsdWUgPj4gKDMyIC0gcENvZGVCb29rLT5jb2RlTGVuKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCAgICAgICA9IE9mZnNldCArIHBDb2RlQm9vay0+Y29kZUxlbjsKKyAgICAgICAgICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0ID4+IDMpIDsKKyAgICAgICAgICAgICpwT2Zmc2V0ICAgICA9IE9mZnNldCAmIDc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBJbmRleDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHBDb2RlQm9vaysrOworICAgIH0KKworICAgIC8qIE5vIGNvZGUgbWF0Y2ggZm91bmQgKi8KKyAgICByZXR1cm4gQVJNX05PX0NPREVCT09LX0lOREVYOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0gcE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0gY29kZVdvcmQgICAgICAgIENvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dIGNvZGVMZW5ndGggICAgICBMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKykKK3sKKyAgICBPTVhfVTggICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOworICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7CisgICAgT01YX1UzMiBWYWx1ZTsKKyAgICAgICAgCisgICAgLyogY2hlY2tpbmcgYXJndW1lbnQgdmFsaWRpdHkgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPCAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0ID4gNywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPCAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA+IDMyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQcmVwYXJlIHRoZSBmaXJzdCBieXRlICovCisgICAgY29kZVdvcmQgPSBjb2RlV29yZCA8PCAoMzItY29kZUxlbmd0aCk7CisgICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA+PiAoOC1PZmZzZXQpKSA8PCAoOC1PZmZzZXQpOworICAgIFZhbHVlID0gVmFsdWUgfCAoY29kZVdvcmQgPj4gKDI0K09mZnNldCkpOworCisgICAgLyogV3JpdGUgb3V0IHdob2xlIGJ5dGVzICovCisgICAgd2hpbGUgKDgtT2Zmc2V0IDw9IGNvZGVMZW5ndGgpCisgICAgeworICAgICAgICAqcEJpdFN0cmVhbSsrID0gKE9NWF9VOClWYWx1ZTsKKyAgICAgICAgY29kZVdvcmQgICA9IGNvZGVXb3JkICA8PCAoOC1PZmZzZXQpOworICAgICAgICBjb2RlTGVuZ3RoID0gY29kZUxlbmd0aCAtICg4LU9mZnNldCk7CisgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIFZhbHVlID0gY29kZVdvcmQgPj4gMjQ7CisgICAgfQorCisgICAgLyogV3JpdGUgb3V0IGZpbmFsIHBhcnRpYWwgYnl0ZSAqLworICAgICpwQml0U3RyZWFtICA9IChPTVhfVTgpVmFsdWU7CisgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCArIGNvZGVMZW5ndGg7CisgICAgCisgICAgcmV0dXJuICBPTVhfU3RzX05vRXJyOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKykKK3sKKyAgICByZXR1cm4gKGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBjb2RlLmNvZGVXb3JkLCBjb2RlLmNvZGVMZW4pKTsKK30KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Y1ZTI3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpAQCAtMCwwICsxLDYwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NX0lEQ1RUYWJsZS5jCisgKiBCcmllZjogRGVmaW5lcyBUYWJsZXMgdXNlZCBpbiBJRENUIGNvbXB1dGF0aW9uCisgKgorICovCisKKyNpbmNsdWRlICJhcm1DT01NX0lEQ1RUYWJsZS5oIgorCisgICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKKyAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1CisgICAgICAqICBzKDYpPTIuMAorICAgICAgKiAgcyg3KT00LjAKKyAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKKyAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQorCSAgKi8KKwkgIAorX19hbGlnbig0KSBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF0gPQoreworICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAorICAgIDB4NThjNSwgMHg3YjIxLCAweDczZmMsIDB4Njg2MiwgMHg1OGM1LCAweDQ1YmYsIDB4NjAxNiwgMHg2MWY4LAorICAgIDB4NTM5ZiwgMHg3M2ZjLCAweDZkNDEsIDB4NjI1NCwgMHg1MzlmLCAweDQxYjMsIDB4NWE4MiwgMHg1YzQ4LAorICAgIDB4NGI0MiwgMHg2ODYyLCAweDYyNTQsIDB4NTg3ZSwgMHg0YjQyLCAweDNiMjEsIDB4NTE3NSwgMHg1MzBkLAorICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAorICAgIDB4MzI0OSwgMHg0NWJmLCAweDQxYjMsIDB4M2IyMSwgMHgzMjQ5LCAweDI3ODIsIDB4MzY2ZCwgMHgzNzdlLAorICAgIDB4MjJhMywgMHgzMDBiLCAweDJkNDEsIDB4MjhiYSwgMHgyMmEzLCAweDFiMzcsIDB4MjU3ZSwgMHgyNjNhLAorICAgIDB4MTFhOCwgMHgxODdlLCAweDE3MTIsIDB4MTRjMywgMHgxMWE4LCAweDBkZTAsIDB4MTMxZCwgMHgxMzdkICAgIAorfTsKKyAgICAvKiBBYm92ZSBhcnJheSBhcm1DT01NX0lEQ1RQcmVTY2FsZSwgIGluIFEyMyBmb3JtYXQgKi8KK2NvbnN0IE9NWF9VMzIgYXJtQ09NTV9JRENUUHJlU2NhbGVVMzIgWzY0XSA9Cit7CisgICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAorICAgIDB4NThjNTQzLCAweDdiMjBkOCwgMHg3M2ZiZmMsIDB4Njg2MjE0LCAweDU4YzU0MywgMHg0NWJmMWYsIDB4NjAxNWE1LCAweDYxZjc4YiwKKyAgICAweDUzOWViYSwgMHg3M2ZiZmMsIDB4NmQ0MTNkLCAweDYyNTNhNiwgMHg1MzllYmEsIDB4NDFiMzI4LCAweDVhODI3YSwgMHg1YzQ4NjksCisgICAgMHg0YjQxOGMsIDB4Njg2MjE0LCAweDYyNTNhNiwgMHg1ODdkZTMsIDB4NGI0MThjLCAweDNiMjBkOCwgMHg1MTc0ZTAsIDB4NTMwZDY5LAorICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDMyNDhkNCwgMHg0NWJmMWYsIDB4NDFiMzI4LCAweDNiMjBkOCwgMHgzMjQ4ZDQsIDB4Mjc4MjFkLCAweDM2NmQ3MiwgMHgzNzdlNmIsCisgICAgMHgyMmEyZjUsIDB4MzAwYWQzLCAweDJkNDEzZCwgMHgyOGJhNzAsIDB4MjJhMmY1LCAweDFiMzZiOSwgMHgyNTdkODYsIDB4MjYzOThkLAorICAgIDB4MTFhODU2LCAweDE4N2RlMywgMHgxNzEyMWEsIDB4MTRjMzVhLCAweDExYTg1NiwgMHgwZGRmOWIsIDB4MTMxY2M3LCAweDEzN2NhMgorfTsKKyAgIAorY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XSA9Cit7CisgICAgMHg1YTgyLCAvKiBJbnZTcXJ0MiAqLworICAgIDB4MzBmYywgLyogU2luUElCeTggKi8KKyAgICAweDc2NDIsIC8qIENvc1BJQnk4ICovCisgICAgMHgwMDAwICAgIAorfTsKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOWY4OGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkuCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyNkZWZpbmUgTWFza1RhYmxlU2l6ZSA3MgorCitjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdID0gCit7CisgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiAgICAKK307CisKK2NvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdID0gCit7CisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGICAgIAorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNWI1MTBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oCkBAIC0wLDAgKzEsMTE1MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtVmlkZW8uaAorICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCisgKgorICovCisKKworI2lmbmRlZiBfYXJtVmlkZW9fSF8KKyNkZWZpbmUgX2FybVZpZGVvX0hfCisKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgorICovCisgCitzdHJ1Y3QgbTRwMl9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Cit9OworCitzdHJ1Y3QgbTRwMTBfTUVTcGVjCit7CisgICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKK3R5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKKyAqIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKKyAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLAorICAgIE9NWF9TMTYgbXZZLAorICAgIE9NWF9JTlQgY2FuZFNBRCwKKyAgICBPTVhfUzE2IGJlc3RNVlgsCisgICAgT01YX1MxNiBiZXN0TVZZLAorICAgIE9NWF9JTlQgYmVzdFNBRCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCisgICAgIE9NWF9VOCBmbGFnLAorICAgICBPTVhfSU5UICpwU3VtRXJyCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KKyAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIE9NWF9VOCBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCisgICAgIE9NWF9VOCAgc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCisgKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAorICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAorICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCisgKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKKyAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAorICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAorICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKKyAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisgICAgT01YX1UzMiBzdG9yZVJ1biwKKyAgICBPTVhfUzE2ICogcERzdCwKKyAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCisgICAgT01YX1U4ICBzaWduLAorICAgIE9NWF9VOCAgbGFzdCwKKyAgICBPTVhfVTggICogaW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKKyAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKKworT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIAorICogUmV0dXJuIFZhbHVlOgorICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKKyAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAorICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCisgKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCisgKgorICovCisKK09NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICBPTVhfVTMyIHJ1biwKKyAgICAgT01YX1UzMiBydW5QbHVzLAorICAgICBPTVhfUzE2IGxldmVsLAorICAgICBPTVhfUzE2IGxldmVsUGx1cywKKyAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKKyAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKKyk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCisgKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCisgKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCisgKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAorICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKKyAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCisgKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQorICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAorICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCisgKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jaworICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCisgICAgIE9NWF9VOCAqIHBUcmFuc3AKKyk7CisKKy8qIAorICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAorICovCisvKiBEZWZpbmVzICovCisjZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQorCisKKy8qIERlcXVhbnQgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKKworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgblRhYmxlLAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucworICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCisJCU9NWF9VMzIgCWlTcmNTdGVwLCAKKwkJT01YX1U4KiAJcERzdCwgCisJCU9NWF9VMzIgCWlEc3RTdGVwLCAKKwkJT01YX1UzMiAJaVdpZHRoLCAKKwkJT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCisJIGNvbnN0IE9NWF9VOCogCXBTcmMsIAorCSBPTVhfVTMyIAlpU3JjU3RlcCwgCisgCSBPTVhfVTgqIAlwRHN0LAorIAkgT01YX1UzMiAJaURzdFN0ZXAsIAorIAkgT01YX1UzMiAJaVdpZHRoLCAKKyAJIE9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAorICAgICAgICBPTVhfVTggICAgICAqcFNyYywKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgICAgICBPTVhfVTMyICAgICBkeCwKKyAgICAgICAgT01YX1UzMiAgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAorICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKKyAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCisgKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAorICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAorICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKKyAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAorICAgICBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiAqcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX1MxNiogcERDLAorICAgICBpbnQgQUMKKyk7CisKKyNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyYTAxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmgKQEAgLTAsMCArMSw3MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggQUMgaGVhZGVyIGZpbGUKKzsvLyAKKzsvLyBGb3JtdWxhIHVzZWQ6Cis7Ly8gTUFDUk8gZm9yIGNhbGN1bGF0aW5nIG1lZGlhbiBmb3IgdGhyZWUgdmFsdWVzLgorCisKKworICAgIElGIDpMTk9UOjpERUY6QVJNVkNDT01NX1NfSAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgTV9WQVJJQU5UUyAgICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTggCisgICAgIAorICAgICA7Ly8vKgorICAgICA7Ly8gKiBNYWNybzogTV9NRURJQU4zCisgICAgIDsvLyAqCisgICAgIDsvLyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAgICAgOy8vICogCisgICAgIDsvLyAqIFJlbWFya3M6CisgICAgIDsvLyAqCisgICAgIDsvLyAqIFBhcmFtZXRlcnM6CisgICAgIDsvLyAqIFtpbl0geCAgICAgRmlyc3QgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCisgICAgIDsvLyAqIFtpbl0geSAgICAgU2Vjb25kIGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIG1heSBiZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZgorICAgICA7Ly8gKiAgICAgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KKyAgICAgOy8vICogW2luXSB6ICAgICBUaGlyZCBlbnRyeSBvZiB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mIHRoZSAKKyAgICAgOy8vICogICAgICAgICAgICBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KKyAgICAgOy8vICogW2luXSB0ICAgICBUZW1wb3Jhcnkgc2NyYXRjaCAgcmVnaXN0ZXIuCisgICAgIDsvLyAqIFtvdXRdeiAgICAgTWVkaWFuIG9mIHRoZSB0aHJlZSBudW1iZXJzLiAgICAgICAKKyAgICAgOy8vICovCisgICAgIAorICAgICBNQUNSTworCisgICAgIE1fTUVESUFOMyAkeCwgJHksICR6LCAkdCAKKyAgICAgCisgICAgIFNVQlMgICR0LCAkeSwgJHo7IC8vIGlmICh5IDwgeikKKyAgICAgQURETFQgJHosICR6LCAkdDsgLy8gIHN3YXAgeSBhbmQgegorICAgICBTVUJMVCAkeSwgJHksICR0OworCisgICAgIDsvLyBOb3cgeicgPD0geScsIHNvIHRoZXJlIGFyZSB0aHJlZSBjYXNlcyBmb3IgdGhlCisgICAgIDsvLyBtZWRpYW4gdmFsdWUsIGRlcGVuZGluZyBvbiB4LgorCisgICAgIDsvLyAxKSB4IDw9IHonICAgICAgPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB6JworICAgICA7Ly8gMikgICAgICB6JyA8PSB4IDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeAorICAgICA7Ly8gMykgICAgICB6JyAgICAgIDw9IHknIDw9IHggOiBtZWRpYW4gdmFsdWUgaXMgeScKKworICAgICBDTVAgICAkeiwgJHg7ICAgICAvLyBpZiAoIHggPiBtaW4oeSx6KSApCisgICAgIE1PVkxUICR6LCAkeDsgICAgIC8vIGFucyA9IHggCisKKyAgICAgQ01QICAgJHgsICR5OyAgICAgLy8gaWYgKCB4ID4gbWF4KHkseikgKQorICAgICBNT1ZHVCAkeiwgJHk7ICAgICAvLyBhbnMgPSBtYXgoeSx6KQorICAgICAKKyAgICAgTUVORAorICAgIEVORElGICAgICAgCisgICAgCisgICAgCisgICAgICAgIAorICAgIEVORElGIDsvLyBBUk1BQ0NPTU1fU19ICisKKyBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2IzY2M3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaApAQCAtMCwwICsxLDQzODEgQEAKKy8qKgorICogRmlsZTogb214VkMuaAorICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAqCisgKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKKyAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCisgKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCisgKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAorICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAorICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAorICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCisgKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKKyAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAorICoKKyAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAorICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCisgKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKKyAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKKyAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAorICogbWF0ZXJpYWxzLgorICogCisgKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKgorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9PTVhWQ19IXworI2RlZmluZSBfT01YVkNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLworLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMTYgZHg7CisgICAgT01YX1MxNiBkeTsKK30gT01YVkNNb3Rpb25WZWN0b3I7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAorICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAorICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKKyAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAwLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKKyAgICBPTVhfVTggKnBEc3RQcmVkLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKKyAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKKyAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAorICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCisgKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCisgKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCisgKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKKyAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAorICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKKyAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKKyAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKKyAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCisgKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAorICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAorICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCisgICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCisgICAgT01YX1UzMiBpRXhwYW5kUGVscywKKyAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAorICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCisgKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKKyAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCisgKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCisgKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCisgKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAorICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAorICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCisgKiAgICAgICAgICAgIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKKyAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAorICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCisgICAgT01YX0lOVCBYY29vcmQsCisgICAgT01YX0lOVCBZY29vcmQsCisgICAgT01YX0lOVCBzaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBPTVhfVTMyIGlTdGVwT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfVTMyIGlTdGVwUmVmLAorICAgIE9NWF9TMzIqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KKy8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCisgICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAorICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKK307CisKKworCisvKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCisvKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCisKK2VudW0geworICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAorfTsKKworCisKKy8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCisvKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0NFTlRFUiA9IDQsCisgICAgT01YX1ZDX1JJR0hUID0gOCwKKyAgICBPTVhfVkNfTE9XRVIgPSAxNiwKKyAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KKyAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCisgICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAorfTsKKworCisKKy8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KKyAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAorfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKKworCisKKy8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCisvKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHg7CisgICAgT01YX0lOVCB5OworfSBPTVhWQ000UDJDb29yZGluYXRlOworCisKKworLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMk1FTW9kZTsKKworCisKKy8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KKy8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAorICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KKyAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KKyAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KKyAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLworfSBPTVhWQ000UDJNRVBhcmFtczsKKworCisKKy8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KKyAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KKyAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLworICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KKyAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCisgKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAorICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCisgKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKKyAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAorICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKKyAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKKyAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKKyAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCisgKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKKyAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKKyAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCisgKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCisgKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAorICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCisgICAgT01YX0lOVCBpQmxrCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICBPTVhfVTMyICpwU2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCisgKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAorICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKKyAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKKyAqICAgICAgICAgICAgLTQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAorICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKKyAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAorICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKKyAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAorICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAorICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKKyAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKKyAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKKyAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKKyAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICBPTVhfSU5UIHJuZFZhbCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCisgKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKKyAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAorICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAorICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKKyAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAorICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCisgKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCisgKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCisgKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCisgKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAorICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCisgKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAorICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAorICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCisgKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKKyAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKKyAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCisgKiAgICAgICAgICAgIGlnbm9yZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKKyAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCisgKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCisgKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCisgKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAorICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCisgKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAorICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAorICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTE2ICpwRHN0U0FELAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKKyAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCisgKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCisgKiAgICAgICAgICAgIDYuMS4zLjguIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAorICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAorICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKKyAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKKyAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCisgKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKKyAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAorICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCisgKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAorICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCisgKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCisgKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCisgKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCisgKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCisgKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAorICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKKyAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAorICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCisgKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCisgKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAorICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCisgKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAorICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCisgKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCisgKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAorICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKKyAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAorICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCisgKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAorICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCisgKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKKyAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAorICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbiAKKyAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAorICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKKyAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKKyAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKKyAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCisgKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICBwU3JjLCBwUmVjLiAgCisgKgorICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggKnBSZWMsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKKyAgICBPTVhfSU5UICpwU3VtRXJyLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfVTggY3VyUXAsCisgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKKyAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCisgKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKKyAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgICAgIC0gcFNyYyAKKyAqICAgICAgICAgICAgLSBwRHN0CisgKiAgICAgICAgICAgIC0gcFJlYworICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfUzE2ICpwUmVjLAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAorICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKKyAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKKyAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKKyAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX1U4IHBhdHRlcm4sCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCisgKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCisgKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKKyAqICAgICAgICAgICAgZW5jb2RlZCAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAorICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKKyAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKKyAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKKyAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCisgKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCisgKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCisgKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCisgKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCisgKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKKyAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCisgKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCisgKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAorICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAorICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAorICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCisgKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKKyAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCisgKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKKyAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKKyAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKKyAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgc3ludGF4IAorICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAorICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAorICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCisgKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybworICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gCisgKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAorICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWY6CisgKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCisgKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKKyAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKKyAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCisgKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKKyAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKKyAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAorICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCisgKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKKyAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKKyAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAorICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKKyAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKKyAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCisgKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKKyAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKKyAqCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCisgKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAorICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCisgKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKKyAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCisgKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKKyAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKKyAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCisgKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQorICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAorICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBzdGVwLAorICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgIE9NWF9VOCBjdXJRUCwKKyAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKKyAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAorICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCisgKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCisgKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKKyAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgUVAgPD0gMC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCisgKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCisgKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAorICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCisgKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAorICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKKyAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCisgKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKKyAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAorICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAorICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCisgKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAorICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAorICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KKyAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCisgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgT01YX0lOVCBjdXJRUCwKKyAgICBPTVhfSU5UIHByZWRRUCwKKyAgICBPTVhfSU5UIHByZWREaXIsCisgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAorICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAorICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAorICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAorICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAorICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAorICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAorICogICAgICAgICAgICA2LjIuMS4yLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCisgKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAorICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKKyAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAorICAgIE9NWF9JTlQgcm5kVmFsCispOworCisKKworLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCisgICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAorfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOworCisKKworLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KKyAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KKyAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KKyAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKK30gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7CisKKworCisvKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KKyAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7CisKKworCisvKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCit9IE9NWFZDTTRQMTBNRU1vZGU7CisKKworCisvKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLworICAgIE9NWF9WQ19QXzE2eDggID0gMSwKKyAgICBPTVhfVkNfUF84eDE2ICA9IDIsCisgICAgT01YX1ZDX1BfOHg4ICA9IDMsCisgICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAorICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCisgICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAorICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAorICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKK30gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKKyAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKKyAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKK30gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOworCisKKworLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLworICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCisgICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCisgICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCisgICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCit9IE9NWFZDTTRQMTBWTENJbmZvOworCisKKworLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCisgICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLworICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCisgICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KKyAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCisgICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLworICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLworICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KK30gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7CisKKworCisvKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCisgICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOworICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OworICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Cit9IE9NWFZDTTRQMTBNRVBhcmFtczsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCisgKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCisgKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAorICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAorICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCisgKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKKyAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCisgKiAgICAgICAgICAgIDAuLjE1KSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAorICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKKyAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqIE5vdGU6IAorICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAorICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKiBOb3RlOiAKKyAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAorICogICAgICAgICAgICAwLi43KS4gCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKKyAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAorICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCisgKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCisgKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKKyAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAorICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoIAorICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX1MzMiBkc3RTdGVwLAorICAgIE9NWF9TMzIgZHgsCisgICAgT01YX1MzMiBkeSwKKyAgICBPTVhTaXplIHJvaQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKKyAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICByb2kud2lkdGguIAorICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgorICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCisgKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAorICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAorICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKKyAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAorICogICAgICAgICAgICAgIGlzIE5VTEwuIAorICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCisgKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKKyAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCisgKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAorICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCisgKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAorICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKKyAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKKyAqIG1hY3JvYmxvY2sgKDh4OCkuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCisgKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKKyAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCisgKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCisgKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAorICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAorICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMThdLiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKKyAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDI1NV0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKKyAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCisgICAgT01YX1U4ICpwU3JjRHN0LAorICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKKyAgICBjb25zdCBPTVhfVTggKnBCZXRhLAorICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAorICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAorICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKKyAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAorICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAorICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAorICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCisgKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCisgKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIqcE9mZnNldCwKKyAgICBPTVhfVTggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAorICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAorICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAorICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAorICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCisgKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAorICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKKyAqICAgICAgICAgICAgYmxvY2sgCisgKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAorICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCisgKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCisgKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAorICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAorICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCisgKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAorICoKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9TMzIgKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAorICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKKyAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKKyAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCisgKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKKyAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAorICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKKyAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKKyAqIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAorICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAorICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKKyAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAorICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCisgKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCisgKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKKyAqIDEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKKyAqICAgICAgICAgICAgZXhpc3QgCisgKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKKyAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKKyAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAorICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKKyAgICBjb25zdCBPTVhfUzE2ICpwREMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgcHJlZFN0ZXAsCisgICAgT01YX0lOVCBkc3RTdGVwLAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKKyAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAorICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAorICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAorICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAorICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCisgKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAorICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCisgKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAorICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKKyAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKKyAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAorICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCisgKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAorICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKKyAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKKyAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKKyAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTggaUJsb2NrV2lkdGgsCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKKyAgICB2b2lkICpwTUVTcGVjCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAorICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKKyAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAorICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKKyAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6CisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCisgKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCisgKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKKyAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKKyAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKKyAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAorICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAorICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCisgKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCisgICAgT01YX1MzMiAqcEJlc3RDb3N0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCisgKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCisgKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKKyAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKKyAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAorICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5URVIuIAorICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCisgKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAorICogICAgICAgICAgICBJTlRSQS4gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKKyAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAorICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCisgKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKKyAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKKyAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKKyAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAorICogICAgICAgICAgICAtICBNYlR5cGUgCisgKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKKyAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAorICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCisgKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKKyAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAorICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCisgICAgT01YX1MzMiBTcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKKyAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICBPTVhfVTMyIExhbWJkYSwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfSU5UICpwRHN0Q29zdCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCisgKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKKyAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1UzMiBpUmVmU3RlcDAsCisgICAgT01YX1UzMiBpUmVmU3RlcDEsCisgICAgT01YX1UzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAorICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAorICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfVTMyICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAorICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAorICogICAgICAgICAgICAoLTEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAorICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdExlZnQsCisgICAgT01YX1U4ICpwRHN0UmlnaHQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlXaWR0aCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAorICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAorICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAorICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCisgKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCisgKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RVcCwKKyAgICBPTVhfVTggKnBEc3REb3duLAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCisgKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKKyAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCisgKiB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAorICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1UzMiBpUVAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCisgKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCisgKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAorICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBtYXRyaXguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKKyAgICBPTVhfVTggKnBEc3RSZWNvbiwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCisgICAgT01YX1U4IGJBQworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCisgKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCisgKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCisgKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAorICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCisgKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIDQuIAorICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKKyAqICAgICAgICAgICAgb2YgNC4gCisgKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCisgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKKyAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCisgKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKKyAqICAgICAgICAgICAgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAKKyAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKKyAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKKyAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCisgICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKKyAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKKyAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAorICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAorICAgIE9NWF9TOCAqcE51bUNvZWZmLAorICAgIE9NWF9VMzIgblRocmVzaFNBRCwKKyAgICBPTVhfVTMyIGlRUCwKKyAgICBPTVhfVTggYkludHJhCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCisgKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCisgKiBzdHJ1Y3R1cmUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCisgKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCisgKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCisgKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAorICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCisgKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCisgKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCisgKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKKyAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAorICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCisgKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAorICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCisgKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCisgICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKKyAgICBPTVhfVTggYkFDLAorICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKKyAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbworKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCisKKy8qKiBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44OWYzMDQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKQEAgLTAsMCArMSwxMjkgQEAKKzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworOy8qKiA9PT09PT09PT09PT09PT0gU3RydWN0dXJlIERlZmluaXRpb24gZm9yIFNhbXBsZSBHZW5lcmF0aW9uID09PT09PT09PT09PT09ICovCis7LyoqIHRyYW5zcGFyZW50IHN0YXR1cyAqLworCis7ZW51bSB7CitPTVhfVklERU9fVFJBTlNQQVJFTlQJRVFVIDA7CS8qKiBXaG9sbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19QQVJUSUFMCQlFUVUgMTsJLyoqIFBhcnRpYWxseSB0cmFuc3BhcmVudCAqLworT01YX1ZJREVPX09QQVFVRQkJRVFVIDI7CS8qKiBPcGFxdWUgKi8KKzt9CisKKzsvKiogZGlyZWN0aW9uICovCis7ZW51bSB7CitPTVhfVklERU9fTk9ORQkJCUVRVSAwOworT01YX1ZJREVPX0hPUklaT05UQUwJRVFVIDE7CitPTVhfVklERU9fVkVSVElDQUwJCUVRVSAyOworO30KKworOy8qKiBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUgKi8KKztlbnVtIHsKK09NWF9WSURFT19JTlRFR0VSX1BJWEVMIEVRVSAwOwkvKiogY2FzZSBhICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YICBFUVUgMTsJLyoqIGNhc2UgYiAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWSAgRVFVIDI7CS8qKiBjYXNlIGMgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1hZIEVRVSAzOwkvKiogY2FzZSBkICovCis7fQorCis7ZW51bSB7CitPTVhfVVBQRVIgIAkJCQlFUVUgMTsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTEVGVCAgIAkJCQlFUVUgMjsJCS8qKiBzZXQgaWYgdGhlIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9DRU5URVIgCQkJCUVRVSA0OworT01YX1JJR0hUCQkJCUVRVSA4OworT01YX0xPV0VSICAJCQkJRVFVCTE2OworT01YX1VQUEVSX0xFRlQgIAkJRVFVIDMyOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX1VQUEVSX1JJR0hUIAkJRVFVIDY0OwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9MT1dFUl9MRUZUICAJCUVRVSAxMjg7CitPTVhfTE9XRVJfUklHSFQgCQlFUVUgMjU2Cis7fQorCis7ZW51bSB7CitPTVhfVklERU9fTFVNSU5BTkNFICAJRVFVIDA7CS8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCitPTVhfVklERU9fQ0hST01JTkFOQ0UgIAlFUVUgMTsJLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0FMUEhBICAJCUVRVSAyOwkvKiogQWxwaGEgY29tcG9uZW50ICovCis7fQorCis7ZW51bSB7CitPTVhfVklERU9fSU5URVIJCQlFUVUgMDsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSX1EJCUVRVSAxOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0VgkJRVFVIDI7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQQkJCUVRVSAzOwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KK09NWF9WSURFT19JTlRSQV9RCQlFUVUgNDsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5URVI0Vl9RCQlFUVUgNTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK09NWF9WSURFT19ESVJFQ1QJCUVRVSA2OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QIChNUEVHLTQgb25seSkgKi8KK09NWF9WSURFT19JTlRFUlBPTEFURQlFUVUgNzsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0JBQ0tXQVJECQlFUVUgODsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX0ZPUldBUkQJCUVRVSA5OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCitPTVhfVklERU9fTk9UQ09ERUQJCUVRVSAxMDsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworO30KKworO2VudW0geworT01YXzE2WDE2X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X0RDIAkJCUVRVSAyOwkJLyoqIEludHJhXzE2eDE2X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhXzE2eDE2X1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfNHg0X1ZFUlQgCQkJRVFVIDA7CQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0hPUiAgCQkJRVFVIDE7CQkvKiogSW50cmFfNHg0X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfREMgICAJCQlFUVUgMjsJCS8qKiBJbnRyYV80eDRfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19ETCAJCUVRVSAzOwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9ESUFHX0RSIAkJRVFVIDQ7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9WUiAJCQkJRVFVIDU7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IRCAJCQkJRVFVIDY7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVkwgCQkJCUVRVSA3OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IVSAJCQkJRVFVIDg7CQkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7ZW51bSB7CitPTVhfQ0hST01BX0RDIAkJCUVRVSAwOwkJLyoqIEludHJhX0Nocm9tYV9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9IT1IgCQkJRVFVIDE7CQkvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfVkVSVCAJCUVRVSAyOwkvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KKzt9CisKKzt0eXBlZGVmCXN0cnVjdCB7CQoreAlFUVUJMDsKK3kJRVFVCTQ7Cis7fU9NWENvb3JkaW5hdGU7CisKKzt0eXBlZGVmIHN0cnVjdCB7CitkeAlFUVUJMDsKK2R5CUVRVQkyOworO31PTVhNb3Rpb25WZWN0b3I7CisKKzt0eXBlZGVmIHN0cnVjdCB7Cit4eAkJRVFVCTA7Cit5eQkJRVFVCTQ7Cit3aWR0aAlFUVUJODsKK2hlaWdodAlFUVUJMTI7Cis7fU9NWGlSZWN0OworCis7dHlwZWRlZiBlbnVtIHsKK09NWF9WQ19JTlRFUiAgICAgICAgIEVRVSAwOyAgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVEVSX1EgICAgICAgRVFVIDE7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWICAgICAgIEVRVSAyOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5UUkEgICAgICAgICBFUVUgMzsgICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVFJBX1EgICAgICAgRVFVIDQ7ICAgICAgIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworT01YX1ZDX0lOVEVSNFZfUSAgICAgRVFVIDU7ICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCis7fSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKKworO2VudW0geworT01YX1ZDX05PTkUgICAgICAgICAgRVFVIDAKK09NWF9WQ19IT1JJWk9OVEFMICAgIEVRVSAxCitPTVhfVkNfVkVSVElDQUwgICAgICBFUVUgMiAKKzt9OworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NmQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKQEAgLTAsMCArMSw5NSBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5MTZ4MTYKKyA7ICoKKyA7ICogRGVzY3JpcHRpb246CisgOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorIDsgKiBQYXJhbWV0ZXJzOgorIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeS4KKyA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7CisgOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDE2LgorIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgorIDsgKiBSZXR1cm4gVmFsdWU6CisgOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKKyA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gIAorIDsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIAorICAgICAKKyAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorIDsvL0lucHV0IEFyZ3VtZW50cworcFNyYyAgICBSTiAwICAgICAgICAKK3BEc3QgICAgUk4gMSAgICAgICAgCitzdGVwICAgIFJOIDIKKworOy8vTG9jYWwgVmFyaWFibGVzCitSZXR1cm4gIFJOIDAKKzsvLyBOZW9uIFJlZ2lzdGVycworCitYMCAgICAgIEROIEQwLlM4IAorWDEgICAgICBETiBEMS5TOCAKK1gyICAgICAgRE4gRDIuUzgKK1gzICAgICAgRE4gRDMuUzgKK1g0ICAgICAgRE4gRDQuUzgKK1g1ICAgICAgRE4gRDUuUzgKK1g2ICAgICAgRE4gRDYuUzgKK1g3ICAgICAgRE4gRDcuUzggCisgCisgICAgIE1fU1RBUlQgb214VkNDT01NX0NvcHkxNngxNgorICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcCAgICAgICA7Ly8gTG9hZCAxNiBieXRlcyBmcm9tIDE2IGJ5dGUgYWxpZ25lZCBwU3JjIGFuZCBwU3JjPXBTcmMgKyBzdGVwIGFmdGVyIGxvYWRpbmcKKyAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEgICAgIDsvLyBTdG9yZSAzMiBieXRlcyB0byAxNiBieXRlIGFsaWduZWQgcERzdCAgIAorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKKyAgICAgICAgIAorICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICAgICAgICAgICAKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdIQorCisgICAgICAgIAorICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKworICAgICAKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisKKworCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjllNWVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwpAQCAtMCwwICsxLDcwIEBACisgOy8qKgorIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHk4eDgKKyA7ICoKKyA7ICogRGVzY3JpcHRpb246CisgOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7CisgOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gOC4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKyA7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmMgICAgUk4gMCAgICAgICAgCitwRHN0ICAgIFJOIDEgICAgICAgIAorc3RlcCAgICBSTiAyCisKKzsvL0xvY2FsIFZhcmlhYmxlcworQ291bnQgICBSTiAzCitSZXR1cm4gIFJOIDAKKzsvLyBOZW9uIFJlZ2lzdGVycworCitYMCAgICAgIEROIEQwLlM4IAorWDEgICAgICBETiBEMS5TOAorWDIgICAgICBETiBEMi5TOAorWDMgICAgICBETiBEMy5TOAorICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5OHg4CisgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwICAgICAgICAgICAgOy8vIExvYWQgOCBieXRlcyBmcm9tIDggYnl0ZSBhbGlnbmVkIHBTcmMsIHBTcmM9cFNyYytzdGVwIGFmdGVyIGxvYWQKKyAgICAgICAgVkxEMSAge1gxfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDJ9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYM30sW3BTcmNdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMX0sW3BEc3RdISAgICAgICAgICAgIDsvLyBTdG9yZSAxNiBieXRlcyB0byA4IGJ5dGUgYWxpZ25lZCBwRHN0ICAKKyAgICAgICAgVlNUMSAge1gyLFgzfSxbcERzdF0hICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMH0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gxfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDJ9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYM30sW3BTcmNdLHN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMCxYMX0sW3BEc3RdISAgICAgICAgICAgICAgCisgICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisKKworCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM1YjdkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKQEAgLTAsMCArMSwyMzYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgRXhwYW5kIEZyYW1lIGJvdW5kYXJ5IHBpeGVscyBpbnRvIFBsYW5lCis7Ly8gCis7Ly8gCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSxyMTEKKworOy8vSW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3RQbGFuZSAgICBSTiAgMAoraUZyYW1lV2lkdGggICAgIFJOICAxCitpRnJhbWVIZWlnaHQgICAgUk4gIDIgICAgCitpRXhwYW5kUGVscyAgICAgUk4gIDMKK2lQbGFuZVN0ZXAgICAgICBSTiAgNAorcFRvcCAgICAgICAgICAgIFJOICA1CitwQm90ICAgICAgICAgICAgUk4gIDYKK3BEc3RUb3AgICAgICAgICBSTiAgNworcERzdEJvdCAgICAgICAgIFJOICA4CitwTGVmdCAgICAgICAgICAgUk4gIDUKK3BSaWdodCAgICAgICAgICBSTiAgNgorcERzdExlZnQgICAgICAgIFJOICA5CitwRHN0UmlnaHQgICAgICAgUk4gIDEwCitPZmZzZXQgICAgICAgICAgUk4gIDExCitUZW1wICAgICAgICAgICAgUk4gIDE0CitDb3VudGVyICAgICAgICAgUk4gIDEyCitUbXAgICAgICAgICAgICAgUk4gIDcKKzsvL091dHB1dCByZWdpc3RlcnMKKworcmVzdWx0ICAgICAgICAgIFJOICAwCis7Ly8gTmVvbiByZWdpc3RlcnMKK3FEYXRhMCAgICAgICAgICBRTiAgMC5VOAorcURhdGExICAgICAgICAgIFFOICAxLlU4CitkRGF0YTAgICAgICAgICAgRE4gIDAuVTgKK2REYXRhMSAgICAgICAgICBETiAgMS5VOAorZERhdGEyICAgICAgICAgIEROICAyLlU4CitkRGF0YTMgICAgICAgICAgRE4gIDMuVTgKKworICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICAgICBwUGxhbmVTdGVwLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICAgICBpUGxhbmVTdGVwLCBwUGxhbmVTdGVwCisgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwVG9wLCBwU3JjRHN0UGxhbmUsICMwICAgICAgICAgICAgICA7Ly8gVG9wIHJvdyBwb2ludGVyIG9mIHRoZSBmcmFtZQorICAgICAgICBNVUwgICAgICAgICBPZmZzZXQsIGlFeHBhbmRQZWxzLCBpUGxhbmVTdGVwICAgICA7Ly8gRSpTdGVwICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgVGVtcCwgaUZyYW1lSGVpZ2h0LCAjMSAgICAgICAgICAgICAgOy8vIEgtMQorICAgICAgICBNVUwgICAgICAgICBUZW1wLCBpUGxhbmVTdGVwLCBUZW1wICAgICAgICAgICAgICA7Ly8gKEgtMSkqU3RlcAorICAgICAgICBBREQgICAgICAgICBwQm90LCBUZW1wLCBwU3JjRHN0UGxhbmUgICAgICAgICAgICA7Ly8gQlB0ciA9IFRQdHIgKyAoSC0xKSpTdGVwCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlGcmFtZVdpZHRoICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBsb29wIGNvdW50ZXIKKyAgICAgICAgCisgICAgICAgIDsvLyBDaGVjayBpZiBwU3JjRHN0UGxhbmUgYW5kIGlQbGFuZVN0ZXAgYXJlIDE2IGJ5dGUgYWxpZ25lZAorICAgICAgICBUU1QgICAgICAgICBwU3JjRHN0UGxhbmUsICMweGYKKyAgICAgICAgVFNURVEgICAgICAgaVBsYW5lU3RlcCwgIzB4ZiAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgIEhvcjhMb29wMDAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29weSB0b3AgYW5kIGJvdHRvbSByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIHRvcCByZWdpb24gPSB0b3Agcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLyBib3R0b20gcmVnaW9uID0gbGFzdCByb3cgZWxlbWVudHMgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCisKKyAgICAgICAgOy8vIENhc2UgZm9yIDE2IGJ5dGUgYWxpZ25tZW50CitIb3IxNkxvb3AwMAorICAgICAgICBTVUIgICAgICAgICBwRHN0VG9wLCBwVG9wLCBPZmZzZXQKKyAgICAgICAgVkxEMSAgICAgICAgcURhdGEwLCBbcFRvcCBAMTI4XSEKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgorICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDEyOF0hCitWZXIxNkxvb3AwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXIxNkxvb3AwCisKKyAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzE2CisgICAgICAgIEJHVCAgICAgICAgIEhvcjE2TG9vcDAwCisgICAgICAgIEIgICAgICAgICAgIEVuZEFsaWduZWRMb29wCisgICAgICAgIAorICAgICAgICA7Ly8gQ2FzZSBmb3IgOCBieXRlIGFsaWdubWVudAorSG9yOExvb3AwMAorICAgICAgICBTVUIgICAgICAgICBwRHN0VG9wLCBwVG9wLCBPZmZzZXQKKyAgICAgICAgVkxEMSAgICAgICAgcURhdGEwLCBbcFRvcCBANjRdIQorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscyAgICAgICAgICAgICAgICA7Ly8gSW5uZXIgbG9vcCBjb3VudGVyCisgICAgICAgIEFERCAgICAgICAgIHBEc3RCb3QsIHBCb3QsIGlQbGFuZVN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgcURhdGExLCBbcEJvdCBANjRdIQorVmVyOExvb3AwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcCAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIFZlcjhMb29wMAorCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgorICAgICAgICBCR1QgICAgICAgICBIb3I4TG9vcDAwCisKK0VuZEFsaWduZWRMb29wCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmNEc3RQbGFuZSwgaUZyYW1lV2lkdGgKKyAgICAgICAgU1VCICAgICAgICAgcERzdFJpZ2h0LCBUZW1wLCBPZmZzZXQKKyAgICAgICAgU1VCICAgICAgICAgcFJpZ2h0LCBUZW1wLCAjMQorICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcFNyY0RzdFBsYW5lLCBPZmZzZXQgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgaUV4cGFuZFBlbHMgICAgCisgICAgICAgIEFERCAgICAgICAgIHBMZWZ0LCBwU3JjRHN0UGxhbmUsICMwCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcCAgICAgICAgOy8vIFRvcC1MZWZ0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGEwCisgICAgICAgIFNVQiAgICAgICAgIE9mZnNldCwgaVBsYW5lU3RlcCwgaUV4cGFuZFBlbHMKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMSBbXX0sIFtwUmlnaHRdLCBpUGxhbmVTdGVwICAgICAgIDsvLyBUb3AtUmlnaHQgY29ybmVyIHBpeGVsIGZyb20gZnJhbWUgZHVwbGljYXRlZCBpbiBkRGF0YTEKKyAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUV4cGFuZFBlbHMKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgdG9wLWxlZnQgYW5kIHRvcC1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIHRvcC1sZWZ0IHJlZ2lvbiA9IHRvcC1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gdG9wLXJpZ2h0IHJlZ2lvbiA9IHRvcC1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCitIb3JMb29wMTEKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKK1Zlckxvb3AxCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMQorCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0CisgICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKKyAgICAgICAgQlBMICAgICAgICAgSG9yTG9vcDExCisKKyAgICAgICAgU1VCICAgICAgICAgaUZyYW1lSGVpZ2h0LCBpRnJhbWVIZWlnaHQsICMxCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29weSBsZWZ0IGFuZCByaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIExlZnQgcmVnaW9uID0gY29weSB0aGUgcm93IHdpdGggbGVmdCBzdGFydCBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gUmlnaHQgcmVnaW9uID0gY29weSB0aGUgcm93IHdpdGggcmlnaHQgZW5kIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworSG9yTG9vcDIyCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTAgW119LCBbcExlZnRdLCBpUGxhbmVTdGVwCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcAorVmVyTG9vcDIKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAorICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AyCisKKyAgICAgICAgU1VCUyAgICAgICAgaUZyYW1lSGVpZ2h0LCBpRnJhbWVIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0CisgICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKKyAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29weSBib3R0b20tbGVmdCBhbmQgYm90dG9tLXJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cworICAgICAgICA7Ly8gYm90dG9tLWxlZnQgcmVnaW9uID0gYm90dG9tLWxlZnQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLyBib3R0b20tcmlnaHQgcmVnaW9uID0gYm90dG9tLXJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KK0hvckxvb3AzMworICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscworVmVyTG9vcDMKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAorICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAorICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AzCisKKyAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzEKKyAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKKyAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAorICAgICAgICBCR1QgICAgICAgICBIb3JMb29wMzMKK0VuZAorICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIE1fRU5EICAgIAorICAgIAorICAgIEVORElGCisKKworCisgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDdhMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogSGVhZGVyIGZpbGUgZm9yIG9wdGltaXplZCBILjI2NCBDQUxWQyB0YWJsZXMKKyAqIAorICovCisgCisjaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyAgCisvKiBDQVZMQyB0YWJsZXMgKi8KKworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XTsKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdOworZXh0ZXJuIGNvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN107CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGYwODkyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwyMjIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKzsvLyBGdW5jdGlvbnM6Cis7Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAorOy8vCis7Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgorOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCis7Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCis7Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwUHJlZDAgICAgICAgICAgUk4gMAoraVByZWRTdGVwMCAgICAgIFJOIDEKK3BQcmVkMSAgICAgICAgICBSTiAyCitpUHJlZFN0ZXAxICAgICAgUk4gMworcERzdFByZWQgICAgICAgIFJOIDIKK2lEc3RTdGVwICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lQcmVkQTAgICAgICAgICBSTiAxMAoraVByZWRBMSAgICAgICAgIFJOIDExCitpUHJlZEIwICAgICAgICAgUk4gMTIKK2lQcmVkQjEgICAgICAgICBSTiAxNAorVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitSZXN1bHRBICAgICAgICAgUk4gNQorUmVzdWx0QiAgICAgICAgIFJOIDQKK3IweDgwODA4MDgwICAgICBSTiA3CisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4CisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMAorICAgICAgICBNX0VORAorCisgICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCisgICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCisKKyAgICAgICAgOy8vIDFzdCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2CisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQyCisgICAgICAgIE1fRU5ECisKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gMm5kIGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4CisKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDMKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzc0OTVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogT3B0aW1pemVkIENBVkxDIHRhYmxlcyBmb3IgSC4yNjQKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKKworLyogNHg0IERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdID0KK3sKKyAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Cit9OworCisvKiAyeDIgRGVaaWdaYWcgdGFibGUgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XSA9Cit7CisgICAgMCwgMSwgMiwgMworfTsKKworCisvKgorICogU3VmZml4IFRvIExldmVsIHRhYmxlCisgKiBXZSBpbmNyZW1lbnQgdGhlIHN1ZmZpeCBsZW5ndGggaWYgCisgKiAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2CisgKiAoTGV2ZWxDb2RlPj4xKT49KDM8PChTdWZmaXhMZW5ndGgtMSkpICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKiAgTGV2ZWxDb2RlICAgID49IDM8PFN1ZmZpeExlbmd0aCAgICAgICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKiAoTGV2ZWxDb2RlKzIpID49ICgzPDxTdWZmaXhMZW5ndGgpKzIgICAgICYmIFN1ZmZpeExlbmd0aDw2CisgKi8KK2NvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN10gPQoreworICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLworICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLworICAgICgzPDwyKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MiAqLworICAgICgzPDwzKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MyAqLworICAgICgzPDw0KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NCAqLworICAgICgzPDw1KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NSAqLworICAgIC0xICAgICAgICAgICAgICAvKiBTdWZmaXhMZW5ndGg9NiAtIG5ldmVyIGluY3JlbWVudCAqLworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMFsxMzJdID0geworICAgIDB4MDAyMCwgMHgwMTAwLCAweDIwMTUsIDB4MjAxNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAorICAgIDB4MDAyOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDMwLCAweDAwZDgsIDB4MDBlMCwgMHgwMGU4LAorICAgIDB4MDAzOCwgMHgwMGEwLCAweDAwYzgsIDB4MDBkMCwgMHgwMDQwLCAweDAwNjgsIDB4MDA5MCwgMHgwMDk4LAorICAgIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgyN2ZmLCAweDI3ZmYsIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA4MSwgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDg3LCAweDAwN2QsIDB4MDA3YiwgMHgwMDcxLAorICAgIDB4MDA3ZiwgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAorICAgIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLAorICAgIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwgMHgyMDViLCAweDIwNWIsIDB4MjA1OSwgMHgyMDU5LAorICAgIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA1MSwgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQ5LAorICAgIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgyMDQxLCAweDIwNDEsIDB4MjA0ZCwgMHgyMDRkLAorICAgIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LAorICAgIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLAorICAgIDB4MjAzMywgMHgyMDMzLCAweDIwMjksIDB4MjAyOSwgMHgwMDQ3LCAweDAwMzUsIDB4MDAyYiwgMHgwMDIxLAorICAgIDB4MjAzZiwgMHgyMDNmLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAxOSwgMHgyMDE5LAorICAgIDB4MDAzNywgMHgwMDI1LCAweDAwMWIsIDB4MDAxMSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxZCwgMHgyMDFkLAorICAgIDB4MDAxMywgMHgwMDA5LCAweDIwMWYsIDB4MjAxZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMVsxMjhdID0geworICAgIDB4MDAyMCwgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMWYsIDB4MjAxNSwgMHgyMDE1LAorICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMGQwLCAweDAwZDgsIDB4MDBlMCwgMHgwMDMwLCAweDAwOTgsIDB4MDBjMCwgMHgwMGM4LAorICAgIDB4MDAzOCwgMHgwMDYwLCAweDAwODgsIDB4MDA5MCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwN2YsIDB4MjA3ZiwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDgxLAorICAgIDB4MDA3YiwgMHgwMDc5LCAweDAwN2QsIDB4MDA3MywgMHgyMDc1LCAweDIwNzUsIDB4MjA3MSwgMHgyMDcxLAorICAgIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2YiwgMHgyMDZiLCAweDIwNjksIDB4MjA2OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwgMHgwMDU5LCAweDAwNWQsIDB4MDA1YiwgMHgwMDUxLAorICAgIDB4MDA2NywgMHgwMDU1LCAweDAwNTMsIDB4MDA0OSwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LAorICAgIDB4MjA1ZiwgMHgyMDVmLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDRiLCAweDIwNGIsIDB4MjA0MSwgMHgyMDQxLAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LAorICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MDAyOSwgMHgwMDM1LCAweDAwMzMsIDB4MDAyMSwgMHgyMDQ3LCAweDIwNDcsIDB4MjAyZCwgMHgyMDJkLAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMTksIDB4MjAxOSwgMHgwMDNmLCAweDAwMjUsIDB4MDAyMywgMHgwMDExLAorICAgIDB4MDAzNywgMHgwMDFkLCAweDAwMWIsIDB4MDAwOSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yWzExMl0gPSB7CisgICAgMHgwMDIwLCAweDAwODgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDNmLCAweDAwMzcsIDB4MDAyZiwgMHgwMDI3LCAweDAwMWYsIDB4MDAxNSwgMHgwMDBiLCAweDAwMDEsCisgICAgMHgwMDI4LCAweDAwNTAsIDB4MDA3OCwgMHgwMDgwLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsCisgICAgMHgwN2ZmLCAweDAwODEsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDdmLCAweDAwN2QsCisgICAgMHgwMDdiLCAweDAwNzEsIDB4MDA3NywgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgyMDZiLCAweDIwNmIsCisgICAgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDIwNjEsIDB4MjA2MSwgMHgyMDZkLCAweDIwNmQsCisgICAgMHgyMDYzLCAweDIwNjMsIDB4MjA1OSwgMHgyMDU5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCisgICAgMHgyMDViLCAweDIwNWIsIDB4MjA1MSwgMHgyMDUxLCAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNDksCisgICAgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQxLCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsCisgICAgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDI5LCAweDIwMjksCisgICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwMDE5LCAweDAwM2QsIDB4MDAzYiwgMHgwMDExLCAweDAwNGYsIDB4MDAzNSwgMHgwMDMzLCAweDAwMDksCisgICAgMHgyMDJiLCAweDIwMmIsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDI1LCAweDIwMjUsCisgICAgMHgyMDFiLCAweDIwMWIsIDB4MjA0NywgMHgyMDQ3LCAweDIwMWQsIDB4MjAxZCwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzNbODBdID0geworICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAorICAgIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsIDB4MDA5MCwgMHgwMDk4LAorICAgIDB4MDAwOSwgMHgwMDBiLCAweDA3ZmYsIDB4MDAwMSwgMHgwMDExLCAweDAwMTMsIDB4MDAxNSwgMHgwN2ZmLAorICAgIDB4MDAxOSwgMHgwMDFiLCAweDAwMWQsIDB4MDAxZiwgMHgwMDIxLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LAorICAgIDB4MDAyOSwgMHgwMDJiLCAweDAwMmQsIDB4MDAyZiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzNSwgMHgwMDM3LAorICAgIDB4MDAzOSwgMHgwMDNiLCAweDAwM2QsIDB4MDAzZiwgMHgwMDQxLCAweDAwNDMsIDB4MDA0NSwgMHgwMDQ3LAorICAgIDB4MDA0OSwgMHgwMDRiLCAweDAwNGQsIDB4MDA0ZiwgMHgwMDUxLCAweDAwNTMsIDB4MDA1NSwgMHgwMDU3LAorICAgIDB4MDA1OSwgMHgwMDViLCAweDAwNWQsIDB4MDA1ZiwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY3LAorICAgIDB4MDA2OSwgMHgwMDZiLCAweDAwNmQsIDB4MDA2ZiwgMHgwMDcxLCAweDAwNzMsIDB4MDA3NSwgMHgwMDc3LAorICAgIDB4MDA3OSwgMHgwMDdiLCAweDAwN2QsIDB4MDA3ZiwgMHgwMDgxLCAweDAwODMsIDB4MDA4NSwgMHgwMDg3Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180WzMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDAzOCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwKKyAgICAweDAwMjgsIDB4MDAzMCwgMHgwMDIxLCAweDAwMTksIDB4MjAyNywgMHgyMDI3LCAweDAwMjUsIDB4MDAyMywKKyAgICAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsIDB4MDAxMSwgMHgwMDFmLCAweDAwMTMsIDB4MDAwOQorfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0wICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0zICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTUgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz02ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTggKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz05ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEyICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE1ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180ICAvKiBuQz0tMSAqLworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wWzQwXSA9IHsKKyAgICAweDAwMjAsIDB4MDA0OCwgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDA0MCwgMHgwMDExLCAweDAwMGYsIDB4MDAzMCwgMHgwMDM4LCAweDAwMTksIDB4MDAxNywKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDFmLCAweDIwMWYsIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwKKyAgICAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGYsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDAwMWQsIDB4MDAxYiwgMHgwMDE5LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGIsIDB4MDAwOSwgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDAwMWIsIDB4MDAxNywgMHgyMDE5LCAweDIwMTksIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zWzI0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDEzLCAweDAwMGYsIDB4MDAwNywgMHgwMDA1LCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDMsIDB4MjAwMywKKyAgICAweDIwMTksIDB4MjAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAxNSwgMHgwMDExLCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywKKyAgICAweDIwMTcsIDB4MjAxNywgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNVsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTEsIDB4MjAxMywgMHgyMDEzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsCisgICAgMHgwMDE1LCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzZbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDBmLCAweDIwMTEsIDB4MjAxMSwgMHgyMDBkLCAweDIwMGQsIDB4MjAwOSwgMHgyMDA5LAorICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4MDAxMywgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwKKyAgICAweDAwMTEsIDB4MDAwMSwgMHgyMDA1LCAweDIwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDUsIDB4MjAwYiwgMHgyMDBiLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzlbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDBkLCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMFsxNl0gPSB7CisgICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDcsIDB4MjAwNywgMHgyMDBiLCAweDIwMGIsCisgICAgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDkKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTFbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDksIDB4MjAwOSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyWzE2XSA9IHsKKyAgICAweDIwMDEsIDB4MjAwMSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xM1sxNl0gPSB7CisgICAgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTRbMTZdID0geworICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAorICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzCit9OworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzIsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzUsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzgsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTAsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTMsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNAorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMFsxNl0gPSB7CisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzFbMTZdID0geworICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yWzE2XSA9IHsKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzAsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzBbOF0gPSB7CisgICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMVs4XSA9IHsKKyAgICAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yWzhdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzNbOF0gPSB7CisgICAgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNFs4XSA9IHsKKyAgICAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181WzhdID0geworICAgIDB4MDAwMywgMHgwMDA1LCAweDAwMDksIDB4MDAwNywgMHgwMDBkLCAweDAwMGIsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzZbMjRdID0geworICAgIDB4MDAxMCwgMHgwMDBkLCAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLAorICAgIDB4MDAxOCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwgMHgwMDIwLCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLAorICAgIDB4MDAyOCwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNywgMHgwN2ZmLCAweDAwMWQsIDB4MjAxYiwgMHgyMDFiCit9OworCisvKiBUYWJsZXMgNyB0byAxNCBhcmUgZHVwbGljYXRlcyBvZiB0YWJsZSA2ICovCisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzAsICAvKiBaZXJvc0xlZnQ9MSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMSwKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzIsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNCwKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzUsICAvKiBaZXJvc0xlZnQ9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD03ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTggKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xNCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiAgIC8qIFplcm9zTGVmdD0xNSAqLworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjM2E3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTk4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKworICAgIElGICBDb3J0ZXhBOAorICAgICAgICAKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMzMjEwICAgICAgUk4gNgorCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFBfMyAgICAgICAgRE4gRDcuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorZFFfMyAgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKKworOy8vIGJTTFQ0CitkVEMzMjEwICAgICBETiBEMTguVTggICAKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorZE1hc2tfNCAgICAgRE4gRDI2LlUxNgorCitkVGVtcCAgICAgICBETiBEMjguVTgKK2REdW1teSAgICAgIEROIEQxNy5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorCis7Ly8gYlNHRTQKKworZEhTcDBxMSAgICAgRE4gRDEzLlU4CitkSFNxMHAxICAgICBETiBEMzEuVTggICAKKworZEJTMzIxMCAgICAgRE4gRDI4LlUxNgorCitkUF8wdCAgICAgICBETiBEMTMuVTggICA7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMzEuVTggICA7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDtUZW1wMiAgICAgICAgCisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBwVGhyZXNob2xkczogcjUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAxOiBEMjktRDMwLCBRMC1RMTogRDI0LUQyNQorOy8vICAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAtIHBUaHJlc2hvbGRzOiByNQorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKworICAgICAgICAKKyAgICAgICAgO2RUQzMyMTAgLTE4CisgICAgICAgIDtkVGVtcC0yOAorCisgICAgICAgIFZMRDEgICAgICAgIGQxOC5VMzJbMF0sIFtwVGhyZXNob2xkc10hIDtoZXJlCisKKyAgICAgICAgOy8vIGRlbHRhID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KSA+PiAzOworICAgICAgICA7Ly8gZERlbHRhID0gKHFEcDFxMSA+PiAyICsgcURxMHAwICsgMSk+PiAxCisKKyAgICAgICAgOy8vIHFEcDFxMS0xMQorICAgICAgICA7Ly8gcURxMHAwLTEwCisgICAgICAgIFZTVUJMICAgICAgIHFEcDFxMSwgZFBfMSwgZFFfMSAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkVGVtcCwgZFRDMzIxMAorICAgICAgICBWU1VCTCAgICAgICBxRHEwcDAsIGRRXzAsIGRQXzAgICAgICAKKyAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCisgICAgICAgIFZaSVAuOCAgICAgIGRUQzMyMTAsIGRUZW1wCisgICAgCisgICAgICAgIDsvLyBxRGVsdGEtcURxMHAwLTEwCisKKyAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKKworICAgICAgICA7Ly8gZFRDMzIxMC0xOAorICAgICAgICA7Ly8gZFRlbXAtMjgKKyAgICAgICAgOy8vIGRUQy0zMQorICAgICAgICBWQklGICAgICAgICBkVEMzMjEwLCBkTWFza18wLCBkRmlsdAorICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKKyAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMzMjEwLCBkTWFza18xCisgICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCisgICAgICAgIDsvLyBkRGVsdGEtZDIwCisKKyAgICAgICAgOy8vIGREZWx0YSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworICAgICAgICBWTkVHICAgICAgICBkVENzLCBkVENzCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorICAgICAgICA7MQorICAgICAgICBWTUFYICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworCisgICAgICAgIDsvLyBkUF8wbiAtIDI5CisgICAgICAgIDsvLyBkUV8wbiAtIDI0CisKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7CisKKyAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICAKKyAgICAgICAgOy8vIHFQXzBuIC0gMTQKKyAgICAgICAgOy8vIHFRXzBuIC0gMTIKKyAgICAgICAgCisgICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCisgICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCisKKyAgICAgICAgOzEKKyAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKKyAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKKyAgICAgICAgCisgICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgorICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KKworICAgICAgICBNX0VORAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgCisgICAgICAgIDtkSFNxMHAxIC0gMzEKKyAgICAgICAgO2RIU3AwcTEgLSAxMworICAgICAgICBWSEFERCAgICAgICBkSFNwMHExLCBkUF8wLCBkUV8xICAgICAKKyAgICAgICAgVkhBREQgICAgICAgZEhTcTBwMSwgZFFfMCwgZFBfMSAgICAgICAgIAorCisgICAgICAgIDsvLyBQcmVwYXJlIHRoZSBiUyBtYXNrCisKKyAgICAgICAgOy8vIGRIU3AwcTEtMTMKKyAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMTMKKyAgICAgICAgOy8vIGRIU3EwcDEtMzEKKyAgICAgICAgOy8vIGRRXzB0LVRlbXAxLTMxCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCisKKyAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRRXzB0LCBkSFNxMHAxLCBkUV8xCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYgIAorCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWZlNGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzOTYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKworICAgIElGICBDb3J0ZXhBOAorICAgICAgICAKK3BUaHJlc2hvbGRzIFJOIDUKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKKworOy8vIGJTTFQ0CitkVEMwICAgICAgICBETiBEMTguVTggICAKK2RUQzEgICAgICAgIEROIEQxOS5VOCAgIAorZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCisKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK2RScDBxMCAgICAgIEROIEQyNC5VOAorCitkTWF4UCAgICAgICBETiBEMjMuVTgKK2RNaW5QICAgICAgIEROIEQyMi5VOAorCitkTWF4USAgICAgICBETiBEMTkuVTgKK2RNaW5RICAgICAgIEROIEQyMS5VOAorCitkRGVsdGFQICAgICBETiBEMjYuVTgKK2REZWx0YVEgICAgIEROIEQyNy5VOAorCitxUF8wbiAgICAgICBRTiBRMTQuUzE2CitxUV8wbiAgICAgICBRTiBRMTIuUzE2CisKK2RRXzBuICAgICAgIEROIEQyNC5VOAorZFFfMW4gICAgICAgRE4gRDI1LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorCis7Ly8gYlNHRTQKKworcVNwMHEwICAgICAgUU4gUTEwLlUxNgorCitxU3AycTEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBwMSAgICBRTiBRMTIuVTE2CitxU3AzcDIgICAgICBRTiBRMTMuVTE2CitkSFNwMHExICAgICBETiBEMjguVTgKKworcVNxMnAxICAgICAgUU4gUTExLlUxNgorcVNwMHEwcTEgICAgUU4gUTEyLlUxNgorcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCitkSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKKworcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKK3FUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCisKK2RQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKK2RRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCisKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CitkUF8ybiAgICAgICBETiBEMzEuVTgKKworZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKKzsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIAorICAgICAgICA7Ly8gcURxMHAwLTEwCisgICAgICAgIFZTVUJMICAgICAgIHFEcDFxMSwgZFBfMSwgZFFfMSAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZFRDMFtdfSwgW3BUaHJlc2hvbGRzXSEKKyAgICAgICAgOy8vIHFEcDFxMS0xMQorICAgICAgICBWU1VCTCAgICAgICBxRHEwcDAsIGRRXzAsIGRQXzAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RUQzFbXX0sIFtwVGhyZXNob2xkc10hCisKKyAgICAgICAgOy8vIGRScDBxMC0yNAorICAgICAgICBWU0hSICAgICAgICBxRHAxcTEsIHFEcDFxMSwgIzIgICAgICAKKyAgICAKKyAgICAgICAgOy8vIGRUQzAxID0gKGRUQzEgPDwgNCkgfCBkVEMwCisgICAgICAgIDsvLyBkVEMwMS0xOAorICAgICAgICBWRVhUICAgICAgICBkVEMwMSwgZFRDMCwgZFRDMSwgIzQKKyAgICAgICAgOy8vIGRUZW1wLTE5CisgICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXBmbGcsIGRNYXNrXzEKKyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRUQzAxLCBkTWFza18wLCBkRmlsdAorICAgIAorCisgICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQorCisgICAgICAgIDsvLyBxRGVsdGEtcURxMHAwLTEwCisgICAgICAgIFZSSEFERCAgICAgIHFEZWx0YSwgcURwMXExLCBxRHEwcDAgIAorICAgICAgICBWUkhBREQgICAgICBkUnAwcTAsIGRQXzAsIGRRXzAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMwMSwgZFRlbXAKKworICAgICAgICA7Ly8gZFRDID0gZFRDMDEgKyAoZEFwbGcgJiAxKSArIChkQXFmbGcgJiAxKQorICAgICAgICAKKyAgICAgICAgVkFORCAgICAgICAgZFRlbXAsIGRBcWZsZywgZE1hc2tfMQorICAgICAgICBWUUFERCAgICAgICBkTWF4UCwgZFBfMSwgZFRDMDEgICAgICAKKyAgICAgICAgVlFNT1ZOICAgICAgZERlbHRhLCBxRGVsdGEKKyAgICAgICAgVkFERCAgICAgICAgZFRDLCBkVEMsIGRUZW1wCisKKyAgICAgICAgOy8vIGRNYXhQID0gUUFERChkUF8xLCBkVEMwMSkKKyAgICAgICAgOy8vIGRNaW5QID0gUVNVQihkUF8xLCBkVEMwMSkKKyAKKyAgICAgICAgOy8vIGRNYXhQLWQyMworICAgICAgICA7Ly8gZE1pblAtZDIyCisgICAgICAgIFZRU1VCICAgICAgIGRNaW5QLCBkUF8xLCBkVEMwMSAgICAgIAorCisgICAgICAgIDsvLyBkRGVsdGEtZDIwCisKKyAgICAgICAgOy8vIGRNYXhRID0gUUFERChkUV8xLCBkVEMwMSkKKyAgICAgICAgOy8vIGRNaW5RID0gUVNVQihkUV8xLCBkVEMwMSkKKyAKKyAgICAgICAgOy8vIGRNYXhRLTE5CisgICAgICAgIDsvLyBkTWluUS0yMQorICAgICAgICBWUUFERCAgICAgICBkTWF4USwgZFFfMSwgZFRDMDEKKyAgICAgICAgVkhBREQgICAgICAgZERlbHRhUCwgZFJwMHEwLCBkUF8yICAgCisgICAgICAgIFZNSU4gICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisKKyAgICAgICAgOy8vIGREZWx0YSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIHEwIC0gZGVsdGEpOworICAgICAgICBWTkVHICAgICAgICBkVENzLCBkVENzCisgICAgICAgIAorICAgICAgICBWUVNVQiAgICAgICBkTWluUSwgZFFfMSwgZFRDMDEKKworICAgICAgICA7Ly8gZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICA7Ly8gZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7CisKKyAgICAgICAgOy8vIGREZWx0YVAgPSAoZFBfMiArIGRScDBxMCk+PjE7CisgICAgICAgIDsvLyBkUF8xbiA9IGFybUNsaXAoZFBfMSAtIGRUQzAxLCBkUF8xICsgZFRDMDEsIGREZWx0YVApOworICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKE1pblAsIE1heFAsIGREZWx0YVApOworICAgICAgICAKKyAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFsxKlN0ZXBdID0gKE9NWF9VOCkocTEgKyBkZWx0YSk7CisKKyAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7CisgICAgICAgIDsvLyBkUV8xbiA9IGFybUNsaXAoZFFfMSAtIGRUQzAxLCBkUV8xICsgZFRDMDEsIGREZWx0YVEpOworICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKE1pblEsIE1heFEsIGREZWx0YVEpOworICAgICAgICAKKyAgICAgICAgOy8vIGREZWx0YVAtMjYKKyAgICAgICAgVkhBREQgICAgICAgZERlbHRhUSwgZFJwMHEwLCBkUV8yICAgCisKKyAgICAgICAgOy8vIGREZWx0YVEtMjcKKyAgICAgICAgCisgICAgICAgIDsvLyBkUF8wbiAtIDI5CisgICAgICAgIDsvLyBkUF8xbiAtIDMwCisgICAgICAgIDsvLyBkUV8wbiAtIDI0CisgICAgICAgIDsvLyBkUV8xbiAtIDI1CisgICAgICAgIAorICAgICAgICA7Ly8gZGVsdGEgPSAocTIgKyAoKHAwK3EwKzEpPj4xKSAtIChxMTw8MSkpPj4xOworICAgICAgICA7Ly8gZERlbHRhUSA9IChkUV8yICsgZFJwMHEwKT4+MTsKKworICAgICAgICBWTUFYICAgICAgICBkUF8xbiwgZERlbHRhUCwgZE1pblAgICAKKyAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFFfMCAtIGRlbHRhKTsKKworICAgICAgICA7Ly8gZFBfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgOy8vIGRRXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIAorICAgICAgICA7Ly8gcVBfMG4gLSAxNAorICAgICAgICA7Ly8gcVFfMG4gLSAxMgorICAgICAgICAKKyAgICAgICAgVk1PVkwgICAgICAgcVBfMG4sIGRQXzAKKyAgICAgICAgVk1PVkwgICAgICAgcVFfMG4sIGRRXzAKKworICAgICAgICBWQUREVyAgICAgICBxUF8wbiwgcVBfMG4sIGREZWx0YQorICAgICAgICBWU1VCVyAgICAgICBxUV8wbiwgcVFfMG4sIGREZWx0YQorICAgICAgICAKKyAgICAgICAgVlFNT1ZVTiAgICAgZFBfMG4sIHFQXzBuCisgICAgICAgIFZRTU9WVU4gICAgIGRRXzBuLCBxUV8wbgorICAgICAgICAKKyAgICAgICAgVk1BWCAgICAgICAgZFFfMW4sIGREZWx0YVEsIGRNaW5RCisKKyAgICAgICAgVk1JTiAgICAgICAgZFBfMW4sIGRQXzFuLCBkTWF4UAorICAgICAgICBWTUlOICAgICAgICBkUV8xbiwgZFFfMW4sIGRNYXhRCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAorCisgICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZworCisgICAgICAgIE1fRU5ECisKKzsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIGFscGhhOiBEMCwgZE1hc2tfMTogRDE1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMjogRDI5LUQzMSwgUTAtUTI6IEQyNCxEMjUsRDI4CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgCisKKyAgICAgICAgOy8vIGFwPGJldGEgJiYgYXJtQWJzKHAwLXEwKTwoKGFscGhhPj4yKSsyKSAgICAgICAgCisgICAgICAgIDsvLyBhcTxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAorCisgICAgICAgIDsvLyAoIGRBcGZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKKyAgICAgICAgOy8vICggZEFxZmxnICYgZEFwMHEwIDwgKGRBbHBoYSA+PiAyICsgMikgKQorCisgICAgICAgIDsvLyAoIGRBcGZsZyA9IGRBcGZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCisgICAgICAgIDsvLyAoIGRBcWZsZyA9IGRBcWZsZyAmIGRBcDBxMCA8IChkVGVtcCArIGRNYXNrXzEgKyBkTWFza18xKSApCisKKyAgICAgICAgOy8vIFAgRmlsdGVyCisKKyAgICAgICAgVlNIUiAgICAgICAgZFRlbXAsIGRBbHBoYSwgIzIKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCisKKyAgICAgICAgOy8vIHFTcDBxMC0xMAorICAgICAgICBWQURETCAgICAgICBxU3AwcTAsIGRRXzAsIGRQXzAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXAsIGRUZW1wLCBkTWFza18xCisKKyAgICAgICAgOy8vIHFTcDJxMS0xMQorICAgICAgICA7Ly8gcVNwMHEwcDEtMTIKKyAgICAgICAgVkFEREwgICAgICAgcVNwMnExLCBkUF8yLCBkUV8xICAgICAgCisgICAgICAgIFZBRERXICAgICAgIHFTcDBxMHAxLCBxU3AwcTAsIGRQXzEgIAorCisgICAgICAgIFZDR1QgICAgICAgIGRUZW1wLCBkVGVtcCwgZEFwMHEwCisgICAgICAgIFZTSFIgICAgICAgIHFTcDJxMSwgIzEgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KSgocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zKTsKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9ICggKCAocDAgKyBxMCArIHAxKSArIChwMiArIHExKT4+MSApID4+IDEgKyAxICkgPj4gMQorCisgICAgICAgIDsvLyBkUF8wbiA9ICggKCAocVNwMHEwICsgZFBfMSkgKyBxU3AycTE+PjEgKSA+PiAxICsgMSApID4+IDEKKyAgICAgICAgOy8vIGRQXzBuID0gKCAoIHFTcDBxMHAxICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUF8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbLTIqU3RlcF0gPSAoT01YX1U4KSgocDIgKyBwMSArIHAwICsgcTAgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgoZFBfMiArIHFTcDBxMHAxICsgMik+PjIpOworICAgICAgICA7Ly8gZFBfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCgyKnAzICsgMypwMiArIHAxICsgcDAgKyBxMCArIDQpPj4zKTsKKyAgICAgICAgOy8vIHBRMFstMypTdGVwXSA9IChPTVhfVTgpKCggKHAzICsgcDIpICsgKHAxICsgcDAgKyBxMCArIHAyKSA+PiAxICsgMik+PjIpOworCisgICAgICAgIDsvLyBkUF8ybiA9IChPTVhfVTgpKCggcVNwM3AyICsgKGRQXzIgKyBxU3AwcTBwMSkgPj4gMSArIDIpID4+IDIpOworICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7CisKKyAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKKyAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgorICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHAxLCBxU3AycTEKKyAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBwMSwgZFBfMiAgCisgICAgICAgIAorICAgICAgICA7Ly8gcVNwM3AyLTEzCisgICAgICAgIFZBRERMICAgICAgIHFTcDNwMiwgZFBfMywgZFBfMiAgICAgIAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEFwZmxnLCBkVGVtcAorICAgICAgICBWSEFERCAgICAgICBkSFNwMHExLCBkUF8wLCBkUV8xICAgICAKKyAgICAgICAgVlNSQSAgICAgICAgcVNwM3AyLCBxVGVtcDIsICMxICAgICAgCisgICAgICAgIDsvLyBkSFNwMHExLTI4CisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEFxZmxnLCBkVGVtcAorCisgICAgICAgIDsvLyBkUF8wbi0yOQorICAgICAgICA7Ly8gZFBfMHQtZEhTcDBxMS0yOAorICAgICAgICBWUVJTSFJOICAgICBkUF8wbiwgcVRlbXAxLCAjMQorICAgICAgICBWUkhBREQgICAgICBkUF8wdCwgZEhTcDBxMSwgZFBfMSAgICAKKworICAgICAgICA7Ly8gZFBfMW4tMzAKKyAgICAgICAgVlFSU0hSTiAgICAgZFBfMW4sIHFUZW1wMiwgIzIKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcTJwMSwgZFFfMiwgZFBfMSAgICAgICAgICAKKyAgICAgICAgVkFERFcgICAgICAgcVNwMHEwcTEsIHFTcDBxMCwgZFFfMSAgICAgIAorICAgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzB0LCBkQXBmbGcgICAgCisKKyAgICAgICAgOy8vIFEgRmlsdGVyCisKKyAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOCkoKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9ICggKCAocDAgKyBxMCArIHExKSArIChxMiArIHAxKT4+MSApID4+IDEgKyAxICkgPj4gMQorCisgICAgICAgIDsvLyBkUV8wbiA9ICggKCAocVNwMHEwICsgZFFfMSkgKyBxU3EycDE+PjEgKSA+PiAxICsgMSApID4+IDEKKyAgICAgICAgOy8vIGRRXzBuID0gKCAoIHFTcDBxMHExICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUV8wbiA9ICggcVRlbXAxICsgMSApID4+IDEKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcTAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChkUV8yICsgcVNwMHEwcTEgKyAyKT4+Mik7CisgICAgICAgIDsvLyBkUV8xbiA9IChPTVhfVTgpKChxVGVtcDIgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbMipTdGVwXSA9IChPTVhfVTgpKCggKHEzICsgcTIpICsgKHExICsgcDAgKyBxMCArIHEyKSA+PiAxICsgMik+PjIpOworCisgICAgICAgIDsvLyBkUV8ybiA9IChPTVhfVTgpKCggcVNxM3EyICsgKGRRXzIgKyBxU3AwcTBxMSkgPj4gMSArIDIpID4+IDIpOworICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIHFUZW1wMiA+PiAxICsgMikgPj4gMik7CisKKyAgICAgICAgOy8vIHFUZW1wMS1xU3AycTEtMTEKKyAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgorICAgICAgICA7Ly8gcVNxMnAxLTExCisgICAgICAgIDsvLyBxU3AwcTBxMS0xMgorCisKKyAgICAgICAgOy8vIHFUZW1wMi1xU3AwcTBwMS0xMgorICAgICAgICA7Ly8gcVRlbXAxLXFTcTJwMS0xMQorICAgICAgICA7Ly8gcVNxM3EyLTEzCisgICAgICAgIDsvLyBkUF8ybi0zMQorICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgZFBfMm4sIHFTcDNwMiwgIzIKKyAgICAgICAgVkFEREwgICAgICAgcVNxM3EyLCBkUV8zLCBkUV8yICAgICAgICAgIAorCisgICAgICAgIFZTSFIgICAgICAgIHFTcTJwMSwgIzEgICAgICAgICAgICAgICAgICAKKworICAgICAgICBWSEFERCAgICAgICBxVGVtcDEsIHFTcDBxMHExLCBxU3EycDEKKyAgICAgICAgVkFERFcgICAgICAgcVRlbXAyLCBxU3AwcTBxMSwgZFFfMiAgICAgIAorCisgICAgICAgIDsvLyBkSFNxMHAxLTI4CisgICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKKworICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMW4sIGRQXzEsIGRBcGZsZworCisgICAgICAgIFZTUkEgICAgICAgIHFTcTNxMiwgcVRlbXAyLCAjMSAgICAgICAgICAKKworICAgICAgICA7Ly8gZFFfMS1UZW1wMi0yNQorICAgICAgICA7Ly8gZFFfMC1UZW1wMi0yNAorICAgICAgICBWUVJTSFJOICAgICBkUV8xbiwgcVRlbXAyLCAjMgorICAgICAgICBWUVJTSFJOICAgICBkUV8wbiwgcVRlbXAxLCAjMQorCisgICAgICAgIDsvLyBkUV8wdC1UZW1wMS0yMgorICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQorICAgICAgICBWQklGICAgICAgICBkUV8xbiwgZFFfMSwgZEFxZmxnICAgICAgICAgCisKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMm4sIGRQXzIsIGRBcGZsZyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wdCwgZEFxZmxnICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMm4sIHFTcTNxMiwgIzIKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0CisgICAgICAgIFZCSUYgICAgICAgIGRRXzJuLCBkUV8yLCBkQXFmbGcgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgIAorCisKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwYTg5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpAQCAtMCwwICsxLDMyNSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKyAgICAgICAgCitMQVNUX0NPRUZGICAgICAgICAgICAgICAgRVFVIDB4MjAgICAgICAgIDsvLyBFbmQgb2YgYmxvY2sgZmxhZworVFdPX0JZVEVfQ09FRkYgICAgICAgICAgIEVRVSAweDEwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwcEJpdFN0cmVhbSAgICAgUk4gMAorcE9mZnNldCAgICAgICAgIFJOIDEKK3BOdW1Db2VmZiAgICAgICBSTiAyCitwcFBvc0NvZWZidWYgICAgUk4gMworbkMgICAgICAgICAgICAgIFJOIDQgOy8vIG51bWJlciBvZiBjb2VmZnMgb3IgMTcgZm9yIGNocm9tYQorc01heE51bUNvZWZmICAgIFJOIDUKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKKworOy8vIExldmVsIGxvb3AKK0NvdW50ICAgICAgICAgICBSTiAwCitUcmFpbGluZ09uZXMgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK0xldmVsU3VmZml4ICAgICBSTiAzCitTdWZmaXhMZW5ndGggICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKKworcFZMRFRhYmxlICAgICAgIFJOIDYKK1N5bWJvbCAgICAgICAgICBSTiA3CitUMSAgICAgICAgICAgICAgUk4gOAorVDIgICAgICAgICAgICAgIFJOIDkKK1JCaXRTdHJlYW0gICAgICBSTiAxMAorUkJpdEJ1ZmZlciAgICAgIFJOIDExCitSQml0Q291bnQgICAgICAgUk4gMTIKK2xyICAgICAgICAgICAgICBSTiAxNAorCis7Ly8gUnVuIGxvb3AKK0NvdW50ICAgICAgICAgICBSTiAwCitaZXJvc0xlZnQgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUnVuVGFibGUgICAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKKworcFZMRFRhYmxlICAgICAgIFJOIDYKK1N5bWJvbCAgICAgICAgICBSTiA3CitUMSAgICAgICAgICAgICAgUk4gOAorVDIgICAgICAgICAgICAgIFJOIDkKK1JCaXRTdHJlYW0gICAgICBSTiAxMAorUkJpdEJ1ZmZlciAgICAgIFJOIDExCitSQml0Q291bnQgICAgICAgUk4gMTIKK2xyICAgICAgICAgICAgICBSTiAxNAorCis7Ly8gRmlsbCBpbiBjb2VmZmljaWVudHMgbG9vcAorcFBvc0NvZWZidWYgICAgIFJOIDAKK3RlbXAgICAgICAgICAgICBSTiAxCitwTGV2ZWwgICAgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK3BSdW4gICAgICAgICAgICBSTiA0CitUb3RhbENvZWZmICAgICAgUk4gNQorcFppZ1phZyAgICAgICAgIFJOIDYKKworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitDb2VmZk51bSAgICAgICAgUk4gMTQKKworCisKKyAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M0IHBwcEJpdFN0cmVhbSwgNAorICAgICAgICBNX0FMTE9DNCBwcE9mZnNldCwgNAorICAgICAgICBNX0FMTE9DNCBwcHBQb3NDb2VmYnVmLCA0CisgICAgICAgIE1fQUxMT0M0IHBwTGV2ZWwsIDE2KjIKKyAgICAgICAgTV9BTExPQzQgcHBSdW4sIDE2CisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwTkMsIDQKKyAgICAgICAgTV9BUkcgICBwU01heE51bUNvZWZmLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMCBwcEJpdFN0cmVhbSwgcE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50CisgICAgICAgIExEUiAgICAgICAgcFZMRFRhYmxlLCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgTV9MRFIgICAgICBuQywgcE5DCisgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQxIFQxLCBUMiwgbHIKKyAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIG5DLCBMU0wgIzJdICA7Ly8gRmluZCBWTEQgdGFibGUgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyIFQxLCBUMiwgbHIKKworICAgICAgICA7Ly8gRGVjb2RlIFN5bWJvbCA9IFRvdGFsQ29lZmYqNCArIFRyYWlsaW5nT25lcworICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMgorICAgIAorICAgICAgICBNT1ZTICAgIFRvdGFsQ29lZmYsIFN5bWJvbCwgTFNSICMyICAgIAorICAgICAgICBTVFJCICAgIFRvdGFsQ29lZmYsIFtwTnVtQ29lZmZdICAgIAorICAgICAgICBNX1BSSU5URiAiVG90YWxDb2VmZj0lZFxuIiwgVG90YWxDb2VmZgorICAgICAgICBCRVEuVyAgIEVuZE5vRXJyb3IgICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoZWQgaWYgbm8gY29lZmZpY2llbnRzCisKKyAgICAgICAgQ01QICAgICBTeW1ib2wsICMxNyo0CisgICAgICAgIEJHRS5XICAgRW5kQmFkU3ltYm9sICAgICAgICAgICAgICAgIDsvLyBFcnJvciBpZiBiYWQgc3ltYm9sCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgTV9TVFIgICBwcEJpdFN0cmVhbSwgIHBwcEJpdFN0cmVhbQorICAgICAgICBNX1NUUiAgIHBPZmZzZXQsICAgICAgcHBPZmZzZXQKKyAgICAgICAgTV9TVFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIFRyYWlsaW5nIE9uZXMKKyAgICAgICAgQU5EUyAgICBUcmFpbGluZ09uZXMsIFN5bWJvbCwgIzMKKyAgICAgICAgTV9BRFIgICBwTGV2ZWwsIHBwTGV2ZWwgICAgICAgICAgICAKKyAgICAgICAgTV9QUklOVEYgIlRyYWlsaW5nT25lcz0lZFxuIiwgVHJhaWxpbmdPbmVzCisgICAgICAgIEJFUSAgICAgVHJhaWxpbmdPbmVzRG9uZSAgICAKKyAgICAgICAgTU9WICAgICBDb3VudCwgVHJhaWxpbmdPbmVzCitUcmFpbGluZ09uZXNMb29wICAgIAorICAgICAgICBNX0JEX1JFQUQ4IFN5bWJvbCwgMSwgVDEKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIE1PViAgICAgVDEsICMxCisgICAgICAgIFNVQiAgICAgVDEsIFQxLCBTeW1ib2wsIExTTCAjMQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMgorICAgICAgICBCR1QgICAgIFRyYWlsaW5nT25lc0xvb3AKK1RyYWlsaW5nT25lc0RvbmUgICAgCisgICAgCisgICAgICAgIDsvLyBEZWNvZGUgbGV2ZWwgdmFsdWVzICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXMgICAgIDsvLyBOdW1iZXIgb2YgbGV2ZWxzIHRvIHJlYWQKKyAgICAgICAgQkVRICAgICBEZWNvZGVSdW5zICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTm9uZSBsZWZ0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIFN1ZmZpeExlbmd0aCwgIzEKKyAgICAgICAgQ01QICAgICBUb3RhbENvZWZmLCAjMTAKKyAgICAgICAgTU9WTEUgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIENNUCAgICAgVHJhaWxpbmdPbmVzLCAjMyAgICA7Ly8gaWYgKFRyYWlsaW5nT25lczwzKQorICAgICAgICBNT1ZMVCAgIFRyYWlsaW5nT25lcywgIzQgICAgOy8vIHRoZW4gVHJhaWxpbmdPbmVzID0gKzQKKyAgICAgICAgTU9WR0UgICBUcmFpbGluZ09uZXMsICMyICAgIDsvLyBlbHNlIFRyYWlsaW5nT25lcyA9ICsyCisgICAgICAgIE1PVkdFICAgU3VmZml4TGVuZ3RoLCAjMCAgICA7Ly8gICAgICBTdWZmaXhMZW5ndGggPSAwCisgICAgICAgIAorTGV2ZWxMb29wCisgICAgICAgIE1fQkRfQ0xaMTYgU3ltYm9sLCBUMSwgVDIgICA7Ly8gU3ltYm9sPUxldmVsUHJlZml4CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorICAgICAgICAKKyAgICAgICAgTU9WUyAgICBsciwgU3VmZml4TGVuZ3RoICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKKyAgICAgICAgVEVRRVEgICBTeW1ib2wsICMxNCAgICAgICAgIDsvLyAgIGFuZCAgTGV2ZWxQcmVmaXg9PTE0CisgICAgICAgIE1PVkVRICAgbHIsICM0ICAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT00CisgICAgICAgIFRFUSAgICAgU3ltYm9sLCAjMTUgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0xNQorICAgICAgICBNT1ZFUSAgIGxyLCAjMTIgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9MTIKKyAgICAgICAgCisgICAgICAgIFRFUUVRICAgU3VmZml4TGVuZ3RoLCMwCisgICAgICAgIEFEREVRICAgU3ltYm9sLFN5bWJvbCwjMTUKKyAgICAgICAgCisgICAgICAgIFRFUSAgICAgbHIsICMwICAgICAgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIEJFUSAgICAgTGV2ZWxDb2RlUmVhZCAgICAgICA7Ly8gTGV2ZWxDb2RlID0gTGV2ZWxQcmVmaXgKKyAgICAgICAgCisgICAgICAgIE1fQkRfVlJFQUQxNiBMZXZlbFN1ZmZpeCwgbHIsIFQxLCBUMiAgOy8vIFJlYWQgTGV2ZWwgU3VmZml4CisgICAgICAgIAorICAgICAgICBNT1YgICAgIFN5bWJvbCwgU3ltYm9sLCBMU0wgU3VmZml4TGVuZ3RoCisgICAgICAgIEFERCAgICAgU3ltYm9sLCBMZXZlbFN1ZmZpeCwgU3ltYm9sCisgICAgICAgICAgICAgCitMZXZlbENvZGVSZWFkICAgICAgICAKKyAgICAgICAgOy8vIFN5bWJvbCA9IExldmVsQ29kZQorICAgICAgICBBREQgICAgIFN5bWJvbCwgU3ltYm9sLCBUcmFpbGluZ09uZXMgOy8vICs0IGlmIGxldmVsIGNhbm5vdCBiZSArLy0xLCArMiBvL3cKKyAgICAgICAgTU9WICAgICBUcmFpbGluZ09uZXMsICMyCisgICAgICAgIE1PVlMgICAgVDEsIFN5bWJvbCwgTFNSICMxCisgICAgICAgIFJTQkNTICAgVDEsIFQxLCAjMCAgICAgICAgICAgICAgICAgIDsvLyBJZiBTeW1ib2wgb2RkIHRoZW4gbmVnYXRlCisgICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKKyAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyICAgICAgICAgICAgOy8vIFN0b3JlIGxldmVsLgorICAgICAgICAKKyAgICAgICAgTERSICAgICBUMiwgPWFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgICAgICBMRFJTQiAgIFQxLCBbVDIsIFN1ZmZpeExlbmd0aF0gICAgICA7Ly8gRmluZCBpbmNyZW1lbnQgbGV2ZWwgICAgICAgIAorICAgICAgICBURVEgICAgIFN1ZmZpeExlbmd0aCwgIzAKKyAgICAgICAgTU9WRVEgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgU3ltYm9sLCBUMQorICAgICAgICBBRERDUyAgIFN1ZmZpeExlbmd0aCwgU3VmZml4TGVuZ3RoLCAjMSAgICAgICAgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgCisgICAgICAgIEJHVCAgICAgTGV2ZWxMb29wCisgICAgICAgIAorRGVjb2RlUnVucyAgICAgICAgCisgICAgICAgIDsvLyBGaW5kIG51bWJlciBvZiB6ZXJvcworICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCisgICAgICAgIFNVQiAgICAgQ291bnQsIFRvdGFsQ29lZmYsICMxICAgICAgIDsvLyBOdW1iZXIgb2YgcnVucyBleGNsdWRpbmcgbGFzdAorICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgVDEsIFRvdGFsQ29lZmYgICA7Ly8gTWF4aW11bSBudW1iZXIgb2YgemVyb3MgdGhlcmUgY291bGQgYmUKKyAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgorICAgICAgICBNT1YgICAgIENvZWZmTnVtLFRvdGFsQ29lZmYKKyAgICAgICAgU1VCICAgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gVW5wYWNrIG51bWJlciBvZiB6ZXJvcyBmcm9tIGJpdHN0cmVhbQorICAgICAgICBURVEgICAgIFQxLCAjNCAgICAgICAgCisgICAgICAgIExEUkVRICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzLTQpCisgICAgICAgIExEUk5FICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMtNCkKKyAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIFRvdGFsQ29lZmYsIExTTCAjMl0KKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyIDsvLyBTeW1ib2wgPSBaZXJvc0xlZnQKKyAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2CisgICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCisKKyAgICAgICAgTERSICAgICBwcFJ1blRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMtNCkKKyAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgorICAgICAgICBNT1ZTICAgIFplcm9zTGVmdCwgU3ltYm9sCisKKyAgICAgICAgQUREICAgICBDb2VmZk51bSxDb2VmZk51bSxaZXJvc0xlZnQgICAgICAgIAorCisgICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSB6ZXJvcyBhcmUgbGVmdCBhbmQgbW9yZSB0aGFuIG9uZSBjb2VmZmljaWVudAorUnVuTG9vcCAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcHBSdW5UYWJsZSwgWmVyb3NMZWZ0LCBMU0wjMl0KKyAgICAgICAgQkxUICAgICBMYXN0UnVuCisgICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCAzLCAyIDsvLyBTeW1ib2wgPSBSdW4KKyAgICAgICAgQ01QICAgICBTeW1ib2wsIzE1ICAgICAgICAgCisgICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sICAgICAgICAKKworICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgWmVyb3NMZWZ0LCBTeW1ib2wKKyAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgU3ltYm9sCisgICAgICAgIFNUUkIgICAgU3ltYm9sLCBbcFJ1bl0sICMxCisgICAgICAgIEJHVCAgICAgUnVuTG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIG5vIHplcm9zIGFyZSBsZWZ0CitOb1plcm9zTGVmdCAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFplcm9zTGVmdAorICAgICAgICBTVFJHRUIgIFplcm9zTGVmdCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIE5vWmVyb3NMZWZ0CisKK0xhc3RSdW4gICAgICAgIAorICAgICAgICA7Ly8gRmluYWwgcnVuIGxlbmd0aCBpcyByZW1haW5pbmcgemVyb3MKKyAgICAgICAgTV9QUklOVEYgIkxhc3RSdW49JWRcbiIsIFplcm9zTGVmdAorICAgICAgICBTVFJCICAgIFplcm9zTGVmdCwgW3BSdW5dLCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgY29lZmZpY2llbnRzIHRvIG91dHB1dCBhcnJheQorICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCisgICAgICAgIFRFUSAgICAgVDEsICMxNQorICAgICAgICBBRERFUSAgIENvZWZmTnVtLENvZWZmTnVtLCMxCisgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgcFJ1bixwUnVuLFRvdGFsQ29lZmYKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgIAorICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgIAorCisgICAgICAgIE1fTERSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmCisgICAgICAgIExEUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIFRFUSAgICAgVDEsICM0CisgICAgICAgIExEUkVRICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgICAgICBMRFJORSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKKworICAgICAgICAKKyAgICAgICAgCitPdXRwdXRMb29wCisgICAgICAgIAorICAgICAgICBMRFJCICAgIFQyLCBbcFJ1bl0sIzEKKyAgICAgICAgTERSQiAgICBUMSwgW3BaaWdaYWcsIENvZWZmTnVtXQorICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgIzEgICAgICA7Ly8gU2tpcCBOb24gemVybworICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgVDIgICAgICA7Ly8gU2tpcCBaZXJvIHJ1bgorICAgICAgICAKKyAgICAgICAgTERSU0ggICBUMiwgW3BMZXZlbF0sIzIKKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgVG90YWxDb2VmZiwgVG90YWxDb2VmZiwgIzEgICAgICAgCisgICAgICAgIE9SUkVRICAgVDEsIFQxLCAjTEFTVF9DT0VGRgorICAgICAgICAKKyAgICAgICAgQUREICAgICB0ZW1wLCBUMiwgIzEyOAorICAgICAgICBDTVAgICAgIHRlbXAsICMyNTYKKyAgICAgICAgT1JSQ1MgICBUMSwgVDEsICNUV09fQllURV9DT0VGRgorCisgICAgICAgIAorICAgICAgICBURVEgICAgIFRvdGFsQ29lZmYsICMwICAgICAgICAgICAgICA7Ly8gUHJlc2VydmVzIGNhcnJ5ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJPdXRwdXQ9JTAyeCAlMDR4XG4iLCBUMSwgVDIKKyAgICAgICAgU1RSQiAgICBUMSwgW3BQb3NDb2VmYnVmXSwgIzEKKyAgICAgICAgU1RSQiAgICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEKKyAgICAgICAgTU9WICAgICBUMiwgVDIsIExTUiAjOAorICAgICAgICBTVFJDU0IgIFQyLCBbcFBvc0NvZWZidWZdLCAjMSAgICAgICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICBPdXRwdXRMb29wCisgICAgICAgIAorICAgICAgICA7Ly8gRmluaXNoZWQKKyAgICAgICAgU1RSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KKyAgICAgICAgTV9MRFIgICBwcEJpdFN0cmVhbSwgcHBwQml0U3RyZWFtCisgICAgICAgIE1fTERSICAgcE9mZnNldCwgcHBPZmZzZXQKKyAgICAgICAgQiAgICAgICBFbmROb0Vycm9yCisgICAgICAgICAgICAKK0VuZEJhZFN5bWJvbAorICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19FcnIKKyAgICAgICAgQiAgICAgICBFbmQgICAgCisgICAgICAgIAorRW5kTm9FcnJvcgorICAgICAgICA7Ly8gRmluaXNoZWQgcmVhZGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcE9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIgICAgCitFbmQKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3NjE2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKQEAgLTAsMCArMSwxMjMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisKKyAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgIAorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4IAorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgICAgIAorICAgICAgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICAgICAKKyAKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIERDQiAgMCwgMiwgMCwgMgorICAgICAgICAgRENCICAyLCAxLCAyLCAxCisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAgICAgIERDQiAgMCwgMgorICAgICAgICAgRENCICAyLCAxCisKKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXgKKyAgICAgICAgIERDQiAgMTAsIDE2LCAxMworICAgICAgICAgRENCICAxMSwgMTgsIDE0CisgICAgICAgICBEQ0IgIDEzLCAyMCwgMTYKKyAgICAgICAgIERDQiAgMTQsIDIzLCAxOAorICAgICAgICAgRENCICAxNiwgMjUsIDIwCisgICAgICAgICBEQ0IgIDE4LCAyOSwgMjMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIFsoSU5UKShRUC82KV0sCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICAgRENCICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAgICAgIERDQiAgMSwgIDEsICAxLCAgMSwgIDEsICAxCisgICAgICAgICBEQ0IgIDIsICAyLCAgMiwgIDIsICAyLCAgMgorICAgICAgICAgRENCICAzLCAgMywgIDMsICAzLCAgMywgIDMKKyAgICAgICAgIERDQiAgNCwgIDQsICA0LCAgNCwgIDQsICA0CisgICAgICAgICBEQ0IgIDUsICA1LCAgNSwgIDUsICA1LCAgNQorICAgICAgICAgRENCICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKKyAgICAgICAgIERDQiAgNywgIDcsICA3LCAgNywgIDcsICA3CisgICAgICAgICBEQ0IgIDgsICA4LCAgOCwgIDgsICA4LCAgOAorICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgbW9kdWx1cyBleHByZXNzaW9uIFtRUCU2XSo2LAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCis7Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgICBEQ1cgMTAsIDE2LCAxMyAKKyAgICAgICAgIERDVyAxMSwgMTgsIDE0CisgICAgICAgICBEQ1cgMTMsIDIwLCAxNgorICAgICAgICAgRENXIDE0LCAyMywgMTgKKyAgICAgICAgIERDVyAxNiwgMjUsIDIwCisgICAgICAgICBEQ1cgMTgsIDI5LCAyMyAKKyAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgICAgICAKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICAgICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTkxMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworICAgIElGIEFSTTExMzZKUyAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiA4CitpSGVpZ2h0ICAgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycworeCAgICAgICAgICAgICAgIFJOIDcKK3gwICAgICAgICAgICAgICBSTiA3Cit4MSAgICAgICAgICAgICAgUk4gMTAKK3gyICAgICAgICAgICAgICBSTiAxMQorU2NyYXRjaCAgICAgICAgIFJOIDEyCisKKzsvLyBGdW5jdGlvbjogCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhIDQgYnl0ZSBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgOSBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4gCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIHJvd3MgdG8gY29weQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjIscjMscjQscjUscjYKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyOCxyOSxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvcHkgcERzdCB0byBzY3JhdGNoCisgICAgICAgIE1PViAgICAgU2NyYXRjaCwgcERzdAorCitTdGFydEFsaWduZWRTdGFja0NvcHkKKyAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMworICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzCisgICAgICAgIAorICAgICAgICBNX1NXSVRDSCB4CisgICAgICAgIE1fQ0FTRSAgIENvcHkwdG9BbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkxdG9BbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkydG9BbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkzdG9BbGlnbmVkCisgICAgICAgIE1fRU5EU1dJVENICisKK0NvcHkwdG9BbGlnbmVkICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTB0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKyAgICAgIAorQ29weTF0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzI0CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkxdG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisKK0NvcHkydG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzE2CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MnRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorCitDb3B5M3RvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzgKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkzdG9BbGlnbmVkCisKK0NvcHlFbmQgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwU3JjLCBTY3JhdGNoCisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzEyCisKKyAgICAgICAgTV9FTkQKKyAgICAKKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgorOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyBvZiByb3dzIHRvIGNvcHkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIyLHIzLHI0LHI1LHI2Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb3B5IHBTcmMgdG8gc3RhY2sKK1N0YXJ0VkFsaWduZWRTdGFja0NvcHkKKyAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMworICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TV0lUQ0ggeAorICAgICAgICBNX0NBU0UgICBDb3B5MHRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTF0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkydG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5M3RvVkFsaWduZWQKKyAgICAgICAgTV9FTkRTV0lUQ0gKKyAgICAgICAgCitDb3B5MHRvVkFsaWduZWQgIAorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTB0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorICAgICAgCitDb3B5MXRvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjOAorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkxdG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKworQ29weTJ0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzE2CisgICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weVZFbmQgIAorCitDb3B5M3RvVkFsaWduZWQgICAgICAgIAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMyNAorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkzdG9WQWxpZ25lZAorCitDb3B5VkVuZCAgCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRHN0LCAjMjgKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorCisgICAgICAgIE1fRU5ECisKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI3NTg5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTQ5IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhbiBhbGlnbmVkCis7Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIxLHIzLHI0LHI1LHI2LHI3LHIxMCxyMTEscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjAscjIscjgscjkscjEyCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK3gwICAgICAgICAgICAgICBSTiA0Cit4MSAgICAgICAgICAgICAgUk4gNQoreDIgICAgICAgICAgICAgIFJOIDgKK3gzICAgICAgICAgICAgICBSTiA5CitUZW1wICAgICAgICAgICAgUk4gMTIKKworICAgIElGIEFSTTExMzZKUworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUsIHI2CisKK0NvcHk0eDRTdGFydAorICAgICAgICA7Ly8gRG8gQ29weSBhbmQgYnJhbmNoIHRvIEVuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBBTkQgICAgIFRlbXAsIHBTcmMsICMzCisgICAgICAgIEJJQyAgICAgcFNyYywgcFNyYywgIzMgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBNX1NXSVRDSCBUZW1wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMAorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjEKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24yCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMworICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX0xEUiAgIHgxLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgxLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX1NUUiAgIHgzLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMQorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKyAgICAgIAorQ29weTR4NEFsaWduMgorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRBbGlnbjMgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKworICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCisKK0NvcHk0eDRFbmQKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU1YTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE3OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorCis7Ly8gRnVuY3Rpb25zOiAKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlIGFuZAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgCis7Ly8KKzsvLyBJbXBsZW1lbnRzIHJlLWFycmFuZ2VtZW50IG9mIGRhdGEgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGEgYnVmZmVyIHBvaW50ZWQgYnkgcEJ1Zi4KKzsvLyBUaGlzIHdpbGwgZG8gdGhlIGNvbnZlcnRpb24gb2YgZGF0YSBmcm9tIDE2IGJpdCB0byA4IGJpdCBhbmQgaXQgYWxzbworOy8vIHJlbW92ZSBvZmZzZXQgYW5kIGNoZWNrIGZvciBzYXR1cmF0aW9uLgorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyNyB3aGVyZSByMCBpcyBpbnB1dCBwb2ludGVyIGFuZCByMiBpdHMgc3RlcCBzaXplLCByNyBpcyBvdXRwdXQgcG9pbnRlcgorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjQscjUscjYscjgscjkscjE0Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBkZXN0aW5hdGlvbiBsb2NhdGlvbgorCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorICAgICAgICAKK01BU0sgICAgICAgICAgICBFUVUgMHg4MDgwODA4MCAgOy8vIE1hc2sgaXMgdXNlZCB0byBpbXBsZW1lbnQgKGErYisxKS8yCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjMCAgICAgICAgICAgUk4gMAorc3JjU3RlcDAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworVGVtcDEgICAgICAgICAgIFJOIDQKK1RlbXAyICAgICAgICAgICBSTiA1CitUZW1wMyAgICAgICAgICAgUk4gMTAKK1RlbXA0ICAgICAgICAgICBSTiAxMQorcEJ1ZiAgICAgICAgICAgIFJOIDcKK3IweDBmZTAwZmUwICAgICBSTiA2CityMHgwMGZmMDBmZiAgICAgUk4gMTIKK0NvdW50ICAgICAgICAgICBSTiAxNAorVmFsdWVBMCAgICAgICAgIFJOIDEwCitWYWx1ZUExICAgICAgICAgUk4gMTEKKworICAgIElGIEFSTTExMzZKUworCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgCisgICAgICAgIE1PViAgICAgICAgIENvdW50LCAjNCAgIAorICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKKyAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAKK0xvb3BTdGFydDEKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgICAgICAgCisgICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUUkQgICAgICAgIFZhbHVlQTAsIFtwQnVmXSwgIzggCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydDEKK0VuZDEKKyAgICAgICAgU1VCICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyCisgICAgICAgIE1PViAgICAgICAgc3JjU3RlcDAsICM4CisKKyAgICAgICAgTV9FTkQKKworCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUsIHI2CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYKKyAgICAgICAgTU9WICAgICAgICAgQ291bnQsICMyCisKK0xvb3BTdGFydCAgICAKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKworICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICMtNCAgCisKKyAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCisgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0CisgICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KKyAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKKyAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICM0ICAKKyAgICAgICAgCisgICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydAorRW5kMgorICAgICAgICBTVUIgICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyLTgKKyAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcDAsICM0CisKKyAgICAgICAgTV9FTkQKKworICAgIEVORElGCisgICAgCisgICAgRU5ECisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNjg0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzMTMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgIElGIENvcnRleEE4CisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CitxQ29lZmY1ICAgICAgICAgUU4gMTQuUzMyCitxQ29lZmYyMCAgICAgICAgUU4gMTUuUzMyCisgICAgICAgIAorcVNyYzAxICAgICAgICAgIFFOIDAuVTgKK2RTcmMwICAgICAgICAgICBETiAwLlU4CitkU3JjMSAgICAgICAgICAgRE4gMS5VOCAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKK2RTcmNiICAgICAgICAgICBETiA0LlU4CitkU3JjYyAgICAgICAgICAgRE4gMi5VOAorZFNyY2QgICAgICAgICAgIEROIDMuVTgKK2RTcmNlICAgICAgICAgICBETiA1LlU4CitkU3JjZiAgICAgICAgICAgRE4gMS5VOAorCitxU3JjYiAgICAgICAgICAgUU4gMi5TMTYKK3FTcmNjICAgICAgICAgICBRTiAxLlMxNgorZFNyY0IgICAgICAgICAgIEROIDQuUzE2CitkU3JjQyAgICAgICAgICAgRE4gMi5TMTYKKworcVJlczAgICAgICAgICAgIFFOIDUuUzE2CitxUmVzMSAgICAgICAgICAgUU4gNi5TMTYKK3FSZXMyICAgICAgICAgICBRTiA3LlMxNgorcVJlczMgICAgICAgICAgIFFOIDguUzE2CitxUmVzNCAgICAgICAgICAgUU4gOS5TMTYKK3FSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKK3FSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKK3FSZXM3ICAgICAgICAgICBRTiAxMi5TMTYKK3FSZXM4ICAgICAgICAgICBRTiAxMy5TMTYKKyAgICAKK2RSZXMwICAgICAgICAgICBETiAxMC5TMTYKK2RSZXMxICAgICAgICAgICBETiAxMi5TMTYKK2RSZXMyICAgICAgICAgICBETiAxNC5TMTYKK2RSZXMzICAgICAgICAgICBETiAxNi5TMTYKK2RSZXM0ICAgICAgICAgICBETiAxOC5TMTYKK2RSZXM1ICAgICAgICAgICBETiAyMC5TMTYKK2RSZXM2ICAgICAgICAgICBETiAyMi5TMTYKK2RSZXM3ICAgICAgICAgICBETiAyNC5TMTYKK2RSZXM4ICAgICAgICAgICBETiAyNi5TMTYKKyAgICAKK3FBY2MwMSAgICAgICAgICBRTiA1LlMzMgorcUFjYzIzICAgICAgICAgIFFOIDYuUzMyCitxQWNjNDUgICAgICAgICAgUU4gMi5TMzIKK3FBY2M2NyAgICAgICAgICBRTiAzLlMzMgorcVN1bUJFICAgICAgICAgIFFOIDAuUzMyCitxU3VtQ0QgICAgICAgICAgUU4gMS5TMzIKKworZFRlbXBBY2MwICAgICAgIEROIDAuVTE2CitkVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKK2RUZW1wQWNjMiAgICAgICBETiA0LlUxNgorZFRlbXBBY2MzICAgICAgIEROIDYuVTE2CisKK3FUQWNjMCAgICAgICAgICBRTiAwLlUxNgorcVRBY2MxICAgICAgICAgIFFOIDEuVTE2CitxVEFjYzIgICAgICAgICAgUU4gMi5VMTYKK3FUQWNjMyAgICAgICAgICBRTiAzLlUxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOAorCitkVG1wMCAgICAgICAgICAgRE4gOC5TMTYKK2RUbXAxICAgICAgICAgICBETiA5LlMxNgorcVRtcDAgICAgICAgICAgIFFOIDQuUzMyCisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKKworICAgICAgICA7Ly8gUm93MAorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMwLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICAKKyAgICAgICAgOy8vIFJvdzEKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwIDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3czCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczMsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM0LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM1LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczUsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM1LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c2CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczYsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM1LCBkUmVzNSwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzcKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczYsIGRSZXM2LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM3LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93OAorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM4LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM3LCBkUmVzNywgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzOCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczgsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgVk1PViAgICAgICAgcUNvZWZmMjAsICMyMAorICAgICAgICBWTU9WICAgICAgICBxQ29lZmY1LCAjNQorCisgICAgICAgIDsvLyBDb2wwCisgICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFJlczAsIGRSZXM1ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczIsIGRSZXMzICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczEsIGRSZXM0ICAgICAgICA7Ly8gYitlCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczgsIGRSZXM4LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIHFBY2MwMSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBxQWNjMDEsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIDsvLyBDb2wxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFJlczEsIGRSZXM2ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczMsIGRSZXM0ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczIsIGRSZXM1ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2MyMywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzAxLCBxQWNjMDEsIHFUbXAwCisKKzsgICAgICAgIFZNTFMgICAgICAgIHFBY2MyMywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisKKyAgICAgICAgOy8vIENvbDIKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkUmVzMiwgZFJlczcgICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNCwgZFJlczUgICAgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMywgZFJlczYgICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgcUFjYzQ1LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworICAgICAgICBWU1VCICAgICAgICBxQWNjMjMsIHFBY2MyMywgcVRtcDAKKworOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzQ1LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb2wzCisgICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFJlczMsIGRSZXM4ICAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczUsIGRSZXM2ICAgICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczQsIGRSZXM3ICAgICAgICA7Ly8gYitlCisgICAgICAgIFZNTEEgICAgICAgIHFBY2M2NywgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKyAgICAgICAgVlNVQiAgICAgICAgcUFjYzQ1LCBxQWNjNDUsIHFUbXAwCisKKyAgICAgICAgVk1MUyAgICAgICAgcUFjYzY3LCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAxLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMjMsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzIsIHFBY2M0NSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzY3LCAjMTAKKyAgICAgICAgCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQorICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmMwOTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjY2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkVENvZWZmNSAgICAgICAgRE4gMzAuVTgKK2RUQ29lZmYyMCAgICAgICBETiAzMS5VOAorZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCitxU3JjQTAxICAgICAgICAgUU4gMC5VOAorcVNyY0IyMyAgICAgICAgIFFOIDEuVTgKK3FTcmNDNDUgICAgICAgICBRTiAyLlU4CitxU3JjRDY3ICAgICAgICAgUU4gMy5VOAorcVNyY0U4OSAgICAgICAgIFFOIDQuVTgKK3FTcmNGMTAxMSAgICAgICBRTiA1LlU4CitxU3JjRzEyMTMgICAgICAgUU4gNi5VOAorcVNyY0gxNDE1ICAgICAgIFFOIDcuVTgKK3FTcmNJMTYxNyAgICAgICBRTiA4LlU4CisKK2RTcmNBMCAgICAgICAgICBETiAwLlU4CitkU3JjQjIgICAgICAgICAgRE4gMi5VOAorZFNyY0M0ICAgICAgICAgIEROIDQuVTgKK2RTcmNENiAgICAgICAgICBETiA2LlU4CitkU3JjRTggICAgICAgICAgRE4gOC5VOAorZFNyY0YxMCAgICAgICAgIEROIDEwLlU4CitkU3JjRzEyICAgICAgICAgRE4gMTIuVTgKK2RTcmNIMTQgICAgICAgICBETiAxNC5VOAorZFNyY0kxNiAgICAgICAgIEROIDE2LlU4CisKK2RTcmNBMSAgICAgICAgICBETiAxLlU4CitkU3JjQjMgICAgICAgICAgRE4gMy5VOAorZFNyY0M1ICAgICAgICAgIEROIDUuVTgKK2RTcmNENyAgICAgICAgICBETiA3LlU4CitkU3JjRTkgICAgICAgICAgRE4gOS5VOAorZFNyY0YxMSAgICAgICAgIEROIDExLlU4CitkU3JjRzEzICAgICAgICAgRE4gMTMuVTgKK2RTcmNIMTUgICAgICAgICBETiAxNS5VOAorZFNyY0kxNyAgICAgICAgIEROIDE3LlU4CisKK3FUZW1wUDAxICAgICAgICBRTiA5LlMxNgorcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgorcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgorcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgorCitxVGVtcFAyMyAgICAgICAgUU4gMC5TMTYKK3FUZW1wUTIzICAgICAgICBRTiAxLlMxNgorcVRlbXBSMjMgICAgICAgIFFOIDIuUzE2CitxVGVtcFMyMyAgICAgICAgUU4gMy5TMTYKKworZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgorZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgorZFRlbXBQMiAgICAgICAgIEROIDAuUzE2CisKK2RUZW1wUTAgICAgICAgICBETiAyMC5TMTYKK2RUZW1wUTEgICAgICAgICBETiAyMS5TMTYKK2RUZW1wUTIgICAgICAgICBETiAyLlMxNgorCitkVGVtcFIwICAgICAgICAgRE4gMjIuUzE2CitkVGVtcFIxICAgICAgICAgRE4gMjMuUzE2CitkVGVtcFIyICAgICAgICAgRE4gNC5TMTYKKworZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgorZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgorZFRlbXBTMiAgICAgICAgIEROIDYuUzE2CisgCitkVGVtcEIwICAgICAgICAgRE4gMjYuUzE2CitkVGVtcEMwICAgICAgICAgRE4gMjcuUzE2CitkVGVtcEQwICAgICAgICAgRE4gMjguUzE2CitkVGVtcEYwICAgICAgICAgRE4gMjkuUzE2CisKK2RUZW1wQWNjMCAgICAgICBETiAwLlUxNgorZFRlbXBBY2MxICAgICAgIEROIDIuVTE2CitkVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKK2RUZW1wQWNjMyAgICAgICBETiA2LlUxNgorCitkQWNjMCAgICAgICAgICAgRE4gMC5VOAorZEFjYzEgICAgICAgICAgIEROIDIuVTgKK2RBY2MyICAgICAgICAgICBETiA0LlU4CitkQWNjMyAgICAgICAgICAgRE4gNi5VOAorCitxQWNjMCAgICAgICAgICAgUU4gMC5TMzIKK3FBY2MxICAgICAgICAgICBRTiAxLlMzMgorcUFjYzIgICAgICAgICAgIFFOIDIuUzMyCitxQWNjMyAgICAgICAgICAgUU4gMy5TMzIKKworcVRBY2MwICAgICAgICAgIFFOIDAuVTE2CitxVEFjYzEgICAgICAgICAgUU4gMS5VMTYKK3FUQWNjMiAgICAgICAgICBRTiAyLlUxNgorcVRBY2MzICAgICAgICAgIFFOIDMuVTE2ICAgICAgICAgICAgICAgIAorCitxVG1wICAgICAgICAgICAgUU4gNC5TMTYKK2RUbXAgICAgICAgICAgICBETiA4LlMxNgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFthMCBhMSBhMiBhMyAuLiBhMTVdICAgCisgICAgICAgIEFERCAgICAgICAgIHIxMiwgcFNyYywgc3JjU3RlcCwgTFNMICMyCisgICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmY1LCAjNQorICAgICAgICBWTU9WICAgICAgICBkVENvZWZmMjAsICMyMAorICAgICAgICBWTEQxICAgICAgICBxU3JjRjEwMTEsIFtyMTJdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMjMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLiBiMTVdCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRzEyMTMsIFtyMTJdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUDAxLCBkU3JjQTAsIGRTcmNGMTAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjQzQ1LCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gYzE1XQorICAgICAgICBWQURETCAgICAgICBxVGVtcFAyMywgZFNyY0ExLCBkU3JjRjExICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNENjcsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxVGVtcFEwMSwgZFNyY0IyLCBkU3JjRzEyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjRTg5LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvL3QwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjQzQsIGRUQ29lZmYyMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0gxNDE1LCBbcjEyXSwgc3JjU3RlcAorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjQzUsIGRUQ29lZmYyMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0kxNjE3LCBbcjEyXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdCisgICAgICAgIAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0Q2LCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNENiwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjQjMsIGRUQ29lZmY1CisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcFIwMSwgZFNyY0M0LCBkU3JjSDE0ICAgCisgICAgICAgIAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0IyLCBkVENvZWZmNQorCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUTIzLCBkU3JjQjMsIGRTcmNHMTMgICAKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0Q3LCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNFOCwgZFRDb2VmZjIwCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNFOCwgZFRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNENywgZFRDb2VmZjIwCisKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNFOSwgZFRDb2VmZjUKKworICAgICAgICA7Ly90MQorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRTgsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0M0LCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0M1LCBkVENvZWZmNQorICAgICAgICBWQURETCAgICAgICBxVGVtcFIyMywgZFNyY0M1LCBkU3JjSDE1ICAgCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0YxMCwgZFRDb2VmZjUKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNFOSwgZFRDb2VmZjIwCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRTksIGRUQ29lZmYyMAorICAgICAgICBWQURETCAgICAgICBxVGVtcFMwMSwgZFNyY0Q2LCBkU3JjSTE2ICAgCisKKworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0Q2LCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0YxMSwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNENywgZFRDb2VmZjUKKworICAgICAgICA7Ly90MgorICAgICAgICBWQURETCAgICAgICBxVGVtcFMyMywgZFNyY0Q3LCBkU3JjSTE3ICAgCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRjEwLCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNHMTIsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRzEzLCBkVENvZWZmNQorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRjExLCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNHMTIsIGRUQ29lZmYyMAorICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMQorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0YxMSwgZFRDb2VmZjIwCisKKworICAgICAgICA7Ly90MworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0cxMywgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjRTgsIGRUQ29lZmY1CisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNFOSwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNIMTQsIGRUQ29lZmY1CisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUDEsIGRUZW1wUDIsICMxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjSDE1LCBkVENvZWZmNQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzAsIGRUZW1wUDAsIGRUZW1wRjAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICA7Ly9oIAorICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQorICAgICAgICAKKyAgICAgICAgOy8vIHJlczAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBQMQorICAgICAgICBWTUxBTCAgICAgICBxQWNjMCwgZFRlbXBDMCwgZENvZWZmMjAKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBRMSwgZFRlbXBRMiwgIzEKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzAsIGRUZW1wQjAsIGRDb2VmZjUKKworICAgICAgICA7Ly8gcmVzMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFEwLCBkVGVtcFExLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMSwgZFRlbXBRMCwgZFRlbXBGMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUTEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzEsIGRUZW1wQzAsIGRDb2VmZjIwCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUjEsIGRUZW1wUjIsICMxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyLCBkVGVtcFIwLCBkVGVtcEYwCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MxLCBkVGVtcEIwLCBkQ29lZmY1Cis7ICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIAorICAgICAgICA7Ly8gcmVzMgorICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVG1wLCBkVGVtcFIxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCisgICAgICAgIFZNTEFMICAgICAgIHFBY2MyLCBkVGVtcEMwLCBkQ29lZmYyMAorOyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBSMQorICAgICAgICAKKyAgICAgICAgOy8vIHJlczMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBTMSwgZFRlbXBTMiwgIzEKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAorICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFMwLCBkVGVtcFMxLCAjMQorICAgICAgICBWQURETCAgICAgICBxQWNjMywgZFRlbXBTMCwgZFRlbXBGMAorICAgICAgICBWTUxTTCAgICAgICBxQWNjMiwgZFRlbXBCMCwgZENvZWZmNQorICAgICAgICBWTUxBTCAgICAgICBxQWNjMywgZFRlbXBDMCwgZENvZWZmMjAKKyAgICAgICAgVkFERCAgICAgICAgZFRtcCwgZFRtcCwgZFRlbXBTMQorICAgICAgICBWTUxTTCAgICAgICBxQWNjMywgZFRtcCwgZENvZWZmNQorICAgICAgICAgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMSwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMiwgcUFjYzIsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2MzLCAjMTAKKworICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgorICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisgICAgCisgICAgCisgICAgCisKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFiZThhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjI4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorCitERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KKworICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCitxU3JjQTAxICAgICAgICAgUU4gMTEuVTgKK3FTcmNCMDEgICAgICAgICBRTiAxMi5VOAorcVNyY0MwMSAgICAgICAgIFFOIDEzLlU4CitxU3JjRDAxICAgICAgICAgUU4gMTQuVTgKKworZFNyY0EwICAgICAgICAgIEROIDIyLlU4CitkU3JjQTEgICAgICAgICAgRE4gMjMuVTgKK2RTcmNCMCAgICAgICAgICBETiAyNC5VOAorZFNyY0IxICAgICAgICAgIEROIDI1LlU4CitkU3JjQzAgICAgICAgICAgRE4gMjYuVTgKK2RTcmNDMSAgICAgICAgICBETiAyNy5VOAorZFNyY0QwICAgICAgICAgIEROIDI4LlU4CitkU3JjRDEgICAgICAgICAgRE4gMjkuVTgKKworZFNyY2IgICAgICAgICAgIEROIDEyLlU4CitkU3JjZSAgICAgICAgICAgRE4gMTMuVTgKK2RTcmNmICAgICAgICAgICBETiAxMC5VOAorCitkU3JjMGMgICAgICAgICAgRE4gMTQuVTgKK2RTcmMxYyAgICAgICAgICBETiAxNi5VOAorZFNyYzJjICAgICAgICAgIEROIDE4LlU4CitkU3JjM2MgICAgICAgICAgRE4gMjAuVTgKKyAgICAgICAgICAgICAgICAgICAKK2RTcmMwZCAgICAgICAgICBETiAxNS5VOAorZFNyYzFkICAgICAgICAgIEROIDE3LlU4CitkU3JjMmQgICAgICAgICAgRE4gMTkuVTgKK2RTcmMzZCAgICAgICAgICBETiAyMS5VOAorCitxVGVtcDAxICAgICAgICAgUU4gNC5TMTYKK3FUZW1wMjMgICAgICAgICBRTiA2LlMxNgorZFRlbXAwICAgICAgICAgIEROIDguUzE2CitkVGVtcDIgICAgICAgICAgRE4gMTIuUzE2CisKK3FSZXMwMSAgICAgICAgICBRTiAxMS5TMTYKK3FSZXMyMyAgICAgICAgICBRTiAxMi5TMTYKK3FSZXM0NSAgICAgICAgICBRTiAxMy5TMTYKK3FSZXM2NyAgICAgICAgICBRTiAxNC5TMTYKKworZFJlczAgICAgICAgICAgIEROIDIyLlMxNgorZFJlczIgICAgICAgICAgIEROIDI0LlMxNgorZFJlczQgICAgICAgICAgIEROIDI2LlMxNgorZFJlczYgICAgICAgICAgIEROIDI4LlMxNgorCitkQWNjMCAgICAgICAgICAgRE4gMjIuVTgKK2RBY2MyICAgICAgICAgICBETiAyNC5VOAorZEFjYzQgICAgICAgICAgIEROIDI2LlU4CitkQWNjNiAgICAgICAgICAgRE4gMjguVTgKKworZFJlc3VsdDAgICAgICAgIEROIDIyLlUzMgorZFJlc3VsdDIgICAgICAgIEROIDI0LlUzMgorZFJlc3VsdDQgICAgICAgIEROIDI2LlUzMgorZFJlc3VsdDYgICAgICAgIEROIDI4LlUzMgorCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBBIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0EwLCBkU3JjQTEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNBMCwgZFNyY0ExLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCis7ICAgICAgICBWTEQxICAgICAgICBxU3JjQjAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQiByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMwYywgZFNyY0EwLCBkU3JjQTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMwZCwgZFNyY0EwLCBkU3JjQTEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQTAsIGRTcmNBMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczAxLCBkU3JjQTAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMwYywgZFNyYzBkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEIgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0MwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEMgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgICAgICAgICAgCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1IDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0IwLCBkU3JjQjEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNCMCwgZFNyY0IxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMxYywgZFNyY0IwLCBkU3JjQjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMxZCwgZFNyY0IwLCBkU3JjQjEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjQjAsIGRTcmNCMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczIzLCBkU3JjQjAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVGVtcDAgICAgOy8vIFRlUmkKKworICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMWMsIGRTcmMxZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNDMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBDIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0gICAgICAgICAgIAorOyAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCisgICAgICAgIAorICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSA7Ly8gVGVSaQorCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQzAsIGRTcmNDMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0MwLCBkU3JjQzEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzJjLCBkU3JjQzAsIGRTcmNDMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzJkLCBkU3JjQzAsIGRTcmNDMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNDMCwgZFNyY0MxLCAjNAorICAgICAgICBWQURETCAgICAgICBxUmVzNDUsIGRTcmNDMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRlbXAwICA7Ly8gVGVSaQorICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzJjLCBkU3JjMmQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0QwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEQgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczQsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM0LCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkgVGVSaQorICAgICAgICAKKworICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyY0QwLCBkU3JjRDEsICM1ICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmNEMCwgZFNyY0QxLCAjMSAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMzYywgZFNyY0QwLCBkU3JjRDEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmMzZCwgZFNyY0QwLCBkU3JjRDEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjRDAsIGRTcmNEMSwgIzQKKyAgICAgICAgVkFEREwgICAgICAgcVJlczY3LCBkU3JjRDAsIGRTcmNmICAgICAgIDsvLyBBY2M9YStmCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVGVtcDAgOy8vIFRlUmkKKworICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjM2MsIGRTcmMzZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczYsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MwLCBxUmVzMDEsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxUmVzMjMsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2M0LCBxUmVzNDUsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2M2LCBxUmVzNjcsICM1ICAgICAgICAgICA7Ly8gQWNjID0gU2F0ICgoQWNjICsgMTYpIC8gMzIpCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisKKworICAgIEVORAorICAgIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5YzkwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDEzNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKworICAgIElGIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlLCByMTEKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworCitUZW1wICAgICAgICAgICAgUk4gMTIKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKKworZFNyYzAgICAgICAgICAgIEROIDcuVTgKK2RTcmMxICAgICAgICAgICBETiA4LlU4CitkU3JjMiAgICAgICAgICAgRE4gOS5VOAorZFNyYzMgICAgICAgICAgIEROIDEwLlU4CitkU3JjNCAgICAgICAgICAgRE4gMTEuVTgKK2RTcmM1ICAgICAgICAgICBETiAxMi5VOAorZFNyYzYgICAgICAgICAgIEROIDEzLlU4CitkU3JjNyAgICAgICAgICAgRE4gMTQuVTgKK2RTcmM4ICAgICAgICAgICBETiAxNS5VOAorCitxU3VtQkUwMSAgICAgICAgUU4gOC5TMTYKK3FTdW1DRDAxICAgICAgICBRTiA5LlMxNgorZFN1bUJFMCAgICAgICAgIEROIDE2LlMxNgorZFN1bUNEMCAgICAgICAgIEROIDE4LlMxNgorCitxQWNjMDEgICAgICAgICAgUU4gMC5TMTYKK3FBY2MyMyAgICAgICAgICBRTiAxLlMxNgorcUFjYzQ1ICAgICAgICAgIFFOIDIuUzE2CitxQWNjNjcgICAgICAgICAgUU4gMy5TMTYKKworZFJlczAgICAgICAgICAgIEROIDAuUzE2CitkUmVzMSAgICAgICAgICAgRE4gMi5TMTYKK2RSZXMyICAgICAgICAgICBETiA0LlMxNgorZFJlczMgICAgICAgICAgIEROIDYuUzE2CisKK2RBY2MwICAgICAgICAgICBETiAwLlU4CitkQWNjMSAgICAgICAgICAgRE4gMi5VOAorZEFjYzIgICAgICAgICAgIEROIDQuVTgKK2RBY2MzICAgICAgICAgICBETiA2LlU4ICAgICAgICAKKyAgICAgICAgCisKK2RUbXAwICAgICAgICAgICBETiAyMC5TMTYKK2RUbXAxICAgICAgICAgICBETiAyMS5TMTYKK2RUbXAyICAgICAgICAgICBETiAyMi5TMTYKK2RUbXAzICAgICAgICAgICBETiAyMy5TMTYKKworCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi4gXSAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMyCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi4gXQorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM1LCBbVGVtcF0sIHNyY1N0ZXAgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gXQorICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRTcmMwLCBkU3JjNSAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBkU3JjNCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMxLCBkU3JjNCAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzIsIGRTcmMzICAgICA7Ly8gYytkICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQorICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKzsgICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICAKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMyLCBkU3JjNSAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzMsIGRTcmM0ICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFBY2MyMywgZFNyYzEsIGRTcmM2ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczEsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKQorOyAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisKKzsgICAgICAgIFZMRDEgICAgICAgIGRTcmM3LCBbVGVtcF0sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmMzLCBkU3JjNiAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzQsIGRTcmM1ICAgICA7Ly8gYytkCisgICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFNyYzIsIGRTcmM3ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCis7ICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzgsIFtUZW1wXSwgc3JjU3RlcCAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFMDEsIGRTcmM0LCBkU3JjNyAgICAgOy8vIGIrZQorICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRTcmMzLCBkU3JjOCAgICAgICA7Ly8gQWNjID0gYStmCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNSwgZFNyYzYgICAgIDsvLyBjK2QKKyAgICAgICAgVk1MUyAgICAgICAgZFJlczMsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAKKyAgICAgICAgVkFERCAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMQorICAgICAgICBWQUREICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAyCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNVUwgICAgICAgIGRUbXAzLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZBREQgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDMKKworICAgICAgICBWUVJTSFJVTiAgICBkQWNjMCwgcUFjYzAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MxLCBxQWNjMjMsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFBY2M0NSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMywgcUFjYzY3LCAjNSAgICAgICAgCisKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorCisgICAgCisgICAgCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMGVjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpAQCAtMCwwICsxLDMxOCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybyAgICAgIAorICAgIAorICAgIERDRCAgIFdpZHRoSXMyTVZJc05vdFplcm8sIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICBEQ0QgICBXaWR0aElzNE1WSXNOb3RaZXJvLCBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgRENEICAgV2lkdGhJczhNVklzTm90WmVybworICAgIAorICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8gICAgICAKKyAgICAKKyAgICBEQ0QgICBXaWR0aElzMk1WSXNaZXJvLCBXaWR0aElzMk1WSXNaZXJvCisgICAgRENEICAgV2lkdGhJczRNVklzWmVybywgV2lkdGhJczRNVklzWmVybworICAgIERDRCAgIFdpZHRoSXM4TVZJc1plcm8KKyAgICAKKyAgICAKKzsvLyBpbnB1dCByZWdpc3RlcnMKKworcFNyYyAgICAgICAgICAgICAgICAgUk4gMAoraVNyY1N0ZXAgICAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgoraURzdFN0ZXAgICAgICAgICAgICAgUk4gMworaVdpZHRoICAgICAgICAgICAgICAgUk4gNAoraUhlaWdodCAgICAgICAgICAgICAgUk4gNQorZHggICAgICAgICAgICAgICAgICAgUk4gNgorZHkgICAgICAgICAgICAgICAgICAgUk4gNworCis7Ly8gbG9jYWwgdmFyaWFibGUgcmVnaXN0ZXJzCitwYyAgICAgICAgICAgICAgICAgICBSTiAxNQorcmV0dXJuICAgICAgICAgICAgICAgUk4gMAorRWlnaHRNaW51c2R4ICAgICAgICAgUk4gOCAKK0VpZ2h0TWludXNkeSAgICAgICAgIFJOIDkKKworQUNvZWZmICAgICAgICAgICAgICAgUk4gMTIKK0JDb2VmZiAgICAgICAgICAgICAgIFJOIDkKK0NDb2VmZiAgICAgICAgICAgICAgIFJOIDgKK0RDb2VmZiAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgUk4gMTEKKworU3RlcDEgICAgICAgICAgICAgICAgUk4gMTAKK1NyY1N0ZXBNaW51czEgICAgICAgIFJOIDE0CisKK2RBQ29lZmYgICAgICAgICAgICAgIEROIEQxMi5VOAorZEJDb2VmZiAgICAgICAgICAgICAgRE4gRDEzLlU4CitkQ0NvZWZmICAgICAgICAgICAgICBETiBEMTQuVTgKK2REQ29lZmYgICAgICAgICAgICAgIEROIEQxNS5VOAorCitkUm93MGEgICAgICAgICAgICAgICBETiBEMC5VOAorZFJvdzBiICAgICAgICAgICAgICAgRE4gRDEuVTgKK2RSb3cxYSAgICAgICAgICAgICAgIEROIEQyLlU4CitkUm93MWIgICAgICAgICAgICAgICBETiBEMy5VOAorCitxUm93MGEgICAgICAgICAgICAgICBRTiBRMi5TMTYKK3FSb3cwYiAgICAgICAgICAgICAgIFFOIFEzLlMxNgorCis7Ly9kSW5kZXggICAgICAgICAgICAgICBETiAgICBEMTYuVTggICAgICAgICAgICAgICAgIAorcVJvdzFhICAgICAgICAgICAgICAgUU4gUTExLlMxNgorcVJvdzFiICAgICAgICAgICAgICAgUU4gUTEyLlMxNgorCitkUm93MmEgICAgICAgICAgICAgICBETiBEMTYuVTgKK2RSb3cyYiAgICAgICAgICAgICAgIEROIEQxNy5VOAorZFJvdzNhICAgICAgICAgICAgICAgRE4gRDE4LlU4CitkUm93M2IgICAgICAgICAgICAgICBETiBEMTkuVTgKKworcU91dFJvdzIgICAgICAgICAgICAgUU4gUTExLlUxNgorcU91dFJvdzMgICAgICAgICAgICAgUU4gUTEyLlUxNgorZE91dFJvdzIgICAgICAgICAgICAgRE4gRDIwLlU4CitkT3V0Um93MyAgICAgICAgICAgICBETiBEMjEuVTgKK2RPdXRSb3cyVTY0ICAgICAgICAgIEROIEQyMC5VNjQKK2RPdXRSb3czVTY0ICAgICAgICAgIEROIEQyMS5VNjQKKworcU91dFJvdzAgICAgICAgICAgICAgUU4gUTIuVTE2CitxT3V0Um93MSAgICAgICAgICAgICBRTiBRMy5VMTYKK2RPdXRSb3cwICAgICAgICAgICAgIEROIEQ4LlU4CitkT3V0Um93MSAgICAgICAgICAgICBETiBEOS5VOAorCitkT3V0Um93MFU2NCAgICAgICAgICBETiBEOC5VNjQKK2RPdXRSb3cxVTY0ICAgICAgICAgIEROIEQ5LlU2NAorCitkT3V0Um93MFUzMiAgICAgICAgICBETiBEOC5VMzIKK2RPdXRSb3cxVTMyICAgICAgICAgIEROIEQ5LlUzMgorCitkT3V0Um93MFUxNiAgICAgICAgICBETiBEOC5VMTYKK2RPdXRSb3cxVTE2ICAgICAgICAgIEROIEQ5LlUxNgorCisKK2RPdXQwVTY0ICAgICAgICAgICAgIEROIEQwLlU2NAorZE91dDFVNjQgICAgICAgICAgICAgRE4gRDEuVTY0CisKK2RPdXQwMFUzMiAgICAgICAgICAgIEROIEQwLlUzMgorZE91dDAxVTMyICAgICAgICAgICAgRE4gRDEuVTMyCitkT3V0MTBVMzIgICAgICAgICAgICBETiBEMi5VMzIKK2RPdXQxMVUzMiAgICAgICAgICAgIEROIEQzLlUzMgorCitkT3V0MFUxNiAgICAgICAgICAgICBETiBEMC5VMTYKK2RPdXQxVTE2ICAgICAgICAgICAgIEROIEQxLlUxNgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIFdpZHRoLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICBIZWlnaHQsICAgICA0CisgICAgICAgIE1fQVJHICAgRHgsICAgICAgICAgNAorICAgICAgICBNX0FSRyAgIER5LCAgICAgICAgIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBNX0xEUkQgICBkeCwgZHksIER4CisgICAgICAgIE1fTERSRCAgIGlXaWR0aCwgaUhlaWdodCwgV2lkdGgKKyAgICAgICAgCisgICAgICAgIDsvLyBFaWdodE1pbnVzZHggPSA4IC0gZHgKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeSA9IDggLSBkeQorICAgICAgICAKKyAgICAgICAgOy8vIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHkKKyAgICAgICAgOy8vIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5CisgICAgICAgIDsvLyBEQ29lZmYgPSBkeCAqIGR5CisgICAgICAgIAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAorICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4CisgICAgICAgIENNTiAgICAgZHgsZHkKKyAgICAgICAgTU9WICAgICBTdGVwMSwgIzEKKyAgICAgICAgTERSRVEgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybworICAgICAgICBTVUIgICAgIFNyY1N0ZXBNaW51czEsIGlTcmNTdGVwLCBTdGVwMQorICAgICAgICBMRFJORSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvCisgICAgICAgIAorICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgICAgICAgICA7Ly8gMGEKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgQUNvZWZmLCBFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBTTVVMQkIgIEJDb2VmZiwgZHgsIEVpZ2h0TWludXNkeQorICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgICAgICAgICA7Ly8gMGIKKyAgICAgICAgU01VTEJCICBDQ29lZmYsIEVpZ2h0TWludXNkeCwgZHkKKyAgICAgICAgU01VTEJCICBEQ29lZmYsIGR4LCBkeQorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkQUNvZWZmLCBBQ29lZmYKKyAgICAgICAgVkRVUCAgICBkQkNvZWZmLCBCQ29lZmYKKyAgICAgICAgVkRVUCAgICBkQ0NvZWZmLCBDQ29lZmYKKyAgICAgICAgVkRVUCAgICBkRENvZWZmLCBEQ29lZmYKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcGMsIFtwVGFibGUsIGlXaWR0aCwgTFNMICMxXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gaVdpZHRoCisgICAgICAgIAorOy8vIFBpeGVsIGxheW91dDoKKzsvLworOy8vICAgeDAwIHgwMSB4MDIKKzsvLyAgIHgxMCB4MTEgeDEyCis7Ly8gICB4MjAgeDIxIHgyMgorCis7Ly8gSWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkKK1dpZHRoSXM4TVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMWEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDFiCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAyYQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMmIKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFhLCBkUm93MmEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDNhCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzJiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYiwgZFJvdzNhLCBkQUNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAzYgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMGEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93M2IsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2EsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDBiCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICM0CisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBiLCBkRENvZWZmCisKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cyLCBxT3V0Um93MiwgIzYKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3czLCBxT3V0Um93MywgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MlU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93M1U2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXM0TVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisKK1dpZHRoSXMyTVZJc05vdFplcm8KKworICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCisgICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2CisgICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwICAKKworICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzTm90WmVybyAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorOy8vIElmIGZyYWN0aW9ubCBtdiBpcyAoMCwgMCkKK1dpZHRoSXM4TVZJc1plcm8KKyAgICAgICAgICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVwCisKK1dpZHRoSXM4TG9vcE1WSXNaZXJvCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KKworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKworV2lkdGhJczRNVklzWmVybyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc1plcm8gCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorICAgICAgICAgICAgICAgIAorV2lkdGhJczJNVklzWmVybyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNaZXJvIAorICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE1fRU5ECisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVORAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZTI2NDJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpAQCAtMCwwICsxLDc0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIHF1YW50aXphdGlvbiB0YWJsZXMKKzsvLyAKKzsvLyAKKworICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZSAgCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKKyAgICAgICAgIERDQiAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2CisgICAgICAgICBEQ0IgMTcsIDE3LCAxNywgMTcsIDE3LCAxNworICAgICAgICAgRENCIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgKKyAgICAgICAgIERDQiAxOSwgMTksIDE5LCAxOSwgMTksIDE5CisgICAgICAgICBEQ0IgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMAorICAgICAgICAgRENCIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEKKyAgICAgICAgIERDQiAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyCisgICAgICAgICBEQ0IgMjMsIDIzLCAyMywgMjMsIDIzLCAyMworICAgICAgICAgRENCIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlLCAyCisgICAgICAgICBEQ0QgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NQorICAgICAgICAgRENEIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAKKyAgICAgICAgIERDRCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxCisgICAgICAgICBEQ0QgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MgorICAgICAgICAgRENEIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUKKyAgICAgICAgIERDRCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwCisgICAgICAgICBEQ0QgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMSwgMTM5ODEwMQorICAgICAgICAgRENEIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIsIDI3OTYyMDIKKyAgICAgICAgIERDRCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1LCA1NTkyNDA1ICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEVORAorICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU5YzMzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKQEAgLTAsMCArMSwxODYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCis7Ly8gCis7Ly8gCisKKyAgICAgICAgCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKzsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisgICAgCisKKworCisKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBDb3J0ZXhBOAorCis7Ly8gQVJNIFJlZ2lzdGVycworICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwRHN0ICAgICAgICAgICAgICAgIFJOICAwCitwU3JjICAgICAgICAgICAgICAgIFJOICAxCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisgICAgICAKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCitkSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCitkWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKK2RlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2CitkSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKK3FmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCitkZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2CisKKzsvLyBPdXRwdXQgcGl4ZWxzCitkaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQsICxkOAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIHRyYW5zcG9zZWQgZm9ybQorICAgICAgICAKKyAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BTcmNdCisgICAgICAgIAorICAgICAgICBWTU9WICAgIGRaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkZjAsZGYxCisgICAgICAgIFZUUk4gICAgZGYyLGRmMworICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGcwLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRnMSxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkZjFSUyxkZjEsZFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZGYzUlMsZGYzLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRnMixkZjFSUyxkZjMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRnMyxkZjEsZGYzUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkaDAsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkaDEsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkaDIsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkaDMsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWU1QxICAge2RoMCxkaDEsZGgyLGRoM30sW3BEc3RdCisgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorRW5kICAgICAgICAgICAgICAgIAorCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ29ydGV4QTggICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjNTJlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCkBAIC0wLDAgKzEsOTIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKworICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIElGIEFSTTExMzZKUworICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCitwRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKK0ZsYWcgICAgICAgICAgICBSTiAzICAgIAorVmFsdWUgICAgICAgICAgIFJOIDQgICAgCitWYWx1ZTIgICAgICAgICAgUk4gNSAgICAKK3N0ck9mZnNldCAgICAgICBSTiA2ICAgIAorY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYworICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKKyAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisgICAgICAgIAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCisgICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKKyAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAorICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCisgICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKKyAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQorICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDBkNGQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKKyAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQorICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOworICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgorICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgorICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCisgICAgY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOworCisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxOTM2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jaworICooMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAorICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCisgKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KKyAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCisgKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAorICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAorCWNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU4NzFiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKKyAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KKyAqCQkJCQkJCQlidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKKyAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCisgKQorCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyOWU1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDY4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gCisgKiBJbnZlcnNlIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCAKKyAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgemlnemFnIG9yZGVyIGluc3RlYWQgCisgKiBvZiBwb3NpdGlvbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jaworICogW2luXQlzVkxDU2VsZWN0CQlWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gbnVtYmVyIG9mIG5vbi16ZXJvCisgKgkJCQkJCQkJQUMgY29lZmZpY2llbnRzIG9mIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuIEl0IGlzIAorICoJCQkJCQkJCWVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCAKKyAqCQkJCQkJCQl0YWJsZSA5LTUsIGV4Y2VwdCBpdHMgdmFsdWUgY2Fuoa90IGJlIGxlc3MgdGhhbiB6ZXJvLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKKyAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKQoreworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIHNWTENTZWxlY3QsIHNNYXhOdW1Db2VmZik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODVhNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwpAQCAtMCwwICsxLDM5NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCisgICAgICAgIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCis7Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKKyAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorIAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisKKworCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisgICAgCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAKKworOy8vIEFSTSBSZWdpc3RlcnMKKworOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICBSTiAgMAorcFByZWQgICAgICAgUk4gIDEKK3BEQyAgICAgICAgIFJOICAyCitwRHN0ICAgICAgICBSTiAgMworICAgCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgIFJOICAwCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCisKKzsvL1JlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorcFFQZGl2ICAgICAgUk4gIDEwCitwUVBtb2QgICAgICBSTiAgMTEKK3BWUm93ICAgICAgIFJOICAyCitRUG1vZCAgICAgICBSTiAgMTIKK3NoaWZ0ICAgICAgIFJOICAxNAoraW5kZXgwICAgICAgUk4gIDEgCitpbmRleDEgICAgICBSTiAgMTAgCisKKzsvL1JlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCitwRGVsdGEgICAgICBSTiAgNAorcERlbHRhVG1wICAgUk4gIDYKK0FDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjaworcFByZWRUZW1wICAgUk4gIDcKK3BEQ1RlbXAgICAgIFJOICA4CitwRHN0VGVtcCAgICBSTiAgOQorcERlbHRhQXJnMSAgUk4gIDEKK3BEZWx0YUFyZzAgIFJOICAwCitRUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKK0RDdmFsICAgICAgIFJOICAxMCAgCitwcmVkc3RlcCAgICBSTiAgMQorZHN0U3RlcCAgICAgUk4gIDEwCitQcmVkVmFsMSAgICBSTiAgMworUHJlZFZhbDIgICAgUk4gIDUKKworCisKKworOy8vIE5lb24gUmVnaXN0ZXJzCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKworZFZtYXRyaXggICAgICAgICAgICBETiAgRDYuOCAgCitkaW5kZXhSb3cwICAgICAgICAgIEROICBENy4zMiAKK2RpbmRleFJvdzEgICAgICAgICAgRE4gIEQ5LjMyIAorZEJ5dGVJbmRleFJvdzAgICAgICBETiAgRDcuOAorZEJ5dGVJbmRleFJvdzEgICAgICBETiAgRDkuOAorZFZSb3cwICAgICAgICAgICAgICBETiAgRDguOCAgCitkVlJvdzEgICAgICAgICAgICAgIEROICBENC44CitkVlJvdzBVMTYgICAgICAgICAgIEROICBEOC5VMTYKK2RWUm93MVUxNiAgICAgICAgICAgRE4gIEQ0LlUxNgorZFZSb3cyVTE2ICAgICAgICAgICBETiAgRDguVTE2CitkVlJvdzNVMTYgICAgICAgICAgIEROICBENC5VMTYKKworZFNoaWZ0ICAgICAgICAgICAgICBETiAgRDUuVTE2CitkU3JjUm93MCAgICAgICAgICAgIEROICBEMC5JMTYKK2RTcmNSb3cxICAgICAgICAgICAgRE4gIEQxLkkxNgorZFNyY1JvdzIgICAgICAgICAgICBETiAgRDIuSTE2ICAgIAorZFNyY1JvdzMgICAgICAgICAgICBETiAgRDMuSTE2CitkRHFudFJvdzAgICAgICAgICAgIEROICBEMC5JMTYgIAorZERxbnRSb3cxICAgICAgICAgICBETiAgRDEuSTE2IAorZERxbnRSb3cyICAgICAgICAgICBETiAgRDIuSTE2IAorZERxbnRSb3czICAgICAgICAgICBETiAgRDMuSTE2ICAKKworOy8vIFJlZ2lzdGVycyB1c2VkIGluIFRyYW5zZm9ybVJlc2lkdWFsNHg0CisKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCitkSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCitkSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FJbjAxICAgICAgICAgICAgICAgUU4gIFEwLjMyCitxSW4yMyAgICAgICAgICAgICAgIFFOICBRMS4zMgorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKK2RaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgorZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKK2RJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgorcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKK2RnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKKworOy8vIE91dHB1dCBwaXhlbHMKK2RoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAKKworOy8vIFJlZ2lzdGVycyB1c2VkIGluIERlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCisKK2REZWx0YVJvdzAgICAgICAgICAgRE4gIEQwLlMxNgorZERlbHRhUm93MSAgICAgICAgICBETiAgRDEuUzE2CitkRGVsdGFSb3cyICAgICAgICAgIEROICBEMi5TMTYKK2REZWx0YVJvdzMgICAgICAgICAgRE4gIEQzLlMxNgorcURlbHRhUm93MDEgICAgICAgICBRTiAgUTAuUzE2CitxRGVsdGFSb3cyMyAgICAgICAgIFFOICBRMS5TMTYKKworZFByZWRWYWxSb3cwMSAgICAgICBETiAgRDQuVTgKK2RQcmVkVmFsUm93MjMgICAgICAgRE4gIEQ1LlU4CisKK3FTdW1Sb3cwMSAgICAgICAgICAgUU4gIFEzLlMxNgorcVN1bVJvdzIzICAgICAgICAgICBRTiAgUTQuUzE2CitkRHN0Um93MDEgICAgICAgICAgIEROICBEMC5VOAorZERzdFJvdzIzICAgICAgICAgICBETiAgRDEuVTgKK2REc3RSb3cwICAgICAgICAgICAgRE4gIEQwLjMyWzBdCitkRHN0Um93MSAgICAgICAgICAgIEROICBEMC4zMlsxXQorZERzdFJvdzIgICAgICAgICAgICBETiAgRDEuMzJbMF0KK2REc3RSb3czICAgICAgICAgICAgRE4gIEQxLjMyWzFdCisgICAgCisgICAgICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIE1fQUxMT0M4IHBCdWZmZXIsIDMyCisgICAgICAgICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLHIxMSxkOQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcmVkU3RlcE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBkc3RTdGVwT25TdGFjayw0CisgICAgICAgIE1fQVJHICAgUVBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgQUNPblN0YWNrLDQKKyAgCisgICAgICAgIAorICAgICAgICBNX0FEUiAgIHBEZWx0YSxwQnVmZmVyIAorICAgICAgICBNX0xEUiAgIEFDLEFDT25TdGFjayAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHIxLHIyLHIzIGJlZm9yZSBmdW5jdGlvbiBjYWxsICAgIAorICAgICAgICBNT1YgICAgIHBQcmVkVGVtcCxwUHJlZAorICAgICAgICBNT1YgICAgIHBEQ1RlbXAscERDCisgICAgICAgIE1PViAgICAgcERzdFRlbXAscERzdAorICAgICAgICAKKyAgICAgICAgQ01QICAgICBBQywjMAorICAgICAgICBCRVEgICAgIERDY2FzZQorICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzEscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCA6IHN0YXRpYyBmdW5jdGlvbiBpbmxpbmVkCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICBwUVBtb2QsPWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgICAgICBMRFIgICAgcFFQZGl2LD1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIAorICAgICAgICBMRFIgICAgcFZSb3csPWFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUlNCICBRUG1vZCxbcFFQbW9kLFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIChRUCU2KSAqIDYKKyAgICAgICAgTERSU0IgIHNoaWZ0LFtwUVBkaXYsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gU2hpZnQgPSBRUCAvIDYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIGluZGV4MSw9MHgwMzAyMDUwNCAKKyAgICAgICAgTERSICAgIGluZGV4MCw9MHgwNTA0MDEwMCAgICAgICAgICAgICAgICAgICA7Ly8gSW5kZXhlcyBpbnRvIGRWbWF0cml4CisgICAgICAgIEFERCAgICBwVlJvdyxwVlJvdyxRUG1vZAorICAgICAgICBWRFVQICAgZGluZGV4Um93MCxpbmRleDAgCisgICAgICAgIFZEVVAgICBkaW5kZXhSb3cxLGluZGV4MQorICAgICAgICBWRFVQICAgZFNoaWZ0LHNoaWZ0IAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWxsIDR4NCBwVlJvd1tdIHZhbHVlcworICAgICAgICBWTEQxICAgZFZtYXRyaXgsW3BWUm93XSAgICAgICAgICAgICAgICAgICAgIDsvLyBkVm1hdHJpeCA9IFswZHwwY3wwYnwwYV0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWVEJMICAgZFZSb3cwLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cwICAgICAgIDsvLyByb3cwID0gcm93MiA9IFtwVlJvd1syXSB8IHBWUm93WzBdIHwgcFZSb3dbMl0gfCBwVlJvd1swXV0KKyAgICAgICAgVlRCTCAgIGRWUm93MSxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MSAgICAgICA7Ly8gcm93MSA9IHJvdzMgPSBbcFZSb3dbMV0gfCBwVlJvd1syXSB8IHBWUm93WzFdIHwgcFZSb3dbMl1dCisgICAgICAgIENNUCAgICAgcERDVGVtcCwjMAorICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCAnc3JjJyB2YWx1ZXMgIAorICAgICAgICBWTEQxICAgeyBkU3JjUm93MCxkU3JjUm93MSxkU3JjUm93MixkU3JjUm93MyB9LFtwRGVsdGFdIAorICAgICAgICAKKyAgICAgICAgVlNITCAgIGRWUm93MFUxNixkVlJvdzBVMTYsZFNoaWZ0IAorICAgICAgICBWU0hMICAgZFZSb3cxVTE2LGRWUm93MVUxNixkU2hpZnQgCisgICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGx5IHNyY1tdIHdpdGggcFZSb3dbXQorICAgICAgICBWTVVMICAgIGREcW50Um93MCxkU3JjUm93MCxkVlJvdzBVMTYKKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzEsZFNyY1JvdzEsZFZSb3cxVTE2CisgICAgICAgIFZNVUwgICAgZERxbnRSb3cyLGRTcmNSb3cyLGRWUm93MlUxNgorICAgICAgICBWTVVMICAgIGREcW50Um93MyxkU3JjUm93MyxkVlJvdzNVMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVHJhbnNmb3JtUmVzaWR1YWw0eDQgOiBJbmxpbmVkIHRvIGF2b2lkIExvYWQvU3RvcmVzCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly9CTCAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgOy8vU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQorICAgICAgICBWTU9WTkUgICAgZEluMFswXSxEQ3ZhbAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBpbnB1dCBwaXhlbHMgOiBwZXJmb3JtIFJvdyBvcHMgYXMgQ29sIG9wcworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkSW4wLGRJbjEKKyAgICAgICAgVlRSTiAgICBkSW4yLGRJbjMKKyAgICAgICAgVlRSTiAgICBxSW4wMSxxSW4yMyAKKyAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1PViAgICBkWmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIHJpZ2h0IHNoaWZ0IGJ5IDEgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlRSTiAgICBkZjAsZGYxCisgICAgICAgIFZUUk4gICAgZGYyLGRmMworICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRnMCxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZzEsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKKyAgICAgICAgVkhBREQgICAgICAgZGYxUlMsZGYxLGRaZXJvICAgICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCisgICAgICAgIFZIQUREICAgICAgIGRmM1JTLGRmMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZzIsZGYxUlMsZGYzICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZzMsZGYxLGRmM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGgwLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGgxLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgyLGRnMSxkZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGgzLGRnMCxkZzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMywjNgorICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgIE91dERDY2FzZSAKKyAgICAgICAgCisKK0RDY2FzZQorICAgICAgICA7Ly8gQ2FsY3VsYXRlIHRoZSBUcmFuc2Zvcm1lZCBEQ3ZhbHVlIDogKERDdmFsKzMyKT4+NgorICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKKyAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCisgICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MCwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAorICAgICAgICBWRFVQICAgIGREZWx0YVJvdzEsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs0XSAgPSBwRGVsdGFbNV0gID0gcERlbHRhWzZdICA9IHBEZWx0YVs3XSA9IERDdmFsCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MiwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MywgREN2YWwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorT3V0RENjYXNlICAgICAgCisgICAgICAgIE1fTERSICAgcHJlZHN0ZXAscHJlZFN0ZXBPblN0YWNrCisgICAgICAgIE1fTERSICAgZHN0U3RlcCxkc3RTdGVwT25TdGFjaworICAgICAgICAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdLHByZWRzdGVwCisgICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cwMSxQcmVkVmFsMSxQcmVkVmFsMgorICAgICAgICAKKyAgICAgICAgTERSICAgICBQcmVkVmFsMSxbcFByZWRUZW1wXSxwcmVkc3RlcAorICAgICAgICBMRFIgICAgIFByZWRWYWwyLFtwUHJlZFRlbXBdCisgICAgICAgIFZNT1YgICAgZFByZWRWYWxSb3cyMyxQcmVkVmFsMSxQcmVkVmFsMgorIAorICAgICAgICAKKyAgICAgICAgVkFERFcgICBxU3VtUm93MDEscURlbHRhUm93MDEsZFByZWRWYWxSb3cwMQorICAgICAgICBWQUREVyAgIHFTdW1Sb3cyMyxxRGVsdGFSb3cyMyxkUHJlZFZhbFJvdzIzCisgICAgICAgIFZRTU9WVU4gZERzdFJvdzAxLHFTdW1Sb3cwMQorICAgICAgICBWUU1PVlVOIGREc3RSb3cyMyxxU3VtUm93MjMKKyAgICAgICAgCisgCisgICAgICAgIFZTVDEgICAgZERzdFJvdzAsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzEsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzIsW3BEc3RUZW1wXSxkc3RTdGVwCisgICAgICAgIFZTVDEgICAgZERzdFJvdzMsW3BEc3RUZW1wXQorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAorICAgIAorICAgICAgICAgCisgICAgICAgICAgICAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDYxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMjAyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgICAgICAKK0xPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCitNQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMworTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDcKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKK3FCUzMyMTAgICAgIFFOIFExMy5VMTYKK2RCUzMyMTAgICAgIEROIEQyNgorZE1hc2tfYnMgICAgRE4gRDI3CitkRmlsdF9icyAgICBETiBEMjYuVTE2CisKKzsvLyBiU0xUNAorZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCitkTWFza180ICAgICBETiBEMS5VMTYKKworTWFza180ICAgICAgUk4gOAorTWFza18zICAgICAgUk4gOQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIFJlc3VsdAorZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCitkUV8wdCAgICAgICBETiBEMzEuVTggICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTgKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIHI5LCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICA7bG9hZCBhbHBoYTEsYmV0YTEgc29tZXdoZXJlIHRvIGF2b2lkIG1vcmUgbG9hZHMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0hCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMSA7PworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXSEgCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKKyAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorTG9vcFkgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBiUzMyMTAsIFtwQlNdLCAjOAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgICAgICBiUzMyMTAsICMwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUV8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4CisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMCAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZE1hc2tfYnMuVTgKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfMworCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKKyAgICAgICAgCisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180CisKKyAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCisgICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icworICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKworICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VYSVQKKyAgICAgICAgCitOb0ZpbHRlckJTMAorCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU2YzFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpAQCAtMCwwICsxLDI4MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgICAgIAorTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKK01BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCitNQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAorCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMzMjEwICAgICAgUk4gNgorcFNyY0RzdF9QICAgUk4gMTAKK3BTcmNEc3RfUSAgIFJOIDEyCisKK3BUbXAgICAgICAgIFJOIDEwCitwVG1wMiAgICAgICBSTiAxMgorc3RlcCAgICAgICAgUk4gMTQKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDcKKworOy8vIFJvd3MgaW5wdXQKK2RSb3cwICAgICAgIEROIEQ3LlU4CitkUm93MSAgICAgICBETiBEOC5VOCAgCitkUm93MiAgICAgICBETiBENS5VOCAgCitkUm93MyAgICAgICBETiBEMTAuVTggIAorZFJvdzQgICAgICAgRE4gRDYuVTggIAorZFJvdzUgICAgICAgRE4gRDkuVTggIAorZFJvdzYgICAgICAgRE4gRDQuVTggCitkUm93NyAgICAgICBETiBEMTEuVTggCisKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKK3FCUzMyMTAgICAgIFFOIFExMy5VMTYKK2RCUzMyMTAgICAgIEROIEQyNgorZE1hc2tfYnMgICAgRE4gRDI3CitkRmlsdF9icyAgICBETiBEMjYuVTE2CisKKzsvLyBiU0xUNAorZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCitkTWFza180ICAgICBETiBEMS5VMTYKKworTWFza180ICAgICAgUk4gOAorTWFza18zICAgICAgUk4gOQorCitkVGVtcCAgICAgICBETiBEMTkuVTgKKworOy8vIFJlc3VsdAorZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCitkUV8wdCAgICAgICBETiBEMzEuVTggICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTgKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMiwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0CisgICAgICAgIE1fQVJHICAgcHBCUywgNAorICAgICAgICAKKyAgICAgICAgOy8vIGQwLWRBbHBoYV8wCisgICAgICAgIDsvLyBkMi1kQmV0YV8wCisKKyAgICAgICAgO2xvYWQgYWxwaGExLGJldGExIHNvbWV3aGVyZSB0byBhdm9pZCBtb3JlIGxvYWRzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdIQorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0hIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180CisgICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMworCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisgICAgICAgIDtkTWFza180LTE5CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorCisKK0xvb3BZICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgYlMzMjEwLCBbcEJTXSwgIzgKKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisgICAgICAgIAorICAgICAgICA7MQorICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cxLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MywgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQorICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQorICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQorICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQorICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQorICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQorICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQorICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQorCisgICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cwLCBkUm93MQorICAgICAgICBWWklQLjggICAgICBkUm93MiwgZFJvdzMKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzQsIGRSb3c1CisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NworCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgorICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2CisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c1LCBkUm93NworCisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAorICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQorCisKKyAgICAgICAgO1JlYWxpZ24gdGhlIHBvaW50ZXJzCisKKyAgICAgICAgQ01QICAgICAgICAgYlMzMjEwLCAjMAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUF8wLCBkUV8wCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAorCisgICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAorICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4CisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAorICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRNYXNrX2JzLlU4CisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzMKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisKKyAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKKworICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icworICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3RfUCwgcFNyY0RzdCwgIzMKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0ICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwVG1wMiwgcFNyY0RzdF9QLCBzcmNkc3RTdGVwCisgICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKKworICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMF19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bMV19LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblsyXX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblszXX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzRdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzVdfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNl19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bN119LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0X1EsIHBTcmNEc3QsICM0CisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3RfUSwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzBdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzFdfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblsyXX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wblszXX0sIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNF19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNV19LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzZdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzddfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorCisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorTm9GaWx0ZXJCUzAKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICBFTkRJRgorCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGMzZjRmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMjg4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgSUYgQ29ydGV4QTgKKworTE9PUF9DT1VOVCAgRVFVIDB4NTUwMDAwMDAKKworCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMxMCAgICAgICAgUk4gMTIKKworcEFscGhhXzAgICAgUk4gMgorcEJldGFfMCAgICAgUk4gMworCitwQWxwaGFfMSAgICBSTiA3CitwQmV0YV8xICAgICBSTiA4CisKKworCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gOQorCitwVG1wICAgICAgICBSTiA2CitzdGVwICAgICAgICBSTiAxMAorCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFBfMyAgICAgICAgRE4gRDcuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorZFFfMyAgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCis7Ly8gYlNMVDQKK2RUQzAgICAgICAgIEROIEQxOC5VOCAgIAorZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCitkVEMwMSAgICAgICBETiBEMTguVTggICAKKworZFRDcyAgICAgICAgRE4gRDMxLlM4CitkVEMgICAgICAgICBETiBEMzEuVTgKKworZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCisKK01hc2tfMCAgICAgIFJOIDExCisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorZFJwMHEwICAgICAgRE4gRDI0LlU4CisKK2RNYXhQICAgICAgIEROIEQyMy5VOAorZE1pblAgICAgICAgRE4gRDIyLlU4CisKK2RNYXhRICAgICAgIEROIEQxOS5VOAorZE1pblEgICAgICAgRE4gRDIxLlU4CisKK2REZWx0YVAgICAgIEROIEQyNi5VOAorZERlbHRhUSAgICAgRE4gRDI3LlU4CisKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUV8xbiAgICAgICBETiBEMjUuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CisKKzsvLyBiU0dFNAorCitxU3AwcTAgICAgICBRTiBRMTAuVTE2CisKK3FTcDJxMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHAxICAgIFFOIFExMi5VMTYKK3FTcDNwMiAgICAgIFFOIFExMy5VMTYKK2RIU3AwcTEgICAgIEROIEQyOC5VOAorCitxU3EycDEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBxMSAgICBRTiBRMTIuVTE2CitxU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKK2RIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQorCitxVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAorcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKKworZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKK2RQXzJuICAgICAgIEROIEQzMS5VOAorCitkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXSAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIE1PViAgICAgICAgIE1hc2tfMCwjMAorCisgICAgICAgIDtkTWFza18wLTE0CisgICAgICAgIDtkTWFza18xLTE1CisKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAorICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBzdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisKKyAgICAgICAgTERSICAgICAgICAgWFksPUxPT1BfQ09VTlQKKworICAgICAgICA7Ly8gcDAtcDMgLSBkNC1kNworICAgICAgICA7Ly8gcTAtcTMgLSBkOC1kMTEKK0xvb3BZICAgICAgICAKK0xvb3BYICAgICAgICAKKyAgICAgICAgTERSSCAgICAgICAgYlMxMCwgW3BCU10sICMyCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgQ01QICAgICAgICAgYlMxMCwgIzAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICBWTEQxICAgICAgICBkUF8zLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUF8wLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMCwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDFwMCwgZFBfMCwgZFBfMQorICAgICAgICBWTEQxICAgICAgICBkUV8xLCBbcFRtcF0KKyAgICAgICAgVkFCRCAgICAgICAgZEFwMHEwLCBkUV8wLCBkUF8wCisgICAgICAgIFZMRDEgICAgICAgIGRRXzIsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKworICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgorICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZMRDEgICAgICAgIGRRXzMsIFtwU3JjRHN0XQorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgCisgICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKK2JTTFQ0CisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCisKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4CisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKKworTm9GaWx0ZXJCUzAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzgKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLyBiUyA+PSA0IEZpbHRlcmluZworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMm4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUF8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRQXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisgICAgICAgIFZTVDEgICAgICAgIGRRXzJuLCBbcFNyY0RzdF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBUbXAsICM4CisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisKK0V4aXRMb29wWSAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2CisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyIAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorICAgICAgICBCTkUgICAgICAgICBMb29wWQorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGCisgICAgCisKKyAgICAgICAgCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZmYmIzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNDM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgICAgIAorICAgICAgICBJRiBDb3J0ZXhBOAorCitMT09QX0NPVU5UICBFUVUgMHgxMTAwMDAwMAorCisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzEwICAgICAgICBSTiAxMgorCitwQWxwaGFfMCAgICBSTiAyCitwQmV0YV8wICAgICBSTiAzCisKK3BBbHBoYV8xICAgIFJOIDcKK3BCZXRhXzEgICAgIFJOIDgKKworcFRtcCAgICAgICAgUk4gMTAKK3BUbXBTdGVwICAgIFJOIDExCisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA5CisKKzsvLyBSb3dzIGlucHV0CitkUm93MCAgICAgICBETiBENy5VOAorZFJvdzEgICAgICAgRE4gRDguVTggIAorZFJvdzIgICAgICAgRE4gRDUuVTggIAorZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKK2RSb3c0ICAgICAgIEROIEQ2LlU4ICAKK2RSb3c1ICAgICAgIEROIEQ5LlU4ICAKK2RSb3c2ICAgICAgIEROIEQ0LlU4IAorZFJvdzcgICAgICAgRE4gRDExLlU4IAorCis7Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCis7Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCisKKzsvLyBSb3dzIG91dHB1dAorZFJvd24wICAgICAgRE4gRDcuVTgKK2RSb3duMSAgICAgIEROIEQyNC5VOAorZFJvd24yICAgICAgRE4gRDMwLlU4CitkUm93bjMgICAgICBETiBEMTAuVTgKK2RSb3duNCAgICAgIEROIEQ2LlU4CitkUm93bjUgICAgICBETiBEMjUuVTgKK2RSb3duNiAgICAgIEROIEQyOS5VOAorZFJvd243ICAgICAgRE4gRDExLlU4CisKKzsvLyBkUF8wbiAgICAgICBETiBEMjkuVTgKKzsvLyBkUF8xbiAgICAgICBETiBEMzAuVTgKKzsvLyBkUF8ybiAgICAgICBETiBEMzEuVTgKKzsvLyAKKzsvLyBkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorOy8vIGRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCis7Ly8gZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKzsvLyAKKzsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KKzsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgorOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgorOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCisKK2RSb3cwbiAgICAgIEROIEQ3LlU4CitkUm93MW4gICAgICBETiBEMjQuVTgKK2RSb3cybiAgICAgIEROIEQzMC5VOAorZFJvdzNuICAgICAgRE4gRDI4LlU4CitkUm93NG4gICAgICBETiBEMzEuVTgKK2RSb3c1biAgICAgIEROIEQyNS5VOAorZFJvdzZuICAgICAgRE4gRDI5LlU4CitkUm93N24gICAgICBETiBEMTEuVTgKKworOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KKzsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworOy8vIGJTTFQ0CitkVEMwICAgICAgICBETiBEMTguVTggICAKK2RUQzEgICAgICAgIEROIEQxOS5VOCAgIAorZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCisKK2RUQ3MgICAgICAgIEROIEQzMS5TOAorZFRDICAgICAgICAgRE4gRDMxLlU4CisKK2RNYXNrXzAgICAgIEROIEQxNC5VOAorZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAorCitNYXNrXzAgICAgICBSTiA2CisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gQ29tcHV0aW5nIFAwLFEwCitxRHEwcDAgICAgICBRTiBRMTAuUzE2CitxRHAxcTEgICAgICBRTiBRMTEuUzE2CitxRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAorZERlbHRhICAgICAgRE4gRDIwLlM4CisKKworOy8vIENvbXB1dGluZyBQMSxRMQorZFJwMHEwICAgICAgRE4gRDI0LlU4CisKK2RNYXhQICAgICAgIEROIEQyMy5VOAorZE1pblAgICAgICAgRE4gRDIyLlU4CisKK2RNYXhRICAgICAgIEROIEQxOS5VOAorZE1pblEgICAgICAgRE4gRDIxLlU4CisKK2REZWx0YVAgICAgIEROIEQyNi5VOAorZERlbHRhUSAgICAgRE4gRDI3LlU4CisKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUV8xbiAgICAgICBETiBEMjUuVTgKK2RQXzBuICAgICAgIEROIEQyOS5VOAorZFBfMW4gICAgICAgRE4gRDMwLlU4CisKKzsvLyBiU0dFNAorCitxU3AwcTAgICAgICBRTiBRMTAuVTE2CisKK3FTcDJxMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHAxICAgIFFOIFExMi5VMTYKK3FTcDNwMiAgICAgIFFOIFExMy5VMTYKK2RIU3AwcTEgICAgIEROIEQyOC5VOAorCitxU3EycDEgICAgICBRTiBRMTEuVTE2CitxU3AwcTBxMSAgICBRTiBRMTIuVTE2CitxU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKK2RIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQorCitxVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAorcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKKworZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKK2RQXzJuICAgICAgIEROIEQzMS5VOAorCitkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKK2RRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTU9WICAgICAgICAgTWFza18wLCMwCisKKyAgICAgICAgO2RNYXNrXzAtMTQKKyAgICAgICAgO2RNYXNrXzEtMTUKKworICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKKworICAgICAgICBMRFIgICAgICAgICBYWSw9TE9PUF9DT1VOVAorICAgIAorICAgICAgICBBREQgICAgICAgICBwVG1wU3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorTG9vcFkgICAgICAgIAorTG9vcFggICAgICAgIAorICAgICAgICBMRFJIICAgICAgICBiUzEwLCBbcEJTXSwgIzQKKworICAgICAgICBDTVAgICAgICAgICBiUzEwLCAjMAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIDsvLyBMb2FkIDggcm93cyBvZiBkYXRhCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzAsIGRSb3cxCisgICAgICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cyLCBkUm93MworICAgICAgICBWTEQxICAgICAgICBkUm93NSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWWklQLjggICAgICBkUm93NCwgZFJvdzUKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCisgICAgCisKKyAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KKyAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KKyAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KKyAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KKyAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KKyAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KKyAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KKyAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KKworICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQorCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NworCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzUsIGRSb3c3CisgICAgICAgIAorCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgorICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NworICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgorICAgICAgICA7Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCisKKyAgICAgICAgOy8vIGRRXzAgPSBbcTByNyBxMHI2IHEwcjUgcTByNCBxMHIzIHEwcjIgcTByMSBxMHIwXQorICAgICAgICA7Ly8gZFFfMSA9IFtxMXI3IHExcjYgcTFyNSBxMXI0IHExcjMgcTFyMiBxMXIxIHExcjBdCisgICAgICAgIDsvLyBkUV8yID0gW3EycjcgcTJyNiBxMnI1IHEycjQgcTJyMyBxMnIyIHEycjEgcTJyMF0KKyAgICAgICAgOy8vIGRRXzMgPSBbcTNyNyBxM3I2IHEzcjUgcTNyNCBxM3IzIHEzcjIgcTNyMSBxM3IwXQorCisgICAgICAgIDsvLyBkUF8wID0gW3AwcjcgcDByNiBwMHI1IHAwcjQgcDByMyBwMHIyIHAwcjEgcDByMF0KKyAgICAgICAgOy8vIGRQXzEgPSBbcDFyNyBwMXI2IHAxcjUgcDFyNCBwMXIzIHAxcjIgcDFyMSBwMXIwXQorICAgICAgICA7Ly8gZFBfMiA9IFtwMnI3IHAycjYgcDJyNSBwMnI0IHAycjMgcDJyMiBwMnIxIHAycjBdCisgICAgICAgIDsvLyBkUF8zID0gW3AzcjcgcDNyNiBwM3I1IHAzcjQgcDNyMyBwM3IyIHAzcjEgcDNyMF0KKworICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCisKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisKKyAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAorICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKKworICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKKworICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKKyAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCisgICAgCisgICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKK2JTTFQ0CisgICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCisKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKworICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMiAgCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgorICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMiwgIGRRXzMKKworICAgICAgICAKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzIKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMiwgIGRQXzBuCisKKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8yCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzIsICBkUV8xbgorICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMworCisgICAgICAgIDsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KKyAgICAgICAgOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCisgICAgICAgIDsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KKyAgICAgICAgOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCisKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24wLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24zLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIDsxCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duNCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjUsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWU1QxICAgICAgICBkUm93bjYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgorICAgICAgICBWU1QxICAgICAgICBkUm93bjcsIFtwVG1wXSwgc3JjZHN0U3RlcAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKKworTm9GaWx0ZXJCUzAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vIGJTID49IDQgRmlsdGVyaW5nCisgICAgICAgIAorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8ybiAgIAorICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzJuLCBkUV8zCisKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCisgICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzJuCisgICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCisgICAgICAgIFZaSVAuMTYgICAgIGRQXzJuLCBkUF8wbgorCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgorICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMm4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMm4sIGRRXzFuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCisKKyAgICAgICAgOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KKyAgICAgICAgOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMworICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzBuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3cxbiwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93Mm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzNuLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3c0biwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93NW4sIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzZuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzduLCBbcFRtcF0sIHBUbXBTdGVwCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKworICAgICAgICBCQ0MgICAgICAgICBMb29wWAorCitFeGl0TG9vcFkgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwQlMsIHBCUywgIzE0CisgICAgICAgIFNVQiAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE0CisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMyAKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0KKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkKKworICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRgorICAgIAorICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NlNDFiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jaworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyYwlQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgorICogW2luXQlzcmNTdGVwIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKKyAqIFtpbl0JZHN0U3RlcCBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoLgorICogW2luXQlkeAkJRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKKyAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCisgKiBbaW5dCWR5CQlGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKKyAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCisgKiBbaW5dCXJvaQkJRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCisgKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE9NWF9TdHNfQmFkQXJnRXJyOgorICoJcFNyYyBvciBwRHN0IGlzIE5VTEwuCisgKglzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LgorICoJZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLgorICoJcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuCisgKglzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pCisgKQoreworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKKyAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDJlYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKQEAgLTAsMCArMSw1NTMgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorOy8vCis7Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgorOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KKzsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCis7Ly8gUGFyYW1ldGVyczoKKzsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCis7Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCis7Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCis7Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCis7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KKzsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCis7Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vCis7Ly8gUmV0dXJuIFZhbHVlOgorOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKzsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCis7Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCis7Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KKzsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KKzsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgorOy8vCis7Ly8KKworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCisgICAgICAgIAorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBFTkRJRgorICAgIAorICAgIAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCitpSGVpZ2h0ICAgICAgICAgUk4gNAoraVdpZHRoICAgICAgICAgIFJOIDUKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaWR4ICAgICAgICAgICAgIFJOIDYKK2lkeSAgICAgICAgICAgICBSTiA3CitpbmRleCAgICAgICAgICAgUk4gNgorVGVtcCAgICAgICAgICAgIFJOIDEyCitwQXJncyAgICAgICAgICAgUk4gMTEKKworCisgICAgSUYgQ29ydGV4QTgKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgorICAgICAgICA7Ly8KKyAgICAgICAgTV9BTExPQzQgICAgcHBBcmdzLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEsIGQxNQorCitwU3JjQksgICAgICAgICAgUk4gOAorCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBIb3Jpem9udGFsIGludGVycG9sYXRpb24KK2RTcmMwYyAgICAgICAgICBETiAxNC5VOAorZFNyYzFjICAgICAgICAgIEROIDE2LlU4CitkU3JjMmMgICAgICAgICAgRE4gMTguVTgKK2RTcmMzYyAgICAgICAgICBETiAyMC5VOCAgICAgICAgICAgICAgICAgICAKK2RTcmMwZCAgICAgICAgICBETiAxNS5VOAorZFNyYzFkICAgICAgICAgIEROIDE3LlU4CitkU3JjMmQgICAgICAgICAgRE4gMTkuVTgKK2RTcmMzZCAgICAgICAgICBETiAyMS5VOAorZEFjY0gwICAgICAgICAgIEROIDIyLlU4CitkQWNjSDEgICAgICAgICAgRE4gMjQuVTgKK2RBY2NIMiAgICAgICAgICBETiAyNi5VOAorZEFjY0gzICAgICAgICAgIEROIDI4LlU4CitkUmVzdWx0SDAgICAgICAgRE4gMjIuVTMyCitkUmVzdWx0SDEgICAgICAgRE4gMjQuVTMyCitkUmVzdWx0SDIgICAgICAgRE4gMjYuVTMyCitkUmVzdWx0SDMgICAgICAgRE4gMjguVTMyCisKKzsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIFZlcnRpY2FsIGludGVycG9sYXRpb24KK2RTcmMwICAgICAgICAgICBETiA5LlU4CitkU3JjMSAgICAgICAgICAgRE4gMTAuVTgKK2RTcmMyICAgICAgICAgICBETiAxMS5VOAorZFNyYzMgICAgICAgICAgIEROIDEyLlU4CitkU3JjNCAgICAgICAgICAgRE4gMTMuVTgKK2RBY2NWMCAgICAgICAgICBETiAwLlU4CitkQWNjVjEgICAgICAgICAgRE4gMi5VOAorZEFjY1YyICAgICAgICAgIEROIDQuVTgKK2RBY2NWMyAgICAgICAgICBETiA2LlU4CitkUmVzdWx0VjAgICAgICAgRE4gMC5VMzIKK2RSZXN1bHRWMSAgICAgICBETiAyLlUzMgorZFJlc3VsdFYyICAgICAgIEROIDQuVTMyCitkUmVzdWx0VjMgICAgICAgRE4gNi5VMzIKKyAgICAgICAgCis7Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBEaWFnb25hbCBpbnRlcnBvbGF0aW9uCitkVEFjYzAgICAgICAgICAgRE4gMC5VOAorZFRBY2MxICAgICAgICAgIEROIDIuVTgKK2RUQWNjMiAgICAgICAgICBETiA0LlU4CitkVEFjYzMgICAgICAgICAgRE4gNi5VOAorZFRSZXMwICAgICAgICAgIEROIDAuMzIKK2RUUmVzMSAgICAgICAgICBETiAyLjMyCitkVFJlczIgICAgICAgICAgRE4gNC4zMgorZFRSZXMzICAgICAgICAgIEROIDYuMzIKK2RUUmVzdWx0MCAgICAgICBETiAxNC5VOAorZFRSZXN1bHQxICAgICAgIEROIDE2LlU4CitkVFJlc3VsdDIgICAgICAgRE4gMTguVTgKK2RUUmVzdWx0MyAgICAgICBETiAyMC5VOAorZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgorZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgorZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgorZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgorZFRlbXBSMCAgICAgICAgIEROIDIyLlMxNgorZFRlbXBSMSAgICAgICAgIEROIDIzLlMxNgorZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgorZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgorcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2CitxVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2CitxVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2CitxVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2CisKKzsvLyBJbnRlcm1lZGlhdGUgdmFsdWVzIGZvciBhdmVyYWdpbmcKK3FSZXMyICAgICAgICAgICBRTiA3LlMxNgorcVJlczMgICAgICAgICAgIFFOIDguUzE2CitxUmVzNCAgICAgICAgICAgUU4gOS5TMTYKK3FSZXM1ICAgICAgICAgICBRTiAxMC5TMTYKK3FSZXM2ICAgICAgICAgICBRTiAxMS5TMTYKKyAgICAgICAKKzsvLyBGb3IgaW1wbGVtZW50aW5nIGNvcHkKK2REc3QwICAgICAgICAgICAgRE4gOS4zMgorZERzdDEgICAgICAgICAgICBETiAxMC4zMgorZERzdDIgICAgICAgICAgICBETiAxMS4zMgorZERzdDMgICAgICAgICAgICBETiAxMi4zMgorCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgICAgIHB0cmlkeCwgNAorICAgICAgICBNX0FSRyAgICAgICBwdHJpZHksIDQgICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICBwdHJXaWR0aCwgNAorICAgICAgICBNX0FSRyAgICAgICBwdHJIZWlnaHQsIDQgICAgICAgIAorCisgICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCisgICAgICAgIE1fTERSICAgICAgIGlkeCwgcHRyaWR4CisgICAgICAgIE1fTERSICAgICAgIGlkeSwgcHRyaWR5CisgICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9MRFIgICAgICAgaUhlaWdodCwgcHRySGVpZ2h0CisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTW92ZSBjb2VmZmljaWVudHMgTmVvbiByZWdpc3RlcnMKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAorICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorQmxvY2s0eDRXaWR0aExvb3AKK0Jsb2NrNHg0SGVpZ2h0TG9vcAorCisgICAgICAgIFNUTSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4CisgICAgICAgIEFERCAgICAgICAgIHBjLCBwYywgaW5kZXgsIExTTCAjMgorICAgICAgICBCICAgICAgICAgICBDYXNlX2YKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8wICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8xICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8yICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV8zICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV80ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV81ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV82ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV83ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV84ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV85ICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9hICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9iICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9jICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9kCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZSAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZgorICAgICAgICAgICAgICAgICAgICAKK0Nhc2VfMCAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIENhc2UgRworICAgICAgICBNX1BSSU5URiAiQ2FzZSAwIFxuIgorICAgICAgICAKKyAgICAgICAgOy8vIExvYWRzIGEgNHg0IGJsb2NrIG9mIC44IGFuZCBzdG9yZXMgYXMgLjMyCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMSAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW1RlbXBdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMxLCBbcFNyY10KKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkRHN0MFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGREc3QyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZERzdDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkRHN0M1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzEKKyAgICAgICAgOy8vIENhc2UgYQorICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwYworICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJjCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzYworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfMgorICAgICAgICA7Ly8gQ2FzZSBiCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDIgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIgICAgICAgIAorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfMworICAgICAgICA7Ly8gQ2FzZSBjCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBkCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmQKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxZAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNkCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV80CisgICAgICAgIDsvLyBDYXNlIGQKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMQorICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzUKKyAgICAgICAgOy8vIENhc2UgZQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA1IFxuIgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzYKKyAgICAgICAgOy8vIENhc2UgZgorICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMiwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXMzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczQsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNSwgIzUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV83CisgICAgICAgIDsvLyBDYXNlIGcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmNCSywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV84CisgICAgICAgIDsvLyBDYXNlIGgKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzkKKyAgICAgICAgOy8vIENhc2UgaQorICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMyCisgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYQorICAgICAgICA7Ly8gQ2FzZSBqCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGEgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYgorICAgICAgICA7Ly8gQ2FzZSBrCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKKyAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKKworICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9jCisgICAgICAgIDsvLyBDYXNlIG4KKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjVjAsIGRBY2NWMCwgZFNyYzEKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YyLCBkQWNjVjIsIGRTcmMzCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMSwgZEFjY1YxLCBkU3JjMgorICAgICAgICBWUkhBREQgICAgICBkQWNjVjMsIGRBY2NWMywgZFNyYzQKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9kCisgICAgICAgIDsvLyBDYXNlIHAKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZCBcbiIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2UKKyAgICAgICAgOy8vIENhc2UgcQorICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMzLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczQsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM2LCAjNSAgICAgICAgCisKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAorICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZgorICAgICAgICA7Ly8gQ2FzZSByCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCisgICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYworICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjQkssIHNyY1N0ZXAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZEFjY1YwCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkQWNjVjIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRBY2NWMQorICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZEFjY1YzICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisKKworQmxvY2s0eDRMb29wRW5kCisKKyAgICAgICAgOy8vIFdpZHRoIExvb3AKKyAgICAgICAgOy8vTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKKyAgICAgICAgU1VCUyAgICAgICAgaVdpZHRoLCBpV2lkdGgsICM0CisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICM0ICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsICM0CisgICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0V2lkdGhMb29wCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKKyAgICAgICAgU1VCUyAgICAgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAorICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgaVdpZHRoCisgICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAorICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NEhlaWdodExvb3AKKworRW5kT2ZJbnRlcnBvbGF0aW9uCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjMAorICAgICAgICBNX0VORCAgICAgICAKKworICAgIEVORElGICAKKyAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAorICAgICAgICAgICAgICAgICAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTYwNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCkBAIC0wLDAgKzEsNDM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgIAorICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIEFSRUEgdGFibGUsIERBVEEgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCisgICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCisgICAgCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCisgICAgRENXICAgMywgMiwgMSw0IAorICAgIERDVyAgLTMsLTIsLTEsMAorICAgIERDVyAgIDEsIDIsIDMsNAorICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgSUYgQ29ydGV4QTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCityZXR1cm4gICAgICAgICAgUk4gMCAgCitwVGFibGUgICAgICAgICAgUk4gOCAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIElucHV0IEFyZ3VtZW50cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwTXVsdGlwbGllclRhYmxlICAgIFJOICAyICAgICAKKworcFRtcCAgICAgICAgICAgIFJOIDkKK3N0ZXAgICAgICAgICAgICBSTiAxMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBOZW9uIFJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsvLyBPTVhfVkNfQ0hST01BX0hPUgorCitkTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKK2RMZWZ0VmFsMSAgICAgICBETiAgRDEuOAorZExlZnRWYWwyICAgICAgIEROICBEMi44CitkTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKK2RMZWZ0VmFsNCAgICAgICBETiAgRDQuOAorZExlZnRWYWw1ICAgICAgIEROICBENS44CitkTGVmdFZhbDYgICAgICAgRE4gIEQ2LjgKK2RMZWZ0VmFsNyAgICAgICBETiAgRDcuOAorCis7Ly8gT01YX1ZDX0NIUk9NQV9WRVJUCisKK2RBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKKworOy8vIE9NWF9WQ19DSFJPTUFfREMKKworZExlZnRWYWwgICAgICAgIEROICBEMS5VOAorZFN1bUFib3ZlVmFsVTE2IEROICBEMi5VMTYKK2RTdW1BYm92ZVZhbFUzMiBETiAgRDMuVTMyCitkU3VtQWJvdmVWYWxVOCAgRE4gIEQzLlU4CitkU3VtTGVmdFZhbFUxNiAgRE4gIEQyLlUxNgorZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKK2RTdW1MZWZ0VmFsVTggICBETiAgRDEuVTgKK2RTdW1BYm92ZUxlZnQgICBETiAgRDIuVTMyCitkU3VtQWJvdmVMZWZ0VTggRE4gIEQyLlU4CitkSW5kZXhSb3cwVTggICAgRE4gIEQ1LlU4CitkSW5kZXhSb3cwICAgICAgRE4gIEQ1LlU2NAorZEluZGV4Um93NFU4ICAgIEROICBENi5VOAorZEluZGV4Um93NCAgICAgIEROICBENi5VNjQKK2REc3RSb3cwICAgICAgICBETiAgRDAuVTgKK2REc3RSb3c0ICAgICAgICBETiAgRDQuVTgKK2RDb25zdDEyOFU4ICAgICBETiAgRDAuVTgKKworOy8vIE9NWF9WQ19DSFJPTUFfUExBTkUKKworZFJldkFib3ZlVmFsICAgIEROICBEMy5VOCAgCitkUmV2QWJvdmVWYWxVNjQgRE4gIEQzLlU2NCAgCitkQWJvdmVMZWZ0VmFsICAgRE4gIEQyLlU4CitxQWJvdmU3bWludXMwICAgUU4gIFEzLlMxNiAKK3FBYm92ZURpZmYgICAgICBRTiAgUTIuUzE2IAorZEluZGV4ICAgICAgICAgIEROICBEOC5VOCAgCitkRGlmZkFib3ZlVTggICAgRE4gIEQ5LlU4ICAKK2REaWZmQWJvdmVTMTYgICBETiAgRDkuUzE2IAorZEFib3ZlRGlmZjBVOCAgIEROICBENC5VOCAgCitkQWJvdmVEaWZmMFU2NCAgRE4gIEQ0LlU2NAorZEFib3ZlN21pbnVzMFU4IEROICBENi5VOCAgCitkTXVsdGlwbGllciAgICAgRE4gIEQxMC5TMTYgCitkSG9yUHJlZCAgICAgICAgRE4gIEQxMS5TMTYgCitkUmV2TGVmdFZhbCAgICAgRE4gIEQzLlU4CitkUmV2TGVmdFZhbFU2NCAgRE4gIEQzLlU2NAorcUxlZnQ3bWludXMwICAgIFFOICBRNy5TMTYKK3FMZWZ0RGlmZiAgICAgICBRTiAgUTYuUzE2CitkRGlmZkxlZnRVOCAgICAgRE4gIEQxNi5VOAorZERpZmZMZWZ0UzE2ICAgIEROICBEMTYuUzE2CitkTGVmdERpZmYwVTggICAgRE4gIEQxMi5VOAorZExlZnREaWZmMFU2NCAgIEROICBEMTIuVTY0CitkTGVmdDdtaW51czBVOCAgRE4gIEQxNC5VOAorZFZlclByZWQgICAgICAgIEROICBEMy5TMTYgCitkSFZWYWxTMTYgICAgICAgRE4gIEQzLlMxNgorZEhWVmFsUzMyICAgICAgIEROICBEMy5TMzIKK2RIVlRlbXBTMzIgICAgICBETiAgRDIuUzMyCitxQSAgICAgICAgICAgICAgUU4gIFEwLlMxNgorcUIgICAgICAgICAgICAgIFFOICBRMi5TMTYKK3FDICAgICAgICAgICAgICBRTiAgUTMuUzE2CitxTXVsdGlwbGllciAgICAgUU4gIFE1LlMxNgorZE11bHRpcGxpZXIwICAgIEROICBEMTAuUzE2CitkTXVsdGlwbGllcjEgICAgRE4gIEQxMS5TMTYKK3FDMCAgICAgICAgICAgICBRTiAgUTAuUzE2CitxQzEgICAgICAgICAgICAgUU4gIFExLlMxNgorcUMyICAgICAgICAgICAgIFFOICBRNC5TMTYKK3FDMyAgICAgICAgICAgICBRTiAgUTUuUzE2CitxQzQgICAgICAgICAgICAgUU4gIFE2LlMxNgorcUM1ICAgICAgICAgICAgIFFOICBRNy5TMTYKK3FDNiAgICAgICAgICAgICBRTiAgUTguUzE2CitxQzcgICAgICAgICAgICAgUU4gIFE5LlMxNgorcVN1bTAgICAgICAgICAgIFFOICBRMC5TMTYKK3FTdW0xICAgICAgICAgICBRTiAgUTEuUzE2CitxU3VtMiAgICAgICAgICAgUU4gIFE0LlMxNgorcVN1bTMgICAgICAgICAgIFFOICBRNS5TMTYKK3FTdW00ICAgICAgICAgICBRTiAgUTYuUzE2CitxU3VtNSAgICAgICAgICAgUU4gIFE3LlMxNgorcVN1bTYgICAgICAgICAgIFFOICBROC5TMTYKK3FTdW03ICAgICAgICAgICBRTiAgUTkuUzE2CitkU3VtMCAgICAgICAgICAgRE4gIEQwLlU4CitkU3VtMSAgICAgICAgICAgRE4gIEQxLlU4CitkU3VtMiAgICAgICAgICAgRE4gIEQyLlU4CitkU3VtMyAgICAgICAgICAgRE4gIEQzLlU4CitkU3VtNCAgICAgICAgICAgRE4gIEQ0LlU4CitkU3VtNSAgICAgICAgICAgRE4gIEQ1LlU4CitkU3VtNiAgICAgICAgICAgRE4gIEQ2LlU4CitkU3VtNyAgICAgICAgICAgRE4gIEQ3LlU4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMCwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OCAgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworT01YX1ZDX0NIUk9NQV9EQworICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQorCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisKKyAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAgICAgIAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSBhbHNvCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVWYWxVMzIsZFN1bUxlZnRWYWxVMzIKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVMZWZ0LCMzICAgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMworICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwYyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZEluZGV4Um93NFU4LCMweDA0CisgICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXgwID0gMHgwYzBjMGMwYzAwMDAwMDAwIAorICAgICAgICBWU0hSICAgICBkSW5kZXhSb3c0LGRJbmRleFJvdzQsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4NCA9IDB4MDAwMDAwMDAwNDA0MDQwNAorICAgICAgICBWQUREICAgICBkSW5kZXhSb3c0VTgsZEluZGV4Um93NFU4LGRJbmRleFJvdzBVOCAgICAgOy8vIGluZGV4NCA9IDB4MGMwYzBjMGMwNDA0MDQwNAorICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlTGVmdFU4LGRTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTgKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzQse2RTdW1MZWZ0VmFsVTgsZFN1bUFib3ZlTGVmdFU4fSxkSW5kZXhSb3c0VTgKKyAKK0RDQ2hyb21hOHg4TGVmdFN0b3JlICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKworICAgICAgICBNX0VYSVQKKyAgICAgICAgCisKK0RDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICAKKyAgICAgICAgVkRVUCAgICAgZERzdFJvdzAsZFN1bUxlZnRWYWxVOFswXQorICAgICAgICBWRFVQICAgICBkRHN0Um93NCxkU3VtTGVmdFZhbFU4WzRdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OExlZnRTdG9yZSAgCisgICAgICAgIAorCitEQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSAKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDA0CisgICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXggPSAweDA0MDQwNDA0MDAwMDAwMDAKKyAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTggCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKKyAgICAgICAgCisKK0RDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKworRENDaHJvbWE4eDhVcHBlclN0b3JlICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICAKKyAgICAgICAgTV9FWElUCisKKworT01YX1ZDX0NIUk9NQV9WRVJUCisgICAgICAgIAorICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQorICAgICAgICAKKworT01YX1ZDX0NIUk9NQV9IT1IKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDBbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwxW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDNbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw0W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDZbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw3W119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFBsYW5lU3RvcmUKKyAgICAgICAgCisgICAgICAgIAorT01YX1ZDX0NIUk9NQV9QTEFORQorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRWYWxbMF0sW3BTcmNBYm92ZUxlZnRdCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0Fib3ZlWzA6MToyOjM6NDo1OjY6N10KKyAgICAgICAgVlNVQkwgICBxQWJvdmU3bWludXMwLGRSZXZBYm92ZVZhbCxkQWJvdmVMZWZ0VmFsICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBWU0hSICAgIGRSZXZBYm92ZVZhbFU2NCxkUmV2QWJvdmVWYWxVNjQsIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVtYOjA6MToyOjM6NDo1OjZdCisgICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZixkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzVdIC0gcFNyY0Fib3ZlWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdIC0gcFNyY0Fib3ZlWzJdCisgICAgICAgIAorICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjTGVmdFswOjE6MjozOjQ6NTo2OjddCisgICAgICAgIFZTVUJMICAgcUxlZnQ3bWludXMwLGRSZXZMZWZ0VmFsLGRBYm92ZUxlZnRWYWwgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBWU0hSICAgIGRSZXZMZWZ0VmFsVTY0LGRSZXZMZWZ0VmFsVTY0LCM4ICAgICAgICAgICAgOy8vIHBTcmNMZWZ0W1g6MDoxOjI6Mzo0OjU6Nl0KKyAgICAgICAgVlNVQkwgICBxTGVmdERpZmYsZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2XSAtIHBTcmNMZWZ0WzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNV0gLSBwU3JjTGVmdFsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzRdIC0gcFNyY0xlZnRbMl0KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcE11bHRpcGxpZXJUYWJsZSw9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDggICA7Ly8gVXNlZCB0byBjYWxjdWxhdGUgSHZhbCAmIFZ2YWwgIAorICAgICAgICBWU0hMICAgIGRBYm92ZURpZmYwVTY0LGRBYm92ZURpZmYwVTY0LCMxNiAgCisgICAgICAgIFZFWFQgICAgZERpZmZBYm92ZVU4LGRBYm92ZURpZmYwVTgsZEFib3ZlN21pbnVzMFU4LCMyICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXQorICAgICAgICBWTEQxICAgIGRNdWx0aXBsaWVyLFtwTXVsdGlwbGllclRhYmxlXSEgCisgICAgICAgIFZTSEwgICAgZExlZnREaWZmMFU2NCxkTGVmdERpZmYwVTY0LCMxNiAgCisgICAgICAgIFZFWFQgICAgZERpZmZMZWZ0VTgsZExlZnREaWZmMFU4LGRMZWZ0N21pbnVzMFU4LCMyICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTCAgICBkSG9yUHJlZCxkRGlmZkFib3ZlUzE2LGRNdWx0aXBsaWVyICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQqKDctMCkgfCAxKig0LTIpIHwgMiooNS0xKSB8IDMqKDYtMCkgXQorICAgICAgICBWTVVMICAgIGRWZXJQcmVkLGREaWZmTGVmdFMxNixkTXVsdGlwbGllcgorICAgICAgICBWUEFERCAgIGRIVlZhbFMxNixkSG9yUHJlZCxkVmVyUHJlZAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgZEhWVmFsUzMyLGRIVlZhbFMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1Z8SF0gaW4gMzIgYml0cyBlYWNoCisgICAgICAgIFZTSEwgICAgZEhWVGVtcFMzMixkSFZWYWxTMzIsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTcqSCA9IDE2KkggKyBIID0gKEg8PDQpK0gKKyAgICAgICAgVkFERCAgICBkSFZWYWxTMzIsZEhWVmFsUzMyLGRIVlRlbXBTMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbIDE3KlYgIHwgMTcqSCBdaW4gMzIgYml0cyBlYWNoCisgICAgICAgIFZMRDEgICAge2RNdWx0aXBsaWVyMCxkTXVsdGlwbGllcjF9LFtwTXVsdGlwbGllclRhYmxlXSAgICAgICAgICA7Ly8gcU11bHRpcGxpZXIgPSBbIDR8M3wyfDF8MHwtMXwtMnwtMyBdICAKKyAgICAgICAgVlJTSFIgICBkSFZWYWxTMzIsZEhWVmFsUzMyLCM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xiXSBpbiAxNmJpdHMgZWFjaAorICAgICAgICBWQURETCAgIHFBLGRBYm92ZVZhbCxkTGVmdFZhbAorICAgICAgICBWRFVQICAgIHFBLHFBWzddCisgICAgICAgIFZTSEwgICAgcUEscUEsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2F8YXxhfGF8YXxhfGF8YV0KKyAgICAgICAgVkRVUCAgICBxQixkSFZWYWxTMTZbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYnxifGJ8YnxifGJ8YnxiXQorICAgICAgICBWRFVQICAgIHFDLGRIVlZhbFMxNlsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGN8Y3xjfGN8Y3xjfGNdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVk1VTCAgICBxQixxQixxTXVsdGlwbGllcgorICAgICAgICBWTVVMICAgIHFDLHFDLHFNdWx0aXBsaWVyCisgICAgICAgIFZBREQgICAgcUIscUIscUEgCisgICAgICAgIAorICAgICAgICBWRFVQICAgIHFDMCxxQ1swXQorICAgICAgICBWRFVQICAgIHFDMSxxQ1sxXQorICAgICAgICBWRFVQICAgIHFDMixxQ1syXQorICAgICAgICBWRFVQICAgIHFDMyxxQ1szXQorICAgICAgICBWRFVQICAgIHFDNCxxQ1s0XQorICAgICAgICBWRFVQICAgIHFDNSxxQ1s1XQorICAgICAgICBWRFVQICAgIHFDNixxQ1s2XQorICAgICAgICBWRFVQICAgIHFDNyxxQ1s3XQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBxU3VtMCxxQixxQzAKKyAgICAgICAgVkFERCAgICBxU3VtMSxxQixxQzEKKyAgICAgICAgVkFERCAgICBxU3VtMixxQixxQzIKKyAgICAgICAgVkFERCAgICBxU3VtMyxxQixxQzMKKyAgICAgICAgVkFERCAgICBxU3VtNCxxQixxQzQKKyAgICAgICAgVkFERCAgICBxU3VtNSxxQixxQzUKKyAgICAgICAgVkFERCAgICBxU3VtNixxQixxQzYKKyAgICAgICAgVkFERCAgICBxU3VtNyxxQixxQzcKKyAgICAgICAgCisgICAgICAgIFZRUlNIUlVOIGRTdW0wLHFTdW0wLCM1ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAoT01YX1U4KWFybUNsaXAoMCwyNTUsKFN1bSsxNik+PjUpCisgICAgICAgIFZRUlNIUlVOIGRTdW0xLHFTdW0xLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW0yLHFTdW0yLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW0zLHFTdW0zLCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW00LHFTdW00LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW01LHFTdW01LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW02LHFTdW02LCM1CisgICAgICAgIFZRUlNIUlVOIGRTdW03LHFTdW03LCM1ICAgICAgCisKK0RDQ2hyb21hOHg4UGxhbmVTdG9yZSAgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFN1bTAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW0xLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtMixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTMsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW00LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTYsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW03LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRU5ECis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWMwZWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKQEAgLTAsMCArMSw0MjQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNgorICAgIERDRCAgT01YX1ZDXzE2WDE2X1ZFUlQsIE9NWF9WQ18xNlgxNl9IT1IgCisgICAgRENEICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCisgICAgCisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2LDEKKyAgICBEQ1cgICA3LCAgNiwgIDUsICA0LCAgMywgIDIsICAxLCAgOCAKKyAgICBEQ1cgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNworICAgIERDVyAgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitCTEtfU0laRSAgICAgICAgRVFVIDB4MTAKK01VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQorTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0CitNVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKK01VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQorTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCisKK3JldHVybiAgICAgICAgICBSTiAwICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCitjb3VudCAgICAgICAgICAgUk4gMTEgICAKK3BNdWx0VGFibGUgICAgICBSTiA5Cis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTmVvbiByZWdpc3RlcnMKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcUFib3ZlICAgICAgICAgIFFOIFEwLlU4CitxTGVmdCAgICAgICAgICAgUU4gUTEuVTgKK3FTdW04ICAgICAgICAgICBRTiBRMC5VMTYKK2RTdW04MCAgICAgICAgICBETiBEMC5VMTYKK2RTdW04MSAgICAgICAgICBETiBEMS5VMTYKK2RTdW00ICAgICAgICAgICBETiBEMC5VMTYKK2RTdW0yICAgICAgICAgICBETiBEMC5VMzIKK2RTdW0xICAgICAgICAgICBETiBEMC5VNjQKK3FPdXQgICAgICAgICAgICBRTiBRMy5VOAorZFN1bUxlZnQgICAgICAgIEROIEQ2LlU2NAorZFN1bUFib3ZlICAgICAgIEROIEQ3LlU2NAorZFN1bSAgICAgICAgICAgIEROIEQ4LlU2NAorZFN1bTAgICAgICAgICAgIEROIEQ4LlU4WzBdCisKK3FIICAgICAgICAgICAgICBRTiBRMTEuUzMyCitxViAgICAgICAgICAgICAgUU4gUTEyLlMzMgorcUEgICAgICAgICAgICAgIFFOIFExMS5TMTYKK3FCICAgICAgICAgICAgICBRTiBRNi5TMTYKK3FDICAgICAgICAgICAgICBRTiBRNy5TMTYKKworcUIwICAgICAgICAgICAgIFFOIFE1LlMxNgorcUIxICAgICAgICAgICAgIFFOIFE2LlMxNgorZEExICAgICAgICAgICAgIEROIEQyMy5TMTYKKworZEgwICAgICAgICAgICAgIEROIEQyMi5TMzIKK2RIMSAgICAgICAgICAgICBETiBEMjMuUzMyCitkVjAgICAgICAgICAgICAgRE4gRDI0LlMzMgorZFYxICAgICAgICAgICAgIEROIEQyNS5TMzIKKworcUhWICAgICAgICAgICAgIFFOIFExMS5TNjQKK3FIVjAgICAgICAgICAgICBRTiBRMTEuUzMyCitxSFYxICAgICAgICAgICAgUU4gUTEyLlM2NAorCitkSFYwMCAgICAgICAgICAgRE4gRDIyLlMzMgorZEhWMDEgICAgICAgICAgIEROIEQyMy5TMzIKKworZEhWMCAgICAgICAgICAgIEROIEQyMi5TMTZbMF0KK2RIVjEgICAgICAgICAgICBETiBEMjMuUzE2WzBdCitkSFYxMCAgICAgICAgICAgRE4gRDI0LlM2NAorZEhWMTEgICAgICAgICAgIEROIEQyNS5TNjQKKworcVN1bTAgICAgICAgICAgIFFOIFEwLlMxNgorcVN1bTEgICAgICAgICAgIFFOIFExLlMxNgorCitkT3V0MCAgICAgICAgICAgRE4gRDYuVTgKK2RPdXQxICAgICAgICAgICBETiBENy5VOAorCitkTGVmdDAgICAgICAgICAgRE4gRDIuVTgKK2RMZWZ0MSAgICAgICAgICBETiBEMy5VOAorcUNvbnN0ICAgICAgICAgIFFOIFExMy5TMTYKKworZEFib3ZlMCAgICAgICAgIEROIEQwLlU4CitkQWJvdmUxICAgICAgICAgRE4gRDEuVTgKKworZFJldkxlZnQ2NCAgICAgIEROIEQxMi5VNjQKK2RSZXZMZWZ0ICAgICAgICBETiBEMTIuVTgKK2RSZXZBYm92ZTY0ICAgICBETiBENS5VNjQKK2RSZXZBYm92ZSAgICAgICBETiBENS5VOAorcUxlZnREaWZmICAgICAgIFFOIFE4LlMxNgorZExlZnREaWZmMSAgICAgIEROIEQxNy5TMTYKK2RMZWZ0RGlmZjY0ICAgICBETiBEMTcuUzY0CitxRGlmZkxlZnQgICAgICAgUU4gUTguUzE2CitxRGlmZkFib3ZlICAgICAgUU4gUTQuUzE2CitkQWJvdmVEaWZmMSAgICAgRE4gRDkuUzE2CitkQWJvdmVEaWZmNjQgICAgRE4gRDkuUzY0CitxQWJvdmVEaWZmICAgICAgUU4gUTQuUzE2CisKK2RBYm92ZUxlZnQgICAgICBETiBENC5VOAorCitkRGlmZkxlZnQwICAgICAgRE4gRDE2LlMxNgorZERpZmZMZWZ0MSAgICAgIEROIEQxNy5TMTYKK2REaWZmQWJvdmUwICAgICBETiBEOC5TMTYKK2REaWZmQWJvdmUxICAgICBETiBEOS5TMTYKKworcUxlZnQxNW1pbnVzMCAgIFFOIFE3LlMxNgorZExlZnQxNW1pbnVzMCAgIEROIEQxNC5TMTYKK3FBYm92ZTE1bWludXMwICBRTiBRMy5TMTYKK2RBYm92ZTE1bWludXMwICBETiBENi5TMTYKKworcU11bHRpcGxpZXIgICAgIFFOIFExMC5TMTYKK3FNdWx0aXBsaWVyMCAgICBRTiBRMTAuUzE2CitxTXVsdGlwbGllcjEgICAgUU4gUTEyLlMxNgorZE11bHRpcGxpZXIwICAgIEROIEQyMC5TMTYKK2RNdWx0aXBsaWVyMSAgICBETiBEMjEuUzE2CisKK2RCUGx1c0NNdWx0NyAgICBETiBEMS5TNjQKK2RCUGx1c0NNdWx0N1MxNiBETiBEMS5TMTYKKworcVRtcCAgICAgICAgICAgIFFOIFEwLlU4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorCitwVG1wICAgICAgICAgICAgUk4gOAorc3RlcCAgICAgICAgICAgIFJOIDEwCitwVG1wMiAgICAgICAgICAgUk4gMTEKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMSwgZDE1CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNiA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorICAgICAgICAKK09NWF9WQ18xNlgxNl9WRVJUCisgICAgICAgIFZMRDEgICAgcUFib3ZlLCAgW3BTcmNBYm92ZV0KKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XQorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdCisgICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9IT1IKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBsZWZ0U3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgcFRtcDIsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RTdGVwLCBkc3RTdGVwLCBkc3RTdGVwCitMb29wSG9yIAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzgKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBCTkUgICAgICBMb29wSG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9EQworICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgIFVwcGVyT3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIFVwcGVyIGlmIG5vdCBsZWZ0CisKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKworICAgICAgICBWTEQxICAgIHtxTGVmdFswXX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMV19LCBbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsyXX0sIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFszXX0sIFtwVG1wXSxzdGVwCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzRdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzVdfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNl19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzddfSwgW3BUbXBdLHN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCBbcFNyY0xlZnRdLHN0ZXAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgW3BUbXBdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTBdfSxbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTFdfSxbcFRtcF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTJdfSxbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTNdfSxbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSxbcFRtcF0gCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBxU3VtOCwgcUxlZnQKKyAgICAgICAgQUREICAgICBjb3VudCwgY291bnQsICMxICAgIAorICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKKyAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00CisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0LCBkU3VtMgorICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtTGVmdCwgIzQKKyAgICAgICAgCitVcHBlck9yTm9uZUF2YWlsYWJsZQorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICAjT01YX1ZDX1VQUEVSICAgICAgICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKKyAgICAgICAgQkVRICAgICAgQm90aE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gTGVmdCBpZiBub3QgdXBwZXIKKyAgICAgICAgVkxEMSAgICAgcUFib3ZlLCBbcFNyY0Fib3ZlXQorICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKKyAgICAgICAgVlBBRERMICAgcVN1bTgsIHFBYm92ZQorICAgICAgICBWUEFERCAgICBkU3VtNCwgZFN1bTgwLCBkU3VtODEKKyAgICAgICAgVlBBRERMICAgZFN1bTIsIGRTdW00CisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZSwgZFN1bTIKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bUFib3ZlLCAjNAorICAgICAgICAKK0JvdGhPck5vbmVBdmFpbGFibGUKKyAgICAgICAgQ01QICAgICAgY291bnQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBib3RoIGF2YWlsYWJsZQorICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCisgICAgICAgIFZBREQgICAgIGRTdW0sIGRTdW1BYm92ZSwgZFN1bUxlZnQKKyAgICAgICAgVlJTSFIgICAgZFN1bSwgZFN1bSwgIzUKKyAgICAgICAgCisKK05vbmVBdmFpbGFibGUKKyAgICAgICAgVkRVUCAgICAgcU91dCwgZFN1bTAgICAgICAgIAorICAgICAgICBDTVAgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIG5vbmUgYXZhaWxhYmxlCisgICAgICAgIEFERCAgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBCTkUgICAgICBMb29wREMKKyAgICAgICAgVk1PViAgICAgcU91dCwgIzEyOAorTG9vcERDICAgICAgICAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxT3V0LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCitPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAgICAgTERSICAgICBwTXVsdFRhYmxlLCA9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGUxNngxNgorICAgICAgICBWTEQxICAgIHFBYm92ZSwgW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRbMF0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzFdfSwgIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzJdfSwgIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzNdfSwgIFtwVG1wXSxzdGVwICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs0XX0sICBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs1XX0sICBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs2XX0sICBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbN119LCAgW3BUbXBdLHN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOF19LCAgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzldfSwgIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEwXX0sIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzExXX0sIFtwVG1wXSxzdGVwICAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMl19LCBbcFNyY0xlZnRdLHN0ZXAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxM119LCBbcFRtcF0sc3RlcCAgICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNF19LCBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTVdfSwgW3BUbXBdICAgCisKKyAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmUsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTU6MTQ6MTM6MTI6MTE6MTA6OTo4XSAKKyAgICAgICAgVlNVQkwgICBxQWJvdmUxNW1pbnVzMCwgZFJldkFib3ZlLCBkQWJvdmVMZWZ0ICAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0gCisgICAgICAgIFZTSFIgICAgZFJldkFib3ZlNjQsIGRSZXZBYm92ZTY0LCAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzE0OjEzOjEyOjExOjEwOjk6ODpYXSAKKyAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLCBkUmV2QWJvdmUsIGRBYm92ZTAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNITCAgICBkQWJvdmVEaWZmNjQsIGRBYm92ZURpZmY2NCwgIzE2IAorICAgICAgICBWRVhUICAgIGREaWZmQWJvdmUxLCBkQWJvdmVEaWZmMSwgZEFib3ZlMTVtaW51czAsICMxICAKKworICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0LGRMZWZ0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzE1OjE0OjEzOjEyOjExOjEwOjk6OF0gCisgICAgICAgIFZTVUJMICAgcUxlZnQxNW1pbnVzMCxkUmV2TGVmdCwgZEFib3ZlTGVmdCAgICAgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXSAKKyAgICAgICAgVlNIUiAgICBkUmV2TGVmdDY0LCBkUmV2TGVmdDY0LCAjOCAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxNDoxMzoxMjoxMToxMDo5Ojg6WF0gCisgICAgICAgIFZTVUJMICAgcUxlZnREaWZmLGRSZXZMZWZ0LCBkTGVmdDAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBsaWVyID0gWzh8MXwyfC4uLnw2fDddCisgICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIsIFtwTXVsdFRhYmxlXSEgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZExlZnREaWZmNjQsIGRMZWZ0RGlmZjY0LCAjMTYKKyAgICAgICAgVkVYVCAgICBkRGlmZkxlZnQxLCBkTGVmdERpZmYxLCBkTGVmdDE1bWludXMwLCAjMSAgICAgCisgICAgICAgIAorICAgICAgICBWTVVMTCAgIHFILGREaWZmQWJvdmUwLCBkTXVsdGlwbGllcjAgICAgICAgICAgICAgICAgCisgICAgICAgIFZNVUxMICAgcVYsZERpZmZMZWZ0MCwgIGRNdWx0aXBsaWVyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1MQUwgICBxSCxkRGlmZkFib3ZlMSwgZE11bHRpcGxpZXIxIAorICAgICAgICBWTUxBTCAgIHFWLGREaWZmTGVmdDEsICBkTXVsdGlwbGllcjEKKyAgICAgICAgCisgICAgICAgIFZQQUREICAgZEhWMDAsZEgxLGRIMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWUEFERCAgIGRIVjAxLGRWMSxkVjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICBxSFYsIHFIVjAKKyAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMgorICAgICAgICBWQUREICAgIHFIVixxSFYscUhWMSAKKyAgICAgICAgCisgICAgICAgIDsvLyBIViA9IFtjID0gKCg1KlYrMzIpPj42KSB8IGIgPSAoKDUqSCszMik+PjYpXQorICAgICAgICBWUlNIUiAgIHFIVixxSFYsIzYKKyAgICAgICAgCisgICAgICAgIDsvLyBIVjEgPSBbYyo3fGIqN10KKyAgICAgICAgVlNITCAgICBxSFYxLHFIViwjMworICAgICAgICBWU1VCICAgIHFIVjEscUhWMSxxSFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGxpZXIxID0gWzB8MXwyfC4uLnw3XQorICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyMCwgW3BNdWx0VGFibGVdISAgICAKKyAgICAgICAgVkRVUCAgICBxQiwgZEhWMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkRVUCAgICBxQywgZEhWMSAKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgcUEsZEFib3ZlMSxkTGVmdDEKKyAgICAgICAgVlNITCAgICBxQSxxQSwgIzQKKyAgICAgICAgVkRVUCAgICBxQSxkQTFbM10gIAorICAgICAgICBWQUREICAgIGRCUGx1c0NNdWx0NywgZEhWMTAsIGRIVjExCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbGllcjEgPSBbOHw5fDEwfC4uLnwxNV0KKyAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllcjEsIFtwTXVsdFRhYmxlXQorICAgICAgICA7Ly8gQ29uc3QgPSBhIC0gNyooYitjKQorICAgICAgICBWRFVQICAgIHFDb25zdCwgZEJQbHVzQ011bHQ3UzE2WzBdCisgICAgICAgIFZTVUIgICAgcUNvbnN0LCBxQSwgcUNvbnN0CisgICAgICAgIAorICAgICAgICA7Ly8gQjAgPSBbMCpifDEqYnwyKmJ8MypifC4uLi4uLnw3KmJdCisgICAgICAgIFZNVUwgICAgcUIwLHFCLHFNdWx0aXBsaWVyMAorICAgICAgICAKKyAgICAgICAgOy8vIEIwID0gWzgqYnw5KmJ8MTAqYnwxMSpifC4uLi58MTUqYl0KKyAgICAgICAgVk1VTCAgICBxQjEscUIscU11bHRpcGxpZXIxCisgICAgICAgIAorICAgICAgICBWQUREICAgIHFTdW0wLCBxQjAsIHFDb25zdAorICAgICAgICBWQUREICAgIHFTdW0xLCBxQjEsIHFDb25zdCAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9vcHMgZm9yIDE2IHRpbWVzCitMb29wUGxhbmUgICAgICAgCisgICAgICAgIDsvLyAoYip4ICsgYyp5ICsgQyk+PjUKKyAgICAgICAgVlFSU0hSVU4gZE91dDAsIHFTdW0wLCM1CisgICAgICAgIFZRUlNIUlVOIGRPdXQxLCBxU3VtMSwjNSAgICAgIAorICAgICAgICBTVUJTICAgICB5LCB5LCAjMQorICAgICAgICBWU1QxICAgICBxT3V0LFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZBREQgICAgIHFTdW0wLHFTdW0wLHFDIAorICAgICAgICBWQUREICAgICBxU3VtMSxxU3VtMSxxQyAKKyAgICAgICAgQk5FICAgICAgTG9vcFBsYW5lCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAgICAgCisgICAgICAgIEVORAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZWI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKQEAgLTAsMCArMSw1MzEgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorICAgICAgICAgCisgICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAorICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgRENEICBPTVhfVkNfNHg0X0hVICAgCisgICAgCisgICAgICAgIAorICAgICAgICBJRiBDb3J0ZXhBOAorICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JldHVybiAgICAgICAgICBSTiAwCitwVGFibGUgICAgICAgICAgUk4gOAorcGMgICAgICAgICAgICAgIFJOIDE1CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCitwRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKK2xlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2F2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcERzdDEgICAgICAgICAgIFJOIDEgCitwRHN0MiAgICAgICAgICAgUk4gNCAKK3BEc3QzICAgICAgICAgICBSTiA2IAorCitwU3JjVG1wICAgICAgICAgUk4gOQorc3JjU3RlcCAgICAgICAgIFJOIDEwCitwRHN0VG1wICAgICAgICAgUk4gMTEKK2RzdGVwICAgICAgICAgICBSTiAxMgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gTmVvbiByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vIE9NWF9WQ19DSFJPTUFfVkVSVAorZEFib3ZlVTMyICAgICAgIEROICBEMC5VMzIKKworOy8vIE9NWF9WQ19DSFJPTUFfSE9SCitkTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKK2RMZWZ0VmFsMSAgICAgICBETiAgRDEuOAorZExlZnRWYWwyICAgICAgIEROICBEMi44CitkTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKK2RMZWZ0VmFsMFUzMiAgICBETiAgRDAuVTMyCitkTGVmdFZhbDFVMzIgICAgRE4gIEQxLlUzMgorZExlZnRWYWwyVTMyICAgIEROICBEMi5VMzIKK2RMZWZ0VmFsM1UzMiAgICBETiAgRDMuVTMyCisKKzsvLyBPTVhfVkNfNHg0X0RDCitkTGVmdFZhbCAgICAgICAgRE4gIEQwLlU4CitkTGVmdFZhbFUzMiAgICAgRE4gIEQwLlUzMgorZFN1bUFib3ZlTGVmdFUxNiAgRE4gIEQxLlUxNgorZFN1bUFib3ZlTGVmdFUzMiAgRE4gIEQxLlUzMgorZFN1bUFib3ZlTGVmdFU2NCAgRE4gIEQxLlU2NAorZFN1bUFib3ZlTGVmdFU4IEROICBEMS5VOAorZFN1bSAgICAgICAgICAgIEROICBEMC5VOAorCitkU3VtTGVmdFZhbFUxNiAgRE4gIEQxLlUxNgorZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKK2RTdW1MZWZ0VmFsVTY0ICBETiAgRDEuVTY0CitkU3VtTGVmdFZhbFU4ICAgRE4gIEQxLlU4CisKK2RBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKK2RTdW1BYm92ZVZhbFUxNiAgRE4gIEQxLlUxNgorZFN1bUFib3ZlVmFsVTMyICBETiAgRDEuVTMyCitkU3VtQWJvdmVWYWxVNjQgIEROICBEMS5VNjQKK2RTdW1BYm92ZVZhbFU4ICAgRE4gIEQxLlU4CitkQ29uc3QxMjhVOCAgICAgRE4gIEQwLlU4CisKKworOy8vT01YX1ZDXzR4NF9ESUFHX0RMCisKK2RBYm92ZSAgICAgICAgICBETiAgRDAuVTgKK2RVNyAgICAgICAgICAgICBETiAgRDIuVTgKK2RVMyAgICAgICAgICAgICBETiAgRDIuVTgKK2RBYm92ZTAgICAgICAgICBETiAgRDMuVTgKK2RBYm92ZTEgICAgICAgICBETiAgRDQuVTgKK2RBYm92ZTIgICAgICAgICBETiAgRDUuVTgKK2RUbXAgICAgICAgICAgICBETiAgRDYuVTgKK2RUbXAwICAgICAgICAgICBETiAgRDcuVTgKK2RUbXAxICAgICAgICAgICBETiAgRDguVTgKK2RUbXAyICAgICAgICAgICAgRE4gIEQ5LlU4CitkVG1wMyAgICAgICAgICAgIEROICBEMTAuVTgKK2RUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCisKKworOy8vT01YX1ZDXzR4NF9ESUFHX0RSCitkTGVmdCAgICAgICAgICAgRE4gIEQxLlU4CitkVUwgICAgICAgICAgICAgRE4gIEQyLlU4CisKKzsvL09NWF9WQ180eDRfVlIKK2RMZWZ0MCAgICAgICAgICBETiAgRDEuVTgKK2RMZWZ0MSAgICAgICAgICBETiAgRDIuVTgKK2RFdmVuMCAgICAgICAgICBETiAgRDMuVTgKK2RFdmVuMSAgICAgICAgICBETiAgRDQuVTgKK2RFdmVuMiAgICAgICAgICBETiAgRDUuVTgKK2RPZGQwICAgICAgICAgICBETiAgRDYuVTgKK2RPZGQxICAgICAgICAgICBETiAgRDExLlU4CitkT2RkMiAgICAgICAgICAgRE4gIEQxMi5VOAorZFRtcDNVMzIgICAgICAgIEROICBEMTAuVTMyICAgIAorZFRtcDJVMzIgICAgICAgIEROICBEOS5VMzIKKworCis7Ly9PTVhfVkNfNHg0X0hECitkVG1wMVU2NCAgICAgICAgRE4gIEQ4LlU2NAorZFRtcDBVNjQgICAgICAgIEROICBENy5VNjQKK2RUbXBVNjQgICAgICAgICBETiAgRDYuVTY0CitkVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgorZFRtcDFVMzIgICAgICAgIEROICBEOC5VMzIKKworOy8vT01YX1ZDXzR4NF9IVQorZEwzICAgICAgICAgICAgIEROICBEMi5VOAorZExlZnRIVTAgICAgICAgIEROICBEMy5VOAorZExlZnRIVTEgICAgICAgIEROICBENC5VOAorZExlZnRIVTIgICAgICAgIEROICBENS5VOAorZFRtcDBVMzIgICAgICAgIEROICBENy5VMzIKKworCisKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjEyLGQxMgorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSRCAgIHByZWRNb2RlLGF2YWlsYWJpbGl0eSxQcmVkTW9kZSAgICAgOy8vIEFyZyBwcmVkTW9kZSAmIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSRCAgIGxlZnRTdGVwLGRzdFN0ZXAsTGVmdFN0ZXAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCAmIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCisKK09NWF9WQ180eDRfSE9SCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwwW119LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMVtdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDJbXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwzW119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMVUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZExlZnRWYWwyVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDNVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorT01YX1ZDXzR4NF9WRVJUCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKK0RDUHJlZGljdDR4NFZlcnRTdG9yZSAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XSxkc3RlcAorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdLGRzdGVwCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0KKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXQorCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorCitPTVhfVkNfNHg0X0RDCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKKworICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgYWxzbworICAgICAgICBWTEQxICAgICBkTGVmdFZhbFUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMgfCAwKzFdIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVMzIsIGRTdW1BYm92ZUxlZnRVMTYgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFU2NCwgZFN1bUFib3ZlTGVmdFUzMiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdICsgcFNyY0xlZnRbMiszKzArMV1dICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdFU2NCxkU3VtQWJvdmVMZWZ0VTY0LCMzICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMworICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZUxlZnRVOFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDRMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0xlZnRbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0xlZnRbMiszKzArMV1dIAorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1MZWZ0VmFsVThbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAorICAgICAgICAKK0RDUHJlZGljdDR4NExlZnROb3RBdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgCisgICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCisgICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZQorCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UgCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10gIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjQWJvdmVbMiszIHwgMCsxXV0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gWyBYWFhYIHwgcFNyY0Fib3ZlWzIrMyswKzFdXSAKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVWYWxVOFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCisgICAgICAgIAorRENQcmVkaWN0NHg0Tm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKK09NWF9WQ180eDRfRElBR19ETAorICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgQkVRICAgICBEaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAorICAgICAgICBWRFVQICAgIGRVNywgZEFib3ZlMFs3XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU3fFU3fFU3fFU3fFU3XQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZTAsIGRVNywgIzEgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU2fFU1fFU0fFUzfFUyfFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZTAsIGRVNywgIzIgICAgICAgICAgICAgICA7Ly8gW1U3fFU3fFU3fFU2fFU1fFU0fFUzfFUyXSAKKyAgICAgICAgQiAgICAgICBEaWFnRExQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKKyAgICAgICAKK0RpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKKyAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KKworICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQorICAgICAgIAorRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKKyAgICAgICAgCisKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCisKK09NWF9WQ180eDRfRElBR19EUgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCisgICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1h8WHxYfFh8VTN8VTJ8VTF8VTBdCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHBEc3QxLHBEc3QsZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFtVMnxVMXxVMHxVTHxMMHxMMXxMMnxMM10gICAKKyAgICAgICAgQUREICAgICBwRHN0MixwRHN0MSxkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzQgICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8VUx8TDB8TDF8TDJdICAgCisgICAgICAgIEFERCAgICAgcERzdDMscERzdDIsZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCM1ICAgICAgICAgICAgICAgICA7Ly8gWyBYfFUzfFUyfFUxfFUwfFVMfEwwfEwxXSAgIAorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDNdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzBdLFsxXSxbMl0sWzNdIEAgcERzdDMKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QyXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsxXSxbMl0sWzNdLFs0XSBAIHBEc3QyCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0MV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMl0sWzNdLFs0XSxbNV0gQCBwRHN0MQorICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzNdLFs0XSxbNV0sWzZdIEAgcERzdAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKworT01YX1ZDXzR4NF9WUgorCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVTCxVMCxVMSxVMixVMworICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlswXSxbcFNyY0Fib3ZlXQorICAgICAgICBWTEQxICAgIGRBYm92ZVs3XSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICA7Ly8gW1VMfFh8WHxYfFUzfFUyfFUxfFUwXQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgTDAsTDEsTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MCA9IFtMMHxMMnxYfFh8WHxYfFh8WF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0MSA9IFtMMXwgWHxYfFh8WHxYfFh8WF0gICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0MFs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdDFbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnQwWzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkT2RkMixkQWJvdmUsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgVUwgXQorICAgICAgICBWRVhUICAgIGRFdmVuMCxkTGVmdDAsZE9kZDIsIzYgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMSBVMCBVTCBMMCBMMiBdCisgICAgICAgIFZFWFQgICAgZEV2ZW4xLGRMZWZ0MSxkT2RkMiwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwxIF0KKyAgICAgICAgVkVYVCAgICBkRXZlbjIsZExlZnQwLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDAgXQorICAgICAgICBWRVhUICAgIGRPZGQwLGRMZWZ0MSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMSBdCisgICAgICAgIFZFWFQgICAgZE9kZDEsZExlZnQwLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUyIFUxIFUwIFVMIEwwIF0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDEsIGRPZGQwLCBkT2RkMgorICAgICAgICBWUkhBREQgIGRUbXAxLCBkVG1wMSwgZE9kZDEgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA5IDcgNSAzIDEgXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMCwgZEV2ZW4wLCBkRXZlbjIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRFdmVuMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOCA2IDQgMiAwIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRUbXAzLGRUbXAxLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDkgNyA1IDMgXSAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA4IDYgNCAyIF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCisgICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQorICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfSEQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMworICAgICAgICBWTEQxICAgIGRBYm92ZSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly9kQWJvdmVMZWZ0VmFsID0gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgIAorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbM119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gWyBVMnxVMXxVMHxVTHxMMHxMMXxMMnxMMyBdICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjMiAgICAgICAgICAgICAgICAgOy8vIFsgVTF8VTB8VUx8TDB8TDF8TDJ8TDN8WCBdICAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzEgICAgICAgICAgICAgICAgIDsvLyBbIFUwfFVMfEwwfEwxfEwyfEwzfFh8WCBdICAgICAKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDAsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgNCB8IDYgfCA4IHwgWCB8IFggXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZSSEFERCAgZFRtcDEsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCisgICAgICAgIFZTSEwgICAgZFRtcDFVNjQsZFRtcDFVNjQsIzI0ICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDN8NXwgNyB8OSB8IFggfCBYIHwgWCB8IFggXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTSEwgICAgZFRtcFU2NCxkVG1wMFU2NCwjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDJ8NHw2fDh8IFggfCBYIHwgWCB8IFggXQorICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcCA9IFsgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgXQorICAgICAgICBWRVhUICAgIGRUbXAwLGRUbXAwLGRUbXAwLCM2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAgWHwgWHwgWHwgWHwgWHwgWHwgMCB8IDEgXQorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAsZFRtcDAsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHw3IF0KKyAgICAgICAKKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMV0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzB8MXwyfDNdCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlsxXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJ8M3w0fDVdCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzR8NXw2fDddCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzZ8N3w4fDldCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfVkwKKworICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgQkVRICAgICBEaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCisgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRBYm92ZTAsZEFib3ZlMCwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMixkQWJvdmUxLGRBYm92ZTEsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfCBYfFU3fFU2fFU1fFU0fFUzfFUyXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICBEaWFnVkxQcmVkaWN0NHg0U3RvcmUgICAgICAgICAKKyAgICAgICAKK0RpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCisgICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQorCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUyIFUxIFUwXQorICAgICAgICBWRVhUICAgIGRBYm92ZTEsIGRBYm92ZSwgZFUzLCAjNSAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCisgICAgICAgCitEaWFnVkxQcmVkaWN0NHg0U3RvcmUgIAorICAgICAgICAKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOHwgNnwgNHwgMnwgMCBdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAzLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcDMsIGRUbXAzLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA5fCA3fCA1fCAzfCAxIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA4fCA2fCA0fCAyIF0KKyAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wMixkVG1wMyxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOXwgN3wgNXwgMyBdCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzZdLFs0XSxbMl0sWzBdCisgICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQorICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzldLFs3XSxbNV0sWzNdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKK09NWF9WQ180eDRfSFUKKyAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKworICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwyfEwxfEwwfFh8WHxYfFhdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkTDMsZExlZnRbN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZExlZnRIVTAsZExlZnQsZEwzLCM0ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDJ8TDF8TDBdCisgICAgICAgIFZFWFQgICAgZExlZnRIVTEsZExlZnQsZEwzLCM1ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDJ8TDFdCisgICAgICAgIFZFWFQgICAgZExlZnRIVTIsZExlZnQsZEwzLCM2ICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDJdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAwLCBkTGVmdEhVMCwgZExlZnRIVTIKKyAgICAgICAgVlJIQUREICBkVG1wMCwgZFRtcDAsIGRMZWZ0SFUxICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDUgfCAzIHwgMSBdCisgICAgICAgIAorICAgICAgICBWUkhBREQgIGRUbXAxLCBkTGVmdEhVMSwgZExlZnRIVTAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA0IHwgMiB8IDAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMSA9IFRtcFs3fCA2fCA1fCA0fCAzfCAyfCAxfCAwXSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wMCA9IFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMM10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbM3wyfDF8MF0gCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs1fDR8M3wyXSAKKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzd8Nnw1fDRdICAKKyAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFs5fDh8N3w2XSAKKyAgICAgICAgCisgICAgICAgIAorRXhpdFByZWRpY3Q0eDQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzk0MzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDE0MCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgCisKKyAgICAKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorCis7Ly8gQVJNIFJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BwU3JjICAgICAgIFJOIDAKK3BEc3QgICAgICAgIFJOIDEKK1FQICAgICAgICAgIFJOIDIKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBVbnBhY2syeDIgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyYyAgICAgICAgUk4gOQorVmFsdWUgICAgICAgUk4gNAorVmFsdWUyICAgICAgUk4gNQorRmxhZyAgICAgICAgUk4gNgorc3RyT2Zmc2V0ICAgUk4gNworY3N0T2Zmc2V0ICAgUk4gOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityMHcwICAgICAgICBSTiAgMworcjB3MSAgICAgICAgUk4gIDQKKworYzB3MCAgICAgICAgUk4gIDUKK2MxdzAgICAgICAgIFJOICA2CisKK3JldHVybiAgICAgIFJOICAwCitwUVBEaXZUYWJsZSBSTiAgNQorcFFQTW9kVGFibGUgICAgUk4gIDYKK1NoaWZ0ICAgICAgICBSTiAgOQorU2NhbGUgICAgICAgIFJOICAyCisKKworCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworZFplcm8gICAgICAgRE4gIEQwLlUxNgorZEludlRyQ29lZmYgRE4gIEQwLlMxNgorZFNjYWxlICAgICAgRE4gIEQxLlMxNgorcURxbnRDb2VmZiAgUU4gIFExLlMzMgorZERxbnRDb2VmZiAgRE4gIEQyLlMxNgorCisKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIHI5CisgICAgICAgIAorICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIFZNT1YgICAgZFplcm8sICMwCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vIEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkWmVybyxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMCAgIAorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorCisKK3VucGFja0xvb3AKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCisgICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MKKyAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKKyAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKKyAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKKyAgICAgICAgCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQorICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+CisgICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly9JbnZUcmFuc2Zvcm1EQzJ4MjogSW5saW5lZCAoSW1wbGVtZW50ZWQgaW4gQVJNIFY2KQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKKworICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIExEUiAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBTQUREU1VCWCByMHcwLCByMHcwLCAgcjB3MCAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMDArYzAxLCBjMDAtYzAxIF0KKyAgICAgICAgU0FERFNVQlggcjB3MSwgcjB3MSwgIHIwdzEgICAgICAgICAgICAgICAgICAgOy8vIFsgYzEwK2MxMSwgYzEwLWMxMSBdCisgICAgICAgIAorICAgICAgICBMRFJTQiAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KKyAgICAgICAgTERSU0IgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdCisgICAgICAgIAorICAgICAgICBTQUREMTYgICBjMHcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDArZDEwLCBkMDErZDExIF0KKyAgICAgICAgU1NVQjE2ICAgYzF3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwLWQxMCwgZDAxLWQxMSBdCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvL0RlcXVhbnRDaHJvbWFEQzJ4MjogSW5saW5lZCAoTmVvbiBJbXBsZW1lbnRhdGlvbikKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTFNMICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgVk1PViAgICAgZEludlRyQ29lZmYsIGMwdzAsIGMxdzAgIAorICAgICAgICBWUkVWMzIgICBkSW52VHJDb2VmZixkSW52VHJDb2VmZiAgCisgICAgICAgIFZEVVAgICAgIGRTY2FsZSxTY2FsZSAKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgIHFEcW50Q29lZmYsZEludlRyQ29lZmYsZFNjYWxlCisgICAgICAgIFZTSFJOICAgIGREcW50Q29lZmYscURxbnRDb2VmZiwjMQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGREcW50Q29lZmYsW3BEc3RdICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yaW5nIGFsbCB0aGUgY29lZmZpY2llbnRzIGF0IG9uY2UKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgCisgICAgCisgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1Mjk5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpAQCAtMCwwICsxLDI2NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKzsvLyAKKzsvLyAKKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gSW1wb3J0L0V4cG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20vdG8gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIAorCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBDb3J0ZXhBOAorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwRGF0YSAgICAgICAgICAgICAgIFJOICAwCitRUCAgICAgICAgICAgICAgICAgIFJOICAxICAgIAorCisKKzsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCisKKzsvLyBBUk0gUmVnaXN0ZXJzCisKK3BRUERpdlRhYmxlICAgICAgICAgUk4gIDIKK3BRUE1vZFRhYmxlICAgICAgICAgUk4gIDMKK1NoaWZ0ICAgICAgICAgICAgICAgUk4gIDQKK1NjYWxlICAgICAgICAgICAgICAgUk4gIDUKKworOy8vIE5FT04gUmVnaXN0ZXJzCisKKzsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCitkSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYgICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2RSb3dTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgorZFJvd1N1bTIgICAgICAgICAgICBETiAgRDUuUzE2CitkUm93RGlmZjEgICAgICAgICAgIEROICBENi5TMTYKK2RSb3dEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgorCis7Ly8gUm93IG9wZXJhdGVkIHBpeGVscworZFJvd09wMCAgICAgICAgICAgICBETiAgRDAuUzE2CitkUm93T3AxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RSb3dPcDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZFJvd09wMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxUm93T3AwMSAgICAgICAgICAgIFFOICBRMC4zMgorcVJvd09wMjMgICAgICAgICAgICBRTiAgUTEuMzIKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2RDb2xTdW0xICAgICAgICAgICAgRE4gIEQ0LlMxNgorZENvbFN1bTIgICAgICAgICAgICBETiAgRDUuUzE2CitkQ29sRGlmZjEgICAgICAgICAgIEROICBENi5TMTYKK2RDb2xEaWZmMiAgICAgICAgICAgRE4gIEQ3LlMxNgorCis7Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKK2RDb2xPcDAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZENvbE9wMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkQ29sT3AyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RDb2xPcDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCis7Ly8gVGVtcG9yYXJ5IHNjcmF0Y2ggdmFyYWlibGVzCisKK2RTY2FsZSAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorcVJvdW5kMCAgICAgICAgICAgICBRTiAgUTMuUzMyCitxUm91bmQxICAgICAgICAgICAgIFFOICBRNC5TMzIKK3FSb3VuZDIgICAgICAgICAgICAgUU4gIFE1LlMzMgorcVJvdW5kMyAgICAgICAgICAgICBRTiAgUTYuUzMyCisKKzsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCitkT3V0MCAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RPdXQxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RPdXQyICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RPdXQzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKKworICAgICAgIAorICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0LHI1LGQxMworICAgIAorICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCisgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDQgRC1yZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCisgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgOy8vIFBlcmZvcm0gdGhlIGNvbG91bW4gb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gVHJhbnNwb3NlZCBmb3JtCisgICAgICAgIAorICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcERhdGFdCisgICAgICAgIExEUiAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgICAgICAgIDsvLyBRUCBEaXZpc2lvbiBsb29rLXVwLXRhYmxlIGJhc2UgcG9pbnRlcgorICAgICAgICBMRFIgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBTY2FsZSBmYWN0b3IgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyBBUk0gaW5zdHJ1Y3Rpb25zCisgICAgICAgIDsvLyBJbnRlcmxlYXZlZCB3aXRoIE5FT04gaW5zdHJ1Y3Rpb25zIGlub3JkZXIgdG8gRHVhbCBpc3N1ZQorICAgICAgICAKKyAgICAgICAgVkFERCAgICBkUm93U3VtMSxkSW4wLGRJbjEKKyAgICAgICAgVkFERCAgICBkUm93U3VtMixkSW4yLGRJbjMKKyAgICAgICAgVlNVQiAgICBkUm93RGlmZjEsZEluMCxkSW4xCisgICAgICAgIExEUlNCICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBWU1VCICAgIGRSb3dEaWZmMixkSW4yLGRJbjMKKyAgICAgICAgTERSU0IgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNjYWxlID0gcFFQTW9kVGFibGVbUVBdIAorICAgICAgICBWQUREICAgIGRSb3dPcDAsZFJvd1N1bTEsZFJvd1N1bTIKKyAgICAgICAgVlNVQiAgICBkUm93T3AxLGRSb3dTdW0xLGRSb3dTdW0yCisgICAgICAgIFZTVUIgICAgZFJvd09wMixkUm93RGlmZjEsZFJvd0RpZmYyCisgICAgICAgIExTTCAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgICAgOy8vIEFSTSBDT0RFOiBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIFZBREQgICAgZFJvd09wMyxkUm93RGlmZjEsZFJvd0RpZmYyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWVFJOICAgIGRSb3dPcDAsZFJvd09wMQorICAgICAgICBWVFJOICAgIGRSb3dPcDIsZFJvd09wMworICAgICAgICBWVFJOICAgIHFSb3dPcDAxLHFSb3dPcDIzIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICBkQ29sU3VtMSxkUm93T3AwLGRSb3dPcDEKKyAgICAgICAgVkFERCAgICBkQ29sU3VtMixkUm93T3AyLGRSb3dPcDMKKyAgICAgICAgVlNVQiAgICBkQ29sRGlmZjEsZFJvd09wMCxkUm93T3AxCisgICAgICAgIFZTVUIgICAgZENvbERpZmYyLGRSb3dPcDIsZFJvd09wMworICAgICAgICBWQUREICAgIGRDb2xPcDAsZENvbFN1bTEsZENvbFN1bTIKKyAgICAgICAgVlNVQiAgICBkQ29sT3AxLGRDb2xTdW0xLGRDb2xTdW0yCisgICAgICAgIFZTVUIgICAgZENvbE9wMixkQ29sRGlmZjEsZENvbERpZmYyCisgICAgICAgIFZBREQgICAgZENvbE9wMyxkQ29sRGlmZjEsZENvbERpZmYyCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLworICAgICAgICA7Ly8gPERlcXVhbnRpemU+IGltcHJvdmVzIG9uIHRoZSBjLXJlZmVyZW5jZSBjb2RlCisgICAgICAgIDsvLyBCb3RoIHRoZSAgY2FzZXMgaS5lLiwgU2hpZnQ+PTAgYW5kIFNoaWZ0PDAgY2FzZXMgYXJlIGNvdmVyZWQgdG9nZXRoZXIKKyAgICAgICAgOy8vIFdlIGRvIG5vdCBzdWJ0cmFjdCAyIGZyb20gU2hpZnQgYXMgaW4gQyByZWZlcmVuY2UsIGluc3RlYWQgcGVyZm9ybSBhCisgICAgICAgIDsvLyBTY2FsZSA8PCBTaGlmdCBvbmNlIGluIHRoZSBiZWdpbm5pbmcgYW5kIGRvIGEgcmlnaHQgc2hpZnQgYnkgYSAKKyAgICAgICAgOy8vIGNvbnN0YW50IDIgYWZ0ZXIgdGhlIE11bHRpcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgUm91bmQgd291bGQgYmUgMiAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gQnkgZG9pbmcgdGhpcyB3ZSBhdmlvZCB0aGUgQnJhbmNoZXMgcmVxdWlyZWQgYW5kIGFsc28gCisgICAgICAgIDsvLyByZWR1Y2UgdGhlIGNvZGUgc2l6ZSBzdWJzdGFudGlhbGx5CisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgZFNjYWxlLCBTY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQVJNIC0+IE5FT04gIGNvcHkgJ3NjYWxlJyB0byB2ZWN0b3IKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBWTU9WICAgIHFSb3VuZDAsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB0aGUgUm91bmQgVmFsdWUgCisgICAgICAgIFZNT1YgICAgcVJvdW5kMSwjMgorICAgICAgICBWTU9WICAgIHFSb3VuZDIsIzIKKyAgICAgICAgVk1PViAgICBxUm91bmQzLCMyCisgICAgICAgIAorICAgICAgICBWTUxBTCAgIHFSb3VuZDAsZENvbE9wMCxkU2NhbGUgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kIAorICAgICAgICBWTUxBTCAgIHFSb3VuZDEsZENvbE9wMSxkU2NhbGUKKyAgICAgICAgVk1MQUwgICBxUm91bmQyLGRDb2xPcDIsZFNjYWxlCisgICAgICAgIFZNTEFMICAgcVJvdW5kMyxkQ29sT3AzLGRTY2FsZQorICAgICAgICAKKyAgICAgICAgVlNIUk4gICBkT3V0MCxxUm91bmQwLCMyICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmlnaHQgc2hpZnQgYnkgMiAmIChPTVhfUzE2KVZhbHVlCisgICAgICAgIFZTSFJOICAgZE91dDEscVJvdW5kMSwjMgorICAgICAgICBWU0hSTiAgIGRPdXQyLHFSb3VuZDIsIzIKKyAgICAgICAgVlNIUk4gICBkT3V0MyxxUm91bmQzLCMyCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlNUMSAge2RPdXQwLGRPdXQxLGRPdXQyLGRPdXQzfSwgW3BEYXRhXQorCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgTV9FTkQgICAgICAgIAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKKyAgICAgICAgCisKKworOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorICAgIAorOy8vSW5wdXQgUmVnaXN0ZXJzCitwcFNyYyAgICAgICAgICAgICAgIFJOICAwCitwRHN0ICAgICAgICAgICAgICAgIFJOICAxCitRUFIyICAgICAgICAgICAgICAgIFJOICAyCisKKzsvL091dHB1dCBSZWdpc3RlcnMKK3Jlc3VsdCAgICAgICAgICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEc3RSNCAgICAgICAgICAgICAgUk4gIDQKK3BEc3RSMCAgICAgICAgICAgICAgUk4gIDAKK1FQUjEgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjUgICAgICAgICAgICAgICAgUk4gIDUKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQorICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCisgICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAorICAgIAorCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EyZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCithcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKK2FybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCisgICAgTERSICAgICAgcjQsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIE1WTiAgICAgIGxyLGxyCisgICAgTFNSICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKKyAgICBMU1IgICAgICByMTEscjExLCMxNgorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgorICAgIExTUiAgICAgIHIxMSxyMTEsIzE2CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2CisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4CisgICAgTFNSICAgICAgcjExLHIxMSwjMjQKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICM4CisgICAgTFNSICAgICAgcjExLHIxMSwjMjQKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjOAorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWVlMjIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZToKKyAgICBWTEQxLjMyICB7ZDE4WzBdfSxbcjVdIQorICAgIFZTVUJMLlU4IHExMSxkNSxkOQorICAgIFZNT1YgICAgIGQyOCxkMTgKKyAgICBWU1VCTC5VOCBxMTAsZDgsZDQKKyAgICBWU0hSLlMxNiBxMTEscTExLCMyCisgICAgVlpJUC44ICAgZDE4LGQyOAorICAgIFZCSUYgICAgIGQxOCxkMTQsZDE2CisgICAgVlJIQURELlMxNiBxMTAscTExLHExMAorICAgIFZBREQuSTggIGQzMSxkMTgsZDE1CisgICAgVlFNT1ZOLlMxNiBkMjAscTEwCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQorICAgIFZORUcuUzggIGQzMSxkMzEKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCisgICAgVk1PVkwuVTggcTE0LGQ0CisgICAgVk1PVkwuVTggcTEyLGQ4CisgICAgVkFERFcuUzggcTE0LHExNCxkMjAKKyAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAorICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKKyAgICBWUU1PVlVOLlMxNiBkMjQscTEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlOgorICAgIFZIQURELlU4IGQxMyxkNCxkOQorICAgIFZIQURELlU4IGQzMSxkOCxkNQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIFZSSEFERC5VOCBkMTMsZDEzLGQ1CisgICAgVlJIQURELlU4IGQzMSxkMzEsZDkKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2YzZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlOgorICAgIFZTVUJMLlU4IHExMSxkNSxkOQorICAgIFZMRDEuOCAgIHtkMThbXX0sW3I1XSEKKyAgICBWU1VCTC5VOCBxMTAsZDgsZDQKKyAgICBWTEQxLjggICB7ZDE5W119LFtyNV0hCisgICAgVlNIUi5TMTYgcTExLHExMSwjMgorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0CisgICAgVkFORCAgICAgZDE5LGQxNyxkMTUKKyAgICBWQklGICAgICBkMTgsZDE0LGQxNgorICAgIFZSSEFERC5TMTYgcTEwLHExMSxxMTAKKyAgICBWUkhBREQuVTggZDI0LGQ0LGQ4CisgICAgVkFERC5JOCAgZDMxLGQxOCxkMTkKKyAgICBWQU5EICAgICBkMTksZDEyLGQxNQorICAgIFZRQURELlU4IGQyMyxkNSxkMTgKKyAgICBWUU1PVk4uUzE2IGQyMCxxMTAKKyAgICBWQURELkk4ICBkMzEsZDMxLGQxOQorICAgIFZRU1VCLlU4IGQyMixkNSxkMTgKKyAgICBWUUFERC5VOCBkMTksZDksZDE4CisgICAgVkhBREQuVTggZDI2LGQyNCxkNgorICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCisgICAgVk5FRy5TOCAgZDMxLGQzMQorICAgIFZRU1VCLlU4IGQyMSxkOSxkMTgKKyAgICBWSEFERC5VOCBkMjcsZDI0LGQxMAorICAgIFZNQVguVTggIGQzMCxkMjYsZDIyCisgICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTU9WTC5VOCBxMTQsZDQKKyAgICBWTU9WTC5VOCBxMTIsZDgKKyAgICBWQUREVy5TOCBxMTQscTE0LGQyMAorICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCisgICAgVlFNT1ZVTi5TMTYgZDI5LHExNAorICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKKyAgICBWTUFYLlU4ICBkMjUsZDI3LGQyMQorICAgIFZNSU4uVTggIGQzMCxkMzAsZDIzCisgICAgVk1JTi5VOCAgZDI1LGQyNSxkMTkKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDMwLGQ1LGQxNworICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBWQklGICAgICBkMjUsZDksZDEyCisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlOgorICAgIFZTSFIuVTggIGQxOSxkMCwjMgorICAgIFZBREQuSTggIGQxOSxkMTksZDE1CisgICAgVkFEREwuVTggcTEwLGQ4LGQ0CisgICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKKyAgICBWQURETC5VOCBxMTEsZDYsZDkKKyAgICBWQUREVy5VOCBxMTIscTEwLGQ1CisgICAgVkNHVC5VOCAgZDE5LGQxOSxkMTMKKyAgICBWU0hSLlUxNiBxMTEscTExLCMxCisgICAgVkhBREQuVTE2IHExMSxxMTIscTExCisgICAgVkFERFcuVTggcTEyLHExMixkNgorICAgIFZBRERMLlU4IHExMyxkNyxkNgorICAgIFZBTkQgICAgIGQxNyxkMTcsZDE5CisgICAgVkhBREQuVTggZDI4LGQ0LGQ5CisgICAgVlNSQS5VMTYgcTEzLHExMiwjMQorICAgIFZBTkQgICAgIGQxMixkMTIsZDE5CisgICAgVlFSU0hSTi5VMTYgZDI5LHExMSwjMQorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ1CisgICAgVlFSU0hSTi5VMTYgZDMwLHExMiwjMgorICAgIFZBRERMLlU4IHExMSxkMTAsZDUKKyAgICBWQUREVy5VOCBxMTIscTEwLGQ5CisgICAgVkJJRiAgICAgZDI5LGQyOCxkMTcKKyAgICBWUVJTSFJOLlUxNiBkMzEscTEzLCMyCisgICAgVkFEREwuVTggcTEzLGQxMSxkMTAKKyAgICBWU0hSLlUxNiBxMTEscTExLCMxCisgICAgVkhBREQuVTE2IHExMSxxMTIscTExCisgICAgVkFERFcuVTggcTEyLHExMixkMTAKKyAgICBWSEFERC5VOCBkMjgsZDgsZDUKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgVkJJRiAgICAgZDMwLGQ1LGQxNworICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKKyAgICBWUVJTSFJOLlUxNiBkMjUscTEyLCMyCisgICAgVlFSU0hSTi5VMTYgZDI0LHExMSwjMQorICAgIFZSSEFERC5VOCBkMjIsZDI4LGQ5CisgICAgVkJJRiAgICAgZDI1LGQ5LGQxMgorICAgIFZCSUYgICAgIGQzMSxkNixkMTcKKyAgICBWQklGICAgICBkMjQsZDIyLGQxMgorICAgIFZRUlNIUk4uVTE2IGQyOCxxMTMsIzIKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVkJJRiAgICAgZDI4LGQxMCxkMTIKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhiZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKK2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgU1VCICAgICAgc3Asc3AsIzB4NDAKKyAgICBMRFIgICAgICByMTAsW3IwLCMwXQorICAgIExEUiAgICAgIHIxMixbcjEsIzBdCisgICAgTERSICAgICAgcjYsID1hcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KKyAgICBMRFJCICAgICByOSxbcjEwLCMyXQorICAgIExEUkIgICAgIHI4LFtyMTAsIzFdCisgICAgTERSQiAgICAgcjExLFtyMTBdLCMzCisgICAgQUREICAgICAgcjEyLHIxMiwjOAorICAgIExEUiAgICAgIHI2LFtyNixyNCxMU0wgIzJdCisgICAgT1JSICAgICAgcjkscjkscjgsTFNMICM4CisgICAgT1JSICAgICAgcjExLHI5LHIxMSxMU0wgIzE2CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIE1PVlMgICAgIHI3LCMweDFlCisgICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNworICAgIFNVQlMgICAgIHIxMixyMTIsIzgKK0wweDQ0OgorICAgIEJDQyAgICAgIEwxCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0wxOgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjNAorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHg3NAorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCMweGEKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHg0NAorTDB4NzQ6CisgICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCisgICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAorICAgIExTUlMgICAgIHI1LHI3LCMyCisgICAgU1RSQiAgICAgcjUsW3IyLCMwXQorICAgIEJFUSAgICAgIEwweDM0NAorICAgIENNUCAgICAgIHI3LCMweDQ0CisgICAgQkdFICAgICAgTDB4MzNjCisgICAgU1RSICAgICAgcjAsW3NwLCMwXQorICAgIFNUUiAgICAgIHIxLFtzcCwjNF0KKyAgICBTVFIgICAgICByMyxbc3AsIzhdCisgICAgQU5EUyAgICAgcjEscjcsIzMKKyAgICBBREQgICAgICByMixzcCwjMHhjCisgICAgQkVRICAgICAgTDB4ZDgKKyAgICBNT1YgICAgICByMCxyMQorTDB4YWM6CisgICAgTFNMUyAgICAgcjcscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzcKKyAgICBCQ0MgICAgICBMMgorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMMjoKKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgTFNSICAgICAgcjcscjcsIzMxCisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIE1PViAgICAgIHI4LCMxCisgICAgU1VCICAgICAgcjgscjgscjcsTFNMICMxCisgICAgU1RSSCAgICAgcjgsW3IyXSwjMgorICAgIEJHVCAgICAgIEwweGFjCitMMHhkODoKKyAgICBTVUJTICAgICByMCxyNSxyMQorICAgIEJFUSAgICAgIEwweDFiOAorICAgIE1PViAgICAgIHI0LCMxCisgICAgQ01QICAgICAgcjUsIzB4YQorICAgIE1PVkxFICAgIHI0LCMwCisgICAgQ01QICAgICAgcjEsIzMKKyAgICBNT1ZMVCAgICByMSwjNAorICAgIE1PVkdFICAgIHIxLCMyCisgICAgTU9WR0UgICAgcjQsIzAKK0wweGZjOgorICAgIExTTFMgICAgIHI3LHIxMSxyMTIKKyAgICBDTFogICAgICByNyxyNworICAgIEFERCAgICAgIHIxMixyMTIscjcKKyAgICBTVUJTICAgICByMTIscjEyLCM3CisgICAgQkNDICAgICAgTDMKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorICAgIEJDQyAgICAgIEwzCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0wzOgorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIENNUCAgICAgIHI3LCMweDEwCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgTU9WUyAgICAgbHIscjQKKyAgICBURVFFUSAgICByNywjMHhlCisgICAgTU9WRVEgICAgbHIsIzQKKyAgICBURVEgICAgICByNywjMHhmCisgICAgTU9WRVEgICAgbHIsIzB4YworICAgIFRFUUVRICAgIHI0LCMwCisgICAgQURERVEgICAgcjcscjcsIzB4ZgorICAgIFRFUSAgICAgIGxyLCMwCisgICAgQkVRICAgICAgTDB4MTg0CisgICAgTFNMICAgICAgcjMscjExLHIxMgorICAgIEFERCAgICAgIHIxMixyMTIsbHIKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgUlNCICAgICAgcjksbHIsIzB4MjAKKyAgICBCQ0MgICAgICBMNAorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCisgICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgQkNDICAgICAgTDQKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDQ6CisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIExTUiAgICAgIHIzLHIzLHI5CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU0wgICAgICByNyxyNyxyNAorICAgIEFERCAgICAgIHI3LHIzLHI3CitMMHgxODQ6CisgICAgQUREICAgICAgcjcscjcscjEKKyAgICBNT1YgICAgICByMSwjMgorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgUlNCQ1MgICAgcjgscjgsIzAKKyAgICBTVFJIICAgICByOCxbcjJdLCMyCisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICBMRFJTQiAgICByOCxbcjkscjRdCisgICAgVEVRICAgICAgcjQsIzAKKyAgICBNT1ZFUSAgICByNCwjMQorICAgIENNUCAgICAgIHI3LHI4CisgICAgQUREQ1MgICAgcjQscjQsIzEKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIEJHVCAgICAgIEwweGZjCitMMHgxYjg6CisgICAgTERSICAgICAgcjgsW3NwLCMweDZjXQorICAgIFNVQiAgICAgIHIwLHI1LCMxCisgICAgU1VCUyAgICAgcjEscjgscjUKKyAgICBBREQgICAgICByNCxzcCwjMHgyYworICAgIE1PViAgICAgIGxyLHI1CisgICAgU1VCICAgICAgbHIsbHIsIzEKKyAgICBCRVEgICAgICBMMHgyYjAKKyAgICBURVEgICAgICByOCwjNAorICAgIExEUkVRICAgIHI2LCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzIC0gNCkKKyAgICBMRFJORSAgICByNiwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzIC0gNCkKKyAgICBMRFIgICAgICByNixbcjYscjUsTFNMICMyXQorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBNT1ZTICAgICByNywjMHgxZQorICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKKyAgICBTVUJTICAgICByMTIscjEyLCM4CitMMHgxZjQ6CisgICAgQkNDICAgICAgTDUKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDU6CisgICAgTERSSCAgICAgcjcsW3I2LHI3XQorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBBREQgICAgICByMTIscjEyLCM0CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIEJDUyAgICAgIEwweDIyNAorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCMweGEKKyAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5CisgICAgQklDICAgICAgcjcscjcsIzEKKyAgICBCICAgICAgICBMMHgxZjQKK0wweDIyNDoKKyAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKKyAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCisgICAgQ01QICAgICAgcjcsIzB4MTAKKyAgICBCR0UgICAgICBMMHgzM2MKKyAgICBMRFIgICAgICByMywgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzIC0gNCkKKyAgICBBREQgICAgICByNCxzcCwjMHgyYworICAgIE1PVlMgICAgIHIxLHI3CisgICAgQUREICAgICAgbHIsbHIscjEKKyAgICBCRVEgICAgICBMMHgyYjAKK0wweDI0ODoKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIExEUiAgICAgIHI2LFtyMyxyMSxMU0wgIzJdCisgICAgQkxUICAgICAgTDB4MmJjCisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIE1PVlMgICAgIHI3LCMweGUKKyAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI4CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorTDB4MjY0OgorICAgIEJDQyAgICAgIEw2CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0w2OgorICAgIExEUkggICAgIHI3LFtyNixyN10KKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgQUREICAgICAgcjEyLHIxMiwjMworICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBCQ1MgICAgICBMMHgyOTQKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjOQorICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKKyAgICBCSUMgICAgICByNyxyNywjMQorICAgIEIgICAgICAgIEwweDI2NAorTDB4Mjk0OgorICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMworICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKKyAgICBDTVAgICAgICByNywjMHhmCisgICAgQkdFICAgICAgTDB4MzNjCisgICAgU1VCUyAgICAgcjEscjEscjcKKyAgICBTVFJCICAgICByNyxbcjRdLCMxCisgICAgQkdUICAgICAgTDB4MjQ4CitMMHgyYjA6CisgICAgU1VCUyAgICAgcjAscjAsIzEKKyAgICBCTFQgICAgICBMNworICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKK0w3OgorICAgIEJHVCAgICAgIEwweDJiMAorTDB4MmJjOgorICAgIFNUUkIgICAgIHIxLFtyNF0sIzEKKyAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCisgICAgVEVRICAgICAgcjgsIzB4ZgorICAgIEFEREVRICAgIGxyLGxyLCMxCisgICAgU1VCICAgICAgcjQscjQscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIFNVQiAgICAgIHIyLHIyLHI1CisgICAgTERSICAgICAgcjMsW3NwLCM4XQorICAgIExEUiAgICAgIHIwLFtyMywjMF0KKyAgICBURVEgICAgICByOCwjNAorICAgIExEUkVRICAgIHI2LCA9YXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgTERSTkUgICAgcjYsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKK0wweDJlYzoKKyAgICBMRFJCICAgICByOSxbcjRdLCMxCisgICAgTERSQiAgICAgcjgsW3I2LGxyXQorICAgIFNVQiAgICAgIGxyLGxyLCMxCisgICAgU1VCICAgICAgbHIsbHIscjkKKyAgICBMRFJTSCAgICByOSxbcjJdLCMyCisgICAgU1VCUyAgICAgcjUscjUsIzEKKyAgICBPUlJFUSAgICByOCxyOCwjMHgyMAorICAgIEFERCAgICAgIHIxLHI5LCMweDgwCisgICAgQ01QICAgICAgcjEsIzB4MTAwCisgICAgT1JSQ1MgICAgcjgscjgsIzB4MTAKKyAgICBURVEgICAgICByNSwjMAorICAgIFNUUkIgICAgIHI4LFtyMF0sIzEKKyAgICBTVFJCICAgICByOSxbcjBdLCMxCisgICAgTFNSICAgICAgcjkscjksIzgKKyAgICBCQ0MgICAgICBMOAorICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKK0w4OgorICAgIEJORSAgICAgIEwweDJlYworICAgIFNUUiAgICAgIHIwLFtyMywjMF0KKyAgICBMRFIgICAgICByMCxbc3AsIzBdCisgICAgTERSICAgICAgcjEsW3NwLCM0XQorICAgIEIgICAgICAgIEwweDM0NAorTDB4MzNjOgorICAgIE1WTiAgICAgIHIwLCMxCisgICAgQiAgICAgICAgTDB4MzVjCitMMHgzNDQ6CisgICAgQUREICAgICAgcjEwLHIxMCxyMTIsTFNSICMzCisgICAgQU5EICAgICAgcjEyLHIxMiwjNworICAgIFNVQiAgICAgIHIxMCxyMTAsIzQKKyAgICBTVFIgICAgICByMTIsW3IxLCMwXQorICAgIFNUUiAgICAgIHIxMCxbcjAsIzBdCisgICAgTU9WICAgICAgcjAsIzAKK0wweDM1YzoKKyAgICBBREQgICAgICBzcCxzcCwjMHg0MAorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYjQyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXgKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4VTE2CisKK2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0OgorICAgIC5ieXRlICAwLCAyLCAwLCAyCisgICAgLmJ5dGUgIDIsIDEsIDIsIDEKKyAgICAuYnl0ZSAgMCwgMiwgMCwgMgorICAgIC5ieXRlICAyLCAxLCAyLCAxCisKK2FybVZDTTRQMTBfUG9zVG9WQ29sMngyOgorICAgIC5ieXRlICAwLCAyCisgICAgLmJ5dGUgIDIsIDEKKworYXJtVkNNNFAxMF9WTWF0cml4OgorICAgIC5ieXRlICAxMCwgMTYsIDEzCisgICAgLmJ5dGUgIDExLCAxOCwgMTQKKyAgICAuYnl0ZSAgMTMsIDIwLCAxNgorICAgIC5ieXRlICAxNCwgMjMsIDE4CisgICAgLmJ5dGUgIDE2LCAyNSwgMjAKKyAgICAuYnl0ZSAgMTgsIDI5LCAyMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9RUERpdlRhYmxlOgorICAgIC5ieXRlICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKKyAgICAuYnl0ZSAgMSwgIDEsICAxLCAgMSwgIDEsICAxCisgICAgLmJ5dGUgIDIsICAyLCAgMiwgIDIsICAyLCAgMgorICAgIC5ieXRlICAzLCAgMywgIDMsICAzLCAgMywgIDMKKyAgICAuYnl0ZSAgNCwgIDQsICA0LCAgNCwgIDQsICA0CisgICAgLmJ5dGUgIDUsICA1LCAgNSwgIDUsICA1LCAgNQorICAgIC5ieXRlICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKKyAgICAuYnl0ZSAgNywgIDcsICA3LCAgNywgIDcsICA3CisgICAgLmJ5dGUgIDgsICA4LCAgOCwgIDgsICA4LCAgOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCis7Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfUVBNb2R1bG9UYWJsZToKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9WTWF0cml4VTE2OgorICAgIC5od29yZCAxMCwgMTYsIDEzCisgICAgLmh3b3JkIDExLCAxOCwgMTQKKyAgICAuaHdvcmQgMTMsIDIwLCAxNgorICAgIC5od29yZCAxNCwgMjMsIDE4CisgICAgLmh3b3JkIDE2LCAyNSwgMjAKKyAgICAuaHdvcmQgMTgsIDI5LCAyMworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JjNjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZToKKyAgICBNT1YgICAgICByMTIscjgKKyAgICBBTkQgICAgICByNyxyMCwjMworICAgIEJJQyAgICAgIHIwLHIwLCMzCisgICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCisgICAgTk9QCisgICAgQiAgICAgICAgQ29weTB0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5MXRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkydG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weTN0b0FsaWduZWQKK0NvcHkwdG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTB0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5RW5kCitDb3B5MXRvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgTFNSICAgICAgcjcscjcsIzgKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMyNAorICAgIExTUiAgICAgIHIxMCxyMTAsIzgKKyAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzI0CisgICAgTFNSICAgICAgcjExLHIxMSwjOAorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5MXRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlFbmQKK0NvcHkydG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBMU1IgICAgICByNyxyNywjMTYKKyAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICMxNgorICAgIExTUiAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMxNgorICAgIExTUiAgICAgIHIxMSxyMTEsIzE2CisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkydG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weUVuZAorQ29weTN0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIExTUiAgICAgIHI3LHI3LCMyNAorICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzgKKyAgICBMU1IgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjOAorICAgIExTUiAgICAgIHIxMSxyMTEsIzI0CisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkzdG9BbGlnbmVkCitDb3B5RW5kOgorICAgIE1PViAgICAgIHIwLHIxMgorICAgIE1PViAgICAgIHIxLCMweGMKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmU6CisgICAgQU5EICAgICAgcjcscjAsIzMKKyAgICBCSUMgICAgICByMCxyMCwjMworICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgorICAgIE5PUAorICAgIEIgICAgICAgIENvcHkwdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkxdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkydG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkzdG9WQWxpZ25lZAorQ29weTB0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5MHRvVkFsaWduZWQKKyAgICBCICAgICAgICBDb3B5VkVuZAorQ29weTF0b1ZBbGlnbmVkOgorICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgTFNMICAgICAgcjEwLHIxMCwjMjQKKyAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICM4CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkxdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlWRW5kCitDb3B5MnRvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjEwLFtyMCwjNF0KKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBMU0wgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzE2CisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkydG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlWRW5kCitDb3B5M3RvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjEwLFtyMCwjNF0KKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBMU0wgICAgICByMTAscjEwLCM4CisgICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMjQKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTN0b1ZBbGlnbmVkCitDb3B5VkVuZDoKKyAgICBTVUIgICAgICByMCxyOCwjMHgxYworICAgIE1PViAgICAgIHIxLCM0CisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5MjIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgQU5EICAgICAgcjEyLHIwLCMzCisgICAgQklDICAgICAgcjAscjAsIzMKKyAgICBBREQgICAgICBwYyxwYyxyMTIsTFNMICMyCisgICAgTk9QCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMAorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjEKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24yCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMworQ29weTR4NEFsaWduMDoKKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjUsW3IwXSxyMQorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIExEUiAgICAgIHI5LFtyMF0scjEKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgU1RSICAgICAgcjksW3IyXSxyMworICAgIEIgICAgICAgIENvcHk0eDRFbmQKK0NvcHk0eDRBbGlnbjE6CisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCM4CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjOAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCM4CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjOAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgQiAgICAgICAgQ29weTR4NEVuZAorQ29weTR4NEFsaWduMjoKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzE2CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgorICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMU1IgICAgICByOCxyOCwjMTYKKyAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjMTYKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMxNgorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgQiAgICAgICAgQ29weTR4NEVuZAorQ29weTR4NEFsaWduMzoKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzI0CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMyNAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzI0CisgICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMyNAorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKK0NvcHk0eDRFbmQ6CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGFiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBNT1YgICAgICBsciwjNAorICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCisgICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKK0xvb3BTdGFydDE6CisgICAgTERSICAgICAgcjExLFtyMCwjMHhjXQorICAgIExEUiAgICAgIHIxMCxbcjAsIzhdCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBVUVNVQjE2ICByMTEscjExLHI2CisgICAgVVFTVUIxNiAgcjEwLHIxMCxyNgorICAgIFVRU1VCMTYgIHI1LHI1LHI2CisgICAgVVFTVUIxNiAgcjQscjQscjYKKyAgICBVU0FUMTYgICByMTEsIzEzLHIxMQorICAgIFVTQVQxNiAgIHIxMCwjMTMscjEwCisgICAgVVNBVDE2ICAgcjUsIzEzLHI1CisgICAgVVNBVDE2ICAgcjQsIzEzLHI0CisgICAgQU5EICAgICAgcjExLHIxMixyMTEsTFNSICM1CisgICAgQU5EICAgICAgcjEwLHIxMixyMTAsTFNSICM1CisgICAgQU5EICAgICAgcjUscjEyLHI1LExTUiAjNQorICAgIEFORCAgICAgIHI0LHIxMixyNCxMU1IgIzUKKyAgICBPUlIgICAgICByMTEscjEwLHIxMSxMU0wgIzgKKyAgICBPUlIgICAgICByMTAscjQscjUsTFNMICM4CisgICAgU1VCUyAgICAgbHIsbHIsIzEKKyAgICBTVFJEICAgICByMTAscjExLFtyN10sIzgKKyAgICBCR1QgICAgICBMb29wU3RhcnQxCisgICAgU1VCICAgICAgcjAscjcsIzB4MjAKKyAgICBNT1YgICAgICByMSwjOAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAorICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCisgICAgTU9WICAgICAgbHIsIzIKK0xvb3BTdGFydDoKKyAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCisgICAgTERSICAgICAgcjEwLFtyMCwjOF0KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKKyAgICBVUVNVQjE2ICByMTAscjEwLHI2CisgICAgVVFTVUIxNiAgcjUscjUscjYKKyAgICBVUVNVQjE2ICByNCxyNCxyNgorICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCisgICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKKyAgICBVU0FUMTYgICByNSwjMTMscjUKKyAgICBVU0FUMTYgICByNCwjMTMscjQKKyAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKKyAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKKyAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1CisgICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQorICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAorICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKKyAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKKyAgICBTVFIgICAgICByNCxbcjddLCM4CisgICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2CisgICAgU1RSICAgICAgcjUsW3I3XSwjLTQKKyAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCisgICAgTERSICAgICAgcjEwLFtyMCwjOF0KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKKyAgICBVUVNVQjE2ICByMTAscjEwLHI2CisgICAgVVFTVUIxNiAgcjUscjUscjYKKyAgICBVUVNVQjE2ICByNCxyNCxyNgorICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCisgICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKKyAgICBVU0FUMTYgICByNSwjMTMscjUKKyAgICBVU0FUMTYgICByNCwjMTMscjQKKyAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKKyAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKKyAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1CisgICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQorICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAorICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKKyAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKKyAgICBTVUJTICAgICBscixsciwjMQorICAgIFNUUiAgICAgIHI0LFtyN10sIzgKKyAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKKyAgICBTVFIgICAgICByNSxbcjddLCM0CisgICAgQkdUICAgICAgTG9vcFN0YXJ0CisgICAgU1VCICAgICAgcjAscjcsIzB4MTgKKyAgICBNT1YgICAgICByMSwjNAorICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzMwOTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZNT1YuSTE2IGQzMSwjMHgxNAorICAgIFZNT1YuSTE2IGQzMCwjMHg1CisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxNSxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQxMCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE2LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDEwLGQxMCxkOAorICAgIFZNTEEuSTE2IGQxMixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE3LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDEyLGQxMixkOAorICAgIFZNTEEuSTE2IGQxNCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE4LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDE0LGQxNCxkOAorICAgIFZNTEEuSTE2IGQxNixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE5LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDE2LGQxNixkOAorICAgIFZNTEEuSTE2IGQxOCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMCxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQxOCxkMTgsZDgKKyAgICBWTUxBLkkxNiBkMjAsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTEsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMjAsZDIwLGQ4CisgICAgVk1MQS5JMTYgZDIyLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTEyLGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDIyLGQyMixkOAorICAgIFZNTEEuSTE2IGQyNCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMyxkMCxkMQorICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKKyAgICBWTUxBLkkxNiBkMjYsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVk1PVi5JMzIgcTE1LCMweDE0CisgICAgVk1PVi5JMzIgcTE0LCMweDUKKyAgICBWQURETC5TMTYgcTUsZDEwLGQyMAorICAgIFZBRERMLlMxNiBxMSxkMTQsZDE2CisgICAgVkFEREwuUzE2IHEwLGQxMixkMTgKKyAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4CisgICAgVk1MQS5JMzIgcTUscTEscTE1CisgICAgVk1VTC5JMzIgcTQscTAscTE0CisgICAgVkFEREwuUzE2IHE2LGQxMixkMjIKKyAgICBWQURETC5TMTYgcTEsZDE2LGQxOAorICAgIFZBRERMLlMxNiBxMCxkMTQsZDIwCisgICAgVk1MQS5JMzIgcTYscTEscTE1CisgICAgVlNVQi5JMzIgcTUscTUscTQKKyAgICBWTVVMLkkzMiBxNCxxMCxxMTQKKyAgICBWQURETC5TMTYgcTIsZDE0LGQyNAorICAgIFZBRERMLlMxNiBxMSxkMTgsZDIwCisgICAgVkFEREwuUzE2IHEwLGQxNixkMjIKKyAgICBWTUxBLkkzMiBxMixxMSxxMTUKKyAgICBWU1VCLkkzMiBxNixxNixxNAorICAgIFZNVUwuSTMyIHE0LHEwLHExNAorICAgIFZBRERMLlMxNiBxMyxkMTYsZDI2CisgICAgVkFEREwuUzE2IHExLGQyMCxkMjIKKyAgICBWQURETC5TMTYgcTAsZDE4LGQyNAorICAgIFZNTEEuSTMyIHEzLHExLHExNQorICAgIFZTVUIuSTMyIHEyLHEyLHE0CisgICAgVk1MUy5JMzIgcTMscTAscTE0CisgICAgVlFSU0hSVU4uUzMyIGQwLHE1LCMxMAorICAgIFZRUlNIUlVOLlMzMiBkMixxNiwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAorICAgIFZRTU9WTi5VMTYgZDAscTAKKyAgICBWUU1PVk4uVTE2IGQyLHExCisgICAgVlFNT1ZOLlUxNiBkNCxxMgorICAgIFZRTU9WTi5VMTYgZDYscTMKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWMzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgorICAgIFZNT1YuSTggIGQzMCwjMHg1CisgICAgVk1PVi5JOCAgZDMxLCMweDE0CisgICAgVkxEMS44ICAge2QxMCxkMTF9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2QyLGQzfSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxMixkMTN9LFtyMTJdLHIxCisgICAgVkFEREwuVTggcTksZDAsZDEwCisgICAgVkxEMS44ICAge2Q0LGQ1fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTAsZDEsZDExCisgICAgVkxEMS44ICAge2Q2LGQ3fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTEwLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkOCxkOX0sW3IwXSxyMQorICAgIFZNTEFMLlU4IHE5LGQ0LGQzMQorICAgIFZMRDEuOCAgIHtkMTQsZDE1fSxbcjEyXSxyMQorICAgIFZNTEFMLlU4IHEwLGQ1LGQzMQorICAgIFZMRDEuOCAgIHtkMTYsZDE3fSxbcjEyXSxyMQorICAgIFZNTEFMLlU4IHE5LGQ2LGQzMQorICAgIFZNTEFMLlU4IHExMCxkNixkMzEKKyAgICBWTUxTTC5VOCBxMCxkMyxkMzAKKyAgICBWQURETC5VOCBxMTEsZDQsZDE0CisgICAgVk1MU0wuVTggcTksZDIsZDMwCisgICAgVkFEREwuVTggcTEsZDMsZDEzCisgICAgVk1MQUwuVTggcTAsZDcsZDMxCisgICAgVk1MQUwuVTggcTEwLGQ4LGQzMQorICAgIFZNTFNMLlU4IHE5LGQ4LGQzMAorICAgIFZNTEFMLlU4IHExLGQ3LGQzMQorICAgIFZNTFNMLlU4IHEwLGQ5LGQzMAorICAgIFZNTEFMLlU4IHExMSxkOCxkMzEKKyAgICBWTUxTTC5VOCBxMTAsZDQsZDMwCisgICAgVk1MU0wuVTggcTEsZDUsZDMwCisgICAgVkFEREwuVTggcTIsZDUsZDE1CisgICAgVk1MQUwuVTggcTExLGQxMCxkMzEKKyAgICBWTUxTTC5VOCBxMTAsZDEwLGQzMAorICAgIFZNTEFMLlU4IHExLGQ5LGQzMQorICAgIFZNTEFMLlU4IHEyLGQ5LGQzMQorICAgIFZBRERMLlU4IHExMixkNixkMTYKKyAgICBWTUxTTC5VOCBxMTEsZDYsZDMwCisgICAgVk1MU0wuVTggcTEsZDExLGQzMAorICAgIFZNTFNMLlU4IHEyLGQ3LGQzMAorICAgIFZBRERMLlU4IHEzLGQ3LGQxNworICAgIFZNTEFMLlU4IHExMixkMTAsZDMxCisgICAgVk1MU0wuVTggcTExLGQxMixkMzAKKyAgICBWTUxTTC5VOCBxMixkMTMsZDMwCisgICAgVk1MQUwuVTggcTMsZDExLGQzMQorICAgIFZNTEFMLlU4IHExMixkMTIsZDMxCisgICAgVkVYVC44ICAgZDI2LGQxOCxkMTksIzIKKyAgICBWTUxBTC5VOCBxMixkMTEsZDMxCisgICAgVk1MQUwuVTggcTMsZDEzLGQzMQorICAgIFZNTFNMLlU4IHExMixkOCxkMzAKKyAgICBWRVhULjggICBkMjcsZDE4LGQxOSwjNAorICAgIFZNT1YuSTE2IGQzMSwjMHgxNAorICAgIFZNTFNMLlU4IHEzLGQ5LGQzMAorICAgIFZNTFNMLlU4IHExMixkMTQsZDMwCisgICAgVkVYVC44ICAgZDI5LGQxOSxkMCwjMgorICAgIFZFWFQuOCAgIGQyOCxkMTgsZDE5LCM2CisgICAgVk1MU0wuVTggcTMsZDE1LGQzMAorICAgIFZBRERMLlMxNiBxMCxkMTgsZDI5CisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorICAgIFZBREQuSTE2IGQyNixkMjYsZDE5CisgICAgVk1MQUwuUzE2IHEwLGQyNyxkMzEKKyAgICBWRVhULjggICBkMjcsZDIwLGQyMSwjNAorICAgIFZFWFQuOCAgIGQyOCxkMjAsZDIxLCM2CisgICAgVkVYVC44ICAgZDI5LGQyMSxkMiwjMgorICAgIFZNTFNMLlMxNiBxMCxkMjYsZDMwCisgICAgVkVYVC44ICAgZDI2LGQyMCxkMjEsIzIKKyAgICBWQURETC5TMTYgcTEsZDIwLGQyOQorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVkFERC5JMTYgZDI2LGQyNixkMjEKKyAgICBWRVhULjggICBkMjgsZDIyLGQyMywjNgorICAgIFZNTEFMLlMxNiBxMSxkMjcsZDMxCisgICAgVkVYVC44ICAgZDI5LGQyMyxkNCwjMgorICAgIFZFWFQuOCAgIGQyNyxkMjIsZDIzLCM0CisgICAgVkVYVC44ICAgZDgsZDIyLGQyMywjMgorICAgIFZBRERMLlMxNiBxMixkMjIsZDI5CisgICAgVk1MU0wuUzE2IHExLGQyNixkMzAKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZBREQuSTE2IGQyNixkOCxkMjMKKyAgICBWRVhULjggICBkMjgsZDI0LGQyNSwjNgorICAgIFZNTEFMLlMxNiBxMixkMjcsZDMxCisgICAgVkVYVC44ICAgZDI3LGQyNCxkMjUsIzQKKyAgICBWRVhULjggICBkMjksZDI1LGQ2LCMyCisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWRVhULjggICBkOCxkMjQsZDI1LCMyCisgICAgVkFEREwuUzE2IHEzLGQyNCxkMjkKKyAgICBWTUxTTC5TMTYgcTIsZDI2LGQzMAorICAgIFZNTEFMLlMxNiBxMyxkMjcsZDMxCisgICAgVkFERC5JMTYgZDgsZDgsZDI1CisgICAgVk1MU0wuUzE2IHEzLGQ4LGQzMAorICAgIFZRUlNIUlVOLlMzMiBkMCxxMCwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDIscTEsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKKyAgICBWUU1PVk4uVTE2IGQwLHEwCisgICAgVlFNT1ZOLlUxNiBkMixxMQorICAgIFZRTU9WTi5VMTYgZDQscTIKKyAgICBWUU1PVk4uVTE2IGQ2LHEzCisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlMTQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDcyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2QyMixkMjN9LFtyMF0scjEKKyAgICBWRVhULjggICBkMTAsZDIyLGQyMywjNQorICAgIFZFWFQuOCAgIGQxMixkMjIsZDIzLCMxCisgICAgVkVYVC44ICAgZDE0LGQyMixkMjMsIzIKKyAgICBWRVhULjggICBkMTUsZDIyLGQyMywjMworICAgIFZFWFQuOCAgIGQxMyxkMjIsZDIzLCM0CisgICAgVkFEREwuVTggcTExLGQyMixkMTAKKyAgICBWQURETC5VOCBxNCxkMTQsZDE1CisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZMRDEuOCAgIHtkMjQsZDI1fSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDIyLGQ4LGQzMQorICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKKyAgICBWRVhULjggICBkMTAsZDI0LGQyNSwjNQorICAgIFZFWFQuOCAgIGQxMixkMjQsZDI1LCMxCisgICAgVkVYVC44ICAgZDE2LGQyNCxkMjUsIzIKKyAgICBWRVhULjggICBkMTcsZDI0LGQyNSwjMworICAgIFZFWFQuOCAgIGQxMyxkMjQsZDI1LCM0CisgICAgVkFEREwuVTggcTEyLGQyNCxkMTAKKyAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4CisgICAgVkFEREwuVTggcTQsZDE2LGQxNworICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTEQxLjggICB7ZDI2LGQyN30sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQyNCxkOCxkMzEKKyAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCisgICAgVkVYVC44ICAgZDEwLGQyNixkMjcsIzUKKyAgICBWRVhULjggICBkMTIsZDI2LGQyNywjMQorICAgIFZFWFQuOCAgIGQxOCxkMjYsZDI3LCMyCisgICAgVkVYVC44ICAgZDE5LGQyNixkMjcsIzMKKyAgICBWRVhULjggICBkMTMsZDI2LGQyNywjNAorICAgIFZBRERMLlU4IHExMyxkMjYsZDEwCisgICAgVlNVQi5JMTYgZDI0LGQyNCxkOAorICAgIFZBRERMLlU4IHE0LGQxOCxkMTkKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVkxEMS44ICAge2QyOCxkMjl9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMjYsZDgsZDMxCisgICAgVk1VTC5JMTYgZDgsZDEyLGQzMAorICAgIFZFWFQuOCAgIGQxMCxkMjgsZDI5LCM1CisgICAgVkVYVC44ICAgZDEyLGQyOCxkMjksIzEKKyAgICBWRVhULjggICBkMjAsZDI4LGQyOSwjMgorICAgIFZFWFQuOCAgIGQyMSxkMjgsZDI5LCMzCisgICAgVkVYVC44ICAgZDEzLGQyOCxkMjksIzQKKyAgICBWQURETC5VOCBxMTQsZDI4LGQxMAorICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKKyAgICBWQURETC5VOCBxNCxkMjAsZDIxCisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZNTEEuSTE2IGQyOCxkOCxkMzEKKyAgICBWTUxTLkkxNiBkMjgsZDEyLGQzMAorICAgIFZRUlNIUlVOLlMxNiBkMjIscTExLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyNCxxMTIsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDI2LHExMywjNQorICAgIFZRUlNIUlVOLlMxNiBkMjgscTE0LCM1CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ODQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDU4IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxCisgICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgorICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTJ9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCisgICAgVkFEREwuVTggcTAsZDcsZDEyCisgICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTN9LFtyMTJdLHIxCisgICAgVkxEMS44ICAge2QxMX0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkMTR9LFtyMTJdLHIxCisgICAgVkFEREwuVTggcTgsZDgsZDExCisgICAgVkFEREwuVTggcTksZDksZDEwCisgICAgVkxEMS44ICAge2QxNX0sW3IxMl0scjEKKyAgICBWTUxTLkkxNiBkMCxkMTYsZDMwCisgICAgVk1VTC5JMTYgZDIwLGQxOCxkMzEKKyAgICBWQURETC5VOCBxOCxkOSxkMTIKKyAgICBWQURETC5VOCBxOSxkMTAsZDExCisgICAgVkFEREwuVTggcTEsZDgsZDEzCisgICAgVk1MUy5JMTYgZDIsZDE2LGQzMAorICAgIFZNVUwuSTE2IGQyMSxkMTgsZDMxCisgICAgVkFEREwuVTggcTgsZDEwLGQxMworICAgIFZBRERMLlU4IHE5LGQxMSxkMTIKKyAgICBWQURETC5VOCBxMixkOSxkMTQKKyAgICBWTUxTLkkxNiBkNCxkMTYsZDMwCisgICAgVk1VTC5JMTYgZDIyLGQxOCxkMzEKKyAgICBWQURETC5VOCBxOCxkMTEsZDE0CisgICAgVkFEREwuVTggcTMsZDEwLGQxNQorICAgIFZBRERMLlU4IHE5LGQxMixkMTMKKyAgICBWTUxTLkkxNiBkNixkMTYsZDMwCisgICAgVkFERC5JMTYgZDAsZDAsZDIwCisgICAgVkFERC5JMTYgZDIsZDIsZDIxCisgICAgVkFERC5JMTYgZDQsZDQsZDIyCisgICAgVk1MQS5JMTYgZDYsZDE4LGQzMQorICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMixxMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkNCxxMiwjNQorICAgIFZRUlNIUlVOLlMxNiBkNixxMywjNQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTIwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKK2FybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvOgorICAgIC53b3JkICAgV2lkdGhJczJNVklzTm90WmVybywgV2lkdGhJczJNVklzTm90WmVybworICAgIC53b3JkICAgV2lkdGhJczRNVklzTm90WmVybywgV2lkdGhJczRNVklzTm90WmVybworICAgIC53b3JkICAgV2lkdGhJczhNVklzTm90WmVybworCithcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybzoKKyAgICAud29yZCAgIFdpZHRoSXMyTVZJc1plcm8sIFdpZHRoSXMyTVZJc1plcm8KKyAgICAud29yZCAgIFdpZHRoSXM0TVZJc1plcm8sIFdpZHRoSXM0TVZJc1plcm8KKyAgICAud29yZCAgIFdpZHRoSXM4TVZJc1plcm8KKworICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWE6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg3MF0KKyAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NjhdCisgICAgUlNCICAgICAgcjgscjYsIzgKKyAgICBSU0IgICAgICByOSxyNywjOAorICAgIENNTiAgICAgIHI2LHI3CisgICAgTU9WICAgICAgcjEwLCMxCisgICAgTERSRVEgICAgcjExLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8KKyAgICBTVUIgICAgICBscixyMSxyMTAKKyAgICBMRFJORSAgICByMTEsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybworICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBTTVVMQkIgICByMTIscjgscjkKKyAgICBTTVVMQkIgICByOSxyNixyOQorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNNVUxCQiAgIHI4LHI4LHI3CisgICAgU01VTEJCICAgcjYscjYscjcKKyAgICBWRFVQLjggICBkMTIscjEyCisgICAgVkRVUC44ICAgZDEzLHI5CisgICAgVkRVUC44ICAgZDE0LHI4CisgICAgVkRVUC44ICAgZDE1LHI2CisgICAgTERSICAgICAgcGMsW3IxMSxyNCxMU0wgIzFdCisKK1dpZHRoSXM4TVZJc05vdFplcm86CisgICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAorICAgIFZNVUxMLlU4IHEyLGQwLGQxMgorICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgorICAgIFZNVUxMLlU4IHEzLGQyLGQxMgorICAgIFZMRDEuOCAgIHtkMTZ9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVkxEMS44ICAge2QxN30sW3IwXSxscgorICAgIFZNVUxMLlU4IHExMSxkMTYsZDEyCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QxOH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMixkMTQKKyAgICBWTUxBTC5VOCBxMTEsZDE3LGQxMworICAgIFZNVUxMLlU4IHExMixkMTgsZDEyCisgICAgVkxEMS44ICAge2QxOX0sW3IwXSxscgorICAgIFZNTEFMLlU4IHEzLGQxNixkMTQKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTEyLGQxOSxkMTMKKyAgICBWTUxBTC5VOCBxMTEsZDE4LGQxNAorICAgIFZNTEFMLlU4IHEyLGQzLGQxNQorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFZNTEFMLlU4IHExMixkMCxkMTQKKyAgICBWTUxBTC5VOCBxMyxkMTcsZDE1CisgICAgVk1MQUwuVTggcTExLGQxOSxkMTUKKyAgICBTVUJTICAgICByNSxyNSwjNAorICAgIFZNTEFMLlU4IHExMixkMSxkMTUKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2CisgICAgVlFSU0hSTi5VMTYgZDIwLHExMSwjNgorICAgIFZTVDEuNjQgIHtkOH0sW3IyXSxyMworICAgIFZRUlNIUk4uVTE2IGQyMSxxMTIsIzYKKyAgICBWU1QxLjY0ICB7ZDl9LFtyMl0scjMKKyAgICBWU1QxLjY0ICB7ZDIwfSxbcjJdLHIzCisgICAgVlNUMS42NCAge2QyMX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczRNVklzTm90WmVybzoKKyAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCisgICAgVk1VTEwuVTggcTIsZDAsZDEyCisgICAgVk1VTEwuVTggcTMsZDIsZDEyCisgICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQyLGQxNAorICAgIFZNTEFMLlU4IHEzLGQwLGQxNAorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVk1MQUwuVTggcTMsZDEsZDE1CisgICAgVk1MQUwuVTggcTIsZDMsZDE1CisgICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkOVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczJNVklzTm90WmVybzoKKyAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCisgICAgVk1VTEwuVTggcTIsZDAsZDEyCisgICAgVk1VTEwuVTggcTMsZDIsZDEyCisgICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTIsZDEsZDEzCisgICAgVk1MQUwuVTggcTMsZDMsZDEzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQyLGQxNAorICAgIFZNTEFMLlU4IHEzLGQwLGQxNAorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxscgorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVk1MQUwuVTggcTMsZDEsZDE1CisgICAgVk1MQUwuVTggcTIsZDMsZDE1CisgICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKKyAgICBWUVJTSFJOLlUxNiBkOCxxMiwjNgorICAgIFZTVDEuMTYgIHtkOFswXX0sW3IyXSxyMworICAgIFZTVDEuMTYgIHtkOVswXX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc05vdFplcm8KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKworV2lkdGhJczhNVklzWmVybzoKKyAgICBTVUIgICAgICByMCxyMCxyMQorV2lkdGhJczhMb29wTVZJc1plcm86CisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKKyAgICBWU1QxLjY0ICB7ZDB9LFtyMl0scjMKKyAgICBWU1QxLjY0ICB7ZDF9LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzOExvb3BNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzNE1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczRNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzMk1WSXNaZXJvOgorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQorICAgIFNVQlMgICAgIHI1LHI1LCMyCisgICAgVlNUMS4xNiAge2QwWzBdfSxbcjJdLHIzCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxCisgICAgVlNUMS4xNiAge2QxWzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczJNVklzWmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkNmQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyAoMSA8PCBRYml0c1BsdXNPbmUpIC8gMyBWYWx1ZXMgKEludHJhIGNhc2UpICwKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCithcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZToKKyAgICAud29yZCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1CisgICAgLndvcmQgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAorICAgIC53b3JkIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKKyAgICAud29yZCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCisgICAgLndvcmQgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQorICAgIC53b3JkIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKKyAgICAud29yZCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCisgICAgLndvcmQgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgorCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlOgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlOgorICAgIC5ieXRlIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyAgICAuYnl0ZSAxNywgMTcsIDE3LCAxNywgMTcsIDE3CisgICAgLmJ5dGUgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAorICAgIC5ieXRlIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKKyAgICAuYnl0ZSAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCisgICAgLmJ5dGUgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQorICAgIC5ieXRlIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKKyAgICAuYnl0ZSAyMywgMjMsIDIzLCAyMywgMjMsIDIzCisgICAgLmJ5dGUgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAorCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGQ3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgLmZ1bmMgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Cithcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0OgorICAgIFZQVVNIICAgIHtkOH0KKyAgICBWTEQ0LjE2ICB7ZDAsZDEsZDIsZDN9LFtyMV0KKyAgICBWTU9WLkkxNiBkNCwjMAorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlJTSFIuUzE2IGQwLGQwLCM2CisgICAgVlJTSFIuUzE2IGQxLGQxLCM2CisgICAgVlJTSFIuUzE2IGQyLGQyLCM2CisgICAgVlJTSFIuUzE2IGQzLGQzLCM2CisgICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCisgICAgVlBPUCAgICAge2Q4fQorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUyZjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLlMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NDoKKyAgICBQVVNIICAgICB7cjQtcjgsbHJ9CisgICAgTERSICAgICAgcjIsW3IwLCMwXQorICAgIE1PViAgICAgIHI3LCMweDFmCisgICAgTU9WICAgICAgcjQsIzAKKyAgICBNT1YgICAgICByNSwjMAorICAgIExEUkIgICAgIHIzLFtyMl0sIzEKKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzBdCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCM4XQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxMF0KKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MThdCit1bnBhY2tMb29wOgorICAgIFRTVCAgICAgIHIzLCMweDEwCisgICAgTERSTkVTQiAgcjUsW3IyLCMxXQorICAgIExEUk5FQiAgIHI0LFtyMl0sIzIKKyAgICBBTkQgICAgICByNixyNyxyMyxMU0wgIzEKKyAgICBMRFJFUVNCICByNCxbcjJdLCMxCisgICAgT1JSTkUgICAgcjQscjQscjUsTFNMICM4CisgICAgVFNUICAgICAgcjMsIzB4MjAKKyAgICBMRFJFUUIgICByMyxbcjJdLCMxCisgICAgU1RSSCAgICAgcjQsW3IxLHI2XQorICAgIEJFUSAgICAgIHVucGFja0xvb3AKKyAgICBTVFIgICAgICByMixbcjAsIzBdCisgICAgUE9QICAgICAge3I0LXI4LHBjfQorICAgIC5lbmRmdW5jCisgICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYxMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLlMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKK29teFZDTTRQMTBfRGVibG9ja0x1bWFfSToKKyAgICBQVVNIICAgICB7cjQtcjksbHJ9CisgICAgTU9WUyAgICAgcjYscjAKKyAgICBTVUIgICAgICBzcCxzcCwjMHhjCisgICAgTU9WICAgICAgcjkscjEKKyAgICBNT1YgICAgICByNyxyMgorICAgIE1PViAgICAgIHI4LHIzCisgICAgTERSICAgICAgcjQsW3NwLCMweDI4XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHgyY10KKyAgICBCRVEgICAgICBMMHg1OAorICAgIFRTVCAgICAgIHI2LCM3CisgICAgVFNURVEgICAgcjksIzcKKyAgICBCTkUgICAgICBMMHg1OAorICAgIENNUCAgICAgIHI3LCMwCisgICAgQ01QTkUgICAgcjgsIzAKKyAgICBDTVBORSAgICByNCwjMAorICAgIEJFUSAgICAgIEwweDU4CisgICAgVFNUICAgICAgcjQsIzMKKyAgICBCTkUgICAgICBMMHg1OAorICAgIENNUCAgICAgIHI1LCMwCisgICAgQkVRICAgICAgTDB4NTgKKyAgICBUU1QgICAgICByNSwjMworICAgIEJFUSAgICAgIEwweDY0CitMMHg1ODoKKyAgICBNVk4gICAgICByMCwjNAorTDB4NWM6CisgICAgQUREICAgICAgc3Asc3AsIzB4YworICAgIFBPUCAgICAgIHtyNC1yOSxwY30KK0wweDY0OgorICAgIFNUUiAgICAgIHI0LFtzcCwjMF0KKyAgICBNT1YgICAgICByMyxyOAorICAgIFNUUiAgICAgIHI1LFtzcCwjNF0KKyAgICBNT1YgICAgICByMixyNworICAgIE1PViAgICAgIHIxLHI5CisgICAgTU9WICAgICAgcjAscjYKKyAgICBCTCAgICAgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQorICAgIENNUCAgICAgIHIwLCMwCisgICAgQk5FICAgICAgTDB4NWMKKyAgICBBREQgICAgICByMyxyNSwjMHgxMAorICAgIEFERCAgICAgIHIyLHI0LCMweDEwCisgICAgU1RSICAgICAgcjMsW3NwLCM0XQorICAgIFNUUiAgICAgIHIyLFtzcCwjMF0KKyAgICBBREQgICAgICByMyxyOCwjMgorICAgIEFERCAgICAgIHIyLHI3LCMyCisgICAgTU9WICAgICAgcjEscjkKKyAgICBNT1YgICAgICByMCxyNgorICAgIEJMICAgICAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCisgICAgQUREICAgICAgc3Asc3AsIzB4YworICAgIFBPUCAgICAgIHtyNC1yOSxwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjFlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorICAgIC5mdW5jICAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAorb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZDoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kOX0KKyAgICBTVUIgICAgICBzcCxzcCwjMHgyMAorICAgIEFERCAgICAgIHI0LHNwLCMwCisgICAgTERSICAgICAgcjUsW3NwLCMweDY0XQorICAgIE1PViAgICAgIHI3LHIxCisgICAgTU9WICAgICAgcjgscjIKKyAgICBNT1YgICAgICByOSxyMworICAgIENNUCAgICAgIHI1LCMwCisgICAgQkVRICAgICAgTDB4MTE0CisgICAgTU9WICAgICAgcjEscjQKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0ICA7Ly8KKyAgICBMRFIgICAgICByMSxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjExLCA9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgTERSICAgICAgcjEwLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgTERSICAgICAgcjIsICA9YXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgTERSU0IgICAgcjEyLFtyMTEscjFdCisgICAgTERSU0IgICAgbHIsW3IxMCxyMV0KKyAgICBMRFIgICAgICByMTAsID0weDMwMjA1MDQKKyAgICBMRFIgICAgICByMSwgPTB4NTA0MDEwMAorICAgIEFERCAgICAgIHIyLHIyLHIxMgorICAgIFZEVVAuMzIgIGQ3LHIxCisgICAgVkRVUC4zMiAgZDkscjEwCisgICAgVkRVUC4xNiAgZDUsbHIKKyAgICBWTEQxLjggICB7ZDZ9LFtyMl0KKyAgICBWVEJMLjggICBkOCx7ZDZ9LGQ3CisgICAgVlRCTC44ICAgZDQse2Q2fSxkOQorICAgIENNUCAgICAgIHI4LCMwCisgICAgVkxEMS4xNiAge2QwLGQxLGQyLGQzfSxbcjRdCisgICAgVlNITC5VMTYgZDgsZDgsZDUKKyAgICBWU0hMLlUxNiBkNCxkNCxkNQorICAgIEJFUSAgICAgIEwxCisgICAgTERSU0ggICAgcjEwLFtyOCwjMF0KK0wxOgorICAgIFZNVUwuSTE2IGQwLGQwLGQ4CisgICAgVk1VTC5JMTYgZDEsZDEsZDQKKyAgICBWTVVMLkkxNiBkMixkMixkOAorICAgIFZNVUwuSTE2IGQzLGQzLGQ0CisgICAgVk1PVk5FLjE2IGQwWzBdLHIxMAorICAgIFZUUk4uMTYgIGQwLGQxCisgICAgVlRSTi4xNiAgZDIsZDMKKyAgICBWVFJOLjMyICBxMCxxMQorICAgIFZNT1YuSTE2IGQ0LCMwCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZUUk4uMTYgIGQwLGQxCisgICAgVlRSTi4xNiAgZDIsZDMKKyAgICBWVFJOLjMyICBxMCxxMQorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWUlNIUi5TMTYgZDAsZDAsIzYKKyAgICBWUlNIUi5TMTYgZDEsZDEsIzYKKyAgICBWUlNIUi5TMTYgZDIsZDIsIzYKKyAgICBWUlNIUi5TMTYgZDMsZDMsIzYKKyAgICBCICAgICAgICBMMHgxMzAKK0wweDExNDoKKyAgICBMRFJTSCAgICByMTAsW3I4LCMwXQorICAgIEFERCAgICAgIHIxMCxyMTAsIzB4MjAKKyAgICBBU1IgICAgICByMTAscjEwLCM2CisgICAgVkRVUC4xNiAgZDAscjEwCisgICAgVkRVUC4xNiAgZDEscjEwCisgICAgVkRVUC4xNiAgZDIscjEwCisgICAgVkRVUC4xNiAgZDMscjEwCitMMHgxMzA6CisgICAgTERSICAgICAgcjEsW3NwLCMweDU4XQorICAgIExEUiAgICAgIHIxMCxbc3AsIzB4NWNdCisgICAgTERSICAgICAgcjMsW3I3XSxyMQorICAgIExEUiAgICAgIHI1LFtyN10scjEKKyAgICBWTU9WICAgICBkNCxyMyxyNQorICAgIExEUiAgICAgIHIzLFtyN10scjEKKyAgICBMRFIgICAgICByNSxbcjcsIzBdCisgICAgVk1PViAgICAgZDUscjMscjUKKyAgICBWQUREVy5VOCBxMyxxMCxkNAorICAgIFZBRERXLlU4IHE0LHExLGQ1CisgICAgVlFNT1ZVTi5TMTYgZDAscTMKKyAgICBWUU1PVlVOLlMxNiBkMSxxNAorICAgIFZTVDEuMzIgIHtkMFswXX0sW3I5XSxyMTAKKyAgICBWU1QxLjMyICB7ZDBbMV19LFtyOV0scjEwCisgICAgVlNUMS4zMiAge2QxWzBdfSxbcjldLHIxMAorICAgIFZTVDEuMzIgIHtkMVsxXX0sW3I5XQorICAgIE1PViAgICAgIHIwLCMwCisgICAgQUREICAgICAgc3Asc3AsIzB4MjAKKyAgICBWUE9QICAgICB7ZDgtZDl9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmE1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUwpAQCAtMCwwICsxLDg3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JCitvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCxyMQorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2NF0KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjksID0weDMwMzAzMDMKKyAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgVk1PVi5JMTYgZDEsIzB4NAorICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCitMMHgzODoKKyAgICBMRFIgICAgICByNixbcjRdLCM4CisgICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxCisgICAgQ01QICAgICAgcjYsIzAKKyAgICBWTEQxLjggICB7ZDR9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCisgICAgQkVRICAgICAgTDB4ZTQKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1PVi4zMiAgZDI2WzBdLHI2CisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWTU9WTC5VOCBxMTMsZDI2CisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZBTkQgICAgIGQxNixkMTYsZDI3CisgICAgVFNUICAgICAgcjYscjkKKyAgICBWQ0dULlU4ICBkMTcsZDIsZDE3CisgICAgVkFORCAgICAgZDE2LGQxNixkMTIKKyAgICBWQU5EICAgICBkMTIsZDE2LGQxNworICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5CisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgVFNUICAgICAgcjYscjgKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBWVFNULjE2ICBkMjYsZDI2LGQxCisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKKyAgICBWQklUICAgICBkMjQsZDMxLGQyNgorICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEJORSAgICAgIEwweDM4CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CitMMHhlNDoKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIEJORSAgICAgIEwweDM4CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTAscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RkZGJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0k6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQorICAgIFNVQiAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyM10hCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAorICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCisgICAgVk1PVi5JOCAgZDE0LCMwCisgICAgVk1PVi5JOCAgZDE1LCMweDEKKyAgICBWTU9WLkkxNiBkMSwjMHg0CisgICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKK0wweDM0OgorICAgIExEUiAgICAgIHI2LFtyNF0sIzgKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBBREQgICAgICBscixyMSxyMQorICAgIFZMRDEuOCAgIHtkN30sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDV9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDEwfSxbcjEwXSxscgorICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0sbHIKKyAgICBWTEQxLjggICB7ZDR9LFtyMF0sbHIKKyAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxscgorICAgIFZaSVAuOCAgIGQ3LGQ4CisgICAgVlpJUC44ICAgZDUsZDEwCisgICAgVlpJUC44ICAgZDYsZDkKKyAgICBWWklQLjggICBkNCxkMTEKKyAgICBWWklQLjE2ICBkNyxkNQorICAgIFZaSVAuMTYgIGQ4LGQxMAorICAgIFZaSVAuMTYgIGQ2LGQ0CisgICAgVlpJUC4xNiAgZDksZDExCisgICAgVlRSTi4zMiAgZDcsZDYKKyAgICBWVFJOLjMyICBkNSxkNAorICAgIFZUUk4uMzIgIGQxMCxkMTEKKyAgICBWVFJOLjMyICBkOCxkOQorICAgIENNUCAgICAgIHI2LCMwCisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkFCRC5VOCAgZDEzLGQ0LGQ4CisgICAgQkVRICAgICAgTDB4MTcwCisgICAgVkFCRC5VOCAgZDEyLGQ1LGQ0CisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVk1PVi4zMiAgZDI2WzBdLHI2CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVk1PVkwuVTggcTEzLGQyNgorICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKKyAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQU5EICAgICBkMTYsZDE2LGQyNworICAgIFRTVCAgICAgIHI2LHI5CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorICAgIFRTVCAgICAgIHI2LHI4CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVlRTVC4xNiAgZDI2LGQyNixkMQorICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2CisgICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKKyAgICBBREQgICAgICByMTAscjAsIzMKKyAgICBWQklGICAgICBkMjksZDQsZDE2CisgICAgQUREICAgICAgcjEyLHIxMCxyMQorICAgIEFERCAgICAgIGxyLHIxLHIxCisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVlNUMS44ICAge2QyOVswXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzFdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjlbMl19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVszXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzRdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbNV19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyOVs2XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzddfSxbcjEyXSxscgorICAgIEFERCAgICAgIHIxMixyMCwjNAorICAgIEFERCAgICAgIHIxMCxyMTIscjEKKyAgICBWU1QxLjggICB7ZDI0WzBdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbMV19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyNFsyXX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzNdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjRbNF19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFs1XX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzZdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbN119LFtyMTBdLGxyCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBCTkUgICAgICBMMHgzNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorTDB4MTcwOgorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBBRERTICAgICByNyxyNyxyNworICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgQUREICAgICAgcjUscjUsIzQKKyAgICBCTkUgICAgICBMMHgzNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzU1ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBBREQgICAgICByNyxyMiwjMQorICAgIEFERCAgICAgIHI4LHIzLCMxCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCisgICAgTU9WICAgICAgcjExLCMwCisgICAgVk1PVi5JOCAgZDE0LCMwCisgICAgVk1PVi5JOCAgZDE1LCMweDEKKyAgICBBREQgICAgICByMTAscjEscjEKKyAgICBNT1YgICAgICByOSwjMHg1NTAwMDAwMAorTDB4Mzg6CisgICAgTERSSCAgICAgcjEyLFtyNF0sIzIKKyAgICBBREQgICAgICByNixyMCxyMQorICAgIENNUCAgICAgIHIxMiwjMAorICAgIEJFUSAgICAgIEwweGU0CisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkNn0sW3I2XSxyMTAKKyAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q0fSxbcjZdLHIxMAorICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMTAKKyAgICBWQUJELlU4ICBkMTIsZDQsZDUKKyAgICBWTEQxLjggICB7ZDl9LFtyNl0KKyAgICBWQUJELlU4ICBkMTMsZDgsZDQKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCisgICAgVkFCRC5VOCAgZDE4LGQ5LGQ4CisgICAgVkFCRC5VOCAgZDE5LGQ2LGQ0CisgICAgVkNHVC5VOCAgZDE2LGQwLGQxMworICAgIFRTVCAgICAgIHIxMiwjMHhmZgorICAgIFZNQVguVTggIGQxMixkMTgsZDEyCisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZNT1ZFUS4zMiBkMTZbMF0scjExCisgICAgVFNUICAgICAgcjEyLCMweGZmMDAKKyAgICBWQ0dULlU4ICBkMTksZDIsZDE5CisgICAgVkNHVC5VOCAgZDEyLGQyLGQxMgorICAgIFZNT1ZFUS4zMiBkMTZbMV0scjExCisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZMRDEuOCAgIHtkMTF9LFtyMF0KKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFRTVCAgICAgIHIxMiwjNAorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTkUgICAgICBMMHhmOAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFNVQiAgICAgIHIwLHIwLHIxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCisgICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyNX0sW3IwXQorICAgIEFERCAgICAgIHIwLHI2LCM4CisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxMzAKK0wweGU0OgorICAgIEFERCAgICAgIHIwLHIwLCM4CisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBBREQgICAgICByNSxyNSwjMgorICAgIEJDQyAgICAgIEwweDM4CisgICAgQiAgICAgICAgTDB4MTMwCitMMHhmODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisgICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMQorICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjEKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCisgICAgU1VCICAgICAgcjYscjAscjEsTFNMICMyCisgICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyNX0sW3IwXSxyMQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgVlNUMS44ICAge2QyOH0sW3IwXQorICAgIEFERCAgICAgIHIwLHI2LCM4CisgICAgQkNDICAgICAgTDB4MzgKK0wweDEzMDoKKyAgICBTVUIgICAgICByMCxyMCwjMHgxMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNjMzJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBBREQgICAgICByNyxyMiwjMQorICAgIEFERCAgICAgIHI4LHIzLCMxCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBNT1YgICAgICByNiwjMAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgTU9WICAgICAgcjksIzB4MTEwMDAwMDAKKyAgICBBREQgICAgICByMTEscjEscjEKK0wweDM4OgorICAgIExEUkggICAgIHIxMixbcjRdLCM0CisgICAgQ01QICAgICAgcjEyLCMwCisgICAgQkVRICAgICAgTDB4MTYwCisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ3LGQ4CisgICAgVkxEMS44ICAge2QxMH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ1LGQxMAorICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFZaSVAuOCAgIGQ2LGQ5CisgICAgVlpJUC4xNiAgZDgsZDEwCisgICAgVlpJUC44ICAgZDQsZDExCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVlpJUC4xNiAgZDcsZDUKKyAgICBWWklQLjE2ICBkOSxkMTEKKyAgICBWWklQLjE2ICBkNixkNAorICAgIFZUUk4uMzIgIGQ4LGQ5CisgICAgVlRSTi4zMiAgZDUsZDQKKyAgICBWVFJOLjMyICBkMTAsZDExCisgICAgVlRSTi4zMiAgZDcsZDYKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBUU1QgICAgICByMTIsIzB4ZmYKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVk1PVkVRLjMyIGQxNlswXSxyNgorICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWTU9WRVEuMzIgZDE2WzFdLHI2CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVFNUICAgICAgcjEyLCM0CisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJORSAgICAgIEwweDE3YworICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkNgorICAgIFZaSVAuOCAgIGQzMCxkMjkKKyAgICBWWklQLjggICBkMjQsZDI1CisgICAgVlpJUC44ICAgZDEwLGQxMQorICAgIFZaSVAuMTYgIGQ3LGQzMAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIFZaSVAuMTYgIGQyNCxkMTAKKyAgICBWWklQLjE2ICBkMjUsZDExCisgICAgVlpJUC4xNiAgZDYsZDI5CisgICAgVlRSTi4zMiAgZDcsZDI0CisgICAgVlRSTi4zMiAgZDMwLGQxMAorICAgIFZUUk4uMzIgIGQ2LGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDEwfSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDZ9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTYwOgorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTdjOgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkMzEKKyAgICBWWklQLjggICBkMzAsZDI5CisgICAgVlpJUC44ICAgZDI0LGQyNQorICAgIFZaSVAuOCAgIGQyOCxkMTEKKyAgICBWWklQLjE2ICBkNyxkMzAKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBWWklQLjE2ICBkMjQsZDI4CisgICAgVlpJUC4xNiAgZDI1LGQxMQorICAgIFZaSVAuMTYgIGQzMSxkMjkKKyAgICBWVFJOLjMyICBkNyxkMjQKKyAgICBWVFJOLjMyICBkMzAsZDI4CisgICAgVlRSTi4zMiAgZDMxLGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDI4fSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQorICAgIEJDQyAgICAgIEwweDM4CitMMHgxZjA6CisgICAgU1VCICAgICAgcjQscjQsIzB4ZQorICAgIFNVQiAgICAgIHI1LHI1LCMweGUKKyAgICBTVUIgICAgICByMCxyMCwjMHgxMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgIC5mdW5jICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKK29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBTVUIgICAgICBzcCxzcCwjMHgxMAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg3OF0KKyAgICBMRFIgICAgICByNyxbc3AsIzB4N2NdCisgICAgTERSICAgICAgcjUsW3NwLCMweDgwXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg4NF0KKyAgICBBREQgICAgICByNixyNixyNyxMU0wgIzIKKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorTDB4MmM6CisgICAgU1RNICAgICAgcjExLHtyMC1yM30KKyAgICBBREQgICAgICBwYyxwYyxyNixMU0wgIzIKKyAgICBCICAgICAgICBMMHgzZjAKKyAgICBCICAgICAgICBMMHg3OAorICAgIEIgICAgICAgIEwweGE4CisgICAgQiAgICAgICAgTDB4ZGMKKyAgICBCICAgICAgICBMMHgxMDAKKyAgICBCICAgICAgICBMMHgxMzQKKyAgICBCICAgICAgICBMMHgxNjgKKyAgICBCICAgICAgICBMMHgxYTgKKyAgICBCICAgICAgICBMMHgxZjAKKyAgICBCICAgICAgICBMMHgyMzQKKyAgICBCICAgICAgICBMMHgyNTgKKyAgICBCICAgICAgICBMMHgyYjAKKyAgICBCICAgICAgICBMMHgyZDgKKyAgICBCICAgICAgICBMMHgzMzAKKyAgICBCICAgICAgICBMMHgzNjQKKyAgICBCICAgICAgICBMMHgzYTgKKyAgICBCICAgICAgICBMMHgzZjAKK0wweDc4OgorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzEKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDExfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0KKyAgICBWTEQxLjggICB7ZDEyfSxbcjEyXQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDExWzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDEyWzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4YTg6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweGRjOgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxMDA6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNQorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOQorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNworICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDEzNDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMCxkMCxkOQorICAgIFZSSEFERC5VOCBkNCxkNCxkMTEKKyAgICBWUkhBREQuVTggZDIsZDIsZDEwCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MTY4OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxYTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE3LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTksIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMCwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDFmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyMzQ6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDI1ODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0CisgICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzQKKyAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNAorICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM0CisgICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDJiMDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MmQ4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzYKKyAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNgorICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM2CisgICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzYKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1CisgICAgVlJIQURELlU4IGQwLGQwLGQxNAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKKyAgICBWUkhBREQuVTggZDIsZDIsZDE2CisgICAgVlJIQURELlU4IGQ2LGQ2LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzMwOgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQwLGQwLGQxMAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTIKKyAgICBWUkhBREQuVTggZDIsZDIsZDExCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMworICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzY0OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNhODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIFZRUlNIUlVOLlMxNiBkMTQscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE2LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMSwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKK0wweDQzNDoKKyAgICBMRE0gICAgICByMTEse3IwLXIzfQorICAgIFNVQlMgICAgIHI1LHI1LCM0CisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBBREQgICAgICByMixyMiwjNAorICAgIEJHVCAgICAgIEwweDJjCisgICAgU1VCUyAgICAgcjQscjQsIzQKKyAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCisgICAgQUREICAgICAgcjIscjIscjMsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIEJHVCAgICAgIEwweDJjCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICBzcCxzcCwjMHgxMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKK2FybVZDTTRQMTBfcEluZGV4VGFibGU4eDg6CisgICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUgorICAgIC53b3JkICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORQorCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4ODoKKyAgICAuaHdvcmQgICAzLCAyLCAxLDQKKyAgICAuaHdvcmQgIC0zLC0yLC0xLDAKKyAgICAuaHdvcmQgICAxLCAyLCAzLDQKKworCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAorICAgIC5mdW5jICAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDg6CisgICAgUFVTSCAgICAge3I0LXIxMCxscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUiAgICAgIHI4LCA9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY0XQorICAgIExEUiAgICAgIHI3LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICBwYyxbcjgscjYsTFNMICMyXQorT01YX1ZDX0NIUk9NQV9EQzoKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweGU4CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzddfSxbcjldCisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHhjYworICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZQQURETC5VOCBkMixkMQorICAgIFZQQURETC5VMTYgZDEsZDIKKyAgICBWQURELkkzMiBkMixkMyxkMQorICAgIFZSU0hSLlUzMiBkMixkMiwjMworICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIFZNT1YuSTggIGQ1LCMweGMKKyAgICBWTU9WLkk4ICBkNiwjMHg0CisgICAgVlNITC5JNjQgZDUsZDUsIzMyCisgICAgVlNIUi5VNjQgZDYsZDYsIzMyCisgICAgVkFERC5JOCAgZDYsZDYsZDUKKyAgICBWVEJMLjggICBkMCx7ZDItZDN9LGQ1CisgICAgVlRCTC44ICAgZDQse2QxLWQyfSxkNgorTDB4OWM6CisgICAgQUREICAgICAgcjkscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjldCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorTDB4Y2M6CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDIsZDEKKyAgICBWUEFEREwuVTE2IGQxLGQyCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBWRFVQLjggICBkNCxkMVs0XQorICAgIEIgICAgICAgIEwweDljCitMMHhlODoKKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweDExNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZNT1YuSTggIGQ1LCMweDQKKyAgICBWU0hMLkk2NCBkNSxkNSwjMzIKKyAgICBWVEJMLjggICBkMCx7ZDN9LGQ1CisgICAgQiAgICAgICAgTDB4MTFjCitMMHgxMTQ6CisgICAgVk1PVi5JOCAgZDAsIzB4ODAKKyAgICBNT1YgICAgICByMCwjMAorTDB4MTFjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XQorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK09NWF9WQ19DSFJPTUFfVkVSVDoKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIEIgICAgICAgIEwweDExYworT01YX1ZDX0NIUk9NQV9IT1I6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDRbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDVbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDZbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDdbXX0sW3I5XQorICAgIEIgICAgICAgIEwweDI4YworT01YX1ZDX0NIUk9NQV9QTEFORToKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IyXQorICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KKyAgICBWUkVWNjQuOCBkMyxkMAorICAgIFZTVUJMLlU4IHEzLGQzLGQyCisgICAgVlNIUi5VNjQgZDMsZDMsIzgKKyAgICBWU1VCTC5VOCBxMixkMyxkMAorICAgIFZSRVY2NC44IGQzLGQxCisgICAgVlNVQkwuVTggcTcsZDMsZDIKKyAgICBWU0hSLlU2NCBkMyxkMywjOAorICAgIFZTVUJMLlU4IHE2LGQzLGQxCisgICAgTERSICAgICAgcjIsID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OAorICAgIFZTSEwuSTY0IGQ0LGQ0LCMxNgorICAgIFZFWFQuOCAgIGQ5LGQ0LGQ2LCMyCisgICAgVkxEMS4xNiAge2QxMH0sW3IyXSEKKyAgICBWU0hMLkk2NCBkMTIsZDEyLCMxNgorICAgIFZFWFQuOCAgIGQxNixkMTIsZDE0LCMyCisgICAgVk1VTC5JMTYgZDExLGQ5LGQxMAorICAgIFZNVUwuSTE2IGQzLGQxNixkMTAKKyAgICBWUEFERC5JMTYgZDMsZDExLGQzCisgICAgVlBBRERMLlMxNiBkMyxkMworICAgIFZTSEwuSTMyIGQyLGQzLCM0CisgICAgVkFERC5JMzIgZDMsZDMsZDIKKyAgICBWTEQxLjE2ICB7ZDEwLGQxMX0sW3IyXQorICAgIFZSU0hSLlMzMiBkMyxkMywjNQorICAgIFZBRERMLlU4IHEwLGQwLGQxCisgICAgVkRVUC4xNiAgcTAsZDFbM10KKyAgICBWU0hMLkkxNiBxMCxxMCwjNAorICAgIFZEVVAuMTYgIHEyLGQzWzBdCisgICAgVkRVUC4xNiAgcTMsZDNbMl0KKyAgICBWTVVMLkkxNiBxMixxMixxNQorICAgIFZNVUwuSTE2IHEzLHEzLHE1CisgICAgVkFERC5JMTYgcTIscTIscTAKKyAgICBWRFVQLjE2ICBxMCxkNlswXQorICAgIFZEVVAuMTYgIHExLGQ2WzFdCisgICAgVkRVUC4xNiAgcTQsZDZbMl0KKyAgICBWRFVQLjE2ICBxNSxkNlszXQorICAgIFZEVVAuMTYgIHE2LGQ3WzBdCisgICAgVkRVUC4xNiAgcTcsZDdbMV0KKyAgICBWRFVQLjE2ICBxOCxkN1syXQorICAgIFZEVVAuMTYgIHE5LGQ3WzNdCisgICAgVkFERC5JMTYgcTAscTIscTAKKyAgICBWQURELkkxNiBxMSxxMixxMQorICAgIFZBREQuSTE2IHE0LHEyLHE0CisgICAgVkFERC5JMTYgcTUscTIscTUKKyAgICBWQURELkkxNiBxNixxMixxNgorICAgIFZBREQuSTE2IHE3LHEyLHE3CisgICAgVkFERC5JMTYgcTgscTIscTgKKyAgICBWQURELkkxNiBxOSxxMixxOQorICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMSxxMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMixxNCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMyxxNSwjNQorICAgIFZRUlNIUlVOLlMxNiBkNCxxNiwjNQorICAgIFZRUlNIUlVOLlMxNiBkNSxxNywjNQorICAgIFZRUlNIUlVOLlMxNiBkNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkNyxxOSwjNQorTDB4MjhjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMX0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDJ9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QzfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDV9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q2fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkN30sW3I5XQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI2OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2OgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCisKKworCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2OgorICAgIC5od29yZCAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4CisgICAgLmh3b3JkICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICAuaHdvcmQgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNjoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBMRFIgICAgICByNixbc3AsIzB4NzBdCisgICAgTERSICAgICAgcjQsW3NwLCMweDY4XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNyxbc3AsIzB4NzRdCisgICAgTU9WICAgICAgcjEyLCMweDEwCisgICAgTERSICAgICAgcGMsW3I5LHI2LExTTCAjMl0KK09NWF9WQ18xNlgxNl9WRVJUOgorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQorICAgIEFERCAgICAgIHI4LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10KKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9IT1I6CisgICAgQUREICAgICAgcjgscjAscjQKKyAgICBBREQgICAgICByNCxyNCxyNAorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHI1LHI1LHI1CitMMHg4YzoKKyAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgQk5FICAgICAgTDB4OGMKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9EQzoKKyAgICBNT1YgICAgICByMTEsIzAKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweDE0YworICAgIEFERCAgICAgIHI4LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzddfSxbcjhdCisgICAgVlBBRERMLlU4IHEwLHExCisgICAgQUREICAgICAgcjExLHIxMSwjMQorICAgIFZQQURELkkxNiBkMCxkMCxkMQorICAgIFZQQURETC5VMTYgZDAsZDAKKyAgICBWUEFEREwuVTMyIGQ2LGQwCisgICAgVlJTSFIuVTY0IGQ4LGQ2LCM0CitMMHgxNGM6CisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHgxNzAKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBBREQgICAgICByMTEscjExLCMxCisgICAgVlBBRERMLlU4IHEwLHEwCisgICAgVlBBREQuSTE2IGQwLGQwLGQxCisgICAgVlBBRERMLlUxNiBkMCxkMAorICAgIFZQQURETC5VMzIgZDcsZDAKKyAgICBWUlNIUi5VNjQgZDgsZDcsIzQKK0wweDE3MDoKKyAgICBDTVAgICAgICByMTEsIzIKKyAgICBCTkUgICAgICBMMHgxODAKKyAgICBWQURELkk2NCBkOCxkNyxkNgorICAgIFZSU0hSLlU2NCBkOCxkOCwjNQorTDB4MTgwOgorICAgIFZEVVAuOCAgIHEzLGQ4WzBdCisgICAgQ01QICAgICAgcjExLCMwCisgICAgQUREICAgICAgcjgscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBCTkUgICAgICBMMHgxOTgKKyAgICBWTU9WLkk4ICBxMywjMHg4MAorTDB4MTk4OgorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9QTEFORToKKyAgICBMRFIgICAgICByOSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBWTEQxLjggICB7ZDRbMF19LFtyMl0KKyAgICBBREQgICAgICByOCxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQorICAgIFZSRVY2NC44IGQ1LGQxCisgICAgVlNVQkwuVTggcTMsZDUsZDQKKyAgICBWU0hSLlU2NCBkNSxkNSwjOAorICAgIFZTVUJMLlU4IHE0LGQ1LGQwCisgICAgVlNITC5JNjQgZDksZDksIzE2CisgICAgVkVYVC44ICAgZDksZDksZDYsIzIKKyAgICBWUkVWNjQuOCBkMTIsZDMKKyAgICBWU1VCTC5VOCBxNyxkMTIsZDQKKyAgICBWU0hSLlU2NCBkMTIsZDEyLCM4CisgICAgVlNVQkwuVTggcTgsZDEyLGQyCisgICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCisgICAgVlNITC5JNjQgZDE3LGQxNywjMTYKKyAgICBWRVhULjggICBkMTcsZDE3LGQxNCwjMgorICAgIFZNVUxMLlMxNiBxMTEsZDgsZDIwCisgICAgVk1VTEwuUzE2IHExMixkMTYsZDIwCisgICAgVk1MQUwuUzE2IHExMSxkOSxkMjEKKyAgICBWTUxBTC5TMTYgcTEyLGQxNyxkMjEKKyAgICBWUEFERC5JMzIgZDIyLGQyMyxkMjIKKyAgICBWUEFERC5JMzIgZDIzLGQyNSxkMjQKKyAgICBWUEFEREwuUzMyIHExMSxxMTEKKyAgICBWU0hMLkk2NCBxMTIscTExLCMyCisgICAgVkFERC5JNjQgcTExLHExMSxxMTIKKyAgICBWUlNIUi5TNjQgcTExLHExMSwjNgorICAgIFZTSEwuSTY0IHExMixxMTEsIzMKKyAgICBWU1VCLkk2NCBxMTIscTEyLHExMQorICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQorICAgIFZEVVAuMTYgIHE2LGQyMlswXQorICAgIFZEVVAuMTYgIHE3LGQyM1swXQorICAgIFZBRERMLlU4IHExMSxkMSxkMworICAgIFZTSEwuSTE2IHExMSxxMTEsIzQKKyAgICBWRFVQLjE2ICBxMTEsZDIzWzNdCisgICAgVkFERC5JNjQgZDEsZDI0LGQyNQorICAgIFZMRDEuMTYgIHtkMjQsZDI1fSxbcjldCisgICAgVkRVUC4xNiAgcTEzLGQxWzBdCisgICAgVlNVQi5JMTYgcTEzLHExMSxxMTMKKyAgICBWTVVMLkkxNiBxNSxxNixxMTAKKyAgICBWTVVMLkkxNiBxNixxNixxMTIKKyAgICBWQURELkkxNiBxMCxxNSxxMTMKKyAgICBWQURELkkxNiBxMSxxNixxMTMKK0wweDJkNDoKKyAgICBWUVJTSFJVTi5TMTYgZDYscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDcscTEsIzUKKyAgICBTVUJTICAgICByMTIscjEyLCMxCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHI1CisgICAgVkFERC5JMTYgcTAscTAscTcKKyAgICBWQURELkkxNiBxMSxxMSxxNworICAgIEJORSAgICAgIEwweDJkNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQ3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NDoKKyAgICAud29yZCBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUgorICAgIC53b3JkIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIC53b3JkIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKKyAgICAud29yZCBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgLndvcmQgT01YX1ZDXzR4NF9IVQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0CisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQKK29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NDoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTJ9CisgICAgTERSICAgICAgcjgsID1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAorICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg1OF0KKyAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NTBdCisgICAgTERSICAgICAgcGMsW3I4LHI2LExTTCAjMl0KK09NWF9WQ180eDRfSE9SOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QyW119LFtyMF0KKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDFbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMlswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkM1swXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkVSVDoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKK0wweDU4OgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfREM6CisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHhkYworICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMFsxXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDBbMl19LFtyMF0KKyAgICBWTEQxLjggICB7ZDBbM119LFtyOV0KKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweGJjCisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlBBRERMLlUzMiBkMSxkMQorICAgIFZSU0hSLlU2NCBkMSxkMSwjMworICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGJjOgorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGRjOgorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4MTA4CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBCICAgICAgICBMMHg1OAorTDB4MTA4OgorICAgIFZNT1YuSTggIGQwLCMweDgwCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBCICAgICAgICBMMHg1OAorT01YX1ZDXzR4NF9ESUFHX0RMOgorICAgIFRTVCAgICAgIHI3LCMweDQwCisgICAgQkVRICAgICAgTDB4MTM4CisgICAgVkxEMS44ICAge2QzfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDNbN10KKyAgICBWRVhULjggICBkNCxkMyxkMiwjMQorICAgIFZFWFQuOCAgIGQ1LGQzLGQyLCMyCisgICAgQiAgICAgICAgTDB4MTRjCitMMHgxMzg6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDE0YzoKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9ESUFHX0RSOgorICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgQUREICAgICAgcjEscjMscjUKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XQorICAgIFZFWFQuOCAgIGQzLGQxLGQwLCMzCisgICAgQUREICAgICAgcjQscjEscjUKKyAgICBWRVhULjggICBkNCxkMSxkMCwjNAorICAgIEFERCAgICAgIHI2LHI0LHI1CisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzUKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3I2XQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjRdCisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMV0KKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9WUjoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBWTEQxLjggICB7ZDBbN119LFtyMl0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDJbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KKyAgICBWRVhULjggICBkMTIsZDAsZDAsIzcKKyAgICBWRVhULjggICBkMyxkMSxkMTIsIzYKKyAgICBWRVhULjggICBkNCxkMixkMTIsIzcKKyAgICBWRVhULjggICBkNSxkMSxkMCwjNworICAgIFZFWFQuOCAgIGQ2LGQyLGQwLCM3CisgICAgVkVYVC44ICAgZDExLGQxLGQxMiwjNworICAgIFZIQURELlU4IGQ4LGQ2LGQxMgorICAgIFZSSEFERC5VOCBkOCxkOCxkMTEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZFWFQuOCAgIGQxMCxkOCxkOCwjMQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZFWFQuOCAgIGQ5LGQ3LGQ3LCMxCisgICAgVlNUMS4zMiAge2QxMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0hEOgorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KKyAgICBWRVhULjggICBkMyxkMSxkMCwjMworICAgIFZFWFQuOCAgIGQ0LGQxLGQwLCMyCisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZSSEFERC5VOCBkOCxkNCxkMworICAgIFZTSEwuSTY0IGQ4LGQ4LCMyNAorICAgIFZTSEwuSTY0IGQ2LGQ3LCMxNgorICAgIFZaSVAuOCAgIGQ4LGQ2CisgICAgVkVYVC44ICAgZDcsZDcsZDcsIzYKKyAgICBWRVhULjggICBkOCxkNixkNywjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkOFsxXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDZbMV19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkw6CisgICAgVFNUICAgICAgcjcsIzB4NDAKKyAgICBCRVEgICAgICBMMHgyYjQKKyAgICBWTEQxLjggICB7ZDN9LFtyMV0KKyAgICBWRVhULjggICBkNCxkMyxkMywjMQorICAgIFZFWFQuOCAgIGQ1LGQ0LGQ0LCMxCisgICAgQiAgICAgICAgTDB4MmM4CitMMHgyYjQ6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDJjODoKKyAgICBWUkhBREQuVTggZDcsZDQsZDMKKyAgICBWSEFERC5VOCBkMTAsZDMsZDUKKyAgICBWUkhBREQuVTggZDEwLGQxMCxkNAorICAgIFZFWFQuOCAgIGQ4LGQ3LGQ3LCMxCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkVYVC44ICAgZDksZDEwLGQ4LCMxCisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdLHIxMgorICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkOVswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfSFU6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQorICAgIFZEVVAuOCAgIGQyLGQxWzddCisgICAgVkVYVC44ICAgZDMsZDEsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMSxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQxLGQyLCM2CisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWUkhBREQuVTggZDgsZDQsZDMKKyAgICBWWklQLjggICBkOCxkNworICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDgsZDgsZDgsIzIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyM10KK0wweDM0ODoKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTJ9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTg5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCitvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyOgorICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9CisgICAgbGRyICAgICByOSwgW3IwLCMwXQorICAgIHZtb3YuaTE2ICAgIGQwLCAjMAorICAgIG1vdiAgICAgcjgsICMweDFmCisgICAgdnN0MS4xNiAgICB7ZDB9LCBbcjFdCisgICAgbGRyYiAgICByNiwgW3I5XSwgIzEKK3VucGFja0xvb3A6CisgICAgdHN0ICAgICByNiwgIzB4MTAKKyAgICBsZHJuZXNiIHI1LCBbcjksICMxXQorICAgIGxkcm5lYiAgcjQsIFtyOV0sICMyCisgICAgYW5kICAgICByNywgcjgsIHI2LCBsc2wgIzEKKyAgICBsZHJlcXNiIHI0LCBbcjldLCAjMQorICAgIG9ycm5lICAgcjQsIHI0LCByNSwgbHNsICM4CisgICAgdHN0ICAgICByNiwgIzB4MjAKKyAgICBsZHJlcWIgIHI2LCBbcjldLCAjMQorICAgIHN0cmggICAgcjQsIFtyMSwgcjddCisgICAgYmVxICAgICB1bnBhY2tMb29wCisgICAgbGRtaWEgICByMSwge3IzLCByNH0KKyAgICBzdHIgICAgIHI5LCBbcjAsICMwXQorICAgIGxkciAgICAgcjUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICBsZHIgICAgIHI2LCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIHNhZGRzdWJ4ICAgICAgICByMywgcjMsIHIzCisgICAgc2FkZHN1YnggICAgICAgIHI0LCByNCwgcjQKKyAgICBsZHJzYiAgIHI5LCBbcjUsIHIyXQorICAgIGxkcnNiICAgcjIsIFtyNiwgcjJdCisgICAgc2FkZDE2ICByNSwgcjMsIHI0CisgICAgc3N1YjE2ICByNiwgcjMsIHI0CisgICAgbHNsICAgICByMiwgcjIsIHI5CisgICAgdm1vdiAgICBkMCwgcjUsIHI2CisgICAgdnJldjMyLjE2ICBkMCwgZDAKKyAgICB2ZHVwLjE2ICAgIGQxLCByMgorICAgIHZtdWxsLnMxNiAgIHExLCBkMCwgZDEKKyAgICB2c2hybi5pMzIgICBkMiwgcTEsICMxCisgICAgdnN0MS4xNiAgICB7ZDJ9LCBbcjFdCisgICAgbW92ICAgICByMCwgIzAKKyAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDc2IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0OgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDEzfQorICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIExEUiAgICAgIHIyLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgTERSICAgICAgcjMsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgVkFERC5JMTYgZDQsZDAsZDEKKyAgICBWQURELkkxNiBkNSxkMixkMworICAgIFZTVUIuSTE2IGQ2LGQwLGQxCisgICAgTERSU0IgICAgcjQsW3IyLHIxXQorICAgIFZTVUIuSTE2IGQ3LGQyLGQzCisgICAgTERSU0IgICAgcjUsW3IzLHIxXQorICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIExTTCAgICAgIHI1LHI1LHI0CisgICAgVkFERC5JMTYgZDMsZDYsZDcKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNCxkMCxkMQorICAgIFZBREQuSTE2IGQ1LGQyLGQzCisgICAgVlNVQi5JMTYgZDYsZDAsZDEKKyAgICBWU1VCLkkxNiBkNyxkMixkMworICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZBREQuSTE2IGQzLGQ2LGQ3CisgICAgVkRVUC4xNiAgZDUscjUKKyAgICBWTU9WLkkzMiBxMywjMHgyCisgICAgVk1PVi5JMzIgcTQsIzB4MgorICAgIFZNT1YuSTMyIHE1LCMweDIKKyAgICBWTU9WLkkzMiBxNiwjMHgyCisgICAgVk1MQUwuUzE2IHEzLGQwLGQ1CisgICAgVk1MQUwuUzE2IHE0LGQxLGQ1CisgICAgVk1MQUwuUzE2IHE1LGQyLGQ1CisgICAgVk1MQUwuUzE2IHE2LGQzLGQ1CisgICAgVlNIUk4uSTMyIGQwLHEzLCMyCisgICAgVlNIUk4uSTMyIGQxLHE0LCMyCisgICAgVlNIUk4uSTMyIGQyLHE1LCMyCisgICAgVlNIUk4uSTMyIGQzLHE2LCMyCisgICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCisgICAgVlBPUCAgICAge2Q4LWQxM30KKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXI6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIE1PViAgICAgIHI0LHIxCisgICAgTU9WICAgICAgcjUscjIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgTU9WICAgICAgcjAscjQKKyAgICBNT1YgICAgICByMSxyNQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgIE1PViAgICAgIHIwLCMwCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0YjU1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKKyNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOworLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NWZlNmQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKQEAgLTAsMCArMSw4MiBAQAorOyAvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCis7ICovIAorCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgCisKKyAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgSUYgQ29ydGV4QTgKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCitxeDAgICAgICAgICAgICAgICAgICBRTiAgUTAuUzE2ICAgICAgICAgICAgICAgICAgCitkeDAwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkeDAxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitxeDEgICAgICAgICAgICAgICAgICBRTiAgUTEuUzE2CitkeDEwICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkeDExICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKK3F4MiAgICAgICAgICAgICAgICAgIFFOICBRMi5TMTYgICAgICAgICAgICAgICAgICAKK2R4MjAgICAgICAgICAgICAgICAgIEROICBENC5TMTYKK2R4MjEgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK3F4MyAgICAgICAgICAgICAgICAgIFFOICBRMy5TMTYKK2R4MzAgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2R4MzEgICAgICAgICAgICAgICAgIEROICBENy5TMTYKKworCitkY2xpcDAgICAgICAgICAgICAgICBETiAgRDAuVTgKK2RjbGlwMSAgICAgICAgICAgICAgIEROICBEMi5VOCAKK2RjbGlwMiAgICAgICAgICAgICAgIEROICBENC5VOAorZGNsaXAzICAgICAgICAgICAgICAgRE4gIEQ2LlU4CisgCisgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgKKworICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKKyAgICAgICAKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCisKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0YTdmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk4IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQorICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAorICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAKKworICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQorCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCisgICAgICAgIAorICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCisgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKKworZnR5cGUyCisKKyAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCisgICAgICAgIAorRmlsbFZMREwxICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKKyAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAorIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAKK3N0b3JlTGV2ZWxMMQorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworIAorCisKKyAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKKworRXNjYXBlTW9kZTMKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCisKKyAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQorICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2CisgICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgICAgIAorCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKworCisgCitzdG9yZUxldmVsTGFzdAorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCisgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgICAKK2VuZAorCisgICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKKworICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cworCisgICAgICAgIAorRXhpdE9rCisgICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAorICAgCisgICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKworICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgICAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCisgICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgorCitFeGl0RXJyb3IKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworZXhpdDIKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGFmOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDIxMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgSHVmZm1hbiB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKworCisKKy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgUGFja2VkIFZMQyB0YWJsZXMgd2l0aCBMYXN0PTAgYW5kIExhc3Q9MQorCisvLyAgICAgICAgICAgICAgb3B0aW1pemVkIFBhY2tlZCBWTEMgdGFibGUgRW50cnkgRm9ybWF0IAorLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gCisvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICBMZW4gICB8ICAgICAgIFJ1biAgICAgICB8ICAgICBMZXZlbCAgICB8TCB8IDEgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vICAgICAgIHwgICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgIHwgMCB8CisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICAoMCB0byA3KSAgMyBiaXRzCisvLyAgICBSdW4gICAgPSBSdW5MZW5ndGggb2YgdGhlIFN5bWJvbCAgKDAgdG8gNjMpIDYgYml0cworLy8gICAgTGV2ZWwgID0gTGV2ZWwgb2YgdGhlIFN5bWJvbCAgICAgICgwIHRvIDMxKSA1IGJpdHMKKy8vICAgIEwgICAgICA9IExhc3QgVmFsdWUgb2YgdGhlIFN5bWJvbCAoMCBvciAxKSAgMSBiaXQKKy8vCisvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgorLy8gICAgT2Zmc2V0ID0gTnVtYmVyIG9mICgxNi1iaXQpIGhhbGYgd29yZHMgZnJvbSB0aGUgdGFibGUKKy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKy8vCisvLyBUaGUgdGFibGUgaXMgYWNjZXNzZWQgYnkgc3VjY2Vzc2l2ZSBsb29rdXAgdXAgb24gdGhlCisvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCisvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCisKKy8vIFRoZSBWTEMgdGFibGVzIHVzZWQgZm9yIEludHJhIGFuZCBub24gaW50YSBjb2VmZmljaWVudHMgaW4gbm9uIEVzY2FwZSBtb2RlCisvLyBjb250YWlucyBzeW1ib2xzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MS4KKy8vIElmIGEgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgaXQgd2lsbCBiZSBjb2RlZCBhcyAweEZGRgorIAorCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRlclZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MWIwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjEwOSwgMHgyMTA5LCAweDAyMDksIDB4MDAxMSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjExNSwgMHgyMTE1LCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDIwNTksIDB4MjA1OSwgMHgyMDUxLCAweDIwNTEsIDB4MWMwZCwgMHgxYjBkLCAweDFhMGQsIDB4MTkwZCwKKyAgICAweDA5MTEsIDB4MDgxMSwgMHgwNzExLCAweDA2MTEsIDB4MDUxMSwgMHgwMzE5LCAweDAyMTksIDB4MDEyMSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNjEsIDB4MjA2MSwgMHgyMTI5LCAweDIxMjksIDB4MzcwOSwgMHgzNzA5LCAweDM4MDksIDB4MzgwOSwKKyAgICAweDNkMGQsIDB4M2QwZCwgMHgzZTBkLCAweDNlMGQsIDB4M2YwZCwgMHgzZjBkLCAweDIwMGQsIDB4MjAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDEzMSwgMHgwMjIxLCAweDA0MTksIDB4MDUxOSwKKyAgICAweDA2MTksIDB4MGExMSwgMHgxOTA5LCAweDFhMDksIDB4MjEwZCwgMHgyMjBkLCAweDIzMGQsIDB4MjQwZCwKKyAgICAweDI1MGQsIDB4MjYwZCwgMHgyNzBkLCAweDI4MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwNDksIDB4MDA0MSwgMHgzODBkLCAweDM4MGQsIDB4MzcwZCwgMHgzNzBkLCAweDM2MGQsIDB4MzYwZCwKKyAgICAweDM1MGQsIDB4MzUwZCwgMHgzNDBkLCAweDM0MGQsIDB4MzMwZCwgMHgzMzBkLCAweDMyMGQsIDB4MzIwZCwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MzEwZCwgMHgzMTBkLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDM2MDksIDB4MzYwOSwgMHgzNTA5LCAweDM1MDksIDB4MzQwOSwgMHgzNDA5LCAweDMzMDksIDB4MzMwOSwKKyAgICAweDMyMDksIDB4MzIwOSwgMHgzMTA5LCAweDMxMDksIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDEwMGQsIDB4MzAwOSwgMHgzMDA5LCAweDJmMDksIDB4MmYwOSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMzExLCAweDIzMTEsIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDBmMGQsIDB4MGUwZCwgMHgwZDBkLCAweDBjMGQsIDB4MGIwZCwgMHgwYTBkLCAweDA5MGQsIDB4MGUwOSwKKyAgICAweDBkMDksIDB4MDIxMSwgMHgwMTE5LCAweDAwMjksIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI4MGQsIDB4MjgwZCwgMHgyNzBkLCAweDI3MGQsIDB4MjYwZCwgMHgyNjBkLCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDJjMDksIDB4MmMwOSwgMHhiNzU5LCAweGI3NTksIDB4MmEwOSwgMHgyYTA5LCAweDIwMjEsIDB4MjAyMSwKKyAgICAweDA0MGQsIDB4MDMwZCwgMHgwYjM1LCAweDAxMGQsIDB4MDkwOSwgMHgwODA5LCAweDA3MDksIDB4MDYwOSwKKyAgICAweDAxMTEsIDB4MDAxOSwgMHgyNTA5LCAweDI1MDksIDB4MjQwOSwgMHgyNDA5LCAweDIzMDksIDB4MjMwOQorfTsKKworCitjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwOCwgMHgwMTQ4LCAweDAxNzAsIDB4MDE3OCwgMHgwMTgwLCAweDAxODgsIDB4MGYwOSwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4MjAxMSwgMHgyMDExLCAweDAxMDksIDB4MDAxOSwKKyAgICAweDAwMjgsIDB4MDA2MCwgMHgwMGI4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDNmZmYsIDB4M2ZmZiwgMHgwMDM4LCAweDAwNDAsIDB4MjAzZCwgMHgyMDNkLCAweDIwMzUsIDB4MjAzNSwKKyAgICAweDIwYjEsIDB4MjBiMSwgMHgyMGE5LCAweDIwYTksIDB4MDIxNSwgMHgwMTFkLCAweDAwMmQsIDB4MGQwOSwKKyAgICAweDA1MTksIDB4MDgxMSwgMHgwNDE5LCAweDAzMjEsIDB4MDIyMSwgMHgwMTM5LCAweDAwYTEsIDB4MDA5OSwKKyAgICAweDAwNjgsIDB4MDA5MCwgMHgzZmZmLCAweDNmZmYsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwYjksIDB4MjBiOSwgMHgyMGMxLCAweDIwYzEsIDB4MjE0MSwgMHgyMTQxLCAweDI5MTEsIDB4MjkxMSwKKyAgICAweDIzMTUsIDB4MjMxNSwgMHgyNDE1LCAweDI0MTUsIDB4MmYwZCwgMHgyZjBkLCAweDMwMGQsIDB4MzAwZCwKKyAgICAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBjOSwgMHgwMGQxLCAweDAwZDksIDB4MDE0OSwKKyAgICAweDA2MTksIDB4MDE1MSwgMHgwMjI5LCAweDA3MTksIDB4MGUwOSwgMHgwMDQ1LCAweDA1MTUsIDB4MDYxNSwKKyAgICAweDExMGQsIDB4MTIwZCwgMHgxMzBkLCAweDE0MGQsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKKyAgICAweDAwOTEsIDB4MDA4OSwgMHgyZTBkLCAweDJlMGQsIDB4MmQwZCwgMHgyZDBkLCAweDJjMGQsIDB4MmMwZCwKKyAgICAweDJiMGQsIDB4MmIwZCwgMHgyYTBkLCAweDJhMGQsIDB4MjExNSwgMHgyMTE1LCAweDIwMjUsIDB4MjAyNSwKKyAgICAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAxMDAsIDB4MmMwOSwgMHgyYzA5LCAweDJiMDksIDB4MmIwOSwKKyAgICAweDI3MTEsIDB4MjcxMSwgMHgyNjExLCAweDI2MTEsIDB4MjUxMSwgMHgyNTExLCAweDIzMTksIDB4MjMxOSwKKyAgICAweDIyMTksIDB4MjIxOSwgMHgyMTMxLCAweDIxMzEsIDB4MDExMCwgMHgwMTMwLCAweDAxMzgsIDB4MDE0MCwKKyAgICAweDAxMTgsIDB4MDEyMCwgMHgwMTI4LCAweDA4MGQsIDB4MjEyOSwgMHgyMTI5LCAweDIwODEsIDB4MjA4MSwKKyAgICAweDI0MTEsIDB4MjQxMSwgMHgyMDc5LCAweDIwNzksIDB4MjA3MSwgMHgyMDcxLCAweDIwNjksIDB4MjA2OSwKKyAgICAweDFiYjUsIDB4MDYwZCwgMHgwMDFkLCAweGQzZjksIDB4MDkwOSwgMHgwODA5LCAweDA5MGQsIDB4MDMxMSwKKyAgICAweDAxMjEsIDB4MDA2MSwgMHgwMDU5LCAweDAwNTEsIDB4MDE1MCwgMHgwMTU4LCAweDAxNjAsIDB4MDE2OCwKKyAgICAweDI0MGQsIDB4MjQwZCwgMHgyMzBkLCAweDIzMGQsIDB4MjYwOSwgMHgyNjA5LCAweDI1MGQsIDB4MjUwZCwKKyAgICAweDI3MDksIDB4MjcwOSwgMHgyMjExLCAweDIyMTEsIDB4MjExOSwgMHgyMTE5LCAweDIwNDksIDB4MjA0OSwKKyAgICAweDAwMTUsIDB4MDUwOSwgMHgwMjBkLCAweDAxMGQsIDB4MDQwOSwgMHgwMzA5LCAweDAwNDEsIDB4MDAzOSwKKyAgICAweDAxMTEsIDB4MDAzMSwgMHgyMjA5LCAweDIyMDksIDB4MjAyOSwgMHgyMDI5LCAweDIwMjEsIDB4MjAyMQorfTsKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdID0geworICAgIDB4MDAyMCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwMSwgMHgyMDAxLAorICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4MDAyOCwgMHgwMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgwMDMwLCAweDAwMTMsIDB4MjAxMSwgMHgyMDExLAorICAgIDB4MDAzOCwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgzZmZmLCAweDNmZmYsIDB4MjAxOSwgMHgyMDE5LAorCisJMHgwMDIwLCAweDAwMDksIDB4MjAwNywgMHgyMDA3LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCisgICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHgwMDI4LCAweDAwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDAwMzAsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgwMDM4LCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLCAweDFmZmYsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdID0geworICAgIDB4MDAxMCwgMHgwMGYwLCAweDAwNDMsIDB4MDAzZiwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLAorICAgIDB4MDAxOCwgMHgwMGQ4LCAweDAwNDcsIDB4MDAzYiwgMHgwMDIwLCAweDAwODAsIDB4MDBhOCwgMHgwMGQwLAorICAgIDB4MDAyOCwgMHgwMDQ4LCAweDAwNzAsIDB4MDA3OCwgMHgxZmZmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLAorICAgIDB4MDA4MSwgMHgwMDAxLCAweDAwN2YsIDB4MDAwMywgMHgyMDdkLCAweDIwN2QsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MjA3YiwgMHgyMDdiLCAweDIwMDcsIDB4MjAwNywgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LAorICAgIDB4MjA3OSwgMHgyMDc5LCAweDIwMDksIDB4MjAwOSwgMHgyMDc3LCAweDIwNzcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4MjA3NSwgMHgyMDc1LCAweDIwMGQsIDB4MjAwZCwgMHgyMDczLCAweDIwNzMsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDA3MSwgMHgwMDExLCAweDAwNmYsIDB4MDAxMywgMHgwMDZkLCAweDAwMTUsIDB4MDA2YiwgMHgwMDE3LAorICAgIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMDY5LCAweDAwMTksIDB4MDA2NywgMHgwMDFiLAorICAgIDB4MDA2NSwgMHgwMDFkLCAweDAwNjMsIDB4MDAxZiwgMHgwMDYxLCAweDAwMjEsIDB4MDA1ZiwgMHgwMDIzLAorICAgIDB4MDA1ZCwgMHgwMDI1LCAweDAwNWIsIDB4MDAyNywgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LAorICAgIDB4MDA1OSwgMHgwMDI5LCAweDAwNTcsIDB4MDAyYiwgMHgyMDU1LCAweDIwNTUsIDB4MjAyZCwgMHgyMDJkLAorICAgIDB4MjA1MywgMHgyMDUzLCAweDIwMmYsIDB4MjAyZiwgMHgyMDUxLCAweDIwNTEsIDB4MjAzMSwgMHgyMDMxLAorICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwMzMsIDB4MjAzMywgMHgwMGUwLCAweDAwZTgsIDB4MDA0OSwgMHgwMDM5LAorICAgIDB4MjA0ZCwgMHgyMDRkLCAweDIwMzUsIDB4MjAzNSwgMHgyMDRiLCAweDIwNGIsIDB4MjAzNywgMHgyMDM3LAorICAgIDB4MjA0NSwgMHgyMDQ1LCAweDIwM2QsIDB4MjAzZAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdID0gCit7CisgICAxMiwgIDYsICA0LCAgMywgIDMsICAzLCAgMywgIDIsIAorICAgIDIsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzEyLTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdID0gCit7CisgICAyNiwgMTAsICA2LCAgMiwgIDEsICAxLCAgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgNDAsICAxLCAgMAorfTsKKworLyogTE1BWCB0YWJsZSBmb3Igbm9uIEludHJhIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkCisgICBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbMTUtMzFdIHdpdGggemVyb3MgdG8gYWNlc3MgZW50cmllcyBmb3IgTGFzdD0xIGVmZmVjdGl2ZWx5CisKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMUxNQVhbNTNdID0gCit7CisgICAyNywgMTAsICA1LCAgNCwgIDMsICAzLCAgMywgIAorICAgIDMsICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKworCTgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMQorfTsKKworCisvKiBSTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgdGFibGUgZWZmZWN0aXZlbHkgKi8KKworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdID0KK3sKKyAgIDE0LCAgOSwgIDcsICAzLCAgMiwgIDEsCTEsICAKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsIAkwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwKKwkKKwkyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjk0OGY4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCkBAIC0wLDAgKzEsNzUgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworICogRGVzY3JpcHRpb246IENvbnRhaW5zIGFsbCB0aGUgTG9va3VwIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCisgKgorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisgICAgLyogKiBUYWJsZSBFbnRyaWVzIGNvbnRhaW4gRGMgU2NhbGVyIHZhbHVlcworICAgICAgICogYXJtVkNNNFAyX0RDU2NhbGVyW2ldPSA4ICAgICAgICAgICBmb3IgaT0xICB0byAgNCBhbmQgaT0zMyB0byAzNgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmkgICAgICAgICBmb3IgaT01ICB0byAgOAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpKzggICAgICAgICBmb3IgaT05ICB0byAgMjUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippLTE2ICAgICAgZm9yIGk9MjYgdG8gIDMxCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IChpLTMyKzEzKS8yIGZvciBpPTM3IHRvICA1OQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSBpLTYtMzIgICAgICBmb3IgaT02MCB0byAgNjMKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgICAgICAgZm9yIGk9MCBhbmQgaT0zMgorICAgICAgICovCisgICAgICAgCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0RDU2NhbGVyWzY0XT17CisJMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHhhLCAgMHhjLCAgMHhlLCAgCisgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgCisgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKyAgICAweDIwLCAweDIyLCAweDI0LCAweDI2LCAweDI4LCAweDJhLCAweDJjLCAweDJlLAorICAgIDB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4OSwgIDB4OSwgIDB4YSwgIAorICAgIDB4YSwgIDB4YiwgIDB4YiwgIDB4YywgIDB4YywgIDB4ZCwgIDB4ZCwgIDB4ZSwgIAorICAgIDB4ZSwgIDB4ZiwgIDB4ZiwgIDB4MTAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIAorICAgIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCisKK307CisKKyAgICAgICAgICAgICAgCisgICAgIC8qICBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbaV09cm91bmQoMzI3NjcvaSkKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNlswXT0gMAorICAgICAgKi8KKworY29uc3QgT01YX1MxNiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbNjRdPXsKKwkweDAwMDAsMHg3ZmZmLDB4NDAwMCwweDJhYWEsMHgyMDAwLDB4MTk5OSwweDE1NTUsMHgxMjQ5LAorICAgIDB4MTAwMCwweDBlMzksMHgwY2NkLDB4MGJhMywweDBhYWIsMHgwOWQ5LDB4MDkyNSwweDA4ODgsCisgICAgMHgwODAwLDB4MDc4NywweDA3MWMsMHgwNmJkLDB4MDY2NiwweDA2MTgsMHgwNWQxLDB4MDU5MSwKKyAgICAweDA1NTUsMHgwNTFmLDB4MDRlYywweDA0YmUsMHgwNDkyLDB4MDQ2YSwweDA0NDQsMHgwNDIxLAorICAgIDB4MDQwMCwweDAzZTEsMHgwM2M0LDB4MDNhOCwweDAzOGUsMHgwMzc2LDB4MDM1ZSwweDAzNDgsCisgICAgMHgwMzMzLDB4MDMxZiwweDAzMGMsMHgwMmZhLDB4MDJlOSwweDAyZDgsMHgwMmM4LDB4MDJiOSwKKyAgICAweDAyYWIsMHgwMjlkLDB4MDI4ZiwweDAyODIsMHgwMjc2LDB4MDI2YSwweDAyNWYsMHgwMjU0LAorICAgIDB4MDI0OSwweDAyM2YsMHgwMjM1LDB4MDIyYiwweDAyMjIsMHgwMjE5LDB4MDIxMSwweDAyMDgKKwkgICAKK307CisgICAgIAorICAgICAgLyogVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MworICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyW2ldPXJvdW5kKDEzMTA3MS9pKQorICAgICAgICogYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzBdPSAwCisgICAgICAgKi8KKworY29uc3QgT01YX1MzMiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbNjRdPXsKKwkweDAwMDAwMDAwLDB4MDAwMWZmZmYsMHgwMDAxMDAwMCwweDAwMDBhYWFhLCAweDAwMDA4MDAwLCAweDAwMDA2NjY2LCAweDAwMDA1NTU1LCAweDAwMDA0OTI0LAorICAgIDB4MDAwMDQwMDAsMHgwMDAwMzhlMywweDAwMDAzMzMzLDB4MDAwMDJlOGMsIDB4MDAwMDJhYWIsIDB4MDAwMDI3NjIsIDB4MDAwMDI0OTIsIDB4MDAwMDIyMjIsCisgICAgMHgwMDAwMjAwMCwweDAwMDAxZTFlLDB4MDAwMDFjNzIsMHgwMDAwMWFmMiwgMHgwMDAwMTk5YSwgMHgwMDAwMTg2MSwgMHgwMDAwMTc0NiwgMHgwMDAwMTY0MywKKyAgICAweDAwMDAxNTU1LDB4MDAwMDE0N2IsMHgwMDAwMTNiMSwweDAwMDAxMmY2LCAweDAwMDAxMjQ5LCAweDAwMDAxMWE4LCAweDAwMDAxMTExLCAweDAwMDAxMDg0LAorICAgIDB4MDAwMDEwMDAsMHgwMDAwMGY4NCwweDAwMDAwZjBmLDB4MDAwMDBlYTEsIDB4MDAwMDBlMzksIDB4MDAwMDBkZDYsIDB4MDAwMDBkNzksIDB4MDAwMDBkMjEsCisgICAgMHgwMDAwMGNjZCwweDAwMDAwYzdkLDB4MDAwMDBjMzEsMHgwMDAwMGJlOCwgMHgwMDAwMGJhMywgMHgwMDAwMGI2MSwgMHgwMDAwMGIyMSwgMHgwMDAwMGFlNSwKKyAgICAweDAwMDAwYWFiLDB4MDAwMDBhNzMsMHgwMDAwMGEzZCwweDAwMDAwYTBhLCAweDAwMDAwOWQ5LCAweDAwMDAwOWE5LCAweDAwMDAwOTdiLCAweDAwMDAwOTRmLAorICAgIDB4MDAwMDA5MjUsMHgwMDAwMDhmYiwweDAwMDAwOGQ0LDB4MDAwMDA4YWUsIDB4MDAwMDA4ODksIDB4MDAwMDA4NjUsIDB4MDAwMDA4NDIsIDB4MDAwMDA4MjAKKwkKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGYyNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucwpAQCAtMCwwICsxLDEwNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7ICoqCis7ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCis7ICoKKzsgKi8KKworICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIElOQ0xVREUgb214VkNfcy5oCisKKworICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgIElGIEFSTTExMzZKUworIAorOy8vIElucHV0IEFyZ3VtZW50cworQmxvY2tJbmRleCAgICAgICAgIFJOIDAKK3BDb2VmQnVmUm93ICAgICAgICBSTiAxCitwQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgorcHJlZERpciAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgICBSTiA0CitwUXBCdWYgICAgICAgICAgICAgUk4gNQorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICBSTiAwCitibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCitibG9ja0RDVG9wICAgICAgICAgUk4gNworYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKK3RlbXAxICAgICAgICAgICAgICBSTiA5Cit0ZW1wMiAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKKworICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAorICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAorICAgIAorICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQorICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCisgICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KKyAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KKyAgICAgICAgICAgICAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAorICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCisgICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAorICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCisgICAgICAKKyAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgorICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCisgICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCisgICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCisgICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKKworICAgICAgICAgCisgICAgCisgICAgICAgTV9FTkQKKyAKKyAgICAgICBFTkRJRgorCisgICAgICAgRU5EICAgIAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMWZhNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworLyogQ29udGFpbnMgRG91YmxlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZmVyZW5jZSBaaWd6YWcgVGFibGUKKyAqIENvbnRhaW5zIENsYXNzaWNhbCxWZXRpY2FsIGFuZCBIb3Jpem9udGFsIFppZ3phZ3NjYW4gdGFibGVzIGluIG9uZSBhcnJheSAgCisgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXSA9IAoreworICAgICAwLCAgMiwgIDE2LCAzMiwgIDE4LCAgNCwgIDYsIDIwLAorICAgIDM0LCA0OCwgNjQsIDUwLCAzNiwgMjIsICA4LCAgMTAsCisgICAgMjQsIDM4LCA1MiwgNjYsIDgwLCA5NiwgODIsIDY4LAorICAgIDU0LCA0MCwgMjYsICAxMiwgIDE0LCAyOCwgNDIsIDU2LCAKKyAgICA3MCwgODQsIDk4LCAxMTIsIDExNCwgMTAwLCA4NiwgNzIsCisgICAgNTgsIDQ0LCAzMCwgNDYsIDYwLCA3NCwgODgsIDEwMiwKKyAgICAxMTYsIDExOCwgMTA0LCA5MCwgNzYsIDYyLCA3OCwgOTIsCisgICAgMTA2LCAxMjAsIDEyMiwgMTA0LCA5NCwgMTEwLCAxMjQsIDEyNiwKKworCTAsICAxNiwgMzIsIDQ4LCAgMiwgIDE4LCAgNCwgMjAsCisgICAgMzQsIDUwLCA2NCwgODAsIDk2LCAxMTIsIDExNCwgOTgsCisgICAgODIsIDY2LCA1MiwgMzYsICA2LCAyMiwgIDgsIDI0LAorICAgIDM4LCA1NCwgNjgsIDg0LCAxMDAsIDExNiwgNzAsIDg2LAorICAgIDEwMiwgMTE4LCA0MCwgNTYsICAxMCwgMjYsICAxMiwgMjgsCisgICAgNDIsIDU4LCA3MiwgODgsIDEwNCwgMTIwLCA3NCwgOTAsIAorICAgIDEwNiwgMTIyLCA0NCwgNjAsICAxNCwgMzAsIDQ2LCA2MiwKKyAgICA3NiwgOTIsIDEwOCwgMTI0LCA3OCwgOTQsIDExMCwgMTI2LAorCisgICAgMCwgIDIsICA0LCAgNiwgIDE2LCAgMTgsIDMyLCAzNCwKKyAgICAyMCwgMjIsICA4LCAgMTAsICAxMiwgIDE0LCAzMCwgMjgsCisgICAgMjYsIDI0LCAzOCwgMzYsIDQ4LCA1MCwgNjQsIDY2LAorICAgIDUyLCA1NCwgNDAsIDQyLCA0NCwgNDYsIDU2LCA1OCwKKyAgICA2MCwgNjIsIDY4LCA3MCwgODAsIDgyLCA5NiwgOTgsCisgICAgODQsIDg2LCA3MiwgNzQsIDc2LCA3OCwgODgsIDkwLCAKKyAgICA5MiwgOTQsIDEwMCwgMTAyLCAxMTIsIDExNCwgMTE2LCAxMTgsCisgICAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMjAsIDEyMiwgMTI0LCAxMjYKKworCit9OworCisKKworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzk2YWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisgCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZworICogcG9zaXRpb25pbmcgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheQorICogb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IKKyAqIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQorICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCisgKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqCQkJCQkJCQlbMC03XQorICogW2luXQlRUAkJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIGluZGljYXRlcyB1c2luZyBxdWFudGl6YXRpb24gbWV0aG9kIGRlZmluZWQgaW4gc2hvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gaGVhZGVyIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIGluZGljYXRlcyBub3JtYWlsIHF1YW50aXphdGlvbiBtZXRob2QuCisgKiBbb3V0XSBwcEJpdFN0cmVhbSAJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbQorICogW291dF0gcERzdAkJCXBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZGF0YSB0eXBlKS4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdAorICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZToKKyAqICAgLSAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBRUCA8PSAwOworICoJIC0gcERzdCBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCisgICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOworICAgIAorICAgIAorICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIERlcXVhbnRpemF0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKKyAgICAgcFRlbXBCdWYxLAorICAgICBRUCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworCSAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjg2NTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKiBGdW5jdGlvbiBmb3Igc2F0dXJhdGluZyAxNiBiaXQgdmFsdWVzIHRvIHRoZSBbMCwyNTVdIHJhbmdlIGFuZCAgKi8KKy8qIHdyaXRpbmcgb3V0IGFzIDggYml0IHZhbHVlcy4gIERvZXMgNjQgZW50cmllcyAgICAgICAgICAgICAgICAgICAqLwordm9pZCBhcm1WQ000UDJfQ2xpcDgoT01YX1MxNiAqcFNyYywgT01YX1U4ICpwRHN0LCBPTVhfSU5UIGRzdFN0ZXAgKTsKKworCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKKyAqIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZyYW1lL3BsYW5lIG9uCisgKiBhIHBpeGVsIGJhc2lzLiBGb3IgSU5UUkEgYmxvY2ssIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBjbGlwcGVkIHRvIFswLCAyNTVdIGFuZAorICogd3JpdHRlbiB0byBjb3JyZXNwb25kaW5nIGJsb2NrIGJ1ZmZlciB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKKyAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCisgKgkJCQkJCQkJWzAtN10uCisgKiBbaW5dCXN0ZXAJCQl3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUKKyAqIFtpbi9vdXRdCXBDb2VmQnVmUm93CQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgcndvIGJ1ZmZlcgorICogW2luL291dF0JcENvZWZCdWZDb2wJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dCWN1clFQCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaAorICoJCQkJCQkJCXRoZSBjdXJyZW50IGJsb2NrIGJlbG9uZ3MgdG8KKyAqIFtpbl0JcFFwQnVmCQkgUG9pbnRlciB0byBhIDItZWxlbWVudCBRUCBhcnJheS4gcFFwQnVmWzBdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGxlZnQgdG8KKyAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrKFFQYSkuIHBRcEJ1ZlsxXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBqdXN0IGFib3ZlIHRoZQorICogICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jayhRUGMpLgorICogICAgICAgICAgICAgICAgICAgTm90ZSwgaW4gY2FzZSB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpcyBvdXQgb2YgVk9QIGJvdW5kLCB0aGUgUVAgdmFsdWUgd2lsbCBoYXZlCisgKiAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgdG8gdGhlIGludHJhLXByZWRpY3Rpb24gcHJvY2Vzcy4gUmVmZXIgdG8gc3ViY2xhdXNlICAiNy40LjMuMyBBZGFwdGl2ZQorICogICAgICAgICAgICAgICAgICAgYWMgY29lZmZpY2llbnQgcHJlZGljdGlvbiIgb2YgSVNPL0lFQyAxNDQ5Ni0yKE1QRUc0IFBhcnQyKSBmb3IgYWNjdXJhdGUgZGVzY3JpcHRpb24uCisgKiBbaW5dCWJsb2NrSW5kZXgJCWJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICoJCQkJCQkJCXBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsCisgKgkJCQkJCQkJRmlndXJlIDYtNSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlpbnRyYURDVkxDCQlhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4KKyAqCQkJCQkJCQlUaGlzIGFsbG93cyBhIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDCisgKgkJCQkJCQkJZm9yIGNvZGluZyBvZiBJbnRyYSBEQyBjb2VmZmljaWVudHMgYXMgcGVyIFRhYmxlCisgKgkJCQkJCQkJNi0yMSBvZiBJU08vSUVDIDE0NDk2LTIuIAorICogW2luXQlBQ1ByZWRGbGFnCQlhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcKKyAqCQkJCQkJCQlpZiB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QKKyAqCQkJCQkJCQljb2x1bW4gYXJlIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZAorICoJCQkJCQkJCW1hY3JvYmxvY2suCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCisgKgkJCQkJCQlhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICoJCQkJCQkJCWRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqCQkJCQkJCQlpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdCXBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkJCSpwcEJpdFN0cmVhbQorICogW291dF0JcERzdAkJCXBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCQkJCQkJCQlwRHN0IHNob3VsZCBiZSAxNi1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwQ29lZkJ1ZlJvdwkJcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0JQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUVBCdWYsIHBEc3QuCisgKiAgICAgIG9yCisgKiAgIC0gIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZTogKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgY3VyUVAgZXhjZWVkcyAoMSwgMzEpLAorICogICAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsOV0sIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4LCBpbnRyYURDVkxDIGlzIHplcm8gd2hpbGUKKyAqICAgICAgYmxvY2tJbmRleCBncmVhdGVyIHRoYW4gNS4KKyAqICAgICAgb3IKKyAqICAgLQlwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgT01YX0lOVCBzdGVwLAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9VOCBjdXJRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKyAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKKyAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpcjsKKyAgICBPTVhfSU5UICBwcmVkUVA7CisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgCisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7CisgICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOworICAgIAorICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLworICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgICZwcmVkRGlyLAorICAgICAgICAmcHJlZFFQLAorICAgICAgICBwUVBCdWYpOworCisgICAgcHJlZEFDRGlyID0gcHJlZERpcjsKKworICAgIAorICAgIGlmIChBQ1ByZWRGbGFnID09IDApCisgICAgeworICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKKyAgICB9CisKKyAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KKyAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOworICAgIH0KKyAgICAKKworICAgIC8qIFZMRCBhbmQgemlnemFnICovCisgICAgaWYgKGludHJhRENWTEMgPT0gMSkKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICB2aWRlb0NvbXApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgIHBDb2VmQnVmUm93LAorICAgICAgICBwQ29lZkJ1ZkNvbCwKKyAgICAgICAgY3VyUVAsCisgICAgICAgIHByZWRRUCwKKyAgICAgICAgcHJlZERpciwKKyAgICAgICAgQUNQcmVkRmxhZywKKyAgICAgICAgdmlkZW9Db21wKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgY3VyUVAsCisgICAgIHZpZGVvQ29tcCwKKyAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKKyAgICAgICBpdCB0byAwIHRvIDI1NSAqLworICAgIAorCWFybVZDTTRQMl9DbGlwOChwVGVtcEJ1ZjIscERzdCxzdGVwKTsKKwkKKwkKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzE2ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpAQCAtMCwwICsxLDM2NCBAQAorOyAqKioqKioqKioqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKioKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIERlY29kZXMgYW5kIHBhZHMgZm91ciBtb3Rpb24gdmVjdG9ycyBvZiB0aGUgbm9uLWludHJhIG1hY3JvYmxvY2sgaW4gUC1WT1AuCis7ICogVGhlIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBwcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy42LjEuNiBvZgorOyAqIElTTy9JRUMgMTQ0OTYtMi4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgorOyAqIFtpbl0gICAgcFNyY01WTGVmdE1CICAgICAgIHBvaW50ZXJzIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlck1CICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXIgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBwU3JjTVZVcHBlclJpZ2h0TUIgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCis7ICogICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCis7ICogW2luXSAgICBmY29kZUZvcndhcmQgICAgICAgYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNAorOyAqICAgICAgICAgICAgICAgICAgICAgYml0IHN0cmVhbSBzeW50YXgKKzsgKiBbaW5dICAgIE1CVHlwZSAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZQorOyAqICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24KKzsgKiAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIGZpbGxlZCB3aXRoIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgc2FtZSBkZWNvZGVkIHZlY3Rvci4KKzsgKiBbb3V0XSAgIHBwQml0U3RyZWFtICAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsCis7ICogICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICBwRHN0TVZDdXJNQiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIHdoaWNoIGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycworOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLW5vIGVycm9yCis7ICogCis7ICogICAgICAgICAgICAgICAgICAgICAKKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqCis7ICoKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKyAgICAgICAgSU5DTFVERSBvbXhWQ19zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAgICAKKworCisgICAgICAgIElGIEFSTTExMzZKUworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgICBSTiAxCitwU3JjTVZMZWZ0TUIgICAgICAgICAgUk4gMgorcFNyY01WVXBwZXJNQiAgICAgICAgIFJOIDMKK3BTcmNNVlVwcGVyUmlnaHRNQiAgICBSTiA0CitwRHN0TVZDdXJNQiAgICAgICAgICAgUk4gNQorZmNvZGVGb3J3YXJkICAgICAgICAgIFJOIDYKK01CVHlwZSAgICAgICAgICAgICAgICBSTiA3CisKKzsvL0xvY2FsIFZhcmlhYmxlcworCit6ZXJvICAgICAgICAgICAgICAgICAgUk4gNAorb25lICAgICAgICAgICAgICAgICAgIFJOIDQKK3NjYWxlRmFjdG9yICAgICAgICAgICBSTiAxCisKKworUmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKKworVmxjTVZEICAgICAgICAgICAgICAgIFJOIDAKK2luZGV4ICAgICAgICAgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICAgUk4gNworCittdkhvckRhdGEgICAgICAgICAgICAgUk4gNAorbXZIb3JSZXNpZHVhbCAgICAgICAgIFJOIDAKKworbXZWZXJEYXRhICAgICAgICAgICAgIFJOIDQgICAgICAgICAgICAgCittdlZlclJlc2lkdWFsICAgICAgICAgUk4gMAorCit0ZW1wICAgICAgICAgICAgICAgICAgUk4gMQorCit0ZW1wMSAgICAgICAgICAgICAgICAgUk4gMworSGlnaCAgICAgICAgICAgICAgICAgIFJOIDQKK0xvdyAgICAgICAgICAgICAgICAgICBSTiAyCitSYW5nZSAgICAgICAgICAgICAgICAgUk4gMQorCitCbGtDb3VudCAgICAgICAgICAgICAgUk4gMTQKKworZGlmZk1WZHggICAgICAgICAgICAgIFJOIDAKK2RpZmZNVmR5ICAgICAgICAgICAgICBSTiAxCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICAgUk4gOAorUkJpdENvdW50ICAgICAgICAgICAgIFJOIDkKK1JCaXRCdWZmZXIgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICAgUk4gMTEKK1QyICAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FWbGNNVkQKKyAgICAgICBJTVBPUlQgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKKworICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgICAgICAgIAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcERzdE1WQ3VyTUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwRHN0TVZQcmVkTUUsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwQmxrQ291bnQsNAorICAgICAgIAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcEJpdE9mZnNldCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZMZWZ0TUIsNAorICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFNyY01WVXBwZXJNQiw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeCw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBkaWZmTVZkeSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBIaWdoLDQKKyAgICAgICAKKyAgICAgICAgICAgICAgCisKKworICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCxyMTEKKyAgICAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1Cb25TdGFjayw0ICAgICAgICAgICA7Ly8gcG9pbnRlciB0byAgcFNyY01WVXBwZXJSaWdodE1CIG9uIHN0YWNrCisgICAgICAgTV9BUkcgICAgICAgICAgIHBEc3RNVkN1ck1Cb25TdGFjayw0ICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gcERzdE1WQ3VyTUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgZmNvZGVGb3J3YXJkb25TdGFjayw0ICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBmY29kZUZvcndhcmQgb24gc3RhY2sgCisgICAgICAgTV9BUkcgICAgICAgICAgIE1CVHlwZW9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gTUJUeXBlIG9uIHN0YWNrCisKKyAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdFN0cmVhbSBNYWNybworCisgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICBNX0xEUiAgICAgICAgICAgTUJUeXBlLE1CVHlwZW9uU3RhY2sgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBNQlR5cGUgZnJvbSBzdGFjaworICAgICAgIE1fTERSICAgICAgICAgICBwRHN0TVZDdXJNQixwRHN0TVZDdXJNQm9uU3RhY2sgICAgICAgIDsvLyBMb2FkIHBEc3RNVkN1ck1CIGZyb20gc3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgemVybywjMAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVFJBICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5UUkEKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkFfUSAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQV9RCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CXQorICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgICAgU1RSRVEgICAgICAgICAgIHplcm8sW3BEc3RNVkN1ck1CLCM0XQorICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBNT1YgICAgICAgICAgICAgQmxrQ291bnQsIzAKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRPSworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFYgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0VgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUjRWX1EgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSNFZfUQorICAgICAgIE1PVkVRICAgICAgICAgICBDb3VudCwjNAorCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVIKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCMxCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIGZjb2RlRm9yd2FyZCxmY29kZUZvcndhcmRvblN0YWNrICAgICAgOy8vIExvYWQgZmNvZGVGb3J3YXJkICBmcm9tIHN0YWNrCisKKyAgICAgICA7Ly8gU3RvcmluZyB0aGUgdmFsdWVzIHRlbXBvcmFyaWx5IG9uIHN0YWNrCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgICAgICAgCisKKyAgICAgICBTVUIgICAgICAgICAgICAgdGVtcCxmY29kZUZvcndhcmQsIzEgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1mY29kZUZvcndhcmQtMQorICAgICAgIE1PViAgICAgICAgICAgICBvbmUsIzEKKyAgICAgICBNX1NUUiAgICAgICAgICAgcFNyY01WTGVmdE1CLHBwU3JjTVZMZWZ0TUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isb25lLHRlbXAgICAgICAgICAgICAgICAgICA7Ly8gc2NhbGVGYWN0b3I9MTw8KGZjb2RlRm9yd2FyZC0xKQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisgICAgICAgTFNMICAgICAgICAgICAgIHNjYWxlRmFjdG9yLHNjYWxlRmFjdG9yLCM1ICAgICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIHNjYWxlRmFjdG9yLHBIaWdoICAgICAgICAgICAgICAgICAgICAgOy8vIFtwSGlnaF09MzIqc2NhbGVGYWN0b3IKKyAgICAgICAgICAgICAgCisgICAgICAgOy8vIFZMRCBEZWNvZGluZworCisKK0xvb3AKKworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWQgdGhlIG9wdGltaXplZCBNVkQgVkxDIHRhYmxlCisKKyAgICAgICA7Ly8gSG9yaXpvbnRhbCBEYXRhIGFuZCBSZXNpZHVhbCBjYWxjdWxhdGlvbgorCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIHZhcmlhYmxlIGxlbmdodCBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgIAorICAgICAgIFRFUSAgICAgICAgICAgICBpbmRleCx0ZW1wCisgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIHRoZSBkZWNvZGVkIHN5bWJvbCBpcyBhbiBpbnZhbGllZCBzeW1ib2wgCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCwjMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JSZXNpZHVhbD0xCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZIb3JEYXRhPTAgZGlmZk1WZHg9bXZIb3JEYXRhICAgICAgICAgCisgICAgICAgQkVRICAgICAgICAgICAgIFZlcnRpY2FsRGF0YQorICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdkhvclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBnZXQgbXZIb3JSZXNpZHVhbCBmcm9tIGJpdHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbXZIb3JEYXRhIT0wICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZIb3JEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12SG9yRGF0YSxtdkhvckRhdGEsIzAgICAgICAgICAgICAgICAgOy8vIG12SG9yRGF0YT1hYnMobXZIb3JEYXRhKQorICAgICAgIFNVQiAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLG12SG9yUmVzaWR1YWwsZmNvZGVGb3J3YXJkCisgICAgICAgU01MQUJCICAgICAgICAgIGRpZmZNVmR4LG12SG9yRGF0YSxmY29kZUZvcndhcmQsbXZIb3JSZXNpZHVhbCA7Ly8gZGlmZk1WZHg9YWJzKG12SG9yRGF0YSkqZmNvZGVGb3J3YXJkK212SG9yUmVzaWR1YWwtZmNvZGVGb3J3YXJkCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMxCisgICAgICAgUlNCTFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LCMwCisgICAgICAgCisgICAgICAgOy8vIFZlcnRpY2FsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKK1ZlcnRpY2FsRGF0YQorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBkaWZmTVZkeCBvbiBzdGFjaworICAgICAgIExEUiAgICAgICAgICAgICBWbGNNVkQsID1hcm1WQ000UDJfYVZsY01WRCAgICAgICAgOy8vIExvYWRpbmcgdGhlIGFkZHJlc3Mgb2Ygb3B0aW1pemVkIFZMQyB0YWJsZXMKKworICAgICAgIExEUiAgICAgICAgICAgICB0ZW1wLD0weEZGRgorICAgICAgIE1fQkRfVkxEICAgICAgICBpbmRleCxUMSxUMixWbGNNVkQsMywyICAgICAgICAgICAgICAgIDsvLyBWTEMgZGVjb2RpbmcgdXNpbmcgdGhlIG1hY3JvCisgICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgYW4gSW52YWxpZWQgU3ltYm9sIG9jY3VycworICAgICAgIAorICAgICAgIFNVQiAgICAgICAgICAgICBtdlZlckRhdGEsaW5kZXgsIzMyICAgICAgICAgICAgICAgICAgIDsvLyBtdlZlckRhdGE9aW5kZXgtMzIgICAgICAgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsIzEgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBmY29kZUZvcndhcmQsIzEKKyAgICAgICBURVFORSAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgTU9WRVEgICAgICAgICAgIGRpZmZNVmR5LG12VmVyRGF0YSAgICAgICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR5ID0gbXZWZXJEYXRhIGlmIHNjYWxlRmFjdG9yPTEoZmNvZGVGb3J3YXJkPTEpIG9yIG12VmVyRGF0YT0wCisgICAgICAgQkVRICAgICAgICAgICAgIEZpbmRNVlByZWQKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMQorICAgICAgIE1fQkRfVlJFQUQ4ICAgICBtdlZlclJlc2lkdWFsLHRlbXAsVDEsVDIgICAgICAgICAgICAgIDsvLyBHZXQgbXZWZXJSZXNpZHVhbCBmcm9tIGJpdCBzdHJlYW0gaWYgZmNvZGVGb3J3YXJkPjEgYW5kIG1uVmVyRGF0YSE9MAorICAgICAgICAgICAgIAorCisgICAgICAgQ01QICAgICAgICAgICAgIG12VmVyRGF0YSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICBtdlZlckRhdGEsbXZWZXJEYXRhLCMwCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyUmVzaWR1YWwsbXZWZXJSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhLGZjb2RlRm9yd2FyZCxtdlZlclJlc2lkdWFsIDsvLyBkaWZmTVZkeT1hYnMobXZWZXJEYXRhKSpmY29kZUZvcndhcmQrbXZWZXJSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHksZGlmZk1WZHksIzAKKworICAgICAgIDsvL0NhbGxpbmcgdGhlIEZ1bmN0aW9uIG9teFZDTTRQMl9GaW5kTVZwcmVkCisgICAgICAgIAorRmluZE1WUHJlZAorCisgICAgICAgTV9TVFIgICAgICAgICAgIGRpZmZNVmR5LHBkaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHBEc3RNVkN1ck1CLEJsa0NvdW50LExTTCAjMiAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBwRHN0TVZDdXJNQiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wIG9uIHN0YWNrIGZvciBwYXNzaW5nIGFzIGFuIGFyZ3VtZW50IHRvIEZpbmRNVlByZWQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcCwjMAorICAgICAgIE1fU1RSICAgICAgICAgICB0ZW1wLHBEc3RNVlByZWRNRSAgICAgICAgICAgICAgICAgICAgIDsvLyBQYXNzIHBEc3RNVlByZWRNRT1OVUxMIGFzIGFuIGFyZ3VtZW50ICAgICAgICAgCisgICAgICAgTV9TVFIgICAgICAgICAgIEJsa0NvdW50LHBCbGtDb3VudCAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3NzIEJsa0NvdW50IGFzIEFyZ3VtZW50IHRocm91Z2ggc3RhY2sKKworICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLHBTcmNNVkxlZnRNQiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wIChSTiAxKT1wU3JjTVZMZWZ0TUIKKyAgICAgICBNX0xEUiAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLHBTcmNNVlVwcGVyUmlnaHRNQm9uU3RhY2sKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WTGVmdE1CLHBTcmNNVlVwcGVyTUIgICAgICAgICAgICA7Ly8gcFNyY01WTGVmdE1CICggUk4gMikgPSBwU3JjTVZVcHBlck1CCisgICAgICAgTU9WICAgICAgICAgICAgIHBwQml0U3RyZWFtLHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgOy8vIHBwQml0U3RyZWFtICAoIFJOIDApID0gcERzdE1WQ3VyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcFNyY01WVXBwZXJNQixwU3JjTVZVcHBlclJpZ2h0TUIgICAgICA7Ly8gcFNyY01WVXBwZXJNQiggUk4gMykgPSBwU3JjTVZVcHBlclJpZ2h0TUIgICAgICAKKyAgICAgICBCTCAgICAgICAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gc3Vicm91dGluZSBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIFN0b3JlIEhvcml6b250YWwgTW90aW9uIFZlY3RvcgorICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBCbGtDb3VudCBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIEhpZ2gscEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9MzIqc2NhbGVGYWN0b3IKKyAgICAgICBMU0wgICAgICAgICAgICAgdGVtcDEsQmxrQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1CbGtDb3VudCo0CisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeCAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHgKKyAgICAgICAKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBSU0IgICAgICAgICAgICAgTG93LEhpZ2gsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG93ID0gLTMyKnNjYWxlRmFjdG9yCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4PXBEc3RNVkN1ck1CW0Jsa0NvdW50XStkaWZmTVZkeAorICAgICAgIEFERCAgICAgICAgICAgICBSYW5nZSxIaWdoLEhpZ2ggICAgICAgICAgICAgICAgICAgICAgIDsvLyBSYW5nZT02NCpTY2FsZUZhY3RvcgorICAgICAgIFNVQiAgICAgICAgICAgICBIaWdoLEhpZ2gsIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIaWdoPSAzMipzY2FsZUZhY3Rvci0xCisKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsTG93ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHg8TG93ICAgICAgICAgIAorICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBkaWZmTVZkeCs9UmFuZ2UKKyAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU1VCR1QgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIElmIGRpZmZNVmR4ID4gSGlnaCBkaWZmTVZkeC09UmFuZ2UKKyAgICAgICBTVFJIICAgICAgICAgICAgZGlmZk1WZHgsW3BEc3RNVkN1ck1CLHRlbXAxXQorCisgICAgICAgOy8vIFN0b3JlIFZlcnRpY2FsCisKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsdGVtcDEsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9NCpCbGtDb3VudCsyCisgICAgICAgTV9MRFIgICAgICAgICAgIGRpZmZNVmR4LHBkaWZmTVZkeSAgICAgICAgICAgICAgICAgICAgOy8vIExhYWQgZGlmZk1WZHkKKyAgICAgICBMRFJTSCAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgICAgICAgICAgICA7Ly8gdGVtcD1wRHN0TVZDdXJNQltCbGtDb3VudF0uZGlmZk1WZHkKKyAgICAgICBBREQgICAgICAgICAgICAgQmxrQ291bnQsQmxrQ291bnQsIzEgICAgICAgICAgICAgICAgICA7Ly8gQmxrQ291bnQ9QmxrQ291bnQrMQorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeCx0ZW1wLGRpZmZNVmR4ICAgICAgICAgICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cKKyAgICAgICBBRERMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHk8TG93ICBkaWZmTVZkeSs9UmFuZ2UgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LEhpZ2gKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHkgPiBIaWdoIGRpZmZNVmR5LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBCbGtDb3VudCxDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBwU3JjTVZVcHBlck1CCisKKyAgICAgICBCTFQgICAgICAgICAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgQmxrQ291bnQ8Q291bnQgQ29udGludWUgdGhlIExvb3AKKworCisgICAgICAgOy8vIElmIE1CVHlwZT1PTVhfVkNfSU5URVIgb3IgTUJ0eXBlPU9NWF9WQ19JTlRFUl9RIGNvcHkgcERzdE1WQ3VyTUJbMF0gdG8KKyAgICAgICA7Ly8gcERzdE1WQ3VyTUJbMV0sIHBEc3RNVkN1ck1CWzJdLCBwRHN0TVZDdXJNQlszXSAKKworICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjaworCisgICAgICAgVEVRICAgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgTERSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CXQorICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCM4XQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjMTJdCisgICAgICAgCisgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgIDsvLyBGaW5pc2hpbmcgdGhlIE1hY3JvICAgICAgIAorCisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAKK0V4aXRFcnJvcgorCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybworICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0CisgICAgICAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworRXhpdE9LICAgICAgICAgICAgIAorCisgICAgICAgTV9FTkQKKyAgICAgICBFTkRJRgorICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyMDhjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKQEAgLTAsMCArMSwxMzIgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgorCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKKyAgICAgICAgIAorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWEzN2VjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCkBAIC0wLDAgKzEsMTM2IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworOy8vSW5wdXQgQXJndW1lbnRzCisKK3BwQml0U3RyZWFtICAgICAgICAgIFJOIDAKK3BCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICAgICAgIFJOIDIKK1ByZWREaXIgICAgICAgICAgICAgIFJOIDMKK3Nob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBJbnB1dCBBcmd1bWVudCBvbiBzdGFjayAgICAgICAgICAgCisKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIExvYWQgQWRkcmVzcyBvZiB0aGUgWmlnemFnIHRhYmxlICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgOy8vIExvYWRpbmcgRGlmZmVyZW50IHR5cGUgb2YgemlnemFnIHRhYmxlcyBiYXNlZCBvbiBQcmVkRGlyCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgWmlnemFnIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgVGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBWTEMgVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCBUYWJsZSBhZGRyZXNzIG9uIFN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQ9MCAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgOy8vIGdldCB0aGUgSW5wdXQgQXJndW1lbnQgZnJvbSBzdGFjaworCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgIDsvLyBDYWxsIFVuc2FmZSBGdW5jdGlvbgorCisKKworICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzhhYWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKQEAgLTAsMCArMSwyMjQgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciBibG9jay4KKzsgKgorOyAqCis7ICoKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCis7ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKzsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCis7ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKzsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCis7ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKKzsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCis7ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KKzsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCis7ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCis7ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQorOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAorOyAqCis7ICovCisKKworICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisKKworICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgIAorICAgICAgCisKKworICAgICAgSUYgQ29ydGV4QTgKKworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBDTGFzc2ljYWwsIEhvcml6b250YWwsIFZlcnRpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCAgOy8vIENvbnRhaW5zIE9wdGltaXplZCBEQ0x1bWEgYW5kIERDQ2hyb21hIEluZGV4IHRhYmxlIEVudHJpZXMKKyAgICAgICAgCisKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCit2aWRlb0NvbXAgICAgICAgICAgICBSTiA1Cis7Ly9Mb2NhbCBWYXJpYWJsZXMKKworUmV0dXJuICAgICAgICAgICAgICAgUk4gMAorCitwRENMdW1hQ2hyb21hSW5kZXggICBSTiA0CitwRENDaHJvbWFJbmRleCAgICAgICBSTiA3CitwVmxjVGFibGVMMEwxICAgICAgICBSTiA0CitwTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0CitwWmlnemFnVGFibGUgICAgICAgICBSTiA0CitDb3VudCAgICAgICAgICAgICAgICBSTiA2CitEQ1ZhbHVlU2l6ZSAgICAgICAgICBSTiA2Citwb3dPZlNpemUgICAgICAgICAgICBSTiA3Cit0ZW1wMSAgICAgICAgICAgICAgICBSTiA1CisKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorRENWYWwgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCisgICAgIAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBEQ0NvZWZmLDQKKyAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLHIxMgorCisgICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrICAKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uc3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sKKworICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBEQyBDb2VmZmljaWVudAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LCA9YXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4IDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgZm9yIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UKKworICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBCaXRzdHJlYW0gTWFjcm8KKworICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgQUREICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCxwRENMdW1hQ2hyb21hSW5kZXgsdmlkZW9Db21wLCBMU0wgIzYgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDIgICAgICBUMSwgVDIsIFQyCisgICAgCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgICAgICAgRENWYWx1ZVNpemUsVDEsVDIscERDTHVtYUNocm9tYUluZGV4LDQsMiAgICAgICAgICAgICAgICAgICAgOy8vIFZMQyBEZWNvZGUgdXNpbmcgb3B0aW1pemVkIEx1bWluYW5jZSBhbmQgQ2hyb21pbmFuY2UgVkxDIFRhYmxlCisKKyAgICAKKyAgICAgICAKKworRGVjb2RlREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMxMiAgICAgCisgICAgICAgIEJHVCAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMAorICAgICAgICBNT1ZFUSAgICAgICAgICAgRENWYWwsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGlzIHplcm8gdGhlbiBEQyBjb2VmZiA9MAorICAgICAgICBCRVEgICAgICAgICAgICAgQUNEZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBwZXJmb3JtIEFDIENvZWZmIERlY29kaW5nCisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgICAgRENWYWwsRENWYWx1ZVNpemUsVDEsVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBEQyBWYWx1ZSBGcm9tIEJpdCBzdHJlYW0KKyAgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgICAgICBwb3dPZlNpemUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTFNMICAgICAgICAgICAgIHBvd09mU2l6ZSxEQ1ZhbHVlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb3dPZlNpemU9cG93KDIsRENWYWx1ZVNpemUpCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbCxwb3dPZlNpemUsTFNSICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBEQ1ZhbCB3aXRoIHBvd09mU2l6ZS8yIAorICAgICAgICBBRERMVCAgICAgICAgICAgRENWYWwsRENWYWwsIzEKKyAgICAgICAgU1VCTFQgICAgICAgICAgIERDVmFsLERDVmFsLHBvd09mU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBMZXNzdGhhbiBwb3dPZlNpemUvMiBEQ1ZhbD1EQ1ZhbC1wb3dPZlNpemUrMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgRENWYWw9IGZldGNoYml0cyBmcm9tIGJpdCBzdHJlYW0KKworQ2hlY2tEQ1ZhbHVlU2l6ZQorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBncmVhdGVyIHRoYW4gOCBjaGVjayBtYXJrZXIgYml0CisKKyAgICAgICAgQkxFICAgICAgICAgICAgIEFDRGVjb2RlCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKKyAgICAgICAgVEVRICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBNYXJrZXIgYml0IGlzIHplcm8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIAorCisgICAgICAgIDsvLyBEZWNvZGUgQUMgQ29lZmZpY2llbnQKKworQUNEZWNvZGUKKworICAgICAgICBNX1NUUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgRGVjb2RlZCBEQyBDb2VmZiBvbiBTdGFjaworICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBzdHJlYW0gTWFjcm8KKyAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgICAgIDsvLyBMb2FkIFppZ3phZyB0YWxiZSBhZGRyZXNzICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICAgICAgIDsvLyBNb2RpZnkgdGhlIFppZ3phZyB0YWJsZSBhZHJlc3MgYmFzZWQgb24gUHJlZERpciAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE9wdGltaXplZCBWTEMgVGFibGUgV2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xIEVudHJpZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIE9wdGltaXplZCBWTEMgVGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCisgICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQorICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0ID0xICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIG9uIFN0YWNrCisgICAgICAgIAorICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgSW5wdXQgQXJndW1lbnQgRnJvbSBTdGFjaworICAgICAgICAKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICAgICA7Ly8gQ2FsbCB0aGUgVW5zYWZlIEZ1bmN0aW9uCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCB0aGUgRGVjb2RlZCBEQyBWYWx1ZSBGcm9tIFN0YWNrCisgICAgICAgIFNUUkggICAgICAgICAgICBEQ1ZhbCxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB0aGUgREMgVmFsdWUgCisgICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T0sKKyAgICAgICAgCisgICAgICAgICAgICAgIAorCitFeGl0RXJyb3IKKyAKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgU3RyZWFtIE1hY3JvIGluIGNhc2Ugb2YgYW4gRXJyb3IKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIAorRXhpdE9LCisgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2FmNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKQEAgLTAsMCArMSwxOTQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybVZDQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCisgICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKKyAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKK3BTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAorcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCitwU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKK3BTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMworcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0CitwRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKK2lCbGsgICAgICAgICAgICAgICAgICAgUk4gNgorCitwVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKK0NhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKKworcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3CitwQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKK3BDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQorCitDYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCitDYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCitDYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKK0NhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMworQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAorQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQorCit0ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3plcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKK3JldHVybiAgICAgICAgICAgICAgICAgUk4gMAorICAgICAgICAKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNYWluIHJvdXRpbmUKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCisKKyAgICAgICAgTV9BTExPQzQgTVYsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKKyAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0CisgICAgICAgIE1fQVJHICAgQmxrLCA0CisgICAgICAgIAorICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCisgICAgICAgIE1PViAgIHplcm8sICMwCisgICAgICAgIE1fTERSIGlCbGssIEJsaworICAgICAgICAKKyAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKKyAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKKyAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgorICAgIAorICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQorCisgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgorICAgICAgICBNX1NXSVRDSCBpQmxrCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9FTkRTV0lUQ0gKKyAgICAgICAgCitPTVhWQ0JsazAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4CisKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCisgICAgCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKKyAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorICAgIAorT01YVkNCbGsxCisgICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAorICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCisgICAgCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgICAgICAKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMgorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKKyAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCisgICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKKyAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKKyAgICAgICAgQiAgICAgQmxrRW5kCisKK09NWFZDQmxrMworICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4CisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgCitCbGtFbmQKKworICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCisgICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCisgICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKKyAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCisKKyAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCisgICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQorICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KKworICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCisKKyAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAorICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAorCisgICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAorICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQorICAgICAgICAgICAKKyAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKKyAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKKworICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAorCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCisgICAgCisgICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCisgICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KKworICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgIAorICAgICAgICBNX0VORAorICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKyAgICAKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWUzZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpAQCAtMCwwICsxLDczIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsKKzsvLworICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgICAgICA7Ly8gRGVmaW5lIGNwdSB2YXJpYW50cworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKKyAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQorICAgICAgICA7Ly8gICAgCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgIE1fQUxMT0M0ICBwcERlc3QsIDQKKyAgICAgICAgTV9BTExPQzQgIHBTdHJpZGUsIDQKKyAgICAgICAgTV9BTExPQzggIHBCbGssIDIqOCo4CisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9JRENUOHg4YmxrLCByMTEsIGQxNQorICAgIEVORElGCisgICAgICAgIAorICAgIElGIENvcnRleEE4CisgICAgICAgIAorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorcERzdCAgICAgICAgICAgIFJOIDEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworUmVzdWx0ICAgICAgICAgIFJOIDAKKworOy8vIFByb3RvdHlwZSBmb3IgbWFjcm8gTV9JRENUCis7Ly8gcFNyYyAgICAgICAgICAgIFJOIDAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKKzsvLyBTdHJpZGUgICAgICAgICAgUk4gMSAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworOy8vIHBEZXN0ICAgICAgICAgICBSTiAyICA7Ly8gZGVzdGluYXRpb24gZGF0YSBidWZmZXIKKzsvLyBwU2NhbGUgICAgICAgICAgUk4gMyAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQorCitwU3JjICAgIFJOIDAgICAgCitTdHJpZGUgIFJOIDEgICAgCitwRGVzdCAgIFJOIDIgICAgCitwU2NhbGUgIFJOIDMgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHBEZXN0LCBwRHN0CisgICAgICAgIExEUiAgICAgICAgIHBTY2FsZSwgPWFybUNPTU1fSURDVFByZVNjYWxlICAgICAgICAKKyAgICAgICAgTV9JRENUICAgICAgczksIHMxNiwgMTYgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgUmVzdWx0LCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORCAgICAgICAKKyAgICBFTkRJRiAgCisgICAgICAgIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKKworICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkMDBkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKQEAgLTAsMCArMSw0NDQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworOy8vIERlc2NyaXB0aW9uOgorOy8vCis7Ly8KKworOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycworICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworCisgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIElGICBDb3J0ZXhBOAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1BQ1JPIERFRklOSVRJT05TCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJJbnRlZ2VyUGl4ZWwiIHByZWRpY3RUeXBlLiBCb3RoIAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZC4gSnVzdCBjb3BpZXMgYSBibG9jayBmcm9tIHBTcmMgdG8gcERzdAorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOiBOb25lCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAorQ2FzZUludGVnZXJQaXhlbF9SbmQwCitDYXNlSW50ZWdlclBpeGVsX1JuZDEKKworICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCisKKyAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAorCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxYIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KKyAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgcmlnaHQgdG8gaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKKyAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKKyAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IAorICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAorCisgICAgTENMUyBNX1ZIQUREUgorICAgIElGICRybmRWYWwgPSAwCitNX1ZIQUREUiBTRVRTICJWUkhBREQiCisgICAgRUxTRQorTV9WSEFERFIgU0VUUyAiVkhBREQiCisgICAgRU5ESUYKKworQ2FzZUhhbGZQaXhlbFhfUm5kJHJuZFZhbAorCisgICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c1LCBkUm93NVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93NlNoZnQsIGRSb3c2LCBkUm93NlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCisgICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MFNoZnQKKyAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cxU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3cyU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MywgZFJvdzMsIGRSb3czU2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c0U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c1U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NiwgZFJvdzYsIGRSb3c2U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c3U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgCisgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBEb2VzIGludGVycG9sYXRpb24gZm9yIHRoZSBjYXNlIG9mICJIYWxmUGl4ZWxZIiBwcmVkaWN0VHlwZS4gVGhlIHR3byAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIHBhcmFtZXRlciAiJHJuZFZhbCIuIEF2ZXJhZ2VzIGJldHdlZW4KKyAgICA7Ly8gYSBwaXhlbCBhbmQgcGl4ZWwgYmVsb3cgaXQsIHJvdW5kaW5nIGl0IGJhc2VkIG9uICRybmRWYWwuIFRoZSAKKyAgICA7Ly8gcm91bmRpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgb3BDb2RlIHN3aXRjaGluZyBiZXR3ZWVuICJWUkhBREQiIGFuZCAKKyAgICA7Ly8gIlZIQUREIiBpbnN0cnVjdGlvbnMuCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6IAorICAgIDsvLyAgICAgJHJuZFZhbDogMCBmb3Igcm91bmRpbmcgYW5kIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vIE91dHB1dHM6IE5vbmUKKworICAgIE1BQ1JPIAorICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAorCisgICAgTENMUyBNX1ZIQUREUgorICAgIElGICRybmRWYWwgPSAwCitNX1ZIQUREUiBTRVRTICJWUkhBREQiCisgICAgRUxTRQorTV9WSEFERFIgU0VUUyAiVkhBREQiCisgICAgRU5ESUYKKworQ2FzZUhhbGZQaXhlbFlfUm5kJHJuZFZhbAorICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93MSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NCwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkxEMSAgICAgICAgZFJvdzUsIFtwU3JjXSwgc3JjU3RlcAorICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWTEQxICAgICAgICBkUm93NywgW3BTcmNdLCBzcmNTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzAsIGRSb3cwLCBkUm93MQorICAgIFZMRDEgICAgICAgIGRSb3c4LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93MSwgZFJvdzEsIGRSb3cyCisgICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3cyLCBkUm93MiwgZFJvdzMKKyAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93NAorICAgIFZTVDEgICAgICAgIGRSb3cyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NCwgZFJvdzQsIGRSb3c1CisgICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgICRNX1ZIQUREUiAgIGRSb3c1LCBkUm93NSwgZFJvdzYKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NworICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICAkTV9WSEFERFIgICBkUm93NywgZFJvdzcsIGRSb3c4CisgICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIAorICAgIDsvLyBUeXBpY2FsIGNvbXB1dGF0aW9uIGZvciBhIHJvdyBnb2VzIGxpa2UgdGhpcworICAgIDsvLyAgICAgMS4gVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAgOy8vIExvYWQgdGhlIHJvdyBhbmQgbmV4dCA4IGJ5dGVzCisgICAgOy8vICAgICAyLiBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxICAgICA7Ly8gR2VuZXJhdGUgdGhlIHNoaWZ0ZWQgcm93CisgICAgOy8vICAgICAzLiBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdCAgICAgICAgICAgICA7Ly8gR2VuZXJhdGUgdGhlIHN1bSBvZiByb3cgYW5kIHNoaWZ0ZWQgcm93CisgICAgOy8vICAgICA1LiBWQUREICAgICAgICBxU3VtMCwgcVN1bTAsIHFTdW0xICAgICAgICAgICAgICAgICA7Ly8gQWRkIHRvIHRoZSBzdW0gb2YgbmV4dCByb3cgKG9kZCByb3cgc3VtIGhhcyByb3VuZGluZyB2YWx1ZSBhZGRlZCB0byBpdCkKKyAgICA7Ly8gICAgIDYuIFZTSFJOICAgICAgIGRSb3cwLCBxU3VtMCwgIzIgICAgICAgICAgICAgICAgICAgIDsvLyBEaXZpZGUgYnkgNAorICAgIDsvLyAgICAgNy4gVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcCAgICAgICAgICAgOy8vIFN0b3JlCisgICAgOy8vIE9kZCByb3dzIHVuZGVyZ28gZm9sbG93aW5nIGNvbXB1dGF0aW9uIGFmdGVyIHN0ZXAgMworICAgIDsvLyAgICAgNC4gVkFERCAgICAgICAgcVN1bTEsIHFTdW0xLCBxUm91bmQKKyAgICA7Ly8gVGhpcyBzYXZlcyBmb3IgYWRkaW5nIHJvdW5kaW5nIHZhbHVlIHRvIGVhY2ggZmluYWwgc3VtIChvdmVyYWxsIHNhdmVzIDQgCisgICAgOy8vIGluc3RydWN0aW9ucykuCisgICAgOy8vIFRoZXJlIGlzIHJldXNlIG9mIHJlZ2lzdGVycyBmb3IgcVN1bTYsIHFTdW03ICYgcVN1bTguIE92ZXJhbGwgc2NoZWR1bGluZyB0YWtlcyAKKyAgICA7Ly8gY2FyZSBvZiB0aGlzIGFuZCBhbHNvIG1pbmltaXplcyBzdGFsbHMuIFJvdW5kaW5nIHZhbHVlIHdhcyBtb2RpZmllZCBpbiAKKyAgICA7Ly8gQVJNIHJlZ2lzdGVyIHJuZFZhbCAob3JpZ2luYWxseSB1c2VkIGZvciByb3VuZGluZyBmbGFnKSBiZWZvcmUgdGhlIHN3aXRjaC4KKyAgICA7Ly8gSXQgaXMgdGhlbiBwb3B1bGF0ZWQgaW50byBhbGwgbGFuZXMgaW4gdGhpcyBtYWNyby4gTm8gYnJhbmNoaW5nIG91dCB0byAKKyAgICA7Ly8gbGFiZWwgIlN3aXRjaFByZWRpY3RUeXBlRW5kIiBpcyByZXF1aXJlZCBpbiB0aGUgZW5kIG9mIHRoZSBtYWNybyBhcyB0aGVzZSAKKyAgICA7Ly8gYXJlIHRoZSBsYXN0IG9mIHN3aXRjaCBjYXNlcy4KKyAgICA7Ly8gCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czogTm9uZQorICAgIDsvLyBPdXRwdXRzOiBOb25lCisKKyAgICBNQUNSTyAKKyAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWQorCitDYXNlSGFsZlBpeGVsWFlfUm5kMAorQ2FzZUhhbGZQaXhlbFhZX1JuZDEKKyAgICBWTEQxICAgICAgICB7ZFJvdzAsIGRSb3cwU2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZEVVAgICAgICAgIHFSb3VuZCwgcm5kVmFsCisgICAgVkxEMSAgICAgICAge2RSb3cxLCBkUm93MVNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MFNoZnQsIGRSb3cwLCBkUm93MFNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3cyLCBkUm93MlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MVNoZnQsIGRSb3cxLCBkUm93MVNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3czLCBkUm93M1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWRVhUICAgICAgICBkUm93MlNoZnQsIGRSb3cyLCBkUm93MlNoZnQsICMxCisgICAgVkxEMSAgICAgICAge2RSb3c0LCBkUm93NFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKKyAgICBWQURETCAgICAgICBxU3VtMCwgZFJvdzAsIGRSb3cwU2hmdAorICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTEsIGRSb3cxLCBkUm93MVNoZnQKKyAgICBWTEQxICAgICAgICB7ZFJvdzYsIGRSb3c2U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZFWFQgICAgICAgIGRSb3czU2hmdCwgZFJvdzMsIGRSb3czU2hmdCwgIzEKKyAgICBWTEQxICAgICAgICB7ZFJvdzcsIGRSb3c3U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZFWFQgICAgICAgIGRSb3c0U2hmdCwgZFJvdzQsIGRSb3c0U2hmdCwgIzEKKyAgICBWTEQxICAgICAgICB7ZFJvdzgsIGRSb3c4U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAorICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCisgICAgVkFEREwgICAgICAgcVN1bTIsIGRSb3cyLCBkUm93MlNoZnQKKyAgICBWRVhUICAgICAgICBkUm93NVNoZnQsIGRSb3c1LCBkUm93NVNoZnQsICMxCisgICAgVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMQorICAgIFZBRERMICAgICAgIHFTdW0zLCBkUm93MywgZFJvdzNTaGZ0CisgICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQorICAgIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVN1bTIKKyAgICBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyCisgICAgVkFEREwgICAgICAgcVN1bTQsIGRSb3c0LCBkUm93NFNoZnQKKyAgICBWU0hSTiAgICAgICBkUm93MSwgcVN1bTEsICMyCisgICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxUm91bmQKKyAgICBWQURETCAgICAgICBxU3VtNSwgZFJvdzUsIGRSb3c1U2hmdAorICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWRVhUICAgICAgICBkUm93N1NoZnQsIGRSb3c3LCBkUm93N1NoZnQsICMxCisgICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZFWFQgICAgICAgIGRSb3c4U2hmdCwgZFJvdzgsIGRSb3c4U2hmdCwgIzEKKyAgICBWQUREICAgICAgICBxU3VtNSwgcVN1bTUsIHFSb3VuZAorICAgIFZBREQgICAgICAgIHFTdW0yLCBxU3VtMiwgcVN1bTMKKyAgICBWQUREICAgICAgICBxU3VtMywgcVN1bTMsIHFTdW00CisgICAgVkFERCAgICAgICAgcVN1bTQsIHFTdW00LCBxU3VtNQorICAgIFZTSFJOICAgICAgIGRSb3cyLCBxU3VtMiwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93MywgcVN1bTMsICMyCisgICAgVlNIUk4gICAgICAgZFJvdzQsIHFTdW00LCAjMgorICAgIFZBRERMICAgICAgIHFTdW02LCBkUm93NiwgZFJvdzZTaGZ0CisgICAgVkFEREwgICAgICAgcVN1bTcsIGRSb3c3LCBkUm93N1NoZnQKKyAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFEREwgICAgICAgcVN1bTgsIGRSb3c4LCBkUm93OFNoZnQKKyAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFSb3VuZAorICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxU3VtNgorICAgIFZBREQgICAgICAgIHFTdW02LCBxU3VtNiwgcVN1bTcKKyAgICBWQUREICAgICAgICBxU3VtNywgcVN1bTcsIHFTdW04CisgICAgVlNIUk4gICAgICAgZFJvdzUsIHFTdW01LCAjMgorICAgIFZTSFJOICAgICAgIGRSb3c2LCBxU3VtNiwgIzIKKyAgICBWU0hSTiAgICAgICBkUm93NywgcVN1bTcsICMyCisgICAgVlNUMSAgICAgICAgZFJvdzUsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCisKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKK3BTcmNSZXNpZHVlICAgICAgICAgICBSTiAyCitwRHN0ICAgICAgICAgICAgICAgICAgUk4gMworZHN0U3RlcCAgICAgICAgICAgICAgIFJOIDQKK3ByZWRpY3RUeXBlICAgICAgICAgICBSTiA1CitybmRWYWwgICAgICAgICAgICAgICAgUk4gNgorCis7Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEc3RDb3B5ICAgICAgICAgICAgICBSTiAwCityZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCis7Ly8gTmVvbiBSZWdpc3RlcnMKK2RSb3cwICAgICAgICAgICAgICAgICBETiBEMC5VOAorZFJvdzBTaGZ0ICAgICAgICAgICAgIEROIEQxLlU4CitkUm93MSAgICAgICAgICAgICAgICAgRE4gRDIuVTgKK2RSb3cxU2hmdCAgICAgICAgICAgICBETiBEMy5VOAorZFJvdzIgICAgICAgICAgICAgICAgIEROIEQ0LlU4CitkUm93MlNoZnQgICAgICAgICAgICAgRE4gRDUuVTgKK2RSb3czICAgICAgICAgICAgICAgICBETiBENi5VOAorZFJvdzNTaGZ0ICAgICAgICAgICAgIEROIEQ3LlU4CitkUm93NCAgICAgICAgICAgICAgICAgRE4gRDguVTgKK2RSb3c0U2hmdCAgICAgICAgICAgICBETiBEOS5VOAorZFJvdzUgICAgICAgICAgICAgICAgIEROIEQxMC5VOAorZFJvdzVTaGZ0ICAgICAgICAgICAgIEROIEQxMS5VOAorZFJvdzYgICAgICAgICAgICAgICAgIEROIEQxMi5VOAorZFJvdzZTaGZ0ICAgICAgICAgICAgIEROIEQxMy5VOAorZFJvdzcgICAgICAgICAgICAgICAgIEROIEQxNC5VOAorZFJvdzdTaGZ0ICAgICAgICAgICAgIEROIEQxNS5VOAorZFJvdzggICAgICAgICAgICAgICAgIEROIEQxNi5VOAorZFJvdzhTaGZ0ICAgICAgICAgICAgIEROIEQxNy5VOAorCisKK3FTdW0wICAgICAgICAgICAgICAgICBRTiBROS5VMTYKK3FTdW0xICAgICAgICAgICAgICAgICBRTiBRMTAuVTE2CitxU3VtMiAgICAgICAgICAgICAgICAgUU4gUTExLlUxNgorcVN1bTMgICAgICAgICAgICAgICAgIFFOIFExMi5VMTYKK3FTdW00ICAgICAgICAgICAgICAgICBRTiBRMTMuVTE2CitxU3VtNSAgICAgICAgICAgICAgICAgUU4gUTE0LlUxNgorcVN1bTYgICAgICAgICAgICAgICAgIFFOIFEwLlUxNgorcVN1bTcgICAgICAgICAgICAgICAgIFFOIFExLlUxNgorcVN1bTggICAgICAgICAgICAgICAgIFFOIFEyLlUxNgorCitxUm91bmQgICAgICAgICAgICAgICAgUU4gUTE1LlUxNgorCitkRHN0MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKK2REc3QxICAgICAgICAgICAgICAgICBETiBEMS5VOAorZERzdDIgICAgICAgICAgICAgICAgIEROIEQyLlU4CitkRHN0MyAgICAgICAgICAgICAgICAgRE4gRDMuVTgKK2REc3Q0ICAgICAgICAgICAgICAgICBETiBENC5VOAorZERzdDUgICAgICAgICAgICAgICAgIEROIEQ1LlU4CitkRHN0NiAgICAgICAgICAgICAgICAgRE4gRDYuVTgKK2REc3Q3ICAgICAgICAgICAgICAgICBETiBENy5VOAorCitxUmVzMCAgICAgICAgICAgICAgICAgUU4gUTQuUzE2CitxUmVzMSAgICAgICAgICAgICAgICAgUU4gUTUuUzE2CitxUmVzMiAgICAgICAgICAgICAgICAgUU4gUTYuUzE2CitxUmVzMyAgICAgICAgICAgICAgICAgUU4gUTcuUzE2CitxUmVzNCAgICAgICAgICAgICAgICAgUU4gUTguUzE2CitxUmVzNSAgICAgICAgICAgICAgICAgUU4gUTkuUzE2CitxUmVzNiAgICAgICAgICAgICAgICAgUU4gUTEwLlMxNgorcVJlczcgICAgICAgICAgICAgICAgIFFOIFExMS5TMTYKKworICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICBNX1NUQVJUICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrLCByNiwgZDE1CisgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKKyAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKKyAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCisgICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQorICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAorICAgIEFERCAgICAgICAgIHByZWRpY3RUeXBlLCBybmRWYWwsIHByZWRpY3RUeXBlLCBMU0wgIzEKKyAgICBSU0IgICAgICAgICBybmRWYWwsIHJuZFZhbCwgIzIgICAgICAgICAgICAgIDsvLyBwcmVwYXJpbmcgcm5kVmFsIGZvciBIYWxmUGl4ZWxYWQorICAgIAorICAgIDsvLyBUaGUgZm9sbG93aW5nIGlzIGltcGxlbWVudGF0aW9uIG9mIHN3aXRjaGluZyB0byBkaWZmZXJlbnQgY29kZSBzZWdtZW50cworICAgIDsvLyBiYXNlZCBvbiBkaWZmZXJlbnQgcHJlZGljdFR5cGUgYW5kIHJuZFZhbCBmbGFncy4gVGhlIGNvcnJlc3BvbmRpbmcgCisgICAgOy8vIGxhYmVscyAoZS5nLiBDYXNlSW50ZWdlclBpeGVsX1JuZDApIGFyZSBlbWJlZGRlZCBpbiB0aGUgbWFjcm9zIGZvbGxvd2luZworICAgIDsvLyBNX0VORFNXSVRDSCAoZS5nLiBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwpLiBXaGlsZSAiTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsIiAKKyAgICA7Ly8gYW5kICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSIgaGFuZGxlIGZvciBib3RoIHJvdW5kaW5nIGNhc2VzOyAKKyAgICA7Ly8gIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFgiIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSIgbWFjcm9zIGhhbmRsZSAKKyAgICA7Ly8gdGhlIHR3byByb3VuZGluZyBjYXNlcyBpbiBzZXBhcmF0ZSBjb2RlIGJhc2VzLgorICAgIDsvLyBBbGwgdGhlc2UgdG9nZXRoZXIgaW1wbGVtZW50IHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uYWxpdHkKKyAgICAKKyAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSW50ZWdlclBpeGVsX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhfUm5kMQorICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxZX1JuZDEKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDAKKyAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFhZX1JuZDEKKyAgICBNX0VORFNXSVRDSAorCisgICAgTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAwCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAxCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAwCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAxCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKK1N3aXRjaFByZWRpY3RUeXBlRW5kCisKKyAgICA7Ly8gQWZ0ZXIgaW50ZXJwb2xhdGlvbiBpcyBkb25lLCByZXNpZHVlIG5lZWRzIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGRvbmUgCisgICAgOy8vIG9ubHkgaW4gY2FzZSAicFNyY1Jlc2lkdWUiIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gaXMgbm90IE5VTEwuCisgICAgOy8vIEZvbGxvd2luZyBpcyBhIGNvbXBsZXRlbHkgdW5yb2xsZWQgY29kZSB0byBkbyBzby4gRWFjaCByb3cgYW5kIAorICAgIDsvLyBjb3JyZXNwb25kaW5nIHJlc2lkdWUgaXMgbG9hZGVkIGFuZCByZXNpZHVlIGlzIGFkZGVkIGFuZCB2YWx1ZSAKKyAgICA7Ly8gc3RvcmVkCisgICAgCisgICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCisgICAgU1VCTkUgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMzICAgICA7Ly8gUmVzdG9yaW5nIHBEc3QKKyAgICBNT1ZORSAgICAgICBwRHN0Q29weSwgcERzdAorICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCitwU3JjUmVzaWR1ZU5vdE51bGwgICAgCisgICAgVkxEMSAgICAgICAgZERzdDAsIFtwRHN0QDY0XSwgZHN0U3RlcAorICAgIFZMRDEgICAgICAgIHFSZXMwLCBbcFNyY1Jlc2lkdWVAMTI4XSEKKyAgICBWTEQxICAgICAgICBkRHN0MSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVkxEMSAgICAgICAgcVJlczEsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZMRDEgICAgICAgIGREc3QyLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWTEQxICAgICAgICBxUmVzMiwgW3BTcmNSZXNpZHVlQDEyOF0hCisgICAgVkFERFcgICAgICAgcVJlczAsIHFSZXMwLCBkRHN0MAorICAgIFZMRDEgICAgICAgIGREc3QzLCBbcERzdEA2NF0sIGRzdFN0ZXAKKyAgICBWQUREVyAgICAgICBxUmVzMSwgcVJlczEsIGREc3QxCisgICAgVkxEMSAgICAgICAgcVJlczMsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMyLCBxUmVzMiwgZERzdDIKKyAgICBWTEQxICAgICAgICBkRHN0NCwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDAsIHFSZXMwCisgICAgVkxEMSAgICAgICAgcVJlczQsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXMzLCBxUmVzMywgZERzdDMKKyAgICBWTEQxICAgICAgICBkRHN0NSwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDEsIHFSZXMxCisgICAgVkxEMSAgICAgICAgcVJlczUsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM0LCBxUmVzNCwgZERzdDQKKyAgICBWTEQxICAgICAgICBkRHN0NiwgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDIsIHFSZXMyCisgICAgVkxEMSAgICAgICAgcVJlczYsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM1LCBxUmVzNSwgZERzdDUKKyAgICBWTEQxICAgICAgICBkRHN0NywgW3BEc3RANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDMsIHFSZXMzCisgICAgVkxEMSAgICAgICAgcVJlczcsIFtwU3JjUmVzaWR1ZUAxMjhdIQorICAgIFZBRERXICAgICAgIHFSZXM2LCBxUmVzNiwgZERzdDYKKyAgICBWU1QxICAgICAgICBkRHN0MCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q0LCBxUmVzNAorICAgIFZTVDEgICAgICAgIGREc3QxLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVkFERFcgICAgICAgcVJlczcsIHFSZXM3LCBkRHN0NworICAgIFZTVDEgICAgICAgIGREc3QyLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlFNT1ZVTiAgICAgZERzdDUsIHFSZXM1CisgICAgVlNUMSAgICAgICAgZERzdDMsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWUU1PVlVOICAgICBkRHN0NiwgcVJlczYKKyAgICBWU1QxICAgICAgICBkRHN0NCwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIFZRTU9WVU4gICAgIGREc3Q3LCBxUmVzNworICAgIFZTVDEgICAgICAgIGREc3Q1LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCisgICAgVlNUMSAgICAgICAgZERzdDYsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKKyAgICBWU1QxICAgICAgICBkRHN0NywgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAorICAgIAorcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKKyAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisKKyAgICBNX0VORAorICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgIEVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3M2Y2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKQEAgLTAsMCArMSwzMjAgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKiAKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KKzsgKgorOyAqIAorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKzsgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorOyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCAKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGhlIAorOyAqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIAorOyAqICAgICAgICAgICAgICAgICAgICBbLTIwNDgsIDIwNDddLgorOyAqIFtpbl0gIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgCis7ICogICAgICAgICAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCis7ICogW2luXSAgY3VyUVAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSAKKzsgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSAgcHJlZFFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworOyAqIFtpbl0gIHByZWREaXIgICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKzsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKzsgKiBbaW5dICBBQ1ByZWRGbGFnICAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKzsgKiAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorOyAqIFtpbl0gIHZpZGVvQ29tcCAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorOyAqICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKzsgKiBbb3V0XSBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2sKKzsgKiBbb3V0XSBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW291dF0gcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4KKzsgKiAtIEF0IGxlYXN0IG9uZSB0aGUgZm9sbG93aW5nIGNhc2VzOiBjdXJRUCA8PSAwLCBwcmVkUVAgPD0gMCwgY3VyUVAgPjMxLCAKKzsgKiAgIHByZWRRUCA+IDMxLCBwcmVEaXIgZXhjZWVkcyBbMSwyXS4KKzsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCAKKzsgKiAgIDQtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICoqKioqKioqKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgCisgICAgICAgICAgICAgCisKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMgorICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2CisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICAKKyAgICAgICAgSUYgQ29ydGV4QTgKKzsvLyBJbnB1dCBBcmd1bWVudHMKKworcFNyY0RzdCAgICAgICAgICBSTiAwCitwUHJlZEJ1ZlJvdyAgICAgIFJOIDEKK3BQcmVkQnVmQ29sICAgICAgUk4gMgorY3VyUVAgICAgICAgICAgICBSTiAzCitRUCAgICAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgUk4gNAorcHJlZERpciAgICAgICAgICBSTiA1CitBQ1ByZWRGbGFnICAgICAgIFJOIDYKK3ZpZGVvQ29tcCAgICAgICAgUk4gNworCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK3Nob3J0VmlkZW9IZWFkZXIgUk4gNAorZGNTY2FsZXIgICAgICAgICBSTiA0CitpbmRleCAgICAgICAgICAgIFJOIDYKK3ByZWRDb2VmZlRhYmxlICAgUk4gNwordGVtcDEgICAgICAgICAgICBSTiA2Cit0ZW1wMiAgICAgICAgICAgIFJOIDkKK3RlbXAgICAgICAgICAgICAgUk4gMTQKK0NvbnN0ICAgICAgICAgICAgUk4gOAordGVtcHBQcmVkQ29sQnVmICBSTiA4Cit0ZW1wUHJlZCAgICAgICAgIFJOIDkKKworYWJzQ29lZmZEQyAgICAgICBSTiA4CituZWdkY1NjYWxlciAgICAgIFJOIDEwCitSZW0gICAgICAgICAgICAgIFJOIDExCit0ZW1wMyAgICAgICAgICAgIFJOIDEyCisKK2RjUm93YnVmQ29lZmYgICAgUk4gMTAKK2RjQ29sQnVmZkNvZWZmICAgUk4gMTEKK1JldHVybiAgICAgICAgICAgUk4gMAorCis7Ly9ORU9OIFJlZ2lzdGVycworCitxUHJlZFJvd0J1ZiAgICAgICBRTiBRMC5TMTYKK2RQcmVkUm93QnVmMCAgICAgIEROIEQwLlMxNgorZFByZWRSb3dCdWYxICAgICAgRE4gRDEuUzE2CisKKworCisKK3FDb2VmZlRhYiAgICAgICAgIFFOIFExLlMzMgorCitxUHJlZFFQICAgICAgICAgICBRTiBRMi5TMTYKK2RQcmVkUVAwICAgICAgICAgIEROIEQ0LlMxNgorZFByZWRRUDEgICAgICAgICAgRE4gRDUuUzE2CisKKworcXRlbXAxICAgICAgICAgICAgUU4gUTMuUzMyCitxdGVtcCAgICAgICAgICAgICBRTiBRMy5TMTYKKworZHRlbXAwICAgICAgICAgICAgRE4gRDYuUzE2CitkdGVtcDEgICAgICAgICAgICBETiBENy5TMTYKKworZHRlbXAyICAgICAgICAgICAgRE4gRDguUzE2CitkdGVtcDMgICAgICAgICAgICBETiBEOS5TMTYKKworZHRlbXA0ICAgICAgICAgICAgRE4gRDIuUzE2CitkdGVtcDUgICAgICAgICAgICBETiBEMy5TMTYKK2R0ZW1wNiAgICAgICAgICAgIEROIEQ0LlMxNgorZHRlbXA3ICAgICAgICAgICAgRE4gRDUuUzE2CisgCitxdGVtcFByZWQxICAgICAgICBRTiBRNS5TMzIKK3F0ZW1wUHJlZCAgICAgICAgIFFOIFE1LlMxNgorCitkdGVtcFByZWQwICAgICAgICBETiBEMTAuUzE2CitkdGVtcFByZWQxICAgICAgICBETiBEMTEuUzE2CisgCisgIAorCisgICAgICBNX1NUQVJUICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSxyMTEsZDExCisKKyAgICAgIDsvLyBBc3NpZ25pbmcgcG9pbnRlcnMgdG8gSW5wdXQgYXJndW1lbnRzIG9uIFN0YWNrCisgICAgCisgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKKyAgICAgIE1fQVJHICAgICAgICAgICBwcmVkRGlyb25TdGFjayw0CisgICAgICBNX0FSRyAgICAgICAgICAgQUNQcmVkRmxhZ29uU3RhY2ssNAorICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAorICAgICAgCisgICAgICA7Ly8gREMgUHJlZGljdGlvbgorCisgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgcHJlZERpcixwcmVkRGlyb25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBQcmVkaWN0aW9uIGRpcmVjdGlvbgorICAgICAgOy8vIERDIFNjYWxlciBjYWxjdWxhdGlvbiAgIAorICAgICAgTERSICAgICAgICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCisgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgTERSQiAgICAgICAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KKworICAgICAgIAorICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2ICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAzMjc2Ny8oMSB0byA2MykgCisgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIHZlcnRpY2FsCisKKyAgICAgIDsvLyBDYXVsdWNhdGUgdGVtcFByZWQKKyAgICAgICAgICAgIAorICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgIExEUk5FU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBob3Jpem9udGFsIGxvYWQgdGhlIGNvZWZmIGZyb20gY29sdW1uIFByZWRpY3Rpb24gQnVmZmVyCisgICAgICAKKyAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBQcmVkaWN0aW9uIGNvZWZmIHRvIHRlbXAgZm9yIGNvbXBhcmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZEQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2FsY3VsYXRlIGFic29sdXRlIHZhbCBvZiBwcmVkaWN0aW9uIGNvZWZmCisgICAgICAKKyAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLGRjU2NhbGVyLGRjU2NhbGVyCisgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICBTTVVMQkIgICAgICAgICAgdGVtcFByZWQsdGVtcCxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdKjMyNzY3L2RjU2NhbGVyCisgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKKyAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wcGVkPXBQcmVkQnVmUm93KENvbClbMF0vZGNTY2FsZXIgICAgICAgICAgICAgICAgICAKKyAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMyx0ZW1wMywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMz1yb3VuZChkY1NjYWxlci8yKSAgICAgICAgICAgCisgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtYWluZGVyIFJlbT1hYnMocFByZWRCdWZSb3coQ29sKVswXSktdGVtcFByZWQqZGNTY2FsZXIKKyAgICAgIAorICAgICAgTERSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgIAorICAgICAgCisgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBSZW0gd2l0aCAoZGNTY2FsZXIvMikKKyAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD10ZW1wUHJlZCsxIGlmIFJlbT49KGRjU2NhbGVyLzIpCisgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKKyAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD0tdGVtcFByZWQgaWYgCisgICAgICAgCisgICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3csIy0xNl0gICAgICAKKyAgICAgICAKKworICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXQorICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXSt0ZW1wUHJlZAorICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgIFNNVUxCQiAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZix0ZW1wLGRjU2NhbGVyICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1jbGlwcGVkKHBTcmNEc3RbMF0pKmRjU2NhbGVyICAgICAgICAgICAKKyAgICAgIE1fTERSICAgICAgICAgICBBQ1ByZWRGbGFnLEFDUHJlZEZsYWdvblN0YWNrCisgICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgIAorICAgICAgCisKKyAgICAgICA7Ly8gQUMgUHJlZGljdGlvbgorICAgICAgCisgICAgICBNX0xEUiAgICAgICAgICAgcHJlZFFQLHByZWRRUG9uU3RhY2sKKyAgICAgIAorICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAorICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDB4MWZmZmYvKDEgdG8gNjMpIAorICAgICAgTU9WICAgICAgICAgICAgIENvbnN0LCM0CisgICAgICBNVUwgICAgICAgICAgICAgY3VyUVAsY3VyUVAsQ29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9NCpjdXJRUAorICAgICAgVkRVUCAgICAgICAgICAgIGRQcmVkUVAwLHByZWRRUAorICAgICAgTERSICAgICAgICAgICAgIHRlbXAyLFtwcmVkQ29lZmZUYWJsZSxjdXJRUF0gICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9MHgxZmZmZi9jdXJRUAorICAgICAgVkRVUCAgICAgICAgICAgIHFDb2VmZlRhYix0ZW1wMgorICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCisgICAgICAKKyAgICAgCisgICAgICAKKyAgICAgIDsvLyBWZXJ0aWNhbAorICAgICAgOy8vQ2FsY3VsYXRpbmcgdGVtcFByZWQKKworICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZSb3ddICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZSb3dbaV06aT0wIHQwIDcKKyAgICAgIAorICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjAsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV06IGk9MCB0MCAzCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9MCB0MCAzCisgICAgICAKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYxLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldIDogaT00IHQwIDcgICAgICAKKworICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldL2N1clFQKSA6IGk9MCB0MCAzCisgICAgICBWU0hSTiAgICAgICAgICAgZFByZWRRUDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cworICAgICAgCisgICAgICAKKyAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT00IHQwIDcKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKKyAgICAgIFZMRDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgcFNyY0RzdFtpXSA6IGk9MCB0byA3CisgICAgICBWU0hSTiAgICAgICAgICAgZHRlbXBQcmVkMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cworICAgICAgVk1PViAgICAgICAgICAgIGR0ZW1wUHJlZDAsZFByZWRRUDEKKyAgICAgIAorICAgICAgOy8vdXBkYXRpbmcgc291cmNlIGFuZCByb3cgcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgICAKKyAgICAgIFZBREQgICAgICAgICAgICBxdGVtcCxxdGVtcCxxdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL3BTcmNEc3RbaV09cFNyY0RzdFtpXStxdGVtcFByZWRbaV06IGk9MCB0byA3IAorICAgICAgVlFTSEwgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ2xpcCB0byBbLTIwNDgsMjA0N10KKyAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgRGMgVmFsdWUgb2YgUm93IFByZWRpY3Rpb24gYnVmZmVyCisgICAgICBWU0hSICAgICAgICAgICAgcXRlbXAscXRlbXAsIzQKKyAgICAgIAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vc3RvcmluZyBiYWNrIHRoZSB1cGRhdGVkIHZhbHVlcyAKKyAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCByb3cgcHJlZGljdGlvbiB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmluZyB0aGUgdXBkYXRlZCBEQyBSb3cgUHJlZGljdGlvbiBjb2VmZgorICAgICAgCisgICAgICBCICAgICAgICAgICAgICAgRXhpdAorCitIb3Jpem9udGFsCisKKyAgICAgIDsvLyBDYWxjdWxhdGluZyBUZW1wcHJlZAorCisgICAgICAgICAgICAKKworICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZDb2xdICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZDb2xbaV06aT0wIHQwIDcKKyAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMworICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMworICAgICAgCisgICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCisKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMworICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIAorICAgICAgCisgICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3CisgICAgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wcFByZWRDb2xCdWYscFByZWRCdWZDb2wKKyAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbcFNyY0RzdF0gICAgICAgIDsvLyBMb2FkaW5nIGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAorICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKKyAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCisgICAgICAKKyAgICAgIDsvLyBVcGRhdGluZyBzb3VyY2UgYW5kIGNvbHVtbiBwcmVkaWN0aW9uIGJ1ZmZlciBjb250ZW50cyAgICAgCisgICAgICBBREQgICAgICAgICAgICAgdGVtcDIscFNyY0RzdCwjMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXSAgICAgICAgICA7Ly8gTG9hZGluZyBuZXh0IDE2IGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAorICAgICAgVlVaUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEludGVybGVhdmluZyBieSA4CisgICAgICBWQUREICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCxkdGVtcFByZWQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkaW5nIHRlbXBQcmVkIHRvIGNvZWZmcworICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0aW5nIFByaWRpY3Rpb24gY29sdW1uIGJ1ZmZlcgorICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRlaW50ZXJsZWF2aW5nCisgICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGNvZWZmcyAgICAgICAgIAorICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0hCisgICAgICAKKyAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSx0ZW1wMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDJdISAgICAgICAgIDsvLyBMb2FkaW5nICBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKKyAgICAgIAorICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0KKyAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAorICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMQorICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAorICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hCisgICAgICBWWklQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNAorICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFt0ZW1wMV0KKyAgICAgIFNUUkggICAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZixbdGVtcHBQcmVkQ29sQnVmXSAKKyAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCisgICAgICAKK0V4aXQKKworICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdCisgICAgICAgICAgCisgCisgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyIAorIAorICAgICAgTV9FTkQKKyAgICAgIEVORElGCisKKworICAgICAgIEVORAorCisKKyAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMGFkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKQEAgLTAsMCArMSwxNjIgQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDEyMjkwCis7ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KKzsgKiAKKzsgKgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KKzsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAorOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCis7ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIHBTcmNEc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqIFtpbl0gUVAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dIHZpZGVvQ29tcCAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgorOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Cis7ICogICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCis7ICogW291dF0gICAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCis7ICogICAgLSBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KKzsgKiAgICAgIG9yCis7ICogICAgLSBJZiBRUCA8PSAwLgorOyAqICAgICAgb3IKKzsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgorOyAqCis7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCis7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmNEc3QgICAgICAgICAgICBSTiAwCitRUCAgICAgICAgICAgICAgICAgUk4gMQorICAgICAKKworOy8vTG9jYWwgVmFyaWFibGVzCitDb3VudCAgICAgICAgICAgICAgUk4gMworZG91YmxlUVAgICAgICAgICAgIFJOIDQKK1JldHVybiAgICAgICAgICAgICBSTiAwCis7Ly8gTmVvbiByZWdpc3RlcnMKKworCitkUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCitxUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCisKK2RRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKK2RNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKKworZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgorZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAorCitxUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCitkUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2CitxU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCitkU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2CisKK3FSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKK2RSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKK3FTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKK2RTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKKworZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KK3EyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKK2QyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2CisKK2RaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2CitkWmVybzEgICAgICAgICAgICAgRE4gRDEyLlMxNgorZENvbnN0MCAgICAgICAgICAgIEROIEQxMy5TMTYKKworICAgIAorICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjQsZDEzCisgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAorICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKKyAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCisgICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKKyAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCisgICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKKyAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQorICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAorICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKKyAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKKyAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQorCitMb29wICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCisgICAgICAgICAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCisgICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAorICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQorICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KKyAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQorICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCisgICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCisgICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAorICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKKyAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKKyAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKKyAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4CisgICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICBCR1QgICAgICBMb29wCisKKyAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorCisKKyAgICAgICAgIE1fRU5ECisgICAgICAgICBFTkRJRgorICAgICAgICAgCisKKyAgICAgICAgRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDA1OTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCkBAIC0wLDAgKzEsMjEwIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICAxMjI5MAorOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorIAorCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgCisgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAKKyAgIAorICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKKyAKKyAgICAgSUYgQ29ydGV4QTgKKyAgICAgCisgICAgIAorOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKK3ZpZGVvQ29tcCAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgUk4gMworICAgICAKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK2RjU2NhbGVyICAgICAgICAgICBSTiA0Cit0ZW1wICAgICAgICAgICAgICAgUk4gMTQKK2luZGV4ICAgICAgICAgICAgICBSTiA1CisKKworQ291bnQgICAgICAgICAgICAgIFJOIDUKK2RvdWJsZVFQICAgICAgICAgICBSTiA0CitSZXR1cm4gICAgICAgICAgICAgUk4gMAorCisKKzsvLyBOZW9uIHJlZ2lzdGVycworCisKK2RRUDEwICAgICAgICAgICAgICBETiBEMC5TMzJbMF0KK3FRUDEgICAgICAgICAgICAgICBRTiBRMC5TMzIKKworZFFQMSAgICAgICAgICAgICAgIEROIEQwLlMxNgorZE1pbnVzUVAxICAgICAgICAgIEROIEQxLlMxNgorCitkQ29lZmYwICAgICAgICAgICAgRE4gRDIuUzE2CitkQ29lZmYxICAgICAgICAgICAgRE4gRDMuUzE2ICAgCisKK3FSZXN1bHQwICAgICAgICAgICBRTiBRMy5TMzIKK2RSZXN1bHQwICAgICAgICAgICBETiBENy5TMTYKK3FTaWduMCAgICAgICAgICAgICBRTiBRMy5TMzIKK2RTaWduMCAgICAgICAgICAgICBETiBENi5TMTYKKworcVJlc3VsdDEgICAgICAgICAgIFFOIFE0LlMzMgorZFJlc3VsdDEgICAgICAgICAgIEROIEQ4LlMxNgorcVNpZ24xICAgICAgICAgICAgIFFOIFE0LlMzMgorZFNpZ24xICAgICAgICAgICAgIEROIEQ4LlMxNgorCitkMlFQMCAgICAgICAgICAgICAgRE4gRDEwLlMzMlswXQorcTJRUDAgICAgICAgICAgICAgIFFOIFE1LlMzMgorZDJRUCAgICAgICAgICAgICAgIEROIEQxMC5TMTYKKworZFplcm8wICAgICAgICAgICAgIEROIEQxMS5TMTYKK2RaZXJvMSAgICAgICAgICAgICBETiBENC5TMTYKK2RDb25zdDAgICAgICAgICAgICBETiBENS5TMTYKKworCisKKworICAgICAKKyAgICAgCisgICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyNSxkMTEKKworCisgICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBEQyBjb2VmZmljaWVudAorCisgICAgICAgIFRFUSAgICAgICBzaG9ydFZpZGVvSGVhZGVyLCMwICAgICAgOy8vIFRlc3QgaWYgc2hvcnQgVmlkZW8gSGVhZGVyIGZsYWcgPTAgICAgICAgICAgICAgCisgICAgICAgIE1PVk5FICAgICBkY1NjYWxlciwjOCAgICAgICAgICAgICAgOy8vIGlmIHNob3J0VmlkZW9IZWFkZXIgaXMgbm9uIHplcm8gZGNTY2FsZXI9OAorICAgICAgICBCTkUgICAgICAgY2FsRENWYWwKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKKyAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisKKyAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCisKK2NhbERDVmFsCisKKyAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KKyAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCisgICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCisgICAgICAKKworCisgICAgICAgIDsvLyBQZXJmb3JtIEludmVyc2UgUXVhbnRpemF0aW9uIGZvciBBYyBDb2VmZmljaWVudHMKKyAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgQUREICAgICAgZG91YmxlUVAsUVAsUVAgICAgICAgICAgICAgICAgICAgOy8vIGRvdWJsZVFQPSAyKlFQCisgICAgICAgICBWTU9WICAgICBkMlFQMCxkb3VibGVRUAorICAgICAgICAgVkRVUCAgICAgcTJRUDAsZDJRUDAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1vdmUgZG91YmxlUVAgaW4gdG8gYSBzY2FsYXIKKyAgICAgICAgIFRTVCAgICAgIFFQLCMxICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdICAgICAgOy8vIExvYWQgZmlyc3QgOCB2YWx1ZXMgdG8gQ29lZmYwLENvZWZmMQorICAgICAgICAgU1VCRVEgICAgUVAsUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICBWTU9WICAgICBkUVAxMCxRUCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUVAgaXMgZXZlbiB0aGVuIFFQMT1RUC0xIGVsc2UgUVAxPVFQICAgICAKKyAgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICAgVkRVUCAgICAgcVFQMSxkUVAxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0ZSB0ZW1wUmVzdWx0IHdpdGggUVAxCisgICAgICAgICBWU0hSTiAgICBkMlFQLHEyUVAwLCMwCisgICAgICAgICBWRU9SICAgICBkQ29uc3QwLGRDb25zdDAsZENvbnN0MAorICAgICAgICAgVlNIUk4gICAgZFFQMSxxUVAxLCMwICAgICAgICAgICAgICAgICAgICAgOy8vIFFQMSB0cnVuY2F0ZWQgdG8gMTYgYml0cworICAgICAgICAgVlNVQiAgICAgZE1pbnVzUVAxLGRDb25zdDAsZFFQMSAgICAgICAgICAgOy8vIGRNaW51c1FQMT0tUVAxCisKK0xvb3AgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvL1BlcmZvcm1pbmcgSW52ZXJzZSBRdWFudGl6YXRpb24KKyAgICAgICAgIAorICAgICAgICAgVkNMVCAgICAgZFNpZ24wLGRDb2VmZjAsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IDAKKyAgICAgICAgIFZDTFQgICAgIGRTaWduMSxkQ29lZmYxLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCAwCisgICAgICAgICBWQ0VRICAgICBkWmVybzAsZENvZWZmMCwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgemVybworICAgICAgICAgVkJTTCAgICAgZFNpZ24wLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMCA9IC1RUDEgaWYgQ29lZmYwPCAwIGVsc2UgUVAxCisgICAgICAgICBWQ0VRICAgICBkWmVybzEsZENvZWZmMSwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgemVybworICAgICAgICAgVkJTTCAgICAgZFNpZ24xLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMSA9IC1RUDEgaWYgQ29lZmYxPCAwIGVsc2UgUVAxCisgICAgICAgICBWTU9WTCAgICBxU2lnbjAsZFNpZ24wICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBleHRlbmQgcVNpZ24wIHRvIDMyIGJpdHMKKyAgICAgICAgIFZNT1ZMICAgIHFTaWduMSxkU2lnbjEKKyAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQwLGRDb2VmZjAsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXStxQ29lZmYwW2ldKigtMikgaWYgQ29lZmYgPDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKKyAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQxLGRDb2VmZjEsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXStxQ29lZmYxW2ldKigtMikgaWYgQ29lZmYgPDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKKyAgICAgICAgIDsvLyBDbGlwIFJlc3VsdCB0byBbLTIwNDgsMjA0N10gICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDAscVJlc3VsdDAsIzIwICAgICAgICAgICAgOy8vIGNsaXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgICBWUVNITCAgICBxUmVzdWx0MSxxUmVzdWx0MSwjMjAKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICBWU0hSICAgICBxUmVzdWx0MCxxUmVzdWx0MCwjNCAgCisgICAgICAgICBWU0hSICAgICBxUmVzdWx0MSxxUmVzdWx0MSwjNAorICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDAscVJlc3VsdDAsIzE2ICAgICAgICAgICAgOy8vIE5hcnJvdyB0aGUgY2xpcHBlZCBWYWx1ZSB0byBIYWxmd29yZAorICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDEscVJlc3VsdDEsIzE2IAorICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDAsZENvbnN0MCxkWmVybzAgIAorICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDEsZENvbnN0MCxkWmVybzEgICAgIAorICAgICAgICAgCisgICAgICAgICBWU1QxICAgICB7ZFJlc3VsdDAsZFJlc3VsdDF9LFtwU3JjRHN0XSEgICA7Ly8gU3RvcmUgdGhlIHJlc3VsdAorICAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzgKKyAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XQorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIEJHVCAgICAgIExvb3AKKyAgICAgICAgIAorICAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKKyAgICAgICAgIAorICAgICAgICAgOy8vIFN0b3JlIHRoZSBJbnZlcnNlIHF1YW50aXplZCBEYyBjb2VmZmljaWVudAorICAgICAgICAgCisgICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgorICAgICAgICAKKyAgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgCisKKworICAgICAgICAgTV9FTkQKKyAgICAgICAgIEVORElGCisgICAgICAgICAKKworICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDkzNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTI+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gc2FtcGxlIGNvZGUKKyAgU2FtcGxlIGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCisgIGludGVybmFsIGFjY2VzcworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCitiZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgorCitCZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAorbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCitzbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKK2NvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgorQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCit0aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKK2FuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKK3RoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5CithdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQorcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKK2d1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCitkYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgorQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKK3RvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQorZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKK3dpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKK3dpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKK21haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCisKKworIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitJbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKK3R3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCisKK1RoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQorbm90ZS4KKworVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTIuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQorZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCisKK1RoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCitNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgorCitUaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKKyJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgorCisgICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDEyLlRYVAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwMWIxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX01BTklGRVNULlRYVApAQCAtMCwwICsxLDE0MCBAQAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCis4OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKK2U4OGVjODRlMTIyNTM0MDkyYjkwYzY3ODQxNTQ5ZDZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKzQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKK2EwNjk4M2FiYjM5YzQ3NmIwODFlODdlYTI3MTM2MWE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorYzAxZjhiOTNhYjczZDhjMDBkZGYyNDk5ZjAxZGE1ZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworMjZlMmZmM2Y2MzM3NjRlYjcyMGRlYjM0MDk3OGRjMmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCis3OWFhMjNkOTgxN2VmZDExZDBjNGMyYmUzNmVjMWU1YyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU0uYworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KK2U0NTI5NzcwNGQ3MjMwMmQ0YTk0N2QwNzk4YzY2NmZiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisyMDVkZmFmZTFmZTdiYjE2MGJmMzZkMjYwMGUxMTAwYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitiZjkyNjQxZTg1NDg1NzdiNzdlMDRlMDNlYzA0YzM1OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKK2Y1ZWU2ZjdiZTgyMmQ4NzQ3MWNlZjNiMTgwMWRiZmMyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCisyODExMGIzYTEzY2VjZjRmMjE2ZDEwYmNjNzYxYzQwMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKzlhMWEyNTI0NWM5NzVkNjQxZTFjNjM3ODgzNGFlYTRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCiszYTY0M2VhYWFlYjEyZThkMjc0ZGM1OWE3MzU3YTU4NiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKzRjNGRlNTk3M2E2Yjc0MjUwY2U5MWFjMGIzMTdhNjE3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCis0ZWNkYmU5MTkzYWFiYTFmOWJiMGUyNGM5MzhiMzRmOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworNjZlOTEyZjhjODhmNjAxOWNiYTNlZGUyNzE1MGE0MDcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCisyNjZkYTQyZjRlMzAxNWU2N2IyY2JiNTgxNjlkNDM3ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKK2Q5MDUyNDdlZWFhNTJkNGUyY2Y1ZjZiYzNmNjFiMzQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworNWIyOTQ0OGRiMDQ5NWNkMTcxN2E0YjkyNWYxMzM3N2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCitmNjQ1MWRmMjdmNmRjYzk5MDM2YjRiMTI1M2MyM2JiNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYworODkyNzg3ZDg1MGVlZjA5ZGMyMTQ4ZDQ1YjQxNmIwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKKzMzZGExYzAxYTMxZjQ3YzBmM2FlYTlhN2E1ZWFhOWJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYworZTlmYjExYjA2Njc3NTI4M2RjZmVhZThkMTJhNmM5N2EgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKK2FkZDk3YmVjMDhlNWUxYTUzOGFhODYwNzE2OGU2MWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKK2I2OTVlY2ZjOTE3YjM5NDcwZDFmNDA3NzNiOTIzOTcyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCis1MWJjNTk2ZmQyZmY2MWFkNTQ1MGQ3MTM4NDYxZjRhMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKK2RjNmJhYTBhMzg4ZGM1ZWE4ZmY2NWMyNGIxNzllNjcwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKK2E1NDk5OTAyOTk2NTc2ZjY3MTI4NDlkYjM0ZDVhZDY1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYworMGMzYjc2NzQ1ZDUzZTc0YThlNjRlODBkZWYzMWZhYmEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYworNGYyNzQyYmE1YTNjMjIwOGY1M2JjMGY2YTQ0M2JlMTQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYworYjRhZTJkYzk0OGU4Y2E2NDgzMWZlM2JiZmJkODk1MjMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKK2UxNTExOGNiZTM3MmRiN2NhZGJhMjI1Yzk0NTZmMTg5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKKzYyM2NmMzM2Y2ZjZTdkMDE3NGY0ZTU0MDcyNDU2ZjMzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCis4OWU0NTJjODBlMzAzNTdjYWRmYjA0YzA1YjZmZTAwYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworM2E1NTUxY2M1NGU4NWJiZTM0ZmM5NjZjN2RjMDBmMWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisxMTQwMzBmYTBkOGYwMGFmNmQzMjg5ZjQ3YTVlODViZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworOWUzNzNhYjI5NmZiODViYjQ1NTY1YTZjMzg0ZjZlZDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworMmQyMDBmN2NjMjMwZjMwMmRhNDhjNTg5ZGE0MmMwMmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKK2VhM2YxZDFkMTUwN2I1NTYxMGIxMzQ5YzdiNTk0NmU4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCitiZDJiZjE3NDNhZWYyYTkzOTY1NDVlZDAyNTM2MmJlMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCitjYTY4ZTgwOTU2N2JmODkwNDQ2MzFiNjdkMjI4YzdjZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKzc3Y2FmMmI1Y2JlZTk2ZDM2MGE5MTlmMjdlMWYxNGY0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCisyNjA4MWUzODRlYzYyN2ZlZGFkNDc0YTBlN2RhZDg3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCisxYzgzYWU5MjA3YTU0OTQ0OTM2ZjRhNjNjNjY1YmQ5OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKzRjMzZlMDRkYjIwMjAwZjRlYzcyZTVhYmE1NzQ0NmZkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCitmNzViN2M1YTgwZDhiZjMzZTMxNTM4MGU0ZWYwYWI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworNDg4OTI1YmI3YWVlYWUwY2NmOTNlYzQ0YWY5ZmNlMzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKK2M5MWE1MzQ1YjVmODc3YjM4MzFlZDFhYmNjNjBkNTc5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYworMzU1MTVhMTE1YTMyZmNhYzg0NzkwNzJhOWE1YjBkYjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYworZmRjZjQ2MjJiYzVmMGFlNzViZGIwYTUxZGNkMDMzOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCis3NGM5Mjc4MTc3NDAwYTFmN2NjNmQ3OTlhOGM4YWIzNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKKzU2YWEyZDUwNmQwY2ZkYjRlYmQzNjZjMDdhZGIyZDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYworMzZiMjE2NWZkNGQyYTdmM2YzZTFmOGRhZmY0Zjk0ZTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKKzRiNmIxYjkzM2ZjN2JjOGYxNGExODRjMDJjMDI4MDg1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCitjZjBmZjA5M2E5YjM3MmRkMzI3MWUzZTVjMjg5ODRkNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKzljY2FkOWY4OTRmYmQzMjE5NGY1YjUzZGEyMTcwNzJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKKzQ5NDNhN2EyZGY3ZTlkNzAwNjc1ZjhjMWRlYmY0ZDkwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYworMjllNGE3ZjM4ZjhjMmU4MjQ2ZWQ3NTZkYjAzYzAxMmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKzI3YmM2NGU3YzE4ZGEwYWFiOWM5ODdhMzg4ZjYxNjA4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKzg1OTE4NTYxNGJiOWQwMDEzODYxZTQ1NGQ3YjkxOGYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2M2UzYjY0Yjk2Y2M0MmEyMzVjMDRmM2EwZjk5MTMxNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworMGFhZTRmNjgzZDg5MDNjYmE5OTU2ZDMzMDFlZDlmZmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCis4ZDZjMWI0NDkxNTMyOTE2NWRmNjQzMDgxY2MxMWE5NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCiswNDM1ZWNhOTMwZWFjZGEwZjJhNTllODQzZDQwNWVmZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCis5YTgyZGQwYjFmMDVmNzk4NTY3NDM2YTAwOWQwMjk2OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYworZTFlMjQ2NDZjNGJkMDNmNWRmNzgyOTU0NTJkZDRlYjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKKzc0NmU2YjMzNGU0YTI2ZDRhOWJmYWU2ZDczNTgyNmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKKzhiMWQ4N2I3NGQ4MGZmMTNhMTYyMTViNjFkNWU1MmJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCiszMDkzNThkMzU3YmFhZmMzOGQyYjM3YmYxZTk3NjhhOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCitjYzc3YzcyNDJiNTNjMTUzZjhkMDk1Mjc1ODNmMjc3MSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYworN2NkOGU3Nzk2MDE3ZTNkZDAwYjQ5NGQzNGY2MjlmM2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYworYTQ5MDVjYjVmOGQ0YjI0NDQ1NGVlNGY2MGQxODM1OGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKKzU1OTZiMzFlNDMzMjIyYzFlNDg2MGRlZWJmYTk4ZWYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKKzM2NWQwNzJiZTZlYWIyMDFmNmUwNDAwNThhM2JhY2ZjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKzc4ZWQyMjEyNTg1YjBjY2E3NTkxM2E0NzNiMmVjNDMwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworNTBiMmQ4ZGE4ZjIwZjZiMWQzOWI4ZDNkZjM4YWY1NWQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCis0YTg1MWEyYWQ2ZDM1N2NkYzIzM2Q5YzBiZjQ3NWUwMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCiswZDZkNjM4NzhmMjgyN2UwMGU1Zjg1YjFlOGUyNjAxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworNDhiODY1YTk4M2ZlNWJmMzA3NWVkZGY2NTI5NTA3MjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYworNWY0OGZhNzk0MTgzNWM0NmFjNzY3ZTYzZmMyOTQwM2IgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCitiYmFmNDU0YjY0YjMyYjJjNDJhNzZhN2VjMzkzZDk3NyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCitlZWJmZjc3MmY4N2E0MTQ0MzZjNWM1Mjg2ZjJjZDIxMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCis2NWFlMjQyZWI4Y2I2ZDEwMjc2NzdjOGVmOGY3N2NhMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworMTI1NjQyYjFlYTBjMTI1NmQ3OWFmMWUwZGRlY2FlOTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYworY2UyNGJhM2Q4M2RhNGNiNzkxNDg1ZDMxMjgyNjhiZjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCiswOWJjMDlhMmU2ZmQ5NjJlNzE5OTQ0NTgyZTM4YThmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCis2YjBlZTdhMTE2NDcxYTRkYWRiZTViYzhkYmY0MjViMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYworMjEzMjJkY2EwMjdjMjgzNTNlM2U3ZWI4ZjM2MjAwNjIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworZWYzNTNkODMyNDQyODhkOGMzN2UwZjcwMjQ5MTc3Y2MgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKKzU0MWRlODI0ZjhhZWJlNGE1Y2FjNmYxNWRhOTQzZWZhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCiswYjQwYjE1NGI1OTFjN2Y4ODQyY2ZmZTQwNDJkMTdjNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisyZmZjZWM4OGQzZmNiMzcyNTQzYThmNDUwOGVhMWFjNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCitlMDZkODVjYTAwMGFmY2JiNTA1ODBmOThmMDIwM2FjOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKK2FlODJiNmZjZmNmNzMxYTYxZDcwZTFhYTQyZTYyNzdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKKzFkMDQzOTVlMjMxYjU5NzU2MjI1N2U5OGNkYTZjZmIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKzcyYzBhMzYzMjdiNmI5YjQzNmQzYmNlN2M4OTZjNTIwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworMWI2NWFhN2YzMTExMjRlYTZmYjQ3ZTM4NGVjMDZhNTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYworNzE0OTU3MTA0YTZlZjcxMzQxZmJlNmE5ZWM2NWMxMzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKKzg2NDkzZjBlZTg1M2Y2NTMzNTRhNzM4OWYxNzI3ZjczICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYworNWRlOGFmY2ZiMzA1Mjk2ODc5NDc4MmE3YzNhMGI0MWEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYworNTBiY2MyMjhjYzY2MGRiZGEwMzc3MjUzMDlkZTNmOGIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYworNGY1Y2ZhMWVjYzY2ODkxM2RkZTk0ZTNjYWY5N2EyZTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYworYzJlYzgwNGRkZjY0ZWU4NDExNDZlMzljM2E3ODM0NTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYworNDA4N2Y2YTgyNzkxMmVlNWI0NWVkNDIxN2YxYTZkNzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis1YzcxMTcwMmRkZGNlYzg1Mjk4MDAzODYwZDc2MGNlYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisxYjkyYzk0Yjc4NWMwM2VjNzZkNGZhZTJmMmJiZGI4YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorYWQ5YzY5ODZkMmEzMjAwZGQ1ZTFmNjEwM2E1NGE5OWIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisJCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCiszYTZkZjAwODU3MzZjYmNiZTJlM2Y0NWQwOGFmNDIyMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYworMGJmM2NiNTI4NjNjODI5YjI4YzAzNTI4MzUxNzAyMTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKKzUzOGI2MmY1MTBiNWE4YmRjZWQ0YTM5ZmExMmQ5YTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCis2Njk5M2VkZDlkNDQxYmYzYjViNmM5MTJmNjQwMGI2ZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYworOGU1MjZhOTAwN2ViMGQ0M2ViZjM2MmM0OThiMzc0MTUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKKzg3ZjhmMjZlNmU5MTc4ZGYwYWI3NDE5MzM0ZDVhM2RiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCisxYTg1Nzc2NDYxMzJhZDliNjNhMTQ3N2ZkYWVjMjQ2NCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKKzQ4NTI5YzRmNzBjN2U5NTRlODMyZWVjZTFhZWU1N2JkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKKzI1Mjk3Nzc2NGQ0ZjM4MjgyYjZhNTZjNTljY2Y0ZjA5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKK2NjNzhjZmFlZDk1MDJjMmUwMjgyYzkxZmI5NWVlYWM0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCitlNDY4NzUxYzE1YTU4MWViZDIyZGEwMzFlMjIxMTdkMSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCiszZjQ0OGQxOTFlYWViODJlY2I3ZTI3ZWY4YmEyNzg3NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCitiMTI5MWMzMDc4MDg2MzFmYTgzMzY4NGFiYjljMzRjZSAgQVJNX0RFTElWRVJZXzk3NDEyLlRYVApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDg2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NLmgKQEAgLTAsMCArMSw3ODUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogICAKKyAqIEZpbGU6IGFybUNPTU0uaAorICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncworICoKKyAqLworIAorICAKKyNpZm5kZWYgX2FybUNvbW1vbl9IXworI2RlZmluZSBfYXJtQ29tbW9uX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKyAgICAgICAgCit9IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwordHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07CisKKworI2luY2x1ZGUgImFybU9NWC5oIgorCisjZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KKyNpZmRlZiBBUk1fREVCVUcKKy8qIGRlYnVnIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KKyNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQorI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCisjZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKKyNlbHNlIAorLyogcmVsZWFzZSB2ZXJzaW9uICovCisjZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQorI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQorI2VuZGlmIC8qIEFSTV9ERUJVRyAqLworCisvKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKKyNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCisjZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQorCisvKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCisjZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCisjZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCisjZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCisjZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQorCisvKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCisKKyNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKyNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KKworI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludCkoUHRyKSkgJSBOKT09MCkKKyNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnQpKFB0cikpICUgTikhPTApCisjZWxzZQorI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCisjZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKKworI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCisjZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKKyNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQorI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKK09NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNpZ25DaGVjaworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6CisgKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqIHJldHVybnMgMCBpZiBpdCBpcyAwCisgKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKKyAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCisgKi8gCisgCitPTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICAgICAgT01YX0lOVCBtaW4sCisgICAgICAgIE9NWF9JTlQgbWF4LCAKKyAgICAgICAgT01YX1MzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKKyAqIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAorICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCisgKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCisgKi8gCisgCitPTVhfRjMyIGFybUNsaXBfRjMyICgKKyAgICAgICAgT01YX0YzMiBtaW4sCisgICAgICAgIE9NWF9GMzIgbWF4LCAKKyAgICAgICAgT01YX0YzMiBzcmMKKyAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCisgKgorICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKKyAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCisgKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKKyAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAorICogdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgorICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKKyAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAorICAgICAgICBPTVhfRjMyIHYsIAorICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKKyAgICAgICAgT01YX0lOVCBzYXRCaXRzCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOworCisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUxvZ1NpemUKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQorICogCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorICAgICk7ICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdEFkZF9TMzIoCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisKK09NWF9TNjQgYXJtU2F0QWRkX1M2NCgKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKKyAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgorICAgICAgICAgICAgICAgICk7CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCisgKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICoqLworCitPTVhfUzMyIGFybVNhdE1hY19TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKKyAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCisgKgorICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCisgKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKKyAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKKyAqCisgKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0CisgKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAorICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisgCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKKyAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybworICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAorICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgorICogICAgCisgKiovCisKK09NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogRGVidWdnaW5nIG1hY3JvcworICoKKyAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQorICovCisjZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKKworLyoKKyAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KKyAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KKyAqLworI2lmZGVmIERFQlVHX09OCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQorI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQorI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQorI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQorI2Vsc2UgLyogREVCVUdfT04gKi8KKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKKyNlbmRpZiAvKiBERUJVR19PTiAqLworCisKKy8qCisgKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKKyAqCisgKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KKyAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKKyAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgorICovCisKKyNpZmRlZiBERUJVR19ET01BSU5fQUMKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1ZDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSUMKKy8qIFRvIGJlIGZpbGxlZCBpbiAqLworI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fU1AKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2CisjZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9JUAorI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCisjZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KKworCisjZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLworCisvKkVuZCBvZiBGaWxlKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YmMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiBhcm1DT01NX0JpdHN0cmVhbS5oCisgKiBCcmllZjogRGVjbGFyZXMgY29tbW9uIEFQSSdzL0RhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NYXggRW5jb2RlcnMvRGVjb2RlcnMuCisgKgorICovCisKKyNpZm5kZWYgX2FybUNvZGVjX0hfCisjZGVmaW5lIF9hcm1Db2RlY19IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCAgIGNvZGVMZW47CisgICAgT01YX1UzMgkgY29kZVdvcmQ7Cit9IEFSTV9WTEMzMjsKKworLyogVGhlIGFib3ZlIHNob3VsZCBiZSByZW5hbWVkIGFzICJBUk1fVkxDMzIiICovCisKKy8qKgorICogRnVuY3Rpb246IGFybUxvb2tBaGVhZEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogR2V0IHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0gd2l0aG91dCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLi4zMgorICoKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1Mb29rQWhlYWRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorICogICAgCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4zMgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqIFJldHVybnMgIFZhbHVlCisgKi8KKworT01YX1UzMiBhcm1HZXRCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLCBPTVhfSU5UICpwT2Zmc2V0LCBPTVhfSU5UIE4pOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisgCitPTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KTsKKworLyoqIAorICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKworT01YVm9pZCBhcm1Ta2lwQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0LE9NWF9JTlQgTik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKipwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIHBDb2RlQm9vaworICogCisgKiBbb3V0XSAgICAqKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAorICogICAgICAgICA6ICJBUk1fTk9fQ09ERUJPT0tfSU5ERVggPSAweEZGRkYiIGlmIHNlYXJjaCBmYWlscy4KKyAqKi8KKworI2RlZmluZSBBUk1fTk9fQ09ERUJPT0tfSU5ERVggKE9NWF9VMTYpKDB4RkZGRikKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwT2Zmc2V0CSAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQljb2RlV29yZAkJQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqIFtpbl0JY29kZUxlbmd0aAkJTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrQml0cyAoCisgICAgT01YX1U4ICAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIE9NWF9VMzIgY29kZVdvcmQsIAorICAgIE9NWF9JTlQgY29kZUxlbmd0aCAKKyk7CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgorICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKyAKK09NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIEFSTV9WTEMzMiBjb2RlIAorKTsKKworI2VuZGlmICAgICAgLypfYXJtQ29kZWNfSF8qLworCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCisjaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KKyNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLworI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKKyNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQorCisvKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLworI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQorCisKKy8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCisjZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KKy8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCisKKy8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCisjZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMHAwLTAwYmV0MSIKKworLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBTlNJIEMiCisKKy8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLworI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgorCisKKyNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtT01YLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyOWY3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIFRoaXMgZmlsZSBhbGxvd3MgYSB2ZXJzaW9uIG9mIHRoZSBPTVggREwgbGlicmFyaWVzIHRvIGJlIGJ1aWx0IHdoZXJlIHNvbWUgb3IKKyAqIGFsbCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGdpdmVuIGEgdXNlciBzcGVjaWZpZWQgc3VmZml4LiAKKyAqCisgKiBZb3UgbWlnaHQgd2FudCB0byB1c2UgaXQgd2hlcmU6CisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYSBmdW5jdGlvbiAib3V0IG9mIHRoZSB3YXkiIHNvIHRoYXQgeW91IGNvdWxkIHJlcGxhY2UKKyAqICAgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gKHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdvdWxkIHN0aWxsIGJlCisgKiAgIGluIHRoZSBsaWJyYXJ5IGp1c3Qgd2l0aCBhIGRpZmZlcmVudCBuYW1lIC0gc28geW91IGNvdWxkIGRlYnVnIHRoZSBuZXcKKyAqICAgdmVyc2lvbiBieSBjb21wYXJpbmcgaXQgdG8gdGhlIG91dHB1dCBvZiB0aGUgb2xkKQorICoKKyAqIC0geW91IHdhbnQgdG8gcmVuYW1lIGFsbCB0aGUgZnVuY3Rpb25zIHRvIHZlcnNpb25zIHdpdGggYSBzdWZmaXggc28gdGhhdCAKKyAqICAgeW91IGNhbiBpbmNsdWRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBhbmQgY2hvb3NlIGJldHdlZW4gZnVuY3Rpb25zCisgKiAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgIGUuZy4gb214SVBCTV9Db3B5X1U4X0MxUiBjb3VsZCBiZSByZW5hbWVkIG9teElQQk1fQ29weV9VOF9DMVJfQ29ydGV4QTgKKyAqIAorICovCisKKyAgCisjaWZuZGVmIF9hcm1PTVhfSF8KKyNkZWZpbmUgX2FybU9NWF9IXworCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIHR3byBtYWNyb3MgaW4gb3JkZXIgdG8gZXhwYW5kIGFuZCBjb25jYXRlbmF0ZSB0aGUgbmFtZXMgKi8KKyNkZWZpbmUgT01YQ0FUMkJBUihBLCBCKSBvbXggIyMgQSAjIyBCCisjZGVmaW5lIE9NWENBVEJBUihBLCBCKSBPTVhDQVQyQkFSKEEsIEIpCisKKy8qIERlZmluZSB0aGUgc3VmZml4IHRvIGFkZCB0byBhbGwgZnVuY3Rpb25zIC0gdGhlIGRlZmF1bHQgaXMgbm8gc3VmZml4ICovCisjZGVmaW5lIEJBUkVfU1VGRklYIAorCisKKworLyogRGVmaW5lIHdoYXQgaGFwcGVucyB0byB0aGUgYmFyZSBzdWZmaXgtbGVzcyBmdW5jdGlvbnMsIGRvd24gdG8gdGhlIHN1Yi1kb21haW4gYWNjdXJhY3kgKi8KKyNkZWZpbmUgT01YQUNBQUNfU1VGRklYICAgIEJBUkVfU1VGRklYICAgCisjZGVmaW5lIE9NWEFDTVAzX1NVRkZJWCAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJQ0pQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBCTV9TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQQ1NfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUFBQX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YU1BfU1VGRklYICAgICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDQ09NTV9TVUZGSVggICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDEwX1NVRkZJWCAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNNNFAyX1NVRkZJWCAgIEJBUkVfU1VGRklYCisKKworCisKKy8qIERlZmluZSB3aGF0IHRoZSBlYWNoIGJhcmUsIHVuLXN1ZmZpeGVkIE9wZW5NQVggQVBJIGZ1bmN0aW9uIG5hbWVzIGlzIHRvIGJlIHJlbmFtZWQgKi8KKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlQ2hhblBhaXJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRGF0U3RyRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRGF0U3RyRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZUZpbGxFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZUZpbGxFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlSXNTdGVyZW9fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zUE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZU1zU3RlcmVvX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVByZ0NmZ0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVByZ0NmZ0VsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVUTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVUTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVpbnRlcmxlYXZlU3BlY3RydW1fUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0VuY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0VuY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19Mb25nVGVybVByZWRpY3RfUzMyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0kgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUmVjb25zdHJ1Y3RfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEZ3ZF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEZ3ZF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTURDVEludl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTURDVEludl9TMzJfUzE2LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX05vaXNlbGVzc0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX05vaXNlbGVzc0RlY29kZSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19RdWFudEludl9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19RdWFudEludl9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19VbnBhY2tBRElGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19VbnBhY2tBRElGSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FEVFNGcmFtZUhlYWRlciwgT01YQUNBQUNfU1VGRklYKQorCisKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZV9TMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZV9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfSHVmZm1hbkRlY29kZVNmYk1icF9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfTURDVEludl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfTURDVEludl9TMzIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfUmVRdWFudGl6ZV9TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfUmVRdWFudGl6ZV9TMzJfSSwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplU2ZiX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1N5bnRoUFFNRl9TMzJfUzE2LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja0ZyYW1lSGVhZGVyLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NjYWxlRmFjdG9yc19TOCwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19VbnBhY2tTaWRlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19VbnBhY2tTaWRlSW5mbywgT01YQUNNUDNfU1VGRklYKQorCisjZGVmaW5lIG9teElDSlBfQ29weUV4cGFuZF9VOF9DMyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfQ29weUV4cGFuZF9VOF9DMywgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENURndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENURndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RJbnZfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RJbnZfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X011bHRpcGxlX1MxNiwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZUYWJsZUluaXQsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW44eDhfRGlyZWN0X1MxNl9VMV9DMSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4ICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hblNwZWNHZXRCdWZTaXplX1U4LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0luaXRfVTgsIE9NWElDSlBfU1VGRklYKQorCisjZGVmaW5lIG9teElQQk1fQWRkQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQWRkQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fQ29weV9VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fQ29weV9VOF9DM1IsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX01pcnJvcl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX01pcnJvcl9VOF9DMVIsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX011bENfVThfQzFSX1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX011bENfVThfQzFSX1NmcywgT01YSVBCTV9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19Db2xvclR3aXN0UTE0X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQyMExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMExTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0MjJMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwUnN6Um90X1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NV9VOF9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIwVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyUnN6Q3NjUm90QkdSX1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiAgICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJSc3pDc2NSb3RCR1JfVThfVTE2X0MyUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjU2NV9VOF9VMTZfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiWUNyNDIyVG9CR1I4ODhfVThfQzJDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiAgICAgICAgT01YQ0FUQkFSKElQQ1NfQ2JZQ3JZNDIyVG9ZQ2JDcjQyMFJvdGF0ZV9VOF9DMlAzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb1lDYkNyNDIwUm90YXRlX1U4X1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NV9VOF9VMTZfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0NDRUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSODg4X1U4X0MzUiwgT01YSVBDU19TVUZGSVgpCisKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX0hvckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRGVibG9ja19WZXJFZGdlX1U4X0ksIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlckZJUl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlckZJUl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0ZpbHRlck1lZGlhbl9VOF9DMVIsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldENlbnRyYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9HZXRTcGF0aWFsTW9tZW50X1M2NCwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50R2V0U3RhdGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50R2V0U3RhdGVTaXplLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRJbml0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfTW9tZW50c19VOF9DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfTW9tZW50c19VOF9DM1IsIE9NWElQUFBfU1VGRklYKQorCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9CbG9ja0V4cF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9CbG9ja0V4cF9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfQ29weV9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQ29weV9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRG90UHJvZF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRG90UHJvZF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcyAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzE2UzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRGd2RfUlRvQ0NTX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUR2V0QnVmU2l6ZV9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfQ19TQzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfQ19TQzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEluaXRfUl9TMTZTMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEluaXRfUl9TMTZTMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NDU1RvUl9TMzJTMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DVG9DX1NDMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZpbHRlck1lZGlhbl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZpbHRlck1lZGlhbl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSVNmcyAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSVNmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlST25lX0JpUXVhZERpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0F2ZXJhZ2VfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV84eCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jaywgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5MTZ4MTYsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9Db3B5OHg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9Db3B5OHg4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fRXhwYW5kRnJhbWVfSSwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0xpbWl0TVZUb1JlY3QsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfMTZ4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fU0FEXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fU0FEXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQXZlcmFnZV80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrTHVtYV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgT01YQ0FUQkFSKFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0dldFZMQ0luZm8sIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FSW5pdCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfMTZ4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQURRdWFyXzh4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TQVREXzR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TQVREXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVBhZE1WX1BWT1AsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlTVYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRmluZE1WcHJlZCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0lEQ1Q4eDhibGssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NQ1JlY29uQmxvY2ssIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUdldEJ1ZlNpemUsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9NRUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9NRUluaXQsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludGVyX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9RdWFudEludkludHJhX0ksIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorCisKKyNlbmRpZiAvKiBfYXJtT01YX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI5NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqCisgKiBGaWxlOiBvbXh0eXBlcy5oCisgKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorICoKKyAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAorICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKKyAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKKyAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCisgKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCisgKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKKyAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKKyAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAorICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCisgKgorICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCisgKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKKyAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAorICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAorICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCisgKiBtYXRlcmlhbHMuCisgKiAKKyAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqCisgKi8KKyAgCisjaWZuZGVmIF9PTVhUWVBFU19IXworI2RlZmluZSBfT01YVFlQRVNfSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPiAKKworI2RlZmluZSBPTVhfSU4KKyNkZWZpbmUgT01YX09VVAorI2RlZmluZSBPTVhfSU5PVVQKKworCit0eXBlZGVmIGVudW0geworICAgIAorICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCisgICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKKyAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKKyAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCisgICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLworICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAorICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAorCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KKworICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLworICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KKworICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAorCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCisgICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KKworICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLworCisgICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLworICAgIAorIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KKworIAorLyogT01YX1U4ICovCisjaWYgVUNIQVJfTUFYID09IDB4ZmYKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisjZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCisjZWxzZQorI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKKyNlbmRpZiAKKworIAorLyogT01YX1M4ICovCisjaWYgU0NIQVJfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKyNlbGlmIFNIUlRfTUFYID09IDB4N2YgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKKyNlbHNlCisjZXJyb3IgT01YX1M4IHVuZGVmaW5lZAorI2VuZGlmCisgCisgCisvKiBPTVhfVTE2ICovCisjaWYgVVNIUlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKKyNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCisjZWxzZQorI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfUzE2ICovCisjaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7CisjZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VMzIgKi8KKyNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOworI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMzIgKi8KKyNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKK3R5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOworI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCisjZWxzZQorI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCisjZW5kaWYKKworCisvKiBPTVhfVTY0ICYgT01YX1M2NCAqLworI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQorICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQorICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQorI2Vsc2UKKyAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKKyAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKKyNlbmRpZgorCisKKy8qIE9NWF9TQzggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TOCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzggSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDODsgLyoqIFNpZ25lZCA4LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzE2ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzE2IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TMTYgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDMTY7IC8qKiBTaWduZWQgMTYtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMzIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MzMjsgLyoqIFNpZ25lZCAzMi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0M2NCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzY0OyAvKiogU2lnbmVkIDY0LWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9GMzIgKi8KK3R5cGVkZWYgZmxvYXQgT01YX0YzMjsgLyoqIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KKworCisvKiBPTVhfRjY0ICovCit0eXBlZGVmIGRvdWJsZSBPTVhfRjY0OyAvKiogRG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9JTlQgKi8KK3R5cGVkZWYgaW50IE9NWF9JTlQ7IC8qKiBzaWduZWQgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIG1hY2hpbmUgd29yZCBsZW5ndGgsIGhhcyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBJTlRfTUFYKi8KKworCisjZGVmaW5lIE9NWF9NSU5fUzggIAkgICAJKC0xMjgpCisjZGVmaW5lIE9NWF9NSU5fVTggIAkJMAorI2RlZmluZSBPTVhfTUlOX1MxNgkJIAkoLTMyNzY4KQorI2RlZmluZSBPTVhfTUlOX1UxNgkJCTAKKyNkZWZpbmUgT01YX01JTl9TMzIJCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgT01YX01JTl9VMzIJCQkwCisKKyNkZWZpbmUgT01YX01BWF9TOAkJCSgxMjcpCisjZGVmaW5lIE9NWF9NQVhfVTgJCQkoMjU1KQorI2RlZmluZSBPTVhfTUFYX1MxNgkJCSgzMjc2NykKKyNkZWZpbmUgT01YX01BWF9VMTYJCQkoMHhGRkZGKQorI2RlZmluZSBPTVhfTUFYX1MzMgkJCSgyMTQ3NDgzNjQ3KQorI2RlZmluZSBPTVhfTUFYX1UzMgkJCSgweEZGRkZGRkZGKQorCit0eXBlZGVmIHZvaWQgT01YVm9pZDsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKKy8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gYW5kIHNpemUgb2YgYSByZWN0YW5nbGUsIAorICAqIHdoZXJlIHgseSBkZWZpbmVzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgY29ybmVyCisgICogb2YgdGhlIHJlY3RhbmdsZSwgd2l0aCBkaW1lbnNpb25zIHdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbiAKKyAgKiBhbmQgaGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU9NWF9JTlQgeDsgICAgICAvKiogeC1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHk7ICAgICAgLyoqIHktY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCisJT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24uICovCisJT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uLiAqLworfU9NWFJlY3Q7CisKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBvZiBhIHBvaW50LCAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB4OyAvKiogeC1jb29yZGluYXRlICovCisgT01YX0lOVCB5OwkvKiogeS1jb29yZGluYXRlICovCisJCit9IE9NWFBvaW50OworCisKKy8qKiBEZWZpbmVzIHRoZSBkaW1lbnNpb25zIG9mIGEgcmVjdGFuZ2xlLCBvciByZWdpb24gb2YgaW50ZXJlc3QgaW4gYW4gaW1hZ2UgKi8KK3R5cGVkZWYgc3RydWN0IAoreworIE9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHgtZGlyZWN0aW9uICovCisgT01YX0lOVCBoZWlnaHQ7IC8qKiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSwgaW4gdGhlIHktZGlyZWN0aW9uICovCisJCit9IE9NWFNpemU7CisKKyNlbmRpZiAvKiBfT01YVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwYjQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsCkBAIC0wLDAgKzEsMTExIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgCisjIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCisjIE9wZW5NQVggREw6IHYxLjAuMgorIyBSZXZpc2lvbjogICA5NjQxCisjIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisjIAorIyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgCisjIAorIworIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCisjCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIHN0cmljdDsKKworbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKKworJENDICAgICAgID0gJ2FybWNjJzsKKyRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQVJNN1RETUkgLWMnOworJEFTICAgICAgID0gJ2FybWFzbSc7CiskQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JJzsKKyMgJExJQiAgICAgID0gJ2FybWxpbmsnOworIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKKyMgJExJQl9UWVBFID0gJy5vJzsKKyRMSUIgICAgICA9ICdhcm1hcic7CiskTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOworJExJQl9UWVBFID0gJy5hJzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgorQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7CisKKyMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7CitAZmlsZWxpc3QgPSA8RklMRVM+OworY2xvc2UoRklMRVMpOworCisjIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKK2ZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQoreworICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Cit9CisKKyMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKKworIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQorbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOworbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOworCiskb2JqbGlzdCA9ICcnOworCisjIENvbXBpbGUgZWFjaCBmaWxlCitmb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCit7CisJbXkgJGY7CisJbXkgJGJhc2U7CisJbXkgJGV4dDsKKwlteSAkb2JqZmlsZTsKKworCWNob21wKCRmaWxlKTsKKwkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7CisKKwkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9maWxlbGlzdF92Yy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMzRhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsMTIzIEBACisuL2FwaS9hcm1DT01NLmgKKy4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKy4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCisuL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAorLi9hcGkvb214dHlwZXMuaAorLi9zcmMvYXJtQ09NTS5jCisuL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCisuL3ZjL2FwaS9hcm1WQy5oCisuL3ZjL2FwaS9vbXhWQy5oCisuL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKKy4vdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0kuYworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCisuL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl80eC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQVREXzR4NC5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAorLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9HZXRWTENCaXRzLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EQ1Q4eDhibGsuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVNVi5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVJbml0LmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKKy4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTcyYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jCkBAIC0wLDAgKzEsOTM2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKKyAqCisgKi8KKworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorCitPTVhfSU5UIGFybVNpZ25DaGVjayAoCisgICAgT01YX1MxNiB2YXIKKykKKworeworICAgIE9NWF9JTlQgU2lnbjsKKyAgICAKKyAgICBpZiAodmFyIDwgMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHZhciA+IDApCisgICAgeworICAgICAgICBTaWduID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU2lnbiA9IDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBTaWduOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICBPTVhfSU5UIG1pbiwKKyAgICBPTVhfSU5UIG1heCwgCisgICAgT01YX1MzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgIE9NWF9GMzIgbWluLAorICAgIE9NWF9GMzIgbWF4LCAKKyAgICBPTVhfRjMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCit7CisgICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKKyAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKKyAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7CisgICAgT01YX1UzMiB2SW50OworICAgIE9NWF9VMzIgdkludFNhdDsKKyAgICAKKyAgICBpZih2IDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OworICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKKyAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7CisgICAgdkludFNhdCA9IHZJbnQ7CisgICAgaWYodkludFNhdCA+IG1heFYpIAorICAgICAgICB2SW50U2F0ID0gbWF4VjsKKyAgICByZXR1cm4gdkludFNhdDsKK30KKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKAorICAgICAgICBPTVhfVTggKnBCdWYxLAorICAgICAgICBPTVhfVTggKnBCdWYyLAorICAgICAgICBPTVhfSU5UIGVsZW1TaXplCisgICAgICAgKQoreworICAgIE9NWF9JTlQgaTsKKyAgICBPTVhfVTggdGVtcDsKKyAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7CisgICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKKyAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorKQoreworICAgIE9NWF9TMzIgYSwgYiwgYzsKKyAgICAKKyAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7CisgICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOworICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7CisgICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCisgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorKQoreworICAgIE9NWF9VOCBpOyAgICAKKyAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAorICAgIHsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCit7CisgICAgT01YX1M2NCBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKKyAgICB7CisgICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKKyAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKKworICAgIHJldHVybiBSZXN1bHQ7ICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCit7CisgICAgCisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKKworICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7CisgICAgfQorICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7CisgICAgfQorCisgICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKKyAgICAKKyAgICByZXR1cm4gbWFjOworfQorCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQoreworICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7CisKKyAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKKyAgICB9CisKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqICAgICAKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkyLGxvMTsKKyAgICBPTVhfVTE2IGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOworICAgIE9NWF9TMzIgcmVzdWx0OworICAgIAorICAgIGxvMSAgPSBpbnB1dDE7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gaGkyICogbG8xOworICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTEsaGkyOworICAgIE9NWF9VMTYgbG8xLGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOworICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOworICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKKyAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKKyAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKK3sKKyAgICBPTVhfRjY0IHJlc3VsdDsKKyAgICAKKyAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7CisgICAgCisgICAgaWYgKHJlc3VsdCA+PSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IDAuNTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0IC09IDAuNTsKKyAgICB9CisKKyAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Cit9CisKKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgCisgICAgaWYoTiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCit7CisgICAgaWYoKnBPZmZzZXQgPiAwKQorICAgIHsKKyAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7CisgICAgICAgICpwT2Zmc2V0ID0gMDsKKyAgICB9ICAgIAorfQorCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCit7CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKnBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgorICoqLworI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispCit7ICAgIAorICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgT01YX0lOVCBJbmRleDsKKyAgICAgICAgCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKKyAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47CisgICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7CisgICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSW5kZXg7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwQ29kZUJvb2srKzsKKyAgICB9CisKKyAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCisgICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispCit7CisgICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgICAgIAorICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLworICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKKyAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKKworICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLworICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7CisgICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKKyAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOworICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OworICAgIH0KKworICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KKyAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOworICAgIAorICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispCit7CisgICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhNzcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmgKQEAgLTAsMCArMSwxMTUzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtVmlkZW8uaAorICogQnJpZWY6IERlY2xhcmVzIEFQSSdzL0Jhc2ljIERhdGEgdHlwZXMgdXNlZCBhY3Jvc3MgdGhlIE9wZW5NQVggVmlkZW8gZG9tYWluCisgKgorICovCisKKworI2lmbmRlZiBfYXJtVmlkZW9fSF8KKyNkZWZpbmUgX2FybVZpZGVvX0hfCisKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogQVJNIHNwZWNpZmljIHN0YXRlIHN0cnVjdHVyZSB0byBob2xkIE1vdGlvbiBFc3RpbWF0aW9uIGluZm9ybWF0aW9uLgorICovCisgCitzdHJ1Y3QgbTRwMl9NRVNwZWMKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDJNRU1vZGUgICBNRU1vZGU7Cit9OworCitzdHJ1Y3QgbTRwMTBfTUVTcGVjCit7CisgICAgT01YVkNNNFAxME1FUGFyYW1zIE1FUGFyYW1zOworICAgIE9NWFZDTTRQMTBNRU1vZGUgICBNRU1vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBtNHAyX01FU3BlYyAgQVJNVkNNNFAyX01FU3BlYzsKK3R5cGVkZWYgc3RydWN0IG00cDEwX01FU3BlYyBBUk1WQ000UDEwX01FU3BlYzsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUKKyAqIGJlc3QgTVYgYW5kIFNBRAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgIG12WCAgICAgeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgbXZZICAgICB5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBjYW5kU0FEIENhbmRpZGF0ZSBTQUQKKyAqIFtpbl0gICAgIGJlc3RNVlggeCBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RNVlkgeSBjb29yZGluYXRlIG9mIHRoZSBiZXN0IG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIGJlc3RTQUQgYmVzdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBzYWQgaXMgdGhlIGJlc3QKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKKyAqLworCitPTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAorICAgIE9NWF9TMTYgbXZYLAorICAgIE9NWF9TMTYgbXZZLAorICAgIE9NWF9JTlQgY2FuZFNBRCwKKyAgICBPTVhfUzE2IGJlc3RNVlgsCisgICAgT01YX1MxNiBiZXN0TVZZLAorICAgIE9NWF9JTlQgYmVzdFNBRCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9BQ0RDUHJlZGljdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAorICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbaW5dIGN1clFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrLgorICogW2luXSBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtpbl0gcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQorICogW2luXSBBQ1ByZWRGbGFnICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAorICogW2luXSB2aWRlb0NvbXAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBmbGFnICAgICAgICBUaGlzIGZsYWcgZGVmaW5lcyB0aGUgaWYgb25lIHdhbnRzIHRvIHVzZSB0aGlzIGZ1bmN0aW9ucyB0bworICogICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgUFFGIChzZXQgMSwgcHJlZGljdGlvbikgb3IgUUYgKHNldCAwLCByZWNvbnN0cnVjdGlvbikKKyAqIFtvdXRdICAgIHBQcmVBQ1ByZWRpY3QgICBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgY29lZmZpY2llbnRzIGJ1ZmZlci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsZWQgT05MWSBpZiBpdCBpcyBub3QgTlVMTAorICogW291dF0gICAgcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrCisgKiBbb3V0XSAgICBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtvdXRdICAgIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW291dF0gICAgcFN1bUVyciAgICAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBzdW0gb2YgdGhlIGRpZmZlcmVuY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gcHJlZGljdGVkIGFuZCB1bnByZWRpY3RlZCBjb2VmZmljaWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgTlVMTCwgZG8gbm90IHVwZGF0ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVBQ1ByZWRpY3QsCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmQ29sLAorICAgICBPTVhfSU5UIGN1clFQLAorICAgICBPTVhfSU5UIHByZWRRUCwKKyAgICAgT01YX0lOVCBwcmVkRGlyLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50ICB2aWRlb0NvbXAsCisgICAgIE9NWF9VOCBmbGFnLAorICAgICBPTVhfSU5UICpwU3VtRXJyCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRyYSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4KKyAqIFtpbl0gcFFEY3RCbGtDb2VmICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gVGhpcyB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICAgICAgICAgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogW2luXSBwYXR0ZXJuICAgICAgICAgYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmxvY2sgaXMgZW5jb2RlZAorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIE9NWF9VOCBzdGFydAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KKyAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gdmlkZW9Db21wICAgICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jaworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIDB0aCBlbGVtZW50CisgKiAgICAgICAgICAgICAgICAgICAgICBvciAxc3QuCisgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBPTVhfUzE2ICogcERzdCwKKyAgICAgT01YX1U4IHByZWREaXIsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwgCisgICAgIE9NWF9VOCAgc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCisgKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAorICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAorICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCisgKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCisgKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKKyAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKKyAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAorICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAorICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKKyAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisgICAgT01YX1UzMiBzdG9yZVJ1biwKKyAgICBPTVhfUzE2ICogcERzdCwKKyAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCisgICAgT01YX1U4ICBzaWduLAorICAgIE9NWF9VOCAgbGFzdCwKKyAgICBPTVhfVTggICogaW5kZXgsCisgICAgY29uc3QgT01YX1U4ICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKKyAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKKyAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQorICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAorICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKKworT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAorICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl90YWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAorICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisgKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgIAorICogUmV0dXJuIFZhbHVlOgorICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKKyAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAorICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCisgKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCisgKgorICovCisKK09NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICBPTVhfVTMyIHJ1biwKKyAgICAgT01YX1UzMiBydW5QbHVzLAorICAgICBPTVhfUzE2IGxldmVsLAorICAgICBPTVhfUzE2IGxldmVsUGx1cywKKyAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKKyAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKKyk7CisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgCisgKiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgCisgKiB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgCisgKiBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IAorICogaW5wdXQgTVZzIHJlcHJlc2VudGVkIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uIAorICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLCAKKyAqICAgICAgICAgICAgICAgICAgICBpZiB5b3UgcGFkIDQgcGl4ZWxzIG91dHNpZGUgdGhlIGltYWdlIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIGxlZnQgYm9yZGVyIAorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyAqIFtpbl0gcEN1cnJQb2ludFBvcwlwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lCisgKiBbaW5dIHBTcmNQcmVNVgkJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkJcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgYnkgcFNyY1ByZU1WKQorICogW2luXSBzZWFyY2hSYW5nZQkJc2VhcmNoIHJhbmdlIGZvciAxNlgxNiBpbnRlZ2VyIGJsb2NrLHRoZSB1bml0cyBvZiBpdCBpcyBmdWxsIHBpeGVsLHRoZSBzZWFyY2ggcmFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgaW4gYWxsIGRpcmVjdGlvbnMuSXQgaXMgaW4gaW5jbHVzaXZlIG9mIHRoZSBib3VuZGFyeSBhbmQgc3BlY2lmaWVkIGluIAorICogICAgICAgICAgICAgICAgICAgIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMuCisgKiBbaW5dIHBNRVNwZWMJCQkgIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisgKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUGFkTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3IgcGFkZGluZyBmb3IgYSBtYWNyb2Jsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jaworICogW2luXSBwVHJhbnNwICAgICAgICAgcG9pbnRlciB0byB0cmFuc3BhcmVudCBzdGF0dXMgYnVmZmVyIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIFtvdXRdICAgIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGluIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyBoYXZlIGJlZW4gcGFkZGVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9QYWRNVigKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjRHN0TVYsCisgICAgIE9NWF9VOCAqIHBUcmFuc3AKKyk7CisKKy8qIAorICogSC4yNjQgU3BlY2lmaWMgRGVjbGFyYXRpb25zIAorICovCisvKiBEZWZpbmVzICovCisjZGVmaW5lIEFSTV9NNFAxMF9RX09GRlNFVCAgICAgICAgKDE1KQorCisKKy8qIERlcXVhbnQgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbMTZdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9WTWF0cml4WzZdWzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VMzIgYXJtVkNNNFAxMF9NRk1hdHJpeFs2XVszXTsKKworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHdvcmsgcmVxdWlyZWQgYnkgdGhlIE9wZW5NQVgKKyAqIERlY29kZUNvZWZmc1RvUGFpciBmdW5jdGlvbiBhbmQgRGVjb2RlQ2hyb21hRENDb2VmZnNUb1BhaXIuCisgKiBTaW5jZSBtb3N0IG9mIHRoZSBjb2RlIGlzIGNvbW1vbiB3ZSBzaGFyZSBpdCBoZXJlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIKKyAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbQorICogW2luXQlzTWF4TnVtQ29lZmYJTWF4aW11bSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQKKyAqCQkJCQkJCQlibG9jayAoNCwxNSBvciAxNikKKyAqIFtpbl0JblRhYmxlICAgICAgICAgIFRhYmxlIG51bWJlciAoMCB0byA0KSBhY2NvcmRpbmcgdG8gdGhlIGZpdmUgY29sdW1ucworICogICAgICAgICAgICAgICAgICAgICAgb2YgVGFibGUgOS01IGluIHRoZSBILjI2NCBzcGVjCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCisgICAgIE9NWF9JTlQgblRhYmxlLAorICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCisgKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBhdmVyYWdpbmcgdXBwZXIgYW5kIGxlZnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCisgKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCisgKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCisgKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCisgKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDR4NCBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0KAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSAyeDIgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4MigKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogRGVibG9jayBvbmUgYm91bmRhcnkgcGl4ZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwUTAgICAgICAgICBQb2ludGVyIHRvIHBpeGVsIHEwCisgKiBbaW5dIFN0ZXAgICAgICAgIFN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExCisgKiBbaW5dIHRDMCAgICAgICAgIEVkZ2UgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGFscGhhICAgICAgIGFscGhhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiZXRhICAgICAgICBiZXRhIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBiUyAgICAgICAgICBkZWJsb2NraW5nIHN0cmVuZ3RoCisgKiBbaW5dIENocm9tYUZsYWcgIFRydWUgZm9yIGNocm9tYSBibG9ja3MKKyAqIFtvdXRdIHBRMCAgICAgICAgRGVibG9ja2VkIHBpeGVscworICogCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICBPTVhfVTggKnBRMCwgICAgLyogcG9pbnRlciB0byB0aGUgcGl4ZWwgcTAgKi8KKyAgICBpbnQgU3RlcCwgICAgICAgLyogc3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEgKi8KKyAgICBpbnQgdEMwLCAgICAgICAgLyogZWRnZSB0aHJlc2hvbGQgdmFsdWUgKi8KKyAgICBpbnQgYWxwaGEsICAgICAgLyogYWxwaGEgKi8KKyAgICBpbnQgYmV0YSwgICAgICAgLyogYmV0YSAqLworICAgIGludCBiUywgICAgICAgICAvKiBkZWJsb2NraW5nIHN0cmVuZ3RoICovCisgICAgaW50IENocm9tYUZsYWcKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucworICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAJCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW291dF0JcERzdAkgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSgKKyAgICAgICAgY29uc3QgT01YX1U4KgkJcFNyYywgCisJCU9NWF9VMzIgCWlTcmNTdGVwLCAKKwkJT01YX1U4KiAJcERzdCwgCisJCU9NWF9VMzIgCWlEc3RTdGVwLCAKKwkJT01YX1UzMiAJaVdpZHRoLCAKKwkJT01YX1UzMiAJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKgkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QgICAgCVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSgJCisJIGNvbnN0IE9NWF9VOCogCXBTcmMsIAorCSBPTVhfVTMyIAlpU3JjU3RlcCwgCisgCSBPTVhfVTgqIAlwRHN0LAorIAkgT01YX1UzMiAJaURzdFN0ZXAsIAorIAkgT01YX1UzMiAJaVdpZHRoLCAKKyAJIE9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciAoMS8yLCAxLzIpICBwb3NpdGlvbnMgCisgKiBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAoMS8yLDEvMiktcGVsCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEoICAKKyAgICAgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywgCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgT01YX1U4KiAgICAgcERzdCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAorICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0CispOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7CisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdCk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9TQUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHRoZSBTQUQgZm9yIE54TSBibG9ja3MuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjT3JnCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJaVN0ZXBPcmcJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlwU3JjUmVmCQlQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sKKyAqIFtpbl0JCWlTdGVwUmVmCVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIKKyAqIFtpbl0JCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCitPTVhSZXN1bHQgYXJtVkNDT01NX1NBRCgJCisJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwlPTVhfVTMyIAlpU3RlcE9yZywKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAorCU9NWF9VMzIgCWlTdGVwUmVmLAorCU9NWF9TMzIqCXBEc3RTQUQsCisJT01YX1UzMgkJaUhlaWdodCwKKwlPTVhfVTMyCQlpV2lkdGgpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fQXZlcmFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byBibG9ja3MgYW5kIHN0b3JlcyB0aGUgcmVzdWx0LgorICoKKyAqIFJlbWFya3M6CisgKgorICoJW2luXQlwUHJlZDAJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JcFByZWQxCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlQcmVkU3RlcDAJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAKKyAqCVtpbl0JaVByZWRTdGVwMQkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpRHN0U3RlcCAJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJW2luXQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2tzCisgKglbaW5dCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrcworICoJW291dF0JcERzdFByZWQJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKyBPTVhSZXN1bHQgYXJtVkNDT01NX0F2ZXJhZ2UgKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaVdpZHRoLAorCSBPTVhfVTMyCQlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAorICAgICAgICBPTVhfVTggICAgICAqcFNyYywKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCisgICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAorICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAorICAgICAgICBPTVhfVTMyICAgICBkeCwKKyAgICAgICAgT01YX1UzMiAgICAgZHkKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ0gyNjRfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLAorICogcGVyZm9ybSBkZXF1YW50aXNhdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YKKyAqIHJlc2lkdWFscyBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uCisgKgkJCQkJCQlwYWlyIGJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtpbl0JcERDCQkJUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTAorICoJCQkJCQkJaWYgaXQgZG9lc24ndCBleGlzdAorICogW2luXQlRUAkJCVF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gQUMgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBjb2VmZmljaWVudCBleGlzdHMKKyAqIFtvdXRdCXBEc3QJCXBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4KAorICAgICBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiAqcERzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX1MxNiogcERDLAorICAgICBpbnQgQUMKKyk7CisKKyNlbmRpZiAgLypfYXJtVmlkZW9fSF8qLworCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzY2M3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTUxMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fQXZlcmFnZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ0NPTU1fQXZlcmFnZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byBibG9ja3MgaWYgc2l6ZSBpV2lkdGggWCBpSGVpZ2h0CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAorICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCisgKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKKyAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCisgKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpV2lkdGgsCisJIE9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICBPTVhfVTMyICAgICB4LCB5OworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RQcmVkIFt5ICogaURzdFN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIChPTVhfVTgpKCgoT01YX1UzMilwUHJlZDAgW3kgKiBpUHJlZFN0ZXAwICsgeF0gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJlZDEgW3kgKiBpUHJlZFN0ZXAxICsgeF0gKyAxKSA+PiAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFhYzlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKQEAgLTAsMCArMSw3NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDQ09NTV9TQUQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciBOeE0gYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoCispCit7CisgICAgT01YX0lOVCAgICAgeCwgeTsKKyAgICAKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAKKyAgICAqcERzdFNBRCA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgKnBEc3RTQUQgKz0gYXJtQWJzKHBTcmNPcmcgWyh5ICogaVN0ZXBPcmcpICsgeF0gLSAKKyAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZiBbKHkgKiBpU3RlcFJlZikgKyB4XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE0NDdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYwpAQCAtMCwwICsxLDg2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAorICoKKyAqLworIE9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAorCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKKwkgT01YX1UzMgkJaVByZWRTdGVwMCwKKwkgT01YX1UzMgkJaVByZWRTdGVwMSwKKwkgT01YX1U4KgkJcERzdFByZWQsCisJIE9NWF9VMzIJCWlEc3RTdGVwLCAKKwkgT01YX1UzMgkJaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDE2LCBpSGVpZ2h0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2IxMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQXZlcmFnZV84eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA4eDQgb3IgOHg4IG9yIDh4MTYgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKKyAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCisgKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAorICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCisgKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKKyAqCisgKi8KKyBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAkKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisgICAgIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisgICAgIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorICAgICBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDgsIGlIZWlnaHQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTlhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKKyAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2soCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgT01YX0lOVCBzcmNTdGVwLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgIE9NWF9TMTYgKiBwRHN0CispCit7CisKKyAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDA7CisgICAgICAgICB5IDwgODsKKyAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzMxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKQEAgLTAsMCArMSw5MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGNvbXB1dGluZyB0aGUgZXJyb3IgZm9yIGEgTUIgb2Ygc2l6ZSA4eDgKKyAqIAorICovCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgT01YX0lOVCBzcmNTdGVwLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgICBPTVhfSU5UICAgICB4LCB5LCBjb3VudDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChzcmNTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZXJyb3IgYmxvY2sgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsICpwRHN0U0FEID0gMDsKKyAgICAgICAgIHkgPCA4OworICAgICAgICAgeSsrLCBwU3JjICs9IHNyY1N0ZXApCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2NvdW50XSA9IHBTcmNbeF0gLSBwU3JjUmVmW2NvdW50XTsKKyAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwRHN0W2NvdW50XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU3MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5MTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IDE2eDE2IENvcHkgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKKyAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKKyAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2KAorCQljb25zdCBPTVhfVTggKnBTcmMsIAorCQlPTVhfVTggKnBEc3QsIAorCQlPTVhfSU5UIHN0ZXApCisgeworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworCisgICAgT01YX0lOVCBjb3VudCxpbmRleCwgeCwgeTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDE2KSB8fCAoc3RlcCAlIDE2KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgMTZ4MTYgYmxrIHRvIHRoZSBjdXJyIGJsayAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgMTY7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSAxNikKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2luZGV4XSA9IHBTcmNbY291bnRdOworICAgICAgICB9ICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKyB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmOWRkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvcHk4eDguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QRUc0IDh4OCBDb3B5IG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCisgKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCgKKwkJY29uc3QgT01YX1U4ICpwU3JjLCAKKwkJT01YX1U4ICpwRHN0LCAKKwkJT01YX0lOVCBzdGVwKQorIHsKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKworICAgIE9NWF9JTlQgY291bnQsaW5kZXgsIHgsIHk7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChzdGVwIDwgOCkgfHwgKHN0ZXAgJSA4KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAKKyAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KKyAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSA4KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtpbmRleF0gPSBwU3JjW2NvdW50XTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzZkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKKyAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKKyAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAorICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCisgKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCisgKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCisgKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKKyAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAorICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKKyAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKKyAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKKyAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCisgKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAorICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0koCisJT01YX1U4KglwU3JjRHN0UGxhbmUsIAorCU9NWF9VMzIJaUZyYW1lV2lkdGgsIAorCU9NWF9VMzIJaUZyYW1lSGVpZ2h0LCAKKwlPTVhfVTMyCWlFeHBhbmRQZWxzLCAKKwlPTVhfVTMyCWlQbGFuZVN0ZXAKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9VOCogICAgIHBMZWZ0OworICAgIE9NWF9VOCogICAgIHBSaWdodDsKKyAgICBPTVhfVTgqICAgICBwVG9wOworICAgIE9NWF9VOCogICAgIHBCb3R0b207CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0UGxhbmUgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3RQbGFuZSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlGcmFtZVdpZHRoID09IDAgfHwgaUZyYW1lV2lkdGggJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVIZWlnaHQ9PSAwIHx8IGlGcmFtZUhlaWdodCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlFeHBhbmRQZWxzID09IDAgfHwgaUV4cGFuZFBlbHMgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwID09IDAgfHwgaVBsYW5lU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLCAKKyAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIFRvcCBhbmQgQm90dG9tICovCisgICAgcFRvcCA9IHBTcmNEc3RQbGFuZSAtIChpRXhwYW5kUGVscyAqIGlQbGFuZVN0ZXApOworICAgIHBCb3R0b20gPSBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRnJhbWVXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwVG9wIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCisgICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFt4XTsKKyAgICAgICAgICAgIHBCb3R0b20gW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKKyAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExlZnQsIFJpZ2h0IGFuZCBDb3JuZXJzICovCisgICAgcExlZnQgPSBwU3JjRHN0UGxhbmUgLSBpRXhwYW5kUGVsczsKKyAgICBwUmlnaHQgPSBwU3JjRHN0UGxhbmUgKyBpRnJhbWVXaWR0aDsKKworICAgIGZvciAoeSA9IC0oT01YX0lOVClpRXhwYW5kUGVsczsgeSA8IChPTVhfSU5UKShpRnJhbWVIZWlnaHQgKyBpRXhwYW5kUGVscyk7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAoT01YX0lOVClpRXhwYW5kUGVsczsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTGVmdCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAwXTsKKyAgICAgICAgICAgIHBSaWdodCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeSAqIGlQbGFuZVN0ZXAgKyAoaUZyYW1lV2lkdGggLSAxKV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0xpbWl0TVZUb1JlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0NTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgbGltaXRpbmcgdGhlIE1WCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKKyAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKKyAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKKyAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKKyAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCisgKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCisgKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKKyAqICAgICAgICAgICAgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAorICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCisgKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCisgKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgorICovCitPTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QoCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBjb25zdCBPTVhSZWN0ICogcFJlY3RWT1BSZWYsCisgICAgIE9NWF9JTlQgWGNvb3JkLAorICAgICBPTVhfSU5UIFljb29yZCwKKyAgICAgT01YX0lOVCBzaXplCispCit7CisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY01WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWN0Vk9QUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoc2l6ZSAhPSA4KSAmJiAoc2l6ZSAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPndpZHRoIDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChwUmVjdFZPUFJlZi0+aGVpZ2h0IDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIHBEc3RNVi0+ZHggPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keCwgMipwUmVjdFZPUFJlZi0+eCAtIFhjb29yZCksCisgICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT54ICsgcFJlY3RWT1BSZWYtPndpZHRoIC0gWGNvb3JkIC0gc2l6ZSkpOworICAgIHBEc3RNVi0+ZHkgPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keSwgMipwUmVjdFZPUFJlZi0+eSAtIFljb29yZCksCisgICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT55ICsgcFJlY3RWT1BSZWYtPmhlaWdodCAtIFljb29yZCAtIHNpemUpKTsKKworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwY2VkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNDT01NX1NBRF8xNnguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCisgKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCisgKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4KAorCQkJY29uc3QgT01YX1U4KiAJcFNyY09yZywKKwkJCU9NWF9VMzIgCWlTdGVwT3JnLAorCQkJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwkJCU9NWF9VMzIgCWlTdGVwUmVmLAorCQkJT01YX1MzMioJcERzdFNBRCwKKwkJCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAxNSksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyMWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fU0FEXzh4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKKyAqICAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCisgKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHgoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDQ09NTV9TQUQgCisgICAgICAgIChwU3JjT3JnLCBpU3RlcE9yZywgcFNyY1JlZiwgaVN0ZXBSZWYsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMThhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRmlsZTogICAgIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiBIZWFkZXIgZmlsZSBmb3IgQVJNIGltcGxlbWVudGF0aW9uIG9mIE9wZW5NQVggVkNNNFAxMAorICogCisgKi8KKyAKKyNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisjZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAorICAKKy8qIENBVkxDIHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XTsKK2V4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUzNmFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCkBAIC0wLDAgKzEsNzAzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIFRhYmxlcyBtYXBwaW5nIGEgY29kZSB0byBUcmFpbGluZ09uZXMgYW5kIFRvdGFsQ29lZmYgKi8KKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdID0geworIDAsCisgMCwgMSwKKyAwLCAxLCAyLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMywKKyAwLCAxLCAyLCAzLAorIDAsIDEsIDIsIDMsCisgMCwgMSwgMiwgMworfTsKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmWzYyXSA9IHsKKyAwLAorIDEsIDEsCisgMiwgMiwgMiwKKyAzLCAzLCAzLCAzLAorIDQsIDQsIDQsIDQsCisgNSwgNSwgNSwgNSwKKyA2LCA2LCA2LCA2LAorIDcsIDcsIDcsIDcsCisgOCwgOCwgOCwgOCwKKyA5LCA5LCA5LCA5LAorIDEwLCAxMCwgMTAsIDEwLAorIDExLCAxMSwgMTEsIDExLAorIDEyLCAxMiwgMTIsIDEyLAorIDEzLCAxMywgMTMsIDEzLAorIDE0LCAxNCwgMTQsIDE0LAorIDE1LCAxNSwgMTUsIDE1LAorIDE2LCAxNiwgMTYsIDE2Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMFs2M10gPSB7CisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgOCwgMHgwMDA3IH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgOSwgMHgwMDA3IH0sCisgICAgeyAgOCwgMHgwMDA2IH0sCisgICAgeyAgNywgMHgwMDA1IH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAxMCwgMHgwMDA3IH0sCisgICAgeyAgOSwgMHgwMDA2IH0sCisgICAgeyAgOCwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAxMSwgMHgwMDA3IH0sCisgICAgeyAxMCwgMHgwMDA2IH0sCisgICAgeyAgOSwgMHgwMDA1IH0sCisgICAgeyAgNywgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDBmIH0sCisgICAgeyAxMSwgMHgwMDA2IH0sCisgICAgeyAxMCwgMHgwMDA1IH0sCisgICAgeyAgOCwgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDBiIH0sCisgICAgeyAxMywgMHgwMDBlIH0sCisgICAgeyAxMSwgMHgwMDA1IH0sCisgICAgeyAgOSwgMHgwMDA0IH0sCisgICAgeyAxMywgMHgwMDA4IH0sCisgICAgeyAxMywgMHgwMDBhIH0sCisgICAgeyAxMywgMHgwMDBkIH0sCisgICAgeyAxMCwgMHgwMDA0IH0sCisgICAgeyAxNCwgMHgwMDBmIH0sCisgICAgeyAxNCwgMHgwMDBlIH0sCisgICAgeyAxMywgMHgwMDA5IH0sCisgICAgeyAxMSwgMHgwMDA0IH0sCisgICAgeyAxNCwgMHgwMDBiIH0sCisgICAgeyAxNCwgMHgwMDBhIH0sCisgICAgeyAxNCwgMHgwMDBkIH0sCisgICAgeyAxMywgMHgwMDBjIH0sCisgICAgeyAxNSwgMHgwMDBmIH0sCisgICAgeyAxNSwgMHgwMDBlIH0sCisgICAgeyAxNCwgMHgwMDA5IH0sCisgICAgeyAxNCwgMHgwMDBjIH0sCisgICAgeyAxNSwgMHgwMDBiIH0sCisgICAgeyAxNSwgMHgwMDBhIH0sCisgICAgeyAxNSwgMHgwMDBkIH0sCisgICAgeyAxNCwgMHgwMDA4IH0sCisgICAgeyAxNiwgMHgwMDBmIH0sCisgICAgeyAxNSwgMHgwMDAxIH0sCisgICAgeyAxNSwgMHgwMDA5IH0sCisgICAgeyAxNSwgMHgwMDBjIH0sCisgICAgeyAxNiwgMHgwMDBiIH0sCisgICAgeyAxNiwgMHgwMDBlIH0sCisgICAgeyAxNiwgMHgwMDBkIH0sCisgICAgeyAxNSwgMHgwMDA4IH0sCisgICAgeyAxNiwgMHgwMDA3IH0sCisgICAgeyAxNiwgMHgwMDBhIH0sCisgICAgeyAxNiwgMHgwMDA5IH0sCisgICAgeyAxNiwgMHgwMDBjIH0sCisgICAgeyAxNiwgMHgwMDA0IH0sCisgICAgeyAxNiwgMHgwMDA2IH0sCisgICAgeyAxNiwgMHgwMDA1IH0sCisgICAgeyAxNiwgMHgwMDA4IH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4xWzYzXSA9IHsKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICA2LCAweDAwMGIgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDcgfSwKKyAgICB7ICA1LCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDcgfSwKKyAgICB7ICA2LCAweDAwMGEgfSwKKyAgICB7ICA2LCAweDAwMDkgfSwKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA4LCAweDAwMDcgfSwKKyAgICB7ICA2LCAweDAwMDYgfSwKKyAgICB7ICA2LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA4LCAweDAwMDQgfSwKKyAgICB7ICA3LCAweDAwMDYgfSwKKyAgICB7ICA3LCAweDAwMDUgfSwKKyAgICB7ICA1LCAweDAwMDYgfSwKKyAgICB7ICA5LCAweDAwMDcgfSwKKyAgICB7ICA4LCAweDAwMDYgfSwKKyAgICB7ICA4LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDggfSwKKyAgICB7IDExLCAweDAwMGYgfSwKKyAgICB7ICA5LCAweDAwMDYgfSwKKyAgICB7ICA5LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDQgfSwKKyAgICB7IDExLCAweDAwMGIgfSwKKyAgICB7IDExLCAweDAwMGUgfSwKKyAgICB7IDExLCAweDAwMGQgfSwKKyAgICB7ICA3LCAweDAwMDQgfSwKKyAgICB7IDEyLCAweDAwMGYgfSwKKyAgICB7IDExLCAweDAwMGEgfSwKKyAgICB7IDExLCAweDAwMDkgfSwKKyAgICB7ICA5LCAweDAwMDQgfSwKKyAgICB7IDEyLCAweDAwMGIgfSwKKyAgICB7IDEyLCAweDAwMGUgfSwKKyAgICB7IDEyLCAweDAwMGQgfSwKKyAgICB7IDExLCAweDAwMGMgfSwKKyAgICB7IDEyLCAweDAwMDggfSwKKyAgICB7IDEyLCAweDAwMGEgfSwKKyAgICB7IDEyLCAweDAwMDkgfSwKKyAgICB7IDExLCAweDAwMDggfSwKKyAgICB7IDEzLCAweDAwMGYgfSwKKyAgICB7IDEzLCAweDAwMGUgfSwKKyAgICB7IDEzLCAweDAwMGQgfSwKKyAgICB7IDEyLCAweDAwMGMgfSwKKyAgICB7IDEzLCAweDAwMGIgfSwKKyAgICB7IDEzLCAweDAwMGEgfSwKKyAgICB7IDEzLCAweDAwMDkgfSwKKyAgICB7IDEzLCAweDAwMGMgfSwKKyAgICB7IDEzLCAweDAwMDcgfSwKKyAgICB7IDE0LCAweDAwMGIgfSwKKyAgICB7IDEzLCAweDAwMDYgfSwKKyAgICB7IDEzLCAweDAwMDggfSwKKyAgICB7IDE0LCAweDAwMDkgfSwKKyAgICB7IDE0LCAweDAwMDggfSwKKyAgICB7IDE0LCAweDAwMGEgfSwKKyAgICB7IDEzLCAweDAwMDEgfSwKKyAgICB7IDE0LCAweDAwMDcgfSwKKyAgICB7IDE0LCAweDAwMDYgfSwKKyAgICB7IDE0LCAweDAwMDUgfSwKKyAgICB7IDE0LCAweDAwMDQgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjJbNjNdID0geworICAgIHsgIDQsIDB4MDAwZiB9LAorICAgIHsgIDYsIDB4MDAwZiB9LAorICAgIHsgIDQsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwYiB9LAorICAgIHsgIDUsIDB4MDAwZiB9LAorICAgIHsgIDQsIDB4MDAwZCB9LAorICAgIHsgIDYsIDB4MDAwOCB9LAorICAgIHsgIDUsIDB4MDAwYyB9LAorICAgIHsgIDUsIDB4MDAwZSB9LAorICAgIHsgIDQsIDB4MDAwYyB9LAorICAgIHsgIDcsIDB4MDAwZiB9LAorICAgIHsgIDUsIDB4MDAwYSB9LAorICAgIHsgIDUsIDB4MDAwYiB9LAorICAgIHsgIDQsIDB4MDAwYiB9LAorICAgIHsgIDcsIDB4MDAwYiB9LAorICAgIHsgIDUsIDB4MDAwOCB9LAorICAgIHsgIDUsIDB4MDAwOSB9LAorICAgIHsgIDQsIDB4MDAwYSB9LAorICAgIHsgIDcsIDB4MDAwOSB9LAorICAgIHsgIDYsIDB4MDAwZSB9LAorICAgIHsgIDYsIDB4MDAwZCB9LAorICAgIHsgIDQsIDB4MDAwOSB9LAorICAgIHsgIDcsIDB4MDAwOCB9LAorICAgIHsgIDYsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwOSB9LAorICAgIHsgIDQsIDB4MDAwOCB9LAorICAgIHsgIDgsIDB4MDAwZiB9LAorICAgIHsgIDcsIDB4MDAwZSB9LAorICAgIHsgIDcsIDB4MDAwZCB9LAorICAgIHsgIDUsIDB4MDAwZCB9LAorICAgIHsgIDgsIDB4MDAwYiB9LAorICAgIHsgIDgsIDB4MDAwZSB9LAorICAgIHsgIDcsIDB4MDAwYSB9LAorICAgIHsgIDYsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwZiB9LAorICAgIHsgIDgsIDB4MDAwYSB9LAorICAgIHsgIDgsIDB4MDAwZCB9LAorICAgIHsgIDcsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwYiB9LAorICAgIHsgIDksIDB4MDAwZSB9LAorICAgIHsgIDgsIDB4MDAwOSB9LAorICAgIHsgIDgsIDB4MDAwYyB9LAorICAgIHsgIDksIDB4MDAwOCB9LAorICAgIHsgIDksIDB4MDAwYSB9LAorICAgIHsgIDksIDB4MDAwZCB9LAorICAgIHsgIDgsIDB4MDAwOCB9LAorICAgIHsgMTAsIDB4MDAwZCB9LAorICAgIHsgIDksIDB4MDAwNyB9LAorICAgIHsgIDksIDB4MDAwOSB9LAorICAgIHsgIDksIDB4MDAwYyB9LAorICAgIHsgMTAsIDB4MDAwOSB9LAorICAgIHsgMTAsIDB4MDAwYyB9LAorICAgIHsgMTAsIDB4MDAwYiB9LAorICAgIHsgMTAsIDB4MDAwYSB9LAorICAgIHsgMTAsIDB4MDAwNSB9LAorICAgIHsgMTAsIDB4MDAwOCB9LAorICAgIHsgMTAsIDB4MDAwNyB9LAorICAgIHsgMTAsIDB4MDAwNiB9LAorICAgIHsgMTAsIDB4MDAwMSB9LAorICAgIHsgMTAsIDB4MDAwNCB9LAorICAgIHsgMTAsIDB4MDAwMyB9LAorICAgIHsgMTAsIDB4MDAwMiB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuM1s2M10gPSB7CisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDA0IH0sCisgICAgeyAgNiwgMHgwMDA1IH0sCisgICAgeyAgNiwgMHgwMDA2IH0sCisgICAgeyAgNiwgMHgwMDA4IH0sCisgICAgeyAgNiwgMHgwMDA5IH0sCisgICAgeyAgNiwgMHgwMDBhIH0sCisgICAgeyAgNiwgMHgwMDBiIH0sCisgICAgeyAgNiwgMHgwMDBjIH0sCisgICAgeyAgNiwgMHgwMDBkIH0sCisgICAgeyAgNiwgMHgwMDBlIH0sCisgICAgeyAgNiwgMHgwMDBmIH0sCisgICAgeyAgNiwgMHgwMDEwIH0sCisgICAgeyAgNiwgMHgwMDExIH0sCisgICAgeyAgNiwgMHgwMDEyIH0sCisgICAgeyAgNiwgMHgwMDEzIH0sCisgICAgeyAgNiwgMHgwMDE0IH0sCisgICAgeyAgNiwgMHgwMDE1IH0sCisgICAgeyAgNiwgMHgwMDE2IH0sCisgICAgeyAgNiwgMHgwMDE3IH0sCisgICAgeyAgNiwgMHgwMDE4IH0sCisgICAgeyAgNiwgMHgwMDE5IH0sCisgICAgeyAgNiwgMHgwMDFhIH0sCisgICAgeyAgNiwgMHgwMDFiIH0sCisgICAgeyAgNiwgMHgwMDFjIH0sCisgICAgeyAgNiwgMHgwMDFkIH0sCisgICAgeyAgNiwgMHgwMDFlIH0sCisgICAgeyAgNiwgMHgwMDFmIH0sCisgICAgeyAgNiwgMHgwMDIwIH0sCisgICAgeyAgNiwgMHgwMDIxIH0sCisgICAgeyAgNiwgMHgwMDIyIH0sCisgICAgeyAgNiwgMHgwMDIzIH0sCisgICAgeyAgNiwgMHgwMDI0IH0sCisgICAgeyAgNiwgMHgwMDI1IH0sCisgICAgeyAgNiwgMHgwMDI2IH0sCisgICAgeyAgNiwgMHgwMDI3IH0sCisgICAgeyAgNiwgMHgwMDI4IH0sCisgICAgeyAgNiwgMHgwMDI5IH0sCisgICAgeyAgNiwgMHgwMDJhIH0sCisgICAgeyAgNiwgMHgwMDJiIH0sCisgICAgeyAgNiwgMHgwMDJjIH0sCisgICAgeyAgNiwgMHgwMDJkIH0sCisgICAgeyAgNiwgMHgwMDJlIH0sCisgICAgeyAgNiwgMHgwMDJmIH0sCisgICAgeyAgNiwgMHgwMDMwIH0sCisgICAgeyAgNiwgMHgwMDMxIH0sCisgICAgeyAgNiwgMHgwMDMyIH0sCisgICAgeyAgNiwgMHgwMDMzIH0sCisgICAgeyAgNiwgMHgwMDM0IH0sCisgICAgeyAgNiwgMHgwMDM1IH0sCisgICAgeyAgNiwgMHgwMDM2IH0sCisgICAgeyAgNiwgMHgwMDM3IH0sCisgICAgeyAgNiwgMHgwMDM4IH0sCisgICAgeyAgNiwgMHgwMDM5IH0sCisgICAgeyAgNiwgMHgwMDNhIH0sCisgICAgeyAgNiwgMHgwMDNiIH0sCisgICAgeyAgNiwgMHgwMDNjIH0sCisgICAgeyAgNiwgMHgwMDNkIH0sCisgICAgeyAgNiwgMHgwMDNlIH0sCisgICAgeyAgNiwgMHgwMDNmIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW40WzE1XSA9IHsKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDcgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDQgfSwKKyAgICB7ICA2LCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDMgfSwKKyAgICB7ICA3LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDUgfSwKKyAgICB7ICA2LCAweDAwMDIgfSwKKyAgICB7ICA4LCAweDAwMDMgfSwKKyAgICB7ICA4LCAweDAwMDIgfSwKKyAgICB7ICA3LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworCitjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzVdID0geworICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjAsIAorICAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjEsCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMiwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuNAorfTsKKworLyogVGFibGUgZm9yIGxldmVsX3ByZWZpeCAqLworCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XSA9IHsKKyAgICB7ICAxLCAxfSwKKyAgICB7ICAyLCAxfSwKKyAgICB7ICAzLCAxfSwKKyAgICB7ICA0LCAxfSwKKyAgICB7ICA1LCAxfSwKKyAgICB7ICA2LCAxfSwKKyAgICB7ICA3LCAxfSwKKyAgICB7ICA4LCAxfSwKKyAgICB7ICA5LCAxfSwKKyAgICB7IDEwLCAxfSwKKyAgICB7IDExLCAxfSwKKyAgICB7IDEyLCAxfSwKKyAgICB7IDEzLCAxfSwKKyAgICB7IDE0LCAxfSwKKyAgICB7IDE1LCAxfSwKKyAgICB7IDE2LCAxfSwKKyAgICB7ICAwLCAwfQorfTsKKworLyogVGFibGVzIGZvciB0b3RhbF96ZXJvcyAqLworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMVsxN10gPSB7CisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNiwgMHgwMDAzIH0sCisgICAgeyAgNiwgMHgwMDAyIH0sCisgICAgeyAgNywgMHgwMDAzIH0sCisgICAgeyAgNywgMHgwMDAyIH0sCisgICAgeyAgOCwgMHgwMDAzIH0sCisgICAgeyAgOCwgMHgwMDAyIH0sCisgICAgeyAgOSwgMHgwMDAzIH0sCisgICAgeyAgOSwgMHgwMDAyIH0sCisgICAgeyAgOSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyWzE2XSA9IHsKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDMgfSwKKyAgICB7ICA1LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDMgfSwKKyAgICB7ICA2LCAweDAwMDIgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczNbMTVdID0geworICAgIHsgIDQsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDQsIDB4MDAwNCB9LAorICAgIHsgIDQsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDQsIDB4MDAwMiB9LAorICAgIHsgIDUsIDB4MDAwMyB9LAorICAgIHsgIDUsIDB4MDAwMiB9LAorICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNFsxNF0gPSB7CisgICAgeyAgNSwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDA3IH0sCisgICAgeyAgNCwgMHgwMDA1IH0sCisgICAgeyAgNCwgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDA2IH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgNCwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgNCwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAyIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1WzEzXSA9IHsKKyAgICB7ICA0LCAweDAwMDUgfSwKKyAgICB7ICA0LCAweDAwMDQgfSwKKyAgICB7ICA0LCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICA0LCAweDAwMDIgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczZbMTJdID0geworICAgIHsgIDYsIDB4MDAwMSB9LAorICAgIHsgIDUsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwNyB9LAorICAgIHsgIDMsIDB4MDAwNiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDYsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zN1sxMV0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDA1IH0sCisgICAgeyAgMywgMHgwMDA0IH0sCisgICAgeyAgMywgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMywgMHgwMDAyIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4WzEwXSA9IHsKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDAgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczlbOV0gPSB7CisgICAgeyAgNiwgMHgwMDAxIH0sCisgICAgeyAgNiwgMHgwMDAwIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAzIH0sCisgICAgeyAgMiwgMHgwMDAyIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgNSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMFs4XSA9IHsKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDMgfSwKKyAgICB7ICAyLCAweDAwMDIgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczExWzddID0geworICAgIHsgIDQsIDB4MDAwMCB9LAorICAgIHsgIDQsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTJbNl0gPSB7CisgICAgeyAgNCwgMHgwMDAwIH0sCisgICAgeyAgNCwgMHgwMDAxIH0sCisgICAgeyAgMiwgMHgwMDAxIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMywgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxM1s1XSA9IHsKKyAgICB7ICAzLCAweDAwMDAgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICAxLCAweDAwMDEgfSwKKyAgICB7ICAyLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE0WzRdID0geworICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTVbM10gPSB7CisgICAgeyAgMSwgMHgwMDAwIH0sCisgICAgeyAgMSwgMHgwMDAxIH0sCisgICAgeyAgMCwgMHgwMDAwIH0KK307CisKK2NvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7CisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMiwKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MzLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M0LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M1LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M2LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M3LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M4LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M5LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTEsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEyLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMywgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTQsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczE1IAorfTsKKworc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8xWzVdID0geworICAgIHsgIDEsIDEgfSwKKyAgICB7ICAyLCAxIH0sCisgICAgeyAgMywgMSB9LAorICAgIHsgIDMsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMls0XSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMiwgMSB9LAorICAgIHsgIDIsIDAgfSwKKyAgICB7ICAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfM1szXSA9IHsKKyAgICB7ICAxLCAxIH0sCisgICAgeyAgMSwgMCB9LAorICAgIHsgIDAsIDAgfQorfTsKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzIsIAorICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8zCit9OworCisKKy8qIFRhYmxlcyBmb3IgcnVuX2JlZm9yZSAqLworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUxWzNdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDEsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyWzRdID0geworICAgIHsgIDEsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUzWzVdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDIsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU0WzZdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDIsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1WzddID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDIsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU2WzhdID0geworICAgIHsgIDIsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMCB9LAorICAgIHsgIDMsIDB4MDAwMSB9LAorICAgIHsgIDMsIDB4MDAwMyB9LAorICAgIHsgIDMsIDB4MDAwMiB9LAorICAgIHsgIDMsIDB4MDAwNSB9LAorICAgIHsgIDMsIDB4MDAwNCB9LAorICAgIHsgIDAsIDB4MDAwMCB9Cit9OworCitzdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU3WzE2XSA9IHsKKyAgICB7ICAzLCAweDAwMDcgfSwKKyAgICB7ICAzLCAweDAwMDYgfSwKKyAgICB7ICAzLCAweDAwMDUgfSwKKyAgICB7ICAzLCAweDAwMDQgfSwKKyAgICB7ICAzLCAweDAwMDMgfSwKKyAgICB7ICAzLCAweDAwMDIgfSwKKyAgICB7ICAzLCAweDAwMDEgfSwKKyAgICB7ICA0LCAweDAwMDEgfSwKKyAgICB7ICA1LCAweDAwMDEgfSwKKyAgICB7ICA2LCAweDAwMDEgfSwKKyAgICB7ICA3LCAweDAwMDEgfSwKKyAgICB7ICA4LCAweDAwMDEgfSwKKyAgICB7ICA5LCAweDAwMDEgfSwKKyAgICB7IDEwLCAweDAwMDEgfSwKKyAgICB7IDExLCAweDAwMDEgfSwKKyAgICB7ICAwLCAweDAwMDAgfQorfTsKKworY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddID0geworICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMSwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUyLCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTMsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNCwgCisgICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU1LCAKKyAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTYsIAorICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmVkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCkBAIC0wLDAgKzEsMTMzIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBjb21wYXJpbmcgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSAKKyAqIHRoZSBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKi8KKyAgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGZvciBhIGdpdmVuIHZhbHVlcworICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JICAgICAgICAgdmFsCVNpZ25lZCBudW1iZXIgZm9yIHdoaWNoIEV4cC1Hb2xvbWIgY29kZSBsZW5ndGggaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxjdWxhdGVkCisgKgorICogUmV0dXJuIFZhbHVlOiAKKyAqICAgICAgICAgICAgIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgRXhwLUdvbG9tYiBjb2RlIGZvciB2YWwKKyAqLworCitzdGF0aWMgT01YX1UxNiBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChPTVhfUzE2IHZhbCkKK3sKKyAgICBPTVhfVTE2IHNpemVDb2RlTnVtLCBjb2RlTnVtOworICAgIAorICAgIC8qIE1hcHBpbmcgdmFsIHRvIGNvZGVOdW0gKi8KKyAgICBjb2RlTnVtID0gYXJtQWJzICh2YWwpOworICAgIGlmICh2YWwgPiAwKQorICAgIHsKKyAgICAgICAgY29kZU51bSA9ICgyICogY29kZU51bSkgLSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2RlTnVtID0gMiAqIGNvZGVOdW07CisgICAgfQorICAgIAorICAgIC8qIFNpemUgb2YgdGhlIGV4cC1nb2xvbWIgY29kZSAqLworICAgIHNpemVDb2RlTnVtID0gKDIgKiBhcm1Mb2dTaXplIChjb2RlTnVtICsgMSkpIC0gMTsKKyAgICAKKyAgICByZXR1cm4gc2l6ZUNvZGVOdW07Cit9CisgICAgICAgICAgICAgICAgCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgTW90aW9uIGNvc3QgdG8gZGVjaWRlIHRoZSAKKyAqIGJlc3QgTVYgYW5kIGJlc3QgTUMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICAgICAgIG12WAl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKKyAqIFtpbl0JICAgICAgICAgbXZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IgaW4gMS80IHBlbCB1bml0cworICogW2luXQkgICAgICBkaWZmTVYJZGlmZmVyZW50aWFsIE1WCisgKiBbaW5dCSAgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECisgKiBbaW5dCSAgICAgIGJlc3RNVglCZXN0IE1WLCBjb250YWlucyBiZXN0IE1WIHRpbGwgdGhlIHByZXZpb3VzIGludGVyYXRpb24uCisgKiBbaW5dICAgICAgIG5MYW1kYSAgICBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqIFtpbl0gICAqcEJlc3RDb3N0ICAgIENvbnRhaW5zIHRoZSBjdXJyZW50IGJlc3QgbW90aW9uIGNvc3QuCisgKiBbb3V0XSAgKnBCZXN0Q29zdCAgICBwQmVzdENvc3QgTW90aW9uIGNvc3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVYgCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciBqdWRnZW1lbnQ7IAorICogICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgYXMgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViwgaWYgdGhlIGNhbmRDb3N0IGlzIGxlc3MgCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBiZXN0IGNvc3QgcGFzc2VkIHRoZW4gdGhlICpwQmVzdENvc3Qgd2lsbCBiZSBlcXVhbCB0byBjYW5kQ29zdAorICogW291dF0JICBiZXN0TVYJRmluYWxseSB3aWxsIGhhdmUgdGhlIGJlc3QgTVYgYWZ0ZXIgdGhlIGp1ZGdlbWVudC4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCBtb3Rpb24gY29zdCBpcyB0aGUgYmVzdCAKKyAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBtb3Rpb24gY29zdAorICovCisKK09NWF9JTlQgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKAorICAgIE9NWF9TMTYgIG12WCwKKyAgICBPTVhfUzE2ICBtdlksCisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpiZXN0TVYsIAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKSAKK3sKKyAgICBPTVhfUzMyIGNhbmRDb3N0OworICAgIE9NWF9VMTYgc2l6ZUNvZGVOdW07CisgICAgCisgICAgc2l6ZUNvZGVOdW0gPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHgpOworICAgIHNpemVDb2RlTnVtICs9IGFybVZDTTRQMTBfRXhwR29sQml0c1VzZWQgKGRpZmZNVi5keSk7CisgICAgCisgICAgLyogTW90aW9uIGNvc3QgPSBTQUQgKyAgbGFtZGEgKiAoKGJpdHN1c2VkKGRpZmZNVngpICsgKGJpdHN1c2VkKGRpZmZNVnkpKSovCisgICAgY2FuZENvc3QgPSBjYW5kU0FEICsgKG5MYW1kYSAqIHNpemVDb2RlTnVtKTsKKyAgICAgICAgCisgICAgLyogQ2FsY3VsYXRlIGNhbmRDb3N0ICovCisgICAgaWYgKGNhbmRDb3N0IDwgKnBCZXN0Q29zdCkKKyAgICB7CisgICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKKyAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKKyAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjYW5kQ29zdCA+ICpwQmVzdENvc3QpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCisgICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8ICgoYmVzdE1WLT5keCAqIGJlc3RNVi0+ZHgpICsgKGJlc3RNVi0+ZHkgKiBiZXN0TVYtPmR5KSkgKQorICAgIHsKKyAgICAgICAgKnBCZXN0Q29zdCA9IGNhbmRDb3N0OworICAgICAgICBiZXN0TVYtPmR4ID0gbXZYOworICAgICAgICBiZXN0TVYtPmR5ID0gbXZZOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmYjFkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCisgKiAKKyAqLworCisjaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUJMT0NLUElYRUwKKyN1bmRlZiBERUJVR19PTgorI2RlZmluZSBERUJVR19PTgorI2VuZGlmIC8qIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKKyAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKKyAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCisgKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKKyAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcworICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCisgKiAKKyAqLworCit2b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLworICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLworICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLworICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLworICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCisgICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KKyAgICBpbnQgQ2hyb21hRmxhZworKQoreworICAgIGludCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgICAgaW50IGFwLCBhcSwgZGVsdGE7CisKKyAgICBpZiAoYlM9PTApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcDMgPSBwUTBbLTQqU3RlcF07CisgICAgcDIgPSBwUTBbLTMqU3RlcF07CisgICAgcDEgPSBwUTBbLTIqU3RlcF07CisgICAgcDAgPSBwUTBbLTEqU3RlcF07CisgICAgcTAgPSBwUTBbIDAqU3RlcF07CisgICAgcTEgPSBwUTBbIDEqU3RlcF07CisgICAgcTIgPSBwUTBbIDIqU3RlcF07CisgICAgcTMgPSBwUTBbIDMqU3RlcF07CisKKyAgICBpZiAoYXJtQWJzKHAwLXEwKT49YWxwaGEgfHwgYXJtQWJzKHAxLXAwKT49YmV0YSB8fCBhcm1BYnMocTEtcTApPj1iZXRhKQorICAgIHsKKyAgICAgICAgREVCVUdfUFJJTlRGXzEwKCJEZUJsb2NrUGl4ZWw6ICUwMnggJTAyeCAlMDJ4ICUwMnggfCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGFscGhhPSVkIGJldGE9JWRcbiIsCisgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGFscGhhLCBiZXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFwID0gYXJtQWJzKHAyIC0gcDApOworICAgIGFxID0gYXJtQWJzKHEyIC0gcTApOworCisgICAgaWYgKGJTIDwgNCkKKyAgICB7CisgICAgICAgIGludCB0QyA9IHRDMDsKKworICAgICAgICBpZiAoQ2hyb21hRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcCA8IGJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcSA8IGJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdEMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QywgdEMsIGRlbHRhKTsKKworICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBwMCArIGRlbHRhKTsKKyAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOworICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOworICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcTxiZXRhKQorICAgICAgICB7CisgICAgICAgICAgICBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KShxMSArIGRlbHRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGJTPT00ICovCisgICAgeworICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMpOworICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOworICAgICAgICAgICAgcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDEgKyBwMCArIHExICsgMik+PjIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQorICAgICAgICB7CisgICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zKTsKKyAgICAgICAgICAgIHBRMFsgMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcDAgKyBxMCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBRMFsgMipTdGVwXSA9IChPTVhfVTgpKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpKCgyKnExICsgcTAgKyBwMSArIDIpPj4yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFQlVHX1BSSU5URl8xMygiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBiUz0lZCAtPiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGJTLAorICAgICAgICBwUTBbLTIqU3RlcF0sIHBRMFstMSpTdGVwXSxwUTBbMCpTdGVwXSxwUTBbMSpTdGVwXSk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTZhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVIKKyN1bmRlZiBERUJVR19PTgorI2RlZmluZSBERUJVR19PTgorI2VuZGlmCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgorCisvKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KKworc3RhdGljIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ1sxNl0gPQoreworICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAorICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KKyAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQorICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KKyAqCQkJCQkJCQl0aGlzIGJsb2NrCisgKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKKyAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKworICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTggICoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICkKK3sKKyAgICBpbnQgQ29lZmZUb2tlbiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzOworICAgIGludCBMZXZlbCwgTGV2ZWxDb2RlLCBMZXZlbFByZWZpeCwgTGV2ZWxTdWZmaXgsIExldmVsU3VmZml4U2l6ZTsKKyAgICBpbnQgU3VmZml4TGVuZ3RoLCBSdW4sIFplcm9zTGVmdCxDb2VmZk51bTsKKyAgICBpbnQgaSwgRmxhZ3M7CisgICAgT01YX1U4ICpwUG9zQ29lZmJ1ZiA9ICpwcFBvc0NvZWZidWY7CisgICAgT01YX1MxNiBwTGV2ZWxbMTZdOworICAgIE9NWF9VOCAgcFJ1blsxNl07CisKKyAgICBDb2VmZlRva2VuID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzW25UYWJsZV0pOworICAgIGFybVJldERhdGFFcnJJZihDb2VmZlRva2VuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworCisgICAgVHJhaWxpbmdPbmVzID0gYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1tDb2VmZlRva2VuXTsKKyAgICBUb3RhbENvZWZmICAgPSBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZltDb2VmZlRva2VuXTsKKyAgICAqcE51bUNvZWZmICAgPSAoT01YX1U4KVRvdGFsQ29lZmY7CisKKyAgICBERUJVR19QUklOVEZfMigiVG90YWxDb2VmZiA9ICVkLCBUcmFpbGluZ09uZXMgPSAlZFxuIiwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzKTsKKworICAgIGlmIChUb3RhbENvZWZmID09IDApCisgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIC8qIERlY29kZSB0cmFpbGluZyBvbmVzICovCisgICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT49VG90YWxDb2VmZi1UcmFpbGluZ09uZXM7IGktLSkKKyAgICB7CisgICAgICAgIGlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWwgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExldmVsID0gKzE7CisgICAgICAgIH0KKyAgICAgICAgcExldmVsW2ldID0gKE9NWF9TMTYpTGV2ZWw7CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIkxldmVsWyVkXSA9ICVkXG4iLCBpLCBwTGV2ZWxbaV0pOworICAgIH0KKworICAgIC8qIERlY29kZSAobm9uIHplcm8pIGxldmVsIHZhbHVlcyAqLworICAgIFN1ZmZpeExlbmd0aCA9IDA7CisgICAgaWYgKFRvdGFsQ29lZmY+MTAgJiYgVHJhaWxpbmdPbmVzPDMpCisgICAgeworICAgICAgICBTdWZmaXhMZW5ndGg9MTsKKyAgICB9CisgICAgZm9yICggOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICBMZXZlbFByZWZpeCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXgpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoTGV2ZWxQcmVmaXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gU3VmZml4TGVuZ3RoOworICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE0ICYmIFN1ZmZpeExlbmd0aD09MCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXhTaXplID0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWxQcmVmaXg9PTE1KQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbFN1ZmZpeFNpemUgPSAxMjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTGV2ZWxTdWZmaXggPSAwOworICAgICAgICBpZiAoTGV2ZWxTdWZmaXhTaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTGV2ZWxTdWZmaXggPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBMZXZlbFN1ZmZpeFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgTGV2ZWxDb2RlID0gKExldmVsUHJlZml4IDw8IFN1ZmZpeExlbmd0aCkgKyBMZXZlbFN1ZmZpeDsKKworCisgICAgICAgIGlmIChMZXZlbFByZWZpeD09MTUgJiYgU3VmZml4TGVuZ3RoPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBMZXZlbENvZGUgKz0gMTU7CisgICAgICAgIH0KKworICAgICAgICAvKiBMZXZlbENvZGUgPSAyKihtYWduaXR1ZGUtMSkgKyBzaWduICovCisKKyAgICAgICAgaWYgKGk9PVRvdGFsQ29lZmYtMS1UcmFpbGluZ09uZXMgJiYgVHJhaWxpbmdPbmVzPDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIExldmVsIG1hZ25pdHVkZSBjYW4ndCBiZSAxICovCisgICAgICAgICAgICBMZXZlbENvZGUgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWxDb2RlICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMmErMSBtYXBzIHRvIC1hLTEgKi8KKyAgICAgICAgICAgIExldmVsID0gKC1MZXZlbENvZGUtMSk+PjE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyYSswIG1hcHMgdG8gK2ErMSAqLworICAgICAgICAgICAgTGV2ZWwgPSAoTGV2ZWxDb2RlKzIpPj4xOworICAgICAgICB9CisgICAgICAgIHBMZXZlbFtpXSA9IChPTVhfUzE2KUxldmVsOworCisgICAgICAgIERFQlVHX1BSSU5URl8yKCJMZXZlbFslZF0gPSAlZFxuIiwgaSwgcExldmVsW2ldKTsKKworICAgICAgICBpZiAoU3VmZml4TGVuZ3RoPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBTdWZmaXhMZW5ndGg9MTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYgKQorICAgICAgICB7CisgICAgICAgICAgICBTdWZmaXhMZW5ndGgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERlY29kZSBydW4gdmFsdWVzICovCisgICAgWmVyb3NMZWZ0ID0gMDsKKyAgICBpZiAoVG90YWxDb2VmZiA8IHNNYXhOdW1Db2VmZikKKyAgICB7CisgICAgICAgIC8qIERlY29kZSBUb3RhbFplcm9zIFZMQyAqLworICAgICAgICBpZiAoc01heE51bUNvZWZmPT00KQorICAgICAgICB7CisgICAgICAgICAgICBaZXJvc0xlZnQgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbVG90YWxDb2VmZi0xXSk7CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoWmVyb3NMZWZ0ID09QVJNX05PX0NPREVCT09LX0lOREVYICwgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWmVyb3NMZWZ0ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbVG90YWxDb2VmZi0xXSk7CisgICAgICAgICAgICAgYXJtUmV0RGF0YUVycklmKFplcm9zTGVmdCA9PUFSTV9OT19DT0RFQk9PS19JTkRFWCAsIE9NWF9TdHNfRXJyKTsKKwkgICAgfQorICAgIH0KKworICAgIERFQlVHX1BSSU5URl8xKCJUb3RhbFplcm9zID0gJWRcbiIsIFplcm9zTGVmdCk7CisKKwlDb2VmZk51bT1aZXJvc0xlZnQrVG90YWxDb2VmZi0xOworCisgICAgZm9yIChpPVRvdGFsQ29lZmYtMTsgaT4wOyBpLS0pCisgICAgeworICAgICAgICBSdW4gPSAwOworICAgICAgICBpZiAoWmVyb3NMZWZ0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IFRhYmxlID0gWmVyb3NMZWZ0OworICAgICAgICAgICAgaWYgKFRhYmxlID4gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUYWJsZSA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSdW4gPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1tUYWJsZS0xXSk7CisgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoUnVuID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOworICAgICAgICB9CisgICAgICAgIHBSdW5baV0gPSAoT01YX1U4KVJ1bjsKKworICAgICAgICBERUJVR19QUklOVEZfMigiUnVuWyVkXSA9ICVkXG4iLCBpLCBwUnVuW2ldKTsKKworICAgICAgICBaZXJvc0xlZnQgLT0gUnVuOworICAgIH0KKyAgICBwUnVuWzBdID0gKE9NWF9VOClaZXJvc0xlZnQ7CisKKyAgICBERUJVR19QUklOVEZfMSgiUnVuWzBdID0gJWRcbiIsIHBSdW5baV0pOworCisKKyAgICAvKiBGaWxsIGluIGNvZWZmaWNpZW50cyAqLworCSAgICAKKyAgICBpZiAoc01heE51bUNvZWZmPT0xNSkKKyAgICB7CisgICAgICAgIENvZWZmTnVtKys7IC8qIFNraXAgdGhlIERDIHBvc2l0aW9uICovCisgICAgfQorCQorCS8qZm9yIChpPTA7aTxUb3RhbENvZWZmO2krKykKKwkJQ29lZmZOdW0gKz0gcFJ1bltpXSsxOyovCisgICAgCisJZm9yIChpPShUb3RhbENvZWZmLTEpOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICAvKkNvZWZmTnVtICs9IHBSdW5baV0rMTsqLworICAgICAgICBMZXZlbCAgICAgPSBwTGV2ZWxbaV07CisKKyAgICAgICAgREVCVUdfUFJJTlRGXzIoIkNvZWZbJWRdID0gJWRcbiIsIENvZWZmTnVtLCBMZXZlbCk7CisKKyAgICAgICAgRmxhZ3MgPSBDb2VmZk51bTsKKwkJQ29lZmZOdW0gLT0gKHBSdW5baV0rMSk7CisgICAgICAgIGlmIChzTWF4TnVtQ29lZmY+NCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUGVyZm9ybSA0eDQgRGVaaWdaYWcgKi8KKyAgICAgICAgICAgIEZsYWdzID0gYXJtVkNNNFAxMF9aaWdaYWdbRmxhZ3NdOworICAgICAgICB9CisgICAgICAgIGlmIChpPT0wKQorICAgICAgICB7ICAgCisgICAgICAgICAgICAvKiBFbmQgb2YgYmxvY2sgZmxhZyAqLworICAgICAgICAgICAgRmxhZ3MgKz0gMHgyMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTGV2ZWw8LTEyOCB8fCBMZXZlbD4xMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJmbG93IGZsYWcgKi8KKyAgICAgICAgICAgIEZsYWdzICs9IDB4MTA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoRmxhZ3MpOworICAgICAgICAqcFBvc0NvZWZidWYrKyA9IChPTVhfVTgpKExldmVsICYgMHhGRik7CisgICAgICAgIGlmIChGbGFncyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoTGV2ZWw+PjgpOworICAgICAgICB9CisgICAgfQorCisgICAgKnBwUG9zQ29lZmJ1ZiA9IHBQb3NDb2VmYnVmOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzI1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSB0YWJsZXMKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XSA9IAoreworICAgIDAsIDIsIDAsIDIsCisgICAgMiwgMSwgMiwgMSwKKyAgICAwLCAyLCAwLCAyLAorICAgIDIsIDEsIDIsIDEKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4Mls0XSA9IAoreworICAgIDAsIDIsCisgICAgMiwgMQorfTsKKworY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXSA9Cit7CisgICAgeyAxMCwgMTYsIDEzIH0sCisgICAgeyAxMSwgMTgsIDE0IH0sCisgICAgeyAxMywgMjAsIDE2IH0sCisgICAgeyAxNCwgMjMsIDE4IH0sCisgICAgeyAxNiwgMjUsIDIwIH0sCisgICAgeyAxOCwgMjksIDIzIH0KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNTRjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisgCisvKgorICogRGVzY3JpcHRpb246CisgKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKKyAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jaworICoKKyAqLwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQorICAgIHsKKyAgICAgICAgaW50IGQwID0gcFNyY1tpKzBdOworICAgICAgICBpbnQgZDEgPSBwU3JjW2krMV07CisgICAgICAgIGludCBkMiA9IHBTcmNbaSsyXTsKKyAgICAgICAgaW50IGQzID0gcFNyY1tpKzNdOworICAgICAgICBpbnQgZTAgPSBkMCArIGQzOworICAgICAgICBpbnQgZTEgPSBkMCAtIGQzOworICAgICAgICBpbnQgZTIgPSBkMSArIGQyOworICAgICAgICBpbnQgZTMgPSBkMSAtIGQyOworICAgICAgICBpbnQgZjAgPSBlMCArIGUyOworICAgICAgICBpbnQgZjEgPSAoZTEgPDwgMSkgKyBlMzsKKyAgICAgICAgaW50IGYyID0gZTAgLSBlMjsKKyAgICAgICAgaW50IGYzID0gZTEgLSAoZTMgPDwgMSk7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOworICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKKyAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7CisgICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOworICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07CisgICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKKyAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKKyAgICAgICAgaW50IGcwID0gZjAgKyBmMzsKKyAgICAgICAgaW50IGcxID0gZjAgLSBmMzsKKyAgICAgICAgaW50IGcyID0gZjEgKyBmMjsKKyAgICAgICAgaW50IGczID0gZjEgLSBmMjsKKyAgICAgICAgaW50IGgwID0gZzAgKyBnMjsKKyAgICAgICAgaW50IGgxID0gKGcxIDw8IDEpICsgZzM7CisgICAgICAgIGludCBoMiA9IGcwIC0gZzI7CisgICAgICAgIGludCBoMyA9IGcxIC0gKGczIDw8IDEpOworICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikgaDA7CisgICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSBoMTsKKyAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpIGgyOworICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpIGgzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzJmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb25zIHdpbGwgaGVscCB0byBjYWxjdWxhdGUgSGFsZiBQZWwgbHVtYSBpbnRlcnBvbGF0aW9uCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKyAgICBPTVhfUzE2ICAgICBCdWYgWzIxICogMTZdOyAgLyogMjEgcm93cyBieSAxNiBwaXhlbHMgcGVyIHJvdyAqLworICAgIE9NWF9VMzIgICAgIHksIHg7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YWx1ZXMgd2lsbCBiZSAxLzIgcGVsIGF0IEhvcml6b250YWwgZGlyZWN0aW9uCisgICAgICogU3RhcnRpbmcgYXQgKDAuNSwgLTIpIGF0IHRvcCBleHRlbmRpbmcgdG8gKDAuNSwgaGVpZ2h0ICsgMykgYXQgYm90dG9tCisgICAgICogQnVmIGNvbnRhaW5zIGEgMkQgYXJyYXkgb2Ygc2l6ZSAoaVdpZHRoKVgoaUhlaWdodCArIDUpCisgICAgICovCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQgKyA1OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9ICh5LTIpICogaVNyY1N0ZXAgKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMl0gLSAKKyAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zIC0gMV0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3Bvc10gKyAKKyAgICAgICAgICAgICAgICAyMCAqIHBTcmMgW3BvcyArIDFdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDJdICsgCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zICsgM107CisgICAgICAgICAgICBCdWYgW3kgKiBpV2lkdGggKyB4XSA9IChPTVhfUzE2KUhhbGZDb2VmZjsKKyAgICAgICAgfSAvKiB4ICovCisgICAgfSAvKiB5ICovCisKKyAgICAvKiBWZXJ0aWNhbCBpbnRlcnBvbGF0ZSAqLworICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcyA9IHkgKiBpV2lkdGggKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgQnVmIFtwb3NdIC0gCisgICAgICAgICAgICAgICAgNSAqIEJ1ZiBbcG9zICsgMSAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMiAqIGlXaWR0aF0gKyAKKyAgICAgICAgICAgICAgICAyMCAqIEJ1ZiBbcG9zICsgMyAqIGlXaWR0aF0gLSAKKyAgICAgICAgICAgICAgICA1ICogQnVmIFtwb3MgKyA0ICogaVdpZHRoXSArIAorICAgICAgICAgICAgICAgIEJ1ZiBbcG9zICsgNSAqIGlXaWR0aF07CisKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IChIYWxmQ29lZmYgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7CisKKyAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKE9NWF9VOCkgSGFsZkNvZWZmOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWMwMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcG9zID0geSAqIGlTcmNTdGVwICsgeDsKKyAgICAgICAgICAgIEhhbGZDb2VmZiA9IAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyAtIDJdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyAtIDFdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgKyAyXSArIAorICAgICAgICAgICAgICAgIHBTcmMgW3BvcyArIDNdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKKworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBIYWxmQ29lZmY7CisgICAgICAgIH0gLyogeCAqLworICAgIH0gLyogeSAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VjZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKKyAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgIAorICAgICBjb25zdCBPTVhfVTgqICAgIHBTcmMsIAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLCAKKyAgICAgT01YX1U4KiAgICBwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsIAorICAgICBPTVhfVTMyICAgIGlIZWlnaHQKKykKK3sKKyAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKKyAgICBPTVhfSU5UICAgICB5LCB4OworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSB5ICogaVNyY1N0ZXAgKyB4OworICAgICAgICAgICAgSGFsZkNvZWZmID0gCisgICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMiAqIGlTcmNTdGVwXSAtIAorICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxICogaVNyY1N0ZXBdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCisgICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxICogaVNyY1N0ZXBdIC0gCisgICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDIgKiBpU3JjU3RlcF0gKyAKKyAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzICogaVNyY1N0ZXBdOworCisgICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7CisgICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKKworICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSAoT01YX1U4KSBIYWxmQ29lZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDdkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispCit7CisgICAgT01YX1UzMiAgICAgRWlnaHRNaW51c2R4ID0gOCAtIGR4OworICAgIE9NWF9VMzIgICAgIEVpZ2h0TWludXNkeSA9IDggLSBkeTsKKyAgICBPTVhfVTMyICAgICBBQ29lZmYsIEJDb2VmZiwgQ0NvZWZmLCBEQ29lZmY7CisgICAgT01YX1UzMiAgICAgeCwgeTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY1N0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaURzdFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVdpZHRoID09IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlIZWlnaHQgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisgICAgLyogaWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkgKi8KKyAgICBpZiAoZHggIT0gMCB8fCBkeSAhPSAwKQorICAgIHsKKyAgICAgICAgQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5OworICAgICAgICBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeTsKKyAgICAgICAgQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHk7CisgICAgICAgIERDb2VmZiA9IGR4ICogZHk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gKAorICAgICAgICAgICAgICAgICAgICBBQ29lZmYgKiBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XSArCisgICAgICAgICAgICAgICAgICAgIEJDb2VmZiAqIHBTcmMgW3kgKiBpU3JjU3RlcCArIHggKyAxXSArCisgICAgICAgICAgICAgICAgICAgIENDb2VmZiAqIHBTcmMgWyh5ICsgMSkgKiBpU3JjU3RlcCArIHhdICsKKyAgICAgICAgICAgICAgICAgICAgRENvZWZmICogcFNyYyBbKHkgKyAxKSAqIGlTcmNTdGVwICsgeCArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgMzIpID4+IDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gcFNyYyBbeSAqIGlTcmNTdGVwICsgeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5NzhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cworICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NNFAxMF9Db3B5CisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1NNFAxMF9Db3B5KCAgCisgICAgY29uc3QgT01YX1U4KiAgICAgcFNyYywKKyAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKKyAgICBPTVhfVTgqICAgICBwRHN0LAorICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKKyAgICBPTVhfVTMyICAgICBpV2lkdGgsCisgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIE9NWF9VMzIgICAgIHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0IFt5ICogaURzdFN0ZXAgKyB4XSA9IHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgorICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQgKDB+MykgCisgKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisKKyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICBjb25zdCBPTVhfVTggICAgICpwU3JjLAorICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLAorICAgICBPTVhfVTggICAgICpwRHN0LAorICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwKKyAgICAgT01YX1UzMiAgICBpSGVpZ2h0LAorICAgICBPTVhfVTMyICAgIGR4LAorICAgICBPTVhfVTMyICAgIGR5CispCit7CisgICAgT01YX1U4ICAgICAgcEJ1ZjEgWzE2KjE2XTsKKyAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZIb3IgPSBwU3JjOworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwU3JjSGFsZlZlciA9IHBTcmM7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogV29yayBvdXQgcG9zaXRpb25zIGZvciBoYWxmIHBpeGVsIGludGVycG9sYXRpb24gKi8KKyAgICBpZiAoZHggPT0gMykKKyAgICB7CisgICAgICAgIHBTcmNIYWxmVmVyICs9IDE7CisgICAgfQorICAgIGlmIChkeSA9PSAzKQorICAgIHsKKyAgICAgICAgcFNyY0hhbGZIb3IgKz0gaVNyY1N0ZXA7CisgICAgfQorCisgICAgLyogU3dpdGNoIG9uIHR5cGUgb2YgcGl4ZWwKKyAgICAgKiBQaXhlbHMgYXJlIG5hbWVkICdhJyB0byAncycgYXMgaW4gdGhlIEguMjY0IHN0YW5kYXJkCisgICAgICovCisgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIEcgKi8KKyAgICAgICAgYXJtTTRQMTBfQ29weShwU3JjLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgfQorICAgIGVsc2UgaWYgKGR5ID09IDApCisgICAgeworICAgICAgICAvKiBhLCBiLCBjICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKGR4ID09IDEgfHwgZHggPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBTcmNIYWxmVmVyLCBpRHN0U3RlcCwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGR4ID09IDApCisgICAgeworICAgICAgICAvKiBkLCBoLCBuICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAgICAgICAgICAgIChwU3JjSGFsZlZlciwgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgIGlmIChkeSA9PSAxIHx8IGR5ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAorICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZkhvciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAyIHx8IGR5ID09IDIpCisgICAgeworICAgICAgICAvKiBqICovCisgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hCisgICAgICAgICAgICAocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGksIGsgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAgICAgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCisgICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmLHEgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKKyAgICAgICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwQnVmMSwgaVdpZHRoLCBpV2lkdGgsIGlIZWlnaHQpOworCisgICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgICAgICAocERzdCwgcEJ1ZjEsIGlEc3RTdGVwLCBpV2lkdGgsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogZHg9MSwzIGFuZCBkeT0xLDMgKi8KKyAgICB7CisgICAgICAgIC8qIGUsIGcsIHAsIHIgKi8KKyAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQorICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCisgICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKKworICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgICAgIChwQnVmMSwgcERzdCwgaVdpZHRoLCBpRHN0U3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTMwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKQEAgLTAsMCArMSw4OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCA0eDQgaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgIHsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBpZiAoQ291bnQ9PTApCisgICAgeworICAgICAgICBTdW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UgaWYgKENvdW50PT0xKQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UgLyogQ291bnQgPSAyICovCisgICAgeworICAgICAgICBTdW0gPSAoU3VtICsgNCkgPj4gMzsKKyAgICB9CisgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjViYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKQEAgLTAsMCArMSwzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIHRhYmxlcworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCitjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM10gPQoreworICAgIHsxMzEwNywgNTI0MywgODA2Nn0sCisgICAgezExOTE2LCA0NjYwLCA3NDkwfSwKKyAgICB7MTAwODIsIDQxOTQsIDY1NTR9LAorICAgIHsgOTM2MiwgMzY0NywgNTgyNX0sCisgICAgeyA4MTkyLCAzMzU1LCA1MjQzfSwKKyAgICB7IDcyODIsIDI4OTMsIDQ1NTl9Cit9OyAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxZTA0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1NBRFF1YXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX1NBRFF1YXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIAorICogYXZlcmFnZSBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpCisgKgorICogUmVtYXJrczoKKyAqCisgKiBbaW5dCQlwU3JjCQkJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCisgKiBbaW5dCQlwU3JjUmVmMAkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMAorICogW2luXQkJcFNyY1JlZjEJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEKKyAqIFtpbl0JCWlTcmNTdGVwIAkJU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpUmVmU3RlcDAJCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiBbaW5dCQlpUmVmU3RlcDEgCVN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiBbaW5dCQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9jaworICogW2luXQkJaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrCisgKiBbb3V0XQlwRHN0U0FECQkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDTTRQMTBfU0FEUXVhcigKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICBPTVhfVTMyICAgICBpV2lkdGgKKykKK3sKKyAgICBPTVhfSU5UICAgICB4LCB5OworICAgIE9NWF9TMzIgICAgIFNBRCA9IDA7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTQUQgKz0gYXJtQWJzKHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdIC0gKCgKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZjAgW3kgKiBpUmVmU3RlcDAgKyB4XSArIAorICAgICAgICAgICAgICAgICAgICBwU3JjUmVmMSBbeSAqIGlSZWZTdGVwMSArIHhdICsgMSkgPj4gMSkpOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAqcERzdFNBRCA9IFNBRDsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Zjc1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKQEAgLTAsMCArMSw4MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCB0cmFuc2Zvcm0gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKQoreworICAgIGludCBpOworCisgICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKKyAgICB7CisgICAgICAgIGludCBkMCA9IHBTcmNbaSswXTsKKyAgICAgICAgaW50IGQxID0gcFNyY1tpKzFdOworICAgICAgICBpbnQgZDIgPSBwU3JjW2krMl07CisgICAgICAgIGludCBkMyA9IHBTcmNbaSszXTsKKyAgICAgICAgaW50IGUwID0gZDAgKyBkMjsKKyAgICAgICAgaW50IGUxID0gZDAgLSBkMjsKKyAgICAgICAgaW50IGUyID0gKGQxPj4xKSAtIGQzOworICAgICAgICBpbnQgZTMgPSBkMSArIChkMz4+MSk7CisgICAgICAgIGludCBmMCA9IGUwICsgZTM7CisgICAgICAgIGludCBmMSA9IGUxICsgZTI7CisgICAgICAgIGludCBmMiA9IGUxIC0gZTI7CisgICAgICAgIGludCBmMyA9IGUwIC0gZTM7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOworICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKKyAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7CisgICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOworICAgIH0KKworICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgIHsKKyAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOworICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07CisgICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKKyAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKKyAgICAgICAgaW50IGcwID0gZjAgKyBmMjsKKyAgICAgICAgaW50IGcxID0gZjAgLSBmMjsKKyAgICAgICAgaW50IGcyID0gKGYxPj4xKSAtIGYzOworICAgICAgICBpbnQgZzMgPSBmMSArIChmMz4+MSk7CisgICAgICAgIGludCBoMCA9IGcwICsgZzM7CisgICAgICAgIGludCBoMSA9IGcxICsgZzI7CisgICAgICAgIGludCBoMiA9IGcxIC0gZzI7CisgICAgICAgIGludCBoMyA9IGcwIC0gZzM7CisgICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KSgoaDArMzIpPj42KTsKKyAgICAgICAgcERzdFtpKzRdID0gKE9NWF9TMTYpKChoMSszMik+PjYpOworICAgICAgICBwRHN0W2krOF0gPSAoT01YX1MxNikoKGgyKzMyKT4+Nik7CisgICAgICAgIHBEc3RbaSsxMl0gPSAoT01YX1MxNikoKGgzKzMyKT4+Nik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhNDlmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKgorICogRGVzY3JpcHRpb24KKyAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKKyAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZworICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCisgKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCisgKi8KKwordm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdAorKQoreworICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgRmxhZywgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBwRHN0W2ldID0gMDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgRmxhZyAgPSAqcFNyYysrOworICAgICAgICBpZiAoRmxhZyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA4IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpID0gRmxhZyAmIDE1OworICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgfQorICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKKworICAgICpwcFNyYyA9IHBTcmM7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwZGNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwpAQCAtMCwwICsxLDc4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBoZWxwZXIgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispCit7CisgICAgY29uc3QgT01YX1U4ICpwU3JjID0gKnBwU3JjOworICAgIGludCBpOworICAgIGludCBGbGFnLCBWYWx1ZTsKKworICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBwRHN0W2ldID0gMDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgRmxhZyAgPSAqcFNyYysrOworICAgICAgICBpZiAoRmxhZyAmIDB4MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA4IGJpdCAqLworICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOworICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpID0gRmxhZyAmIDE1OworICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgfQorICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKKworICAgICpwcFNyYyA9IHBTcmM7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGQ1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIDR4NCBvciA0eDggYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCisJIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQorCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAorCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAorCSBPTVhfVTgqCQlwRHN0UHJlZCwKKwkgT01YX1UzMgkJaURzdFN0ZXAsIAorCSBPTVhfVTMyCQlpSGVpZ2h0CispCit7CisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA0KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDAgPT0gMCkgfHwgKGlQcmVkU3RlcDAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlQcmVkU3RlcDEgPT0gMCkgfHwgKGlQcmVkU3RlcDEgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIHJldHVybiBhcm1WQ0NPTU1fQXZlcmFnZSAKKyAgICAgICAgKHBQcmVkMCwgcFByZWQxLCBpUHJlZFN0ZXAwLCBpUHJlZFN0ZXAxLCBwRHN0UHJlZCwgaURzdFN0ZXAsIDQsIGlIZWlnaHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5MGUxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGhhbGYgcGVsIEJsb2NrIG1hdGNoaW5nLCAKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKyAgICAKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAorICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCisgKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKKyAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCitPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCisgICAgY29uc3QgT01YX1U4KiBwU3JjT3JnWSwgCisgICAgT01YX1MzMiBuU3JjT3JnU3RlcCwgCisgICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCisgICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLCAKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LCAKKyAgICBPTVhfVTMyIG5MYW1kYSwgCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBNVlByZWQsIAorICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjRHN0QmVzdE1WLCAKKyAgICBPTVhfUzMyKiBwQmVzdENvc3QKKykKK3sKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UICAgICBjYW5kU0FEOworICAgIE9NWF9JTlQgICAgIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOworICAgIE9NWF9TMTYgICAgIHgsIHk7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCBjYW5kTVYsIGludGVnZXJNVjsKKyAgICBPTVhfVTggICAgICBpbnRlcnBvbFlbMjU2XTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAorICAgIGZyb21YID0gMTsKKyAgICB0b1ggICA9IDE7CisgICAgZnJvbVkgPSAxOworICAgIHRvWSAgID0gMTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgaW50ZWdlck1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7CisgICAgaW50ZWdlck1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGludGVnZXJNVi5keS80KSkgKyAoaW50ZWdlck1WLmR4LzQpOworICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArIHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZICsgKHkgKiBuU3JjUmVmU3RlcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUHJlcGFyZSBjYW5kIE1WICovCisgICAgICAgICAgICBjYW5kTVYuZHggPSBpbnRlZ2VyTVYuZHggKyB4ICogMjsKKyAgICAgICAgICAgIGNhbmRNVi5keSA9IGludGVnZXJNVi5keSArIHkgKiAyOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBoYWxmIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLworICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgYXJtQWJzKHgpICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh5KSAqIDIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7CisgCisgICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzY0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCkBAIC0wLDAgKzEsMTk2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KKyAqIGlzIGltcGxlbWVudGVkCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jay4gSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlLiBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCisgKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCisgKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCisgKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCisgKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAorICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaXRuZXJzIGFyZSBOVUxMOgorICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAorICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KKyAKKyBPTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAorICAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorCSBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwkgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAorICAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgIHZvaWQgKnBNRVNwZWMKKykKK3sKKyAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KKyAgICBPTVhfSU5UIGNhbmRTQUQ7CisgICAgT01YX0lOVCBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7CisgICAgT01YX1MxNiB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNVjsKKyAgICBPTVhfUzMyIG5TZWFyY2hSYW5nZTsKKyAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WQ2FuZGlkYXRlID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1JZ25vcmUgKHBNRVNwZWMpOworCisgICAgaWYoaUJsb2NrV2lkdGggPT0gNCkKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQ7CisgICAgfQorICAgIGVsc2UgaWYoaUJsb2NrV2lkdGggPT0gOCkKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5TZWFyY2hSYW5nZSA9IGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNjsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKKyAgICBmcm9tWCA9IG5TZWFyY2hSYW5nZTsKKyAgICB0b1ggICA9IG5TZWFyY2hSYW5nZTsKKyAgICBmcm9tWSA9IG5TZWFyY2hSYW5nZTsKKyAgICB0b1kgICA9IG5TZWFyY2hSYW5nZTsKKyAgICAKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPngpCisgICAgeworICAgICAgICBmcm9tWCA9ICBwQ3VyclBvaW50UG9zLT54IC0gcFJlZlJlY3QtPng7CisgICAgfQorCisgICAgaWYgKChwQ3VyclBvaW50UG9zLT54ICsgaUJsb2NrV2lkdGggKyBuU2VhcmNoUmFuZ2UpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHRvWCAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eCkgLSBpQmxvY2tXaWR0aDsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBuU2VhcmNoUmFuZ2UpIDwgcFJlZlJlY3QtPnkpCisgICAgeworICAgICAgICBmcm9tWSA9IHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgKyBpQmxvY2tXaWR0aCArIG5TZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnkgKyBwUmVmUmVjdC0+aGVpZ2h0KSkKKyAgICB7CisgICAgICAgIHRvWSAgID0gcFJlZlJlY3QtPndpZHRoIC0gKHBDdXJyUG9pbnRQb3MtPnkgLSBwUmVmUmVjdC0+eSkgLSBpQmxvY2tXaWR0aDsKKyAgICB9CisgICAgCisgICAgcEJlc3RNVi0+ZHggPSAtZnJvbVggKiA0OworICAgIHBCZXN0TVYtPmR5ID0gLWZyb21ZICogNDsKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogeSkgKyB4OworICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKKyAgICAJICAgICAgICBwVGVtcFNyY09yZ1ksCisgICAgCSAgICAgICAgblNyY09yZ1N0ZXAsCisgICAgCSAgICAgICAgcFRlbXBTcmNSZWZZLAorICAgIAkgICAgICAgIG5TcmNSZWZTdGVwLAorICAgIAkgICAgICAgICZjYW5kU0FELAorICAgIAkgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAJICAgICAgICBpQmxvY2tXaWR0aCk7CisgICAgCSAgICAKKyAgICAgICAgICAgIGRpZmZNVi5keCA9ICh4ICogNCkgLSBwTVZQcmVkLT5keDsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9ICh5ICogNCkgLSBwTVZQcmVkLT5keTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYgKCh4ICogNCksICh5ICogNCksIGRpZmZNViwgY2FuZFNBRCwgcEJlc3RNViwgbkxhbWRhLCBwQmVzdENvc3QpOworCisgICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KKyAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNlZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIuYwpAQCAtMCwwICsxLDE5OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgcXVhdGVyIHBlbCBCbG9jayBtYXRjaGluZywgCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorIAorICAgIAorLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCisgKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKKyAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKKyAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKKyAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKKyAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworIAorT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY09yZ1ksIAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsIAorICAgIGNvbnN0IE9NWF9VOCogcFNyY1JlZlksIAorICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsIAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwgCisgICAgT01YX1U4IGlCbG9ja0hlaWdodCwgCisgICAgT01YX1UzMiBuTGFtZGEsIAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwTVZQcmVkLCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0RzdEJlc3RNViwgCisgICAgT01YX1MzMiogcEJlc3RDb3N0CispCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX0lOVCAgICAgY2FuZFNBRDsKKyAgICBPTVhfSU5UICAgICBmcm9tWCwgdG9YLCBmcm9tWSwgdG9ZOworICAgIC8qIE9mZnNldCB0byB0aGUgcmVmZXJlbmNlIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgYm91bmRpbmcgYm94ICovCisgICAgY29uc3QgT01YX1U4ICAgICAgKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKKyAgICBPTVhfUzE2ICAgICB4LCB5OworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgY2FuZE1WLCBpbml0aWFsTVY7CisgICAgT01YX1U4ICAgICAgaW50ZXJwb2xZWzI1Nl07CisgICAgT01YX1MzMiAgICAgcGVsUG9zWCwgcGVsUG9zWTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgCisgICAgICAgICAgICAKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAorICAgIGZyb21YID0gMTsKKyAgICB0b1ggICA9IDE7CisgICAgZnJvbVkgPSAxOworICAgIHRvWSAgID0gMTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCisgICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7CisgICAgCisgICAgaW5pdGlhbE1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7CisgICAgaW5pdGlhbE1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7CisgICAgCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGluaXRpYWxNVi5keS80KSkgKyAoaW5pdGlhbE1WLmR4LzQpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZnJhY3QgcGVsIHBvc2l0aW9uICovCisgICAgICAgICAgICBwZWxQb3NYID0gKGluaXRpYWxNVi5keCAlIDQpICsgeDsKKyAgICAgICAgICAgIGlmIChwZWxQb3NYIDwgMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gMTsKKyAgICAgICAgICAgICAgICBwZWxQb3NYICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZWxQb3NZID0gKGluaXRpYWxNVi5keSAlIDQpICsgeTsKKyAgICAgICAgICAgIGlmIChwZWxQb3NZIDwgMCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZIC0gKDEgKiBuU3JjUmVmU3RlcCk7CisgICAgICAgICAgICAgICAgcGVsUG9zWSArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFByZXBhcmUgY2FuZCBNViAqLworICAgICAgICAgICAgY2FuZE1WLmR4ID0gaW5pdGlhbE1WLmR4ICsgeDsKKyAgICAgICAgICAgIGNhbmRNVi5keSA9IGluaXRpYWxNVi5keSArIHk7CisgICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBRdWF0ZXIgcGVsIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiovCisgICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZlksCisgICAgICAgICAgICAgICAgICAgICAgICBuU3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZWxQb3NYLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgU0FEICovCisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKAkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjT3JnWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5TcmNPcmdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xZLAorICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2FuZFNBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoKTsKKyAKKyAgICAgICAgICAgIGRpZmZNVi5keCA9IGNhbmRNVi5keCAtIHBNVlByZWQtPmR4OworICAgICAgICAgICAgZGlmZk1WLmR5ID0gY2FuZE1WLmR5IC0gcE1WUHJlZC0+ZHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRNVi5keCwgCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHksIAorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZk1WLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgCisgICAgICAgICAgICAgICAgICAgICAgICBuTGFtZGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgcEJlc3RDb3N0KTsKKworICAgICAgICB9IC8qIEVuZCBvZiB4LSBheGlzICovCisgICAgfSAvKiBFbmQgb2YgeS1heGlzICovCisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YjFiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKKyAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAorICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAorICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKKyAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAorICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKKyAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAorICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAorICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAgICAgICAgICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2E2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpAQCAtMCwwICsxLDEwOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKKyAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCisgKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAorICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAorICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKKyAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgICAgICAgICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAorCWNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGRkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDg2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCisgKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCisgKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAorICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCisgKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAorICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCisgKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKKyAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKKyAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICoKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAorICkKKworeworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDQsIDQpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4M2QxZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDExNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCisgKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCisgKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCisgKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCisgKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKKyAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCisgKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayAKKyAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCisgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKKyAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKKyAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCisgKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCisgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCisgKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCisgKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKKyAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCisgKgorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgaW50IG5UYWJsZTsKKworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtPT1OVUxMICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwT2Zmc2V0PT1OVUxMICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PDAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ+NyAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTnVtQ29lZmY9PU5VTEwgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBwUG9zQ29lZmJ1Zj09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwUG9zQ29lZmJ1Zj09TlVMTCAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzVkxDU2VsZWN0PDAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZjwxNSAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc01heE51bUNvZWZmPjE2ICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAvKiBGaW5kIFZMQyB0YWJsZSBudW1iZXIgKi8KKyAgICBpZiAoc1ZMQ1NlbGVjdDwyKQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw0KQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc1ZMQ1NlbGVjdDw4KQorICAgIHsKKyAgICAgICAgblRhYmxlID0gMjsKKyAgICB9CisgICAgZWxzZSAvKiBzVkxDU2VsZWN0ID49IDggKi8KKyAgICB7CisgICAgICAgIG5UYWJsZSA9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgblRhYmxlLCBzTWF4TnVtQ29lZmYpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNWExNTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRGVxdWFudGl6ZSBMdW1hIEFDIGJsb2NrCisgKi8KKworc3RhdGljIHZvaWQgRGVxdWFudEx1bWFBQzR4NCgKKyAgICAgT01YX1MxNiogcFNyY0RzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgY29uc3QgT01YX1U4ICpwVlJvdyA9ICZhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07CisgICAgaW50IFNoaWZ0ID0gUVAgLyA2OworICAgIGludCBpOworICAgIE9NWF9TMzIgVmFsdWU7CisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKworICAgICAgICBWYWx1ZSA9IChwU3JjRHN0W2ldICogcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdDsKKyAgICAgICAgcFNyY0RzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAorICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKKyAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAorICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCisgKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCisgKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKKyAqIDEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5IAorICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCisgKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKKyAqICAgICAgICAgICAgZXhpc3QgCisgKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKKyAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKKyAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAorICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKKyAgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgcHJlZFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YX0lOVCBBQyAgICAgICAgCispCit7CisgICAgT01YX1MxNiBwQnVmZmVyWzE2KzRdOworICAgIE9NWF9TMTYgKnBEZWx0YTsKKyAgICBpbnQgaSx4LHk7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFByZWQgPT0gTlVMTCwgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBQcmVkKSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZFN0ZXAgJiAzLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDMsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPDApLCAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPjUxKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgcHBTcmM9PU5VTEwsICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKnBwU3JjPT1OVUxMLCAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoQUM9PTAgJiYgcERDPT1OVUxMLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgcERlbHRhID0gYXJtQWxpZ25UbzhCeXRlcyhwQnVmZmVyKTsgICAgCisKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERlbHRhW2ldID0gMDsKKyAgICB9CisgICAgaWYgKEFDKQorICAgIHsKKyAgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERlbHRhKTsKKyAgICAgICAgRGVxdWFudEx1bWFBQzR4NChwRGVsdGEsIFFQKTsKKyAgICB9CisgICAgaWYgKHBEQykKKyAgICB7CisgICAgICAgIHBEZWx0YVswXSA9IHBEQ1swXTsKKyAgICB9CisgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChwRGVsdGEscERlbHRhKTsKKworICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUscFByZWRbeSpwcmVkU3RlcCt4XSArIHBEZWx0YVs0KnkreF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlZGVlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBjaHJvbWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZm9yIChZPTA7IFk8ODsgWSs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWD0wOyBYPDg7IFgrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChYPj4xKSs0KihZPj4xKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA+IDMpICYmIChwQlNbSV0gPT0gNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoSSA8IDQpICAgICAgICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjFdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCisgICAgICAgICAgICAKKworICAgICAgICAgICAgLyogRmlsdGVyIGhvcml6b250YWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICBzcmNkc3RTdGVwLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzWyhYPj4xKSs0KihZPj4yKV0sCisgICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJTW0ldLAorICAgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiMjU5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWJsb2NraW5nIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKKyAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKKyAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAorICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKKyAgICAgT01YX1U4KiBwU3JjRHN0LAorICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAorICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAorICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCisgKQoreworICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOworCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMF0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVsxXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZm9yIChYPTA7IFg8ODsgWCs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWT0wOyBZPDg7IFkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChZPj4xKSs0KihYPj4xKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW0ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leM10gIT0gNCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkc1tZXSA+IDI1LCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAKKworICAgICAgICAgICAgLyogRmlsdGVyIHZlcnRpY2FsIGVkZ2Ugd2l0aCBxMCBhdCAoWCxZKSAqLworICAgICAgICAgICAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgICAgICAgICAgICAgcFNyY0RzdCArIFkqc3JjZHN0U3RlcCArIFgsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBwVGhyZXNob2xkc1soWT4+MSkrNCooWD4+MildLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhMzdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLXMgdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAorICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCisgKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAorICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKKyAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKKyAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCisgKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgIE9NWF9VOCogcFNyY0RzdCwKKyAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKKyAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKKyAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAorICkKK3sKKyAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKKworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBmb3IgKFk9MDsgWTwxNjsgWSs9NCwgSW50ZXJuYWw9MSkKKyAgICB7CisgICAgICAgIGZvciAoWD0wOyBYPDE2OyBYKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEkgPSAoWD4+MikrNCooWT4+Mik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBGaWx0ZXIgaG9yaXpvbnRhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KKyAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAorICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAorICAgICAgICAgICAgICAgIHNyY2RzdFN0ZXAsCisgICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbSV0sCisgICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKKyAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJTW0ldLAorICAgICAgICAgICAgICAgIDApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzMzNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgT01YX1U4KiBwU3JjRHN0LAorICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAorICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAorICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCisgKQoreworICAgIGludCBYLCBZLCBJLCBJbnRlcm5hbD0wOworCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSxPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDE1LCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKworICAgIGZvciAoWD0wOyBYPDE2OyBYKz00LCBJbnRlcm5hbD0xKQorICAgIHsKKyAgICAgICAgZm9yIChZPTA7IFk8MTY7IFkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSSA9IChZPj4yKSs0KihYPj4yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocEJTW1ldID4gNCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigocEJTW1ldID09IDQpICYmIChZID4gMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcm1SZXRBcmdFcnJJZigoIChwQlNbWV0gPT0gNCkgJiYgKHBCU1tZXjNdICE9IDQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBGaWx0ZXIgdmVydGljYWwgZWRnZSB3aXRoIHEwIGF0IChYLFkpICovCisgICAgICAgICAgICBhcm1WQ000UDEwX0RlQmxvY2tQaXhlbCgKKyAgICAgICAgICAgICAgICBwU3JjRHN0ICsgWSpzcmNkc3RTdGVwICsgWCwKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIHBUaHJlc2hvbGRzW0ldLAorICAgICAgICAgICAgICAgIHBBbHBoYVtJbnRlcm5hbF0sCisgICAgICAgICAgICAgICAgcEJldGFbSW50ZXJuYWxdLAorICAgICAgICAgICAgICAgIHBCU1tJXSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM1OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9HZXRWTENJbmZvLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0dldFZMQ0luZm8uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIAorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKKyAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKKyAqIHN0cnVjdHVyZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKKyAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKKyAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKKyAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKKyAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKKyAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAorICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCisgKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCisgKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKKyAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAorCWNvbnN0IE9NWF9TMTYqCQkgICAgcFNyY0NvZWZmLAorCWNvbnN0IE9NWF9VOCoJCQkgICAgcFNjYW5NYXRyaXgsCisJT01YX1U4CQkJICAgIGJBQywKKwlPTVhfVTMyCQkJICAgIE1heE51bUNvZWYsCisJT01YVkNNNFAxMFZMQ0luZm8qCXBEc3RWTENJbmZvCispCit7CisgICAgT01YX0lOVCAgICAgaSwgTWluSW5kZXg7CisgICAgT01YX1MzMiAgICAgVmFsdWU7CisgICAgT01YX1UzMiAgICAgTWFzayA9IDQsIFJ1bkJlZm9yZTsKKyAgICBPTVhfUzE2ICAgICAqcExldmVsOworICAgIE9NWF9VOCAgICAgICpwUnVuOworICAgIE9NWF9TMTYgICAgIEJ1ZiBbMTZdOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0NvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjQ29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU2Nhbk1hdHJpeCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0VkxDSW5mbyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihNYXhOdW1Db2VmID4gMTYsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW5pdGlhbGl6ZSBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMgPSAwOworICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zID0gMDsKKyAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcyA9IDA7CisgICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcERzdFZMQ0luZm8tPmlMZXZlbHMgW2ldID0gMDsKKyAgICAgICAgcERzdFZMQ0luZm8tPnVSdW5zIFtpXSA9IDA7CisgICAgfQorICAgIAorICAgIE1pbkluZGV4ID0gKGJBQyA9PSAwICYmIE1heE51bUNvZWYgPT0gMTUpID8gMSA6IDA7CisgICAgZm9yIChpID0gTWluSW5kZXg7IGkgPCAoTWF4TnVtQ29lZiArIE1pbkluZGV4KTsgaSsrKQorICAgIHsgICAgICAgIAorICAgICAgICAvKiBTY2FuICovCisgICAgICAgIEJ1ZiBbaSAtIE1pbkluZGV4XSA9IHBTcmNDb2VmZiBbcFNjYW5NYXRyaXggW2ldXTsKKyAgICB9CisKKyAgICAvKiBza2lwIHplcm9zIGF0IHRoZSBlbmQgKi8KKyAgICBpID0gTWF4TnVtQ29lZiAtIDE7CisgICAgd2hpbGUgKCFCdWYgW2ldICYmIGkgPj0gMCkKKyAgICB7CisgICAgICAgIGktLTsKKyAgICB9CisgICAgCisgICAgaWYgKGkgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgICAgfQorCisgICAgLyogRmlsbCBSTEUgSW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICBwTGV2ZWwgPSBwRHN0VkxDSW5mby0+aUxldmVsczsKKyAgICBwUnVuID0gcERzdFZMQ0luZm8tPnVSdW5zOworICAgIFJ1bkJlZm9yZSA9IDA7CisKKyAgICAvKiBIYW5kbGUgZmlyc3Qgbm9uIHplcm8gc2VwYXJhdGUgKi8KKyAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOworICAgIFZhbHVlID0gQnVmIFtpXTsKKyAgICBpZiAoVmFsdWUgPT0gMSB8fCBWYWx1ZSA9PSAtMSkKKyAgICB7CisgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOworICAgICAgICAKKyAgICAgICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVfU2lnbnMgfD0gCisgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOworICAgICAgICBNYXNrID4+PSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKKyAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7CisgICAgICAgIE1hc2sgPSAwOworICAgIH0KKworICAgIC8qIFJlbWFpbmluZyBub24gemVybyAqLworICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICB7CisgICAgICAgIFZhbHVlID0gQnVmIFtpXTsKKyAgICAgICAgaWYgKFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0VkxDSW5mby0+dU51bUNvZWZmcysrOworCisgICAgICAgICAgICAvKiBNYXNrIGJlY29tZXMgemVybyBhZnRlciBlbnRlcmluZyAqLworICAgICAgICAgICAgaWYgKE1hc2sgJiYKKyAgICAgICAgICAgICAgICAoVmFsdWUgPT0gMSB8fCAKKyAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lcysrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAtMSA/IE1hc2sgOiAwOworICAgICAgICAgICAgICAgIE1hc2sgPj49IDE7CisgICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKKyAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIDMgdHJhaWxpbmcgb25lcyBhcmUgbm90IGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGlmIChNYXNrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIFZhbHVlIC09IChWYWx1ZSA+IDAgPyAxIDogLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcExldmVsKysgPSBWYWx1ZTsKKyAgICAgICAgICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOworICAgICAgICAgICAgICAgIFJ1bkJlZm9yZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRvdGFsWmVyb3MrKzsKKyAgICAgICAgICAgIFJ1bkJlZm9yZSsrOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyogVXBkYXRlIGxhc3QgcnVuICovCisgICAgaWYgKFJ1bkJlZm9yZSkKKyAgICB7CisgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyNGRlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCisgKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAorICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aC4gCisgKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKKyAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAorICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAorICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCisgICAgIE9NWF9TMzIgc3JjU3RlcCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgIE9NWF9TMzIgZHgsCisgICAgIE9NWF9TMzIgZHksCisgICAgIE9NWFNpemUgcm9pCisgKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwIDwgOCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR4IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeSA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCAhPSAyKSAmJiAocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDIpICYmIChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDIpICYmIGFybU5vdDJCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYmVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgSGFsZiBob3Jpem9udGFsIGx1bWEgaW50ZXJwb2xhdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAorICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCisgKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCisgKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCisgKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCisgKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCisgKiAgICAgICAgICAgICgtMS8yLCAwKSAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCisgKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKKyAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKKyAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAorICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAorICAgICAgICBPTVhfVTgqICAgICBwRHN0TGVmdCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3RSaWdodCwgCisgICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOyAgICAKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdExlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFJpZ2h0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAorICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCisgICAgICAgIHBTcmMgLSAxLCAgICAgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdExlZnQsICAgICAKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsICAgCisgICAgICAgIGlIZWlnaHQpOworCisgICAgaWYgKFJldFZhbHVlICE9IE9NWF9TdHNfTm9FcnIpCisgICAgeworICAgICAgICByZXR1cm4gUmV0VmFsdWU7CisgICAgfQorCisgICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICAgICAgcFNyYywgICAgIAorICAgICAgICBpU3JjU3RlcCwgCisgICAgICAgIHBEc3RSaWdodCwgICAgIAorICAgICAgICBpRHN0U3RlcCwgCisgICAgICAgIGlXaWR0aCwgICAKKyAgICAgICAgaUhlaWdodCk7CisKKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MGZmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCisgT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKKyAgICAgY29uc3QgT01YX1U4KiAgICBwU3JjLCAKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwgCisgICAgIE9NWF9VOCogICAgcERzdFVwLCAKKyAgICAgT01YX1U4KiAgICBwRHN0RG93biwgCisgICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsIAorICAgICBPTVhfVTMyICAgIGlXaWR0aCwgCisgICAgIE9NWF9VMzIgICAgaUhlaWdodAorKQoreworICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0VXAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdERvd24gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA0KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdFVwKSAmJgorICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gOCkgJiYgCisgICAgICAgICAgICAgICAgICAgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDE2KSAmJiAKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RVcCkgJiYKKyAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisJYXJtUmV0QXJnRXJySWYoKGlXaWR0aCAhPSAxNikgJiYgKGlXaWR0aCAhPSA4KSYmIChpV2lkdGggIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCisgICAgICAgIHBTcmMgLSBpU3JjU3RlcCwgCisgICAgICAgIGlTcmNTdGVwLCAKKyAgICAgICAgcERzdFVwLAorICAgICAgICBpRHN0U3RlcCwgCisgICAgICAgIGlXaWR0aCwgCisgICAgICAgIGlIZWlnaHQpOworICAgIAorICAgIGlmIChSZXRWYWx1ZSAhPSBPTVhfU3RzX05vRXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJldFZhbHVlOworICAgIH0KKworICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAorICAgICAgICBwU3JjLCAKKyAgICAgICAgaVNyY1N0ZXAsIAorICAgICAgICBwRHN0RG93biwKKyAgICAgICAgaURzdFN0ZXAsIAorICAgICAgICBpV2lkdGgsIAorICAgICAgICBpSGVpZ2h0KTsKKyAgICAKKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMzNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAorICogICBzcmNTdGVwIC1yZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCisgKiAgIGRzdFN0ZXAgLWRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAorICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCisgKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlciBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZCBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICogICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kgICAgICAgIAorICkKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IHJvaS53aWR0aCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHggPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihkeCA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGR5IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoICE9IDQpICYmIChyb2kud2lkdGggIT0gOCkgJiYgKHJvaS53aWR0aCAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kuaGVpZ2h0ICE9IDQpICYmIChyb2kuaGVpZ2h0ICE9IDgpICYmIChyb2kuaGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA0KSAmJiBhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gOCkgJiYgYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDE2KSAmJiBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKSAKKworICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEgCisgICAgICAgIChwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJhMDMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAorICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMoCisJY29uc3QgT01YX1MxNiogCXBTcmMsCisJT01YX1MxNioJcERzdCwKKwlPTVhfVTMyCQlpUVAKKykKK3sKKyAgICBPTVhfSU5UICAgICBpLCBqOworICAgIE9NWF9TMzIgICAgIG1bMl1bMl07CisgICAgT01YX1MzMiAgICAgUVBlciwgVjAwLCBWYWx1ZTsKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICAvKiBJbnYgSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KKyAgICBtWzBdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gKyAgcFNyY1syXSArIHBTcmNbM107CisgICAgbVswXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdICsgIHBTcmNbMl0gLSBwU3JjWzNdOworICAgIG1bMV1bMF0gPSBwU3JjWzBdICsgcFNyY1sxXSAtICBwU3JjWzJdIC0gcFNyY1szXTsKKyAgICBtWzFdWzFdID0gcFNyY1swXSAtIHBTcmNbMV0gLSAgcFNyY1syXSArIHBTcmNbM107CisKKyAgICAvKiBRdWFudGl6YXRpb24gKi8KKyAgICAvKiBTY2FsaW5nICovCisgICAgUVBlciA9IGlRUCAvIDY7CisgICAgVjAwID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVBlciA8IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBWYWx1ZSA9IChtW2pdW2ldICogVjAwKSA8PCAoUVBlciAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwRHN0W2ogKiAyICsgaV0gPSAoT01YX1MxNikgVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2IxMjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCkBAIC0wLDAgKzEsMTI4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHF1YW50aXphdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMoCQorCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAorCU9NWF9TMTYqCXBEc3QsCisJT01YX1UzMgkJaVFQCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtMVs0XVs0XSwgbTJbNF1bNF0sIFZhbHVlOworICAgIE9NWF9TMzIgICAgIFFQZXIsIFY7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgREMgTHVtYSA0eDQgYmxvY2sgKi8KKyAgICAvKiBIb3Jpem9udGFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGogPSBpICogNDsKKyAgICAgICAgCisgICAgICAgIG0xW2ldWzBdID0gcFNyY1tqICsgMF0gKyBwU3JjW2ogKyAyXTsgLyogYStjICovCisgICAgICAgIG0xW2ldWzFdID0gcFNyY1tqICsgMV0gKyBwU3JjW2ogKyAzXTsgLyogYitkICovCisgICAgICAgIG0xW2ldWzJdID0gcFNyY1tqICsgMF0gLSBwU3JjW2ogKyAyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gcFNyY1tqICsgMV0gLSBwU3JjW2ogKyAzXTsgLyogYi1kICovCisKKyAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCisgICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLworICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KKyAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCisKKyAgICB9CisKKyAgICAvKiBWZXJ0aWNhbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07CisgICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKKyAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOworICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07CisKKyAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOworICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07CisgICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKKyAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOworICAgIH0KKworICAgIAorICAgIC8qIFNjYWxpbmcgKi8KKyAgICBRUGVyID0gaVFQIC8gNjsKKyAgICBWID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVBlciA8IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSAobTJbal1baV0gKiBWICsgKDEgPDwgKDEgLSBRUGVyKSkpID4+ICgyIC0gUVBlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFsdWUgPSBtMltqXVtpXSAqIFYgKiAoMSA8PCAoUVBlciAtIDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcERzdFtqICogNCArIGldID0gKE9NWF9TMTYpIFZhbHVlOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMzk5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnZlcnNlIGludGVnZXIgNHg0IHRyYW5zZm9ybQorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKKyAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKKyAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIG1hdHJpeC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCisgKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCgKKwljb25zdCBPTVhfVTgqIAlwU3JjUHJlZCwgCisJY29uc3QgT01YX1MxNiogCXBEZXF1YW50Q29lZmYsIAorCU9NWF9VOCogCXBEc3RSZWNvbiwKKwlPTVhfVTMyIAlpU3JjUHJlZFN0ZXAsIAorCU9NWF9VMzIJCWlEc3RSZWNvblN0ZXAsIAorCU9NWF9VOAkJYkFDCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzE2ICAgICBJblsxNl0sIE91dFsxNl07CisgICAgT01YX1MzMiAgICAgVmFsdWU7CisKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY1ByZWQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwRGVxdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRGVxdWFudENvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFJlY29uID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmVjb24pLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihiQUMgPiAxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCB8fCBpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpRHN0UmVjb25TdGVwID09IDAgfHwgaURzdFJlY29uU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgaWYgKGJBQykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBJbltpXSA9IHBEZXF1YW50Q29lZmYgW2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIENvcHkgREMgKi8KKyAgICAgICAgSW5bMF0gPSBwRGVxdWFudENvZWZmIFswXTsKKyAgICAKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEluW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLworICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKE91dCwgSW4pOyAgICAKKyAgICAKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQWRkIHByZWRpdGlvbiAqLworICAgICAgICAgICAgVmFsdWUgPSAoT01YX1MzMikgT3V0IFtqICogNCArIGldICsgcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogU2F0dXJhdGUgVmFsdWUgdG8gT01YX1U4ICovCisgICAgICAgICAgICBWYWx1ZSA9IGFybUNsaXAgKDAsIDI1NSwgVmFsdWUpOworCisgICAgICAgICAgICBwRHN0UmVjb25baiAqIGlEc3RSZWNvblN0ZXAgKyBpXSA9IChPTVhfVTgpIFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNhNWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwpAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAorICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCisgKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAorICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyAgICApCit7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFwU2l6ZSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2IDw9IDApIHx8IAorICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4IDw9IDApIHx8IAorICAgICAgICAgICAgICAgICAgIChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlNHg0IDw9IDApLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgICAgICAgICAgICAgICAgCisgICAgKnBTaXplID0gKE9NWF9JTlQpIHNpemVvZihBUk1WQ000UDEwX01FU3BlYyk7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVjYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYwpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUluaXQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCisgKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCisgKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKKyAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCisgKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKKyAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCisgKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCisgKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCisgKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKKyAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCisgKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAorICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCgKKyAgICAgICAgT01YVkNNNFAxME1FTW9kZSBNRU1vZGUsCisgICAgICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgICAgICB2b2lkICpwTUVTcGVjCisgICAgICAgKQoreworICAgIEFSTVZDTTRQMTBfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAxMF9NRVNwZWMgKikgcE1FU3BlYzsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FUGFyYW1zLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIXBNRVNwZWMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCisgICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKKyAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuYmxvY2tTcGxpdEVuYWJsZTh4OCA9IHBNRVBhcmFtcy0+YmxvY2tTcGxpdEVuYWJsZTh4ODsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU0eDQgPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU0eDQ7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmU2VhcmNoRW5hYmxlICAgID0gcE1FUGFyYW1zLT5oYWxmU2VhcmNoRW5hYmxlOworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMucXVhcnRlclNlYXJjaEVuYWJsZSA9IHBNRVBhcmFtcy0+cXVhcnRlclNlYXJjaEVuYWJsZTsKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmludHJhRW5hYmxlNHg0ICAgICAgPSBwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0OyAgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTE2eDE2ICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2OyAgIAorICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U4eDggICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDg7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTR4NCAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NDsKKyAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2RiZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpAQCAtMCwwICsxLDE4OTIgQEAKKy8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4CisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gTUIgbGV2ZWwgbW90aW9uIGVzdGltYXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUyAgICAgKDE1KQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYXzR4NF9TQUQJCSgweGZmZmYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERV9WQUxVRSAgICAgKDB4ZmZmZmZmZmYpCisjZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERVMgICAgICAgICAgKDE2KQorI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICgxNikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01FRElBTihhLGIsYykgICAgICAoYT5iP2E+Yz9iPmM/YjpjOmE6Yj5jP2E+Yz9hOmM6YikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX1NISUZUX1FQICAgICAgICAgICAoMTIpCisKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU4gICAgICAoMCkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9MICAgICAgICAgICAoMSkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VICAgICAgICAgICAoMikKKyNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VUiAgICAgICAgICAoMykKKworI2RlZmluZSBBUk1fVkNNNFAxMF9NQl9CTE9DS19TSVpFICAgICAgICgxNikKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfQkxPQ0tfU0laRSAgICAgICAgICAoNCkKKyNkZWZpbmUgQVJNX1ZDTTRQMTBfTUFYX0NPU1QgICAgICAgICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgICAgICAoLTIpCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgQ2FsY3VsYXRlIFNBRCB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIE1CIGVuY29kaW5nIG1vZGUgYW5kIHVwZGF0ZSAKKyAqIHBEc3RCbG9ja1NBRCBwYXJhbWV0ZXIuIFRoZXNlIFNBRCB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgNHg0IGJsb2NrcyBhdAorICogYSB0aW1lIGFuZCBpbiB0aGUgc2NhbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNNQkluZm8gICAgLSAKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAtIAorICogW2luXSBTcmNDdXJyU3RlcCAgIC0gCisgKiBbaW5dIHBTcmNSZWZCdWZMaXN0LSAKKyAqIFtpbl0gU3JjUmVmU3RlcCAgICAtIAorICogW2luXSBwU3JjUmVjQnVmICAgIC0gCisgKiBbaW5dIFNyY1JlY1N0ZXAgICAgLSAKKyAqIFtpbl0gcFJlZlJlY3QgICAgICAtIAorICogW2luXSBwQ3VyclBvaW50UG9zIC0gCisgKiBbaW5dIExhbWJkYSAgICAgICAgLSAKKyAqIFtpbl0gcE1FU3BlYyAgICAgICAtIAorICogW2luXSBwTUJJbnRlciAgICAgIC0gCisgKiBbaW5dIHBNQkludHJhICAgICAgLSAKKyAqIFtvdXRdIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gMTYgZWxlbWVudCBhcnJheSBmb3IgU0FEIGNvcnJlc3BvbmRpbmcgdG8gNHg0IGJsb2NrcworICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICoKKyAqLworCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCisJT01YVkNNNFAxME1CSW5mbyAqcFNyY01CSW5mbywgCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJT01YX1MzMiBTcmNDdXJyU3RlcCwgCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKKwlPTVhfUzMyIFNyY1JlY1N0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKwljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisJT01YX1UxNiAqcERzdEJsb2NrU0FEKQoreworCU9NWF9JTlQJCUludmFsaWRTQUQgPSAwOworCU9NWF9JTlQJCWk7CisKKwlPTVhfVTgJCUJ1ZmZlciBbMTYqMTYgKyAxNV07CisJT01YX1U4CQkqcFRlbXBEc3RCdWY7CisJT01YX1MzMgkJVGVtcERzdFN0ZXA7CisJT01YX1U4CQkqcFRlbXBSZWZCdWY7CisJT01YX1MzMgkJVGVtcFJlZlN0ZXA7IAorCisJLyogVGVtcG9yYXJ5IGJ1ZmZlciB0byBzdG9yZSB0aGUgcHJlZGljdGVkIG1iIGNvZWZmaWNpZW50cyAqLworCXBUZW1wRHN0QnVmID0gYXJtQWxpZ25UbzE2Qnl0ZXMoQnVmZmVyKTsKKwlUZW1wRHN0U3RlcCA9IDE2OworCisJLyogVXBkYXRlIHBEc3RCbG9ja1NBRCBpZiBNQiBpcyBhIHZhbGlkIHR5cGUgKi8KKwlpZiAocFNyY01CSW5mbykKKwl7CisJICAgIE9NWF9VMzIgICAgIFdpZHRoPTAsIEhlaWdodD0wLCBNYXhYUGFydCwgTWF4WVBhcnQsTWF4U3ViWFBhcnQsTWF4U3ViWVBhcnQ7CisJICAgIAorCQkvKiBEZXBlbmRpbmcgb24gdHlwZSBvZiBNQiwgZG8gcHJlZGljdGlvbiBhbmQgZmlsbCB0ZW1wIGJ1ZmZlciAqLworCQlzd2l0Y2ggKHBTcmNNQkluZm8tPm1iVHlwZSkKKwkJeworCQljYXNlIE9NWF9WQ19QXzE2eDE2OgorCQkJCVdpZHRoID0gMTY7CisJCQkJSGVpZ2h0ID0gMTY7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfMTZ4ODoKKwkJCQlXaWR0aCA9IDE2OworCQkJCUhlaWdodCA9IDg7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfOHgxNjoKKwkJCQlXaWR0aCA9IDg7CisJCQkJSGVpZ2h0ID0gMTY7CisJCQkJYnJlYWs7CisJCWNhc2UgT01YX1ZDX1BfOHg4OgorCQkJCVdpZHRoID0gODsKKwkJCQlIZWlnaHQgPSA4OworCQkJCWJyZWFrOworCQljYXNlIE9NWF9WQ19JTlRSQV80eDQ6CisJCQl7CisJCQkJLyogQ3JlYXRlIHByZWRpY3RlZCBNQiBJbnRyYTR4NCBtb2RlICovCisJCQkJT01YX1MzMiAgICAgUHJlZEludHJhNHg0TW9kZSBbNV1bOV07CisJCQkJT01YX1MzMgkJeCwgeSwgQmxvY2s4eDgsIEJsb2NrNHg0LCBCbG9ja1gsIEJsb2NrWTsKKwkJCQlPTVhfVTggICAgICBwU3JjWUJ1ZmYgWygxNiozKSooMTYqMildOworCQkJCU9NWF9VOAkJKnBTcmNZOworCQkJCU9NWF9TMzIgICAgIFN0ZXBTcmNZOworCQkJCU9NWF9TMzIJCWF2YWlsYWJpbGl0eTsKKworCQkJCWZvciAoeSA9IDA7IHkgPCA1OyB5KyspCisJCQkJeworCQkJCQlmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQorCQkJCQl7CisJCQkJCQkvKiAKKwkJCQkJCSAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCisJCQkJCQkgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKKwkJCQkJCSAqLworCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLworCQkJCWZvciAoeCA9IDA7IHggPCA0OyB4KyspCisJCQkJeworCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KKwkJCQkJaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAorCQkJCQkJCXBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKKwkJCQkJfQorCQkJICAgICAgICAKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCisJCQkJCWlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKKwkJCQkJCQlwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07CisJCQkJCX0KKwkJCQl9CisJCSAgICAKKwkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KKwkJCQlpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKKwkJCQl7CisJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKKwkJCQl9CisJCSAgICAKKwkJCQlmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGEwLCBhMSwgYTIsIGEzICovCisJCQkJCWlmIChwTUJJbnRyYVswXSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5ICsgMV1bMF0gPSAKKwkJCQkJCQlwTUJJbnRyYVswXS0+cEludHJhNHg0UHJlZE1vZGVbeSo0ICsgM107CisJCQkJCX0KKwkJCQl9CisJCSAgICAgICAgCisJCQkJLyoKKwkJCQkgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCisJCQkJICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KKwkJCQkgKi8KKwkJCSAgICAKKwkJCQlwU3JjWSA9IHBTcmNZQnVmZjsKKwkJCQlTdGVwU3JjWSA9IDE2ICogMzsKKwkJCQlmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKKwkJCQl7CisJCQkJCWZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQorCQkJCQl7CisJCQkJCQlwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKKwkJCQkJCQlwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOworCQkJCQl9CisJCQkJfQorCisJCSAgICAKKwkJCQkvKiBmb3IgZWFjaCA4eDggYmxvY2sgKi8KKwkJCQlmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQorCQkJCXsKKwkJCQkJLyogZm9yIGVhY2ggNHg0IGJsb2NrIGluc2lkZSA4eDggYmxvY2sgKi8KKwkJCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKKwkJCQkJeworCQkJCQkJLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLworCQkJCQkJQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7CisJCQkJCQlCbG9ja1kgPSAoKEJsb2NrOHg4ID4+IDEpIDw8IDEpICsgKEJsb2NrNHg0ID4+IDEpOworCQkJCQkgICAgCisJCQkJCQkvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCisJCQkJCQl4ID0gQmxvY2tYICsgMTsKKwkJCQkJCXkgPSBCbG9ja1kgKyAxOworCisJCQkJCQlhdmFpbGFiaWxpdHkgPSAwOworCisJCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KKwkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKwkJCQkJCXsKKwkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKKwkJCQkJCX0KKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLworCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorCQkJCQkJeworCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKKwkJCQkJCX0KKworCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCisJCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorCQkJCQkJeworCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAorCQkJCQkJfQorCQkJCQkJCisJCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF07CisJCQkJCQl4ID0gQmxvY2tYICogNDsKKwkJCQkJCXkgPSBCbG9ja1kgKiA0OworCisJCQkJCQlwU3JjWSA9IHBTcmNZQnVmZiArIDE2ICogU3RlcFNyY1kgKyAxNiArIHkgKiBTdGVwU3JjWSArIHg7CisKKwkJCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKwkJCQkJCQkgcFNyY1kgLSAxLAorCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZLAorCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKKwkJCQkJCQkgcFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwLAorCQkJCQkJCSBTdGVwU3JjWSwKKwkJCQkJCQkgVGVtcERzdFN0ZXAsCisJCQkJCQkJIHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF0sCisJCQkJCQkJIGF2YWlsYWJpbGl0eSk7CisKKwkJCQkJCWZvciAoQmxvY2tZPTA7QmxvY2tZPDQ7QmxvY2tZKyspCisJCQkJCQl7CisJCQkJCQkJZm9yKEJsb2NrWD0wO0Jsb2NrWDw0O0Jsb2NrWCsrKQorCQkJCQkJCXsKKwkJCQkJCQkJcFNyY1kgW0Jsb2NrWSAqIFN0ZXBTcmNZICsgQmxvY2tYXSA9IAorCQkJCQkJCQkJKE9NWF9VOCkoKihwVGVtcERzdEJ1ZiArIHggKyB5ICogVGVtcERzdFN0ZXAgKyBCbG9ja1kgKiBUZW1wRHN0U3RlcCArIEJsb2NrWCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQljYXNlIE9NWF9WQ19JTlRSQV8xNngxNjoKKwkJCXsKKwkJCQlPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKKwkJCQlPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKKwkJCQlPTVhfVTMyCQlhdmFpbGFiaWxpdHkgPSAwOworCisJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCisJCQkJaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKKwkJCQl7CisJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAorCQkJCX0KKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KKwkJCQlpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQorCQkJCXsKKwkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAorCQkJCX0KKworCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLworCQkJCWlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAorCQkJCQkocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQorCQkJCXsKKwkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCisJCQkJfQorCisJCQkJb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCisJCQkJCQlwU3JjUmVjQnVmIC0gMSwgCisJCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCisJCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAorCQkJCQkJcFRlbXBEc3RCdWYsIAorCQkJCQkJU3JjUmVjU3RlcCwgCisJCQkJCQlUZW1wRHN0U3RlcCwgCisJCQkJCQlwU3JjTUJJbmZvLT5JbnRyYTE2eDE2UHJlZE1vZGUsIAorCQkJCQkJYXZhaWxhYmlsaXR5KTsKKwkJCQkKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIE9NWF9WQ19JTlRFUl9TS0lQOgorCQljYXNlIE9NWF9WQ19QUkVGMF84eDg6CisJCWNhc2UgT01YX1ZDX0lOVFJBX1BDTToKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZXNlIGNhc2VzIHdpbGwgdXBkYXRlIHBEc3RCbG9ja1NBRCB3aXRoIE1BWCB2YWx1ZSAqLworCQkJSW52YWxpZFNBRCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qIElOVEVSIE1CICovCisJCWlmICgocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzE2eDE2KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDE2KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNng4KSB8fAorCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDgpKQorCQl7CisgICAgICAgIAljb25zdCBPTVhfVTgJCSpwVGVtcFNyY0J1ZjsKKyAgICAgICAgCU9NWF9TMzIJCVRlbXBTcmNTdGVwOworICAgICAgICAJT01YX1MzMgkJbXZ4LG12eTsKKyAgICAgICAgCU9NWF9VMzIJCVBhcnRYLCBQYXJ0WSwgU3ViUGFydFgsIFN1YlBhcnRZOworICAgICAgICAJCisJCQlUZW1wU3JjU3RlcCA9IFNyY1JlZlN0ZXA7CisKKwkJCU1heFhQYXJ0ID0gMTYvV2lkdGg7CisJCQlNYXhZUGFydCA9IDE2L0hlaWdodDsKKworCisJCQlmb3IgKFBhcnRZID0gMDsgUGFydFkgPCBNYXhZUGFydDsgUGFydFkrKykKKwkJCXsKKwkJCQlmb3IgKFBhcnRYID0gMDsgUGFydFggPCBNYXhYUGFydDsgUGFydFgrKykKKwkJCQl7CisKKwkJCQkJcFRlbXBTcmNCdWYgPSBwU3JjUmVmQnVmTGlzdFtwU3JjTUJJbmZvLT5wUmVmTDBJZHhbUGFydFkgKiAyICsgUGFydFhdXTsKKworCQkJCQlpZiAoTWF4WFBhcnQgPT0gMiAmJiBNYXhZUGFydCA9PSAyKQorCQkJCQl7CisgICAgICAgIAkJCQlzd2l0Y2ggKHBTcmNNQkluZm8tPnN1Yk1CVHlwZVtQYXJ0WSoyK1BhcnRYXSkKKyAgICAgICAgCQkJCXsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF84eDg6CisJCQkJCQkJCVdpZHRoID0gODsKKwkJCQkJCQkJSGVpZ2h0ID0gODsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg0OgorCQkJCQkJCQlXaWR0aCA9IDg7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgICAgICAJCQkJICAgIGJyZWFrOworICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzR4ODoKKwkJCQkJCQkJV2lkdGggPSA0OworCQkJCQkJCQlIZWlnaHQgPSA4OworICAgICAgICAgICAgCQkJCSAgICBicmVhazsKKyAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDQ6CisJCQkJCQkJCVdpZHRoID0gNDsKKwkJCQkJCQkJSGVpZ2h0ID0gNDsKKyAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQkgICAgZGVmYXVsdDoKKwkJCQkJCQkJLyogRGVmYXVsdCAqLworCQkJCQkJCQlXaWR0aCA9IDQ7CisJCQkJCQkJCUhlaWdodCA9IDQ7CisgICAgICAgIAkJCQkgICAgYnJlYWs7CisgICAgICAgIAkJCQl9CisJCQkJCQorICAgIAkJCQkgICAgTWF4U3ViWFBhcnQgPSA4L1dpZHRoOworICAgIAkJCQkgICAgTWF4U3ViWVBhcnQgPSA4L0hlaWdodDsKKworCQkJCQkJZm9yIChTdWJQYXJ0WSA9IDA7IFN1YlBhcnRZIDwgTWF4U3ViWVBhcnQ7IFN1YlBhcnRZKyspCisJCQkJCQl7CisJCQkJCQkJZm9yIChTdWJQYXJ0WCA9IDA7IFN1YlBhcnRYIDwgTWF4U3ViWFBhcnQ7IFN1YlBhcnRYKyspCisJCQkJCQkJeworCQkJCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHg7CisJCQkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFkgKyBTdWJQYXJ0WV1bMipQYXJ0WCArIFN1YlBhcnRYXS5keTsKKwkJCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAorCQkJCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIDQqU3ViUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSArIChtdnkvNCkpICogVGVtcFNyY1N0ZXAsCisJCQkJCQkJCQlUZW1wU3JjU3RlcCwKKwkJCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSkgKiBUZW1wRHN0U3RlcCwKKwkJCQkJCQkJCVRlbXBEc3RTdGVwLAorCQkJCQkJCQkJV2lkdGgsCisJCQkJCQkJCQlIZWlnaHQsCisJCQkJCQkJCQltdnggJiAzLAorCQkJCQkJCQkJbXZ5ICYgMworCQkJCQkJCQkJKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisKKwkJCQkJCW12eCA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR4OworCQkJCQkJbXZ5ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WV1bMipQYXJ0WF0uZHk7CisJCQkJCQlhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCisJCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIChtdngvNCkpICsgKDgqUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAorCQkJCQkJCVRlbXBTcmNTdGVwLAorCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFgpICsgKDgqUGFydFkpICogVGVtcERzdFN0ZXAsCisJCQkJCQkJVGVtcERzdFN0ZXAsCisJCQkJCQkJV2lkdGgsCisJCQkJCQkJSGVpZ2h0LAorCQkJCQkJCW12eCAmIDMsCisJCQkJCQkJbXZ5ICYgMworCQkJCQkJCSk7CisKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlJbnZhbGlkU0FEID0gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgU0FEIGZyb20gcHJlZGljdGVkIGJ1ZmZlciAqLworCWlmICghSW52YWxpZFNBRCkKKwl7CisJICAgIE9NWF9VMzIgICAgIHg4eDgsIHk4eDgsIHg0eDQsIHk0eDQsIEJsb2NrOHg4LCBCbG9jazR4NDsKKwkgICAgT01YX1MzMiAgICAgU0FEOworCSAgICAKKwkJcFRlbXBSZWZCdWYgPSBwVGVtcERzdEJ1ZjsKKwkJVGVtcFJlZlN0ZXAgPSAxNjsKKworCQkvKiBTQUQgZm9yIGVhY2ggNHg0IGJsb2NrIGluIHNjYW4gb3JkZXIgKi8KKwkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKwkJeworCQkJeDh4OCA9IDgqKEJsb2NrOHg4ICYgMSk7CisJCQl5OHg4ID0gOCooQmxvY2s4eDggPj4gMSk7CisJCQlmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQorCQkJeworCQkJCXg0eDQgPSA0KihCbG9jazR4NCAmIDEpOworCQkJCXk0eDQgPSA0KihCbG9jazR4NCA+PiAxKTsKKworCQkJCWFybVZDQ09NTV9TQUQoCQorCQkJCQlwU3JjQ3VyckJ1ZiArICh4OHg4ICsgeDR4NCkgKyAoeTh4OCArIHk0eDQpICogU3JjQ3VyclN0ZXAsIAorCQkJCQlTcmNDdXJyU3RlcCwKKwkJCQkJcFRlbXBSZWZCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFRlbXBSZWZTdGVwLAorCQkJCQlUZW1wUmVmU3RlcCwKKyAgICAJCQkJJlNBRCwKKyAgICAJCQkJNCwgLyogSGVpZ2h0ICovCisgICAgCQkJCTQpOyAvKiBXaWR0aCAqLworICAgICAgICAgICAgICAgICoocERzdEJsb2NrU0FEICsgNCAqIEJsb2NrOHg4ICsgQmxvY2s0eDQpID0gKFNBRCA8IDB4N2ZmZikgPyAoT01YX1UxNikgU0FEIDogQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUU7ICAgCQkJICAgIAorIAkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBGaWxsIFNBRHMgd2l0aCBtYXggdmFsdWVzIGFuZCByZXR1cm4qLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJeworCQkJcERzdEJsb2NrU0FEIFtpXSA9IEFSTV9WQ000UDEwX01BWF80eDRfU0FEOworCQl9CisJfQorCXJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEludHJhIDR4NCBNb2RlIGRlY2lzaW9uIGJ5IGNhbGN1bGF0aW5nIGNvc3QgZm9yIGFsbCBwb3NzaWJsZSBtb2RlcyBhbmQKKyAqIGNob29zaW5nIHRoZSBiZXN0IG1vZGUKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB0aGUgT01YVkNNNFAxME1CSW5mbyB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgZmllbGQgcEludHJhNHg0UHJlZE1vZGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBbaW5dIEJsb2NrOHg4ICAgIC0gSW5kZXggOHg4IGJsb2NrIGluIHdoaWNoIGN1cnJlbnQgNHg0IGJsb2NrIGJlbG9uZ3MKKyAqIFtpbl0gQmxvY2s0eDQgICAgLSBJbmRleCBvZiBjdXJyZW50IDR4NCBibG9jaworICogW2luL291dF0gcFByZWRJbnRyYTR4NFNyY1kgLSBQb2ludGVyIHRvIGN1cnJlbnQgYmxvY2sgbG9jYXRpb24gaW4gYnVmZmVyIAorICogICAgICAgICAgICAgICAgICAgIHdpdGggcmVjb25zdHJ1Y3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBiZSBtb2RpZmllZCBieSB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBiZXN0IG1vZGUgcHJlZGljdGVkIHZhbHVlcyAKKyAqIFtpbl0gU3RlcFByZWRJbnRyYTR4NFNyY1kgIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBQcmVkSW50cmE0eDRTcmNZCisgKiBbaW5dIHBJbnRyYTR4NFByZWRNb2RlICAgICAtIEFycmF5IG9mIEludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIHRoZSBNQi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCBNQiBtb2RlcyBzdGFydHMgYXQgWzEsMV0uCisgKiBbaW5dIHBCZXN0Q29zdCAgIC0gQ29zdCBmb3IgdGhlIEJlc3QgSW50cmEgNHg0IG1vZGUKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisgICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfUzMyIEJsb2NrOHg4LAorICAgIE9NWF9TMzIgQmxvY2s0eDQsCisgICAgT01YX1U4ICAqcFByZWRJbnRyYTR4NFNyY1ksCisgICAgT01YX1MzMiBTdGVwUHJlZEludHJhNHg0U3JjWSwKKyAgICBPTVhfUzMyIHBJbnRyYTR4NFByZWRNb2RlIFtdWzldLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKQoreworICAgIE9NWF9TMzIgICAgIGksIGosIHgsIHksIEJsb2NrWCwgQmxvY2tZLCBtb2RlOworICAgIE9NWF9TMzIgICAgIENvc3QsIEJlc3RDb3N0OworICAgIE9NWF9VOCAgICAgICpwU3JjWTsKKyAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKKyAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOworICAgIE9NWF9VOCAgICAgIHBQcmVkQmxvY2sgWzQqNF07CisgICAgT01YUmVzdWx0ICAgUmV0ID0gT01YX1N0c19FcnI7CisKKyAgICAvKiBHZXQgYmxvY2sgY29yZGluYXRlcyBmcm9tIDh4OCBibG9jayBpbmRleCBhbmQgNHg0IGJsb2NrIGluZGV4ICovCisgICAgQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7CisgICAgQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKKyAgICAKKyAgICAvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCisgICAgeCA9IEJsb2NrWCArIDE7CisgICAgeSA9IEJsb2NrWSArIDE7CisKKyAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KKyAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3ldW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLworICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3hdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCisgICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5IC0gMV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKyAgICB9CisKKyAgICBwU3JjWSA9IHBQcmVkSW50cmE0eDRTcmNZICsgCisgICAgICAgICAgICBTdGVwUHJlZEludHJhNHg0U3JjWSAqIChCbG9ja1kgPDwgMikgKyAKKyAgICAgICAgICAgIChCbG9ja1ggPDwgMik7CisgICAgICAgICAgICAKKyAgICBTdGVwU3JjWSA9IFN0ZXBQcmVkSW50cmE0eDRTcmNZOworICAgICAgICAgICAgICAKKyAgICB4ID0gQmxvY2tYICogNDsKKyAgICB5ID0gQmxvY2tZICogNDsKKworICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIC8qIEdvIHRocm91Z2ggZWFjaCBtb2RlIGZvciBtaW5pbSBjb3N0ICovCisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDk7IG1vZGUrKykKKyAgICB7CisgICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKyAgICAgICAgICAgICBwU3JjWSAtIDEsCisgICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSwKKyAgICAgICAgICAgICBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKKyAgICAgICAgICAgICBwUHJlZEJsb2NrLAorICAgICAgICAgICAgIFN0ZXBTcmNZLAorICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlLAorICAgICAgICAgICAgIGF2YWlsYWJpbGl0eSk7CisgICAgICAgICAgICAgCisgICAgICAgIGlmIChSZXQgPT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCisgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyAoeSAqIFNyY0N1cnJTdGVwKSArIHgsCisgICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCisgICAgICAgICAgICAgICAgcFByZWRCbG9jaywKKyAgICAgICAgICAgICAgICA0LAorICAgICAgICAgICAgICAgICZDb3N0LAorICAgICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgICAgNCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChDb3N0IDwgQmVzdENvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKyAxXVtCbG9ja1ggKyAxXSA9IAorICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKiA0ICsgQmxvY2tYXSA9IAorICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1kgW1N0ZXBTcmNZICogaiArIGldID0gcFByZWRCbG9jayBbNCAqIGogKyBpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICpwQmVzdENvc3QgPSBCZXN0Q29zdDsKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gdGhlIE1WIFByZWRpY3Rpb24gZm9yIEludGVyIE1CcworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIEJsb2NrU3RhcnRYIC0gU3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMgaW4gY3VycmVudCBCbG9jaworICogW2luXSBCbG9ja1N0YXJ0WSAtIFN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKKyAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCisgKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byBSZWYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KKyAqIFtvdXRdIHBNVlByZWQgICAgLSBQb2ludGVyIHRvIHByZWRpY3RlZCBNVnMKKyAqIFJlbWFya3M6CisgKgorICogUmV0dXJuIFZhbHVlOgorICogTm9uZQorICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IoCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCisgICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZXgsCisgICAgT01YX1UzMiBCbG9ja1NpemV5LAorICAgIE9NWF9TMzIgUmVmRnJhbWUsCisgICAgT01YX1MzMiBwUmVmRnJBcnJbXVs2XSwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyW11bMTJdLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkCispCit7CisgICAgT01YX1MzMiAgICAgUkZyYW1lTDsgICAgICAgLyogTGVmdCAqLworICAgIE9NWF9TMzIgICAgIFJGcmFtZVU7ICAgICAgIC8qIFVwICovCisgICAgT01YX1MzMiAgICAgUkZyYW1lVVI7ICAgICAgLyogVXAtUmlnaHQgKi8KKworICAgIE9NWF9TMzIgICAgIEJsb2NrWCwgQmxvY2tZLCBCbG9ja1hGciwgQmxvY2tZRnIsIE1WUHJlZFR5cGU7CisgICAgT01YX1MzMiAgICAgQmxvY2tYUGx1c09mZiwgQmxvY2tYUGx1c09mZkZyLCBCbG9ja1hNaW4xRnIsIEJsb2NrWU1pbjFGcjsKKyAgICAKKyAgICBCbG9ja1ggPSA0ICsgKEJsb2NrU3RhcnRYID4+IDIpOworICAgIEJsb2NrWSA9IDQgKyAoQmxvY2tTdGFydFkgPj4gMik7IAorICAgIEJsb2NrWFBsdXNPZmYgPSBCbG9ja1ggKyAoQmxvY2tTaXpleCA+PiAyKTsKKyAgICAKKyAgICBCbG9ja1hGciA9IEJsb2NrWCA+PiAxOyAgCisgICAgQmxvY2tZRnIgPSBCbG9ja1kgPj4gMTsgIAorICAgIEJsb2NrWE1pbjFGciA9IChCbG9ja1ggLSAxKSA+PiAxOyAgCisgICAgQmxvY2tZTWluMUZyID0gKEJsb2NrWSAtIDEpID4+IDE7ICAKKyAgICBCbG9ja1hQbHVzT2ZmRnIgPSBCbG9ja1hQbHVzT2ZmID4+IDE7CisgICAgCisgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU47CisKKyAgICBSRnJhbWVMID0gcFJlZkZyQXJyIFtCbG9ja1lGcl1bQmxvY2tYTWluMUZyXTsKKyAgICBSRnJhbWVVID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXTsKKyAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdOworCisgICAgaWYgKFJGcmFtZVVSID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCisgICAgeworICAgICAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hNaW4xRnJdOworICAgIH0KKworICAgIC8qIAorICAgICAqIFByZWRpY3Rpb24gaWYgb25seSBvbmUgb2YgdGhlIG5laWdoYm9ycyB1c2VzIHRoZSByZWZlcmVuY2UgZnJhbWUKKyAgICAgKiB3ZSBhcmUgY2hlY2tpbmcKKyAgICAgKi8KKyAgCisgICAgaWYgKFJGcmFtZUwgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiAhPSBSZWZGcmFtZSkKKyAgICB7CisgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKKyAgICB9CisgICAgZWxzZSBpZihSRnJhbWVMICE9IFJlZkZyYW1lICYmIFJGcmFtZVUgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCisgICAgeworICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7CisgICAgfQorICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVICE9IFJlZkZyYW1lICYmIFJGcmFtZVVSID09IFJlZkZyYW1lKQorICAgIHsKKyAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKKyAgICB9CisKKyAgICAvKiBEaXJlY3Rpb25hbCBwcmVkaWN0aW9ucyAgKi8KKyAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gOCAmJiBCbG9ja1NpemV5ID09IDE2KQorICAgIHsKKyAgICAgICAgaWYoQmxvY2tTdGFydFggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkZyYW1lVVIgPT0gUmVmRnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gMTYgJiYgQmxvY2tTaXpleSA9PSA4KQorICAgIHsKKyAgICAgICAgaWYoQmxvY2tTdGFydFkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUkZyYW1lVSA9PSBSZWZGcmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihSRnJhbWVMID09IFJlZkZyYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoTVZQcmVkVHlwZSkKKyAgICB7CisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOgorICAgICAgICBpZiAoIShwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAorICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgfHwgCisgICAgICAgICAgICAgIHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spKQorICAgICAgICB7CisgICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keDsKKyAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSAKKyAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHgsIAorICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHgpOworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSAKKyAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5LCAKKyAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHksIAorICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTDoKKyAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7CisgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VOgorICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keDsKKyAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOgorICAgICAgICBpZiAocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4OworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR4OworICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2gKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEdldHMgYmVzdCBNViBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVmWSAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCisgKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW5dIG5MYW1kYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQmVzdENvc3QgIC0gTWluaW11bSBjb3N0IGZvciBlbmNvZGluZyBjdXJyZW50IGJsb2NrIAorICogW291dF0gcEJlc3RNViAgICAtIE1WIGNvcnJlc3BvbmRpbmcgdG8gYmVzdCBjb3N0CisgKiBbaW5dIEJsb2NrU3RhcnRYIC0gQmxvY2sgc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKKyAqIFtpbl0gQmxvY2tTdGFydFkgLSBCbG9jayBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBCbG9ja1NpemVYICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gQmxvY2tTaXplWSAgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jaworICogW2luXSBSZWZGcmFtZSAgICAtIEluZGV4IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHByZWRpY3Rpb24KKyAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIHByZWRpY3Rpb24KKyAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgorICogW2luXSBwTVZQcmVkICAgICAtIFBvaW50ZXIgdG8gTVYgcHJlZGljdGVkIGZyb20gbmVpZ2hib3VyIE1WcworICogUmVtYXJrczoKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQKKyAqCisgKi8KK3N0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQqIHBNRVNwZWMsIAorCisgICAgT01YX1MzMiBuTGFtZGEsCisgICAgT01YX1MzMiogcEJlc3RDb3N0LCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICAKKyAgICBPTVhfVTMyIEJsb2NrU3RhcnRYLCAKKyAgICBPTVhfVTMyIEJsb2NrU3RhcnRZLAorICAgIE9NWF9VMzIgQmxvY2tTaXplWCwKKyAgICBPTVhfVTMyIEJsb2NrU2l6ZVksCisgICAgT01YX1MzMiBSZWZGcmFtZSwKKyAgICBPTVhfUzMyIHBSZWZGckFyciBbXVs2XSwgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyIFtdWzEyXSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAorICAgKQoreworCisgICAgT01YVkNNb3Rpb25WZWN0b3IgICBNVkNhbGN1bGF0ZWQsIE1WQ2FuZGlkYXRlOworICAgIE9NWF9TMzIgICAgICAgICAgICAgQ29zdDsKKyAgICBPTVhSZXN1bHQgICAgICAgICAgIFJldFZhbHVlOworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgICAgCisJT01YVkNNNFAyQ29vcmRpbmF0ZSBDdXJyQmxvY2tQb3M7CisKKyAgICAvKiBHZXQgUHJlZGljdGVkIE1vdGlvbiBWZWN0b3JzICovCisgICAgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IgKAorICAgICAgICBCbG9ja1N0YXJ0WCwgCisgICAgICAgIEJsb2NrU3RhcnRZLAorICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgQmxvY2tTaXplWSwKKyAgICAgICAgUmVmRnJhbWUsCisgICAgICAgIHBSZWZGckFyciwgICAKKyAgICAgICAgcE1WQXJyLCAgICAgIAorICAgICAgICBwTVZQcmVkKTsKKworICAgIC8qIEluaXRpYWxpemUgY2FuZGlkYXRlIE1WICovCisgICAgTVZDYW5kaWRhdGUuZHggPSAwOworICAgIE1WQ2FuZGlkYXRlLmR5ID0gMDsKKyAgICAKKyAgICBDdXJyQmxvY2tQb3MueCA9IHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1N0YXJ0WDsKKyAgICBDdXJyQmxvY2tQb3MueSA9IHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1N0YXJ0WTsKKworICAgIC8qIEJsb2NrIE1hdGNoIEludGVnZXIgKi8KKyAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICAgICAgcFNyY0N1cnJCdWYsIAorICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgIHBTcmNSZWZZLCAKKyAgICAgICAgblNyY1JlZlN0ZXAsIAorICAgICAgICBwUmVmUmVjdCwgCisgICAgICAgICZDdXJyQmxvY2tQb3MsIAorICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgQmxvY2tTaXplWSwgCisgICAgICAgIG5MYW1kYSwgCisgICAgICAgIHBNVlByZWQsIAorICAgICAgICAmTVZDYW5kaWRhdGUsIAorICAgICAgICAmTVZDYWxjdWxhdGVkLCAKKyAgICAgICAgJkNvc3QsIAorICAgICAgICBwTUVTcGVjKTsKKyAgICAKKyAgICAvKiB1cGRhdGVkIEJlc3RNViovCisgICAgLyoqcEJlc3RDb3N0ID0gQ29zdDsKKyAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKKyAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsqLworCisgICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOworICAgIAorICAgIC8qIEJsb2NrIE1hdGNoIEhhbGYgcGVsICovCisgICAgaWYgKHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZSkKKyAgICB7CisgICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCisgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICBwU3JjUmVmWSwgCisgICAgICAgICAgICBuU3JjUmVmU3RlcCwgCisgICAgICAgICAgICBCbG9ja1NpemVYLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVksIAorICAgICAgICAgICAgbkxhbWRhLCAKKyAgICAgICAgICAgIHBNVlByZWQsIAorICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgICAgICAgIC8qIGlucHV0L291dHB1dCovCisgICAgICAgICAgICAmQ29zdCk7CisgICAgfQorCisgICAgLyogQmxvY2sgTWF0Y2ggUXVhcnRlciBwZWwgKi8KKyAgICBpZiAocE1FUGFyYW1zLT5xdWFydGVyU2VhcmNoRW5hYmxlKQorICAgIHsKKyAgICAgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAKKyAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKKyAgICAgICAgICAgIHBTcmNSZWZZLCAKKyAgICAgICAgICAgIG5TcmNSZWZTdGVwLCAKKyAgICAgICAgICAgIEJsb2NrU2l6ZVgsIAorICAgICAgICAgICAgQmxvY2tTaXplWSwgCisgICAgICAgICAgICBuTGFtZGEsIAorICAgICAgICAgICAgcE1WUHJlZCwgCisgICAgICAgICAgICAmTVZDYWxjdWxhdGVkLCAKKyAgICAgICAgICAgICZDb3N0KTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGVkIEJlc3QgQ29zdCBhbmQgQmVzdCBNViAqLworICAgICpwQmVzdENvc3QgPSBDb3N0OworICAgIHBCZXN0TVYtPmR4ID0gTVZDYWxjdWxhdGVkLmR4OworICAgIHBCZXN0TVYtPmR5ID0gTVZDYWxjdWxhdGVkLmR5OworCisgICAgLyoKKyAgICAgKiBTa2lwIE1CIGNvc3QgY2FsY3VsYXRpb25zIG9mIDE2eDE2IGludGVyIG1vZGUKKyAgICAgKi8KKyAgICByZXR1cm4gUmV0VmFsdWU7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfUGFydGl0aW9uTUUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgIEdldHMgYmVzdCBjb3N0IGZvciB0aGUgY3VycmVudCBwYXJ0aXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKKyAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAorICogW2luXSBwU3JjUmVmQnVmTGlzdCAgICAtIFBvaW50ZXIgdG8gTGlzdCBvZiByZWYgYnVmZmVyIG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCisgKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gUGFydFdpZHRoICAgLSBXaWR0aCBvZiBjdXJyZW50IHBhcnRpdGlvbgorICogW2luXSBQYXJ0SGVpZ2h0ICAtIEhlaWdodCBvZiBjdXJyZW50IHBhcnRpdGlvbgorICogW2luXSBCbG9ja1dpZHRoICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jaworICogW2luXSBQYXJ0U3RhcnRYICAtIFBhcnRpdGlvbiBzdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBQYXJ0U3RhcnRZICAtIFBhcnRpdGlvbiBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscworICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCisgKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdAorICoKKyAqLworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAorICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCisJY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKKwlPTVhfUzMyIFNyY1JlZlN0ZXAsCisJY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisJY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkKiBwTUVTcGVjLCAKKworICAgIE9NWF9TMzIgUGFydFdpZHRoLAorICAgIE9NWF9TMzIgUGFydEhlaWdodCwKKyAgICBPTVhfUzMyIEJsb2NrV2lkdGgsCisgICAgT01YX1MzMiBCbG9ja0hlaWdodCwKKyAgICBPTVhfUzMyIFBhcnRTdGFydFgsIAorICAgIE9NWF9TMzIgUGFydFN0YXJ0WSwKKworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCisgICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZEFyciBbXVs0XSwKKworICAgIE9NWF9TMzIgTGFtYmRhLAorICAgIE9NWF9TMzIgKnBDb3N0CispCit7CisgICAgT01YX1UzMiAgICAgeCwgeSwgaSwgaiwgcmVmLCBPZmZYLCBPZmZZLCBPZmZTcmMsIE9mZlJlZjsKKyAgICBPTVhfUzMyICAgICBCbG9ja0Nvc3QsIFBhcnRpdGlvbkNvc3QsIEJlc3RDb3N0OworICAgIE9NWF9TMzIgICAgIEJlc3RSZWZGcmFtZT0wOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgQmVzdE1WIFs0XVs0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNVlByZWQgWzRdWzRdOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZQcmVkOworICAgIE9NWFZDTW90aW9uVmVjdG9yICAgRHN0TVY7CisKKyAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgIAorICAgIGZvciAocmVmID0gMDsgcmVmIDwgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUzsgcmVmKyspCisgICAgeworICAgICAgICBpZiAocFNyY1JlZkJ1Zkxpc3QgW3JlZl0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAJLyogTm8gcmVmZXJlbmNlIGZyYW1lLCBjb250aW51ZSAqLworICAgICAgICAJY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBQYXJ0aXRpb25Db3N0ID0gMDsKKyAgICAgICAgCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBQYXJ0SGVpZ2h0OyB5ICs9IEJsb2NrSGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgUGFydFdpZHRoOyB4ICs9IEJsb2NrV2lkdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJT2ZmU3JjID0gU3JjQ3VyclN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7CisgICAgICAgICAgICAJT2ZmUmVmID0gU3JjUmVmU3RlcCAqIChQYXJ0U3RhcnRZICsgeSkgKyBQYXJ0U3RhcnRYICsgeDsKKyAgICAgICAgICAgICAgICBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoICgKKyAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyBPZmZTcmMsIAorICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCisgICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0IFtyZWZdICsgT2ZmUmVmLCAKKyAgICAgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwgCisgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLCAKKworICAgICAgICAgICAgICAgICAgICBMYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICZCbG9ja0Nvc3QsIAorICAgICAgICAgICAgICAgICAgICAmRHN0TVYsCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB4ICsgUGFydFN0YXJ0WCwgCisgICAgICAgICAgICAgICAgICAgIHkgKyBQYXJ0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAorICAgICAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcmVmLAorICAgICAgICAgICAgICAgICAgICBwUmVmRnJBcnIsIAorICAgICAgICAgICAgICAgICAgICBwTVZBcnIsCisgICAgICAgICAgICAgICAgICAgICZNVlByZWQpOworCisgICAgICAgICAgICAgICAgUGFydGl0aW9uQ29zdCArPSBCbG9ja0Nvc3Q7CisJCQkJCisJCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCkgPj4gMjsKKwkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5KSA+PiAyOworCQkJCQorCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQorCSAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keCA9IERzdE1WLmR4OworCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHkgPSBEc3RNVi5keTsKKwkgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHggPSBNVlByZWQuZHg7CisJICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR5ID0gTVZQcmVkLmR5OworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCisJCQkJcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSldWzIgKyAoT2ZmWCA+PiAxKV0gPSByZWY7CisJICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCisJICAgICAgICAgICAgICAgIHsKKwkJCSAgICAgICAgICAgIHBSZWZGckFyciBbMiArIChPZmZZID4+IDEpICsgal1bMiArIChPZmZYID4+IDEpICsgaV0gPSByZWY7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJCS8qCisJCSAqIElmIFBhcnRpdGlvbkNvc3QgaXMgbGVzcyBmb3IgdGhpcyByZWZlcmVuY2UgZnJhbWUsIG1vdGlvbiB2ZWN0b3JzIG5lZWRzIHRvIGJlIGJhY2tlZHVwCisJCSAqLworICAgICAgICBpZiAoUGFydGl0aW9uQ29zdCA8PSBCZXN0Q29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQmVzdENvc3QgPSBQYXJ0aXRpb25Db3N0OyAgICAgICAgICAgIAorICAgICAgICAgICAgQmVzdFJlZkZyYW1lID0gcmVmOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKKyAgICAgICAgICAgICAgICB7CisJCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHggKiBCbG9ja1dpZHRoKSA+PiAyOworCQkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7CisJCQkJCisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keCA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keDsKKyAgICAgICAgICAgICAgICAgICAgQmVzdE1WW3ldW3hdLmR5ID0gcE1WQXJyIFs0ICsgT2ZmWV1bNCArIE9mZlhdLmR5OworICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR4ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHg7CisgICAgICAgICAgICAgICAgICAgIEJlc3RNVlByZWRbeV1beF0uZHkgPSBwTVZQcmVkQXJyIFtPZmZZXVtPZmZYXS5keTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCS8qCisJICogQ29weSBiYWNrIGJlc3QgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBhbmQgY29zdC4KKwkgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgKFBhcnRXaWR0aC9CbG9ja1dpZHRoKTsgeCsrKQorICAgICAgICB7CisJCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKKwkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkgKiBCbG9ja0hlaWdodCkgPj4gMjsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAyKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBCZXN0TVZbeV1beF0uZHg7CisgICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gQmVzdE1WW3ldW3hdLmR5OworICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gQmVzdE1WUHJlZFt5XVt4XS5keDsKKyAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IEJlc3RNVlByZWRbeV1beF0uZHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDMpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCisgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gQmVzdFJlZkZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCSpwQ29zdCA9IEJlc3RDb3N0OworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKKyAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAorICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCisgKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCisgKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCisgKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcworICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW5dIHBNQkludHJhICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCisgKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAorICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0CisgKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRyYTE2eDE2CisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCisgICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCisgICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTMyICpwQ29zdCkKK3sKKyAgICBPTVhfVTggICAgICBQcmVkQnVmIFsxNioxNiArIDE2XTsKKyAgICBPTVhfVTggICAgICAqcFByZWQ7CisgICAgT01YX1MzMiAgICAgbW9kZTsKKyAgICBPTVhfUzMyICAgICBDb3N0OworICAgIE9NWF9TMzIgICAgIGF2YWlsYWJpbGl0eSA9IDA7CisgICAgT01YUmVzdWx0ICAgUmV0OworICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgICAgSW50cmFNb2RlMTZ4MTYgWzRdID0gCisgICAgICAgIHtPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiwgCisgICAgICAgIE9NWF9WQ18xNlgxNl9EQywgT01YX1ZDXzE2WDE2X1BMQU5FfTsgICAgICAgIAorICAgIE9NWF9VMzIgICAgIE1CUG9zWCA9IHBDdXJyUG9pbnRQb3MtPnggPj4gNDsgICAgICAgIAorICAgIE9NWF9VMzIgICAgIE1CUG9zWSA9IHBDdXJyUG9pbnRQb3MtPnkgPj4gNDsgICAgICAgIAorCisJcFByZWQgPSBhcm1BbGlnblRvMTZCeXRlcyhQcmVkQnVmKTsKKyAgICAKKwkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgTUIgKi8KKyAgICBpZiAoKE1CUG9zWCAhPSAwKSAmJiAocE1CSW50cmEgWzBdICE9IDAgfHwgcE1CSW50ZXIgWzBdICE9IDApKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUCBNQiAqLworICAgIGlmICgoTUJQb3NZICE9IDApICYmIChwTUJJbnRyYSBbMV0gIT0gMCB8fCBwTUJJbnRlciBbMV0gIT0gMCkpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUC1MRUZUIE1CICovCisgICAgaWYgKChNQlBvc1ggPiAwKSAmJiAoTUJQb3NZID4gMCkgJiYgCisgICAgICAgIChwTUJJbnRyYSBbMl0gIT0gMCB8fCBwTUJJbnRlciBbMl0gIT0gMCkpCisgICAgeworICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKKyAgICB9CisKKyAgICAqcENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgNDsgbW9kZSsrKQorICAgIHsKKyAgICAgICAgUmV0ID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCisgICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIDEsIAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwLCAKKyAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAorICAgICAgICAgICAgICAgIHBQcmVkLCAKKyAgICAgICAgICAgICAgICBTcmNSZWNTdGVwLCAKKyAgICAgICAgICAgICAgICAxNiwgCisgICAgICAgICAgICAgICAgSW50cmFNb2RlMTZ4MTYgW21vZGVdLCAKKyAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOworICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKCAgICAKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwUHJlZCwKKyAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAmQ29zdCwKKyAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAxNik7CisgICAgICAgICAgICBpZiAoQ29zdCA8ICpwQ29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPkludHJhMTZ4MTZQcmVkTW9kZSA9IEludHJhTW9kZTE2eDE2IFttb2RlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIEludHJhIDR4NCBNQiB0eXBlIGFuZCBzZWxlY3RzCisgKiB0aGUgYmVzdCBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVjb25zdHJ1Y3RlZCBNQiAKKyAqIFtpbl0gU3JjUmVjU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlY0J1ZiAKKyAqIFtpbl0gbk1CUG9zWCAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWCBheGlzCisgKiBbaW5dIG5NQlBvc1kgICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFkgYXhpcworICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgorICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKKyAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAorICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmE0eDQKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICoKKyAqLworCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCisgICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UzMiAqcENvc3QpCit7CisgICAgT01YX1MzMiAgICAgeCwgeSwgQmxvY2s0eDQsIEJsb2NrOHg4OworICAgIE9NWF9TMzIgICAgIENvc3Q7CisKKyAgICAvKgorICAgICAqIFByZWRJbnRyYTR4NE1vZGUgd2lsbCBzdG9yZSBwcmVkaWN0aW9uIG1vZGVzIG9mIDR4NCBibG9ja3MuIAorICAgICAqIE1vZGVzIGZvciBjdXJyZW50IE1CIHN0YXJ0cyBhdCBpbmRleCBbMV1bMV0uICAgCisgICAgICogTW9kZXMgb2YgbmlnaGJvdXJpbmcgTUIncyB3aWxsIGJlIGFzIHNob3duIGJlbG93CisgICAgICogQSB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIGZvciBhbnkgYmxvY2sgaW4gdGhpcyBhcnJheSBtZWFucyAKKyAgICAgKiB0aGF0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByZWRpY3Rpb24uCisgICAgICoKKyAgICAgKiBjMyBiMCBiMSBiMiBiMyBkMCBkMSBkMiBkMworICAgICAqIGEwIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKiBhMSB4eCB4eCB4eCB4eCAtICAtICAtICAtCisgICAgICogYTIgeHggeHggeHggeHggLSAgLSAgLSAgLQorICAgICAqIGEzIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KKyAgICAgKgorICAgICAqLworICAgIE9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOworCisgICAgLyoKKyAgICAgKiBwU3JjWSBzdG9yZXMgcmUtY29uc3RydXN0ZWQgc291cmNlIGFycmF5IG9mIHNpemUgM01CIFggMk1CIGFzIGJlbG93CisgICAgICoKKyAgICAgKiBNQjExIE1CMTIgTUIxMyAKKyAgICAgKiBNQjIxIE1CMjIgTUIyMworICAgICAqCisgICAgICogVGhpcyBhcnJheSB3aWxsIGJlIHVzZWQgZm9yIGxvY2FsIHJlY29uc3RydWN0aW9uIG9mIDR4NCBibG9ja3MgCisgICAgICogd2l0aCBiZXN0IHByZWRpY3Rpb24gbW9kZSB3aXRoaW4gYW4gTUIKKyAgICAgKi8gICAgCisgICAgT01YX1U4ICAgICAgcFNyY1kgWygxNiozKSooMTYqMildOworICAgIE9NWF9TMzIgICAgIFN0ZXBTcmNZOworICAgIAorICAgIC8qIGluaXQgKi8KKyAgICAqcENvc3QgPSAwOworCisgICAgZm9yICh5ID0gMDsgeSA8IDU7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA5OyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB3aXRoIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0ssIHRvIG1lYW4gdGhpcyAKKyAgICAgICAgICAgICAqIDR4NCBibG9jayBpcyBub3QgYXZhaWxhYmxlIAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXBsYWNlIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgdmFsdWUgd2l0aCBhdmFpbGFibGUgTUJzIHZhbHVlcyovCisgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBiMCwgYjEsIGIyLCBiMyAqLworICAgICAgICBpZiAocE1CSW50cmFbMV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDFdID0gCisgICAgICAgICAgICAgICAgcE1CSW50cmFbMV0tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgZDAsIGQxLCBkMiwgZDMgKi8KKyAgICAgICAgaWYgKHBNQkludHJhWzNdICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyA1XSA9IAorICAgICAgICAgICAgICAgIHBNQkludHJhWzNdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KKyAgICBpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKKyAgICB9CisgICAgCisgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLworICAgICAgICBpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCisgICAgICAgICAgICAgICAgcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgUHJlZCBtb2RlIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKKyAgICAgKiBwcmVkaWN0aW9uIG9mIEludHJhNHg0IG1vZGVzLgorICAgICAqLworICAgIAorICAgIFN0ZXBTcmNZID0gMTYgKiAzOworICAgIGZvciAoeSA9IDA7IHkgPCAoMTYgKiAyKTsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8ICgxNiAqIDMpOyB4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIHkgKyB4XSA9IAorICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgW1NyY1JlY1N0ZXAgKiAoeSAtIDE2KSArIHggLSAxNl07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCisgICAgZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKKyAgICB7CisgICAgICAgIC8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCisgICAgICAgIGZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgICAgIEJsb2NrOHg4LCAKKyAgICAgICAgICAgICAgICBCbG9jazR4NCwKKyAgICAgICAgICAgICAgICBwU3JjWSArIDE2ICogU3RlcFNyY1kgKyAxNiwKKyAgICAgICAgICAgICAgICBTdGVwU3JjWSwKKyAgICAgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlLCAKKyAgICAgICAgICAgICAgICAmQ29zdCk7CisKKyAgICAgICAgICAgICpwQ29zdCArPSBDb3N0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVyTUVNQgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIElOVEVSIE1CIHR5cGUgYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiBzdHJhdGVneSBmcm9tIAorICogdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBJU08vSUVDIDE0NDk2LTEwLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCisgKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKKyAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgorICogW2luXSBTcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKKyAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgorICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KKyAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKKyAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKKyAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCisgKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAorICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKKyAqIFtvdXRdIHBEc3RDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludGVyIE1CCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqCisgKi8KKworc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVyTUVNQigKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAKKwlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKwljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAorCU9NWF9TMzIgU3JjUmVmU3RlcCwKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorCU9NWF9VMzIgTGFtYmRhLAorCXZvaWQgKnBNRVNwZWMsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKKwlPTVhfVTMyICpwRHN0Q29zdCkKK3sKKyAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBtb2RlOworICAgIE9NWF9VMzIgICAgIEJsb2NrOHg4LCBYUGVyTUIsIFlQZXJNQiwgQmxvY2syeCwgQmxvY2syeTsKKyAgICBPTVhfUzMyICAgICBQYXJ0U3RhcnRYID0gMCwgUGFydFN0YXJ0WSA9IDA7CisgICAgT01YX1MzMiAgICAgUGFydFdpZHRoID0gOCwgUGFydEhlaWdodCA9IDgsIEJsb2NrV2lkdGggPSA0LCBCbG9ja0hlaWdodCA9IDQ7CisgICAgY29uc3QgT01YX1UzMiAgICAgQmxrU3ogWzRdWzJdID0ge3s0LDR9LCB7NCw4fSwgezgsNH19OworICAgIGNvbnN0IE9NWF9VMzIgICAgIFBhcnRTeiBbNF1bMl0gPSB7ezgsOH0sIHs4LDE2fSwgezE2LDh9LCB7MTYsMTZ9fTsKKyAgICBjb25zdCBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgICAgIAorICAgICAgICAgICAgICAgIE1vZGVTdWJNQlR5cGU0eDQgW10gPSB7T01YX1ZDX1NVQl9QXzR4NCwgT01YX1ZDX1NVQl9QXzR4OCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfU1VCX1BfOHg0LCBPTVhfVkNfU1VCX1BfOHg4fTsKKyAgICBjb25zdCBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUKKyAgICAgICAgICAgICAgICBNb2RlTUJUeXBlIFtdID0ge09NWF9WQ19QXzh4OCwgT01YX1ZDX1BfOHgxNiwgT01YX1ZDX1BfMTZ4OCwgT01YX1ZDX1BfMTZ4MTZ9OworICAgIAorICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNQk9wdGlvbnM7CisgICAgLyoKKyAgICAgKiBSZWZGckFyciBhbmQgIE1WQXJyIHdpbGwgYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2Ugb2YgUmVmZXJlbmNlIGZyYW1lIGluZGV4IGFuZCBNVnMKKyAgICAgKiBJdCB3aWxsIHN0b3JlIFJlZkluZGV4IGFuZCBNVnMgb2YgNiBNQnMgYXMgc2hvd24gYmVsb3cKKyAgICAgKiAKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqICAgICB8VHAtTHQgfFRvcCAgIHxUcC1SICB8CisgICAgICogICAgIHwgTUIgICB8IE1CICAgfCBNQiAgIHwKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqICAgICB8TGVmdCAgfCBDdXJyIHwgICAgICB8CisgICAgICogICAgIHwgTUIgICB8IE1CICAgfCAgICAgIHwKKyAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAorICAgICAqLworICAgIE9NWF9TMzIgICAgIFJlZkZyQXJyIFs0XVs2XTsgCisgICAgT01YVkNNb3Rpb25WZWN0b3IgTVZBcnIgWzhdWzEyXTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBNVlByZWRBcnIgWzRdWzRdOworICAgIAorICAgIC8qCisgICAgICogSW5kZXhUb0xvYyB3aWxsIHRyYW5zbGF0ZSBwTUJJbnRlciBpbmRleCBpbnRvIHNwYWNpYWwgYXJyYW5nZW1lbnQgb2YgTUJzCisgICAgICovCisgICAgT01YX1MzMiAgICAgSW5kZXhUb0xvYyBbXSA9IHsyLDEsMywwfTsKKyAgICBPTVhfVTMyICAgICBwYXJ0LCBNYXhQYXJ0OworICAgIE9NWF9TMzIgICAgIENvc3QsIE1vdGlvbkNvc3Q4eDggWzRdLCBNQkNvc3QsIEJlc3RDb3N0OworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIE1WIGFycmF5IGFuZCBSZWYgZnJhbWUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgorICAgICAqIHByZWRpY3Rpb24gb2YgTVZzIGFuZCBSZWYgZnJhbWVzLgorICAgICAqLworCisgICAgLyogU2V0IGNvc3QgdG8gYSBoaWdoIHZhbHVlICovCisgICAgQ29zdCA9IEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxMjsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMyAqICh5ID4+IDIpICsgKHggPj4gMik7CisgICAgICAgICAgICBpZiAoKHkgPCA0IHx8IHggPCA0KSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHg7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gMDsKKyAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAKKworICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNjsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMyAqICh5ID4+IDEpICsgKHggPj4gMSk7CisgICAgICAgICAgICBpZiAoKHkgPCAyIHx8IHggPCAyKSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gCisgICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wUmVmTDBJZHggWyh5ICUgMikgKiAyICsgKHggJSAyKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgCisKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keCA9IDA7CisgICAgICAgICAgICBNVlByZWRBcnIgW3ldW3hdLmR5ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIE1vdGlvbiBFc3RpbWF0aW9uIGZvciA4eDggTUIgUGFydGl0aW9uIAorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIE1vdGlvbkNvc3Q4eDggW2ldID0gMDsKKyAgICB9ICAgICAgICAKKyAgICAKKyAgICBwTUJPcHRpb25zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOworICAgIAorICAgIGlmIChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgJiYgCisgICAgICAgIHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU0eDQgPT0gMSkKKyAgICB7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19QXzh4ODsKKworICAgICAgICBQYXJ0V2lkdGggPSBQYXJ0U3ogWzBdWzBdOworICAgICAgICBQYXJ0SGVpZ2h0ID0gUGFydFN6IFswXVsxXTsKKyAgICAgICAgCisgICAgICAgIC8qIEZvciBlYWNoIDh4OCBwYXJ0aXRpb25zICovCisgICAgICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnRTdGFydFggPSAoQmxvY2s4eDggJSAyKSA8PCAzOworICAgICAgICAgICAgUGFydFN0YXJ0WSA9IChCbG9jazh4OCAvIDIpIDw8IDM7CisKKyAgICAgICAgICAgIEJsb2NrMnggPSAoQmxvY2s4eDggJiAxKSA8PCAxOworICAgICAgICAgICAgQmxvY2syeSA9IChCbG9jazh4OCA+PiAxKSA8PCAxOworICAgICAgICAgICAgCisgICAgICAgICAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOworICAgICAgICAgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDM7IG1vZGUrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCbG9ja1dpZHRoID0gQmxrU3ogW21vZGVdWzBdOworICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0ID0gQmxrU3ogW21vZGVdWzFdOworCisgICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCisgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAorICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCisgICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLAorCisgICAgICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgUGFydEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCisgICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFksCisKKyAgICAgICAgICAgICAgICAgICAgTVZBcnIsCisgICAgICAgICAgICAgICAgICAgIFJlZkZyQXJyLAorICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIsCisKKyAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAmQ29zdCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChDb3N0IDw9IEJlc3RDb3N0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIE1CQ3VyciBzdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+c3ViTUJUeXBlIFtCbG9jazh4OF0gPSBNb2RlU3ViTUJUeXBlNHg0IFttb2RlXTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbQmxvY2s4eDhdID0gUmVmRnJBcnIgWzIgKyAoUGFydFN0YXJ0WSA+PiAzKV1bMiArIChQYXJ0U3RhcnRYID4+IDMpXTsKKworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcE1WMCBhbmQgcE1WUHJlZCBvZiBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLworICAgICAgICAgICAgTW90aW9uQ29zdDh4OCBbQmxvY2s4eDhdID0gQmVzdENvc3Q7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIENvc3QgZm9yIG1iVHlwZSBPTVhfVkNfUF84eDggKi8KKyAgICAgICAgQmVzdENvc3QgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCZXN0Q29zdCArPSBNb3Rpb25Db3N0OHg4IFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTZXQgc3ViIE1CIHR5cGUgdG8gOHg4ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbaV0gPSBPTVhfVkNfU1VCX1BfOHg4OworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4LCA4eDE2LCAxNng4IGFuZCAxNngxNiBNQiBQYXJ0aXRpb24KKyAgICAgKiBJZiBwTUJPcHRpb25zLT5iOHg4QmxvY2tTcGxpdEVuYWJsZSBpcyAwLCBkbyBvbmx5IDE2eDE2IE1FIChtb2RlIDMpCisgICAgICovCisgICAgZm9yIChtb2RlID0gKHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU4eDggPT0gMSA/IDAgOiAzKTsgbW9kZSA8IDQ7IG1vZGUrKykKKyAgICB7CisgICAgICAgIEJsb2NrV2lkdGggPSBQYXJ0V2lkdGggPSBQYXJ0U3ogW21vZGVdWzBdOworICAgICAgICBCbG9ja0hlaWdodCA9IFBhcnRIZWlnaHQgPSBQYXJ0U3ogW21vZGVdWzFdOworICAgICAgICAKKyAgICAgICAgWFBlck1CID0gMTYgLyBQYXJ0V2lkdGg7CisgICAgICAgIFlQZXJNQiA9IDE2IC8gUGFydEhlaWdodDsKKyAgICAgICAgTWF4UGFydCA9IFhQZXJNQiAqIFlQZXJNQjsKKyAgICAgICAgCisgICAgICAgIE1CQ29zdCA9IDA7CisgICAgICAgIAorICAgICAgICAvKiBwYXJ0IHNpemUgNCwgMiwgMiBhbmQgMSBjb3JyZXNwb25kaW5nIHRvIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgKi8KKyAgICAgICAgZm9yIChwYXJ0ID0gMDsgcGFydCA8IE1heFBhcnQ7IHBhcnQrKykKKyAgICAgICAgeworICAgICAgICAJUGFydFN0YXJ0WCA9IChwYXJ0ICUgWFBlck1CKSAqIFBhcnRXaWR0aDsKKyAgICAgICAgCVBhcnRTdGFydFkgPSAocGFydCAvIFhQZXJNQikgKiBQYXJ0SGVpZ2h0OworICAgICAgICAJCisgICAgICAgICAgICBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKKyAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKKyAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgICAgICAgICAgcE1FU3BlYywKKworICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKKyAgICAgICAgICAgICAgICBQYXJ0SGVpZ2h0LAorICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCisgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCisgICAgICAgICAgICAgICAgUGFydFN0YXJ0WCwKKyAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAorCisgICAgICAgICAgICAgICAgTVZBcnIsCisgICAgICAgICAgICAgICAgUmVmRnJBcnIsCisgICAgICAgICAgICAgICAgTVZQcmVkQXJyLAorCisgICAgICAgICAgICAgICAgTGFtYmRhLAorICAgICAgICAgICAgICAgICZDb3N0KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBNQkNvc3QgKz0gQ29zdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChNQkNvc3QgPD0gQmVzdENvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCisgICAgICAgICAgICBCZXN0Q29zdCA9IE1CQ29zdDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIG1iVHlwZSBvZiBNQkN1cnIgc3RydWN0ICovCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBNb2RlTUJUeXBlIFttb2RlXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHggPSBNVkFyciBbNCtqXVs0K2ldLmR4OworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtqXVtpXS5keSA9IE1WQXJyIFs0K2pdWzQraV0uZHk7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR4ID0gTVZQcmVkQXJyIFtqXVtpXS5keDsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbal1baV0uZHkgPSBNVlByZWRBcnIgW2pdW2ldLmR5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbaioyK2ldID0gUmVmRnJBcnIgWzIral1bMitpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIFVwZGF0ZSBCZXN0IENvc3QgKi8KKyAgICAqcERzdENvc3QgPSBCZXN0Q29zdDsKKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCisgKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAorICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAorICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAorICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCisgKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKKyAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKKyAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAorICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCisgKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKKyAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5URVIuIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzFdIAorICogICAgICAgICAgICAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byAKKyAqICAgICAgICAgICAgdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiAKKyAqICAgICAgICAgICAgaW5mb3JtYXRpb24gCisgKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVFJBLiBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsxXSAKKyAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCisgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiBNYlR5cGUgCisgKiAgICAgICAgICAgIHN1Yk1CVHlwZVs0XSBwTVYwWzRdWzRdIHBNVlByZWRbNF1bNF0gcFJlZkwwSWR4WzRdIAorICogICAgICAgICAgICBJbnRyYTE2eDE2UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKKyAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAorICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCisgKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCisgKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCisgCitPTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIoICAgICAgICAgICAgICAgICAgICAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKKwljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAorCU9NWF9TMzIgU3JjUmVmU3RlcCwKKwljb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsIAorCU9NWF9TMzIgU3JjUmVjU3RlcCwKKwljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKwljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorCU9NWF9VMzIgTGFtYmRhLAorCXZvaWQgKnBNRVNwZWMsCisJY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAorCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAorICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisJT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FEKQoreworICAgIE9NWF9VMzIgICAgIENvc3QsIGksIEludHJhRmxhZyA9IDE7CisgICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1FUGFyYW1zOyAKKworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWNCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBNQkludGVyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBNQkludHJhID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjUmVmU3RlcCA8PSAwIHx8IFNyY1JlZlN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjUmVjU3RlcCA8PSAwIHx8IFNyY1JlY1N0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoU3JjQ3VyclN0ZXAgPD0gMCB8fCBTcmNDdXJyU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpICAgIAorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY1JlY0J1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorCisgICAgZm9yIChpID0gMDsgaSA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IGkrKykKKyAgICB7CisgICAgICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmCisgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWZCdWZMaXN0IFtpXSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgICAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGlmIGN1cnJlbnQgTUIgbmVlZHMgSU5URVIgY29zdCBjYWxjdWxhdGlvbnMgKi8KKyAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmIEludHJhRmxhZyA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRyYUZsYWcgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgKnBEc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7CisgICAgLyoKKyAgICAgKiBJbnRlciBjb3N0IGNhbGN1bGF0aW9ucyAKKyAgICAgKi8KKworICAgICAvKiBjaGVjayB0aGlzIE1CIGNhbiBiZSBJbnRlciAqLworICAgIGlmIChJbnRyYUZsYWcgIT0gMSkKKyAgICB7CisgICAgICAgICBhcm1WQ000UDEwX0ludGVyTUVNQigKKyAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKKyAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKKyAgICAgICAgICAgICBTcmNSZWZTdGVwLAorICAgICAgICAgICAgIHBSZWZSZWN0LCAgICAKKyAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgIExhbWJkYSwKKyAgICAgICAgICAgICBwTUVTcGVjLAorICAgICAgICAgICAgIHBNQkludGVyLAorICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCisgICAgICAgICAgICAgJkNvc3QKKyAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKKyAgICB9ICAgICAKKworICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKilwTUVTcGVjOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0ID09IDEpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnRyYSA0eDQgY29zdCBjYWxjdWxhdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAorICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgICAgICBTcmNDdXJyU3RlcCwKKyAgICAgICAgICAgIHBTcmNSZWNCdWYsICAgCisgICAgICAgICAgICBTcmNSZWNTdGVwLAorICAgICAgICAgICAgcE1CSW50cmEsCisgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAorICAgICAgICAgICAgJkNvc3QKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAqcERzdENvc3QgPSBDb3N0OworICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzR4NDsKKworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIC8qCisgICAgICogQ29zdCBmb3IgSW50cmEgMTZ4MTYgbW9kZQorICAgICAqLworCisgICAgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKKyAgICAgICAgcFNyY0N1cnJCdWYsICAgCisgICAgICAgIFNyY0N1cnJTdGVwLAorICAgICAgICBwU3JjUmVjQnVmLCAgIAorICAgICAgICBTcmNSZWNTdGVwLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICBwTUJJbnRlciwKKyAgICAgICAgcE1CSW50cmEsCisgICAgICAgIHBTcmNEc3RNQkN1cnIsCisgICAgICAgICZDb3N0CisgICAgICAgICk7CisKKyAgICBpZiAoQ29zdCA8PSAqcERzdENvc3QpCisgICAgeworICAgICAgICAqcERzdENvc3QgPSBDb3N0OworICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkFfMTZ4MTY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgcERzdEJsb2NrU0FEIHRvIG1heCB2YWx1ZQorICAgICAqLworCWFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCXBTcmNEc3RNQkN1cnIsIAorICAgICAgICBwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCVNyY0N1cnJTdGVwLCAKKyAgICAJcFNyY1JlZkJ1Zkxpc3QsCisgICAgCVNyY1JlZlN0ZXAsCisgICAgCXBTcmNSZWNCdWYsIAorICAgIAlTcmNSZWNTdGVwLAorICAgIAlwUmVmUmVjdCwKKyAgICAJcEN1cnJQb2ludFBvcywKKyAgICAJcE1CSW50ZXIsIAorICAgIAlwTUJJbnRyYSwKKyAgICAJcERzdEJsb2NrU0FEKTsKKworCisJcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2E3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYwpAQCAtMCwwICsxLDI4NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IENocm9tYSA4eDggaW50cmEgcHJlZGljdGlvbiBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgdXBwZXIgYmxvY2sgaGFzIHByaW9yaXR5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDVXA0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgfQorICAgICAgICBDb3VudCsrOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKKyAgICB7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChDb3VudD09MCkKKyAgICB7CisgICAgICAgIFN1bSA9IDEyODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCBsZWZ0IGJsb2NrIGhhcyBwcmlvcml0eQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKKyAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgorICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKKyAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKKyAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKKyAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBOb25lCisgKi8KKworc3RhdGljIHZvaWQgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKQoreworICAgIGludCB4LCB5LCBTdW09MCwgQ291bnQgPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgIHsKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgIH0KKyAgICAgICAgQ291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQorICAgIHsKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOworICAgICAgICB9CisgICAgICAgIENvdW50Kys7CisgICAgfQorICAgIGlmIChDb3VudD09MCkKKyAgICB7CisgICAgICAgIFN1bSA9IDEyODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU3VtID0gKFN1bSArIDIpID4+IDI7CisgICAgfQorICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICB7CisgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIE5vdGU6IAorICogICAgICAgICAgICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCisgKiAgICAgICAgICAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqICAgICAgICAgICAgICAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSAKKyAqICAgICAgICAgICAgICBwcmVkaWN0aW9uLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorICkKK3sKKyAgICBpbnQgeCwgeSwgU3VtOworICAgIGludCBILCBWLCBhLCBiLCBjOworCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDgsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA4KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDgpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSAgICAgICYmIHBTcmNBYm92ZSAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCApICAgICAgJiYgcFNyY0xlZnQgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSAmJiBwU3JjQWJvdmVMZWZ0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDX0NIUk9NQV9QTEFORSwgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAorCisgICAgc3dpdGNoIChwcmVkTW9kZSkKKyAgICB7CisgICAgY2FzZSBPTVhfVkNfQ0hST01BX0RDOgorICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCwgICAgICAgICAgICBwU3JjQWJvdmUsICAgcERzdCwgICAgICAgICAgICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENVcDR4NCggICAgIHBTcmNMZWZ0LCAgICAgICAgICAgIHBTcmNBYm92ZSs0LCBwRHN0KzQsICAgICAgICAgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKKyAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ0xlZnQ0eDQoICAgcFNyY0xlZnQrNCpsZWZ0U3RlcCwgcFNyY0Fib3ZlLCAgIHBEc3QrNCpkc3RTdGVwLCAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOworICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KCAgICAgICBwU3JjTGVmdCs0KmxlZnRTdGVwLCBwU3JjQWJvdmUrNCwgcERzdCs0KzQqZHN0U3RlcCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfQ0hST01BX0hPUjoKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9WRVJUOgorICAgICAgICBmb3IgKHk9MDsgeTw4OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDX0NIUk9NQV9QTEFORToKKyAgICAgICAgSCA9IDQqKHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHg9MjsgeD49MDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbNCt4XSAtIHBTcmNBYm92ZVsyLXhdKTsKKyAgICAgICAgfQorICAgICAgICBWID0gNCoocFNyY0xlZnRbNypsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKKyAgICAgICAgZm9yICh5PTI7IHk+PTA7IHktLSkKKyAgICAgICAgeworICAgICAgICAgICAgViArPSAoeSsxKSoocFNyY0xlZnRbKDQreSkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbKDIteSkqbGVmdFN0ZXBdKTsKKyAgICAgICAgfQorICAgICAgICBhID0gMTYqKHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdKTsKKyAgICAgICAgYiA9ICgxNypIKzE2KT4+NTsKKyAgICAgICAgYyA9ICgxNypWKzE2KT4+NTsKKyAgICAgICAgZm9yICh5PTA7IHk8ODsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDw4OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTMpICsgYyooeS0zKSArIDE2KT4+NTsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwY2I0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IDE2eDE2IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKKyAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAorICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKKyAqICAgICAgICAgICAgMC4uMTUpIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCisgKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAorICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCisgKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqIE5vdGU6IAorICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KAorICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsIAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLCAKKyAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsIAorICAgIE9NWF9VOCogcERzdCwgCisgICAgT01YX0lOVCBsZWZ0U3RlcCwgCisgICAgT01YX0lOVCBkc3RTdGVwLCAKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLCAKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSkKK3sKKyAgICBpbnQgeCx5LFN1bSxDb3VudDsKKyAgICBpbnQgSCxWLGEsYixjOworCisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCA8IDE2LCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgMTYpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjQWJvdmUpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOyAgICAgICAgCisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9WRVJUICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfSE9SICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9MRUZUKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfMTZYMTZfUExBTkUsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBzd2l0Y2ggKHByZWRNb2RlKQorICAgIHsKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9WRVJUOgorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0Fib3ZlW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfMTZYMTZfSE9SOgorICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ18xNlgxNl9EQzoKKyAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCisgICAgICAgIFN1bSA9IDA7CisgICAgICAgIENvdW50ID0gMDsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ291bnQ9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1bSA9IDEyODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChDb3VudD09MSkKKyAgICAgICAgeworICAgICAgICAgICAgU3VtID0gKFN1bSArIDgpID4+IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBDb3VudCA9IDIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgU3VtID0gKFN1bSArIDE2KSA+PiA1OworICAgICAgICB9CisgICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzE2WDE2X1BMQU5FOgorICAgICAgICBIID0gOCoocFNyY0Fib3ZlWzE1XSAtIHBTcmNBYm92ZUxlZnRbMF0pOworICAgICAgICBmb3IgKHg9NjsgeD49MDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9ICh4KzEpKihwU3JjQWJvdmVbOCt4XSAtIHBTcmNBYm92ZVs2LXhdKTsKKyAgICAgICAgfQorICAgICAgICBWID0gOCoocFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXSk7CisgICAgICAgIGZvciAoeT02OyB5Pj0wOyB5LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFYgKz0gKHkrMSkqKHBTcmNMZWZ0Wyg4K3kpKmxlZnRTdGVwXSAtIHBTcmNMZWZ0Wyg2LXkpKmxlZnRTdGVwXSk7CisgICAgICAgIH0KKyAgICAgICAgYSA9IDE2KihwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbGVmdFN0ZXBdKTsKKyAgICAgICAgYiA9ICg1KkgrMzIpPj42OworICAgICAgICBjID0gKDUqViszMik+PjY7CisgICAgICAgIGZvciAoeT0wOyB5PDE2OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3VtID0gKGEgKyBiKih4LTcpICsgYyooeS03KSArIDE2KT4+NTsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpYXJtQ2xpcCgwLDI1NSxTdW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTgyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwpAQCAtMCwwICsxLDMzOCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IDR4NCBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKKyAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKKyAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCisgKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCisgKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCisgKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCisgKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBEc3QgaXMgTlVMTC4gCisgKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAxXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICAgT01YX1U4KiBwRHN0LAorICAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAorICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCisgKQoreworICAgIGludCB4LCB5OworICAgIE9NWF9VOCBwVG1wWzEwXTsKKworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDQpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwIDwgNCksICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkVSVCAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hPUiAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RMICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkwgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hVICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfNFg0X0hVLCAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgCisgICAgLyogTm90ZTogVGhpcyBjb2RlIG11c3Qgbm90IHJlYWQgdGhlIHBTcmMgYXJyYXlzIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGJsb2NrIGlzIG1hcmtlZCBhcyBhdmFpbGFibGUuIElmIHRoZSBibG9jayBpcyBub3QgYXZhaWJhYmxlIHRoZW4gcFNyYworICAgICAqIG1heSBub3QgYmUgYSB2YWxpZCBwb2ludGVyLgorICAgICAqCisgICAgICogTm90ZTogVG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlIHdlIHJlZmVyIHRvIHRoZSBuZWlnaGJvdXJpbmcgcGl4ZWxzCisgICAgICogaW4gdmFyaWFibGVzIG5hbWVkIGFzIGJlbG93OgorICAgICAqCisgICAgICogICAgVUwgVTAgVTEgVTIgVTMgVTQgVTUgVTYgVTcKKyAgICAgKiAgICBMMCB4eCB4eCB4eCB4eAorICAgICAqICAgIEwxIHh4IHh4IHh4IHh4CisgICAgICogICAgTDIgeHggeHggeHggeHgKKyAgICAgKiAgICBMMyB4eCB4eCB4eCB4eAorICAgICAqLworICAgICAKKyNkZWZpbmUgVUwgcFNyY0Fib3ZlTGVmdFswXQorI2RlZmluZSBVMCBwU3JjQWJvdmVbMF0KKyNkZWZpbmUgVTEgcFNyY0Fib3ZlWzFdCisjZGVmaW5lIFUyIHBTcmNBYm92ZVsyXQorI2RlZmluZSBVMyBwU3JjQWJvdmVbM10KKyNkZWZpbmUgVTQgcFNyY0Fib3ZlWzRdCisjZGVmaW5lIFU1IHBTcmNBYm92ZVs1XQorI2RlZmluZSBVNiBwU3JjQWJvdmVbNl0KKyNkZWZpbmUgVTcgcFNyY0Fib3ZlWzddCisjZGVmaW5lIEwwIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisjZGVmaW5lIEwxIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisjZGVmaW5lIEwyIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisjZGVmaW5lIEwzIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisKKyAgICBzd2l0Y2ggKHByZWRNb2RlKQorICAgIHsKKyAgICBjYXNlIE9NWF9WQ180WDRfVkVSVDoKKyAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCswXSA9IFUwOworICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMV0gPSBVMTsKKyAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzJdID0gVTI7CisgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCszXSA9IFUzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hPUjoKKyAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0WzAqZHN0U3RlcCt4XSA9IEwwOworICAgICAgICAgICAgcERzdFsxKmRzdFN0ZXAreF0gPSBMMTsKKyAgICAgICAgICAgIHBEc3RbMipkc3RTdGVwK3hdID0gTDI7CisgICAgICAgICAgICBwRHN0WzMqZHN0U3RlcCt4XSA9IEwzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgT01YX1ZDXzRYNF9EQzoKKyAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCisgICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQocFNyY0xlZnQsIHBTcmNBYm92ZSwgcERzdCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIE9NWF9WQ180WDRfRElBR19ETDoKKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKKyAgICAgICAgeworICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7CisgICAgICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVNSArIDIqVTYgKyBVNyArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTYgKyAzKlU3ICAgICAgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUyICsgMypVMyAgICAgICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFszXSA9IFUzOworICAgICAgICAgICAgcFRtcFs0XSA9IFUzOworICAgICAgICAgICAgcFRtcFs1XSA9IFUzOworICAgICAgICAgICAgcFRtcFs2XSA9IFUzOworICAgICAgICB9CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFt4K3ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfRFI6ICAgICAgICAKKyAgICAgICAgLyogeC15ID0gLTMsIC0yLCAtMSwgMCwgMSwgMiwgMyAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOworICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOworICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUzICsgMipVMiArIFUxICsgMik+PjIpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMyt4LXldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X1ZSOgorICAgICAgICAvKiB6VlI9MngteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYKKyAgICAgICAgICogeC0oeT4+MSkgPSAtMSwgLTEsICAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzCisgICAgICAgICAqIHkgICAgICAgID0gIDMsICAyLCAgPywgPywgPywgPywgPywgPywgMSwgMAorICAgICAgICAgKi8KKyAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMiArIDIqTDEgKyBMMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMSArIDIqTDAgKyBVTCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChMMCArIDIqVUwgKyBVMCArIDIpPj4yKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIFUwICsgMSk+PjEpOworICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipVMCArIFUxICsgMik+PjIpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKngteV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9WQ180WDRfSEQ6CisgICAgICAgIC8qIHpIRD0yeS14ID0gLTMgLTIgLTEgIDAgIDEgIDIgIDMgIDQgIDUgIDYKKyAgICAgICAgICogeS0oeD4+MSkgPSAtMSAtMSAgMCAgMCAgMSAgMSAgMiAgMiAgMyAgMworICAgICAgICAgKiB4ICAgICAgICA9ICAzICAyICAgICAgICAgICAgICAgICAgICAxICAwCisgICAgICAgICAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOworICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOworICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOworICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFVMICsgTDAgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVUwgKyAyKkwwICsgTDEgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoTDAgKyBMMSArIDEpPj4xKTsKKyAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChMMSArIEwyICsgMSk+PjEpOworICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOworICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKEwyICsgTDMgKyAxKT4+MSk7CisgICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszKzIqeS14XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX1ZDXzRYNF9WTDoKKyAgICAgICAgLyogTm90ZTogeCsoeT4+MSkgPSAoMip4K3kpPj4xCisgICAgICAgICAqIDJ4K3kgPSAwIDEgMiAzIDQgNSA2IDcgOCA5CisgICAgICAgICAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX1JJR0hUKQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMyArIFU0ICsgMik+PjIpOworICAgICAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIFU0ICsgMSk+PjEpOworICAgICAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChVMyArIDIqVTQgKyBVNSArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTQgKyBVNSArIDEpPj4xKTsKKyAgICAgICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTQgKyAyKlU1ICsgVTYgKyAyKT4+Mik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMypVMyArIDIpPj4yKTsKKyAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbN10gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbOF0gPSBVMzsKKyAgICAgICAgICAgIHBUbXBbOV0gPSBVMzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMip4K3ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfVkNfNFg0X0hVOgorICAgICAgICAvKiB6SFUgPSB4KzIqeSAqLworICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7CisgICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7CisgICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKKyAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOworICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwyICsgMypMMyArIDIpPj4yKTsKKyAgICAgICAgcFRtcFs2XSA9IEwzOworICAgICAgICBwVG1wWzddID0gTDM7CisgICAgICAgIHBUbXBbOF0gPSBMMzsKKyAgICAgICAgcFRtcFs5XSA9IEwzOworICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCsyKnldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTE0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfMTZ4LmMKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiAxNngxNiBvciAxNng4CisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNngoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICAKKworICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKKyAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAorICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjMzMGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKQEAgLTAsMCArMSw4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl80eC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKKyAqIG9mIDR4OCBvciA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCisgKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCggCisJICBjb25zdCBPTVhfVTgqIAlwU3JjLAorICAgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCisJICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICAgIE9NWF9VMzIJaVJlZlN0ZXAwLAorICAgICAgT01YX1UzMglpUmVmU3RlcDEsCisgICAgICBPTVhfVTMyKglwRHN0U0FELAorICAgICAgT01YX1UzMiAgIGlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgorICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCisgICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllOWMyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRFF1YXJfOHguYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCisgKiBvZiA4eDE2IG9yIDh4OCBvciA4eDQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAorICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCisgKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAorICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4KCAKKwljb25zdCBPTVhfVTgqIAlwU3JjLAorICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAorCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKKyAgICBPTVhfVTMyIAlpU3JjU3RlcCwKKyAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIqCXBEc3RTQUQsCisgICAgT01YX1UzMiAgICAgaUhlaWdodAorKQoreworICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgCisgICAgICAgIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgCisKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCisgICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKKyAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKQEAgLTAsMCArMSw3NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEXzR4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAorICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHgoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQKKykKK3sKKyAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjT3JnID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSA4KSAmJiAoaUhlaWdodCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNPcmcpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBPcmcgPT0gMCkgfHwgKGlTdGVwT3JnICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChpU3RlcFJlZiA9PSAwKSB8fCAoaVN0ZXBSZWYgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCisKKyAgICByZXR1cm4gYXJtVkNDT01NX1NBRCAKKyAgICAgICAgKHBTcmNPcmcsIGlTdGVwT3JnLCBwU3JjUmVmLCBpU3RlcFJlZiwgcERzdFNBRCwgaUhlaWdodCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYWU2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FURF80eDQuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDQgYmxvY2tzCisgKiAKKyAqLworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCggCisJY29uc3QgT01YX1U4KgkJcFNyY09yZywKKwlPTVhfVTMyICAgICBpU3RlcE9yZywgICAgICAgICAgICAgICAgICAgICAgICAgCisJY29uc3QgT01YX1U4KgkJcFNyY1JlZiwKKwlPTVhfVTMyCQlpU3RlcFJlZiwKKwlPTVhfVTMyKiAgICBwRHN0U0FECispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBTQVREID0gMDsKKyAgICBPTVhfUzMyICAgICBkIFs0XVs0XSwgbTFbNF1bNF0sIG0yWzRdWzRdOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoaVN0ZXBSZWYgPT0gMCkgfHwgKGlTdGVwUmVmICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNSZWYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSAqLworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkIFtqXVtpXSA9IHBTcmNPcmcgW2ogKiBpU3RlcE9yZyArIGldIC0gcFNyY1JlZiBbaiAqIGlTdGVwUmVmICsgaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYWRhbWFyZCBUcmFuc2ZvciBmb3IgNHg0IGJsb2NrICovCisKKyAgICAvKiBIb3Jpem9udGFsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xW2ldWzBdID0gZFtpXVswXSArIGRbaV1bMl07IC8qIGErYyAqLworICAgICAgICBtMVtpXVsxXSA9IGRbaV1bMV0gKyBkW2ldWzNdOyAvKiBiK2QgKi8KKyAgICAgICAgbTFbaV1bMl0gPSBkW2ldWzBdIC0gZFtpXVsyXTsgLyogYS1jICovCisgICAgICAgIG0xW2ldWzNdID0gZFtpXVsxXSAtIGRbaV1bM107IC8qIGItZCAqLworCisgICAgICAgIG0yW2ldWzBdID0gbTFbaV1bMF0gKyBtMVtpXVsxXTsgLyogYStiK2MrZCAqLworICAgICAgICBtMltpXVsxXSA9IG0xW2ldWzJdICsgbTFbaV1bM107IC8qIGErYi1jLWQgKi8KKyAgICAgICAgbTJbaV1bMl0gPSBtMVtpXVsyXSAtIG0xW2ldWzNdOyAvKiBhLWItYytkICovCisgICAgICAgIG0yW2ldWzNdID0gbTFbaV1bMF0gLSBtMVtpXVsxXTsgLyogYS1iK2MtZCAqLworCisgICAgfQorCisgICAgLyogVmVydGljYWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgbTFbMF1baV0gPSBtMlswXVtpXSArIG0yWzJdW2ldOworICAgICAgICBtMVsxXVtpXSA9IG0yWzFdW2ldICsgbTJbM11baV07CisgICAgICAgIG0xWzJdW2ldID0gbTJbMF1baV0gLSBtMlsyXVtpXTsKKyAgICAgICAgbTFbM11baV0gPSBtMlsxXVtpXSAtIG0yWzNdW2ldOworCisgICAgICAgIG0yWzBdW2ldID0gbTFbMF1baV0gKyBtMVsxXVtpXTsKKyAgICAgICAgbTJbMV1baV0gPSBtMVsyXVtpXSArIG0xWzNdW2ldOworICAgICAgICBtMlsyXVtpXSA9IG0xWzJdW2ldIC0gbTFbM11baV07CisgICAgICAgIG0yWzNdW2ldID0gbTFbMF1baV0gLSBtMVsxXVtpXTsKKyAgICB9CisgICAgCisgICAgLyogY2FsY3VsYXRlIFNBRCBmb3IgVHJhbnNmb3JtZWQgY29lZmZpY2llbnRzICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNBVEQgKz0gYXJtQWJzKG0yIFtqXVtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgICpwRHN0U0FEID0gKFNBVEQgKyAxKSAvIDI7CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2E1NjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4NCBibG9ja3MKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKKyAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKKyAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKKyAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCisgKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKKyAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgNC4gCisgKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAorICogICAgICAgICAgICBvZiA0LiAKKyAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKKyAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAorICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKKyAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAorICogICAgICAgICAgICAwLUlOVEVSIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKKyAqICAgICAgICAgICAgcmVxdWlyZWQuIAorICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAorICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAorICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKKyAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KKyBPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCisJIGNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCisJIGNvbnN0IE9NWF9VOCoJCXBTcmNQcmVkLAorCSBPTVhfVTMyCQlpU3JjT3JnU3RlcCwKKwkgT01YX1UzMgkJaVNyY1ByZWRTdGVwLAorCSBPTVhfUzE2KgkgICAgcERzdFF1YW50Q29lZmYsCisJIE9NWF9TMTYqIAkgICAgcERzdERlUXVhbnRDb2VmZiwKKwkgT01YX1MxNioJICAgIHBEQ0NvZWZmLAorCSBPTVhfUzgqCQlwTnVtQ29lZmYsCisJIE9NWF9VMzIJCW5UaHJlc2hTQUQsCisJIE9NWF9VMzIJCWlRUCwKKwkgT01YX1U4CQkgICAgYkludHJhCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzggICAgICBOdW1Db2VmZiA9IDA7CisgICAgT01YX1MxNiAgICAgQnVmWzE2XSwgbVsxNl07CisgICAgT01YX1UzMiAgICAgUUJpdHMsIFFQcGVyLCBRUG1vZCwgZjsKKyAgICBPTVhfUzMyICAgICBWYWx1ZSwgTUYsIFRocmVzaERDOworCisgICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwRHN0RGVRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorCWFybVJldEFyZ0VycklmKHBOdW1Db2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKwlhcm1SZXRBcmdFcnJJZihwRENDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBTcmNQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKHBEc3RRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpICYmIAorCQkJYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REZVF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZigoYkludHJhICE9IDApICYmIChiSW50cmEgIT0gMSksIE9NWF9TdHNfQmFkQXJnRXJyKQorICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjT3JnU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCisgICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKyAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKKworICAgIC8qIAorICAgICAqIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIHVzaW5nIG5UaHJlc2hTQUQgcGFyYW0gCisgICAgICovCisKKyAgICBRUHBlciA9IGlRUCAvIDY7CisgICAgUVBtb2QgPSBpUVAgJSA2OyAgICAKKyAgICBRQml0cyA9IDE1ICsgUVBwZXI7CisgICAgCisgICAgZiA9ICgxIDw8IFFCaXRzKSAvIChiSW50cmEgPyAzIDogNik7CisgICAgCisgICAgLyogRG8gWmVyby1CbG9jayBFYXJseSBkZXRlY3Rpb24gaWYgZW5hYmxlZCAqLworICAgIGlmIChuVGhyZXNoU0FEKQorICAgIHsKKyAgICAgICAgVGhyZXNoREMgPSAoKDEgPDwgUUJpdHMpIC0gZikgLyBhcm1WQ000UDEwX01GTWF0cml4W1FQbW9kXVswXTsKKyAgICAgICAgaWYgKG5UaHJlc2hTQUQgPCBUaHJlc2hEQykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IGJsb2NrIHRvIHplcm8gKi8KKyAgICAgICAgICAgIGlmIChwRENDb2VmZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwRENDb2VmZiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7ICAgIAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwTnVtQ29lZmYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcE51bUNvZWZmID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgICAgICB9CisgICAgfQorCisKKyAgIC8qIENhbGN1bGF0ZSBkaWZmZXJlbmNlICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZiBbaiAqIDQgKyBpXSA9IAorICAgICAgICAgICAgICAgIHBTcmNPcmcgW2ogKiBpU3JjT3JnU3RlcCArIGldIC0gcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLworICAgIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQgKG0sIEJ1Zik7CisKKyAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENvcHkgdW5xdWFudGl6ZWQgREMgdmFsdWUgaW50byBwb2ludGVyICovCisgICAgICAgICpwRENDb2VmZiA9IG1bMF07CisgICAgfQorCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaiAqIDQgKyBpXV07CisgICAgICAgICAgICBWYWx1ZSA9IGFybUFicyhtW2ogKiA0ICsgaV0pICogTUYgKyBmOworICAgICAgICAgICAgVmFsdWUgPj49IFFCaXRzOworICAgICAgICAgICAgVmFsdWUgPSBtW2ogKiA0ICsgaV0gPCAwID8gLVZhbHVlIDogVmFsdWU7CisgICAgICAgICAgICBCdWZbNCAqIGogKyBpXSA9IHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gKE9NWF9TMTYpVmFsdWU7CisgICAgICAgICAgICBpZiAoKHBOdW1Db2VmZiAhPSBOVUxMKSAmJiBWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1Db2VmZisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogT3V0cHV0IG51bWJlciBvZiBub24temVybyBDb2VmZnMgKi8KKyAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCisgICAgeworICAgICAgICAqcE51bUNvZWZmID0gTnVtQ29lZmY7CisgICAgfQorICAgIAorICAgIC8qIFJlc2lkdWFsIEludiBUcmFuc2Zvcm0gKi8KKyAgICBpZiAocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKQorICAgIHsgICAgCisgICAgICAgIC8qIFJlIFNjYWxlICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbSBbaiAqIDQgKyBpXSAgPSBCdWYgW2ogKiA0ICsgaV0gKiAoMSA8PCBRUHBlcikgKgorICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDEwX1ZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKHBEc3REZVF1YW50Q29lZmYsIG0pOyAgICAgICAgCisgICAgfQorICAgICAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQwZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlcXVhbnRpemUgQ2hyb21hIDJ4MiBEQyBibG9jaworICovCisKK3N0YXRpYyB2b2lkIERlcXVhbnRDaHJvbWFEQzJ4MigKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgaW50IFNoaWZ0ID0gKFFQLzYpLTEgOworICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKKyAgICBpbnQgaSwgVmFsdWU7CisKKyAgICBpZiAoU2hpZnQgPj0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSkgPj4gMTsKKyAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKyAKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogSW52ZXJzZSBUcmFuc2Zvcm0gREMgMngyIENvZWZmaWNpZW50cworICovCisKK3N0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDMngyKE9NWF9TMTYqIHBEYXRhKQoreworICAgIGludCBjMDAgPSBwRGF0YVswXTsKKyAgICBpbnQgYzAxID0gcERhdGFbMV07CisgICAgaW50IGMxMCA9IHBEYXRhWzJdOworICAgIGludCBjMTEgPSBwRGF0YVszXTsKKworICAgIGludCBkMDAgPSBjMDAgKyBjMDE7CisgICAgaW50IGQwMSA9IGMwMCAtIGMwMTsKKyAgICBpbnQgZDEwID0gYzEwICsgYzExOworICAgIGludCBkMTEgPSBjMTAgLSBjMTE7CisKKyAgICBwRGF0YVswXSA9IChPTVhfUzE2KShkMDAgKyBkMTApOworICAgIHBEYXRhWzFdID0gKE9NWF9TMTYpKGQwMSArIGQxMSk7CisgICAgcERhdGFbMl0gPSAoT01YX1MxNikoZDAwIC0gZDEwKTsKKyAgICBwRGF0YVszXSA9IChPTVhfUzE2KShkMDEgLSBkMTEpOworfQorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAorICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAorICogYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCisgKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKKyAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKKyAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0LAorICAgICBPTVhfSU5UIFFQICAgICAgICAKKyApCit7CisgICAgYXJtUmV0QXJnRXJySWYocHBTcmMgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwU3JjID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoUVA8MCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoUVA+NTEsICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKHBwU3JjLCBwRHN0KTsKKyAgICBJbnZUcmFuc2Zvcm1EQzJ4MihwRHN0KTsKKyAgICBEZXF1YW50Q2hyb21hREMyeDIocERzdCwgUVApOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM4YmUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRGVxdWFudGl6ZSBMdW1hIERDIGJsb2NrCisgKi8KKworc3RhdGljIHZvaWQgRGVxdWFudEx1bWFEQzR4NCgKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCispCit7CisgICAgaW50IFNoaWZ0ID0gKFFQLzYpLTIgOworICAgIGludCBTY2FsZSA9IGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXTsKKyAgICBpbnQgaSwgUm91bmQsIFZhbHVlOworCisgICAgaWYgKFNoaWZ0ID49IDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpIDw8IFNoaWZ0OworICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNoaWZ0ID0gLVNoaWZ0OzsKKyAgICAgICAgUm91bmQgPSAxPDwoU2hpZnQtMSk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlICsgUm91bmQpID4+IFNoaWZ0OworICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisgCisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIEludmVyc2UgVHJhbnNmb3JtIERDIDR4NCBDb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgSW52VHJhbnNmb3JtREM0eDQoT01YX1MxNiogcERhdGEpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQorICAgIHsKKyAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKKyAgICAgICAgaW50IGMxID0gcERhdGFbaSsxXTsKKyAgICAgICAgaW50IGMyID0gcERhdGFbaSsyXTsKKyAgICAgICAgaW50IGMzID0gcERhdGFbaSszXTsKKyAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7CisgICAgICAgIHBEYXRhW2krMV0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOworICAgICAgICBwRGF0YVtpKzJdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKKyAgICAgICAgcERhdGFbaSszXSA9IChPTVhfUzE2KShjMC1jMStjMi1jMyk7CisgICAgfQorCisgICAgLyogVHJhbnNmb3JtIGNvbHVtbnMgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBpbnQgYzAgPSBwRGF0YVtpKzBdOworICAgICAgICBpbnQgYzEgPSBwRGF0YVtpKzRdOworICAgICAgICBpbnQgYzIgPSBwRGF0YVtpKzhdOworICAgICAgICBpbnQgYzMgPSBwRGF0YVtpKzEyXTsKKyAgICAgICAgcERhdGFbaSswXSA9IChPTVhfUzE2KShjMCtjMStjMitjMyk7CisgICAgICAgIHBEYXRhW2krNF0gPSAoT01YX1MxNikoYzArYzEtYzItYzMpOworICAgICAgICBwRGF0YVtpKzhdID0gKE9NWF9TMTYpKGMwLWMxLWMyK2MzKTsKKyAgICAgICAgcERhdGFbaSsxMl0gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOworICAgIH0KK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyKAorICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKKyAgICAgT01YX1MxNiogcERzdCwKKyAgICAgT01YX0lOVCBRUCAgICAgICAgCisgKQoreworICAgIGFybVJldEFyZ0VycklmKHBwU3JjICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcFNyYyA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgICA9PSBOVUxMLCAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPDAsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKFFQPjUxLCAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERzdCk7CisgICAgLypJbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsqLworICAgIEludlRyYW5zZm9ybURDNHg0KHBEc3QpOworICAgIERlcXVhbnRMdW1hREM0eDQocERzdCwgUVApOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NDRkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYwpAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyAgCisgKiBjb2VmZmljaWVudHMgYW5kIHF1YW50aXphdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMoCisJT01YX1MxNiogCXBTcmNEc3QsCisJT01YX1UzMgkJaVFQLAorCU9NWF9VOAkJYkludHJhCispCit7CisgICAgT01YX0lOVCAgICAgaSwgajsKKyAgICBPTVhfUzMyICAgICBtWzJdWzJdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9TMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GMDA7CisKKyAgICAvKiBDaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihpUVAgPiA1MSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogSGFkYW1hcmQgVHJhbnNmb3JtIGZvciAyeDIgYmxvY2sgKi8KKyAgICBtWzBdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gKyAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107CisgICAgbVswXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gLSBwU3JjRHN0WzNdOworICAgIG1bMV1bMF0gPSBwU3JjRHN0WzBdICsgcFNyY0RzdFsxXSAtICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKKyAgICBtWzFdWzFdID0gcFNyY0RzdFswXSAtIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSArIHBTcmNEc3RbM107CisKKyAgICAvKiBRdWFudGl6YXRpb24gKi8KKyAgICBRYml0c1BsdXNPbmUgPSBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpOyAvKmZsb29yIChRUC82KSovCisgICAgTUYwMCA9IGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdOworCisgICAgVHdvX2YgPSAoMSA8PCBRYml0c1BsdXNPbmUpIC8gKGJJbnRyYSA/IDMgOiA2KTsgLyogMy0+SU5UUkEsIDYtPklOVEVSICovCisKKyAgICAvKiBTY2FsaW5nICovCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKGFybUFicyhtW2pdW2ldKSAqIE1GMDAgKyBUd29fZikgPj4gUWJpdHNQbHVzT25lOworICAgICAgICAgICAgcFNyY0RzdFtqICogMiArIGldID0gKE9NWF9TMTYpKChtW2pdW2ldIDwgMCkgPyAtVmFsdWUgOiBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2Y3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCBxdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAorICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDKAorCU9NWF9TMTYqIAlwU3JjRHN0LAorCU9NWF9VMzIJCWlRUAorKQoreworICAgIE9NWF9JTlQgICAgIGksIGo7CisgICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdOworICAgIE9NWF9TMzIgICAgIFZhbHVlOworICAgIE9NWF9VMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GOworCisgICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIDR4NCBibG9jayAqLworICAgIC8qIEhvcml6b250YWwgSGFkYW1hcmQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IGkgKiA0OworICAgICAgICAKKyAgICAgICAgbTFbaV1bMF0gPSBwU3JjRHN0W2ogKyAwXSArIHBTcmNEc3RbaiArIDJdOyAvKiBhK2MgKi8KKyAgICAgICAgbTFbaV1bMV0gPSBwU3JjRHN0W2ogKyAxXSArIHBTcmNEc3RbaiArIDNdOyAvKiBiK2QgKi8KKyAgICAgICAgbTFbaV1bMl0gPSBwU3JjRHN0W2ogKyAwXSAtIHBTcmNEc3RbaiArIDJdOyAvKiBhLWMgKi8KKyAgICAgICAgbTFbaV1bM10gPSBwU3JjRHN0W2ogKyAxXSAtIHBTcmNEc3RbaiArIDNdOyAvKiBiLWQgKi8KKworICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KKyAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCisgICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLworICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KKworICAgIH0KKworICAgIC8qIFZlcnRpY2FsICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKKyAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOworICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07CisgICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKKworICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07CisgICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKKyAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOworICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07CisgICAgfQorCisgICAgCisgICAgLyogUXVhbnRpemF0aW9uICovCisgICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLworICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIDM7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLworICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF07CisKKyAgICAvKiBTY2FsaW5nICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gKGFybUFicygobTJbal1baV0vKiArIDEqLykgLyAyKSAqIE1GICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKKyAgICAgICAgICAgIHBTcmNEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSgobTJbal1baV0gPCAwKSA/IC1WYWx1ZSA6IFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1NWI2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRENUX1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIERDVC9JRENUIG1vZHVsZQorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YRENUVEFCX0hfCisjZGVmaW5lIF9PTVhEQ1RUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9GNjQgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbOF1bOF07CisKKyNlbmRpZiAvKiBfT01YRENUVEFCX0hfICovCisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlY2MwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKKyAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKKyAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWEhVRkZUQUJfSF8KKyNkZWZpbmUgX09NWEhVRkZUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMFJ1bklkeFsxMV07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wwWzY4XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbN107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRyYVZsY0wxWzM2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMTUFYWzE1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFMTUFYWzIxXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSTUFYWzI3XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSTUFYWzhdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeFsxMl07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wwWzU5XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSdW5JZHhbM107CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSTUFYWzEyXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFSTUFYWzNdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdOworZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFsxNF07CitleHRlcm4gY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XTsKKworI2VuZGlmIC8qIF9PTVhIVUZGVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApAQCAtMCwwICsxLDI1IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0hfCisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSF8KKworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMzk2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0CisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCisgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jaworICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCisgKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jaworICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00CisgKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCisgKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQorICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCisgKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKKyAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQorICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cworICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKQoreworICAgIE9NWF9JTlQgZGNTY2FsZXIsIGk7CisgICAgT01YX1MxNiB0ZW1wUHJlZDsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gMSkgJiYgKHByZWREaXIgIT0gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZSb3cpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmQ29sKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgCisgICAgLyogU2V0IERDIHNjYWxlciB2YWx1ZSB0byBhdm9pZCBzb21lIGNvbXBpbGVycyBnaXZpbmcgYSB3YXJuaW5nLiAqLworICAgIGRjU2NhbGVyPTA7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIHRoZSBEQyBzY2FsZXIgdmFsdWUgKi8KKyAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgeworICAgICAgICBpZiAoY3VyUVAgPj0gMSAmJiBjdXJRUCA8PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gNSAmJiBjdXJRUCA8PSA4KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IDIgKiBjdXJRUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA5ICYmIGN1clFQIDw9IDI0KQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQICsgODsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBjdXJRUCkgLSAxNjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQorICAgIHsKKyAgICAgICAgaWYgKGN1clFQID49IDEgJiYgY3VyUVAgPD0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1clFQID49IDUgJiYgY3VyUVAgPD0gMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjU2NhbGVyID0gKGN1clFQICsgMTMpLzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY1NjYWxlciA9IGN1clFQIC0gNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwUHJlQUNQcmVkaWN0ICE9IE5VTEwpCisgICAgeworICAgICAgICBwUHJlQUNQcmVkaWN0WzBdID0gcHJlZERpcjsKKyAgICB9CisKKyAgICBpZiAocHJlZERpciA9PSBPTVhfVkNfVkVSVElDQUwpCisgICAgeworICAgICAgICAvKiBGWzBdWzBdLy9kY19zY2FsZXIgKi8KKyAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8ocFByZWRCdWZSb3dbMF0sIGRjU2NhbGVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRlswXVswXS8vZGNfc2NhbGVyICovCisgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvKHBQcmVkQnVmQ29sWzBdLCBkY1NjYWxlcik7CisgICAgfQorCisgICAgLyogVXBkYXRpbmcgdGhlIERDIHZhbHVlIHRvIHRoZSByb3cgYW5kIGNvbCBidWZmZXIgKi8KKyAgICAqKHBQcmVkQnVmUm93IC0gOCkgPSAqcFByZWRCdWZDb2w7CisKKyAgICBpZiAoZmxhZykKKyAgICB7CisgICAgICAgIC8qIENhbCBhbmQgc3RvcmUgRlswXVswXSBpbnRvIHRoZSBjb2wgYnVmZmVyICovCisgICAgICAgICpwUHJlZEJ1ZkNvbCA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKKworICAgICAgICAvKiBQUUYgPSBRRiAtIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICBwU3JjRHN0WzBdIC09IHRlbXBQcmVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBRRiA9IFBRRiArIEZbMF1bMF0vL2RjX3NjYWxlciAqLworICAgICAgICBwU3JjRHN0WzBdICs9IHRlbXBQcmVkOworICAgICAgICAKKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0WzBdKTsKKworICAgICAgICAvKiBDYWwgYW5kIHN0b3JlIEZbMF1bMF0gaW50byB0aGUgY29sIGJ1ZmZlciAqLworICAgICAgICAqcFByZWRCdWZDb2wgPSBwU3JjRHN0WzBdICogZGNTY2FsZXI7CisgICAgfQorCisKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHByZWREaXIgPT0gT01YX1ZDX1ZFUlRJQ0FMKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBQcmVkID0gYXJtSW50RGl2QXdheUZyb21aZXJvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUHJlZEJ1ZlJvd1tpXSAqIHByZWRRUCwgY3VyUVApOworICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gdGhlIHJvdyBidWZmICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmUm93W2ldID0gcFNyY0RzdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgLypQUUZYW3ZdWzBdID0gUUZYW3ZdWzBdIC0gKFFGQVt2XVswXSAqIFFQQSkgLy8gUVBYICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gLT0gdGVtcFByZWQ7CisgICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiBhYnNvbHV0ZSB2YWx1ZXMgb2YgQUMgcHJlZGljdGlvbiBlcnJvciwgdGhpcyBjYW4KKyAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgQUMgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAqcFN1bUVyciArPSBhcm1BYnMocFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHBQcmVBQ1ByZWRpY3RbMX43XSBzdG9yZSB0aGUgZXJyb3Igc2lnbmFsCisgICAgICAgICAgICAgICAgICAgIGFmdGVyIEFDIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcFByZUFDUHJlZGljdFtpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qUUZYW3ZdWzBdID0gUFFGWFt2XVswXSArIChRRkFbdl1bMF0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldICs9IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIHRoZSByb3cgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZlJvd1tpXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gODsgaSA8IDY0OyBpICs9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQcmVkQnVmQ29sW2k+PjNdICogcHJlZFFQLCBjdXJRUCk7CisgICAgICAgICAgICAgICAgaWYgKGZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgICAgIC8qUFFGWFswXVt1XSA9IFFGWFswXVt1XSAtIChRRkFbMF1bdV0gKiBRUEEpIC8vIFFQWCAqLworICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldIC09IHRlbXBQcmVkOworICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2YgYWJzb2x1dGUgdmFsdWVzIG9mIEFDIHByZWRpY3Rpb24gZXJyb3IsIHRoaXMgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlIEFDCisgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKnBTdW1FcnIgKz0gYXJtQWJzKHBTcmNEc3RbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBwUHJlQUNQcmVkaWN0WzF+N10gc3RvcmUgdGhlIGVycm9yIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICBhZnRlciBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbaT4+M10gPSBwU3JjRHN0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKlFGWFswXVt1XSA9IFBRRlhbMF1bdV0gKyAoUUZBWzBdW3VdICogUVBBKSAvLyBRUFggKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSArPSB0ZW1wUHJlZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byBjb2wgYnVmZiAqLworICAgICAgICAgICAgICAgICAgICBwUHJlZEJ1ZkNvbFtpPj4zXSA9IHBTcmNEc3RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qRW5kIG9mIEZpbGUqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjlhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSBlc3RpbWF0ZWQgCisgKiBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgCisgKiBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgCisgKiBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgCisgKiBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSAKKyAqIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuICAKKyAqIFRoZSBmdW5jdGlvbiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgCisgKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0aGUJY3VycmVudCBwbGFuZS4KKyAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQorICogW2luXQlwUmVmUmVjdAkJICByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZQorICogW2luXQlwU3JjQ3VyckJ1ZgkJcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGV4dHJhY3RlZCBmcm9tIG9yaWdpbmFsIHBsYW5lIAorICogICAgICAgICAgICAgICAgICAgIChsaW5lYXIgYXJyYXksIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiBbaW5dCXBTZWFyY2hQb2ludFJlZlBvcwlwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgc2VhcmNoIChzcGVjaWZpZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0Jcm5kVmFsCQkJICByb3VuZGluZyBjb250cm9sIGJpdCBmb3IgaGFsZiBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbjsgCisgKiAgICAgICAgICAgICAgICAgICAgMD1yb3VuZGluZyBjb250cm9sIGRpc2FibGVkOyAxPXJvdW5kaW5nIGNvbnRyb2wgZW5hYmxlZAorICogW2luXQlwU3JjRHN0TVYJCXBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGEgcHJpb3IgCisgKiAgICAgICAgICAgICAgICAgIDE2WDE2IGludGVnZXIgc2VhcmNoIGFuZCBpdHMgdW5pdCBpcyBoYWxmIHBpeGVsLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdcFNyY0RzdE1WCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF1wRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKKyAgICAgT01YX0lOVCBybmRWYWwsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKykKK3sKKyAgICBPTVhfSU5UICAgICBvdXRlciwgaW5uZXIsIGNvdW50LCBpbmRleDsKKyAgICBPTVhfUzE2ICAgICBoYWxmUGVsWCA9IDAsIGhhbGZQZWxZID0gMCwgeCwgeTsKKyAgICBPTVhfSU5UICAgICBjYW5kU0FELCByZWZTQUQgPSAwOworICAgIE9NWF9JTlQgICAgIG1pblNBRCwgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKKyAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLworICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZkJ1ZjsKKyAgICBPTVhfVTggdGVtcFBlbDsKKyAgICAgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChyZWZXaWR0aCAqIChwU3JjRHN0TVYtPmR5LzIpKSArIChwU3JjRHN0TVYtPmR4LzIpOworCisgICAgLyogQ29weSB0aGUgY2FuZGlkYXRlIHRvIHRoZSB0ZW1wb3JhcnkgbGluZWFyIGFycmF5ICovCisgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCxpbmRleCA9IDA7CisgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKKyAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLCBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICByZWZTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBtaW5TYWQgYXMgcmVmZXJlbmNlIFNBRCAqLworICAgIG1pblNBRCA9IHJlZlNBRDsKKyAgICAqcERzdFNBRCA9IHJlZlNBRDsKKworICAgIC8qIENoZWNrIGZvciB2YWxpZCByZWdpb24gKi8KKyAgICBmcm9tWCA9IDE7CisgICAgdG9YICAgPSAxOworICAgIGZyb21ZID0gMTsKKyAgICB0b1kgICA9IDE7CisgICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnggLSAxKSA8IHBSZWZSZWN0LT54KQorICAgIHsKKyAgICAgICAgZnJvbVggPSAwOworICAgIH0KKworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54ICsgQmxvY2tTaXplICsgMSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgdG9YICAgPSAwOworICAgIH0KKworICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT55IC0gMSkgPCBwUmVmUmVjdC0+eSkKKyAgICB7CisgICAgICAgIGZyb21ZID0gMDsKKyAgICB9CisKKyAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT55ICsgcFJlZlJlY3QtPmhlaWdodCkpCisgICAgeworICAgICAgICB0b1kgICA9IDA7CisgICAgfQorCisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKyAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCisgICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGludGVnZXIgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIGlmICggeCA9PSAwICYmIHkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCisgICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocFNyY0RzdE1WLT5keC8yKTsKKworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIHBpeGVsIGFuZCBjYWxjdWxhdGUgdGhlIFNBRCovCisgICAgICAgICAgICBmb3IgKG91dGVyID0gMCwgY291bnQgPSAwLCBjYW5kU0FEID0gMCxpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIG91dGVyIDwgQmxvY2tTaXplOworICAgICAgICAgICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGlubmVyID0gMDsgaW5uZXIgPCBCbG9ja1NpemU7IGlubmVyKyssIGNvdW50KyssaW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBQZWwgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmQnVmW2luZGV4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBUZW1wU3JjUmVmQnVmW2luZGV4ICsgeF0gKiBhcm1BYnMoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeV0gKiBhcm1BYnMoeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHJlZldpZHRoICogeSArIHhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcm1BYnMoeCp5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFybUFicyAoeCkgKyBhcm1BYnMgKHkpIC0gcm5kVmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC8gKDIgKiAoYXJtQWJzICh4KSArIGFybUFicyAoeSkpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FuZFNBRCArPSBhcm1BYnMgKHRlbXBQZWwgLSBwU3JjQ3VyckJ1Zltjb3VudF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUmVzdWx0IGNhbGN1bGF0aW9ucyAqLworICAgICAgICAgICAgaWYgKGFybVZDTTRQMl9Db21wYXJlTVYgKHgsIHksIGNhbmRTQUQsIGhhbGZQZWxYLCBoYWxmUGVsWSwgbWluU0FEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcERzdFNBRCA9IGNhbmRTQUQ7CisgICAgICAgICAgICAgICAgbWluU0FEICAgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIGhhbGZQZWxYID0geDsKKyAgICAgICAgICAgICAgICBoYWxmUGVsWSA9IHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcFNyY0RzdE1WLT5keCArPSBoYWxmUGVsWDsKKyAgICBwU3JjRHN0TVYtPmR5ICs9IGhhbGZQZWxZOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmZTM1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KKyAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQsCisgICAgIE9NWF9VOCBCbG9ja1NpemUKKykKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworCisgICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCxpbmRleDsKKyAgICBPTVhfSU5UICAgICBjYW5kU0FEOworICAgIC8qKDI1NioyNTYgKzEpIHRoaXMgaXMgdG8gbWFrZSB0aGUgU0FEIG1heCBpbml0aWFsbHkqLworICAgIE9NWF9JTlQgICAgIG1pblNBRCA9IDB4MTAwMDEsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7CisgICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KKyAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7CisgICAgT01YX1MxNiAgICAgeCwgeTsKKyAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOworICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgICAgICAKKyAgICBzZWFyY2hSYW5nZSA9ICgoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjKS0+c2VhcmNoUmFuZ2U7CisgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLworICAgIGZyb21YID0gc2VhcmNoUmFuZ2U7CisgICAgdG9YICAgPSBzZWFyY2hSYW5nZTsKKyAgICBmcm9tWSA9IHNlYXJjaFJhbmdlOworICAgIHRvWSAgID0gc2VhcmNoUmFuZ2U7CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eCkKKyAgICB7CisgICAgICAgIGZyb21YID0gIHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eDsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgdG9YICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54KSAtIEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eSkKKyAgICB7CisgICAgICAgIGZyb21ZID0gcEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55OworICAgIH0KKworICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSArIEJsb2NrU2l6ZSArIHNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQorICAgIHsKKyAgICAgICAgdG9ZICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55KSAtIEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBwRHN0TVYtPmR4ID0gLWZyb21YOworICAgIHBEc3RNVi0+ZHkgPSAtZnJvbVk7CisgICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCisgICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQorICAgIHsKKworICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KKyAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLworICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogeSkgKyB4OworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLworICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwLCBjYW5kU0FEID0gMDsKKyAgICAgICAgICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7CisgICAgICAgICAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCisgICAgICAgICAgICBpZiAoYXJtVkNNNFAyX0NvbXBhcmVNViAoeCwgeSwgY2FuZFNBRCwgcERzdE1WLT5keC8yLCBwRHN0TVYtPmR5LzIsIG1pblNBRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOworICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKKyAgICAgICAgICAgICAgICBwRHN0TVYtPmR4ID0geCoyOworICAgICAgICAgICAgICAgIHBEc3RNVi0+ZHkgPSB5KjI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLworICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlODYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIFZMQyBlc2NhcGUgbW9kZSBjaGVjayAKKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispCit7CisgICAgT01YX1U4IGVzY2FwZSA9IDAsIGZNb2RlID0gMCwgZW50cmllczsKKyAgICAKKyAgICBsZXZlbCA9IGFybUFicyAobGV2ZWwpOworICAgIGxldmVsUGx1cyA9IGFybUFicyAobGV2ZWxQbHVzKTsKKyAgICAKKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWwgYW5kIExhc3QgY29tYmluYXRpb24gCisgICAgICAgTW9kZSAwIGNoZWNrICovCisgICAgaWYgKHJ1biA8PSBtYXhTdG9yZVJ1bikKKyAgICB7CisgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW4gKyAxXQorICAgICAgICAgICAgICAgICAgLSBwUnVuSW5kZXhUYWJsZVtydW5dOworICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDE7CisgICAgfQorICAgIGlmKGVzY2FwZSAmJiBzaG9ydFZpZGVvSGVhZGVyKQorICAgIHsKKyAgICAgICAgZXNjYXBlID0gMDsKKyAgICAgICAgZk1vZGUgPSA0OworICAgIH0KKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1biwgbGV2ZWxQbHVzIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAorICAgICAgIE1vZGUgMSBjaGVjayAqLyAgICAKKyAgICBpZiAoZXNjYXBlKQorICAgIHsKKyAgICAgICAgZXNjYXBlID0gMDsKKyAgICAgICAgZk1vZGUgPSAxOworICAgICAgICBpZiAocnVuIDw9IG1heFN0b3JlUnVuKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyaWVzID0gcFJ1bkluZGV4VGFibGVbcnVuICsgMV0KKyAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1bl07CisgICAgICAgICAgICBpZiAocnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVudHJpZXMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsUGx1cyA+IGVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgd2l0aCBydW5QbHVzLCBsZXZlbCBhbmQgTGFzdCBjb21iaW5hdGlvbiAKKyAgICAgICBNb2RlIDIgY2hlY2sgKi8gICAgCisgICAgaWYgKGVzY2FwZSkKKyAgICB7CisgICAgICAgIGVzY2FwZSA9IDA7CisgICAgICAgIGZNb2RlID0gMjsKKyAgICAgICAgaWYgKHJ1blBsdXMgPD0gbWF4U3RvcmVSdW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW5QbHVzICsgMV0KKyAgICAgICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1blBsdXNdOworICAgICAgICAgICAgaWYgKHJ1blBsdXMgPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW50cmllcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGV2ZWwgPiBlbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIHNlbGVjdCBtb2RlIDMgLS0+IEZMQyAqLworICAgIGlmIChlc2NhcGUpCisgICAgeworICAgICAgICBmTW9kZSA9IDM7CisgICAgfQorICAgIAorICAgIHJldHVybiBmTW9kZTsKK30KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ODQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NvbXBhcmVNVi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ29tcGFyZU1WLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCisgKiB0aGUgYmVzdCBNViBhbmQgU0FECisgKgorICovCisgIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NvbXBhcmVNVgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIFNBRCdzIHRvIGRlY2lkZSB0aGUgCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICBtdlgJCXggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0JICAgIG12WQkJeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXQkgICAgY2FuZFNBRAlDYW5kaWRhdGUgU0FECisgKiBbaW5dCSAgICBiZXN0TVZYCXggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBiZXN0TVZZCXkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dCSAgICBiZXN0U0FECWJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0IAorICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAorICovCisKK09NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCisgICAgT01YX1MxNiBtdlgsIAorICAgIE9NWF9TMTYgbXZZLCAKKyAgICBPTVhfSU5UIGNhbmRTQUQsIAorICAgIE9NWF9TMTYgYmVzdE1WWCwgCisgICAgT01YX1MxNiBiZXN0TVZZLCAKKyAgICBPTVhfSU5UIGJlc3RTQUQKKykgCit7CisgICAgaWYgKGNhbmRTQUQgPCBiZXN0U0FEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjYW5kU0FEID4gYmVzdFNBRCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBzaG9ydGVyIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICBpZiAoIChtdlggKiBtdlggKyBtdlkgKiBtdlkpIDwgKGJlc3RNVlgqYmVzdE1WWCtiZXN0TVZZKmJlc3RNVlkpICkKKyAgICB7CisgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EQ1RfVGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY3MTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKQEAgLTAsMCArMSwxMTIgQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIERDVC9JRENUIGNvZWZmaWNlbnQgbWF0cml4CisgKgorICovCisKKyNpZm5kZWYgX09NWERDVENPU1RBQl9DXworI2RlZmluZSBfT01YRENUQ09TVEFCX0NfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCitjb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdID0KK3sKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAorICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzc5MCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDE1MiAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCisgICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAorICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzQyMCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDg2MCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKKyAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAorICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTM4LCAKKyAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAgCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIsIAorICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCisgICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzY4MCwgCisgICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAsIAorICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDkyMCwgCisgICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MzMwCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCisgICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDk2LCAKKyAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAorICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAwOTIwLCAKKyAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzg0MCwgCisgICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKKyAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDUyODAsIAorICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwIAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAorICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMDk4MCwgCisgICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MTcwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczMzQwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwMTMsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI1MTAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2NzAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ1MDAwLCAKKyAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDM4OCwgCisgICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNjIwLCAKKyAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTMzMCwgCisgICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzMjAwLCAKKyAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDc2MCAKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKKyAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAorICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMjYwLCAKKyAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAorICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczMjkwLCAKKyAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA3NjAsIAorICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0NzgwLCAKKyAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQyNzcKKyAgICAgICAgfQorfTsKKworI2VuZGlmIC8qX09NWERDVENPU1RBQl9DXyovCisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTcyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyCisgKgorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KKyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggIHN0YXJ0CispCit7CisgICAgT01YX1U4ICBsYXN0ID0gMDsKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgPiAyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgc3dpdGNoIChwcmVkRGlyKQorICAgIHsKKyAgICAgICAgY2FzZSBPTVhfVkNfTk9ORToKKyAgICAgICAgeworICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgorICAgICAgICB7CisgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorCQkJICBwRHN0LAorCQkJICBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBzdGFydCwKKwkJCSAgJmxhc3QsCisJCQkgIDEwLAorCQkJICA2MiwKKwkJCSAgIDcsCisJCQkgIDIxLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUgKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICBpZiAobGFzdCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfRXJyOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDZiNTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCisgKiBmb3IgaW50cmEgYmxvY2suCisgKgorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKykKK3sKKyAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzdGFydCA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwcmVkRGlyID4gMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgaWYgKHBhdHRlcm4pCisgICAgeworICAgICAgICBzd2l0Y2ggKHByZWREaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgT01YX1ZDX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE9NWF9WQ19IT1JJWk9OVEFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIE9NWF9WQ19WRVJUSUNBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAxNCwKKyAgICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAgIDksCisgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMCwKKwkJCSAgYXJtVkNNNFAyX0ludHJhTDFSdW5JZHgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wxLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMExNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxTE1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMVJNQVgsCisgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZQorICAgICAgICApOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgCisgICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLworCisgICAgcmV0dXJuIChPTVhfU3RzX05vRXJyKTsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIHB1dHRpbmcgVkxDIGJpdHMKKyAqCisgKi8gCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAorICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKKyAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKKyAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KKyAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcworICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAorICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKKwkJCSAgT01YX1UzMiBydW5QbHVzLAorICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCisgICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCisJCQkgIE9NWF9VOCAgbGFzdCwKKyAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKKykKK3sKKyAgICBPTVhfSU5UIHRlbXBJbmRleDsKKwlPTVhfVTMyIHRlbXBSdW4gPSBydW4sIHNpZ24gPSAwOworICAgIE9NWF9TMTYgdGVtcExldmVsID0gbGV2ZWw7IAorICAgIAorICAgIC8qIEVzY2FwZSBzZXF1ZW5jZSBhZGRpdGlvbiAqLworICAgIGlmIChmTW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMCwgMSk7CisJCXRlbXBMZXZlbCA9IGxldmVsUGx1czsKKworICAgIH0KKyAgICBlbHNlIGlmKGZNb2RlID09IDIpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAyLCAyKTsKKwkJdGVtcFJ1biA9IHJ1blBsdXM7CisgICAgfQorICAgIGVsc2UgaWYgKGZNb2RlID09IDMpCisgICAgeworICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCAyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZk1vZGUgPT0gNCkKKyAgICB7CisgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKKyAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWxhc3QsIDEpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgdGVtcFJ1biwgNik7CisJCWlmKCh0ZW1wTGV2ZWwgIT0gMCkgJiYgKHRlbXBMZXZlbCAhPSAtMTI4KSkKKwkJeworCQkgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisJCQkgICAoT01YX1UzMikgdGVtcExldmVsLCA4KTsKKwkJfQorCQlyZXR1cm4gT01YX1N0c19Ob0VycjsJCQorICAgIH0KKyAgICAKKyAgICBpZiAodGVtcExldmVsIDwgMCkKKyAgICB7CisgICAgICAgIHNpZ24gPSAxOworICAgICAgICB0ZW1wTGV2ZWwgPSBhcm1BYnModGVtcExldmVsKTsKKyAgICB9CisgICAgLyogUHV0dGluZyBWTEMgYml0cyBpbiB0aGUgc3RyZWFtICovCisJaWYgKGZNb2RlIDwgMykKKwl7CisJCWlmICh0ZW1wUnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQorCQl7CisJCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzICsgMV0gKyAKKwkJCQkJCSh0ZW1wUnVuIC0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIC0gMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbdGVtcFJ1bl0gKyAodGVtcExldmVsIC0xKTsKKwkJfQorICAgIAorCQlhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJCQkgIHBWbGNUYWJsZSBbdGVtcEluZGV4XSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilzaWduLCAxKTsKKwl9CisgICAgZWxzZQorCXsKKwkJaWYgKHNpZ24pCisJCXsKKwkJCXRlbXBMZXZlbCA9IC10ZW1wTGV2ZWw7CisJCX0KKwkJdGVtcFJ1biAgPSBydW47CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKKwkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7CisJCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgMTIpOworCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7CisJfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKkVuZCBvZiBGaWxlKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTJjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKKyAqCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIHBJbmRleCwKKyAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKKykKK3sKKyAgICAvKiBTdG9yZSB0aGUgemVybydzIGFzIHBlciB0aGUgcnVuIGxlbmd0aCBjb3VudCAqLworICAgIGZvciAoO3N0b3JlUnVuID4gMDsgc3RvcmVSdW4tLSwgKCpwSW5kZXgpKyspCisgICAgeworICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSAwOworICAgIH0KKyAgICAvKiBTdG9yZSB0aGUgbGV2ZWwgZGVwZW5kaW5nIG9uIHRoZSBzaWduKi8KKyAgICBpZiAoc2lnbiA9PSAxKQorICAgIHsKKyAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gLXN0b3JlTGV2ZWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IHN0b3JlTGV2ZWw7CisgICAgfQorICAgICgqcEluZGV4KSsrOworCisgICAgLyogSWYgbGFzdCBpcyAxLCBmaWxsIHRoZSByZW1haW5pbmcgZWxtZW50cyBvZiB0aGUgYnVmZmVyIHdpdGggemVyb3MgKi8KKyAgICBpZiAobGFzdCA9PSAxKQorICAgIHsKKyAgICAgICAgd2hpbGUgKCpwSW5kZXggPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gMDsKKyAgICAgICAgICAgICgqcEluZGV4KSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNmNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCkBAIC0wLDAgKzEsMjc4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0dldFZMQ0JpdHMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZ2V0IGJpdHMgZnJvbSB0aGUgc3RyZWFtIAorICoKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorCisgCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfR2V0VkxDQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCisgKiBsYXN0IGNvbWJpbmF0aW9ucy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbQorICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICoJCQkJCQkJCWJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzdGFydCAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAorICogICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgorICogW2luL291dF0gcExhc3QgICAgICAgcG9pbnRlciB0byBsYXN0IHN0YXR1cyBmbGFnCisgKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMAorICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAorICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDEKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wxICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMCAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwVmxjVGFibGVMMCAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDEgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFZsY1RhYmxlTDEgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQorICogW2luXSBwTE1BWFRhYmxlTDAgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBMTUFYVGFibGVMMSAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcFJNQVhUYWJsZUwwICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFJNQVhUYWJsZUwxICAgICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtvdXRdcERzdAkJCSAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorICoJCQkJCQkJYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0dldFZMQ0JpdHMgKAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisJCQkgIE9NWF9TMTYgKiBwRHN0LAorCQkJICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisJCQkgIE9NWF9VOCAgICBzdGFydCwJCQkgIAorCQkJICBPTVhfVTggICogcExhc3QsCisJCQkgIE9NWF9VOCAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorCQkJICBPTVhfVTggICAgbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCisJCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCispCit7CisgICAgT01YX1UzMiBzdG9yZVJ1bjsKKyAgICBPTVhfVTggIHRhYkluZGV4LCBtYXJrZXJCaXQ7CisgICAgT01YX1MxNiBzdG9yZUxldmVsOworICAgIE9NWF9VMTYgdW5wYWNrUmV0SW5kZXg7CisJT01YX1U4ICBpLCBmVHlwZSwgZXNjYXBlOwkKKwlPTVhfVTggIHNpZ24gPSAwOworCQorCS8qIFVucGFja2luZyB0aGUgYml0c3RyZWFtIGFuZCBSTEQgKi8KKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IDY0OykKKyAgICB7CisJCWVzY2FwZSA9IGFybUxvb2tBaGVhZEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDcpOworCQlpZiAoZXNjYXBlICE9IDMpCisJCXsJCisJCQlmVHlwZSA9IDA7IC8qIE5vdCBpbiBlc2NhcGUgbW9kZSAqLworCQl9CisJCWVsc2UKKwkJeworCQkJYXJtU2tpcEJpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKKwkJCWlmKHNob3J0VmlkZW9IZWFkZXIpCisJCQl7CisJCQkgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOworCQkJICBzdG9yZVJ1biA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOworCQkJICBzdG9yZUxldmVsID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgOCk7CisJCQkgIAorCQkJICAvKiBSZWYgdG8gVGFibGUgQi0xOCAoYykgaW4gTVBFRzQgU3RhbmRhcmQtIEZMQyBjb2RlIGZvciAgKi8KKwkJCSAgLyogTEVWRUwgd2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgMSwgdGhlIHN0b3JlTGV2ZWwgaXMgICovCisJCQkgIC8qIGEgc2lnbmVkIHZhbHVlIGFuZCB0aGUgc2lnbiBhbmQgdGhlIHVuc2lnbmVkIHZhbHVlIGZvciAqLworCQkJICAvKiBzdG9yZUxldmVsIG5lZWQgdG8gYmUgZXh0cmFjdGVkIGFuZCBwYXNzZWQgdG8gYXJtICAgICAgKi8KKwkJCSAgLyogRmlsbFZMREJ1ZmZlciBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQkgICAgIAorCQkJICBzaWduID0gKHN0b3JlTGV2ZWwgJiAweDgwKTsKKwkJCSAgaWYoc2lnbj09MHg4MCkKKwkJCSAgeworCQkJICAJc3RvcmVMZXZlbD0oc3RvcmVMZXZlbF4weGZmKSsxOwkJCSAgCisJCQkgIAlzaWduPTE7CisJCQkgIAkKKwkJCSAgfQorCQkJICAKKwkJCSAgYXJtUmV0RGF0YUVycklmKCBzdG9yZUxldmVsID09IDAgfHwgc2lnbipzdG9yZUxldmVsID09IDEyOCAsIE9NWF9TdHNfRXJyKTsgLyogSW52YWxpZCBGTEMgKi8KKwkJCSAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7CisJCQkgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorCQkJICAgIHN0b3JlUnVuLAorCQkJICAgIHBEc3QsCisJCQkgICAgc3RvcmVMZXZlbCwKKwkJCSAgICBzaWduLAorCQkJICAgICpwTGFzdCwKKwkJCSAgICAmaSwKKwkJCSAgICBwWmlnemFnVGFibGUpOworCQkJICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworCQkJICAgIAorCQkJfQorCQkJaWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpKQorCQkJeworCQkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKKwkJCQl7CisJCQkJCWZUeXBlID0gMzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZlR5cGUgPSAyOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmVHlwZSA9IDE7CisJCQl9CisJCX0KKworCSAgICBpZiAoZlR5cGUgPCAzKQorCSAgICB7CisJICAgICAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorCQkJCQkJCQkJCXBWbGNUYWJsZUwwKTsKKwkJCWlmICh1bnBhY2tSZXRJbmRleCAhPSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgpCisJCSAgICB7CisJCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KKwkJCSAgICAvKiBsYXN0ID0gMCAqLworCQkJICAgICpwTGFzdCA9IDA7CisJCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMCkKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSAxOworCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApIAorCQkJCQkJCSsgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMDsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJICAgIHsKKwkJCQkgICAgdGFiSW5kZXggPSAxOworCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMFt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCisJCQkJICAgIHsKKwkJCQkJICAgIHRhYkluZGV4Kys7CisJCQkJICAgIH0KKwkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXggLSAxXSArIDE7CisJCQkgICAgfQorCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJCQorCQkJICAgIGlmIChmVHlwZSA9PSAxKQorCQkJICAgIHsKKwkJCQkgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDBbc3RvcmVSdW5dKTsKKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAoZlR5cGUgPT0gMikKKwkJCSAgICB7CisJCQkJICAgIHN0b3JlUnVuID0gc3RvcmVSdW4gKyBwUk1BWFRhYmxlTDBbc3RvcmVMZXZlbC0xXSArIDE7CisJCQkgICAgfQorCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJICAgIHVucGFja1JldEluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAorCQkJCQkJCQkJCQlwVmxjVGFibGVMMSk7CisKKwkJCSAgICBhcm1SZXREYXRhRXJySWYodW5wYWNrUmV0SW5kZXggPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7CisKKwkJCSAgICAvKiBEZWNvZGUgcnVuIGFuZCBsZXZlbCBmcm9tIHRoZSBpbmRleCAqLworCQkJICAgIC8qIGxhc3QgPSAxICovCisJCQkgICAgKnBMYXN0ID0gMTsKKwkJCSAgICBpZiAodW5wYWNrUmV0SW5kZXggPiBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxKQorCQkJICAgIHsKKwkJCQkgICAgc3RvcmVMZXZlbCA9IDE7CisJCQkJICAgIHN0b3JlUnVuID0gKHVucGFja1JldEluZGV4IC0gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkgCisJCQkJCQkJKyBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMTsKKwkJICAgICAgICB9CisJCSAgICAgICAgZWxzZQorCQkJICAgIHsKKwkJCQkgICAgdGFiSW5kZXggPSAxOworCQkJCSAgICB3aGlsZSAocFJ1bkluZGV4VGFibGVMMVt0YWJJbmRleF0gPD0gdW5wYWNrUmV0SW5kZXgpCisJCQkJICAgIHsKKwkJCQkJICAgIHRhYkluZGV4Kys7CisJCQkJICAgIH0KKwkJCQkgICAgc3RvcmVSdW4gPSB0YWJJbmRleCAtIDE7CisJCQkJICAgIHN0b3JlTGV2ZWwgPSB1bnBhY2tSZXRJbmRleCAtIHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXggLSAxXSArIDE7CisJCQkgICAgfQorCQkJICAgIHNpZ24gPSAoT01YX1U4KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKworCQkJICAgIGlmIChmVHlwZSA9PSAxKQorCQkJICAgIHsKKwkJCSAgICAgICAgc3RvcmVMZXZlbCA9IChhcm1BYnMoc3RvcmVMZXZlbCkgKyBwTE1BWFRhYmxlTDFbc3RvcmVSdW5dKTsJCQkJCisJCQkgICAgfQorCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCisJCQkgICAgeworCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwxW3N0b3JlTGV2ZWwtMV0gKyAxOworCQkJICAgIH0KKwkJICAgIH0KKyAgICAgICAgICAgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOworCQkgICAgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCisJCQkgICAgc3RvcmVSdW4sCisJCQkgICAgcERzdCwKKwkJCSAgICBzdG9yZUxldmVsLAorCQkJICAgIHNpZ24sCisJCQkgICAgKnBMYXN0LAorCQkJICAgICZpLAorCQkJICAgIHBaaWd6YWdUYWJsZSk7CQkKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJICAgICpwTGFzdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOworCQkgICAgc3RvcmVSdW4gID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNik7CisJCSAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKKwkJICAgIG1hcmtlckJpdCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEpOworCQkgICAgYXJtUmV0RGF0YUVycklmKCBtYXJrZXJCaXQgPT0gMCwgT01YX1N0c19FcnIpOworCQkgICAgc3RvcmVMZXZlbCAgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxMik7CisJCSAgICBpZiAoc3RvcmVMZXZlbCAmIDB4ODAwKQorCQkgICAgeworCQkJICAgIHN0b3JlTGV2ZWwgLT0gNDA5NjsKKwkJICAgIH0JCQkKKwkJICAgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHN0b3JlTGV2ZWwgPT0gLTIwNDggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCisJCSAgICBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKKwkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorCQkJICAgIHN0b3JlUnVuLAorCQkJICAgIHBEc3QsCisJCQkgICAgc3RvcmVMZXZlbCwKKwkJCSAgICAwLCAvKiBTaWduIGlzIG5vdCB1c2VkLCBwcmVwcm9jZXNzaW5nIGRvbmUgKi8KKwkJCSAgICAqcExhc3QsCisJCQkgICAgJmksCisJCQkgICAgcFppZ3phZ1RhYmxlKTsKKworCSAgICB9CisgICAgfSAvKiBFbmQgb2YgZm9ybG9vcCBmb3IgaSAqLworCXJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgRmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkN2U5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDQ5NSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKiAKKyogIEZvciBJbnRyYQorKiAgbGFzdCA9IDAgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4WzExXSA9IAoreyAKKyAgICAwLCAyNywgMzcsIDQyLCA0NiwgNDksIDUyLCAKKyAgICA1NSwgNTgsIDYwLCA2MgorfTsKKworLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKKyogIGZvciBydW4gPSAwIHRvIDE0CisqICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKKyovCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDBbNjhdID0gCit7CisgICAgICAgIHsyLCAgICAyfSwKKyAgICAgICAgezMsICAgIDZ9LAorICAgICAgICB7NCwgICAgMTV9LAorICAgICAgICB7NSwgICAgMTN9LAorICAgICAgICB7NSwgICAgMTJ9LAorICAgICAgICB7NiwgICAgMjF9LAorICAgICAgICB7NiwgICAgMTl9LAorICAgICAgICB7NiwgICAgMTh9LAorICAgICAgICB7NywgICAgMjN9LAorICAgICAgICB7OCwgICAgMzF9LAorICAgICAgICB7OCwgICAgMzB9LAorICAgICAgICB7OCwgICAgMjl9LAorICAgICAgICB7OSwgICAgMzd9LAorICAgICAgICB7OSwgICAgMzZ9LAorICAgICAgICB7OSwgICAgMzV9LAorICAgICAgICB7OSwgICAgMzN9LAorICAgICAgICB7MTAsICAgMzN9LAorICAgICAgICB7MTAsICAgMzJ9LAorICAgICAgICB7MTAsICAgMTV9LAorICAgICAgICB7MTAsICAgMTR9LAorICAgICAgICB7MTEsICAgIDd9LAorICAgICAgICB7MTEsICAgIDZ9LAorICAgICAgICB7MTEsICAgMzJ9LAorICAgICAgICB7MTEsICAgMzN9LAorICAgICAgICB7MTIsICAgODB9LAorICAgICAgICB7MTIsICAgODF9LAorICAgICAgICB7MTIsICAgODJ9LAorICAgICAgICB7NCwgICAgMTR9LAorICAgICAgICB7NiwgICAgMjB9LAorICAgICAgICB7NywgICAgMjJ9LAorICAgICAgICB7OCwgICAgMjh9LAorICAgICAgICB7OSwgICAgMzJ9LAorICAgICAgICB7OSwgICAgMzF9LAorICAgICAgICB7MTAsICAgMTN9LAorICAgICAgICB7MTEsICAgMzR9LAorICAgICAgICB7MTIsICAgODN9LAorICAgICAgICB7MTIsICAgODV9LAorICAgICAgICB7NSwgICAgMTF9LAorICAgICAgICB7NywgICAgMjF9LAorICAgICAgICB7OSwgICAgMzB9LAorICAgICAgICB7MTAsICAgMTJ9LAorICAgICAgICB7MTIsICAgODZ9LAorICAgICAgICB7NiwgICAgMTd9LAorICAgICAgICB7OCwgICAgMjd9LAorICAgICAgICB7OSwgICAgMjl9LAorICAgICAgICB7MTAsICAgMTF9LAorICAgICAgICB7NiwgICAgMTZ9LAorICAgICAgICB7OSwgICAgMzR9LAorICAgICAgICB7MTAsICAgMTB9LAorICAgICAgICB7NiwgICAgMTN9LAorICAgICAgICB7OSwgICAgMjh9LAorICAgICAgICB7MTAsICAgIDh9LAorICAgICAgICB7NywgICAgMTh9LAorICAgICAgICB7OSwgICAgMjd9LAorICAgICAgICB7MTIsICAgODR9LAorICAgICAgICB7NywgICAgMjB9LAorICAgICAgICB7OSwgICAgMjZ9LAorICAgICAgICB7MTIsICAgODd9LAorICAgICAgICB7OCwgICAgMjV9LAorICAgICAgICB7MTAsICAgIDl9LAorICAgICAgICB7OCwgICAgMjR9LAorICAgICAgICB7MTEsICAgMzV9LAorICAgICAgICB7OCwgICAgMjN9LAorICAgICAgICB7OSwgICAgMjV9LAorICAgICAgICB7OSwgICAgMjR9LAorICAgICAgICB7MTAsICAgIDd9LAorICAgICAgICB7MTIsICAgODh9LAorICAgICAgICB7MCwgICAgIDB9Cit9OworCisvKiAKKyogIEZvciBJbnRyYQorKiAgbGFzdCA9IDEgCisqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbOF0gPSAKK3sKKyAgICAwLCAgOCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMQorfTsKKworLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKKyogIGZvciBydW4gPSAwIHRvIDIwCisqICAqICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKKyovCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDFbMzZdID0gCit7CisgICAgICAgIHs0LCAgICAgN30sCisgICAgICAgIHs2LCAgICAxMn0sCisgICAgICAgIHs4LCAgICAyMn0sCisgICAgICAgIHs5LCAgICAyM30sCisgICAgICAgIHsxMCwgICAgNn0sCisgICAgICAgIHsxMSwgICAgNX0sCisgICAgICAgIHsxMSwgICAgNH0sCisgICAgICAgIHsxMiwgICA4OX0sCisgICAgICAgIHs2LCAgICAxNX0sCisgICAgICAgIHs5LCAgICAyMn0sCisgICAgICAgIHsxMCwgICAgNX0sCisgICAgICAgIHs2LCAgICAxNH0sCisgICAgICAgIHsxMCwgICAgNH0sCisgICAgICAgIHs3LCAgICAxN30sCisgICAgICAgIHsxMSwgICAzNn0sCisgICAgICAgIHs3LCAgICAxNn0sCisgICAgICAgIHsxMSwgICAzN30sCisgICAgICAgIHs3LCAgICAxOX0sCisgICAgICAgIHsxMiwgICA5MH0sCisgICAgICAgIHs4LCAgICAyMX0sCisgICAgICAgIHsxMiwgICA5MX0sCisgICAgICAgIHs4LCAgICAyMH0sCisgICAgICAgIHs4LCAgICAxOX0sCisgICAgICAgIHs4LCAgICAyNn0sCisgICAgICAgIHs5LCAgICAyMX0sCisgICAgICAgIHs5LCAgICAyMH0sCisgICAgICAgIHs5LCAgICAxOX0sCisgICAgICAgIHs5LCAgICAxOH0sCisgICAgICAgIHs5LCAgICAxN30sCisgICAgICAgIHsxMSwgICAzOH0sCisgICAgICAgIHsxMSwgICAzOX0sCisgICAgICAgIHsxMiwgICA5Mn0sCisgICAgICAgIHsxMiwgICA5M30sCisgICAgICAgIHsxMiwgICA5NH0sCisgICAgICAgIHsxMiwgICA5NX0sICAKKyAgICAgICAgezAsICAgICAwfQorfTsKKworLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTE1BWFsxNV0gPSAKK3sKKyAgIDI3LCAxMCwgIDUsICA0LCAgMywgIDMsICAzLCAgCisgICAgMywgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEKK307CisKKy8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpKi8KK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMUxNQVhbMjFdID0gCit7CisgICAgOCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIAorCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorCTEsICAxLCAgMSwgIDEsICAxCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUk1BWFsyN10gPQoreworICAgMTQsICA5LCAgNywgIDMsICAyLCAgMSwJMSwgIAorICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCTAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUk1BWFs4XSA9Cit7CisgICAyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKK307CisKKy8qIAorKiAgRm9yIEludGVyCisqICBsYXN0ID0gMCAKKyovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSdW5JZHhbMTJdID0gCit7IAorICAgICAwLCAgMTIsICAxOCwgIDIyLCAgMjUsICAyOCwgIAorICAgIDMxLCAgMzQsICAzNiwgIDM4LCAgNDAsICA0MgorfTsKKworLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKKyogIGZvciBydW4gPSAwIHRvIDI2CisqICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKKyovCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDBbNTldID0gCit7CisgICAgICAgIHsyLCAgICAgMn0sCisgICAgICAgIHs0LCAgICAxNX0sCisgICAgICAgIHs2LCAgICAyMX0sCisgICAgICAgIHs3LCAgICAyM30sCisgICAgICAgIHs4LCAgICAzMX0sCisgICAgICAgIHs5LCAgICAzN30sCisgICAgICAgIHs5LCAgICAzNn0sCisgICAgICAgIHsxMCwgICAzM30sCisgICAgICAgIHsxMCwgICAzMn0sCisgICAgICAgIHsxMSwgICAgN30sCisgICAgICAgIHsxMSwgICAgNn0sCisgICAgICAgIHsxMSwgICAzMn0sCisgICAgICAgIHszLCAgICAgNn0sCisgICAgICAgIHs2LCAgICAyMH0sCisgICAgICAgIHs4LCAgICAzMH0sCisgICAgICAgIHsxMCwgICAxNX0sCisgICAgICAgIHsxMSwgICAzM30sCisgICAgICAgIHsxMiwgICA4MH0sCisgICAgICAgIHs0LCAgICAxNH0sCisgICAgICAgIHs4LCAgICAyOX0sCisgICAgICAgIHsxMCwgICAxNH0sCisgICAgICAgIHsxMiwgICA4MX0sCisgICAgICAgIHs1LCAgICAxM30sCisgICAgICAgIHs5LCAgICAzNX0sCisgICAgICAgIHsxMCwgICAxM30sCisgICAgICAgIHs1LCAgICAxMn0sCisgICAgICAgIHs5LCAgICAzNH0sCisgICAgICAgIHsxMiwgICA4Mn0sCisgICAgICAgIHs1LCAgICAxMX0sCisgICAgICAgIHsxMCwgICAxMn0sCisgICAgICAgIHsxMiwgICA4M30sCisgICAgICAgIHs2LCAgICAxOX0sCisgICAgICAgIHsxMCwgICAxMX0sCisgICAgICAgIHsxMiwgICA4NH0sCisgICAgICAgIHs2LCAgICAxOH0sCisgICAgICAgIHsxMCwgICAxMH0sCisgICAgICAgIHs2LCAgICAxN30sCisgICAgICAgIHsxMCwgICAgOX0sCisgICAgICAgIHs2LCAgICAxNn0sCisgICAgICAgIHsxMCwgICAgOH0sCisgICAgICAgIHs3LCAgICAyMn0sCisgICAgICAgIHsxMiwgICA4NX0sCisgICAgICAgIHs3LCAgICAyMX0sCisgICAgICAgIHs3LCAgICAyMH0sCisgICAgICAgIHs4LCAgICAyOH0sCisgICAgICAgIHs4LCAgICAyN30sCisgICAgICAgIHs5LCAgICAzM30sCisgICAgICAgIHs5LCAgICAzMn0sCisgICAgICAgIHs5LCAgICAzMX0sCisgICAgICAgIHs5LCAgICAzMH0sCisgICAgICAgIHs5LCAgICAyOX0sCisgICAgICAgIHs5LCAgICAyOH0sCisgICAgICAgIHs5LCAgICAyN30sCisgICAgICAgIHs5LCAgICAyNn0sCisgICAgICAgIHsxMSwgICAzNH0sCisgICAgICAgIHsxMSwgICAzNX0sCisgICAgICAgIHsxMiwgICA4Nn0sCisgICAgICAgIHsxMiwgICA4N30sCisgICAgICAgIHswLCAgICAgMH0KK307CisgCisKKy8qIAorKiAgRm9yIEludHJhCisqICBsYXN0ID0gMSAKKyovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeFszXSA9IAoreworICAgIDAsIDMsIDUKK307CisKKy8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCisqICBmb3IgcnVuID0gMCB0byA0MAorKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCisqLworY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XSA9IAoreworICAgICAgICB7NCwgICAgIDd9LAorICAgICAgICB7OSwgICAgMjV9LAorICAgICAgICB7MTEsICAgIDV9LAorICAgICAgICB7NiwgICAgMTV9LAorICAgICAgICB7MTEsICAgIDR9LAorICAgICAgICB7NiwgICAgMTR9LAorICAgICAgICB7NiwgICAgMTN9LAorICAgICAgICB7NiwgICAgMTJ9LAorICAgICAgICB7NywgICAgMTl9LAorICAgICAgICB7NywgICAgMTh9LAorICAgICAgICB7NywgICAgMTd9LAorICAgICAgICB7NywgICAgMTZ9LAorICAgICAgICB7OCwgICAgMjZ9LAorICAgICAgICB7OCwgICAgMjV9LAorICAgICAgICB7OCwgICAgMjR9LAorICAgICAgICB7OCwgICAgMjN9LAorICAgICAgICB7OCwgICAgMjJ9LAorICAgICAgICB7OCwgICAgMjF9LAorICAgICAgICB7OCwgICAgMjB9LAorICAgICAgICB7OCwgICAgMTl9LAorICAgICAgICB7OSwgICAgMjR9LAorICAgICAgICB7OSwgICAgMjN9LAorICAgICAgICB7OSwgICAgMjJ9LAorICAgICAgICB7OSwgICAgMjF9LAorICAgICAgICB7OSwgICAgMjB9LAorICAgICAgICB7OSwgICAgMTl9LAorICAgICAgICB7OSwgICAgMTh9LAorICAgICAgICB7OSwgICAgMTd9LAorICAgICAgICB7MTAsICAgIDd9LAorICAgICAgICB7MTAsICAgIDZ9LAorICAgICAgICB7MTAsICAgIDV9LAorICAgICAgICB7MTAsICAgIDR9LAorICAgICAgICB7MTEsICAgMzZ9LAorICAgICAgICB7MTEsICAgMzd9LAorICAgICAgICB7MTEsICAgMzh9LAorICAgICAgICB7MTEsICAgMzl9LAorICAgICAgICB7MTIsICAgODh9LAorICAgICAgICB7MTIsICAgODl9LAorICAgICAgICB7MTIsICAgOTB9LAorICAgICAgICB7MTIsICAgOTF9LAorICAgICAgICB7MTIsICAgOTJ9LAorICAgICAgICB7MTIsICAgOTN9LAorICAgICAgICB7MTIsICAgOTR9LAorICAgICAgICB7MTIsICAgOTV9LAorICAgICAgICB7IDAsICAgIDB9Cit9OworCisvKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKSovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsCit9OworCisvKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCitjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXSA9IAoreworICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKwkxLCAgCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUk1BWFsxMl0gPSAKK3sKKyAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsICAgCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwCit9OworCisvKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKQorICAgTGV2ZWwgLSAxIEluZGV4ZWQgCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUk1BWFszXSA9IAoreworICAgNDAsICAxLCAgMAorfTsKKworLyogCisqICBGb3IgSW50cmEgLSBMdW1pbmFuY2UKKyovCisKK2NvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdID0gCit7CisgICAgICAgIHszLCAgICAgM30sCisgICAgICAgIHsyLCAgICAgM30sCisgICAgICAgIHsyLCAgICAgMn0sCisgICAgICAgIHszLCAgICAgMn0sCisgICAgICAgIHszLCAgICAgMX0sCisgICAgICAgIHs0LCAgICAgMX0sCisgICAgICAgIHs1LCAgICAgMX0sCisgICAgICAgIHs2LCAgICAgMX0sCisgICAgICAgIHs3LCAgICAgMX0sCisgICAgICAgIHs4LCAgICAgMX0sCisgICAgICAgIHs5LCAgICAgMX0sCisgICAgICAgIHsxMCwgICAgMX0sCisgICAgICAgIHsxMSwgICAgMX0sCisgICAgICAgIHswLCAgICAgMH0KK307CisKKy8qIAorKiAgRm9yIEludHJhIC0gQ2hyb21pbmFuY2UKKyovCisgCitjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMTRdID0gCit7CisgICAgICAgIHsyLCAgICAgM30sCisgICAgICAgIHsyLCAgICAgMn0sCisgICAgICAgIHsyLCAgICAgMX0sCisgICAgICAgIHszLCAgICAgMX0sCisgICAgICAgIHs0LCAgICAgMX0sCisgICAgICAgIHs1LCAgICAgMX0sCisgICAgICAgIHs2LCAgICAgMX0sCisgICAgICAgIHs3LCAgICAgMX0sCisgICAgICAgIHs4LCAgICAgMX0sCisgICAgICAgIHs5LCAgICAgMX0sCisgICAgICAgIHsxMCwgICAgMX0sCisgICAgICAgIHsxMSwgICAgMX0sCisgICAgICAgIHsxMiwgICAgMX0sCisgICAgICAgIHswLCAgICAgMH0KK307CisKKy8qIAorICogIE1vdGlvbiB2ZWN0b3IgZGVjb2RpbmcgdGFibGUKKyAqLworIAorY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XSA9Cit7CisgICAgICAgIHsxMywgICAgIDV9LAorICAgICAgICB7MTMsICAgICA3fSwKKyAgICAgICAgezEyLCAgICAgNX0sCisgICAgICAgIHsxMiwgICAgIDd9LAorICAgICAgICB7MTIsICAgICA5fSwKKyAgICAgICAgezEyLCAgICAxMX0sCisgICAgICAgIHsxMiwgICAgMTN9LAorICAgICAgICB7MTIsICAgIDE1fSwKKyAgICAgICAgezExLCAgICAgOX0sCisgICAgICAgIHsxMSwgICAgMTF9LAorICAgICAgICB7MTEsICAgIDEzfSwKKyAgICAgICAgezExLCAgICAxNX0sCisgICAgICAgIHsxMSwgICAgMTd9LAorICAgICAgICB7MTEsICAgIDE5fSwKKyAgICAgICAgezExLCAgICAyMX0sCisgICAgICAgIHsxMSwgICAgMjN9LAorICAgICAgICB7MTEsICAgIDI1fSwKKyAgICAgICAgezExLCAgICAyN30sCisgICAgICAgIHsxMSwgICAgMjl9LAorICAgICAgICB7MTEsICAgIDMxfSwKKyAgICAgICAgezExLCAgICAzM30sCisgICAgICAgIHsxMSwgICAgMzV9LAorICAgICAgICB7MTAsICAgIDE5fSwKKyAgICAgICAgezEwLCAgICAyMX0sCisgICAgICAgIHsxMCwgICAgMjN9LAorICAgICAgICB7OCwgICAgICA3fSwKKyAgICAgICAgezgsICAgICAgOX0sCisgICAgICAgIHs4LCAgICAgMTF9LAorICAgICAgICB7NywgICAgICA3fSwKKyAgICAgICAgezUsICAgICAgM30sCisgICAgICAgIHs0LCAgICAgIDN9LAorICAgICAgICB7MywgICAgICAzfSwKKyAgICAgICAgezEsICAgICAgMX0sCisgICAgICAgIHszLCAgICAgIDJ9LAorICAgICAgICB7NCwgICAgICAyfSwKKyAgICAgICAgezUsICAgICAgMn0sCisgICAgICAgIHs3LCAgICAgIDZ9LAorICAgICAgICB7OCwgICAgIDEwfSwKKyAgICAgICAgezgsICAgICAgOH0sCisgICAgICAgIHs4LCAgICAgIDZ9LAorICAgICAgICB7MTAsICAgIDIyfSwKKyAgICAgICAgezEwLCAgICAyMH0sCisgICAgICAgIHsxMCwgICAgMTh9LAorICAgICAgICB7MTEsICAgIDM0fSwKKyAgICAgICAgezExLCAgICAzMn0sCisgICAgICAgIHsxMSwgICAgMzB9LAorICAgICAgICB7MTEsICAgIDI4fSwKKyAgICAgICAgezExLCAgICAyNn0sCisgICAgICAgIHsxMSwgICAgMjR9LAorICAgICAgICB7MTEsICAgIDIyfSwKKyAgICAgICAgezExLCAgICAyMH0sCisgICAgICAgIHsxMSwgICAgMTh9LAorICAgICAgICB7MTEsICAgIDE2fSwKKyAgICAgICAgezExLCAgICAxNH0sCisgICAgICAgIHsxMSwgICAgMTJ9LAorICAgICAgICB7MTEsICAgIDEwfSwKKyAgICAgICAgezExLCAgICAgOH0sCisgICAgICAgIHsxMiwgICAgMTR9LAorICAgICAgICB7MTIsICAgIDEyfSwKKyAgICAgICAgezEyLCAgICAxMH0sCisgICAgICAgIHsxMiwgICAgIDh9LAorICAgICAgICB7MTIsICAgICA2fSwKKyAgICAgICAgezEyLCAgICAgNH0sCisgICAgICAgIHsxMywgICAgIDZ9LAorICAgICAgICB7MTMsICAgICA0fSwKKyAgICAgICAgeyAwLCAgICAgMH0KK307CisKKy8qIEVuZCBvZiBmaWxlICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZWZlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9QdXRWTENCaXRzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIHB1dCBiaXRzIHRvIGJpdHN0cmVhbSAKKyAqCisgKi8gCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKworIAorLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKykKK3sKKworICAgIE9NWF9VMzIgc3RvcmVSdW4gPSAwLCBydW4sIHN0b3JlUnVuUGx1czsKKyAgICBPTVhfVTggIGxhc3QgPSAwLCBmaXJzdCA9IDEsIGZNb2RlOworICAgIE9NWF9TMTYgbGV2ZWwsIHN0b3JlTGV2ZWwgPSAwLCBzdG9yZUxldmVsUGx1czsKKyAgICBPTVhfSU5UIGk7CisgICAgCisgICAgICAgIC8qIFJMRSBlbmNvZGluZyBhbmQgcGFja2luZyB0aGUgYml0cyBpbnRvIHRoZSBzdHJlYW1zICovCisgICAgICAgIGZvciAoaSA9IHN0YXJ0LCBydW49MDsgaSA8IDY0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldmVsICAgPSBwUURjdEJsa0NvZWZbcFppZ3phZ1RhYmxlW2ldXTsKKworICAgICAgICAgICAgLyogQ291bnRpbmcgdGhlIHJ1biAqLworICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZvdW5kIGEgbm9uLXplcm8gY29lZmYgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgaW4gdGhlIFZMQyB0YWJsZSAqLworICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cyA9IGFybVNpZ25DaGVjayhzdG9yZUxldmVsKSAqIAorICAgICAgICAgICAgICAgICAgICAgIChhcm1BYnMoc3RvcmVMZXZlbCkgLSBwTE1BWFRhYmxlTDBbc3RvcmVSdW5dKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzID0gc3RvcmVSdW4gLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFJNQVhUYWJsZUwwW2FybUFicyhzdG9yZUxldmVsKSAtIDFdICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZk1vZGUgPSBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yZVJ1bkwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwQml0U3RyZWFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIAorCQkJCQkJCQkJICBzdG9yZVJ1blBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk1vZGUsCisJCQkJCQkJCQkgIGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZsY1RhYmxlTDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICBzdG9yZVJ1biAgID0gcnVuOworICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLyogZW5kIG9mIGZvciBsb29wIGZvciA2NCBlbGVtZW50cyAqLworCisgICAgICAgIC8qIHdyaXRpbmcgdGhlIGxhc3QgZWxlbWVudCAqLworICAgICAgICBsYXN0ID0gMTsKKyAgICAgICAgCisgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IGluIHRoZSBWTEMgdGFibGUgKi8KKyAgICAgICAgc3RvcmVMZXZlbFBsdXMgPSBhcm1TaWduQ2hlY2soc3RvcmVMZXZlbCkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgIChhcm1BYnMoc3RvcmVMZXZlbCkgLSBwTE1BWFRhYmxlTDFbcnVuXSk7CisgICAgICAgIHN0b3JlUnVuUGx1cyA9IHN0b3JlUnVuIC0gCisgICAgICAgICAgICAgICAgICAgICAgKHBSTUFYVGFibGVMMVthcm1BYnMoc3RvcmVMZXZlbCkgLSAxXSArIDEpOworICAgICAgICBmTW9kZSA9IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0b3JlUnVuTDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVuSW5kZXhUYWJsZUwxKTsKKyAgICAgICAgCisgICAgICAgIGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwgCisJCQkJCQkgIHN0b3JlUnVuUGx1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZNb2RlLAorCQkJCQkJICBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFZsY1RhYmxlTDEpOworCXJldHVybiBPTVhfU3RzX05vRXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKy8qIEVuZCBvZiBGaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZDAwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYwpAQCAtMCwwICsxLDg5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlIGZvciBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCisgKgorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gYmxvY2tJbmRleCAgYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQworICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBibG9ja3Mgc3BhdGlhbGx5IGNvcnJlc3BvbmRpbmcgdG8gbHVtaW5hbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbaW5dIHBRcEJ1ZiAgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyCisgKiBbb3V0XSAgICBwcmVkUVAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKyAqIFtvdXRdICAgIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICAgT01YX0lOVCAqcHJlZERpciwKKyAgICAgT01YX0lOVCAqcHJlZFFQLAorICAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZgorKQoreworICAgIE9NWF9VOCAgYmxvY2tEQ0xlZnQ7CisgICAgT01YX1U4ICBibG9ja0RDVG9wOworICAgIE9NWF9VOCAgYmxvY2tEQ1RvcExlZnQ7CisKKyAgICBpZiAoYmxvY2tJbmRleCA9PSAzKQorICAgIHsKKyAgICAgICAgYmxvY2tEQ1RvcCA9ICoocENvZWZCdWZDb2wgLSA4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmxvY2tEQ1RvcCA9ICpwQ29lZkJ1ZlJvdzsKKyAgICB9CisgICAgYmxvY2tEQ0xlZnQgPSAqcENvZWZCdWZDb2w7CisgICAgYmxvY2tEQ1RvcExlZnQgPSAqKHBDb2VmQnVmUm93IC0gOCk7CisKKyAgICBpZiAoYXJtQWJzKGJsb2NrRENMZWZ0IC0gYmxvY2tEQ1RvcExlZnQpIDwgYXJtQWJzKGJsb2NrRENUb3BMZWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBibG9ja0RDVG9wKSkKKyAgICB7CisgICAgICAgICpwcmVkRGlyID0gT01YX1ZDX1ZFUlRJQ0FMOworICAgICAgICAqcHJlZFFQID0gcFFwQnVmWzFdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcHJlZERpciA9IE9NWF9WQ19IT1JJWk9OVEFMOworICAgICAgICAqcHJlZFFQID0gcFFwQnVmWzBdOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisvKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ3YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCkBAIC0wLDAgKzEsNTggQEAKKyAvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyB0aGUgemlnemFnIHRhYmxlcworICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbNjRdID0gCit7CisgICAgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgICAgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LCAKKyAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgICAgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAorICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKKyAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF0gPSAKK3sKKyAgICAgMCwgIDEsICAyLCAgMywgIDgsICA5LCAxNiwgMTcsCisgICAgMTAsIDExLCAgNCwgIDUsICA2LCAgNywgMTUsIDE0LAorICAgIDEzLCAxMiwgMTksIDE4LCAyNCwgMjUsIDMyLCAzMywKKyAgICAyNiwgMjcsIDIwLCAyMSwgMjIsIDIzLCAyOCwgMjksCisgICAgMzAsIDMxLCAzNCwgMzUsIDQwLCA0MSwgNDgsIDQ5LAorICAgIDQyLCA0MywgMzYsIDM3LCAzOCwgMzksIDQ0LCA0NSwgCisgICAgNDYsIDQ3LCA1MCwgNTEsIDU2LCA1NywgNTgsIDU5LAorICAgIDUyLCA1MywgNTQsIDU1LCA2MCwgNjEsIDYyLCA2MworfTsKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF0gPSAKK3sKKyAgICAgMCwgIDgsIDE2LCAyNCwgIDEsICA5LCAgMiwgMTAsCisgICAgIDE3LCAyNSwgMzIsIDQwLCA0OCwgNTYsIDU3LCA0OSwKKyAgICAgNDEsIDMzLCAyNiwgMTgsICAzLCAxMSwgIDQsIDEyLAorICAgICAxOSwgMjcsIDM0LCA0MiwgNTAsIDU4LCAzNSwgNDMsCisgICAgIDUxLCA1OSwgMjAsIDI4LCAgNSwgMTMsICA2LCAxNCwKKyAgICAgMjEsIDI5LCAzNiwgNDQsIDUyLCA2MCwgMzcsIDQ1LCAKKyAgICAgNTMsIDYxLCAyMiwgMzAsICA3LCAxNSwgMjMsIDMxLAorICAgICAzOCwgNDYsIDU0LCA2MiwgMzksIDQ3LCA1NSwgNjMKK307CisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDNjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisKKyAgICAvKiBGb3IgYSBibG9ja3NpemUgb2YgMTZ4MTYgKi8KKyAgICBPTVhfVTggQmxvY2tTaXplID0gMTY7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ICAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIAorICAgIHJldHVybiAoYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFNBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplKSk7CisKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTZlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCisgKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKKyAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAorICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCisgKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisgICAgLyogRm9yIGEgYmxvY2tzaXplIG9mIDh4OCAqLworICAgIE9NWF9VOCBCbG9ja1NpemUgPSA4OworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiAgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCAgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIAorICAgIHJldHVybiAoYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlYXJjaFBvaW50UmVmUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFNBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplKSk7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxNGVmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCkBAIC0wLDAgKzEsMTE0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQorICogaXMgaW1wbGVtZW50ZWQKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYoCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQKKykKK3sKKworICAgT01YX1U4IEJsb2NrU2l6ZSA9IDE2OworICAgCisgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8gIAorICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgIAorICAgcmV0dXJuICggYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKKyAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgcmVmV2lkdGgsCisgICAgIHBSZWZSZWN0LAorICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgcFNyY1ByZU1WLAorICAgICBwU3JjUHJlU0FELAorICAgICBwTUVTcGVjLAorICAgICBwRHN0TVYsCisgICAgIHBEc3RTQUQsCisgICAgIEJsb2NrU2l6ZSkKKyAgICAgKTsKKworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3ZTY0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCisgKiBpcyBpbXBsZW1lbnRlZAorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCisgKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAorICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAorICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKKyAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCisgKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAorICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAorICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKKyAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAorICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCisgKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKKyAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAorICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKKyAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCisgKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCisgKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAorICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKKyAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICAgdm9pZCAqcE1FU3BlYywKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKKyAgICAgT01YX0lOVCAqcERzdFNBRAorKQoreworICAgT01YX1U4IEJsb2NrU2l6ZSA9IDg7CisgICAKKyAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCisgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAKKyAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCisgICAgIHBTcmNSZWZCdWYsCisgICAgIHJlZldpZHRoLAorICAgICBwUmVmUmVjdCwKKyAgICAgcFNyY0N1cnJCdWYsCisgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgIHBTcmNQcmVNViwKKyAgICAgcFNyY1ByZVNBRCwKKyAgICAgcE1FU3BlYywKKyAgICAgcERzdE1WLAorICAgICBwRHN0U0FELAorICAgICBCbG9ja1NpemUpCisgICAgICk7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3N2FjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRENUOHg4YmxrLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgOHg4IGJsb2NrIERDVAorICogCisgKi8KKyAKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKKyAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrIChjb25zdCBPTVhfUzE2ICpwU3JjLCBPTVhfUzE2ICpwRHN0KQoreworICAgIE9NWF9JTlQgeCwgeSwgdSwgdjsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisKKyAgICBmb3IgKHUgPSAwOyB1IDwgODsgdSsrKQorICAgIHsKKyAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0Y2NCBzdW0gPSAwLjA7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcFNyY1soeCAqIDgpICsgeV0gKgorICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCisgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3ldW3ZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RbKHUgKiA4KSArIHZdPSBhcm1Sb3VuZEZsb2F0VG9TMTYgKHN1bSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWY3YmFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCisgKiAKKyAqLworIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAorICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCisgKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKKyAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKKyAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAorICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBRUCA8PSAwLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfSU5UIFFQLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCisgICAgMTUgbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCisgICAgT01YX1MxNiB0ZW1wQnVmWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjE7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLworICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYpOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBEZXF1YW50aXphdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCisgICAgIHBUZW1wQnVmMSwKKyAgICAgUVApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAorICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKKyAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKKyAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCisgKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKKyAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKKyAqCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKKyAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCisgKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAorICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAorICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCisgKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKKyAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCisgKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAorICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKKyAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKKyAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCisgKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQorICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAorICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAorICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgT01YX0lOVCBzdGVwLAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9VOCBjdXJRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICAgT01YX0lOVCBpbnRyYURDVkxDLAorICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisJIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorICkKK3sKKyAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKKyAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpciwgaSwgaiwgY291bnQ7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBDb2VmQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFQQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGN1clFQIDw9IDApIHx8IChjdXJRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA1KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChzdGVwICUgOCkgIT0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorCisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7CisgICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOworICAgIAorICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLworICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgICZwcmVkRGlyLAorICAgICAgICAmcHJlZFFQLAorICAgICAgICBwUVBCdWYpOworCisgICAgcHJlZEFDRGlyID0gcHJlZERpcjsKKworICAgIGFybVJldEFyZ0VycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOworICAgIH0KKworICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLworICAgIGlmIChibG9ja0luZGV4IDw9IDMpCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7CisgICAgfQorICAgIAorCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQorICAgIHsKKyAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAorICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICAgICAgcHJlZEFDRGlyLAorICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgICAgICAgIHZpZGVvQ29tcCk7CisgICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogQUMgREMgcHJlZGljdGlvbiAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCisgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICBjdXJRUCwKKyAgICAgICAgcHJlZFFQLAorICAgICAgICBwcmVkRGlyLAorICAgICAgICBBQ1ByZWRGbGFnLAorICAgICAgICB2aWRlb0NvbXApOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIERlcXVhbnRpemF0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKKyAgICAgcFRlbXBCdWYxLAorICAgICBjdXJRUCwKKyAgICAgdmlkZW9Db21wLAorICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZworICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCisgICAgZm9yIChqID0gMCwgY291bnQgPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBwRHN0W2ldID0gYXJtQ2xpcCAoMCwgMjU1LCBwVGVtcEJ1ZjJbY291bnRdKTsKKyAgICAgICAgfQorICAgICAgICBwRHN0ICs9IHN0ZXA7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTU5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGUgZm9yIGRlY29kaW5nIE1WIGFuZCBwYWRkaW5nIHRoZSBzYW1lCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WTGVmdE1CLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKKyAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcERzdE1WQ3VyTUIsCisgICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKKyApCit7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WOworICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKKyAgICBPTVhfSU5UIGlCbGssIGksIGNvdW50ID0gMTsKKyAgICBPTVhfUzMyIG12SG9yUmVzaWR1YWwgPSAxLCBtdlZlclJlc2lkdWFsID0gMSwgbXZIb3JEYXRhLCBtdlZlckRhdGE7CisgICAgT01YX1M4IHNjYWxlRmFjdG9yLCBpbmRleDsKKyAgICBPTVhfUzE2IGhpZ2gsIGxvdywgcmFuZ2U7CisKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCisgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdE1WQ3VyTUIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBKSB8fAorICAgICAgICAoTUJUeXBlID09IE9NWF9WQ19JTlRSQV9RKQorICAgICAgICkKKyAgICB7CisgICAgICAgIC8qIEFsbCBNVidzIGFyZSB6ZXJvICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2ldLmR4ID0gMDsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2ldLmR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworICAgIH0KKworICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQorICAgIHsKKyAgICAgICAgY291bnQgPSA0OworICAgIH0KKyAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCisgICAgeworICAgICAgICBjb3VudCA9IDE7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLworICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKKyAgICBoaWdoID0gICggMzIgKiBzY2FsZUZhY3RvcikgLSAxOworICAgIGxvdyA9ICAgKCAoLTMyKSAqIHNjYWxlRmFjdG9yKTsKKyAgICByYW5nZSA9ICggNjQgKiBzY2FsZUZhY3Rvcik7CisKKyAgICAvKiBIdWZmbWFuIGRlY29kaW5nIGFuZCBNViByZWNvbnN0cnVjdGlvbiAqLworICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQorICAgIHsKKworICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIHRvIGdldCBIb3Jpem9udGFsIGRhdGEgYW5kIHJlc2lkdWFsICovCisgICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZEKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7CisKKyAgICAgICAgbXZIb3JEYXRhID0gaW5kZXggLSAzMjsKKworICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdkhvckRhdGEgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgVmVydGljYWwgZGF0YSBhbmQgcmVzaWR1YWwgKi8KKyAgICAgICAgaW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FWbGNNVkQpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoaW5kZXggPT0gLTEsIE9NWF9TdHNfRXJyKTsKKworICAgICAgICBtdlZlckRhdGEgPSBpbmRleCAtIDMyOworCisgICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKG12VmVyRGF0YSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9IChPTVhfUzMyKSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCAoZmNvZGVGb3J3YXJkIC0xKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVydGlhbCBNViAqLworICAgICAgICBpZiAoIChzY2FsZUZhY3RvciA9PSAxKSB8fCAobXZIb3JEYXRhID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZk1WLmR4ID0gbXZIb3JEYXRhOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZk1WLmR4ID0gKChhcm1BYnMobXZIb3JEYXRhKSAtIDEpICogZmNvZGVGb3J3YXJkKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgbXZIb3JSZXNpZHVhbCArIDE7CisgICAgICAgICAgICBpZiAobXZIb3JEYXRhIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZmTVYuZHggPSAtZGlmZk1WLmR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12VmVyRGF0YSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9IG12VmVyRGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZNVi5keSA9ICgoYXJtQWJzKG12VmVyRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIG12VmVyUmVzaWR1YWwgKyAxOworICAgICAgICAgICAgaWYgKG12VmVyRGF0YSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmZk1WLmR5ID0gLWRpZmZNVi5keTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIHByZWRpY3RlZCB2ZWN0b3IgKi8KKyAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgICAgICAgICAgcERzdE1WQ3VyTUIsCisgICAgICAgICAgICBwU3JjTVZMZWZ0TUIsCisgICAgICAgICAgICBwU3JjTVZVcHBlck1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLAorICAgICAgICAgICAgJnBEc3RNVkN1ck1CW2lCbGtdLAorICAgICAgICAgICAgZHN0TVZQcmVkTUUsCisgICAgICAgICAgICBpQmxrKTsKKworICAgICAgICAvKiBBZGRpbmcgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3RlZCBNViB0byByZWNvbnN0cnVjdCBNViAqLworICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSBkaWZmTVYuZHg7CisgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5ICs9IGRpZmZNVi5keTsKKworICAgICAgICAvKiBDaGVja2luZyB0aGUgcmFuZ2UgYW5kIGtlZXBpbmcgaXQgd2l0aGluIHRoZSBsaW1pdHMgKi8KKyAgICAgICAgaWYgKCBwRHN0TVZDdXJNQltpQmxrXS5keCA8IGxvdyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4ICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGlmIChwRHN0TVZDdXJNQltpQmxrXS5keCA+IGhpZ2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4IC09IHJhbmdlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBwRHN0TVZDdXJNQltpQmxrXS5keSA8IGxvdyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5ICs9IHJhbmdlOworICAgICAgICB9CisgICAgICAgIGlmIChwRHN0TVZDdXJNQltpQmxrXS5keSA+IGhpZ2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5IC09IHJhbmdlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKKyAgICB7CisgICAgICAgIHBEc3RNVkN1ck1CWzFdID0gcERzdE1WQ3VyTUJbMF07CisgICAgICAgIHBEc3RNVkN1ck1CWzJdID0gcERzdE1WQ3VyTUJbMF07CisgICAgICAgIHBEc3RNVkN1ck1CWzNdID0gcERzdE1WQ3VyTUJbMF07CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YThkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKyAqIGZvciBpbnRlciBibG9jay4KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKKyAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKKyAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcigKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIE9NWF9VOCAgbGFzdCxzdGFydCA9IDA7CisgICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBhcm1WQ000UDJfR2V0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorCQkJICBwRHN0LAorCQkJICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICBzdGFydCwKKwkJCSAgJmxhc3QsCisJCQkgIDExLAorCQkJICA0MiwKKwkJCSAgIDIsCisJCQkgICA1LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRlckwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUgKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICBpZiAobGFzdCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfRXJyOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1OTNkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKyAqIGZvciBpbnRyYSBibG9jay4KKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAorICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKKyAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAorICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAorICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKKyAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAorICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAorICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCisgKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKKyAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgT01YX1U4IHN0YXJ0ID0gMDsKKworICAgIHJldHVybiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBwcEJpdFN0cmVhbSwKKyAgICAgcEJpdE9mZnNldCwKKyAgICAgcERzdCwKKyAgICAgcHJlZERpciwKKyAgICAgc2hvcnRWaWRlb0hlYWRlciwKKyAgICAgc3RhcnQpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWUwMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworICogZm9yIGludHJhIGJsb2NrLgorICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKKworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKKyAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKKyAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAorICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAorICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKKyAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMC03XS4gCisgKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAorICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCisgKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQorICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKKyAqICAgIE9NWF9TdHNfRXJyIC0gaWY6CisgKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCisgKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKKyAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAorICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggcHJlZERpciwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKykKK3sKKyAgICAvKiBEdW1teSBpbml0aWxhaXphdGlvbiB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KKyAgICBPTVhfUzggIERDVmFsdWVTaXplID0gMDsKKyAgICBPTVhfVTE2IHBvd09mU2l6ZSwgZmV0Y2hEQ2JpdHM7CisgICAgT01YX1U4IHN0YXJ0ID0gMTsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgPiAyKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLworICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKKyAgICB7CisgICAgICAgIERDVmFsdWVTaXplID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKKyAgICB7CisgICAgICAgIERDVmFsdWVTaXplID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXgpOworICAgIH0KKyAgICBhcm1SZXREYXRhRXJySWYoRENWYWx1ZVNpemUgPT0gLTEsIE9NWF9TdHNfRXJyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoRENWYWx1ZVNpemUgPiAxMiwgT01YX1N0c19FcnIpOworCisKKyAgICBpZiAoRENWYWx1ZVNpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHBEc3RbMF0gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmZXRjaERDYml0cyA9IChPTVhfVTE2KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOworCisgICAgICAgIGlmICggKGZldGNoRENiaXRzID4+IChEQ1ZhbHVlU2l6ZSAtIDEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjYWx1bGF0ZSBwb3cgKi8KKyAgICAgICAgICAgIHBvd09mU2l6ZSA9ICgxIDw8IERDVmFsdWVTaXplKTsKKworICAgICAgICAgICAgcERzdFswXSA9ICAoT01YX1MxNikgKGZldGNoRENiaXRzIF4gKHBvd09mU2l6ZSAtIDEpKTsKKyAgICAgICAgICAgIHBEc3RbMF0gPSAtcERzdFswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEc3RbMF0gPSBmZXRjaERDYml0czsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHJlYWRpbmcgYW5kIGNoZWNraW5nIHRoZSBtYXJrZXIgYml0Ki8KKyAgICAgICAgICAgIGFybVJldERhdGFFcnJJZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkgPT0gMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0Vycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgcHJlZERpciwKKyAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlTVYuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246IAorICogQ29udGFpbnMgbW9kdWxlIGZvciBwcmVkaWN0aW5nIE1WIG9mIE1CCisgKgorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAorICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAorICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAorICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKKyAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKKyAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCisgKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKKyAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKKyAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCisgKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKKyAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNVigKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcE1WQ3VyTUIsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WTGVmdE1CLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNNVlVwcGVyTUIsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJSaWdodE1CLAorICAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKKyAgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispCit7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkLCBkaWZmTVY7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVZQcmVkTUVbMTJdOworICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgICAgT01YX0lOVCBpQmxrLCBpLCBjb3VudCA9IDE7CisgICAgT01YX1MzMiBtdkhvclJlc2lkdWFsLCBtdlZlclJlc2lkdWFsLCBtdkhvckRhdGEsIG12VmVyRGF0YTsKKyAgICBPTVhfVTggc2NhbGVGYWN0b3IsIGluZGV4OworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPiA3KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGZjb2RlRm9yd2FyZCA8IDEpIHx8IChmY29kZUZvcndhcmQgPiA3KSksIFwKKyAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRSQSkgfHwKKyAgICAgICAgKE1CVHlwZSA9PSBPTVhfVkNfSU5UUkFfUSkKKyAgICAgICApCisgICAgeworICAgICAgICAvKiBObyBjYW5kaWRhdGUgdmVjdG9ycyBoZW5jZSBtYWtlIHRoZW0gemVybyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZHN0TVZQcmVkTUVbaV0uZHggPSAwOworICAgICAgICAgICAgZHN0TVZQcmVkTUVbaV0uZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisgICAgfQorCisgICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFYpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSNFZfUSkpCisgICAgeworICAgICAgICBjb3VudCA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKKyAgICB7CisgICAgICAgIGNvdW50ID0gMTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGluZyB0aGUgc2NhbGUgZmFjdG9yICovCisgICAgc2NhbGVGYWN0b3IgPSAxIDw8IChmY29kZUZvcndhcmQgLTEpOworCisgICAgZm9yIChpQmxrID0gMDsgaUJsayA8IGNvdW50OyBpQmxrKyspCisgICAgeworCisgICAgICAgIC8qIEZpbmQgdGhlIHByZWRpY3RlZCB2ZWN0b3IgKi8KKyAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgICAgICAgICAgcE1WQ3VyTUIsCisgICAgICAgICAgICBwU3JjTVZMZWZ0TUIsCisgICAgICAgICAgICBwU3JjTVZVcHBlck1CLAorICAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLAorICAgICAgICAgICAgJmRzdE1WUHJlZCwKKyAgICAgICAgICAgIGRzdE1WUHJlZE1FLAorICAgICAgICAgICAgaUJsayApOworCisgICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbnRpYWwgbW90aW9uIHZlY3RvciAoZGlmZk1WKSAqLworICAgICAgICBkaWZmTVYuZHggPSBwTVZDdXJNQltpQmxrXS5keCAtIGRzdE1WUHJlZC5keDsKKyAgICAgICAgZGlmZk1WLmR5ID0gcE1WQ3VyTUJbaUJsa10uZHkgLSBkc3RNVlByZWQuZHk7CisKKyAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIG12X2RhdGEgYW5kIG12X3Jlc2lkdWFsIGZvciBIb3JpemFudGFsIE1WICovCisgICAgICAgIGlmIChkaWZmTVYuZHggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9IDA7CisgICAgICAgICAgICBtdkhvckRhdGEgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbXZIb3JSZXNpZHVhbCA9ICggYXJtQWJzKGRpZmZNVi5keCkgLSAxKSAlIHNjYWxlRmFjdG9yOworICAgICAgICAgICAgbXZIb3JEYXRhID0gKGFybUFicyhkaWZmTVYuZHgpIC0gbXZIb3JSZXNpZHVhbCArIChzY2FsZUZhY3RvciAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgLyBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIGlmIChkaWZmTVYuZHggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG12SG9yRGF0YSA9IC1tdkhvckRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgbXZfZGF0YSBhbmQgbXZfcmVzaWR1YWwgZm9yIFZlcnRpY2FsIE1WICovCisgICAgICAgIGlmIChkaWZmTVYuZHkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9IDA7CisgICAgICAgICAgICBtdlZlckRhdGEgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9ICggYXJtQWJzKGRpZmZNVi5keSkgLSAxKSAlIHNjYWxlRmFjdG9yOworICAgICAgICAgICAgbXZWZXJEYXRhID0gKGFybUFicyhkaWZmTVYuZHkpIC0gbXZWZXJSZXNpZHVhbCArIChzY2FsZUZhY3RvciAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgLyBzY2FsZUZhY3RvcjsKKyAgICAgICAgICAgIGlmIChkaWZmTVYuZHkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG12VmVyRGF0YSA9IC1tdlZlckRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBIdWZmbWFuIGVuY29kaW5nICovCisKKyAgICAgICAgLyogVGhlIGluZGV4IGlzIGFjdHVhbGx5IGNhbGN1bGF0ZSBhcworICAgICAgICAgICBpbmRleCA9ICgoZmxvYXQpIChtdkhvckRhdGEvMikgKyAxNikgKiAyLAorICAgICAgICAgICBtZWFuaW5nIHRoZSBNViBkYXRhIGlzIGhhbGZlZCBhbmQgdGhlbiBub3JtYWxpemVkCisgICAgICAgICAgIHRvIGJlZ2luIHdpdGggemVybyBhbmQgdGhlbiBkb3VibGVkIHRvIHRha2UgY2FyZSBvZiBpbmRleGluZworICAgICAgICAgICB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluY2x1ZGVkICovCisgICAgICAgIGluZGV4ID0gbXZIb3JEYXRhICsgMzI7CisgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGFybVZDTTRQMl9hVmxjTVZEW2luZGV4XSk7CisgICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKGRpZmZNVi5keCAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJtUGFja0JpdHMgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBtdkhvclJlc2lkdWFsLCAoZmNvZGVGb3J3YXJkIC0xKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgaW5kZXggaXMgYWN0dWFsbHkgY2FsY3VsYXRlIGFzCisgICAgICAgICAgIGluZGV4ID0gKChmbG9hdCkgKG12VmVyRGF0YS8yKSArIDE2KSAqIDIsCisgICAgICAgICAgIG1lYW5pbmcgdGhlIE1WIGRhdGEgaXMgaGFsZmVkIGFuZCB0aGVuIG5vcm1hbGl6ZWQKKyAgICAgICAgICAgdG8gYmVnaW4gd2l0aCB6ZXJvIGFuZCB0aGVuIGRvdWJsZWQgdG8gdGFrZSBjYXJlIG9mIGluZGV4aW5nCisgICAgICAgICAgIHRoZSBmcmFjdGlvbmFsIHBhcnQgaW5jbHVkZWQgKi8KKyAgICAgICAgaW5kZXggPSBtdlZlckRhdGEgKyAzMjsKKyAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FWbGNNVkRbaW5kZXhdKTsKKyAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAoZGlmZk1WLmR5ICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1QYWNrQml0cyAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIG12VmVyUmVzaWR1YWwsIChmY29kZUZvcndhcmQgLTEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM3M2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOiAKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nCisgKiBmb3IgaW50ZXIgYmxvY2suCisgKgorICovIAorIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCisgKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCisgKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlcigKKyAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwYXR0ZXJuLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICBPTVhfVTggc3RhcnQgPSAwOworICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKKworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBRRGN0QmxrQ29lZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID43KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgaWYgKHBhdHRlcm4pCisgICAgeworICAgICAgICBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAyNiwKKyAgICAgICAgICAgICAgNDAsCisgICAgICAgICAgICAgIDEwLAorICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJ1bklkeCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDAsCisJCQkgIGFybVZDTTRQMl9JbnRlckwxUnVuSWR4LAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMSwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMTUFYLAorICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMUxNQVgsCisgICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUk1BWCwKKyAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFSTUFYLAorICAgICAgICAgICAgICBwWmlnemFnVGFibGUKKyAgICAgICAgKTsKKyAgICB9IC8qIFBhdHRlcm4gY2hlY2sgZW5kcyovCisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0Nzk0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludHJhIGJsb2NrLgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCisgKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAorICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispCit7CisgICAgT01YX1U4IHN0YXJ0ID0gMDsKKworICAgIHJldHVybiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAorICAgICBwcEJpdFN0cmVhbSwKKyAgICAgcEJpdE9mZnNldCwKKyAgICAgcFFEY3RCbGtDb2VmLAorICAgICBwcmVkRGlyLAorICAgICBwYXR0ZXJuLAorICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBzdGFydCk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZworICogZm9yIGludHJhIGJsb2NrLgorICoKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKKyNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgorCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKykKK3sKKyAgICBPTVhfUzE2IGRjVmFsdWUsIHBvd09mU2l6ZTsKKyAgICBPTVhfVTggIERDVmFsdWVTaXplLCBzdGFydCA9IDE7CisgICAgT01YX1UxNiBhYnNEQ1ZhbHVlOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKwlhcm1SZXRBcmdFcnJJZigocHJlZERpciAhPSBPTVhfVkNfTk9ORSkgJiYgKHByZWREaXIgIT0gT01YX1ZDX0hPUklaT05UQUwpICYmIChwcmVkRGlyICE9IE9NWF9WQ19WRVJUSUNBTCkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgaWYgKHBhdHRlcm4pCisgICAgeworICAgICAgICBkY1ZhbHVlID0gcFFEY3RCbGtDb2VmWzBdOworICAgICAgICBhYnNEQ1ZhbHVlID0gYXJtQWJzKGRjVmFsdWUpOworCisgICAgICAgIC8qIEZpbmQgdGhlIHNpemUgKi8KKyAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1Mb2dTaXplIChhYnNEQ1ZhbHVlKTsKKyAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKKworICAgICAgICAvKiBJbnNlcnQgdGhlIGNvZGUgaW50byB0aGUgYml0c3RyZWFtICovCisgICAgICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKKyAgICAgICAgeworCisgICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbRENWYWx1ZVNpemVdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4W0RDVmFsdWVTaXplXSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBBZGRpdGlvbmFsIGNvZGUgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIG5lZ2F0aXZlCisgICAgICAgICAgIGRjIHZhbHVlIHRoZSBhZGRpdGlvbmFsICovCisgICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkY1ZhbHVlIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBjYWx1bGF0ZSAyIHBvdyAqLworICAgICAgICAgICAgICAgIHBvd09mU2l6ZSA9ICgxIDw8IERDVmFsdWVTaXplKTsKKworICAgICAgICAgICAgICAgIGFic0RDVmFsdWUgPSAgYWJzRENWYWx1ZSBeIChwb3dPZlNpemUgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilhYnNEQ1ZhbHVlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCisgICAgICAgICAgICAgICAgcHJlZERpciwKKyAgICAgICAgICAgICAgICBwYXR0ZXJuLAorICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgICAgc3RhcnQpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwY2ZmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKQEAgLTAsMCArMSwxODggQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGUgZm9yIHByZWRpY3RpbmcgTVYgb2YgTUIKKyAqCisgKi8KKyAgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCisgKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAorICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCisgKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCisgKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKKyAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAorICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKKyAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCisgKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCisgKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKKyAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAorICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCisgKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKKyAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCisgKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKKyAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKKyAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCisgKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCisgKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAorICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY01WQ3VyTUIsCisgICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMSwKKyAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYyLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwRHN0TVZQcmVkLAorICAgICBPTVhWQ01vdGlvblZlY3RvciogcERzdE1WUHJlZE1FLAorICAgICBPTVhfSU5UIGlCbGsKKyApCit7CisgICAgT01YVkNNb3Rpb25WZWN0b3IgQ2FuZE1WOworCWNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMTsKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjI7CisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYzOworICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworCWFybVJldEFyZ0VycklmKGlCbGshPTAgJiYgcFNyY01WQ3VyTUIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBEc3RNVlByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChpQmxrIDwgMCkgfHwgKGlCbGsgPiAzKSwgT01YX1N0c19CYWRBcmdFcnIpOyAKKworICAgIENhbmRNVi5keCA9IENhbmRNVi5keSA9IDA7CisJLyogQmFzZWQgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jayBleHRyYWN0IHRoZSBtb3Rpb24gdmVjdG9ycyBhbmQKKyAgICAgICB0aGUgdHJhbnBlcmFuY3kgc3RhdHVzICovCisgICAKKyAgICAKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTCAqLworICAgIHBDYW5kTVYxID0gcENhbmRNVjIgPSBwQ2FuZE1WMyA9ICZDYW5kTVY7CisKKyAgICAKKyAgICBzd2l0Y2ggKGlCbGspCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBTcmNDYW5kTVYxICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkgICAgcENhbmRNVjEgPSAmcFNyY0NhbmRNVjFbMV07CisJCQl9CisJCQlpZihwU3JjQ2FuZE1WMiAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYyID0gJnBTcmNDYW5kTVYyWzJdOworCQkJfQorCQkJaWYocFNyY0NhbmRNVjMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKwkJCQlwQ2FuZE1WMyA9ICZwU3JjQ2FuZE1WM1syXTsKKwkJCX0KKwkJCWlmICgocFNyY0NhbmRNVjEgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYyID09IE5VTEwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDYW5kTVYxID0gcENhbmRNVjIgPSBwQ2FuZE1WMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoKHBTcmNDYW5kTVYxID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMyA9PSBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2FuZE1WMSA9IHBDYW5kTVYzID0gcENhbmRNVjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKChwU3JjQ2FuZE1WMiA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjMgPT0gTlVMTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENhbmRNVjIgPSBwQ2FuZE1WMyA9IHBDYW5kTVYxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgICBwQ2FuZE1WMSA9ICZwU3JjTVZDdXJNQlswXTsKKwkJCWlmKHBTcmNDYW5kTVYyICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkJcENhbmRNVjIgPSAmcFNyY0NhbmRNVjJbM107CisJCQl9CisJCQlpZihwU3JjQ2FuZE1WMyAhPSBOVUxMKQorICAgICAgICAgICAgeworCQkJCXBDYW5kTVYzID0gJnBTcmNDYW5kTVYzWzJdOworCQkJfQorCQkJaWYoKHBTcmNDYW5kTVYyID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMyA9PSBOVUxMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2FuZE1WMiA9IHBDYW5kTVYzID0gcENhbmRNVjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBTcmNDYW5kTVYxICE9IE5VTEwpCisgICAgICAgICAgICB7CisJCQkJcENhbmRNVjEgPSAmcFNyY0NhbmRNVjFbM107CisJCQl9CisJCQlwQ2FuZE1WMiA9ICZwU3JjTVZDdXJNQlswXTsKKwkJCXBDYW5kTVYzID0gJnBTcmNNVkN1ck1CWzFdOworCQkJYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgICBwQ2FuZE1WMSA9ICZwU3JjTVZDdXJNQlsyXTsKKwkJCXBDYW5kTVYyID0gJnBTcmNNVkN1ck1CWzBdOworCQkJcENhbmRNVjMgPSAmcFNyY01WQ3VyTUJbMV07CisJCQlicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG1lZGlhbiBvZiB0aGUgMyBjYW5kaWRhdGUgTVYncyAqLworICAgIHBEc3RNVlByZWQtPmR4ID0gYXJtTWVkaWFuT2YzIChwQ2FuZE1WMS0+ZHgsIHBDYW5kTVYyLT5keCwgcENhbmRNVjMtPmR4KTsKKyAgICBwRHN0TVZQcmVkLT5keSA9IGFybU1lZGlhbk9mMyAocENhbmRNVjEtPmR5LCBwQ2FuZE1WMi0+ZHksIHBDYW5kTVYzLT5keSk7CisgICAgICAgIAorICAgIGlmIChwRHN0TVZQcmVkTUUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIHRoZXNlIGNhbiBiZSB1c2VkCisgICAgICAgICAgIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAqLworICAgICAgICBwRHN0TVZQcmVkTUVbMF0uZHggPSBwQ2FuZE1WMS0+ZHg7CisgICAgICAgIHBEc3RNVlByZWRNRVswXS5keSA9IHBDYW5kTVYxLT5keTsKKyAgICAgICAgcERzdE1WUHJlZE1FWzFdLmR4ID0gcENhbmRNVjItPmR4OworICAgICAgICBwRHN0TVZQcmVkTUVbMV0uZHkgPSBwQ2FuZE1WMi0+ZHk7CisgICAgICAgIHBEc3RNVlByZWRNRVsyXS5keCA9IHBDYW5kTVYzLT5keDsKKyAgICAgICAgcERzdE1WUHJlZE1FWzJdLmR5ID0gcENhbmRNVjMtPmR5OworICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg2ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfSURDVDh4OGJsay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIDh4OCBibG9jayBJRENUCisgKiAKKyAqLworCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDTTRQMl9EQ1RfVGFibGUuaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKKyAqIFtJU08xNDQ5Ni0yXS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCisgKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoY29uc3QgT01YX1MxNiAqcFNyYywgT01YX1MxNiAqcERzdCkKK3sKKyAgICBPTVhfSU5UIHgsIHksIHUsIHY7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9GNjQgc3VtID0gMC4wOworICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IDg7IHUrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgODsgdisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBTcmNbKHUgKiA4KSArIHZdICoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3hdW3VdICoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3ldW3ZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBEc3RbKHggKiA4KSArIHldID0gKE9NWF9TMTYpIGZsb29yKHN1bSArIDAuNSk7CisKKyAgICAgICAgICAgIC8qIFNhdHVyYXRlIHRvIFstMjU2LCAyNTVdICovCisgICAgICAgICAgICBwRHN0Wyh4ICogOCkgKyB5XSA9IGFybUNsaXAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RbKHggKiA4KSArIHldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzZmFlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9jay5jCkBAIC0wLDAgKzEsMzU3IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9jay5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogTVBFRzQgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCisgKiBpbnRlcnBvbGF0aW9uCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyB2ZXJ0aWNhbCAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIElTTy9JRUMgMTQ0OTYtMiwgc3ViY2xhdXNlIDcuNi4yLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KKyAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKKyAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICBvZiA4LgorICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7CisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlcigKKyAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCisgICAgICBPTVhfVTggKnBEc3QsCisgICAgICBPTVhfSU5UIHJuZFZhbCkKK3sKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOworICBPTVhfSU5UIHksIHg7CisgIAorICBwVGVtcFNyYzEgPSBwU3JjOyAgCisgIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOworICBzcmNTdGVwIC09IDg7CisgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCisgIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgIHsKKyAgICAgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKykgKyAxIC0gcm5kVmFsKSA+PiAxOworICAgIH0KKyAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKKyAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKKyAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbEhvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGhvcml6b250YWwgCisgKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCisgKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKKyAqICAgICAgICAgICAgICAgICAgb2YgOC4KKyAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCisgKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOworICoKKyAqLworc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxIb3IoCisgICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgICBPTVhfSU5UIHNyY1N0ZXAsIAorICAgICAgT01YX1U4ICpwRHN0LAorICAgICAgT01YX0lOVCBybmRWYWwpCit7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKKyAgT01YX0lOVCB5LCB4OworICAKKyAgcFRlbXBTcmMxID0gcFNyYzsKKyAgcFRlbXBTcmMyID0gcFRlbXBTcmMxICsgMTsKKworICBzcmNTdGVwIC09IDg7CisgIGZvciAoeT0wOyB5PDg7IHkrKykKKyAgeworICAgIGZvciAoeD0wOyB4PDg7IHgrKykKKyAgICB7CisgICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKKyAgICB9CisgICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7CisgICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7CisgIH0KK30KKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfSGFsZlBlbFZlckhvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaGFsZiBwZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIGJvdGggCisgKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsCisgKiBzdWJjbGF1c2UgNy42LjIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcworICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCisgKiAgICAgICAgICAgICAgICAgIG9mIDguCisgKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgorICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgICAgT01YX0lOVCBzcmNTdGVwLCAKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgcm5kVmFsKQoreworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKKyAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7CisgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMzOworICBjb25zdCBPTVhfVTggKnBUZW1wU3JjNDsKKyAgT01YX0lOVCB5LCB4OworCisgIHBUZW1wU3JjMSA9IHBTcmM7CisgIHBUZW1wU3JjMiA9IHBTcmMgKyBzcmNTdGVwOworICBwVGVtcFNyYzMgPSBwU3JjICsgMTsKKyAgcFRlbXBTcmM0ID0gcFNyYyArIHNyY1N0ZXAgKyAxOworCisgIHNyY1N0ZXAgLT0gODsKKyAgZm9yICh5PTA7IHk8ODsgeSsrKQorICB7CisgICAgZm9yICh4PTA7IHg8ODsgeCsrKQorCXsKKwkgICpwRHN0KysgPSAoKCpwVGVtcFNyYzErKyArICpwVGVtcFNyYzIrKyArICpwVGVtcFNyYzMrKyArICpwVGVtcFNyYzQrKykgKyAKKwkgICAgICAgICAgICAgICAgICAyIC0gcm5kVmFsKSA+PiAyOworCX0KKyAgICBwVGVtcFNyYzEgKz0gc3JjU3RlcDsKKyAgICBwVGVtcFNyYzIgKz0gc3JjU3RlcDsKKyAgICBwVGVtcFNyYzMgKz0gc3JjU3RlcDsKKyAgICBwVGVtcFNyYzQgKz0gc3JjU3RlcDsKKyAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBEbyBtb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBjb3B5IHRoZSByZXN1bHQgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgorICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcworICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCisgKiAgICAgICAgICAgICAgICAgIG9mIDguCisgKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQorICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgorICogW2luXSBwcmVkaWN0VHlwZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMS4yLgorICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KKyAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKKyAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCisgKgorICovCitzdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKKyAgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgIE9NWF9VOCAqcERzdCwKKyAgICAgIE9NWF9JTlQgZHN0U3RlcCkKK3sKKyAgICBPTVhfVTggeCx5LGNvdW50LGluZGV4OworICAgIAorICAgIC8qIENvcHlpbmcgdGhlIHJlZiA4eDggYmxrIHRvIHRoZSBjdXJyIGJsayAqLworICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgODsgeSsrLGluZGV4ICs9IChzcmNTdGVwIC04KSwgY291bnQgKz0gKGRzdFN0ZXAgLSA4KSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyssaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW2luZGV4XTsKKyAgICAgICAgfSAgICAgICAKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWNvbnN0cnVjdHMgSU5URVIgYmxvY2sgYnkgc3VtbWluZyB0aGUgbW90aW9uIGNvbXBlbnNhdGlvbiByZXN1bHRzCisgKiBhbmQgdGhlIHJlc3VsdHMgb2YgdGhlIGludmVyc2UgdHJhbnNmb3JtYXRpb24gKHByZWRpY3Rpb24gcmVzaWR1YWxzKS4KKyAqIE91dHB1dCBpbnRlbnNpdGllcyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dIHBTcmNSZXNpZHVlIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgcmVzaWR1YWxzLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLHRoZW4gbm8gcHJlZGljdGlvbgorICogICAgICAgICAgICAgICAgICBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uCisgKiBbaW5dIGRzdFN0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZQorICogICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LgorICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiAgICAgICAgICAgICAgICAgIElmIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcworICogICAgICAgICAgICAgICAgICBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4KKyAqCisgKi8KK3N0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKAorICAgICAgY29uc3QgT01YX1U4ICpwU3JjLCAKKyAgICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgICAgT01YX1U4ICpwRHN0LAorICAgICAgT01YX0lOVCBkc3RTdGVwKQoreworICAgICAgCisgIE9NWF9VOCB4LHk7CisgIE9NWF9JTlQgdGVtcDsKKyAgCisgIGZvcih5ID0gMDsgeSA8IDg7IHkrKykKKyAgeworICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKykKKyAgICB7CisgICAgICB0ZW1wID0gcFNyY1t4XSArIHBTcmNSZXNpZHVlW3hdOyAgICAgICAgIAorICAgICAgcERzdFt4XSA9IGFybUNsaXAoMCwyNTUsdGVtcCk7CisgICAgfQorICAgIHBEc3QgKz0gZHN0U3RlcDsKKyAgICBwU3JjICs9IDg7CisgICAgcFNyY1Jlc2lkdWUgKz0gODsKKyAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKAorCQljb25zdCBPTVhfVTggKnBTcmMsCisJCU9NWF9JTlQgc3JjU3RlcCwKKwkJY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCisJCU9NWF9VOCAqcERzdCwgCisJCU9NWF9JTlQgZHN0U3RlcCwKKwkJT01YX0lOVCBwcmVkaWN0VHlwZSwKKwkJT01YX0lOVCBybmRWYWwpCit7CisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgT01YX1U4IHBUZW1wRHN0WzY0XTsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNSZXNpZHVlKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoZHN0U3RlcCAlIDgpIHx8IChzcmNTdGVwICUgOCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSU5URUdFUl9QSVhFTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1gpICYmCisgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9ZKSAmJgorICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWFkpCisgICAgICAgICAgICAgICAgICAgKSxPTVhfU3RzX0JhZEFyZ0Vycik7IAorICAgIGFybVJldEFyZ0VycklmKCgocm5kVmFsICE9IDApICYmIChybmRWYWwgIT0gMSkpLE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICBzd2l0Y2gocHJlZGljdFR5cGUpCisgICAgeworICAgICAgICBjYXNlIE9NWF9WQ19JTlRFR0VSX1BJWEVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxIb3IocFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVyKHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9YWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IocFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICBpZihwU3JjUmVzaWR1ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfTm9SZXMoJihwVGVtcERzdFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGFybVZDTTRQMl9NQ1JlY29uQmxvY2tfUmVzKCYocFRlbXBEc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1Jlc2lkdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCk7ICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUdldEJ1ZlNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU1MWRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKQEAgLTAsMCArMSw3MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKKyAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmUgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCisgKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCisgKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCisgKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKKyAgICBPTVhfVTMyICpwU2l6ZQorICAgKQoreworICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighcFNpemUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYKKyAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAqcFNpemUgPSAoT01YX0lOVCkgc2l6ZW9mKEFSTVZDTTRQMl9NRVNwZWMpOworCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWU3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwpAQCAtMCwwICsxLDg0IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01FSW5pdC5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemF0aW9uIG1vZHVsZXMgZm9yIHRoZSB2ZW5kb3Igc3BlY2lmaWMgTW90aW9uIEVzdGltYXRpb24gc3RydWN0dXJlLgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybVZDLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0KAorICAgIE9NWFZDTTRQMk1FTW9kZSBNRU1vZGUsIAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsIAorICAgIHZvaWQgKnBNRVNwZWMKKyAgICkKK3sKKyAgICBBUk1WQ000UDJfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAyX01FU3BlYyAqKSBwTUVTcGVjOworICAgIAorICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighcE1FU3BlYywgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChNRU1vZGUgIT0gT01YX1ZDX000UDJfRkFTVF9TRUFSQ0gpICYmIAorICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDJfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocE1FUGFyYW1zLT5zZWFyY2hSYW5nZSA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hFbmFibGU4eDggICAgID0gcE1FUGFyYW1zLT5zZWFyY2hFbmFibGU4eDg7CisgICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5oYWxmUGVsU2VhcmNoRW5hYmxlID0gcE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlOworICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UgICAgICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U7ICAgICAgICAKKyAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnJuZFZhbCAgICAgICAgICAgICAgPSBwTUVQYXJhbXMtPnJuZFZhbDsKKyAgICBhcm1NRVNwZWMtPk1FTW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSBNRU1vZGU7CisgICAgCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDkwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwpAQCAtMCwwICsxLDYzMCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGUgZm9yIG1vdGlvbiBzZWFyY2ggMTZ4MTYgbWFjcm9ibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfMTZ4MTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIDE2eDE2IGJsb2NrIG1hdGNoIHdyYXBwZXIgZnVuY3Rpb24sIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuCisgKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KKyAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKgorICovCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIGNvbnN0IE9NWF9JTlQgc3JjUmVmU3RlcCwKKyAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgIE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgIHZvaWQgKnBNRVNwZWMsCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgIE9NWF9JTlQgKnBEc3RTQUQKKykKK3sKKyAgICBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKKyAgICBPTVhfSU5UIHJuZFZhbDsKKyAgICAKKyAgICBybmRWYWwgPSBwTUVQYXJhbXMtPnJuZFZhbDsKKyAgICAKKyAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAorICAgICAgICBwU3JjUmVmQnVmLAorICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgcFNyY0N1cnJCdWYsCisgICAgICAgIHBDdXJyUG9pbnRQb3MsCisgICAgICAgIHBTcmNQcmVNViwKKyAgICAgICAgcFNyY1ByZVNBRCwKKyAgICAgICAgcE1FUGFyYW1zLAorICAgICAgICBwRHN0TVYsCisgICAgICAgIHBEc3RTQUQpOworICAgIAorICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCisgICAgeworICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2KAorICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLAorICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgIHJuZFZhbCwKKyAgICAgICAgICAgIHBEc3RNViwKKyAgICAgICAgICAgIHBEc3RTQUQpOworICAgIH0KKyAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIDh4OCBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC4KKyAqIElmIGhhbGYgcGVsIHNlYXJjaCBpcyBlbmFibGVkIGl0IGFsc28gY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJICBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgcGxhbmUuCisgKiBbaW5dCXNyY1JlZlN0ZXAJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CSAgcG9pbnRlciB0byB0aGUgdmFsaWQgcmVjdGFuZ3VsYXIgaW4gcmVmZXJlbmNlIHBsYW5lLiBSZWxhdGl2ZSB0byBpbWFnZSBvcmlnaW4uCisgKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlcgorICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSAtNAorICogW2luXQlwU3JjQ3VyckJ1ZgkgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LAorICogICAgICAgICAgICAgICAgICAgIDI1NiBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJICBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyBwcmVkaWN0ZWQgTVYKKyAqIFtpbl0gcFNyY1ByZVNBRAkgIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4KKyAqIFtpbl0gcE1FU3BlYwkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZAorICogICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqIFtvdXRdIHBEc3RNVgkgICAgICBwb2ludGVyIHRvIGVzdGltYXRlZCBNVgorICogW291dF0gcERzdFNBRAkgIHBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKgorICovCitzdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCgKKyAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgICBPTVhfSU5UIHNyY1JlZlN0ZXAsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FECispCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7CisgICAgT01YX0lOVCBybmRWYWw7CisgICAgCisgICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7CisgICAgCisgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDgoCisgICAgICAgIHBTcmNSZWZCdWYsCisgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgIHBSZWZSZWN0LAorICAgICAgICBwU3JjQ3VyckJ1ZiwKKyAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgcFNyY1ByZU1WLAorICAgICAgICBwU3JjUHJlU0FELAorICAgICAgICBwTUVQYXJhbXMsCisgICAgICAgIHBTcmNEc3RNViwKKyAgICAgICAgcERzdFNBRCk7CisgICAgCisgICAgaWYgKHBNRVBhcmFtcy0+aGFsZlBlbFNlYXJjaEVuYWJsZSkKKyAgICB7CisgICAgICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4KAorICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKKyAgICAgICAgICAgIHNyY1JlZlN0ZXAsCisgICAgICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgICAgIHBTcmNDdXJyQnVmLAorICAgICAgICAgICAgcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgIHJuZFZhbCwKKyAgICAgICAgICAgIHBTcmNEc3RNViwKKyAgICAgICAgICAgIHBEc3RTQUQpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsgICAgICAgIAorfQorCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCisgICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIHZvaWQgKnBNRVNwZWMsCisgICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAorICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKKyAgICBPTVhfVTE2ICpwRHN0U0FELAorICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAorKQoreworIAorICAgIE9NWF9JTlQgaW50cmFTQUQsIGF2ZXJhZ2UsIGNvdW50LCBpbmRleCwgeCwgeTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVjE2eDE2OworICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDE2eDE2OworICAgIE9NWF9JTlQgICAgICAgICAgIGRzdFNBRDh4ODsKKyAgICBPTVhWQ000UDJNRVBhcmFtcyAgKnBNRVBhcmFtczsgCisJT01YVkNNNFAyQ29vcmRpbmF0ZSBUZW1wQ3VyclBvaW50UG9zOyAKKyAgICBPTVhWQ000UDJDb29yZGluYXRlICpwVGVtcEN1cnJQb2ludFBvczsgCisgICAgT01YX1U4IGFUZW1wU3JjQ3VyckJ1ZlsyNzFdOworICAgIE9NWF9VOCAqcFRlbXBTcmNDdXJyQnVmOworICAgIE9NWF9VOCAqcERzdDsKKyAgICBPTVhfVTggYURzdFs3MV07CisgICAgT01YX1MzMiBkc3RTdGVwID0gODsKKyAgICBPTVhfSU5UIHByZWRpY3RUeXBlOworCU9NWF9TMzIgU2FkOworICAgIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmNSZWZCdWY7CisgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYxWzRdOworICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMls0XTsKKyAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjNbNF07CisgICAgICAgIAorICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCgoc3JjQ3VyclN0ZXAgJSAxNikgfHwgKHNyY1JlZlN0ZXAgJSAxNikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisJYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdE1CQ3VyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgCisgICAgcFRlbXBDdXJyUG9pbnRQb3MgPSAmKFRlbXBDdXJyUG9pbnRQb3MpOworICAgIHBUZW1wU3JjQ3VyckJ1ZiA9IGFybUFsaWduVG8xNkJ5dGVzKGFUZW1wU3JjQ3VyckJ1Zik7CisgICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMk1FUGFyYW1zICopcE1FU3BlYzsKKyAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCA9IHBDdXJyUG9pbnRQb3MtPng7CisgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgPSBwQ3VyclBvaW50UG9zLT55OworICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjsKKyAgICAKKyAgICAvKiBQcmVwYXJpbmcgYSBsaW5lYXIgYnVmZmVyIGZvciBibG9jayBtYXRjaCAqLworICAgIGZvciAoeSA9IDAsIGluZGV4ID0gY291bnQgPSAwOyB5IDwgMTY7IHkrKywgaW5kZXggKz0gc3JjQ3VyclN0ZXAgLSAxNikKKyAgICB7CisgICAgICAgIGZvcih4ID0gMDsgeCA8IDE2OyB4KyssIGNvdW50KyssIGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF0gPSBwU3JjQ3VyckJ1ZltpbmRleF07CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yKHkgPSAwLCBpbmRleCA9IDA7IHkgPCAyOyB5KyspCisgICAgeworICAgICAgICBmb3IoeCA9IDA7IHggPCAyOyB4KyssaW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoKHBNQkluZm9bMF0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMF0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gJihwTUJJbmZvWzBdLT5wTVYwW3ldW3hdKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVtpbmRleF0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoKHBNQkluZm9bMV0gIT0gTlVMTCkgJiYgKHBNQkluZm9bMV0tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbaW5kZXhdID0gJihwTUJJbmZvWzFdLT5wTVYwW3ldW3hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9IE5VTEw7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoKHBNQkluZm9bM10gIT0gTlVMTCkgJiYgKHBNQkluZm9bM10tPm1iVHlwZSAhPSBPTVhfVkNfSU5UUkEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbaW5kZXhdID0gJihwTUJJbmZvWzNdLT5wTVYwW3ldW3hdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9IE5VTEw7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCS8qIENhbGN1bGF0aW5nIFNBRCBhdCBNVigwLDApICovCisJYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCisJCQkJCSAgMTYsCisJCQkJCSAgcFNyY1JlZkJ1ZiwKKwkJCQkJICBzcmNSZWZTdGVwLAorCQkJCQkgICZTYWQsCisJCQkJCSAgMTYsCisJCQkJCSAgMTYpOworCSpwRHN0U0FEID0gU2FkOworCisgICAgLyogTW9kZSBkZWNpc2lvbiBmb3IgTk9UX0NPREVEIE1CICovCisJaWYoKnBEc3RTQUQgPT0gMCkKKwl7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOworICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKKyAgICAgICAgKnBEc3RTQUQgICA9IDA7CisJCXJldHVybiBPTVhfU3RzX05vRXJyOworCX0KKworICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVswXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMF0sCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzBdLAorICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgLyogSW50ZXIgMSBNViAqLworICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2KAorICAgICAgICBwU3JjUmVmQnVmLAorICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICBwUmVmUmVjdCwKKyAgICAgICAgcFRlbXBTcmNDdXJyQnVmLAorICAgICAgICBwQ3VyclBvaW50UG9zLAorICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMF0pLAorICAgICAgICBOVUxMLAorICAgICAgICBwTUVQYXJhbXMsCisgICAgICAgICZkc3RNVjE2eDE2LAorICAgICAgICAmZHN0U0FEMTZ4MTYpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgYWxsIHdpdGggMSBNViB2YWx1ZXMgKi8KKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ID0gZHN0TVYxNngxNi5keDsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ID0gZHN0TVYxNngxNi5keTsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR4ID0gZHN0TVYxNngxNi5keDsKKyAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ID0gZHN0TVYxNngxNi5keTsgCisgICAgCisgICAgKnBEc3RTQUQgICA9IGRzdFNBRDE2eDE2OyAgICAgICAKKyAgICAKKyAgICBpZiAocE1FUGFyYW1zLT5zZWFyY2hFbmFibGU4eDgpCisgICAgeworICAgICAgICAvKiBJbnRlciA0TVYgKi8KKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgPSBkc3RTQUQ4eDg7CisgICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7CisgICAgICAgIHBTcmNSZWZCdWYgKz0gODsKKyAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXSksCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzFdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsxXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMV0sCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAKKyAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzFdKSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IGRzdFNBRDh4ODsKKyAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCAtPSA4OworICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eSArPSA4OworICAgICAgICBwU3JjUmVmQnVmICs9IChzcmNSZWZTdGVwICogOCkgLSA4OworICAgICAgICAKKyAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzJdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlsyXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbMl0sCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVswXSksCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIDIpOworICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gZHN0U0FEOHg4OworICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7CisgICAgICAgIHBUZW1wQ3VyclBvaW50UG9zLT54ICs9IDg7CisgICAgICAgIHBTcmNSZWZCdWYgKz0gODsKKyAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQoCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCisgICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxWzNdLAorICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMlszXSwKKyAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjNbM10sCisgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFsxXVsxXSksCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIDMpOworICAgICAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDggKHBTcmNSZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsIHBSZWZSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWYsIHBUZW1wQ3VyclBvaW50UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMsICYocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTQUQ4eDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcERzdEJsb2NrU0FEWzNdID0gZHN0U0FEOHg4OworICAgICAgICAqcERzdFNBRCArPSBkc3RTQUQ4eDg7ICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyogQ2hlY2tpbmcgaWYgNE1WIGlzIGVxdWFsIHRvIDFNViAqLworICAgICAgICBpZiAoCisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKKyAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8CisgICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAorICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkKKyAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZWxlY3QgdGhlIDQgTVYgKi8KKyAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRFUjRWOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIC8qIGZpbmRpbmcgdGhlIGVycm9yIGluIGludHJhIG1vZGUgKi8KKyAgICBmb3IgKGNvdW50ID0gMCwgYXZlcmFnZSA9IDA7IGNvdW50IDwgMjU2IDsgY291bnQrKykKKyAgICB7CisgICAgICAgIGF2ZXJhZ2UgPSBhdmVyYWdlICsgcFRlbXBTcmNDdXJyQnVmW2NvdW50XTsKKyAgICB9CisgICAgYXZlcmFnZSA9IGF2ZXJhZ2UvMjU2OworICAgIAorCWludHJhU0FEID0gMDsKKworICAgIC8qIEludHJhIFNBRCBjYWxjdWxhdGlvbiAqLworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCisgICAgeworICAgICAgICBpbnRyYVNBRCArPSBhcm1BYnMgKChwVGVtcFNyY0N1cnJCdWZbY291bnRdKSAtIChhdmVyYWdlKSk7CisgICAgfQorICAgIAorCS8qIFVzaW5nIHRoZSBNUEVHNCBWTSBmb3JtdWxhIGZvciBpbnRyYS9pbnRlciBtb2RlIGRlY2lzaW9uIAorCSAgIFZhciA8IChTQUQgLSAyKk5CKSB3aGVyZSBOQiA9IE5eMiBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscworCSAgIG9mIHRoZSBtYWNyb2Jsb2NrLiovCisKKyAgICBpZiAoaW50cmFTQUQgPD0gKCpwRHN0U0FEIC0gNTEyKSkKKyAgICB7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19JTlRSQTsKKyAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IDA7CisgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHkgPSAwOworICAgICAgICAqcERzdFNBRCAgID0gaW50cmFTQUQ7CisgICAgICAgIHBEc3RCbG9ja1NBRFswXSA9IDB4RkZGRjsKKyAgICAgICAgcERzdEJsb2NrU0FEWzFdID0gMHhGRkZGOworICAgICAgICBwRHN0QmxvY2tTQURbMl0gPSAweEZGRkY7CisgICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IDB4RkZGRjsKKyAgICB9CisKKyAgICBpZihwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPT0gT01YX1ZDX0lOVEVSKQorICAgIHsKKyAgICAgIHBUZW1wU3JjUmVmQnVmID0gcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwICogZHN0TVYxNngxNi5keSkgKyBkc3RNVjE2eDE2LmR4OworICAgIAorICAgICAgaWYoKGRzdE1WMTZ4MTYuZHggJiAweDEpICYmIChkc3RNVjE2eDE2LmR5ICYgMHgxKSkKKyAgICAgIHsKKyAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YWTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keCAmIDB4MSkKKyAgICAgIHsKKyAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9YOworICAgICAgfQorICAgICAgZWxzZSBpZihkc3RNVjE2eDE2LmR5ICYgMHgxKQorICAgICAgeworICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19IQUxGX1BJWEVMX1k7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0lOVEVHRVJfUElYRUw7CisgICAgICB9CisgICAgICAKKyAgICAgIHBEc3QgPSBhcm1BbGlnblRvOEJ5dGVzKCYoYURzdFswXSkpOworICAgICAgLyogQ2FsY3VsYXRpbmcgQmxvY2sgU0FEIGF0IE1WKGRzdE1WMTZ4MTYuZHgsZHN0TVYxNngxNi5keSkgKi8KKwkgIC8qIEJsb2NrIDAgKi8KKyAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOworICAgIAorICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICA4KTsKKyAgICAgIHBEc3RCbG9ja1NBRFswXSA9IFNhZDsKKyAgIAorICAgICAgLyogQmxvY2sgMSAqLworICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOwkJCQkJICAKKworICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICBwRHN0QmxvY2tTQURbMV0gPSBTYWQ7CisJCisgICAgICAvKiBCbG9jayAyICovCisgICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLT5ybmRWYWwpOworCisgICAgICBhcm1WQ0NPTU1fU0FEKHBUZW1wU3JjQ3VyckJ1ZiArICgxNio4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgpOworICAgICAgcERzdEJsb2NrU0FEWzJdID0gU2FkOworCisJICAvKiBCbG9jayAzICovCisgICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmICsgKHNyY1JlZlN0ZXAqOCkgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKKworICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCkgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCisgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgOCk7CisgICAgICBwRHN0QmxvY2tTQURbM10gPSBTYWQ7CisgICAgfQorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTNmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwpAQCAtMCwwICsxLDEyMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX1MxNi5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgbW9kdWxlcyBmb3IgQUMgREMgcHJlZGljdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCisgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKKyAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKKyAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAorICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAorICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAorICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCisgKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCisgKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKKyAqICAgICAgICAtICAgIGN1clFQID4zMSwgCisgKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCisgKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQorICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCisgICAgIE9NWF9JTlQgY3VyUVAsCisgICAgIE9NWF9JTlQgcHJlZFFQLAorICAgICBPTVhfSU5UIHByZWREaXIsCisgICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCisgKQoreworICAgIE9NWF9VOCBmbGFnOworICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLworICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA+IDMxLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gMSkgJiYgKHByZWREaXIgIT0gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZSb3cpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmQ29sKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZmxhZyA9IDA7CisgICAgcmV0dXJuIGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgICAgcFNyY0RzdCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgcFByZWRCdWZSb3csCisgICAgICAgIHBQcmVkQnVmQ29sLAorICAgICAgICBjdXJRUCwKKyAgICAgICAgcHJlZFFQLAorICAgICAgICBwcmVkRGlyLAorICAgICAgICBBQ1ByZWRGbGFnLAorICAgICAgICB2aWRlb0NvbXAsCisgICAgICAgIGZsYWcsCisgICAgICAgIE5VTEwpOworCit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgUXVhbnRpemF0aW9uCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKKyAqIGJpdHNfcGVyX3BpeGVsID09IDguIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKKyAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAorICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX1U4IFFQLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKworICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLworICAgIE9NWF9JTlQgY29lZmZDb3VudDsKKyAgICBPTVhfSU5UIGZTaWduOworICAgIE9NWF9JTlQgbWF4Q2xwQUMgPSAwLCBtaW5DbHBBQyA9IDA7CisgICAgT01YX0lOVCBtYXhDbHBEQyA9IDAsIG1pbkNscERDID0gMDsKKyAgICAKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAvKiBPbmUgYXJndW1lbnQgY2hlY2sgaXMgZGVsYXllZCB1bnRpbCB3ZSBoYXZlIGFzY2VydGFpbmVkIHRoYXQgICovCisgICAvKiBwUU1hdHJpeCBpcyBub3QgTlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgCisgICAgLyogU2V0IHRoZSBDbGlwIFJhbmdlIGJhc2VkIG9uIFNWSCBvbi9vZmYgKi8KKyAgICBpZihzaG9ydFZpZGVvSGVhZGVyID09IDEpCisgICAgeworICAgICAgIG1heENscERDID0gMjU0OworICAgICAgIG1pbkNscERDID0gMTsKKyAgICAgICBtYXhDbHBBQyA9IDEyNzsKKyAgICAgICBtaW5DbHBBQyA9IC0xMjc7ICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWF4Q2xwREMgPSAyMDQ3OworICAgICAgICBtaW5DbHBEQyA9IC0yMDQ3OworICAgICAgICBtYXhDbHBBQyA9IDIwNDc7CisgICAgICAgIG1pbkNscEFDID0gLTIwNDc7ICAgCisgICAgfQorICAgICAgICAgICAgICAgIAorICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIGZTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IChhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChRUC8yKSkvKDIgKiBRUCk7CisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247CisgICAgICAgIAorICAgICAgICAvKiBDbGlwICovCisgICAgICAgIGlmIChjb2VmZkNvdW50ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9CisgICAgICAgICAgIChPTVhfUzE2KSBhcm1DbGlwIChtaW5DbHBEQywgbWF4Q2xwREMsIHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KKyAgICAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGRhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludHJhX0kuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSBRdWFudGl6YXRpb24KKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNi4xLjMuOC4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0koCisgICAgIE9NWF9TMTYgKiBwU3JjRHN0LAorICAgICBPTVhfVTggUVAsCisgICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKwkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCisgKQoreworCisgICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIGVycm9yICovCisgICAgT01YX0lOVCBkY1NjYWxlciA9IDAsIGNvZWZmQ291bnQsZlNpZ247CisgICAgT01YX0lOVCBtYXhDbHBBQywgbWluQ2xwQUM7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZigoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+PSAxMCkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgLyogT25lIGFyZ3VtZW50IGNoZWNrIGlzIGRlbGF5ZWQgdW50aWwgd2UgaGF2ZSBhc2NlcnRhaW5lZCB0aGF0ICAqLworICAgLyogcFFNYXRyaXggaXMgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgCisgICAgLyogU2V0IHRoZSBDbGlwIFJhbmdlIGJhc2VkIG9uIFNWSCBvbi9vZmYgKi8KKyAgICBpZihzaG9ydFZpZGVvSGVhZGVyID09IDEpCisgICAgeworICAgICAgICBtYXhDbHBBQyA9IDEyNzsKKyAgICAgICAgbWluQ2xwQUMgPSAtMTI3OworICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLworICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7CisgICAgCisgICAgICAgIC8qIENsaXAgYmV0d2VlbiAxIGFuZCAyNTQgKi8KKyAgICAgICAgcFNyY0RzdFswXSA9IChPTVhfUzE2KSBhcm1DbGlwICgxLCAyNTQsIHBTcmNEc3RbMF0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtYXhDbHBBQyA9IDIwNDc7CisgICAgICAgIG1pbkNscEFDID0gLTIwNDc7ICAgCisgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgREMgc2NhbGVyIHZhbHVlICovCisgICAgICAgIGlmICgoYmxvY2tJbmRleCAgPCA0KSB8fCAoYmxvY2tJbmRleCAgPiA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAyICogUVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA5ICYmIFFQIDw9IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgKyA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKDIgKiBRUCkgLSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChibG9ja0luZGV4IDwgNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFFQID49IDEgJiYgUVAgPD0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChRUCA+PSA1ICYmIFFQIDw9IDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gKFFQICsgMTMpLzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSBRUCAtIDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIERlcXVhbnQgdGhlIERDIHZhbHVlLCB0aGlzIGFwcGxpZXMgdG8gYm90aCB0aGUgbWV0aG9kcyAqLworICAgICAgICBwU3JjRHN0WzBdID0gYXJtSW50RGl2QXdheUZyb21aZXJvIChwU3JjRHN0WzBdLCBkY1NjYWxlcik7CisgICAgfQorICAgIAorICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KKyAgICBmb3IgKGNvZWZmQ291bnQgPSAxOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKKyAgICB7CisgICAgICAgIGZTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKS8oMiAqIFFQKTsKKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBmU2lnbjsKKworICAgICAgICAvKiBDbGlwICovCisgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQorICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwQUMsIG1heENscEFDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7CisKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGRlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwpAQCAtMCwwICsxLDk2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIGludmVyc2UgUXVhbnRpemF0aW9uCisgKiAKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX0lOVCBRUAorCSApCit7CisKKyAgICBPTVhfSU5UIGNvZWZmQ291bnQsIFNpZ247CisgICAgCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLworICAgIGZvciAoY29lZmZDb3VudCA9IDA7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgc2lnbiAqLworICAgICAgICBTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7CisgICAgICAgICAgICAgIAorICAgICAgICAvKiBRdWFudGl6ZSB0aGUgY29lZmYgKi8KKyAgICAgICAgaWYgKFFQICYgMHgxKQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpICogUVA7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKDIqIGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBRUCAtIDE7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKyAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ2ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgaW52ZXJzZSBRdWFudGl6YXRpb24KKyAqIAorICovIAorCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCisgKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKKyAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKKyAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAorICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAorICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKKyAqICAgICAgICAgICAgICB0cnVlOiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCisgKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBPTVhfUzE2ICogcFNyY0RzdCwKKyAgICAgT01YX0lOVCBRUCwKKyAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKworICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLworICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LCBTaWduOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCWFybVJldEFyZ0VycklmKCgodmlkZW9Db21wICE9IE9NWF9WQ19MVU1JTkFOQ0UpICYmICh2aWRlb0NvbXAgIT0gT01YX1ZDX0NIUk9NSU5BTkNFKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICAKKyAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLworICAgIAorICAgIC8qIGxpbmVhciBpbnRyYSBEQyBtb2RlICovCisgICAgaWYoc2hvcnRWaWRlb0hlYWRlcikKKyAgICB7CisgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICB9CisgICAgLyogbm9ubGluZWFyIGludHJhIERDIG1vZGUgKi8KKyAgICBlbHNlCisgICAgeworICAgIAorICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoUVAgKyAxMykvMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQIC0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KKyAgICBwU3JjRHN0WzBdID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOworCisgICAgLyogU2F0dXJhdGUgKi8KKyAgICBwU3JjRHN0WzBdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbMF0pOworCisgICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLworICAgIGZvciAoY29lZmZDb3VudCA9IDE7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgc2lnbiAqLworICAgICAgICBTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKKworICAgICAgICBpZiAoUVAgJiAweDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkgKiBRUDsKKyAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkgKiBRUCAtIDE7CisgICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbY29lZmZDb3VudF0pOworICAgIH0KKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKKworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGM1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCkBAIC0wLDAgKzEsMTA4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBEQ1QtPnF1YW50IGFuZCByZWNvbnN0cnVjdGluZyB0aGUgaW50ZXIgdGV4dHVyZSBkYXRhCisgKiAKKyAqLyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKKyAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCisgKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCisgKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKKyAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCisgKiAgICAgICAgICAgIC0gcFNyYyAKKyAqICAgICAgICAgICAgLSBwRHN0CisgKiAgICAgICAgICAgIC0gcFJlYworICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlcigKKyAgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9TMTYgKiBwUmVjLAorICAgICBPTVhfVTggUVAsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQgCisgICAgOCBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KKyAgICBPTVhfUzE2IHRlbXBCdWZmZXJbNzJdOworICAgIE9NWF9TMTYgKnBUZW1wQnVmZmVyOworICAgIE9NWF9JTlQgaTsKKyAgICAgICAgCisgICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KKyAgICBwVGVtcEJ1ZmZlciA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWZmZXIpOworCisgICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCisgICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFJlYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIAorICAgIG9teFZDTTRQMl9EQ1Q4eDhibGsgKHBTcmMsIHBEc3QpOworICAgIG9teFZDTTRQMl9RdWFudEludGVyX0koCisgICAgIHBEc3QsCisgICAgIFFQLAorICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgIHsKKyAgICAgICAgcFRlbXBCdWZmZXJbaV0gPSBwRHN0W2ldOworICAgIH0KKworICAgIG9teFZDTTRQMl9RdWFudEludkludGVyX0koCisgICAgIHBUZW1wQnVmZmVyLAorICAgICBRUCk7CisgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmZmVyLCBwUmVjKTsKKworICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDQ0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udGFpbnMgbW9kdWxlcyBEQ1QtPnF1YW50IGFuZCByZWNvbnN0cnVjdGluZyB0aGUgaW50cmEgdGV4dHVyZSBkYXRhCisgKiAKKyAqLyAKKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhKAorICAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgIE9NWF9TMTYgKiBwRHN0LAorICAgICBPTVhfVTggKiBwUmVjLAorICAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfSU5UICpwU3VtRXJyLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9VOCBjdXJRcCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCisgICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICAgT01YX0lOVCBkc3RTdGVwLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKykKK3sKKyAgICAvKiA2NCBlbGVtZW50cyBhcmUgbmVlZGVkIGJ1dCB0byBhbGlnbiBpdCB0byAxNiBieXRlcyBuZWVkCisgICAgOCBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KKyAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOworICAgIE9NWF9TMTYgdGVtcEJ1ZjNbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMiwqcFRlbXBCdWYzOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhfVTggIGZsYWc7CisgICAgT01YX0lOVCB4LCB5LCBjb3VudCwgcHJlZERpcjsKKyAgICBPTVhfSU5UIHByZWRRUCwgQUNQcmVkRmxhZzsKKyAgICAKKworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICBwVGVtcEJ1ZjMgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMyk7CisKKyAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUmVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFJlYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUHJlQUNQcmVkaWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwU3VtRXJyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwUXBCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKChzcmNTdGVwIDw9IDApIHx8IChkc3RTdGVwIDw9IDApIHx8CisgICAgICAgICAgICAgICAgKGRzdFN0ZXAgJiA3KSB8fCAoc3JjU3RlcCAmIDcpCisgICAgICAgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoKGJsb2NrSW5kZXggPCAwKSB8fCAoYmxvY2tJbmRleCA+IDkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBhcm1SZXRBcmdFcnJJZigoY3VyUXAgPD0gMCkgfHwgKGN1clFwID49MzIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKworICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgLyogQ29udmVydGluZyBmcm9tIDItZCB0byAxLWQgYnVmZmVyICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yKHg9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBUZW1wQnVmMVtjb3VudF0gPSBwU3JjWyh5KnNyY1N0ZXApICsgeF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbXhWQ000UDJfRENUOHg4YmxrICAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOworICAgIG9teFZDTTRQMl9RdWFudEludHJhX0koCisgICAgICAgIHBUZW1wQnVmMiwKKyAgICAgICAgY3VyUXAsCisgICAgICAgIGJsb2NrSW5kZXgsCisgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworCisgICAgLyogQ29udmVydGluZyBmcm9tIDEtRCB0byAyLUQgYnVmZmVyICovCisgICAgZm9yICh5ID0gMCwgY291bnQgPSAwOyB5IDwgODsgeSsrKQorICAgIHsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzdG9yaW5nIHRlbXBidWYyIHRvIHRlbXBidWYxICovCisgICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFRlbXBCdWYyW2NvdW50XTsKKyAgICAgICAgICAgIHBEc3RbKHkqZHN0U3RlcCkgKyB4XSA9IHBUZW1wQnVmMltjb3VudF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBQyBhbmQgREMgcHJlZGljdGlvbiAqLworICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAorICAgICAgICBibG9ja0luZGV4LAorICAgICAgICBwUHJlZEJ1ZlJvdywKKyAgICAgICAgcFByZWRCdWZDb2wsCisgICAgICAgICZwcmVkRGlyLAorICAgICAgICAmcHJlZFFQLAorICAgICAgICBwUXBCdWYpOworCisgICAgYXJtUmV0RGF0YUVycklmKCgocHJlZFFQIDw9IDApIHx8IChwcmVkUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgZmxhZyA9IDE7CisgICAgaWYgKCpwU3VtRXJyIDwgMCkKKyAgICB7CisgICAgICAgIEFDUHJlZEZsYWcgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBBQ1ByZWRGbGFnID0gMTsKKyAgICB9CisKKyAgICBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCisgICAgICAgIHBUZW1wQnVmMiwKKyAgICAgICAgcFByZUFDUHJlZGljdCwKKyAgICAgICAgcFByZWRCdWZSb3csCisgICAgICAgIHBQcmVkQnVmQ29sLAorICAgICAgICBjdXJRcCwKKyAgICAgICAgcHJlZFFQLAorICAgICAgICBwcmVkRGlyLAorICAgICAgICBBQ1ByZWRGbGFnLAorICAgICAgICB2aWRlb0NvbXAsCisgICAgICAgIGZsYWcsCisgICAgICAgIHBTdW1FcnIpOworCisgICAgLyogUmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgZGF0YSAqLworICAgIG9teFZDTTRQMl9RdWFudEludkludHJhX0koCisgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgY3VyUXAsCisgICAgICAgIHZpZGVvQ29tcCwKKyAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7CisgICAgb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYzKTsKKyAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDY0OyBjb3VudCsrKQorICAgIHsKKyAgICAgICAgcFJlY1tjb3VudF0gPSBhcm1NYXgoMCxwVGVtcEJ1ZjNbY291bnRdKTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MzY4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgorCisjaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKK2NvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKKyNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNmMmVmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRGVjVGVzdEJlbmNoLmMKQEAgLTAsMCArMSw3NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ0hFQ0tfTUVNT1JZX1VTQUdFIHByaW50cyBhbmQgc3VtcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBpbiBjYWxscyB0bworICogSDI2NFN3RGVjTWFsbG9jKCkgKi8KKy8qICNkZWZpbmUgQ0hFQ0tfTUVNT1JZX1VTQUdFICovCisKKy8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLworLyogI2RlZmluZSBfTk9fT1VUICovCisKKy8qIERlYnVnIHByaW50cyAqLworI2RlZmluZSBERUJVRyhhcmd2KSBwcmludGYgYXJndgorCisvKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCitjb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7CisKK3ZvaWQgV3JpdGVPdXRwdXQoY2hhciAqZmlsZW5hbWUsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7Cit1MzIgTmV4dFBhY2tldCh1OCAqKnBTdHJtKTsKK3UzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCisgICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7CisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgZm9yIHN0cmVhbSBoYW5kbGluZyAqLwordTggKnN0cmVhbVN0b3AgPSBOVUxMOwordTMyIHBhY2tldGl6ZSA9IDA7Cit1MzIgbmFsVW5pdFN0cmVhbSA9IDA7CitGSUxFICpmb3V0cHV0ID0gTlVMTDsKKworI2lmZGVmIFNPQ19ERVNJR05FUgorCisvLyBJbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBkZWZpbmVkIGluIEluaXRDYWNoZS5zCitleHRlcm4gdm9pZCBjYWNoZV9pbml0KHZvaWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogICRTdWIkJG1haW4KKworICAgIFB1cnBvc2U6CisgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIEMgbGlicmFyeSBpbml0aWFsaXNhdGlvbiBhbmQKKyAgICAgICAgYmVmb3JlIG1haW4uIEl0cyBwdXJwb3NlIGlzIHRvIGRvIGFueSBmdXJ0aGVyIGluaXRpYWxpc2F0aW9uIGJlZm9yZSB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gc3RhcnQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgJFN1YiQkbWFpbihjaGFyIGFyZ2MsIGNoYXIgKiBhcmd2W10pCit7CisgIGNhY2hlX2luaXQoKTsgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc29tZSBleHRyYSBzZXR1cCB3b3JrIHNldHRpbmcgdXAgY2FjaGVzCisgIHJldHVybiAkU3VwZXIkJG1haW4oYXJnYywgYXJndik7IC8vIGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbgorfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgbWFpbgorCisgICAgUHVycG9zZToKKyAgICAgICAgbWFpbiBmdW5jdGlvbiBvZiBkZWNvZGVyIHRlc3RiZW5jaC4gUHJvdmlkZXMgY29tbWFuZCBsaW5lIGludGVyZmFjZQorICAgICAgICB3aXRoIGZpbGUgSS9PIGZvciBILjI2NCBkZWNvZGVyLiBQcmludHMgb3V0IHRoZSB1c2FnZSBpbmZvcm1hdGlvbgorICAgICAgICB3aGVuIGV4ZWN1dGVkIHdpdGhvdXQgYXJndW1lbnRzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKKyAgICB1MzIgaSwgdG1wOworICAgIHUzMiBtYXhOdW1QaWNzID0gMDsKKyAgICB1OCAqYnl0ZVN0cm1TdGFydDsKKyAgICB1OCAqaW1hZ2VEYXRhOworICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7CisgICAgdTMyIHN0cm1MZW47CisgICAgdTMyIHBpY1NpemU7CisgICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OworICAgIEgyNjRTd0RlY1JldCByZXQ7CisgICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7CisgICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKKyAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7CisgICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOworICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gZGVjVmVyOworICAgIHUzMiBwaWNEZWNvZGVOdW1iZXI7CisgICAgdTMyIHBpY0Rpc3BsYXlOdW1iZXI7CisgICAgdTMyIG51bUVycm9ycyA9IDA7CisgICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKKyAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOworCisgICAgRklMRSAqZmlucHV0OworCisgICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdID0gIiI7CisKKyAgICAvKiBQcmludCBBUEkgdmVyc2lvbiBudW1iZXIgKi8KKyAgICBkZWNWZXIgPSBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKCk7CisgICAgREVCVUcoKCJILjI2NCBEZWNvZGVyIEFQSSB2JWQuJWRcbiIsIGRlY1Zlci5tYWpvciwgZGVjVmVyLm1pbm9yKSk7CisKKyAgICAvKiBQcmludCB0YWcgbmFtZSBpZiAnLVQnIGFyZ3VtZW50IHByZXNlbnQgKi8KKyAgICBpZiAoIGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLVQiKSA9PSAwICkKKyAgICB7CisgICAgICAgIERFQlVHKCgiJXNcbiIsIHRhZ05hbWUpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCBlbm91Z2ggY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBnaXZlbiwgaWYgbm90IC0+IHByaW50IHVzYWdlCisgICAgICogaW5mb3JtYXRpb24gb3V0ICovCisgICAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgICAgREVCVUcoKAorICAgICAgICAgICAgIlVzYWdlOiAlcyBbLU5uXSBbLU9vdXRmaWxlXSBbLVBdIFstVV0gWy1DXSBbLVJdIFstVF0gZmlsZS5oMjY0XG4iLAorICAgICAgICAgICAgYXJndlswXSkpOworICAgICAgICBERUJVRygoIlx0LU5uIGZvcmNlcyBkZWNvZGluZyB0byBzdG9wIGFmdGVyIG4gcGljdHVyZXNcbiIpKTsKKyNpZiBkZWZpbmVkKF9OT19PVVQpCisgICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgb3V0cHV0IHdyaXRpbmcgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7CisjZWxzZQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIHdyaXRlIG91dHB1dCB0byBcIm91dGZpbGVcIiAoZGVmYXVsdCBvdXRfd3h4eGh5eXkueXV2KVxuIikpOworICAgICAgICBERUJVRygoIlx0LU9ub25lIGRvZXMgbm90IHdyaXRlIG91dHB1dFxuIikpOworI2VuZGlmCisgICAgICAgIERFQlVHKCgiXHQtUCBwYWNrZXQtYnktcGFja2V0IG1vZGVcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1VIE5BTCB1bml0IHN0cmVhbSBtb2RlXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtQyBkaXNwbGF5IGNyb3BwZWQgaW1hZ2UgKGRlZmF1bHQgZGVjb2RlZCBpbWFnZSlcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1SIGRpc2FibGUgRFBCIG91dHB1dCByZW9yZGVyaW5nXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtVCB0byBwcmludCB0YWcgbmFtZSBhbmQgZXhpdFxuIikpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgKHUzMikoYXJnYy0xKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTiIsIDIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhOdW1QaWNzID0gKHUzMilhdG9pKGFyZ3ZbaV0rMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1PIiwgMikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweShvdXRGaWxlTmFtZSwgYXJndltpXSsyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWNrZXRpemUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1VIikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyb3BEaXNwbGF5ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcsIGZpbGUgbmFtZSBnaXZlbiBieSB1c2VyLiBJZiBmaWxlIG9wZW4KKyAgICAgKiBmYWlscyAtPiBleGl0ICovCisgICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLTFdLCJyYiIpOworICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2hlY2sgc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZSAtPiBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcyAqLworICAgIGZzZWVrKGZpbnB1dCwwTCxTRUVLX0VORCk7CisgICAgc3RybUxlbiA9ICh1MzIpZnRlbGwoZmlucHV0KTsKKyAgICByZXdpbmQoZmlucHV0KTsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyZWFtIGJ1ZmZlci4gaWYgdW5zdWNjZXNzZnVsIC0+IGV4aXQgKi8KKyAgICBieXRlU3RybVN0YXJ0ID0gKHU4ICopbWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7CisgICAgaWYgKGJ5dGVTdHJtU3RhcnQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIEFMTE9DQVRFIE1FTU9SWVxuIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLworICAgIGZyZWFkKGJ5dGVTdHJtU3RhcnQsIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7CisgICAgZmNsb3NlKGZpbnB1dCk7CisKKyAgICAvKiBpbml0aWFsaXplIGRlY29kZXIuIElmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCisgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmZGVjSW5zdCwgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcpOworICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIikpOworICAgICAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJlYW1TdG9wID0gYnl0ZVN0cm1TdGFydCArIHN0cm1MZW47CisgICAgZGVjSW5wdXQucFN0cmVhbSA9IGJ5dGVTdHJtU3RhcnQ7CisgICAgZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47CisgICAgZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7CisKKyAgICAvKiBnZXQgcG9pbnRlciB0byBuZXh0IHBhY2tldCBhbmQgdGhlIHNpemUgb2YgcGFja2V0CisgICAgICogKGZvciBwYWNrZXRpemUgb3IgbmFsVW5pdFN0cmVhbSBtb2RlcykgKi8KKyAgICBpZiAoICh0bXAgPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKSkgIT0gMCApCisgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSB0bXA7CisKKyAgICBwaWNEZWNvZGVOdW1iZXIgPSBwaWNEaXNwbGF5TnVtYmVyID0gMTsKKyAgICAvKiBtYWluIGRlY29kaW5nIGxvb3AgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgLyogUGljdHVyZSBJRCBpcyB0aGUgcGljdHVyZSBudW1iZXIgaW4gZGVjb2Rpbmcgb3JkZXIgKi8KKyAgICAgICAgZGVjSW5wdXQucGljSWQgPSBwaWNEZWNvZGVOdW1iZXI7CisKKyAgICAgICAgLyogY2FsbCBBUEkgZnVuY3Rpb24gdG8gcGVyZm9ybSBkZWNvZGluZyAqLworICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjSW5zdCwgJmRlY0lucHV0LCAmZGVjT3V0cHV0KTsKKworICAgICAgICBzd2l0Y2gocmV0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOgorICAgICAgICAgICAgICAgIC8qIFN0cmVhbSBoZWFkZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKKyAgICAgICAgICAgICAgICAgKiAtPiBzdHJlYW0gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZvciBxdWVyeSBub3cgKi8KKworICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjSW5zdCwgJmRlY0luZm8pOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBERUJVRygoIlByb2ZpbGUgJWRcbiIsIGRlY0luZm8ucHJvZmlsZSkpOworCisgICAgICAgICAgICAgICAgREVCVUcoKCJXaWR0aCAlZCBIZWlnaHQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBERUJVRygoIkNyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOworCisgICAgICAgICAgICAgICAgICAgIC8qIENyb3BwZWQgZnJhbWUgc2l6ZSBpbiBwbGFuYXIgWVVWIDQ6MjowICovCisgICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICAgICAgICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIERlY29kZXIgb3V0cHV0IGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERFQlVHKCgidmlkZW9SYW5nZSAlZCwgbWF0cml4Q29lZmZpY2llbnRzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnZpZGVvUmFuZ2UsIGRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworCisgICAgICAgICAgICAgICAgLyogSWYgLU8gb3B0aW9uIG5vdCB1c2VkLCBnZW5lcmF0ZSBkZWZhdWx0IGZpbGUgbmFtZSAqLworICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlTmFtZVswXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG91dEZpbGVOYW1lLCAib3V0X3clZGglZC55dXYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKKyAgICAgICAgICAgICAgICAvKiBQaWN0dXJlIGlzIHJlYWR5IGFuZCBtb3JlIGRhdGEgcmVtYWlucyBpbiBpbnB1dCBidWZmZXIKKyAgICAgICAgICAgICAgICAgKiAtPiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZOgorCisgICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXBJbWFnZSxwaWNTaXplKSB2YXJpYWJsZSBpbml0aWFsaXplZCBhdAorICAgICAgICAgICAgICAgICAqIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSBjYXNlICovCisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZKQorICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICAvKiBJZiBlbm91Z2ggcGljdHVyZXMgZGVjb2RlZCAtPiBmb3JjZSBkZWNvZGluZyB0byBlbmQKKyAgICAgICAgICAgICAgICAgKiBieSBzZXR0aW5nIHRoYXQgbm8gbW9yZSBzdHJlYW0gaXMgYXZhaWxhYmxlICovCisgICAgICAgICAgICAgICAgaWYgKG1heE51bVBpY3MgJiYgcGljRGVjb2RlTnVtYmVyID09IG1heE51bVBpY3MpCisgICAgICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSAwOworCisgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRlY29kaW5nIG51bWJlciBmb3IgZXZlcnkgZGVjb2RlZCBwaWN0dXJlICovCisgICAgICAgICAgICAgICAgcGljRGVjb2RlTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICAvKiB1c2UgZnVuY3Rpb24gSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlCisgICAgICAgICAgICAgICAgICogaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24gaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzCisgICAgICAgICAgICAgICAgICogYXJlIHJlYWR5IGZvciBkaXNwbGF5ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCBIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIlxuIikpOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgICAgICAgICAgICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKKworICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKKworICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGRlY0luZm8pIGFsd2F5cyBpbml0aWFsaXplZCBpZiBwaWN0dXJlcworICAgICAgICAgICAgICAgICAgICAgKiBhdmFpbGFibGUgZm9yIGRpc3BsYXkgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCisgICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ6CisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX0VSUjoKKyAgICAgICAgICAgICAgICAvKiBJbnB1dCBzdHJlYW0gd2FzIGRlY29kZWQgYnV0IG5vIHBpY3R1cmUgaXMgcmVhZHkKKyAgICAgICAgICAgICAgICAgKiAtPiBHZXQgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIERFQlVHKCgiRkFUQUwgRVJST1JcbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgfQorICAgIC8qIGtlZXAgZGVjb2RpbmcgdW50aWwgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gYnVmZmVyIGNvbnN1bWVkICovCisgICAgfSB3aGlsZSAoZGVjSW5wdXQuZGF0YUxlbiA+IDApOworCisgICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKKyAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgorICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgorICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKKyAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KKyAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09IEgyNjRTV0RFQ19QSUNfUkRZKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJQSUMgJWQsIHR5cGUgJXMiLCBwaWNEaXNwbGF5TnVtYmVyLAorICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIikpOworICAgICAgICBpZiAocGljRGlzcGxheU51bWJlciAhPSBkZWNQaWN0dXJlLnBpY0lkKQorICAgICAgICAgICAgREVCVUcoKCIsIGRlY29kZWQgcGljICVkIiwgZGVjUGljdHVyZS5waWNJZCkpOworICAgICAgICBpZiAoZGVjUGljdHVyZS5uYnJPZkVyck1CcykKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCIsIGNvbmNlYWxlZCAlZFxuIiwgZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERFQlVHKCgiXG4iKSk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgIG51bUVycm9ycyArPSBkZWNQaWN0dXJlLm5ick9mRXJyTUJzOworCisgICAgICAgIC8qIEluY3JlbWVudCBkaXNwbGF5IG51bWJlciBmb3IgZXZlcnkgZGlzcGxheWVkIHBpY3R1cmUgKi8KKyAgICAgICAgcGljRGlzcGxheU51bWJlcisrOworCisgICAgICAgIC8qIFdyaXRlIG91dHB1dCBwaWN0dXJlIHRvIGZpbGUgKi8KKyAgICAgICAgaW1hZ2VEYXRhID0gKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOworICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCisgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQsCisgICAgICAgICAgICAgICAgJmRlY0luZm8uY3JvcFBhcmFtcyk7CisgICAgICAgICAgICBpZiAodG1wKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCB0bXBJbWFnZSwgcGljU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgaW1hZ2VEYXRhLCBwaWNTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlbGVhc2UgZGVjb2RlciBpbnN0YW5jZSAqLworICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjSW5zdCk7CisKKyAgICBpZiAoZm91dHB1dCkKKyAgICAgICAgZmNsb3NlKGZvdXRwdXQpOworCisgICAgLyogZnJlZSBhbGxvY2F0ZWQgYnVmZmVycyAqLworICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7CisgICAgZnJlZSh0bXBJbWFnZSk7CisKKyAgICBERUJVRygoIk91dHB1dCBmaWxlOiAlc1xuIiwgb3V0RmlsZU5hbWUpKTsKKworICAgIERFQlVHKCgiREVDT0RJTkcgRE9ORVxuIikpOworICAgIGlmIChudW1FcnJvcnMgfHwgcGljRGVjb2RlTnVtYmVyID09IDEpCisgICAgeworICAgICAgICBERUJVRygoIkVSUk9SUyBGT1VORFxuIikpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBXcml0ZU91dHB1dAorCisgICAgUHVycG9zZToKKyAgICAgICAgV3JpdGUgcGljdHVyZSBwb2ludGVkIGJ5IGRhdGEgdG8gZmlsZS4gU2l6ZSBvZiB0aGUKKyAgICAgICAgcGljdHVyZSBpbiBwaXhlbHMgaXMgaW5kaWNhdGVkIGJ5IHBpY1NpemUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCit7CisKKyAgICAvKiBmb3V0cHV0IGlzIGdsb2JhbCBmaWxlIHBvaW50ZXIgKi8KKyAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgY2FuIGJlIGRpc2FibGVkIHdpdGggZGVmaW5lLgorICAgICAgICAgKiBJZiBmaWxlIG9wZW4gZmFpbHMgLT4gZXhpdCAqLworICAgICAgICBpZiAoc3RyY21wKGZpbGVuYW1lLCAibm9uZSIpICE9IDApCisgICAgICAgIHsKKyNpZiAhZGVmaW5lZChfTk9fT1VUKQorICAgICAgICAgICAgZm91dHB1dCA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICAgICAgICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gT1BFTiBPVVRQVVQgRklMRVxuIikpOworICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdXRwdXQgJiYgZGF0YSkKKyAgICAgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZvdXRwdXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogTmV4dFBhY2tldAorCisgICAgUHVycG9zZToKKyAgICAgICAgR2V0IHRoZSBwb2ludGVyIHRvIHN0YXJ0IG9mIG5leHQgcGFja2V0IGluIGlucHV0IHN0cmVhbS4gVXNlcworICAgICAgICBnbG9iYWwgdmFyaWFibGVzICdwYWNrZXRpemUnIGFuZCAnbmFsVW5pdFN0cmVhbScgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAgICBkZWNvZGVyIGlucHV0IHN0cmVhbSBtb2RlIGFuZCAnc3RyZWFtU3RvcCcgdG8gZGV0ZXJtaW5lIHRoZSBlbmQKKyAgICAgICAgb2Ygc3RyZWFtLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3RyZWFtIG1vZGVzOgorICAgICAgICAgICAgZGVmYXVsdCAtIHRoZSB3aG9sZSBzdHJlYW0gYXQgb25jZQorICAgICAgICAgICAgcGFja2V0aXplIC0gYSBzaW5nbGUgTkFMLXVuaXQgd2l0aCBzdGFydCBjb2RlIHByZWZpeAorICAgICAgICAgICAgbmFsVW5pdFN0cmVhbSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGhvdXQgc3RhcnQgY29kZSBwcmVmaXgKKworICAgICAgICBwU3RybSBzdG9yZXMgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgcHJldmlvdXMgZGVjb2RlciBpbnB1dCBhbmQgaXMKKyAgICAgICAgcmVwbGFjZWQgd2l0aCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNvZGVyIGlucHV0LgorCisgICAgICAgIFJldHVybnMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgTmV4dFBhY2tldCh1OCAqKnBTdHJtKQoreworCisgICAgdTMyIGluZGV4OworICAgIHUzMiBtYXhJbmRleDsKKyAgICB1MzIgemVyb0NvdW50OworICAgIHU4ICpzdHJlYW07CisgICAgdTggYnl0ZTsKKyAgICBzdGF0aWMgdTMyIHByZXZJbmRleD0wOworCisgICAgLyogRm9yIGRlZmF1bHQgc3RyZWFtIG1vZGUgYWxsIHRoZSBzdHJlYW0gaXMgaW4gZmlyc3QgcGFja2V0ICovCisgICAgaWYgKCFwYWNrZXRpemUgJiYgIW5hbFVuaXRTdHJlYW0pCisgICAgICAgIHJldHVybiAwOworCisgICAgaW5kZXggPSAwOworICAgIHN0cmVhbSA9ICpwU3RybSArIHByZXZJbmRleDsKKyAgICBtYXhJbmRleCA9ICh1MzIpKHN0cmVhbVN0b3AgLSBzdHJlYW0pOworCisgICAgaWYgKG1heEluZGV4ID09IDApCisgICAgICAgIHJldHVybigwKTsKKworICAgIC8qIGxlYWRpbmcgemVyb3Mgb2YgZmlyc3QgTkFMIHVuaXQgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKKyAgICB9IHdoaWxlIChieXRlICE9IDEgJiYgaW5kZXggPCBtYXhJbmRleCk7CisKKyAgICAvKiBpbnZhbGlkIHN0YXJ0IGNvZGUgcHJlZml4ICovCisgICAgaWYgKGluZGV4ID09IG1heEluZGV4IHx8IGluZGV4IDwgMykKKyAgICB7CisgICAgICAgIERFQlVHKCgiSU5WQUxJRCBCWVRFIFNUUkVBTVxuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgLyogbmFsVW5pdFN0cmVhbSBpcyB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4ICovCisgICAgaWYgKG5hbFVuaXRTdHJlYW0pCisgICAgeworICAgICAgICBzdHJlYW0gKz0gaW5kZXg7CisgICAgICAgIG1heEluZGV4IC09IGluZGV4OworICAgICAgICBpbmRleCA9IDA7CisgICAgfQorCisgICAgemVyb0NvdW50ID0gMDsKKworICAgIC8qIFNlYXJjaCBzdHJlYW0gZm9yIG5leHQgc3RhcnQgY29kZSBwcmVmaXggKi8KKyAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBieXRlID0gc3RyZWFtW2luZGV4KytdOworICAgICAgICBpZiAoIWJ5dGUpCisgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKworICAgICAgICBpZiAoIChieXRlID09IDB4MDEpICYmICh6ZXJvQ291bnQgPj0gMikgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdGFydCBjb2RlIHByZWZpeCBoYXMgdHdvIHplcm9zCisgICAgICAgICAgICAgKiBUaGlyZCB6ZXJvIGlzIGFzc3VtZWQgdG8gYmUgbGVhZGluZyB6ZXJvIG9mIG5leHQgcGFja2V0CisgICAgICAgICAgICAgKiBGb3VydGggYW5kIG1vcmUgemVyb3MgYXJlIGFzc3VtZWQgdG8gYmUgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcworICAgICAgICAgICAgICogcGFja2V0ICovCisgICAgICAgICAgICBpZiAoemVyb0NvdW50ID4gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCAtPSA0OworICAgICAgICAgICAgICAgIHplcm9Db3VudCAtPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4IC09IHplcm9Db3VudCsxOworICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChieXRlKQorICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKKworICAgICAgICBpZiAoaW5kZXggPT0gbWF4SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBTdG9yZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworICAgICpwU3RybSA9IHN0cmVhbTsKKyAgICBwcmV2SW5kZXggPSBpbmRleDsKKworICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCB0cmFpbGluZyB6ZXJvcyAqLworICAgIGlmIChuYWxVbml0U3RyZWFtKQorICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQ7CisKKyAgICByZXR1cm4oaW5kZXgpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQorCisgICAgUHVycG9zZToKKyAgICAgICAgUGVyZm9ybSBjcm9wcGluZyBmb3IgcGljdHVyZS4gSW5wdXQgcGljdHVyZSBwSW5JbWFnZSB3aXRoIGRpbWVuc2lvbnMKKyAgICAgICAgcGljV2lkdGggeCBwaWNIZWlnaHQgaXMgY3JvcHBlZCB3aXRoIHBDcm9wUGFyYW1zIGFuZCB0aGUgcmVzdWx0aW5nCisgICAgICAgIHBpY3R1cmUgaXMgc3RvcmVkIGluIHBPdXRJbWFnZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCisgICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcykKK3sKKworICAgIHUzMiBpLCBqOworICAgIHUzMiBvdXRXaWR0aCwgb3V0SGVpZ2h0OworICAgIHU4ICpwT3V0LCAqcEluOworCisgICAgaWYgKHBPdXRJbWFnZSA9PSBOVUxMIHx8IHBJbkltYWdlID09IE5VTEwgfHwgcENyb3BQYXJhbXMgPT0gTlVMTCB8fAorICAgICAgICAhcGljV2lkdGggfHwgIXBpY0hlaWdodCkKKyAgICB7CisgICAgICAgIC8qIGp1c3QgdG8gcHJldmVudCBsaW50IHdhcm5pbmcsIHJldHVybmluZyBub24temVybyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgKiByZXR1cm4gd2l0aG91dCBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KKyAgICAgICAgZnJlZShwT3V0SW1hZ2UpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgaWYgKCAoKHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGgpID4KKyAgICAgICAgICAgcGljV2lkdGggKSB8fAorICAgICAgICAgKChwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0KSA+CisgICAgICAgICAgIHBpY0hlaWdodCApICkKKyAgICB7CisgICAgICAgIC8qIGp1c3QgdG8gcHJldmVudCBsaW50IHdhcm5pbmcsIHJldHVybmluZyBub24temVybyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgKiByZXR1cm4gd2l0aG91dCBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KKyAgICAgICAgZnJlZShwT3V0SW1hZ2UpOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgb3V0V2lkdGggPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoOworICAgIG91dEhlaWdodCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0OworCisgICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGx1bWEgKi8KKyAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OworICAgIHBPdXQgPSBwT3V0SW1hZ2U7CisKKyAgICAvKiBDb3B5IGx1bWEgcGl4ZWwgdmFsdWVzICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOworICAgIH0KKworICAgIG91dFdpZHRoID4+PSAxOworICAgIG91dEhlaWdodCA+Pj0gMTsKKworICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBjYiAqLworICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKKyAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOworCisgICAgLyogQ29weSBjYiBwaXhlbCB2YWx1ZXMgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY3IgKi8KKyAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7CisKKyAgICAvKiBDb3B5IGNyIHBpeGVsIHZhbHVlcyAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOworICAgIH0KKworICAgIHJldHVybiAoMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKKyAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCit7CisgICAgRklMRSAqZnA7CisKKyAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOworCisgICAgaWYgKCFmcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKKyAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7CisKKyAgICBmY2xvc2UoZnApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01hbGxvYworCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKQoreworCisjaWYgZGVmaW5lZChDSEVDS19NRU1PUllfVVNBR0UpCisgICAgLyogTm90ZSB0aGF0IGlmIHRoZSBkZWNvZGVyIGhhcyB0byBmcmVlIGFuZCByZWFsbG9jYXRlIHNvbWUgb2YgdGhlIGJ1ZmZlcnMKKyAgICAgKiB0aGUgdG90YWwgdmFsdWUgd2lsbCBiZSBpbnZhbGlkICovCisgICAgc3RhdGljIHUzMiBudW1CeXRlcyA9IDA7CisgICAgbnVtQnl0ZXMgKz0gc2l6ZTsKKyAgICBERUJVRygoIkFsbG9jYXRlZCAlZCBieXRlcywgdG90YWwgJWRcbiIsIHNpemUsIG51bUJ5dGVzKSk7CisjZW5kaWYKKworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjRnJlZQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNGcmVlIGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSBmb3IgZnJlZWluZyBvZiBtZW1vcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtY3B5IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5IHRvIGNvcHkgc3JjIHRvIGRlc3QuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY01lbWNweSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjTWVtc2V0CisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01lbXNldCBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1lbXNldCB0byBzZXQgY29udGVudCBvZiBtZW1vcnkgYXJlYSBwb2ludGVkIGJ5IHB0ci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCit7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWRjNzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9FdmFsdWF0aW9uVGVzdEJlbmNoLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgbWFpbgorCisgICAgUHVycG9zZToKKyAgICAgICAgbWFpbiBmdW5jdGlvbi4gQXNzdW1pbmcgdGhhdCBleGVjdXRhYmxlIGlzIG5hbWVkICdkZWNvZGVyJyB0aGUgdXNhZ2UKKyAgICAgICAgaXMgYXMgZm9sbG93cworCisgICAgICAgICAgICBkZWNvZGVyIGlucHV0RmlsZU5hbWUKKworICAgICAgICAsIHdoZXJlIGlucHV0RmlsZU5hbWUgc2hhbGwgYmUgbmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgaDI2NCBzdHJlYW0KKyAgICAgICAgZGF0YS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKworICAgIHU4ICpieXRlU3RybVN0YXJ0OworICAgIHU4ICpieXRlU3RybTsKKyAgICB1MzIgc3RybUxlbjsKKyAgICB1MzIgcGljU2l6ZTsKKyAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7CisgICAgSDI2NFN3RGVjUmV0IHJldDsKKyAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKKyAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OworICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKKyAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87CisgICAgdTMyIHBpY051bWJlcjsKKworICAgIEZJTEUgKmZpbnB1dDsKKyAgICBGSUxFICpmb3V0cHV0OworCisgICAgLyogQ2hlY2sgdGhhdCBlbm91Z2ggY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBnaXZlbiwgaWYgbm90IC0+IHByaW50IHVzYWdlCisgICAgICogaW5mb3JtYXRpb24gb3V0ICovCisgICAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiVXNhZ2U6ICVzIGZpbGUuaDI2NFxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvcGVuIG91dHB1dCBmaWxlIGZvciB3cml0aW5nLCBvdXRwdXQgZmlsZSBuYW1lZCBvdXQueXV2LiBJZiBmaWxlIG9wZW4KKyAgICAgKiBmYWlscyAtPiBleGl0ICovCisgICAgZm91dHB1dCA9IGZvcGVuKCJvdXQueXV2IiwgIndiIik7CisgICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCisgICAgICogZmFpbHMgLT4gZXhpdCAqLworICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwgInJiIik7CisgICAgaWYgKGZpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJVTkFCTEUgVE8gT1BFTiBJTlBVVCBGSUxFXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KKyAgICBmc2VlayhmaW5wdXQsIDBMLCBTRUVLX0VORCk7CisgICAgc3RybUxlbiA9ICh1MzIpZnRlbGwoZmlucHV0KTsKKyAgICByZXdpbmQoZmlucHV0KTsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyZWFtIGJ1ZmZlciwgZXhpdCBpZiB1bnN1Y2Nlc3NmdWwgKi8KKyAgICBieXRlU3RybSA9IGJ5dGVTdHJtU3RhcnQgPSAodTggKilIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKHU4KSpzdHJtTGVuKTsKKyAgICBpZiAoYnl0ZVN0cm0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiVU5BQkxFIFRPIEFMTE9DQVRFIE1FTU9SWVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiByZWFkIGlucHV0IHN0cmVhbSBmcm9tIGZpbGUgdG8gYnVmZmVyIGFuZCBjbG9zZSBpbnB1dCBmaWxlICovCisgICAgZnJlYWQoYnl0ZVN0cm0sIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7CisgICAgZmNsb3NlKGZpbnB1dCk7CisKKyAgICAvKiBpbml0aWFsaXplIGRlY29kZXIuIElmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCisgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmZGVjSW5zdCwgMCk7CisgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgeworICAgICAgICBwcmludGYoIkRFQ09ERVIgSU5JVElBTElaQVRJT04gRkFJTEVEXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlICovCisgICAgZGVjSW5wdXQucFN0cmVhbSA9IGJ5dGVTdHJtU3RhcnQ7CisgICAgZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47CisgICAgZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7CisKKyAgICBwaWNOdW1iZXIgPSAwOworCisgICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgc3RhcnQgdGltZSAoaW4gc2Vjb25kcykgaGVyZS4KKyAgICAgKiBUaGUgZGVjb2RpbmcgdGltZSBzaG91bGQgYmUgbWVhc3VyZWQgb3ZlciBzZXZlcmFsIGZyYW1lcyBhbmQgYWZ0ZXIKKyAgICAgKiB0aGF0IGF2ZXJhZ2UgZnBzIChmcmFtZXMvc2Vjb25kKSBjYW4gYmUgY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIHN0YXJ0VGltZSA9IEdldFRpbWUoKTsKKyAgICAgKgorICAgICAqIFRvIHByZXZlbnQgY2FsY3VsYXRpbmcgZmlsZSBJL08gbGF0ZW5zaWVzIGFzIGEgZGVjb2RpbmcgdGltZSwKKyAgICAgKiBjb21tZW50IG91dCBXcml0ZU91dHB1dCBmdW5jdGlvbiBjYWxsLiBBbHNvIHByaW50cyB0byBzdGRvdXQgbWlnaHQKKyAgICAgKiBjb25zdW1lIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgY3ljbGVzIGR1cmluZyBtZWFzdXJlbWVudCAqLworCisgICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNhbGwgQVBJIGZ1bmN0aW9uIHRvIHBlcmZvcm0gZGVjb2RpbmcgKi8KKyAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY0luc3QsICZkZWNJbnB1dCwgJmRlY091dHB1dCk7CisKKyAgICAgICAgc3dpdGNoKHJldCkKKyAgICAgICAgeworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKKworICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgZGltZW5zaW9ucyBhcmUgYXZhaWxhYmxlIGZvciBxdWVyeSBub3cgKi8KKyAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY0luc3QsICZkZWNJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgLyogcGljdHVyZSBzaXplIGluIHBpeGVscyAqLworICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQ7CisgICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgWUNiQ3IgNDoyOjAgcGljdHVyZSBpbiBieXRlcyAqLworICAgICAgICAgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7CisgICAgICAgICAgICAgICAgLyogbWVtb3J5IG5lZWRlZCBmb3IgMTYtYml0IFJHQiBwaWN0dXJlIGluIGJ5dGVzCisgICAgICAgICAgICAgICAgICogcGljU2l6ZSA9IChkZWNJbmZvLnBpY1dpZHRoICogZGVjSW5mby5waWNIZWlnaHQpICogMjsgKi8KKworICAgICAgICAgICAgICAgIHByaW50ZigiV2lkdGggJWQgSGVpZ2h0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnBpY1dpZHRoLCBkZWNJbmZvLnBpY0hlaWdodCk7CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQorICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOworICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgorICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKKworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUsIG51bWJlciBvZiBieXRlcworICAgICAgICAgICAgICAgICAqICJjb25zdW1lZCIgaXMgY29tcHV0ZWQgYXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBuZXcgc3RyZWFtCisgICAgICAgICAgICAgICAgICogcG9pbnRlciBhbmQgb2xkIHN0cmVhbSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiAtPQorICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0gZGVjSW5wdXQucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgZGVjSW5wdXQucFN0cmVhbSA9IGRlY091dHB1dC5wU3RybUN1cnJQb3M7CisKKyAgICAgICAgICAgICAgICAvKiB1c2UgZnVuY3Rpb24gSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlCisgICAgICAgICAgICAgICAgICogaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24gaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzCisgICAgICAgICAgICAgICAgICogYXJlIHJlYWR5IGZvciBkaXNwbGF5ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY0luc3QsICZkZWNQaWN0dXJlLCAwKSA9PQorICAgICAgICAgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSkgeyBwaWNOdW1iZXIrKzsKKworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7CisgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCisgICAgICAgICAgICAgICAgICAgICAqIGluIFJHQi1mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCisgICAgICAgICAgICAgICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1NpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEOgorICAgICAgICAgICAgICAgIC8qIGV2YWx1YXRpb24gdmVyc2lvbiBvZiB0aGUgZGVjb2RlciBoYXMgbGltaXRlZCBkZWNvZGluZworICAgICAgICAgICAgICAgICAqIGNhcGFiaWxpdGllcyAqLworICAgICAgICAgICAgICAgIHByaW50ZigiRVZBTFVBVElPTiBMSU1JVCBSRUFDSEVEXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYoIlVOUkVDT1ZFUkFCTEUgRVJST1JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIC8qIGtlZXAgZGVjb2RpbmcgdW50aWwgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gYnVmZmVyIGNvbnN1bWVkICovCisgICAgfSB3aGlsZSAoZGVjSW5wdXQuZGF0YUxlbiA+IDApOworCitlbmQ6CisKKyAgICAvKiBpZiBvdXRwdXQgaW4gZGlzcGxheSBvcmRlciBpcyBwcmVmZXJyZWQsIHRoZSBkZWNvZGVyIHNoYWxsIGJlIGZvcmNlZAorICAgICAqIHRvIG91dHB1dCBwaWN0dXJlcyByZW1haW5pbmcgaW4gZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gVXNlIGZ1bmN0aW9uCisgICAgICogSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uCisgICAgICogaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzIGFyZSByZWFkeSBmb3IgZGlzcGxheS4gU2Vjb25kIHBhcmFtZXRlcgorICAgICAqIGZvciB0aGUgZnVuY3Rpb24gaXMgc2V0IHRvICcxJyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZW5kIG9mIHRoZQorICAgICAqIHN0cmVhbSBhbmQgYWxsIHBpY3R1cmVzIHNoYWxsIGJlIG91dHB1dCAqLworICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMSkgPT0KKyAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsKKworICAgICAgICBwaWNOdW1iZXIrKzsKKworICAgICAgICBwcmludGYoIlBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLCBwaWNOdW1iZXIsCisgICAgICAgICAgICBkZWNQaWN0dXJlLmlzSWRyUGljdHVyZSA/ICJJRFIiIDogIk5PTi1JRFIiLAorICAgICAgICAgICAgZGVjUGljdHVyZS5uYnJPZkVyck1Ccyk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gaWYgbmVlZGVkIHRvIGdldCBkaXNwbGF5IGltYWdlCisgICAgICAgICAqIGluIFJHQi1mb3JtYXQKKyAgICAgICAgICoKKyAgICAgICAgICogWXV2VG9SZ2IoIGRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBSZ2JQaWN0dXJlICk7ICovCisKKyAgICAgICAgLyogd3JpdGUgbmV4dCBkaXNwbGF5IGltYWdlIHRvIG91dHB1dCBmaWxlICovCisgICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZSwgcGljU2l6ZSk7CisgICAgfQorCisgICAgLyogRm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cywgcmVhZCB0aGUgZW5kIHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCisgICAgICoKKyAgICAgKiBlbmRUaW1lID0gR2V0VGltZSgpOworICAgICAqCisgICAgICogTm93IHRoZSBwZXJmb3JtYW5jZSBjYW4gYmUgY2FsY3VsYXRlZCBhcyBmcmFtZXMgcGVyIHNlY29uZDoKKyAgICAgKiBmcHMgPSBwaWNOdW1iZXIgLyAoZW5kVGltZSAtIHN0YXJ0VGltZSk7ICovCisKKworICAgIC8qIHJlbGVhc2UgZGVjb2RlciBpbnN0YW5jZSAqLworICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjSW5zdCk7CisKKyAgICAvKiBjbG9zZSBvdXRwdXQgZmlsZSAqLworICAgIGZjbG9zZShmb3V0cHV0KTsKKworICAgIC8qIGZyZWUgYnl0ZSBzdHJlYW0gYnVmZmVyICovCisgICAgZnJlZShieXRlU3RybVN0YXJ0KTsKKworICAgIHJldHVybiAwOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgV3JpdGVPdXRwdXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIFdyaXRlIHBpY3R1cmUgcG9pbnRlZCBieSBkYXRhIHRvIGZpbGUgcG9pbnRlZCBieSBmaWQuIFNpemUgb2YgdGhlCisgICAgICAgIHBpY3R1cmUgaW4gcGl4ZWxzIGlzIGluZGljYXRlZCBieSBwaWNTaXplLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKK3sKKyAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNUcmFjZSBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gYXBwZW5kcworICAgICAgICB0cmFjZSBtZXNzYWdlcyB0byBmaWxlIG5hbWVkICdkZWNfYXBpLnRyYycuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKK3sKKyAgICBGSUxFICpmcDsKKworICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7CisKKyAgICBpZiAoIWZwKQorICAgICAgICByZXR1cm47CisKKyAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOworICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKKworICAgIGZjbG9zZShmcCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY01hbGxvYyBmdW5jdGlvbi4gUHJvdG90eXBlIG9mIHRoaXMKKyAgICAgICAgZnVuY3Rpb24gaXMgZ2l2ZW4gaW4gSDI2NFN3RGVjQXBpLmguIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworICAgICAgICBsaWJyYXJ5IGZ1bmN0aW9uIG1hbGxvYyBmb3IgYWxsb2NhdGlvbiBvZiBtZW1vcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpCit7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNGcmVlCisKKyAgICBQdXJwb3NlOgorICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY0ZyZWUgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBmcmVlIGZvciBmcmVlaW5nIG9mIG1lbW9yeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpCit7CisgICAgZnJlZShwdHIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbWNweQorCisgICAgUHVycG9zZToKKyAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1jcHkgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1jcHkgdG8gY29weSBzcmMgdG8gZGVzdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KQoreworICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1zZXQKKworICAgIFB1cnBvc2U6CisgICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtc2V0IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtc2V0IHRvIHNldCBjb250ZW50IG9mIG1lbW9yeSBhcmVhIHBvaW50ZWQgYnkgcHRyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkKK3sKKyAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmI0YzRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIEgyNjRTd0RlY0luaXQKKyAgICAgICAgICBIMjY0U3dEZWNHZXRJbmZvCisgICAgICAgICAgSDI2NFN3RGVjUmVsZWFzZQorICAgICAgICAgIEgyNjRTd0RlY0RlY29kZQorICAgICAgICAgIEgyNjRTd0RlY0dldEFQSVZlcnNpb24KKyAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfY29udGFpbmVyLmgiCisjaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kZWNvZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgVmVyc2lvbiBJbmZvcm1hdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBIMjY0U1dERUNfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIEgyNjRTV0RFQ19NSU5PUl9WRVJTSU9OIDMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSDI2NERFQ19UUkFDRSAgICAgICAgICAgVHJhY2UgSDI2NCBEZWNvZGVyIEFQSSBmdW5jdGlvbiBjYWxscy4KK0gyNjRERUNfRVZBTFVBVElPTiAgICAgIENvbXBpbGUgZXZhbHVhdGlvbiB2ZXJzaW9uLCByZXN0cmljdHMgbnVtYmVyIG9mIGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgZGVjb2RlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgSDI2NERFQ19UUkFDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIERFQ19BUElfVFJDKHN0cikgICAgSDI2NFN3RGVjVHJhY2Uoc3RyKQorI2Vsc2UKKyNkZWZpbmUgREVDX0FQSV9UUkMoc3RyKQorI2VuZGlmCisKKyNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KKyNkZWZpbmUgSDI2NERFQ19FVkFMVUFUSU9OX0xJTUlUICAgNTAwCisjZW5kaWYKKwordm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpIHsKK30KKwordm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplKSB7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKK30KKwordm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikgeworICAgIGZyZWUocHRyKTsKK30KKwordm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpIHsKKyAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpIHsKKyAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjSW5pdCgpCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgZGVjb2RlciBzb2Z0d2FyZS4gRnVuY3Rpb24gcmVzZXJ2ZXMgbWVtb3J5IGZvciB0aGUKKyAgICAgICAgICAgIGRlY29kZXIgaW5zdGFuY2UgYW5kIGNhbGxzIGgyNjRic2RJbml0IHRvIGluaXRpYWxpemUgdGhlCisgICAgICAgICAgICBpbnN0YW5jZSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG5vT3V0cHV0UmVvcmRlcmluZyAgZmxhZyB0byBpbmRpY2F0ZSBkZWNvZGVyIHRoYXQgaXQgZG9lc24ndCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyeSB0byBwcm92aWRlIG91dHB1dCBwaWN0dXJlcyBpbiBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLCBzYXZlcyBtZW1vcnkKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGVjSW5zdCAgICAgICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIGluc3RhbmNlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIHRoZSBpbnN0YW5jZQorICAgICAgICAgICAgSDI2NFNXREVDX0lOSVRGQUlMICBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgaW52YWxpZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBIMjY0U1dERUNfTUVNX0ZBSUwgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitIMjY0U3dEZWNSZXQgSDI2NFN3RGVjSW5pdChIMjY0U3dEZWNJbnN0ICpkZWNJbnN0LCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQoreworICAgIHUzMiBydiA9IDA7CisKKyAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7CisKKyAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMiKTsKKworICAgIC8qIGNoZWNrIHRoYXQgcmlnaHQgc2hpZnQgb24gbmVnYXRpdmUgbnVtYmVycyBpcyBwZXJmb3JtZWQgc2lnbmVkICovCisgICAgLypsaW50IC1zYXZlIC1lKiBmb2xsb3dpbmcgY2hlY2sgY2F1c2VzIG11bHRpcGxlIGxpbnQgbWVzc2FnZXMgKi8KKyAgICBpZiAoICgoLTEpPj4xKSAhPSAoLTEpICkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogUmlnaHQgc2hpZnQgaXMgbm90IHNpZ25lZCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX0lOSVRGQUlMKTsKKyAgICB9CisgICAgLypsaW50IC1yZXN0b3JlICovCisKKyAgICBpZiAoZGVjSW5zdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBkZWNJbnN0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZihkZWNDb250YWluZXJfdCkpOworCisgICAgaWYgKHBEZWNDb250ID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX01FTUZBSUwpOworICAgIH0KKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBkZWNJbnN0ICVwIG5vT3V0cHV0UmVvcmRlcmluZyAlZCIsCisgICAgICAgICAgICAodm9pZCopZGVjSW5zdCwgbm9PdXRwdXRSZW9yZGVyaW5nKTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgcnYgPSBoMjY0YnNkSW5pdCgmcERlY0NvbnQtPnN0b3JhZ2UsIG5vT3V0cHV0UmVvcmRlcmluZyk7CisgICAgaWYgKHJ2ICE9IEhBTlRST19PSykKKyAgICB7CisgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UocERlY0NvbnQpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX01FTUZBSUwpOworICAgIH0KKworICAgIHBEZWNDb250LT5kZWNTdGF0ICA9IElOSVRJQUxJWkVEOworICAgIHBEZWNDb250LT5waWNOdW1iZXIgPSAwOworCisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0luaXQjIE9LOiByZXR1cm4gJXAiLCAodm9pZCopcERlY0NvbnQpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICAqZGVjSW5zdCA9IChkZWNDb250YWluZXJfdCAqKXBEZWNDb250OworCisgICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNHZXRJbmZvKCkKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyByZWFkIGFjY2VzcyB0byBkZWNvZGVyIGluZm9ybWF0aW9uLiBUaGlzCisgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBiZWZvcmUgSDI2NFN3RGVjRGVjb2RlIGZ1bmN0aW9uIGhhcworICAgICAgICAgICAgaW5kaWNhdGVkIHRoYXQgaGVhZGVycyBhcmUgcmVhZHkuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwRGVjSW5mbyAgICBwb2ludGVyIHRvIGluZm8gc3RydWN0IHdoZXJlIGRhdGEgaXMgd3JpdHRlbgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX05PVF9SRFkgIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUgeWV0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0gyNjRTd0RlY1JldCBIMjY0U3dEZWNHZXRJbmZvKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pCit7CisKKyAgICBzdG9yYWdlX3QgKnBTdG9yYWdlOworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIik7CisKKyAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBEZWNJbmZvID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IGRlY0luc3Qgb3IgcERlY0luZm8gaXMgTlVMTCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7CisgICAgfQorCisgICAgcFN0b3JhZ2UgPSAmKCgoZGVjQ29udGFpbmVyX3QgKilkZWNJbnN0KS0+c3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyA9PSBOVUxMIHx8IHBTdG9yYWdlLT5hY3RpdmVQcHMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBFUlJPUjogSGVhZGVycyBub3QgZGVjb2RlZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19IRFJTX05PVF9SRFkpOworICAgIH0KKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIsCisgICAgICAgICJIMjY0U3dEZWNHZXRJbmZvIyBkZWNJbnN0ICVwICBwRGVjSW5mbyAlcCIsIGRlY0luc3QsICh2b2lkKilwRGVjSW5mbyk7CisgICAgREVDX0FQSV9UUkMoKChkZWNDb250YWluZXJfdCopZGVjSW5zdCktPnN0cik7CisjZW5kaWYKKworICAgIC8qIGgyNjRic2RQaWNXaWR0aCBhbmQgLUhlaWdodCByZXR1cm4gZGltZW5zaW9ucyBpbiBtYWNyb2Jsb2NrIHVuaXRzLAorICAgICAqIHBpY1dpZHRoIGFuZCAtSGVpZ2h0IGluIHBpeGVscyAqLworICAgIHBEZWNJbmZvLT5waWNXaWR0aCAgICAgICAgPSBoMjY0YnNkUGljV2lkdGgocFN0b3JhZ2UpIDw8IDQ7CisgICAgcERlY0luZm8tPnBpY0hlaWdodCAgICAgICA9IGgyNjRic2RQaWNIZWlnaHQocFN0b3JhZ2UpIDw8IDQ7CisgICAgcERlY0luZm8tPnZpZGVvUmFuZ2UgICAgICA9IGgyNjRic2RWaWRlb1JhbmdlKHBTdG9yYWdlKTsKKyAgICBwRGVjSW5mby0+bWF0cml4Q29lZmZpY2llbnRzID0gaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhwU3RvcmFnZSk7CisKKyAgICBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMocFN0b3JhZ2UsCisgICAgICAgICZwRGVjSW5mby0+Y3JvcHBpbmdGbGFnLAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCisgICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGgsCisgICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wVG9wT2Zmc2V0LAorICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCk7CisKKyAgICAvKiBzYW1wbGUgYXNwZWN0IHJhdGlvICovCisgICAgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERlY0luZm8tPnBhcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERlY0luZm8tPnBhckhlaWdodCk7CisKKyAgICAvKiBwcm9maWxlICovCisgICAgcERlY0luZm8tPnByb2ZpbGUgPSBoMjY0YnNkUHJvZmlsZShwU3RvcmFnZSk7CisKKyAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgT0siKTsKKworICAgIHJldHVybihIMjY0U1dERUNfT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjUmVsZWFzZSgpCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlbGVhc2UgdGhlIGRlY29kZXIgaW5zdGFuY2UuIEZ1bmN0aW9uIGNhbGxzIGgyNjRic2RTaHV0RG93biB0bworICAgICAgICAgICAgcmVsZWFzZSBpbnN0YW5jZSBkYXRhIGFuZCBmcmVlcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlCisgICAgICAgICAgICBpbnN0YW5jZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkZWNJbnN0ICAgICBEZWNvZGVyIGluc3RhbmNlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEgyNjRTd0RlY1JlbGVhc2UoSDI2NFN3RGVjSW5zdCBkZWNJbnN0KQoreworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworCisgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY1JlbGVhc2UjIik7CisKKyAgICBpZiAoZGVjSW5zdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY1JlbGVhc2UjIEVSUk9SOiBkZWNJbnN0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0OworCisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY1JlbGVhc2UjIGRlY0luc3QgJXAiLGRlY0luc3QpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICBoMjY0YnNkU2h1dGRvd24oJnBEZWNDb250LT5zdG9yYWdlKTsKKworICAgIEgyNjRTd0RlY0ZyZWUocERlY0NvbnQpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjRGVjb2RlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzdHJlYW0gZGF0YS4gQ2FsbHMgaDI2NGJzZERlY29kZSB0byBkbyB0aGUgYWN0dWFsIGRlY29kaW5nLgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZQorICAgICAgICAgICAgcElucHV0ICAgICAgcG9pbnRlciB0byBpbnB1dCBzdHJ1Y3QKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEgyNjRTV0RFQ19OT1RfSU5JVElBTElaRUQgICBkZWNvZGVyIGluc3RhbmNlIG5vdCBpbml0aWFsaXplZCB5ZXQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKKworICAgICAgICAgICAgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEICAgIHN0cmVhbSBidWZmZXIgZGVjb2RlZAorICAgICAgICAgICAgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZICAgaGVhZGVycyBkZWNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciBub3QgZmluaXNoZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFkgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciBub3QgZmluaXNoZWQKKyAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX0VSUiAgICAgICAgICAgICAgICAgIHNlcmlvdXMgZXJyb3IgaW4gZGVjb2RpbmcsIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwYXJhbWV0ZXIgc2V0cyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRlY29kZSBwaWN0dXJlIGRhdGEKKyAgICAgICAgICAgIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEIHRoaXMgY2FuIG9ubHkgb2NjdXIgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiB2ZXJzaW9uIGlzIHVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggbnVtYmVyIG9mIGZyYW1lcyByZWFjaGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0gyNjRTd0RlY1JldCBIMjY0U3dEZWNEZWNvZGUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LCBIMjY0U3dEZWNJbnB1dCAqcElucHV0LAorICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICpwT3V0cHV0KQoreworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworICAgIHUzMiBzdHJtTGVuOworICAgIHUzMiBudW1SZWFkQnl0ZXM7CisgICAgdTggKnRtcFN0cmVhbTsKKyAgICB1MzIgZGVjUmVzdWx0ID0gMDsKKyAgICBIMjY0U3dEZWNSZXQgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ7CisKKyAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyIpOworCisgICAgLyogQ2hlY2sgdGhhdCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGFyZSB2YWxpZCAqLworICAgIGlmIChwSW5wdXQgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogcElucHV0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7CisgICAgfQorCisgICAgaWYgKChwSW5wdXQtPnBTdHJlYW0gPT0gTlVMTCkgfHwgKHBJbnB1dC0+ZGF0YUxlbiA9PSAwKSkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOworICAgIH0KKworICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdDsKKworICAgIC8qIENoZWNrIGlmIGRlY29kZXIgaXMgaW4gYW4gaW5jb3JyZWN0IG1vZGUgKi8KKyAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBEZWNDb250LT5kZWNTdGF0ID09IFVOSU5JVElBTElaRUQpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogRGVjb2RlciBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19OT1RfSU5JVElBTElaRUQpOworICAgIH0KKworI2lmZGVmIEgyNjRERUNfRVZBTFVBVElPTgorICAgIGlmIChwRGVjQ29udC0+cGljTnVtYmVyID49IEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCkKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEKTsKKyNlbmRpZgorCisjaWZkZWYgSDI2NERFQ19UUkFDRQorICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0RlY29kZSMgZGVjSW5zdCAlcCAgcElucHV0ICVwICBwT3V0cHV0ICVwIiwKKyAgICAgICAgICAgIGRlY0luc3QsICh2b2lkKilwSW5wdXQsICh2b2lkKilwT3V0cHV0KTsKKyAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKKyNlbmRpZgorCisgICAgcE91dHB1dC0+cFN0cm1DdXJyUG9zICAgPSBOVUxMOworCisgICAgbnVtUmVhZEJ5dGVzID0gMDsKKyAgICBzdHJtTGVuID0gcElucHV0LT5kYXRhTGVuOworICAgIHRtcFN0cmVhbSA9IHBJbnB1dC0+cFN0cmVhbTsKKyAgICBwRGVjQ29udC0+c3RvcmFnZS5pbnRyYUNvbmNlYWxtZW50RmxhZyA9IHBJbnB1dC0+aW50cmFDb25jZWFsbWVudE1ldGhvZDsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBSZXR1cm4gSERSU19SRFkgYWZ0ZXIgRFBCIGZsdXNoIGNhdXNlZCBieSBuZXcgU1BTICovCisgICAgICAgIGlmIChwRGVjQ29udC0+ZGVjU3RhdCA9PSBORVdfSEVBREVSUykKKyAgICAgICAgeworICAgICAgICAgICAgZGVjUmVzdWx0ID0gSDI2NEJTRF9IRFJTX1JEWTsKKyAgICAgICAgICAgIHBEZWNDb250LT5kZWNTdGF0ID0gSU5JVElBTElaRUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBDb250aW51ZSBkZWNvZGluZyBub3JtYWxseSAqLworICAgICAgICB7CisgICAgICAgICAgICBkZWNSZXN1bHQgPSBoMjY0YnNkRGVjb2RlKCZwRGVjQ29udC0+c3RvcmFnZSwgdG1wU3RyZWFtLCBzdHJtTGVuLAorICAgICAgICAgICAgICAgIHBJbnB1dC0+cGljSWQsICZudW1SZWFkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHRtcFN0cmVhbSArPSBudW1SZWFkQnl0ZXM7CisgICAgICAgIC8qIGNoZWNrIGlmIHRvbyBtYW55IGJ5dGVzIGFyZSByZWFkIGZyb20gc3RyZWFtICovCisgICAgICAgIGlmICggKGkzMikoc3RybUxlbiAtIG51bVJlYWRCeXRlcykgPj0gMCApCisgICAgICAgICAgICBzdHJtTGVuIC09IG51bVJlYWRCeXRlczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RybUxlbiA9IDA7CisKKyAgICAgICAgcE91dHB1dC0+cFN0cm1DdXJyUG9zID0gdG1wU3RyZWFtOworCisgICAgICAgIHN3aXRjaCAoZGVjUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEgyNjRCU0RfSERSU19SRFk6CisKKyAgICAgICAgICAgICAgICBpZihwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgJiYKKyAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm51bU91dCAhPQorICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+b3V0SW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgZmlyc3QgYWxsIERQQiBzdG9yZWQgcGljdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgICogRFBCIGZsdXNoIGNhdXNlZCBieSBuZXcgU1BTICovCisgICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+Zmx1c2hlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5kZWNTdGF0ID0gTkVXX0hFQURFUlM7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWTsKKyAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEgyNjRCU0RfUElDX1JEWToKKyAgICAgICAgICAgICAgICBwRGVjQ29udC0+cGljTnVtYmVyKys7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RybUxlbiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWTsKKworICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SOgorICAgICAgICAgICAgICAgIGlmICggIWgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKCZwRGVjQ29udC0+c3RvcmFnZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19TVFJNX0VSUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEgyNjRCU0RfTUVNQUxMT0NfRVJST1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19NRU1GQUlMOworICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9IHdoaWxlIChzdHJtTGVuKTsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIE9LOiBEZWNSZXN1bHQgJWQiLAorICAgICAgICAgICAgcmV0dXJuVmFsdWUpOworICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOworI2VuZGlmCisKKyAgICByZXR1cm4ocmV0dXJuVmFsdWUpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0QVBJVmVyc2lvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZXR1cm4gdmVyc2lvbiBpbmZvcm1hdGlvbiBvZiB0aGUgQVBJCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEFQSSB2ZXJzaW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0gyNjRTd0RlY0FwaVZlcnNpb24gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpCit7CisgICAgSDI2NFN3RGVjQXBpVmVyc2lvbiB2ZXI7CisKKyAgICB2ZXIubWFqb3IgPSBIMjY0U1dERUNfTUFKT1JfVkVSU0lPTjsKKyAgICB2ZXIubWlub3IgPSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTjsKKworICAgIHJldHVybih2ZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEgyNjRTd0RlY05leHRQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlciBpZiBhbnkgYXZhaWxhYmxlLgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZS4KKyAgICAgICAgICAgIGZsdXNoQnVmZmVyIGZvcmNlIG91dHB1dCBvZiBhbGwgYnVmZmVyZWQgcGljdHVyZXMKKworICAgICAgICBPdXRwdXQ6CisgICAgICAgICAgICBwT3V0cHV0ICAgICBwb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3R1cmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5CisgICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICBwaWN0dXJlIGF2YWlsYWJsZSBmb3IgZGlzcGxheQorICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0gyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0IGRlY0luc3QsCisgICAgSDI2NFN3RGVjUGljdHVyZSAqcE91dHB1dCwgdTMyIGZsdXNoQnVmZmVyKQoreworCisgICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OworICAgIHUzMiBudW1FcnJNYnMsIGlzSWRyUGljLCBwaWNJZDsKKyAgICB1MzIgKnBPdXRQaWM7CisKKyAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIik7CisKKyAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgRVJST1I6IGRlY0luc3Qgb3IgcE91dHB1dCBpcyBOVUxMIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKKyAgICB9CisKKyAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKKworI2lmZGVmIEgyNjRERUNfVFJBQ0UKKyAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNOZXh0UGljdHVyZSMgZGVjSW5zdCAlcCBwT3V0cHV0ICVwICVzICVkIiwKKyAgICAgICAgICAgIGRlY0luc3QsICh2b2lkKilwT3V0cHV0LCAiZmx1c2hCdWZmZXIiLCBmbHVzaEJ1ZmZlcik7CisgICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7CisjZW5kaWYKKworICAgIGlmIChmbHVzaEJ1ZmZlcikKKyAgICAgICAgaDI2NGJzZEZsdXNoQnVmZmVyKCZwRGVjQ29udC0+c3RvcmFnZSk7CisKKyAgICBwT3V0UGljID0gKHUzMiopaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlKCZwRGVjQ29udC0+c3RvcmFnZSwgJnBpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSWRyUGljLCAmbnVtRXJyTWJzKTsKKworICAgIGlmIChwT3V0UGljID09IE5VTEwpCisgICAgeworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIE9LOiByZXR1cm4gSDI2NFNXREVDX09LIik7CisgICAgICAgIHJldHVybihIMjY0U1dERUNfT0spOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwT3V0cHV0LT5wT3V0cHV0UGljdHVyZSA9IHBPdXRQaWM7CisgICAgICAgIHBPdXRwdXQtPnBpY0lkICAgICAgICAgID0gcGljSWQ7CisgICAgICAgIHBPdXRwdXQtPmlzSWRyUGljdHVyZSAgID0gaXNJZHJQaWM7CisgICAgICAgIHBPdXRwdXQtPm5ick9mRXJyTUJzICAgID0gbnVtRXJyTWJzOworICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIE9LOiByZXR1cm4gSDI2NFNXREVDX1BJQ19SRFkiKTsKKyAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QSUNfUkRZKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyMTcwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYwpAQCAtMCwwICsxLDUzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIENWUyB0YWcgbmFtZSBmb3IgaWRlbnRpZmljYXRpb24gKi8KK2NvbnN0IGNoYXIgdGFnTmFtZVsyNTZdID0gIiROYW1lOiBGSVJTVF9BTkRST0lEX0NPUFlSSUdIVCAkIjsKKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgREVCVUcoYXJndikgcHJpbnRmIGFyZ3YKKworLyogX05PX09VVCBkaXNhYmxlcyBvdXRwdXQgZmlsZSB3cml0aW5nICovCisjaWZkZWYgX19hcm0KKyNkZWZpbmUgX05PX09VVAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKTsKKwordTMyIENyb3BQaWN0dXJlKHU4ICpwT3V0SW1hZ2UsIHU4ICpwSW5JbWFnZSwKKyAgICB1MzIgcGljV2lkdGgsIHUzMiBwaWNIZWlnaHQsIENyb3BQYXJhbXMgKnBDcm9wUGFyYW1zKTsKKwordm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCisgICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEgyNjRTd0RlY0luc3QgZGVjSW5zdDsKKyAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKKyAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OworICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKKyAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87CisgICAgRklMRSAqZm91dHB1dDsKKyAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl07CisgICAgdTggKmJ5dGVTdHJtU3RhcnQ7CisgICAgdTMyIHBpY051bWJlcjsKK30gRGVjb2RlcjsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisgICAgaTMyIGluc3RDb3VudCwgaW5zdFJ1bm5pbmc7CisgICAgaTMyIGk7CisgICAgdTMyIG1heE51bVBpY3M7CisgICAgdTMyIHN0cm1MZW47CisgICAgSDI2NFN3RGVjUmV0IHJldDsKKyAgICB1MzIgbnVtRXJyb3JzID0gMDsKKyAgICB1MzIgY3JvcERpc3BsYXkgPSAwOworICAgIHUzMiBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDA7CisgICAgRklMRSAqZmlucHV0OworICAgIERlY29kZXIgKipkZWNvZGVyOworICAgIGNoYXIgb3V0RmlsZU5hbWVbMjU2XSA9ICJvdXQueXV2IjsKKworCisgICAgaWYgKCBhcmdjID4gMSAmJiBzdHJjbXAoYXJndlsxXSwgIi1UIikgPT0gMCApCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB0YWdOYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGFyZ2MgPCAyKQorICAgIHsKKyAgICAgICAgREVCVUcoKAorICAgICAgICAgICAgIlVzYWdlOiAlcyBbLU5uXSBbLU9vdXRmaWxlXSBbLVBdIFstVV0gWy1DXSBbLVJdIFstVF0gZmlsZTEuMjY0IFtmaWxlMi4yNjRdIC4uIFtmaWxlTi4yNjRdXG4iLAorICAgICAgICAgICAgYXJndlswXSkpOworICAgICAgICBERUJVRygoIlx0LU5uIGZvcmNlcyBkZWNvZGluZyB0byBzdG9wIGFmdGVyIG4gcGljdHVyZXNcbiIpKTsKKyNpZiBkZWZpbmVkKF9OT19PVVQpCisgICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgb3V0cHV0IHdyaXRpbmcgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7CisjZWxzZQorICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIHdyaXRlIG91dHB1dCB0byBcIm91dGZpbGVcIiAoZGVmYXVsdCBvdXQueXV2KVxuIikpOworICAgICAgICBERUJVRygoIlx0LU9ub25lIGRvZXMgbm90IHdyaXRlIG91dHB1dFxuIikpOworI2VuZGlmCisgICAgICAgIERFQlVHKCgiXHQtQyBkaXNwbGF5IGNyb3BwZWQgaW1hZ2UgKGRlZmF1bHQgZGVjb2RlZCBpbWFnZSlcbiIpKTsKKyAgICAgICAgREVCVUcoKCJcdC1SIGRpc2FibGUgRFBCIG91dHB1dCByZW9yZGVyaW5nXG4iKSk7CisgICAgICAgIERFQlVHKCgiXHQtVCB0byBwcmludCB0YWcgbmFtZSBhbmQgZXhpdFxuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgaW5zdENvdW50ID0gYXJnYyAtIDE7CisKKyAgICAvKiByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKyAgICBtYXhOdW1QaWNzID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgKGFyZ2MtMSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggc3RybmNtcChhcmd2W2ldLCAiLU4iLCAyKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4TnVtUGljcyA9ICh1MzIpYXRvaShhcmd2W2ldKzIpOworICAgICAgICAgICAgaW5zdENvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1PIiwgMikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweShvdXRGaWxlTmFtZSwgYXJndltpXSsyKTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyb3BEaXNwbGF5ID0gMTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1SIikgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nID0gMTsKKyAgICAgICAgICAgIGluc3RDb3VudC0tOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluc3RDb3VudCA8IDEpCisgICAgeworICAgICAgICBERUJVRygoIk5vIGlucHV0IGZpbGVzXG4iKSk7CisgICAgICAgIGV4aXQoMTAwKTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG11bHRpcGxlIGRlY29kZXIgaW5zdGFuY2VzCisgICAgICogb25lIGluc3RhbmNlIGZvciBldmVyeSBzdHJlYW0gZmlsZSAqLworICAgIGRlY29kZXIgPSAoRGVjb2RlciAqKiltYWxsb2Moc2l6ZW9mKERlY29kZXIqKSoodTMyKWluc3RDb3VudCk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOworICAgICAgICBleGl0KDEwMCk7CisgICAgfQorCisgICAgLyogcHJlcGFyZSBlYWNoIGRlY29kZXIgaW5zdGFuY2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCisgICAgeworICAgICAgICBkZWNvZGVyW2ldID0gKERlY29kZXIgKiljYWxsb2MoMSwgc2l6ZW9mKERlY29kZXIpKTsKKworICAgICAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KKyAgICAgICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLWluc3RDb3VudCtpXSwicmIiKTsKKyAgICAgICAgaWYgKGZpbnB1dCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgPCVzPlxuIiwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOworICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICB9CisKKyAgICAgICAgREVCVUcoKCJSZWFkaW5nIGlucHV0IGZpbGVbJWRdICVzXG4iLCBpLCBhcmd2W2FyZ2MtaW5zdENvdW50K2ldKSk7CisKKyAgICAgICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gdG8gYnVmZmVyICovCisgICAgICAgIGZzZWVrKGZpbnB1dCwwTCxTRUVLX0VORCk7CisgICAgICAgIHN0cm1MZW4gPSAodTMyKWZ0ZWxsKGZpbnB1dCk7CisgICAgICAgIHJld2luZChmaW5wdXQpOworICAgICAgICBkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID0gKHU4ICopbWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7CisgICAgICAgIGlmIChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIikpOworICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICB9CisgICAgICAgIGZyZWFkKGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQsIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7CisgICAgICAgIGZjbG9zZShmaW5wdXQpOworCisgICAgICAgIC8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KKyAgICAgICAgaWYgKHN0cmNtcChvdXRGaWxlTmFtZSwgIm5vbmUiKSAhPSAwKQorICAgICAgICB7CisjaWYgZGVmaW5lZChfTk9fT1VUKQorICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IE5VTEw7CisjZWxzZQorICAgICAgICAgICAgc3ByaW50ZihkZWNvZGVyW2ldLT5vdXRGaWxlTmFtZSwgIiVzJWkiLCBvdXRGaWxlTmFtZSwgaSk7CisgICAgICAgICAgICBkZWNvZGVyW2ldLT5mb3V0cHV0ID0gZm9wZW4oZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICJ3YiIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlXG4iKSk7CisgICAgICAgICAgICAgICAgZXhpdCgxMDApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICByZXQgPSBIMjY0U3dEZWNJbml0KCYoZGVjb2RlcltpXS0+ZGVjSW5zdCksIGRpc2FibGVPdXRwdXRSZW9yZGVyaW5nKTsKKworICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJJbml0IGZhaWxlZCAlZFxuIiwgcmV0KSk7CisgICAgICAgICAgICBleGl0KDEwMCk7CisgICAgICAgIH0KKworICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0gZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydDsKKyAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47CisgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOworCisgICAgfQorCisgICAgLyogbWFpbiBkZWNvZGluZyBsb29wICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGRlY29kZSBvbmNlIHVzaW5nIGVhY2ggaW5zdGFuY2UgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbnB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjT3V0cHV0KSk7CisKKyAgICAgICAgICAgIHN3aXRjaChyZXQpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWToKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wcGluZ0ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gQ3JvcHBpbmcgcGFyYW1zOiAoJWQsICVkKSAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wTGVmdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFdpZHRoICVkIEhlaWdodCAlZFxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ucGljV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY0hlaWdodCkpOworCisgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gdmlkZW9SYW5nZSAlZCwgbWF0cmljQ29lZmZpY2llbnRzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+ZGVjSW5mby52aWRlb1JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5tYXRyaXhDb2VmZmljaWVudHMpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiAtPQorICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNvZGVyW2ldLT5kZWNJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjUGljdHVyZSksIDApID09IEgyNjRTV0RFQ19QSUNfUkRZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5waWNOdW1iZXIrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgbnVtRXJyb3JzICs9IGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOworICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtYXhOdW1QaWNzICYmIGRlY29kZXJbaV0tPnBpY051bWJlciA9PSBtYXhOdW1QaWNzKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9FUlI6CisgICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUEFSQU1fRVJSOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIEZBVEFMIEVSUk9SXG4iLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgYW55IG9mIHRoZSBpbnN0YW5jZXMgaXMgc3RpbGwgcnVubmluZyAoPWhhcyBtb3JlIGRhdGEpICovCisgICAgICAgIGluc3RSdW5uaW5nID0gaW5zdENvdW50OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID09IDApCisgICAgICAgICAgICAgICAgaW5zdFJ1bm5pbmctLTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoaW5zdFJ1bm5pbmcpOworCisKKyAgICAvKiBnZXQgbGFzdCBmcmFtZXMgYW5kIGNsb3NlIGVhY2ggaW5zdGFuY2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5zdENvdW50OyBpKyspCisgICAgeworICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKKyAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAxKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7CisKKyAgICAgICAgICAgIERFQlVHKCgiRGVjb2RlclslZF0gUElDICVkLCB0eXBlICVzLCBjb25jZWFsZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgaSwgZGVjb2RlcltpXS0+cGljTnVtYmVyLAorICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlCisgICAgICAgICAgICAgICAgICAgID8gIklEUiIgOiAiTk9OLUlEUiIsCisgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgIENyb3BXcml0ZU91dHB1dChkZWNvZGVyW2ldLT5mb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAodTgqKWRlY29kZXJbaV0tPmRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgIGNyb3BEaXNwbGF5LCAmKGRlY29kZXJbaV0tPmRlY0luZm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjb2RlcltpXS0+ZGVjSW5zdCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJbaV0tPmZvdXRwdXQpCisgICAgICAgICAgICBmY2xvc2UoZGVjb2RlcltpXS0+Zm91dHB1dCk7CisKKyAgICAgICAgZnJlZShkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0KTsKKworICAgICAgICBmcmVlKGRlY29kZXJbaV0pOworICAgIH0KKworICAgIGZyZWUoZGVjb2Rlcik7CisKKyAgICBpZiAobnVtRXJyb3JzKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIENyb3BXcml0ZU91dHB1dChGSUxFICpmb3V0cHV0LCB1OCAqaW1hZ2VEYXRhLCB1MzIgY3JvcERpc3BsYXksCisgICAgICAgIEgyNjRTd0RlY0luZm8gKmRlY0luZm8pCit7CisgICAgdTggKnRtcEltYWdlID0gTlVMTDsKKyAgICB1MzIgdG1wLCBwaWNTaXplOworCisgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8tPmNyb3BwaW5nRmxhZykKKyAgICB7CisgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCAqCisgICAgICAgICAgICAgICAgICBkZWNJbmZvLT5jcm9wUGFyYW1zLmNyb3BPdXRIZWlnaHQ7CisgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7CisgICAgICAgIHRtcEltYWdlID0gbWFsbG9jKHBpY1NpemUpOworICAgICAgICBpZiAodG1wSW1hZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCisgICAgICAgICAgICBkZWNJbmZvLT5waWNXaWR0aCwgZGVjSW5mby0+cGljSGVpZ2h0LAorICAgICAgICAgICAgJihkZWNJbmZvLT5jcm9wUGFyYW1zKSk7CisgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCB0bXBJbWFnZSwgcGljU2l6ZSk7CisgICAgICAgIGZyZWUodG1wSW1hZ2UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+cGljV2lkdGggKiBkZWNJbmZvLT5waWNIZWlnaHQ7CisgICAgICAgIHBpY1NpemUgPSAoMyAqIHBpY1NpemUpLzI7CisgICAgICAgIFdyaXRlT3V0cHV0KGZvdXRwdXQsIGltYWdlRGF0YSwgcGljU2l6ZSk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmRhdGEsIHUzMiBwaWNTaXplKQoreworICAgIGlmIChmaWQpCisgICAgICAgIGZ3cml0ZShkYXRhLCAxLCBwaWNTaXplLCBmaWQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY1RyYWNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykKK3sKKyAgICBGSUxFICpmcDsKKworICAgIGZwID0gZm9wZW4oImRlY19hcGkudHJjIiwgImF0Iik7CisKKyAgICBpZiAoIWZwKQorICAgICAgICByZXR1cm47CisKKyAgICBmd3JpdGUoc3RyaW5nLCAxLCBzdHJsZW4oc3RyaW5nKSwgZnApOworICAgIGZ3cml0ZSgiXG4iLCAxLDEsIGZwKTsKKworICAgIGZjbG9zZShmcCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjbWFsbG9jCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpCit7CisgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNGcmVlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KQoreworICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1zZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCit7CisgICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IENyb3BQaWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAorICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCit7CisKKyAgICB1MzIgaSwgajsKKyAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKKyAgICB1OCAqcE91dCwgKnBJbjsKKworICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKKyAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCisgICAgeworICAgICAgICAvKiBkdWUgdG8gbGludCB3YXJuaW5nICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+CisgICAgICAgICAgIHBpY1dpZHRoICkgfHwKKyAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgorICAgICAgICAgICBwaWNIZWlnaHQgKSApCisgICAgeworICAgICAgICAvKiBkdWUgdG8gbGludCB3YXJuaW5nICovCisgICAgICAgIGZyZWUocE91dEltYWdlKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKKyAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKKworICAgIHBJbiA9IHBJbkltYWdlICsgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGggKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQ7CisgICAgcE91dCA9IHBPdXRJbWFnZTsKKworICAgIC8qIGx1bWEgKi8KKyAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7CisgICAgICAgIH0KKyAgICAgICAgcEluICs9IHBpY1dpZHRoIC0gb3V0V2lkdGg7CisgICAgfQorCisgICAgb3V0V2lkdGggPj49IDE7CisgICAgb3V0SGVpZ2h0ID4+PSAxOworCisgICAgcEluID0gcEluSW1hZ2UgKyBwaWNXaWR0aCpwaWNIZWlnaHQgKworICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7CisKKyAgICAvKiBjYiAqLworICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKKyAgICAgICAgfQorICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOworICAgIH0KKworICAgIHBJbiA9IHBJbkltYWdlICsgNSpwaWNXaWR0aCpwaWNIZWlnaHQvNCArCisgICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKKworICAgIC8qIGNyICovCisgICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOworICAgICAgICB9CisgICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7CisgICAgfQorCisgICAgcmV0dXJuICgwKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzNGE0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucwpAQCAtMCwwICsxLDI5OCBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGICA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorcHRyQSAgICBSTiAwCisKK21iICAgICAgUk4gMQorYmxvY2sgICBSTiAxCisKK3gwICAgICAgUk4gMgorY291bnQgICBSTiAyCisKK3kwICAgICAgUk4gMwordmFsWCAgICBSTiAzCisKK3dpZHRoICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3RtcDcgICAgUk4gNQorCitjaHJQVyAgIFJOIDYKK3RtcDggICAgUk4gNgorCit0bXAxICAgIFJOIDcKK2NoclBIICAgUk4gNworCit0bXAyICAgIFJOIDgKKwordG1wMyAgICBSTiA5CisKK3RtcDQgICAgUk4gMTAKKwordG1wNSAgICBSTiAxMQorCit0bXA2ICAgIFJOIDEyCisKK2MzMiAgICAgUk4gMTQKK3hGcmFjICAgUk4gMTQKKworOy8vIEZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKKworOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKKzsvLworOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKKzsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Cis7Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYworOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKKzsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Cis7Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYworOy8vICB1MzIgeEZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCis7Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDQKKzsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwOAorCitoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKKworICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA0XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAorICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwKKworICAgIEFERCAgICAgdG1wNiwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDYgPSB4MCsgY2hyb21hUGFydFdpZHRoCisgICAgQUREICAgICB0bXA2LCB0bXA2LCAjMSAgICAgICAgICA7Ly8gdG1wNiA9IHgwICsgY2hyb21hUGFydFdpZHRoICsgMQorICAgIENNUCAgICAgdG1wNiwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wNiwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDYgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKKyAgICBDTVAgICAgIHRtcDYsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXA4LCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wOCA9IGNocm9tYVBhcnRXaWR0aCsxCisgICAgTU9WICAgICB0bXAyLCB0bXA4ICAgICAgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRXaWR0aCsxCisgICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDgsY2hyUEgsdG1wMn0KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBNTEEgICAgIHJlZiwgaGVpZ2h0LCB3aWR0aCwgcmVmIDsvLyByZWYgKz0gd2lkdGggKiBoZWlnaHQ7IAorICAgIE1MQSAgICAgYmxvY2ssIGNoclBILCB0bXA4LCBibG9jazsvLyBibG9jayArIChjaHJvbWFQSCkqKGNocm9tYVBXKzEpCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQorICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCisgICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKKyAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKworICAgIFNUUiAgICAgY2hyUEgsIFtzcCwgIzB4ZmNdICAgICAgOy8vIGhlaWdodAorICAgIFNUUiAgICAgdG1wOCwgW3NwLCAjMHhmOF0gICAgICAgOy8vIHdpZHRoCisgICAgTU9WICAgICB3aWR0aCwgdG1wOAorICAgIFNVQiAgICAgY2hyUFcsIGNoclBXLCAjMQorCitza2lwX2ZpbGwKKyAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKKyAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB4RnJhYworICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAorICAgIFJTQiAgICAgdmFsWCwgeEZyYWMsICM4ICAgICAgICAgOy8vIHZhbFggPSA4LXhGcmFjCisKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKGNocm9tYVBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAoY2hyb21hUGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIGNocm9tYVBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gY2hyb21hUGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gbm90aGluZworCisgICAgU1VCICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIFNVQiAgICAgdG1wMSwgY2hyUFcsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2IDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMyNCA7Ly8gbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIGxvb3BfeAorICAgIFBLSEJUICAgdmFsWCwgdmFsWCwgeEZyYWMsIExTTCAjMTYgIDsvLyB8eEZyYWN8dmFsWCB8CisgICAgTU9WICAgICB2YWxYLCB2YWxYLCBMU0wgIzMgICAgICAgICAgOy8vIG11bHRpcGx5IGJ5IDggaW4gYWR2YW5jZQorICAgIE1PViAgICAgYzMyLCAjMzIKKworCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIDsvLyBDYgorICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KKworbG9vcDFfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKKworbG9vcDFfeAorICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCAjMQorCisgICAgUEtIQlQgICB0bXA1LCB0bXAxLCB0bXAzLCBMU0wgIzE2CisgICAgUEtIQlQgICB0bXA2LCB0bXAyLCB0bXA0LCBMU0wgIzE2CisKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBXSwgIzEKKworICAgIFNNTEFEICAgdG1wNSwgdG1wNSwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wNiwgdG1wNiwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgUEtIQlQgICB0bXA3LCB0bXAzLCB0bXAxLCBMU0wgIzE2CisgICAgUEtIQlQgICB0bXA4LCB0bXA0LCB0bXAyLCBMU0wgIzE2CisKKyAgICBTTUxBRCAgIHRtcDcsIHRtcDcsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDgsIHRtcDgsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA1LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAxCisKKyAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQorCisgICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKKworICAgIE1PViAgICAgdG1wOCwgdG1wOCwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA4LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMV94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisgICAgU1VCICAgICBwdHJBLCBwdHJBLCAjMQorCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMweEUgPDwgMjQKKyAgICBCR0UgICAgIGxvb3AxX3kKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ3IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCisgICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCisgICAgQUREICAgICBtYiwgbWIsICM2NAorCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4CisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KK2xvb3AyX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4CisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKK2xvb3AyX3gKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKKworICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgorICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgorCisgICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCisKKyAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKyAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKKworICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgorICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgorCisgICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKKworICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCisKKyAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAorICAgIEJDUyAgICAgbG9vcDJfeAorCisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIEFERFMgICAgbWIsIG1iLCAjMTYKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAorICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQorICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAorICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0CisgICAgQkdFICAgICBsb29wMl95CisKKyAgICBBREQgICAgIHNwLHNwLCMweGQ0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEscGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvcl92ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDIwYWQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCkBAIC0wLDAgKzEsMzM5IEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIgCis7LS0gICAgICAgICAgICBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKK3B0ckEgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2Jsb2NrICAgUk4gMQorCit4MCAgICAgIFJOIDIKK2NvdW50ICAgUk4gMgorCit5MCAgICAgIFJOIDMKK3ZhbFkgICAgUk4gMworCit3aWR0aCAgIFJOIDQKKwordG1wNCAgICBSTiA1CitoZWlnaHQgIFJOIDUKKwordG1wMSAgICBSTiA2CisKK3RtcDIgICAgUk4gNworCit0bXAzICAgIFJOIDgKKwordmFsWCAgICBSTiA5CisKK3RtcDUgICAgUk4gMTAKK2NoclBXICAgUk4gMTAKKwordG1wNiAgICBSTiAxMQorY2hyUEggICBSTiAxMQorCit4RnJhYyAgIFJOIDEyCisKK2MzMiAgICAgUk4gMTQKK3lGcmFjICAgUk4gMTQKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKKworOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKKzsvLworOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKKzsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Cis7Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYworOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKKzsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Cis7Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYworOy8vICB1MzIgeEZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCis7Ly8gIHUzMiB5RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDQKKzsvLyAgdTMyIGNocm9tYVBhcnRXaWR0aCwgICAgICAgOiAweDEwOAorOy8vICB1MzIgY2hyb21hUGFydEhlaWdodCAgICAgICA6IDB4MTBjCisKK2gyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHhjNAorCisgICAgTERSICAgICBjaHJQVywgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydFdpZHRoCisgICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsCisKKyAgICBBREQgICAgIHRtcDEsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXAxID0geDArIGNocm9tYVBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wMSwgdG1wMSwgIzEgICAgICAgICAgOy8vIHRtcDEgPSB4MCsgY2hyb21hUGFydFdpZHRoKzEKKyAgICBDTVAgICAgIHRtcDEsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCisgICAgQkhJICAgICBkb19maWxsCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTBjXSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHkwICsgY2hyb21hUGFydEhlaWdodCArIDEKKyAgICBDTVAgICAgIHRtcDEsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIGNoclBILCBbc3AsICMweDEwY10gICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwgIzB4ZmNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXAzLCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wMyA9IGNocm9tYVBhcnRXaWR0aCsxCisgICAgQUREICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICA7Ly8gdG1wMSA9IGNocm9tYVBhcnRXaWR0aCsxCisgICAgQUREICAgICB0bXAyLCBjaHJQSCwgIzEgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRIZWlnaHQrMQorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXAxLHRtcDIsdG1wM30KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTERSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBMRFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXAxLHRtcDIsdG1wM30KKyAgICBBREQgICAgIGJsb2NrLCBzcCwgIzB4MWMgICAgICAgIDsvLyBibG9jaworICAgIE1MQSAgICAgcmVmLCBoZWlnaHQsIHdpZHRoLCByZWYgOy8vIHJlZiArPSB3aWR0aCAqIGhlaWdodDsgCisgICAgTUxBICAgICBibG9jaywgdG1wMiwgdG1wMSwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUFcrMSkqKGNocm9tYVBIKzEpCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB4MCA9IDAKKyAgICBNT1YgICAgIHkwLCAjMCAgICAgICAgICAgICAgICAgIDsvLyB5MCA9IDAKKyAgICBTVFIgICAgIHgwLCBbc3AsICMweGNjXQorICAgIFNUUiAgICAgeTAsIFtzcCwgIzB4ZDBdCisgICAgQUREICAgICByZWYsIHNwLCAjMHgxYyAgICAgICAgICA7Ly8gcmVmID0gYmxvY2sKKyAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKworICAgIFNUUiAgICAgdG1wMiwgW3NwLCAjMHhmY10gICAgICAgOy8vIGhlaWdodAorICAgIFNUUiAgICAgdG1wMSwgW3NwLCAjMHhmOF0gICAgICAgOy8vIHdpZHRoCisgICAgTU9WICAgICB3aWR0aCwgdG1wMQorCitza2lwX2ZpbGwKKyAgICBNTEEgICAgIHRtcDMsIHkwLCB3aWR0aCwgeDAgICAgIDsvLyB0bXAzID0geTAqd2lkdGgreDAKKyAgICBMRFIgICAgIHlGcmFjLCBbc3AsICMweDEwNF0gICAgIDsvLyB5RnJhYworICAgIExEUiAgICAgeEZyYWMsIFtzcCwgIzB4MTAwXQorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzICAgICAgICAgOy8vIHB0ckEgPSByZWYgKyB5MCp3aWR0aCt4MAorICAgIFJTQiAgICAgdmFsWCwgeEZyYWMsICM4ICAgICAgICAgOy8vIHZhbFggPSA4LXhGcmFjCisgICAgUlNCICAgICB2YWxZLCB5RnJhYywgIzggICAgICAgICA7Ly8gdmFsWSA9IDgteUZyYWMKKworICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAoY2hyb21hUGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChjaHJvbWFQYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gY2hyb21hUGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSBub3RoaW5nCisKKyAgICBTVUIgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydEhlaWdodC0xCisgICAgU1VCICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzI0IDsvLyBsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyMCA7Ly8gY2hyb21hUGFydFdpZHRoLTEKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gbG9vcF94CisgICAgUEtIQlQgICB2YWxZLCB2YWxZLCB5RnJhYywgTFNMICMxNiAgOy8vIHx5RnJhY3x2YWxZIHwKKyAgICBNT1YgICAgIGMzMiwgIzMyCisKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ2IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgorICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCisKK2xvb3AxX3kKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBXQorICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQorICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAorICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8CisKKyAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKKyAgICBTTVVBRCAgIHRtcDMsIHRtcDMsIHZhbFkgICAgICAgICAgICA7Ly8gdDM9KHQzKnZhbFkgKyB0NSp5RnJhYykKKworICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzgKK2xvb3AxX3gKKyAgICA7Ly8gZmlyc3QKKyAgICBMRFJCICAgIHRtcDIsIFtwdHJBLCAjMV0hCisgICAgTERSQiAgICB0bXA0LCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA2LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMxNiAgIDsvLyB8dDR8dDJ8CisgICAgUEtIQlQgICB0bXA0LCB0bXA0LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHx0Nnx0NHwKKworICAgIFNNVUFEICAgdG1wMiwgdG1wMiwgdmFsWSAgICAgICAgICAgIDsvLyB0Mj0odDIqdmFsWSArIHQ0KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNSwgdG1wMSwgdmFsWCwgYzMyICAgICAgIDsvLyB0NT10MSp2YWxYKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB4RnJhYywgdG1wNSAgICAgOy8vIHQ1PXQyKnhGcmFjK3Q1CisKKyAgICBTTVVBRCAgIHRtcDQsIHRtcDQsIHZhbFkgICAgICAgICAgICA7Ly8gdDQ9KHQ0KnZhbFkgKyB0Nip5RnJhYykKKyAgICBNTEEgICAgIHRtcDYsIHRtcDMsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDM9dDMqdmFsWCszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgeEZyYWMsIHRtcDYgICAgIDsvLyB0Nj10NCp4RnJhYyt0NgorCisgICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDYsIFttYiwgIzhdICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwgIzEgICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorCisgICAgOy8vIHNlY29uZAorICAgIExEUkIgICAgdG1wMSwgW3B0ckEsICMxXSEKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKKyAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAorCisgICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCisgICAgTUxBICAgICB0bXA1LCB0bXAxLCB4RnJhYywgYzMyICAgICAgOy8vIHQxPXQxKnhGcmFjKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB2YWxYLCB0bXA1ICAgICAgOy8vIHQ1PXQyKnZhbFgrdDUKKworICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNiwgdG1wMywgeEZyYWMsIGMzMiAgICAgIDsvLyB0Mz10Myp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgdmFsWCwgdG1wNiAgICAgIDsvLyB0Nj10NCp2YWxYK3Q2CisKKyAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMV94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDFfeQorCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIDsvLyBDcgorICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweGZjXSAgICAgICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICAgICAgOy8vIHJlZgorICAgIExEUiAgICAgdG1wMSwgW3NwLCAjMHhkMF0gICAgICAgICAgIDsvLyB5MAorICAgIExEUiAgICAgdG1wMiwgW3NwLCAjMHhjY10gICAgICAgICAgIDsvLyB4MAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgICAgIDsvLyBwcmVkUGFydENocm9tYQorCisgICAgQUREICAgICB0bXAxLCBoZWlnaHQsIHRtcDEKKyAgICBNTEEgICAgIHRtcDMsIHRtcDEsIHdpZHRoLCB0bXAyCisgICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMKKyAgICBBREQgICAgIG1iLCBtYiwgIzY0CisKKyAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMAorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorbG9vcDJfeQorICAgIExEUkIgICAgdG1wMSwgW3B0ckFdCisgICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8CisgICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKKworICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQorICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQorCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorbG9vcDJfeAorICAgIDsvLyBmaXJzdAorICAgIExEUkIgICAgdG1wMiwgW3B0ckEsICMxXSEKKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDYsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIzE2ICAgOy8vIHx0NHx0MnwKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjMTYgICA7Ly8gfHQ2fHQ0fAorCisgICAgU01VQUQgICB0bXAyLCB0bXAyLCB2YWxZICAgICAgICAgICAgOy8vIHQyPSh0Mip2YWxZICsgdDQqeUZyYWMpCisgICAgTUxBICAgICB0bXA1LCB0bXAxLCB2YWxYLCBjMzIgICAgICAgOy8vIHQ1PXQxKnZhbFgrMzIKKyAgICBNTEEgICAgIHRtcDUsIHRtcDIsIHhGcmFjLCB0bXA1ICAgICA7Ly8gdDU9dDIqeEZyYWMrdDUKKworICAgIFNNVUFEICAgdG1wNCwgdG1wNCwgdmFsWSAgICAgICAgICAgIDsvLyB0ND0odDQqdmFsWSArIHQ2KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNiwgdG1wMywgdmFsWCwgYzMyICAgICAgIDsvLyB0Mz10Myp2YWxYKzMyCisgICAgTUxBICAgICB0bXA2LCB0bXA0LCB4RnJhYywgdG1wNiAgICAgOy8vIHQ2PXQ0KnhGcmFjK3Q2CisKKyAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisKKyAgICA7Ly8gc2Vjb25kIAorICAgIExEUkIgICAgdG1wMSwgW3B0ckEsICMxXSEKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQorCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKKyAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAorCisgICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCisgICAgTUxBICAgICB0bXA1LCB0bXAxLCB4RnJhYywgYzMyICAgICAgOy8vIHQxPXQxKnhGcmFjKzMyCisgICAgTUxBICAgICB0bXA1LCB0bXAyLCB2YWxYLCB0bXA1ICAgICAgOy8vIHQ1PXQyKnZhbFgrdDUKKworICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQorICAgIE1MQSAgICAgdG1wNiwgdG1wMywgeEZyYWMsIGMzMiAgICAgIDsvLyB0Mz10Myp4RnJhYyszMgorICAgIE1MQSAgICAgdG1wNiwgdG1wNCwgdmFsWCwgdG1wNiAgICAgIDsvLyB0Nj10NCp2YWxYK3Q2CisKKyAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAorICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMl94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDJfeQorCisgICAgQUREICAgICBzcCxzcCwjMHhkNAorICAgIExETUZEICAgc3AhLHtyNC1yMTEscGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWY5ZGYxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX3Zlci5zCkBAIC0wLDAgKzEsMjg4IEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCitwdHJBICAgIFJOIDAKKworbWIgICAgICBSTiAxCitibG9jayAgIFJOIDEKKworeDAgICAgICBSTiAyCitjb3VudCAgIFJOIDIKKworeTAgICAgICBSTiAzCit2YWxZICAgIFJOIDMKKword2lkdGggICBSTiA0CisKK2hlaWdodCAgUk4gNQordG1wNyAgICBSTiA1CisKK2NoclBXICAgUk4gNgordG1wOCAgICBSTiA2CisKK3RtcDEgICAgUk4gNworCit0bXAyICAgIFJOIDgKKwordG1wMyAgICBSTiA5CisKK3RtcDQgICAgUk4gMTAKKwordG1wNSAgICBSTiAxMQorY2hyUEggICBSTiAxMQorCit0bXA2ICAgIFJOIDEyCisKK2MzMiAgICAgUk4gMTQKK3lGcmFjICAgUk4gMTQKKworOy8vIEZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKKworOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKKzsvLworOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKKzsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Cis7Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYworOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKKzsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Cis7Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYworOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCis7Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDQKKzsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwOAorCitoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKKworICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA0XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAorICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwKKworICAgIEFERCAgICAgdG1wMSwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDEgPSB4MCsgY2hyb21hUGFydFdpZHRoCisgICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsCisgICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wMSwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0ICsgMQorICAgIENNUCAgICAgdG1wMSwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwKKworZG9fZmlsbAorICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKKyAgICBBREQgICAgIHRtcDEsIGNoclBILCAjMSAgICAgICAgIDsvLyB0bXAxID0gY2hyb21hUGFydEhlaWdodCsxCisgICAgTU9WICAgICB0bXAyLCBjaHJQVyAgICAgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRXaWR0aAorICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCxjaHJQVyx0bXAxLHRtcDJ9CisgICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCisgICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KKyAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKKyAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQorICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCisgICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKKyAgICBNTEEgICAgIGJsb2NrLCBjaHJQVywgdG1wMSwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUFcpKihjaHJvbWFQSCsxKQorICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCisgICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCisgICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KKyAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQorICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCisgICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCisKKyAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKKyAgICBTVFIgICAgIGNoclBXLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAorICAgIE1PViAgICAgd2lkdGgsIGNoclBXCisKK3NraXBfZmlsbAorICAgIE1MQSAgICAgdG1wMywgeTAsIHdpZHRoLCB4MCAgICAgOy8vIHRtcDMgPSB5MCp3aWR0aCt4MAorICAgIExEUiAgICAgeUZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHlGcmFjCisgICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMgICAgICAgICA7Ly8gcHRyQSA9IHJlZiArIHkwKndpZHRoK3gwCisgICAgUlNCICAgICB2YWxZLCB5RnJhYywgIzggICAgICAgICA7Ly8gdmFsWSA9IDgteUZyYWMKKworICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCisKKworICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgorICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAoY2hyb21hUGFydFdpZHRoLTEpCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChjaHJvbWFQYXJ0SGVpZ2h0LTEpCisgICAgOy8vIFsyMzoyMF0gY2hyb21hUGFydFdpZHRoLTEKKyAgICA7Ly8gWzE5OjE2XSBjaHJvbWFQYXJ0SGVpZ2h0LTEKKyAgICA7Ly8gWzE1OjAwXSBub3RoaW5nCisKKyAgICBTVUIgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydEhlaWdodC0xCisgICAgU1VCICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzI0IDsvLyBsb29wX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyMCA7Ly8gY2hyb21hUGFydFdpZHRoLTEKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gbG9vcF94CisgICAgUEtIQlQgICB2YWxZLCB2YWxZLCB5RnJhYywgTFNMICMxNiAgOy8vIHx5RnJhY3x2YWxZIHwKKyAgICBNT1YgICAgIHZhbFksIHZhbFksIExTTCAjMyAgICAgICAgICA7Ly8gbXVsdGlwbHkgYnkgOCBpbiBhZHZhbmNlCisgICAgTU9WICAgICBjMzIsICMzMgorCisKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgOy8vIENiCisgICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgorCitsb29wMV95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAorbG9vcDFfeAorICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jaworICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKKyAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCisgICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAorCisgICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAorICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKKyAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCisKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKKworICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAorICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQorCisgICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQorCisgICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KKyAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgorCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4CisgICAgQkNTICAgICBsb29wMV94CisKKyAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAorCisgICAgQUREUyAgICBtYiwgbWIsICMxNgorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCisgICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCisgICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAorICAgIEJHRSAgICAgbG9vcDFfeSAKKworICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICA7Ly8gQ3IKKyAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAorICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKKyAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKKworICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCisgICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgorICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCisgICAgQUREICAgICBtYiwgbWIsICM2NAorCisgICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4CisgICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKKworICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KK2xvb3AyX3kKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Citsb29wMl94CisgICAgOy8vIFByb2Nlc3MgMngyIGJsb2NrCisgICAgTERSQiAgICB0bXAyLCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAxIGNvbAorICAgIExEUkIgICAgdG1wMywgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMSBjb2wKKyAgICBMRFJCICAgIHRtcDEsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDEgY29sCisKKyAgICBMRFJCICAgIHRtcDUsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDIgY29sCisgICAgTERSQiAgICB0bXA2LCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAyIGNvbAorICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMiBjb2wKKworICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICMxNiAgIDsvLyB8QnxBfAorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wMywgTFNMICMxNiAgIDsvLyB8Q3xCfAorICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICMxNiAgIDsvLyB8QnxBfAorCisgICAgU01MQUQgICB0bXA3LCB0bXAyLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHxDfEJ8CisgICAgU01MQUQgICB0bXAyLCB0bXAxLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA4LCB0bXA1LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisgICAgU01MQUQgICB0bXA1LCB0bXA0LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5CisKKyAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQorICAgIE1PViAgICAgdG1wMiwgdG1wMiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXAyLCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCisKKyAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgorICAgIFNUUkIgICAgdG1wOCwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgorICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCisgICAgU1RSQiAgICB0bXA1LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCisKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKKyAgICBCQ1MgICAgIGxvb3AyX3gKKworICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCisKKyAgICBBRERTICAgIG1iLCBtYiwgIzE2CisgICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKKyAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKKyAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0CisgICAgQkdFICAgICBsb29wMl95CisKKyAgICBBREQgICAgIHNwLHNwLCMweGQ0CisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEscGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Mzk2OGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCkBAIC0wLDAgKzEsMjUxIEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKKworbWIgICAgICBSTiAxCitidWZmICAgIFJOIDEKKworY291bnQgICBSTiAyCit4MCAgICAgIFJOIDIKKworeTAgICAgICBSTiAzCit4XzJfMCAgIFJOIDMKKword2lkdGggICBSTiA0Cit4XzNfMSAgIFJOIDQKKworaGVpZ2h0ICBSTiA1Cit4XzZfNCAgIFJOIDUKKworcGFydFcgICBSTiA2Cit4XzdfNSAgIFJOIDYKKworcGFydEggICBSTiA3Cit0bXAxICAgIFJOIDcKKwordG1wMiAgICBSTiA4CisKK3RtcDMgICAgUk4gOQorCit0bXA0ICAgIFJOIDEwCisKK211bHRfMjBfMDEgIFJOIDExCittdWx0XzIwX201ICBSTiAxMgorCitwbHVzMTYgIFJOIDE0CisKKworOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKKworICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jaworCisgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCisKKzsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAorOy8vCis7Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCis7Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KKzsvLworOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCis7Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KKzsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCis7Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQorOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKKzsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQorCisKK2gyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgQUREICAgICB0bXA0LCB0bXA0LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRXKzUpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDQsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDIsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDIsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgQUREICAgICB0bXA0LCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wNCA9IHBhcnRXICsgNTsKKyAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXA0fSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKKyAgICBTVFIgICAgIHBhcnRILCBbc3AsIzB4Y10gICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodAorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQorCisKK3NraXBfZmlsbAorICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIE1MQSAgICAgdG1wMiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgorCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIHdpZHRoCisgICAgTU9WICAgICBjb3VudCwgd2lkdGgKKyAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7CisgICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOworICAgIEFERCAgICAgdG1wMiwgcGFydEgsIHBhcnRXLCBMU0wgIzQKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNgorCisKKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQorICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCCisgICAgTU9WICAgICBwbHVzMTYsICMxNgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Citsb29wX3kKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjOAorICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorCitsb29wX3gKKyAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMgorICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMgorICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDEKKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDIKKyAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzCisgICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNAorCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCisgICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgorICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKKyAgICBCQ0MgICAgIG5leHRfeQorCisgICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAorCisgICAgU01MQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2CisgICAgU01MQVRCICB0bXAyLCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2CisgICAgU01MQVRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKKyAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxCisgICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMworICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDIKKyAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0CisKKyAgICBTTUxBQkIgIHRtcDEsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAxCisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKKyAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyCisgICAgU01MQURYICB0bXAzLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMworICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQKKworICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1CisgICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKKyAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCisgICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQorICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKKyAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKyAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0CisgICAgQkNTICAgICBsb29wX3gKKworbmV4dF95CisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCisgICAgU01MQUJCICByZWYsIGNvdW50LCBtdWx0XzIwXzAxLCByZWYgOy8vICt3aWR0aAorICAgIEFERFMgICAgbWIsIG1iLCAjMTYgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wMywgTFNSICMyMCAgICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQorICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDMsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyNCkKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlMjQzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9xdWFydGVyLnMKQEAgLTAsMCArMSwyNzMgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzsKKzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Cis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Cis7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7LS0KKzstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIgZnVuY3Rpb24KKzstLQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KKyAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQorICAgIEVMU0UKKyAgICAgICAgUkVRVUlSRTgKKyAgICAgICAgUFJFU0VSVkU4CisgICAgRU5ESUYKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCis7Ly8gaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlciByZWdpc3RlciBhbGxvY2F0aW9uCisKK3JlZiAgICAgUk4gMAorCittYiAgICAgIFJOIDEKK2J1ZmYgICAgUk4gMQorCitjb3VudCAgIFJOIDIKK3gwICAgICAgUk4gMgorCit5MCAgICAgIFJOIDMKK3hfMl8wICAgUk4gMworCit3aWR0aCAgIFJOIDQKK3hfM18xICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3hfNl80ICAgUk4gNQorCitwYXJ0VyAgIFJOIDYKK3hfN181ICAgUk4gNgorCitwYXJ0SCAgIFJOIDcKK3RtcDEgICAgUk4gNworCit0bXAyICAgIFJOIDgKKwordG1wMyAgICBSTiA5CisKK3RtcDQgICAgUk4gMTAKKworbXVsdF8yMF8wMSAgUk4gMTEKKworbXVsdF8yMF9tNSAgUk4gMTIKKworcGx1czE2ICBSTiAxNAorCisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcgorCisKKzsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaAorOy8vCis7Ly8gQmFzaWMgaWRlYSBpbiBob3Jpem9udGFsIGZpbHRlcmluZyBpcyB0byBhZGp1c3QgY29lZmZpY2llbnRzCis7Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4KKzsvLworOy8vIFJlZyAgICAgeF8yXzAgICAgIHhfM18xICAgICB4XzZfNCAgICAgeF83XzUgICAgIHhfMl8wCis7Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4KKzsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxCis7Ly8geV8xID0gICAtNSAgICAgICAgMjAgIDEgICAgICAxIDIwICAgICAgICAtNQorOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjAKKzsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQorCisKK2gyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIKKyAgICBTVE1GRCAgIHNwISwge3IwLXIxMSwgbHJ9CisgICAgU1VCICAgICBzcCwgc3AsICMweDFlNAorCisgICAgQ01QICAgICB4MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDAgPCAwKQorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIEFERCAgICAgdG1wNCwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgQUREICAgICB0bXA0LCB0bXA0LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRXKzUpCisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBDTVAgICAgIHRtcDQsIHdpZHRoCisgICAgQkhJICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwK3BhcnRXKT53aWR0aAorCisgICAgQ01QICAgICB5MCwgIzAKKyAgICBCTFQgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeTAgPCAwKQorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDIsIHkwLCBwYXJ0SCAgICAgICAgIDsvLyAoeTArcGFydEhlaWdodCkKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBDTVAgICAgIHRtcDIsIGhlaWdodAorICAgIEJMUyAgICAgc2tpcF9maWxsICAgICAgICAgICAgICAgOy8vIG5vIG92ZXJmaWxsIG5lZWRlZAorCisKK2RvX2ZpbGwKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgQUREICAgICB0bXA0LCBwYXJ0VywgIzUgICAgICAgICA7Ly8gdG1wNCA9IHBhcnRXICsgNTsKKyAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCB0bXA0fSAgICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoKzUKKyAgICBTVFIgICAgIHBhcnRILCBbc3AsIzB4Y10gICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodAorICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDEwXSAgICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoKzUKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQorCisKK3NraXBfZmlsbAorICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIE1MQSAgICAgdG1wMiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgIzggICAgICAgICAgICA7Ly8gcmVmID0gcmVmKzgKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgorCisgICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkKKyAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKHBhcnRIZWlnaHQtMSkKKyAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQorICAgIDsvLyBbMTU6MDBdIHdpZHRoCisgICAgTU9WICAgICBjb3VudCwgd2lkdGgKKyAgICBTVUIgICAgIHBhcnRXLCBwYXJ0VywgIzE7CisgICAgU1VCICAgICBwYXJ0SCwgcGFydEgsICMxOworICAgIEFERCAgICAgdG1wMiwgcGFydEgsIHBhcnRXLCBMU0wgIzQKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNgorCisKKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQorICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCCisgICAgTU9WICAgICBwbHVzMTYsICMxNgorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Citsb29wX3kKKyAgICBMRFIgICAgIHhfM18xLCBbcmVmLCAjLThdCisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjOAorICAgIExEUiAgICAgeF83XzUsIFtyZWYsICMtNF0KKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKyAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQorCitsb29wX3gKKyAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDMsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMgorICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDEKKyAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzCisgICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMgorICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQKKworICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDEKKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFNNTEFCQiAgdG1wMiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDIKKyAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzCisgICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNAorCisgICAgTU9WICAgICB0bXAyLCB0bXAyLCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDEsIHRtcDEsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wNCwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjKDE2LTUpCisgICAgTERSICAgICB0bXA0LCBbc3AsICMweDIyOF0KKyAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCisgICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQorICAgIFNVQiAgICAgdG1wNCwgdG1wNCwgIzEwCisKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4CisgICAgTERSICAgICB0bXAzLCBbcmVmLCB0bXA0XQorICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisKKzsvLyBxdWFydGVyIHBlbCBwb3NpdGlvbgorICAgIExEUiAgICAgdG1wMiwgPSAweDgwODA4MDgwCisgICAgTVZOICAgICB0bXAzLCB0bXAzCisgICAgVUhTVUI4ICB0bXAxLCB0bXAxLCB0bXAzCisgICAgRU9SICAgICB0bXAxLCB0bXAxLCB0bXAyCisgICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAorCisgICAgQkNDICAgICBuZXh0X3kKKworICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKworICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgorCisgICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCisgICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0CisgICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQorICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKKyAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCisgICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAorCisgICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisgICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgorICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKKyAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0CisKKyAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQorICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1CisgICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQorICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKKyAgICBMRFIgICAgIHRtcDQsIFtzcCwgIzB4MjI4XQorICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKKyAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCisgICAgU1VCICAgICB0bXA0LCB0bXA0LCAjMTAKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBMRFIgICAgIHRtcDMsIFtyZWYsIHRtcDRdCisgICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKKworOy8vIHF1YXJ0ZXIgcGVsCisgICAgTERSICAgICB0bXAyLCA9IDB4ODA4MDgwODAKKyAgICBNVk4gICAgIHRtcDMsIHRtcDMKKyAgICBVSFNVQjggIHRtcDEsIHRtcDEsIHRtcDMKKyAgICBFT1IgICAgIHRtcDEsIHRtcDEsIHRtcDIKKworICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQKKyAgICBCQ1MgICAgIGxvb3BfeAorCituZXh0X3kKKyAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiA7Ly8gK3dpZHRoCisgICAgQUREUyAgICBtYiwgbWIsICMxNiAgICAgICAgICAgICAgICAgOy8vICsxNiwgQ2Fycnk9MAorICAgIFNCQyAgICAgbWIsIG1iLCB0bXAzLCBMU1IgIzIwICAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMyMCAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDI0KQorICAgIEJHRSAgICAgbG9vcF95CisKKyAgICBBREQgICAgIHNwLHNwLCMweDFmNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KKworICAgIEVORAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzc5YjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfdmVyX3F1YXJ0ZXIucwpAQCAtMCwwICsxLDUzNiBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlciAKKzstLSAgICAgICAgICAgIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCisgICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KKyAgICBFTFNFCisgICAgICAgIFJFUVVJUkU4CisgICAgICAgIFBSRVNFUlZFOAorICAgIEVORElGCisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgorCityZWYgICAgIFJOIDAKKworbWIgICAgICBSTiAxCitidWZmICAgIFJOIDEKKworY291bnQgICBSTiAyCit4MCAgICAgIFJOIDIKKworeTAgICAgICBSTiAzCit4XzJfMCAgIFJOIDMKK3JlcyAgICAgUk4gMworCit4XzNfMSAgIFJOIDQKK3RtcDEgICAgUk4gNAorCitoZWlnaHQgIFJOIDUKK3hfNl80ICAgUk4gNQordG1wMiAgICBSTiA1CisKK3BhcnRXICAgUk4gNgoreF83XzUgICBSTiA2Cit0bXAzICAgIFJOIDYKKworcGFydEggICBSTiA3Cit0bXA0ICAgIFJOIDcKKwordG1wNSAgICBSTiA4CisKK3RtcDYgICAgUk4gOQorCit0bXBhICAgIFJOIDEwCisKK211bHRfMjBfMDEgIFJOIDExCit0bXBiICAgICAgICBSTiAxMQorCittdWx0XzIwX201ICBSTiAxMgord2lkdGggICAgICAgUk4gMTIKKworcGx1czE2ICBSTiAxNAorCisKKzsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCisKKyAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgorCis7Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKKzsvLworOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cworOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCis7Ly8KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAorOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCis7Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKKzsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCis7Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKKworCitoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCisgICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQorICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKKworICAgIENNUCAgICAgeDAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIEFERCAgICAgdG1wYSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCisgICAgQUREICAgICB0bXBhLCB0bXBhLCAjNSAgICAgICAgICA7Ly8gKHgwK3BhcnRXKzUpCisgICAgQ01QICAgICB0bXBhLCB3aWR0aAorICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKKworICAgIENNUCAgICAgeTAsICMwCisgICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKKyAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0CisgICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0CisgICAgQUREICAgICB0bXA1LCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCisgICAgQUREICAgICB0bXA1LCB0bXA1LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRIKzUpCisgICAgQ01QICAgICB0bXA1LCBoZWlnaHQKKyAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKKworCitkb19maWxsCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIEFERCAgICAgdG1wNSwgcGFydEgsICM1ICAgICAgICAgOy8vIHRtcDUgPSBwYXJ0SCArIDUKKyAgICBBREQgICAgIHRtcGEsIHBhcnRXLCAjNSAgICAgICAgIDsvLyB0bXBhID0gcGFydFcgKyA1CisgICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wYX0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1CisgICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKKyAgICBTVFIgICAgIHRtcDUsIFtzcCwjMHhjXSAgICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodCs1CisgICAgU1RSICAgICB0bXBhLCBbc3AsIzB4MTBdICAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgrNQorICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAorICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCisgICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBNT1YgICAgIHgwLCAjMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAorICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAorICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCisgICAgU1RSICAgICB0bXBhLCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQorCisKK3NraXBfZmlsbAorICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIExEUiAgICAgdG1wNiwgW3NwLCMweDIyOF0gICAgICAgOy8vIGhvclZlck9mZnNldAorICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCisgICAgTUxBICAgICB0bXA1LCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKKyAgICBBREQgICAgIHJlZiwgcmVmLCB0bXA1ICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKKyAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHgxZTRdICAgICAgIDsvLyBzdG9yZSAicmVmIiBmb3IgdmVydGljYWwgZmlsdGVyaW5nCisgICAgQU5EICAgICB0bXA2LCB0bXA2LCAjMiAgICAgICAgICA7Ly8gY2FsY3VsYXRlIHJlZiBmb3IgaG9yaXpvbnRhbCBmaWx0ZXIKKyAgICBNT1YgICAgIHRtcGEsICMyCisgICAgQUREICAgICB0bXA2LCB0bXBhLCB0bXA2LCBMU1IgIzEKKyAgICBNTEEgICAgIHJlZiwgdG1wNiwgd2lkdGgsIHJlZgorICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4CisKKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKKyAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKHBhcnRXaWR0aC0xKQorICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQorICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xCisgICAgOy8vIFsxOToxNl0gcGFydEhlaWdodC0xCisgICAgOy8vIFsxNTowMF0gd2lkdGgKKyAgICBNT1YgICAgIGNvdW50LCB3aWR0aAorICAgIFNVQiAgICAgcGFydFcsIHBhcnRXLCAjMTsKKyAgICBTVUIgICAgIHBhcnRILCBwYXJ0SCwgIzE7CisgICAgQUREICAgICB0bXA1LCBwYXJ0SCwgcGFydFcsIExTTCAjNAorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA1LCBMU0wgIzE2CisKKworICAgIExEUiAgICAgbXVsdF8yMF8wMSwgPSAweDAwMTQwMDAxICAgIDsvLyBjb25zdGFudCBtdWx0aXBsaWVycworICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCICAgIDsvLyBjb25zdGFudCBtdWx0aXBsaWVycworICAgIE1PViAgICAgcGx1czE2LCAjMTYgICAgICAgICAgICAgICAgIDsvLyBjb25zdGFudCBmb3IgYWRkCisgICAgQU5EICAgICB0bXA0LCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQorICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA0LCBMU0wgIzggIDsvLyBwYXJ0SC0xIHRvIGxvd2VyIHBhcnQgb2YgdG9wIGJ5dGUKKworOy8vIEhPUklaT05UQUwgUEFSVAorCitsb29wX3lfaG9yCisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA2LCBMU0wgIzggICA7Ly8gcGFydFctMSB0byB1cHBlciBwYXJ0IG9mIHRvcCBieXRlCisgICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQorICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCisgICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisKK2xvb3BfeF9ob3IKKyAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4CisKKyAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDYsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcDUsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKKyAgICBTTUxBVEIgIHRtcGEsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKKworICAgIFNNTEFEICAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBVEIgIHRtcDYsIHhfM18xLCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQUQgICB0bXA1LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNQorICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAorICAgIFNNTEFEICAgdG1wYSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKKyAgICBTTUxBRFggIHRtcDYsIHhfNl80LCBtdWx0XzIwX201LCB0bXA2CisgICAgU01MQURYICB0bXA1LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNQorICAgIFNNTEFEWCAgdG1wYSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcGEKKworICAgIFNNTEFCQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDQKKyAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQorICAgIFNNTEFCQiAgdG1wNSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDUKKyAgICBTTUxBRFggIHRtcDYsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA2CisgICAgU01MQUJCICB0bXBhLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wYQorCisgICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKKyAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQorICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKKyAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCisgICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQorICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKKworICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKKyAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKKyAgICBCQ0MgICAgIG5leHRfeV9ob3IKKworICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKKworICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNiwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wNSwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgorICAgIFNNTEFUQiAgdG1wYSwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgorCisgICAgU01MQUQgICB0bXA0LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNAorICAgIFNNTEFUQiAgdG1wNiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDYKKyAgICBTTUxBRCAgIHRtcDUsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA1CisgICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0CisgICAgU01MQUQgICB0bXBhLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wYQorCisgICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAorICAgIFNNTEFEWCAgdG1wNiwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDYKKyAgICBTTUxBRFggIHRtcDUsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXA1CisgICAgU01MQURYICB0bXBhLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wYQorCisgICAgU01MQUJCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNAorICAgIFVYVEIxNiAgeF82XzQsIHhfN181CisgICAgU01MQUJCICB0bXA1LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNQorICAgIFNNTEFEWCAgdG1wNiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDYKKyAgICBTTUxBQkIgIHRtcGEsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXBhCisKKyAgICBNT1YgICAgIHRtcDUsIHRtcDUsIEFTUiAjNQorICAgIE1PViAgICAgdG1wNCwgdG1wNCwgQVNSICM1CisgICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXBhLCBMU0wgIygxNi01KQorICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMoMTYtNSkKKyAgICBVU0FUMTYgIHRtcDUsICM4LCB0bXA1CisgICAgVVNBVDE2ICB0bXA0LCAjOCwgdG1wNAorCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAorICAgIE9SUiAgICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICM4CisgICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNAorICAgIEJDUyAgICAgbG9vcF94X2hvcgorCituZXh0X3lfaG9yCisgICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmICAgICA7Ly8gK3dpZHRoCisgICAgQUREUyAgICBtYiwgbWIsICMxNiAgICAgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKKyAgICBTQkMgICAgIG1iLCBtYiwgdG1wNiwgTFNSICMyMCAgICAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDI0KSAgOy8vIGRlY3JlbWVudCBjb3VudGVyIChwYXJ0VykKKyAgICBCR0UgICAgIGxvb3BfeV9ob3IKKworCisKKzsvLyBWRVJUSUNBTCBQQVJUCis7Ly8KKzsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCis7Ly8KKzsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKKzsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKKzsvLyBpbiBlYWNoIHJvdW5kLgorOy8vCis7Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Cis7Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Cis7Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Cis7Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Cis7Ly8gICAgICAgICAgIC4uCis7Ly8gICAgICAgICAgIC4uCis7Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCis7Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCis7Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCis7Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCisKKzsvLyBBcHByb2FjaCB0byBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHRvIHF1YXJ0ZXIgcGVsIHBvc2l0aW9uLgorOy8vIDQgYnl0ZXMgYXJlIHByb2Nlc3NlZCBwYXJhbGxlbAorOy8vCis7Ly8gYWxnb3JpdGhtIChhK2IrMSkvMi4gUm91ZGluZyB1cHdhcmRzICsxIGNhbiBiZSBhY2hpZXZlZCBieSAKKzsvLyBuZWdhdGluZyBzZWNvbmQgb3BlcmFuZCB0byBnZXQgb25lJ3MgY29tcGxlbWVudCAoaW5zdGVhZCBvZiAyJ3MpCis7Ly8gYW5kIHVzaW5nIHN1YnRyYWN0aW9uLCBFT1IgaXMgdXNlZCB0byBjb3JyZWN0IHNpZ24uCis7Ly8KKzsvLyBNVk4gICAgIGIsIGIKKzsvLyBVSFNVQjggIGEsIGEsIGIKKzsvLyBFT1IgICAgIGEsIGEsIDB4ODA4MDgwODAKKworCisgICAgTERSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICAgICAgOy8vIHJlZgorICAgIExEUiAgICAgdG1wYSwgW3NwLCAjMHgyMjhdICAgICAgICAgIDsvLyBob3JWZXJPZmZzZXQKKyAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgICAgICA7Ly8gbWIKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweDIxOF0gICAgICAgICA7Ly8gd2lkdGgKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjMiAgICAgICAgICAgICAgICA7Ly8gY2FsY3VsYXRlIGNvcnJlY3QgcG9zaXRpb24KKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsICMxCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wYQorICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAgICAgICAgIDsvLyArMTYgdG8gbG93ZXIgYW5kIHVwcGVyZiBoYWxmd29yZHMKKyAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYgICA7Ly8gcGFydFdpZHRoLTEKKworICAgIEFORCAgICAgdG1wYSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wYSwgTFNMICM4CisKK2xvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA2LCBMU0wgIzggIDsvLyBwYXJ0V2lkdGgtMQorCitsb29wX3gKKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKKyAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKKyAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKKyAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKKyAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKKyAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscyAKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXAxLCBbbWJdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk4gICAgIHRtcDEsIHRtcDEKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorCisgICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKKyAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAxICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93CisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93IChtYikKKworCisgICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8CisgICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8CisgICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8CisgICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8CisgICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8CisgICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDIsIFttYl0KKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorICAgIE1WTiAgICAgdG1wMiwgdG1wMgorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDIgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDMsIFttYl0KKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorICAgIE1WTiAgICAgdG1wMywgdG1wMworCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wNSwgW21iXQorICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCisgICAgTVZOICAgICB0bXA1LCB0bXA1CisKKyAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wNSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKworICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4ICAgICAgICA7Ly8gZGVjcmVtZW50IHggbG9vcCBjb3VudGVyCisKKyAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKKyAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7CisgICAgQUREICAgICByZWYsIHJlZiwgIzQgICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKKworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKyAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAorCisgICAgQkNTICAgICBsb29wX3gKKworICAgIEFERFMgICAgbWIsIG1iLCAjNjQgICAgICAgICAgICAgICAgIDsvLyBzZXQgQ2Fycnk9MAorICAgIEFERCAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzIgICAgIDsvLyByZWYgKz0gNCp3aWR0aAorICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDYsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCisgICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhDIDw8IDI0ICAgIDsvLyBkZWNyZW1lbnQgeSBsb29wIGNvdW50ZXIKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCwgc3AsICMweDFmNAorICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KKworICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODFhZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMKQEAgLTAsMCArMSwxNjMgQEAKKzsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCis7DQorOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCis7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKzsNCis7ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorOw0KKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorDQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCis7LS0NCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBob3Jpem9udGFsIHBhcnQgb2YgDQorOy0tICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkIGZ1bmN0aW9ucw0KKzstLQ0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorDQorICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNDQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtDQorICAgIEVMU0UNCisgICAgICAgIFJFUVVJUkU4DQorICAgICAgICBQUkVTRVJWRTgNCisgICAgRU5ESUYNCisNCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFDQorDQorDQorOy8vIFJlZ2lzdGVyIGFsbG9jYXRpb24NCisNCityZWYgICAgIFJOIDAgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWZlcmVuY2UgaW1hZ2UNCittYiAgICAgIFJOIDEgICAgOy8vIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBpbnRlcnBvbGF0ZWQgbWINCitjb3VudCAgIFJOIDIgICAgOy8vIGJpdC1wYWNrZWQgd2lkdGggYW5kIGNvdW50IHZhbHVlcw0KKw0KK3hfMl8wICAgUk4gNA0KK3hfM18xICAgUk4gNQ0KK3hfNl80ICAgUk4gNg0KK3hfN181ICAgUk4gNw0KKw0KK3RtcDEgICAgUk4gOA0KK3RtcDIgICAgUk4gOQ0KK3RtcDMgICAgUk4gMTANCit0bXA0ICAgIFJOIDExDQorDQorbXVsdF8yMF8wMSAgUk4gMTIgICA7Ly8gWzIwLCAgMV0NCittdWx0XzIwX201ICBSTiAxNCAgIDsvLyBbMjAsIC01XQ0KKw0KKw0KKyAgICAgICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQorDQorOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoDQorOy8vDQorOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cw0KKzsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLg0KKzsvLw0KKzsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMA0KKzsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLg0KKzsvLyB5XzAgPSAgIDIwICAxICAgICAyMCAtNSAgICAgICAgLTUgICAgICAgICAxDQorOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUNCis7Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMA0KKzsvLyB5XzMgPSAgICAgICAgICAgICAgMSAgICAgICAgMjAgLTUgICAgIC01IDIwICAgICAgICAgMQ0KKw0KKw0KK2gyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclBhcnQNCisgICAgU1RNRkQgICBzcCEsIHtyNC1yMTEsIGxyfQ0KKw0KKyAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXINCisgICAgOy8vIFszMToyOF0gbG9vcF94IChwYXJ0V2lkdGgtMSkNCisgICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpDQorICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xDQorICAgIDsvLyBbMTk6MTZdIHBhcnRIZWlnaHQtMQ0KKyAgICA7Ly8gWzE1OjAwXSB3aWR0aA0KKw0KKw0KKyAgICBMRFIgICAgIG11bHRfMjBfMDEsID0gMHgwMDE0MDAwMQ0KKyAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQg0KKyAgICBBTkQgICAgIHRtcDMsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydFdpZHRoLTENCitsb29wX3kNCisgICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQ0KKyAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMywgTFNMICMxMg0KKyAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdDQorICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQorICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCisgICAgVVhUQjE2ICB4XzZfNCwgeF83XzUNCisNCitsb29wX3gNCisgICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOA0KKw0KKyAgICBTTVVBRCAgIHRtcDEsIHhfMl8wLCBtdWx0XzIwXzAxDQorICAgIFNNVUxUQiAgdG1wMiwgeF8yXzAsIG11bHRfMjBfbTUNCisgICAgU01VTFRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDQsIHhfM18xLCBtdWx0XzIwXzAxDQorDQorICAgIFNNTEFEICAgdG1wMSwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDENCisgICAgU01MQUQgICB0bXAyLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMg0KKyAgICBTTUxBVEIgIHRtcDMsIHhfM18xLCBtdWx0XzIwX201LCB0bXAzDQorICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNA0KKyAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDENCisgICAgU01MQURYICB0bXAyLCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wMg0KKyAgICBTTUxBRFggIHRtcDMsIHhfNl80LCBtdWx0XzIwX201LCB0bXAzDQorICAgIFNNTEFEWCAgdG1wNCwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDQNCisNCisgICAgU01MQUJCICB0bXAxLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMQ0KKyAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyDQorICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xDQorICAgIFNNTEFEWCAgdG1wMywgeF83XzUsIG11bHRfMjBfMDEsIHRtcDMNCisgICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wNA0KKw0KKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCisgICAgQkNDICAgICBuZXh0X3kNCisNCisgICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOA0KKw0KKyAgICBTTVVBRCAgIHRtcDEsIHhfNl80LCBtdWx0XzIwXzAxDQorICAgIFNNVUxUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUNCisgICAgU01VTFRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMQ0KKyAgICBTTVVMVEIgIHRtcDQsIHhfN181LCBtdWx0XzIwXzAxDQorDQorICAgIFNNTEFEICAgdG1wMSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDENCisgICAgU01MQUQgICB0bXAyLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMg0KKyAgICBTTUxBVEIgIHRtcDMsIHhfN181LCBtdWx0XzIwX201LCB0bXAzDQorICAgIExEUiAgICAgeF83XzUsIFtyZWZdLCAjNA0KKyAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0DQorDQorICAgIFNNTEFCQiAgdG1wMSwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDENCisgICAgU01MQURYICB0bXAyLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wMg0KKyAgICBTTUxBRFggIHRtcDMsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAzDQorICAgIFNNTEFEWCAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQNCisNCisgICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQ0KKyAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyDQorICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQorICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMNCisgICAgU01MQUJCICB0bXA0LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNA0KKw0KKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4DQorICAgIFNUUiAgICAgdG1wMSwgW21iXSwgIzQNCisgICAgU1RSICAgICB0bXAyLCBbbWJdLCAjNA0KKyAgICBTVFIgICAgIHRtcDMsIFttYl0sICM0DQorICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQNCisgICAgQkNTICAgICBsb29wX3gNCisNCituZXh0X3kNCisgICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQorICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmICAgOy8vICt3aWR0aA0KKyAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzE2ICAgOy8vIC0ocGFydFdpZHRoLTEpLTENCisgICAgQUREUyAgICBjb3VudCwgY291bnQsICMoMTw8MjgpLSgxPDwyMCkNCisgICAgQkdFICAgICBsb29wX3kNCisNCisgICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQ0KKw0KKyAgICBFTkQNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9oYWxmLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQ0ZmM2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucwpAQCAtMCwwICsxLDM0NyBAQAorOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzstLQorOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZiBmdW5jdGlvbgorOy0tCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3JlcyAgICAgUk4gMworeTAgICAgICBSTiAzCisKK3RtcDEgICAgUk4gNAorCit0bXAyICAgIFJOIDUKK2hlaWdodCAgUk4gNQorCit0bXAzICAgIFJOIDYKK3BhcnRXICAgUk4gNgorCit0bXA0ICAgIFJOIDcKK3BhcnRIICAgUk4gNworCit0bXA1ICAgIFJOIDgKK3RtcDYgICAgUk4gOQorCit0bXBhICAgIFJOIDEwCit0bXBiICAgIFJOIDExCit3aWR0aCAgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKKworOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KKzsvLworOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcworOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAorOy8vIGluIGVhY2ggcm91bmQuCis7Ly8KKzsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKKzsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKKzsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKKzsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKKzsvLyAgICAgICAgICAgLi4KKzsvLyAgICAgICAgICAgLi4KKzsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KKzsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KKzsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KKzsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KKworaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0CisKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgQUREICAgICB0bXA1LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgdG1wNSwgd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIEFERCAgICAgdG1wNiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQorICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIENNUCAgICAgdG1wNiwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCisKKworZG9fZmlsbAorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyByMiA9IHBhcnRIICsgNTsKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCBwYXJ0V30gICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoCisgICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyBwYXJ0SGVpZ2h0KzUKKyAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MTBdICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aAorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCisgICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIE1PViAgICAgeDAsICMwCisgICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCisgICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCisgICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKKyAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MjE4XQorCisKK3NraXBfZmlsbAorICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIE1MQSAgICAgdG1wNiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wNiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIEFERCAgICAgY291bnQsIHBhcnRXLCBwYXJ0SCwgTFNMICMxNiAgICA7Ly8gfHBhcnRIfHBhcnRXfAorICAgIExEUiAgICAgdG1wNSwgPSAweDAwMDEwMDAxCisgICAgU1NVQjE2ICBjb3VudCwgY291bnQsIHRtcDU7ICAgICA7Ly8gfHBhcnRILTF8cGFydFctMXwKKyAgICBMRFIgICAgIHBsdXMxNiwgPSAweDAwMTAwMDEwCisKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwMDBGRiA7Ly8gcGFydFdpZHRoCisKKworbG9vcF95CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjMjQgIDsvLyBwYXJ0V2lkdGgtMSB0byB0b3AgYnl0ZQorCitsb29wX3gKKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKKyAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKKyAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKKyAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKKyAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKKyAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKworICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAorICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKworICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDIsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aAorICAgIExEUiAgICAgdG1wYSwgPSAweEZGMDBGRjAwCisKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCisKKyAgICA7Ly8gdG1wMiA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wMyA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNCA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNSA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wNiA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMSA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyBzZWNvbmQgZm91ciBwaXhlbHMKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8CisgICAgVVhUQjE2ICB0bXBiLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKworICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcDMsIFtyZWZdCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKworICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKKyAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI0ICAgICAgICA7Ly8gKHBhcnRXaWR0aC0xKSAtPSA0OworCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKKworICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKKworICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAorICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjNDsgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQorICAgIEFORCAgICAgdG1wYSwgdG1wNCwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKKyAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCisgICAgU1RSICAgICByZXMsIFttYl0sICMtNDQKKworICAgIEJDUyAgICAgbG9vcF94CisKKyAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzI1Mjw8MTYgICAgICA7Ly8gKHBhcnRIZWlnaHQtMSkgLT0gNDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMyICAgICA7Ly8gcmVmICs9IDQqd2lkdGgKKyAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDAwMDBGRiAgICA7Ly8gcGFydFdpZHRoLTEKKyAgICBBREQgICAgIHRtcDIsIHRtcDEsICMxICAgICAgICAgICAgICA7Ly8gcGFydFdpZHRoCisgICAgU1VCICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICAgICAgOy8vIHJlZiAtPSBwYXJ0V2lkdGgKKyAgICBBREQgICAgIG1iLCBtYiwgIzY0OworICAgIFNVQiAgICAgbWIsIG1iLCB0bXAyOyAgICAgICAgICAgICAgIDsvLyBtYiAtPSBwYXJ0V2lkdGgKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjY2Yzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zCkBAIC0wLDAgKzEsMzc0IEBACis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy0tCis7LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyIGZ1bmN0aW9uCis7LS0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQorICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCisgICAgRUxTRQorICAgICAgICBSRVFVSVJFOAorICAgICAgICBQUkVTRVJWRTgKKyAgICBFTkRJRgorCisgICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCisKKzsvLyBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KKworcmVmICAgICBSTiAwCisKK21iICAgICAgUk4gMQorYnVmZiAgICBSTiAxCisKK2NvdW50ICAgUk4gMgoreDAgICAgICBSTiAyCisKK3JlcyAgICAgUk4gMworeTAgICAgICBSTiAzCisKK3RtcDEgICAgUk4gNAorCit0bXAyICAgIFJOIDUKK2hlaWdodCAgUk4gNQorCit0bXAzICAgIFJOIDYKK3BhcnRXICAgUk4gNgorCit0bXA0ICAgIFJOIDcKK3BhcnRIICAgUk4gNworCit0bXA1ICAgIFJOIDgKK3RtcDYgICAgUk4gOQorCit0bXBhICAgIFJOIDEwCit0bXBiICAgIFJOIDExCit3aWR0aCAgIFJOIDEyCisKK3BsdXMxNiAgUk4gMTQKKworCis7Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cworCisgICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCisKKyAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKKworOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KKzsvLworOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcworOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAorOy8vIGluIGVhY2ggcm91bmQuCis7Ly8KKzsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKKzsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKKzsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKKzsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKKzsvLyAgICAgICAgICAgLi4KKzsvLyAgICAgICAgICAgLi4KKzsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KKzsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KKzsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KKzsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KKworaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgorICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KKyAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0CisKKyAgICBDTVAgICAgIHgwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCisgICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCisgICAgQUREICAgICB0bXA1LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIENNUCAgICAgdG1wNSwgd2lkdGgKKyAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCisKKyAgICBDTVAgICAgIHkwLCAjMAorICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCisgICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAorICAgIEFERCAgICAgdG1wNiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQorICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQorICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAorICAgIENNUCAgICAgdG1wNiwgaGVpZ2h0CisgICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCisKKworZG9fZmlsbAorICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKKyAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyByMiA9IHBhcnRIICsgNTsKKyAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKKyAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKKyAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCBwYXJ0V30gICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoCisgICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyBwYXJ0SGVpZ2h0KzUKKyAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MTBdICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aAorICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCisgICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCisgICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KKyAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKKworICAgIE1PViAgICAgeDAsICMwCisgICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCisgICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCisgICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKKyAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MjE4XQorCisKK3NraXBfZmlsbAorICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCisgICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKKyAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAorICAgIE1MQSAgICAgdG1wNiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCisgICAgQUREICAgICByZWYsIHJlZiwgdG1wNiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCisgICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKKworICAgIEFERCAgICAgY291bnQsIHBhcnRXLCBwYXJ0SCwgTFNMICM4ICAgIDsvLyB8eHh8eHh8cGFydEh8cGFydFd8CisgICAgTERSICAgICB0bXA1LCA9IDB4MDAwMTAxMDAKKyAgICBSU0IgICAgIGNvdW50LCB0bXA1LCBjb3VudCwgTFNMICM4ICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8eHh8CisgICAgTERSICAgICB0bXAyLCBbc3AsICMweDIyOF0gICAgICA7Ly8gdmVyT2Zmc2V0CisgICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIgICAgICA7Ly8gfHh4fHBhcnRILTF8cGFydFctMXx2ZXJPZmZzZXR8CisgICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAorCisgICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMEZGMDAgOy8vIHBhcnRXaWR0aAorCisKK2xvb3BfeQorICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzE2ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKKworbG9vcF94CisgICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8CisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8CisgICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8CisgICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8CisgICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8CisgICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8CisKKyAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCisgICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8CisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorCisgICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKKyAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8CisgICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorCisgICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQorICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8CisgICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKKyAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKKworICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKKyAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKKworICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQorICAgIE1PVlMgICAgdG1wMSwgY291bnQsIExTTCAjMzEgICAgICAgIDsvLyB1cGRhdGUgZmxhZ3MgKHZlck9mZnNldCkKKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorICAgIE1WTkVRICAgdG1wMSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKKyAgICBNVk5ORSAgIHRtcDEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKworICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKworICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCisKKworICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXAyLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorCisgICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDIgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKKyAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCisgICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93CisKKyAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKKyAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKKyAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKKyAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKKyAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKKyAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKKworICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisKKyAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCisgICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCisKKyAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKKyAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAorICAgIE1WTkVRICAgdG1wMywgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKKyAgICBNVk5ORSAgIHRtcDMsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCisKKyAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisgICAgT1JSICAgICByZXMsIHJlcywgdG1wYQorICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCisgICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMyAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBMRFIgICAgIHRtcDMsIFtyZWZdICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdworICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KKyAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKKworICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAorICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAorICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAorICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAorICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAorICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAorCisgICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscworICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKKyAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAorICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKKyAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAorICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgorICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKKyAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCisKKyAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCisgICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKKyAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQorICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8CisgICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQorICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAorCisgICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQorICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQorCisgICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCisgICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKKyAgICBNVk5FUSAgIHRtcDUsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCisgICAgTVZOTkUgICB0bXA1LCB0bXAxICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQorCisgICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgorICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKKyAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAorICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisKKyAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCisgICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKKworICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAorICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKKyAgICBBREQgICAgIHJlZiwgcmVmLCAjNDsgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQorCisgICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgorICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0CisgCisgICAgQkNTICAgICBsb29wX3gKKworICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMjUyPDwxNiAgICAgIDsvLyAocGFydEhlaWdodC0xKSAtPSA0OworICAgIEFERCAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzIgICAgIDsvLyByZWYgKz0gNCp3aWR0aAorICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwICAgIDsvLyBwYXJ0V2lkdGgtMQorICAgIE1PViAgICAgdG1wMiwgIzEKKyAgICBBREQgICAgIHRtcDIsIHRtcDIsIHRtcDEsIExTUiAjOCAgICA7Ly8gcGFydFdpZHRoCisgICAgU1VCICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICAgICAgOy8vIHJlZiAtPSBwYXJ0V2lkdGgKKyAgICBBREQgICAgIG1iLCBtYiwgIzY0OworICAgIFNVQiAgICAgbWIsIG1iLCB0bXAyOyAgICAgICAgICAgICAgIDsvLyBtYiAtPSBwYXJ0V2lkdGgKKyAgICBCR0UgICAgIGxvb3BfeQorCisgICAgQUREICAgICBzcCxzcCwjMHgxZjQKKyAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vd2luX2FzbS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZDg4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0CkBAIC0wLDAgKzEsMTUgQEAKK2VjaG8gb2ZmCitzZXQgQVNNRkxBR1M9IC1jaGVja3JlZ2xpc3QgLUNQVSBBUk0xMTM2IC1QcmVEZWZpbmUgIkgyNjRERUNfV0lOQVNNIFNFVEwge1RSVUV9Igorc2V0IEFTTT0iRDpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyA4XFZDXGNlXGJpblx4ODZfYXJtXGFybWFzbSIKK2VjaG8gb24KKworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucworJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfcXVhcnRlci5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKKyVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCislQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucworCityZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKK3JlbSAlQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfbWlkX2hvci5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ2xlYXJNYkxheWVyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxMTY1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDbGVhck1iTGF5ZXIucwpAQCAtMCwwICsxLDY2IEBACis7Cis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisgICAgRVhQT1JUIGgyNjRic2RDbGVhck1iTGF5ZXIKKworOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKK3BNYkxheWVyICAgIFJOICAwCitzaXplICAgICAgICBSTiAgMQorcFRtcCAgICAgICAgUk4gIDIKK3N0ZXAgICAgICAgIFJOICAzCisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworcVplcm8gICBRTiAgUTAuVTgKKworOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2xlYXJNYkxheWVyCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZENsZWFyTWJMYXllcgorCisgICAgVk1PViAgICBxWmVybywgIzAKKyAgICBBREQgICAgIHBUbXAsIHBNYkxheWVyLCAjMTYKKyAgICBNT1YgICAgIHN0ZXAsICMzMgorICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0CisKK2xvb3AKKyAgICBWU1QxICAgIHFaZXJvLCBbcE1iTGF5ZXJdLCBzdGVwCisgICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKKyAgICBWU1QxICAgIHFaZXJvLCBbcFRtcF0sIHN0ZXAKKyAgICBWU1QxICAgIHFaZXJvLCBbcE1iTGF5ZXJdLCBzdGVwCisgICAgVlNUMSAgICBxWmVybywgW3BUbXBdLCBzdGVwCisgICAgQkNTICAgICBsb29wCisKKyAgICBCWCAgICAgIGxyCisgICAgRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2JkNzNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLnMKQEAgLTAsMCArMSw0OSBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKworOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKK3ZhbHVlICAgIFJOICAwCisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKzsKKzsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Cis7Cis7ICAgICAgICBJbnB1dHM6Cis7Cis7ICAgICAgICBPdXRwdXRzOgorOworOyAgICAgICAgUmV0dXJuczoKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKworICAgIENMWiAgICAgdmFsdWUsIHZhbHVlCisgICAgQlggICAgICBscgorICAgIEVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZpbGxSb3c3LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmYWM5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zCkBAIC0wLDAgKzEsMTgwIEBACis7Cis7IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis7Cis7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOworOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOworOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOworCisgICAgUkVRVUlSRTgKKyAgICBQUkVTRVJWRTgKKworICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorCisgICAgRVhQT1JUIGgyNjRic2RGaWxsUm93NworCis7IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycworCityZWYgICAgIFJOIDAKK2ZpbGwgICAgUk4gMQorbGVmdCAgICBSTiAyCit0bXAyICAgIFJOIDIKK2NlbnRlciAgUk4gMworcmlnaHQgICBSTiA0Cit0bXAxICAgIFJOIDUKKworOyAtLSBORU9OIHJlZ2lzdGVycyAtLQorCitxVG1wMCAgIFFOICBRMC5VOAorcVRtcDEgICBRTiAgUTEuVTgKK2RUbXAwICAgRE4gIEQwLlU4CitkVG1wMSAgIEROICBEMS5VOAorZFRtcDIgICBETiAgRDIuVTgKK2RUbXAzICAgRE4gIEQzLlU4CisKKworOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsbFJvdzcKKzsKKzsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Cis7Cis7ICAgICAgICBJbnB1dHM6Cis7Cis7ICAgICAgICBPdXRwdXRzOgorOworOyAgICAgICAgUmV0dXJuczoKKzsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitoMjY0YnNkRmlsbFJvdzcKKyAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAorICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQorICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCisgICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCisKK2xvb3BfbGVmdAorICAgICAgICBTVUJTICAgICBsZWZ0LCBsZWZ0LCAjMQorICAgICAgICBTVFJCICAgICB0bXAxLCBbZmlsbF0sICMxCisgICAgICAgIEJORSAgICAgIGxvb3BfbGVmdAorCitzd2l0Y2hfY2VudGVyCisgICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCisgICAgICAgIENNUCAgICAgIHRtcDIsIzkKKyAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKKyAgICAgICAgQiAgICAgICAgY2FzZV8xCisgICAgICAgIEIgICAgICAgIGNhc2VfMgorICAgICAgICBCICAgICAgICBjYXNlXzMKKyAgICAgICAgQiAgICAgICAgY2FzZV80CisgICAgICAgIEIgICAgICAgIGNhc2VfNQorICAgICAgICBCICAgICAgICBjYXNlXzYKKyAgICAgICAgQiAgICAgICAgY2FzZV83CisgICAgICAgIEIgICAgICAgIGNhc2VfOAorO2Nhc2VfOAorOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Cis7ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKzsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKKztjYXNlXzcKKzsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV82Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Cis7Y2FzZV81Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKKzsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAorOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCM0Cis7Y2FzZV80Cis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV8zCis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV8yCis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Cis7Y2FzZV8xCis7ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAorOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Cis7ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0CisKK2Nhc2VfOAorICAgICAgICBWTEQxICAgIHtxVG1wMCwgcVRtcDF9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzMyCisgICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKKyAgICAgICAgVlNUMSAgICBxVG1wMSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzcKKyAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4CisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzYKKyAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI0CisgICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzUKKyAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyMAorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCisgICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0CisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNAorICAgICAgICBWTEQxICAgIHFUbXAwLCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2CisgICAgICAgIFZTVDEgICAgcVRtcDAsIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV8zCisgICAgICAgIFZMRDEgICAgZFRtcDAsIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICBkVG1wMCwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzIKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKK2Nhc2VfMQorICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwjNAorICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKKyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAorCitsb29wX2NlbnRlcgorICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCisgICAgICAgIExEUkJORSAgIHRtcDIsIFtyZWZdLCAjMQorICAgICAgICBTVUJORSAgICBjZW50ZXIsIGNlbnRlciwgIzEKKyAgICAgICAgU1RSQk5FICAgdG1wMiwgW2ZpbGxdLCAjMQorICAgICAgICBCTkUgICAgICBsb29wX2NlbnRlcgorICAgICAgICBDTVAgICAgICByaWdodCwjMAorICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9CisgICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQorCitsb29wX3JpZ2h0CisgICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQorICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0CisKKyAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZsdXNoQml0cy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzM1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmx1c2hCaXRzLnMKQEAgLTAsMCArMSw4MiBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkRmx1c2hCaXRzCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCitwU3RybURhdGEgICAgICAgUk4gIDAKK251bUJpdHMgICAgICAgICBSTiAgMQorcmVhZEJpdHMgICAgICAgIFJOICAyCitzdHJtQnVmZlNpemUgICAgUk4gIDMKK3BTdHJtQnVmZlN0YXJ0ICBSTiAgMQorcFN0cm1DdXJyUG9zICAgIFJOICAyCitiaXRQb3NJbldvcmQgICAgUk4gIDEKKworOyAtLSBORU9OIHJlZ2lzdGVycyAtLQorCisKKworOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOworOyAgICAgICAgSW5wdXRzOgorOworOyAgICAgICAgT3V0cHV0czoKKzsKKzsgICAgICAgIFJldHVybnM6Cis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaDI2NGJzZEZsdXNoQml0cworOy8vICAgIFBVU0ggICAgIHtyNC1yNixscn0KKworICAgIExEUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCisgICAgTERSIHN0cm1CdWZmU2l6ZSwgW3BTdHJtRGF0YSwgIzB4Q10KKworICAgIEFERCByZWFkQml0cywgcmVhZEJpdHMsIG51bUJpdHMKKyAgICBBTkQgYml0UG9zSW5Xb3JkLCByZWFkQml0cywgIzcKKworICAgIFNUUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCisgICAgU1RSIGJpdFBvc0luV29yZCwgW3BTdHJtRGF0YSwgIzB4OF0KKworICAgIExEUiBwU3RybUJ1ZmZTdGFydCwgW3BTdHJtRGF0YSwgIzB4MF0KKworICAgIENNUCByZWFkQml0cywgc3RybUJ1ZmZTaXplLCBMU0wgIzMKKworICAgIEJISSBlbmRfb2Zfc3RyZWFtCisKKyAgICBBREQgcFN0cm1DdXJyUG9zLCBwU3RybUJ1ZmZTdGFydCwgcmVhZEJpdHMsIExTUiAjMworICAgIFNUUiBwU3RybUN1cnJQb3MsIFtwU3RybURhdGEsICMweDRdCisgICAgTU9WIHIwLCAjMAorICAgIEJYICBscgorOy8vICAgIFBPUCAgICAgIHtyNC1yNixwY30KKworZW5kX29mX3N0cmVhbQorICAgIE1WTiByMCwgIzAKKyAgICBCWCAgbHIKKzsvLyAgICBQT1AgICAgICB7cjQtcjYscGN9CisKKyAgICBFTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMDc4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RXcml0ZU1hY3JvYmxvY2sucwpAQCAtMCwwICsxLDE1MiBAQAorOworOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorOworOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsKKzsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsKKzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsKKworICAgIFJFUVVJUkU4CisgICAgUFJFU0VSVkU4CisKKyAgICBBUkVBICAgIHwudGV4dHwsIENPREUKKworICAgIEVYUE9SVCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisKKzsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCitpbWFnZSAgIFJOICAwCitkYXRhICAgIFJOICAxCit3aWR0aCAgIFJOICAyCitsdW1hICAgIFJOICAzCitjYiAgICAgIFJOICA0CitjciAgICAgIFJOICA1Citjd2lkdGggIFJOICA2CisKKzsgLS0gTkVPTiByZWdpc3RlcnMgLS0KKworcVJvdzAgICBRTiAgUTAuVTgKK3FSb3cxICAgUU4gIFExLlU4CitxUm93MiAgIFFOICBRMi5VOAorcVJvdzMgICBRTiAgUTMuVTgKK3FSb3c0ICAgUU4gIFE0LlU4CitxUm93NSAgIFFOICBRNS5VOAorcVJvdzYgICBRTiAgUTYuVTgKK3FSb3c3ICAgUU4gIFE3LlU4CitxUm93OCAgIFFOICBROC5VOAorcVJvdzkgICBRTiAgUTkuVTgKK3FSb3cxMCAgUU4gIFExMC5VOAorcVJvdzExICBRTiAgUTExLlU4CitxUm93MTIgIFFOICBRMTIuVTgKK3FSb3cxMyAgUU4gIFExMy5VOAorcVJvdzE0ICBRTiAgUTE0LlU4CitxUm93MTUgIFFOICBRMTUuVTgKKworZFJvdzAgICBETiAgRDAuVTgKK2RSb3cxICAgRE4gIEQxLlU4CitkUm93MiAgIEROICBEMi5VOAorZFJvdzMgICBETiAgRDMuVTgKK2RSb3c0ICAgRE4gIEQ0LlU4CitkUm93NSAgIEROICBENS5VOAorZFJvdzYgICBETiAgRDYuVTgKK2RSb3c3ICAgRE4gIEQ3LlU4CitkUm93OCAgIEROICBEOC5VOAorZFJvdzkgICBETiAgRDkuVTgKK2RSb3cxMCAgRE4gIEQxMC5VOAorZFJvdzExICBETiAgRDExLlU4CitkUm93MTIgIEROICBEMTIuVTgKK2RSb3cxMyAgRE4gIEQxMy5VOAorZFJvdzE0ICBETiAgRDE0LlU4CitkUm93MTUgIEROICBEMTUuVTgKKworOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7ICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCis7Cis7ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorOyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQorOyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCis7Cis7ICAgICAgICBJbnB1dHM6Cis7ICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgorOyAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKKzsKKzsgICAgICAgIE91dHB1dHM6Cis7ICAgICAgICAgICAgaW1hZ2UgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgbWFjcm9ibG9jayB3aWxsIGJlIHdyaXR0ZW4KKzsKKzsgICAgICAgIFJldHVybnM6Cis7ICAgICAgICAgICAgbm9uZQorOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2gyNjRic2RXcml0ZU1hY3JvYmxvY2sKKyAgICBQVVNIICAgIHtyNC1yNixscn0KKyAgICBWUFVTSCAgIHtxNC1xN30KKworICAgIExEUiAgICAgd2lkdGgsIFtpbWFnZSwgIzRdCisgICAgTERSICAgICBsdW1hLCBbaW1hZ2UsICMweENdCisgICAgTERSICAgICBjYiwgW2ltYWdlLCAjMHgxMF0KKyAgICBMRFIgICAgIGNyLCBbaW1hZ2UsICMweDE0XQorCisKKzsgICBXcml0ZSBsdW1hCisgICAgVkxEMSAgICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdIQorICAgIExTTCAgICAgd2lkdGgsIHdpZHRoLCAjNAorICAgIFZMRDEgICAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEKKyAgICBMU1IgICAgIGN3aWR0aCwgd2lkdGgsICMxCisgICAgVlNUMSAgICB7cVJvdzB9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93MX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3cyfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93OCwgcVJvdzl9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzN9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxMCwgcVJvdzExfSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c0fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzE0LCBxUm93MTV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzZ9LCBbbHVtYUAxMjhdLCB3aWR0aAorCisgICAgVkxEMSAgICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdISA7Y2Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzd9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEgO2NiIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3c4fSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hIDtjciByb3dzIDAsMSwyLDMKKyAgICBWU1QxICAgIHtxUm93OX0sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdISA7Y3Igcm93cyA0LDUsNiw3CisgICAgVlNUMSAgICB7cVJvdzEwfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MH0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c4fSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzExfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MX0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c5fSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzEyfSwgW2x1bWFAMTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93Mn0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMH0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxM30sIFtsdW1hQDEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzN9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTF9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTR9LCBbbHVtYUAxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3c0fSwgW2NiQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEyfSwgW2NyQDY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE1fSwgW2x1bWFdCisgICAgVlNUMSAgICB7ZFJvdzV9LCBbY2JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTN9LCBbY3JANjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93Nn0sIFtjYkA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxNH0sIFtjckA2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c3fSwgW2NiQDY0XQorICAgIFZTVDEgICAge2RSb3cxNX0sIFtjckA2NF0KKworICAgIFZQT1AgICAge3E0LXE3fQorICAgIFBPUCAgICAge3I0LXI2LHBjfQorICAgIEVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9hc21fY29tbW9uLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWY1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TCkBAIC0wLDAgKzEsNDEgQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKworCisKKyAgICAubWFjcm8gUkVRVUlSRTgKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZW5kbQorCisgICAgLm1hY3JvIFBSRVNFUlZFOAorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorICAgIC5lbmRtCisKKworICAgIC5tYWNybyBmdW5jdGlvbiBuYW1lLCBleHBvcnQ9MAorLmlmIFxleHBvcnQKKyAgICAuZ2xvYmFsIFxuYW1lCisuZW5kaWYKKyAgICAudHlwZSAgIFxuYW1lLCAlZnVuY3Rpb24KKyAgICAuZnVuYyAgIFxuYW1lCitcbmFtZToKKyAgICAuZW5kbQorCisgICAgLm1hY3JvIGVuZGZ1bmN0aW9uCisgICAgLmVuZGZ1bmMKKyAgICAuZW5kbQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE5NDBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUwpAQCAtMCwwICsxLDY4IEBACitACitAIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CitACitAIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQAorQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQAorQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQAorCisjaW5jbHVkZSAiYXNtX2NvbW1vbi5TIgorCisgICAgcHJlc2VydmU4CisKKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgcE1iTGF5ZXIgICAgcjAKKyNkZWZpbmUgc2l6ZSAgICAgICAgcjEKKyNkZWZpbmUgcFRtcCAgICAgICAgcjIKKyNkZWZpbmUgc3RlcCAgICAgICAgcjMKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworI2RlZmluZSBxWmVybyAgIFEwLlU4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENsZWFyTWJMYXllcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisKKyAgICAgICAgSW5wdXRzOgorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZnVuY3Rpb24gaDI2NGJzZENsZWFyTWJMYXllciwgZXhwb3J0PTEKKworICAgIFZNT1YgICAgcVplcm8sICMwCisgICAgQUREICAgICBwVG1wLCBwTWJMYXllciwgIzE2CisgICAgTU9WICAgICBzdGVwLCAjMzIKKyAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAorCitsb29wOgorICAgIFZTVDEgICAge3FaZXJvfSwgW3BNYkxheWVyXSwgc3RlcAorICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0CisgICAgVlNUMSAgICB7cVplcm99LCBbcFRtcF0sIHN0ZXAKKyAgICBWU1QxICAgIHtxWmVyb30sIFtwTWJMYXllcl0sIHN0ZXAKKyAgICBWU1QxICAgIHtxWmVyb30sIFtwVG1wXSwgc3RlcAorICAgIEJDUyAgICAgbG9vcAorCisgICAgQlggICAgICBscgorCitlbmRmdW5jdGlvbgorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMKQEAgLTAsMCArMSw0OCBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICBwcmVzZXJ2ZTgKKyAgICAuYXJtCisgICAgLnRleHQKKworCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgdmFsdWUgICAgcjAKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorCisgICAgICAgIElucHV0czoKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Z1bmN0aW9uIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcywgZXhwb3J0PTEKKworICAgIENMWiAgICAgdmFsdWUsIHZhbHVlCisgICAgQlggICAgICBscgorCitlbmRmdW5jdGlvbgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NWI5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmlsbFJvdzcuUwpAQCAtMCwwICsxLDE0MyBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKworI2luY2x1ZGUgImFzbV9jb21tb24uUyIKKworICAgIHByZXNlcnZlOAorCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgcmVmICAgICByMAorI2RlZmluZSBmaWxsICAgIHIxCisjZGVmaW5lIGxlZnQgICAgcjIKKyNkZWZpbmUgdG1wMiAgICByMgorI2RlZmluZSBjZW50ZXIgIHIzCisjZGVmaW5lIHJpZ2h0ICAgcjQKKyNkZWZpbmUgdG1wMSAgICByNQorCisvKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLworCisjZGVmaW5lIHFUbXAwICAgICBRMC5VOAorI2RlZmluZSBxVG1wMSAgICAgUTEuVTgKKyNkZWZpbmUgZFRtcDAgICAgIEQwLlU4CisjZGVmaW5lIGRUbXAxICAgICBEMS5VOAorI2RlZmluZSBkVG1wMiAgICAgRDIuVTgKKyNkZWZpbmUgZFRtcDMgICAgIEQzLlU4CisKKy8qCit2b2lkIGgyNjRic2RGaWxsUm93Nyhjb25zdCB1OCAqIHJlZiwgdTggKiBmaWxsLCBpMzIgbGVmdCwgaTMyIGNlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgIGkzMiByaWdodCk7CisqLworCitmdW5jdGlvbiBoMjY0YnNkRmlsbFJvdzcsIGV4cG9ydD0xCisKKyAgICAgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgICAgICBDTVAgICAgICBsZWZ0LCAjMAorICAgICAgICBMRFIgICAgICByaWdodCwgW3NwLCMweDEwXQorICAgICAgICBCRVEgICAgICBzd2l0Y2hfY2VudGVyCisgICAgICAgIExEUkIgICAgIHRtcDEsIFtyZWYsIzBdCisKK2xvb3BfbGVmdDoKKyAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKKyAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQorICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKKworc3dpdGNoX2NlbnRlcjoKKyAgICAgICAgQVNSICAgICAgdG1wMixjZW50ZXIsIzIKKyAgICAgICAgQ01QICAgICAgdG1wMiwjOQorICAgICAgICBBRERDQyAgICBwYyxwYyx0bXAyLExTTCAjMgorICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgorICAgICAgICBCICAgICAgICBsb29wX2NlbnRlcgorICAgICAgICBCICAgICAgICBjYXNlXzEKKyAgICAgICAgQiAgICAgICAgY2FzZV8yCisgICAgICAgIEIgICAgICAgIGNhc2VfMworICAgICAgICBCICAgICAgICBjYXNlXzQKKyAgICAgICAgQiAgICAgICAgY2FzZV81CisgICAgICAgIEIgICAgICAgIGNhc2VfNgorICAgICAgICBCICAgICAgICBjYXNlXzcKKyAgICAgICAgQiAgICAgICAgY2FzZV84CisKK2Nhc2VfODoKKyAgICAgICAgVkxEMSAgICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgorICAgICAgICBWU1QxICAgIHtxVG1wMH0sIFtmaWxsXSEKKyAgICAgICAgVlNUMSAgICB7cVRtcDF9LCBbZmlsbF0hCisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNzoKKyAgICAgICAgVkxEMSAgICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzI4CisgICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0CisgICAgICAgIFZTVDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW2ZpbGxdIQorICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzY6CisgICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAorICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKKyAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgorY2FzZV81OgorICAgICAgICBWTEQxICAgIHtxVG1wMH0sIFtyZWZdIQorICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKKyAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKKyAgICAgICAgVlNUMSAgICB7cVRtcDB9LCBbZmlsbF0hCisgICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0CisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfNDoKKyAgICAgICAgVkxEMSAgICB7cVRtcDB9LCBbcmVmXSEKKyAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzE2CisgICAgICAgIFZTVDEgICAge3FUbXAwfSwgW2ZpbGxdIQorICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCitjYXNlXzM6CisgICAgICAgIFZMRDEgICAge2RUbXAwfSwgW3JlZl0hCisgICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxMgorICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAorICAgICAgICBWU1QxICAgIGRUbXAwLCBbZmlsbF0hCisgICAgICAgIFNUUiAgICAgdG1wMiwgW2ZpbGxdLCM0CisgICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKK2Nhc2VfMjoKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKK2Nhc2VfMToKKyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0CisgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKKworbG9vcF9jZW50ZXI6CisgICAgICAgIENNUCAgICAgIGNlbnRlciwgIzAKKyAgICAgICAgQkVRICAgICAganVtcAorICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmXSwgIzEKKyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICMxCisgICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKK2p1bXA6CisgICAgICAgIENNUCAgICAgIHJpZ2h0LCMwCisgICAgICAgIFBPUEVRICAgIHtyNC1yNixwY30KKyAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZiwjLTFdCisKK2xvb3BfcmlnaHQ6CisgICAgICAgIFNUUkIgICAgIHRtcDIsIFtmaWxsXSwgIzEKKyAgICAgICAgU1VCUyAgICAgcmlnaHQsIHJpZ2h0LCAjMQorICAgICAgICBCTkUgICAgICBsb29wX3JpZ2h0CisKKyAgICAgICAgUE9QICAgICAge3I0LXI2LHBjfQorCitlbmRmdW5jdGlvbgorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkRmx1c2hCaXRzLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjMxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCkBAIC0wLDAgKzEsNzggQEAKK0AKK0AgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKK0AKK0AgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CitAIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK0AgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitACitAICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitACitAIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitACisKKyNpbmNsdWRlICJhc21fY29tbW9uLlMiCisKKyAgICBwcmVzZXJ2ZTgKKworICAgIC5hcm0KKyAgICAudGV4dAorCisvKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgcFN0cm1EYXRhICAgICAgIHIwCisjZGVmaW5lIG51bUJpdHMgICAgICAgICByMQorI2RlZmluZSByZWFkQml0cyAgICAgICAgcjIKKyNkZWZpbmUgc3RybUJ1ZmZTaXplICAgIHIzCisjZGVmaW5lIHBTdHJtQnVmZlN0YXJ0ICByMQorI2RlZmluZSBwU3RybUN1cnJQb3MgICAgcjIKKyNkZWZpbmUgYml0UG9zSW5Xb3JkICAgIHIxCisKKy8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hCaXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKworICAgICAgICBJbnB1dHM6CisKKyAgICAgICAgT3V0cHV0czoKKworICAgICAgICBSZXR1cm5zOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZnVuY3Rpb24gaDI2NGJzZEZsdXNoQml0cywgZXhwb3J0PTEKKworICAgIExEUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCisgICAgTERSIHN0cm1CdWZmU2l6ZSwgW3BTdHJtRGF0YSwgIzB4Q10KKworICAgIEFERCByZWFkQml0cywgcmVhZEJpdHMsIG51bUJpdHMKKyAgICBBTkQgYml0UG9zSW5Xb3JkLCByZWFkQml0cywgIzcKKworICAgIFNUUiByZWFkQml0cywgW3BTdHJtRGF0YSwgIzB4MTBdCisgICAgU1RSIGJpdFBvc0luV29yZCwgW3BTdHJtRGF0YSwgIzB4OF0KKworICAgIExEUiBwU3RybUJ1ZmZTdGFydCwgW3BTdHJtRGF0YSwgIzB4MF0KKworICAgIENNUCByZWFkQml0cywgc3RybUJ1ZmZTaXplLCBMU0wgIzMKKworICAgIEJISSBlbmRfb2Zfc3RyZWFtCisKKyAgICBBREQgcFN0cm1DdXJyUG9zLCBwU3RybUJ1ZmZTdGFydCwgcmVhZEJpdHMsIExTUiAjMworICAgIFNUUiBwU3RybUN1cnJQb3MsIFtwU3RybURhdGEsICMweDRdCisgICAgTU9WIHIwLCAjMAorICAgIEJYICBscgorCitlbmRfb2Zfc3RyZWFtOgorICAgIE1WTiByMCwgIzAKKyAgICBCWCAgbHIKKworZW5kZnVuY3Rpb24KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVkNTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUwpAQCAtMCwwICsxLDE1NyBAQAorQAorQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorQAorQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AKK0AgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK0AKK0AgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK0AgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK0AKKworI2luY2x1ZGUgImFzbV9jb21tb24uUyIKKworICAgIHJlcXVpcmU4CisgICAgcHJlc2VydmU4CisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIGltYWdlICAgcjAKKyNkZWZpbmUgZGF0YSAgICByMQorI2RlZmluZSB3aWR0aCAgIHIyCisjZGVmaW5lIGx1bWEgICAgcjMKKyNkZWZpbmUgY2IgICAgICByNAorI2RlZmluZSBjciAgICAgIHI1CisjZGVmaW5lIGN3aWR0aCAgcjYKKworLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KKworI2RlZmluZSBxUm93MCAgICAgUTAuVTgKKyNkZWZpbmUgcVJvdzEgICAgIFExLlU4CisjZGVmaW5lIHFSb3cyICAgICBRMi5VOAorI2RlZmluZSBxUm93MyAgICAgUTMuVTgKKyNkZWZpbmUgcVJvdzQgICAgIFE0LlU4CisjZGVmaW5lIHFSb3c1ICAgICBRNS5VOAorI2RlZmluZSBxUm93NiAgICAgUTYuVTgKKyNkZWZpbmUgcVJvdzcgICAgIFE3LlU4CisjZGVmaW5lIHFSb3c4ICAgICBROC5VOAorI2RlZmluZSBxUm93OSAgICAgUTkuVTgKKyNkZWZpbmUgcVJvdzEwICAgIFExMC5VOAorI2RlZmluZSBxUm93MTEgICAgUTExLlU4CisjZGVmaW5lIHFSb3cxMiAgICBRMTIuVTgKKyNkZWZpbmUgcVJvdzEzICAgIFExMy5VOAorI2RlZmluZSBxUm93MTQgICAgUTE0LlU4CisjZGVmaW5lIHFSb3cxNSAgICBRMTUuVTgKKworI2RlZmluZSBkUm93MCAgICAgRDAuVTgKKyNkZWZpbmUgZFJvdzEgICAgIEQxLlU4CisjZGVmaW5lIGRSb3cyICAgICBEMi5VOAorI2RlZmluZSBkUm93MyAgICAgRDMuVTgKKyNkZWZpbmUgZFJvdzQgICAgIEQ0LlU4CisjZGVmaW5lIGRSb3c1ICAgICBENS5VOAorI2RlZmluZSBkUm93NiAgICAgRDYuVTgKKyNkZWZpbmUgZFJvdzcgICAgIEQ3LlU4CisjZGVmaW5lIGRSb3c4ICAgICBEOC5VOAorI2RlZmluZSBkUm93OSAgICAgRDkuVTgKKyNkZWZpbmUgZFJvdzEwICAgIEQxMC5VOAorI2RlZmluZSBkUm93MTEgICAgRDExLlU4CisjZGVmaW5lIGRSb3cxMiAgICBEMTIuVTgKKyNkZWZpbmUgZFJvdzEzICAgIEQxMy5VOAorI2RlZmluZSBkUm93MTQgICAgRDE0LlU4CisjZGVmaW5lIGRSb3cxNSAgICBEMTUuVTgKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQorICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCisgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZnVuY3Rpb24gaDI2NGJzZFdyaXRlTWFjcm9ibG9jaywgZXhwb3J0PTEKKyAgICBQVVNIICAgIHtyNC1yNixscn0KKyAgICBWUFVTSCAgIHtxNC1xN30KKworICAgIExEUiAgICAgd2lkdGgsIFtpbWFnZSwgIzRdCisgICAgTERSICAgICBsdW1hLCBbaW1hZ2UsICMweENdCisgICAgTERSICAgICBjYiwgW2ltYWdlLCAjMHgxMF0KKyAgICBMRFIgICAgIGNyLCBbaW1hZ2UsICMweDE0XQorCisKK0AgICBXcml0ZSBsdW1hCisgICAgVkxEMSAgICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdIQorICAgIExTTCAgICAgd2lkdGgsIHdpZHRoLCAjNAorICAgIFZMRDEgICAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEKKyAgICBMU1IgICAgIGN3aWR0aCwgd2lkdGgsICMxCisgICAgVlNUMSAgICB7cVJvdzB9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzF9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzJ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93OCwgcVJvdzl9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKKyAgICBWU1QxICAgIHtxUm93NH0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3cxMiwgcVJvdzEzfSwgW2RhdGFdIQorICAgIFZTVDEgICAge3FSb3c1fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzE0LCBxUm93MTV9LCBbZGF0YV0hCisgICAgVlNUMSAgICB7cVJvdzZ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKworICAgIFZMRDEgICAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgOy8vY2Igcm93cyAwLDEsMiwzCisgICAgVlNUMSAgICB7cVJvdzd9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWTEQxICAgIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDsvL2NiIHJvd3MgNCw1LDYsNworICAgIFZTVDEgICAge3FSb3c4fSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVkxEMSAgICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Ly9jciByb3dzIDAsMSwyLDMKKyAgICBWU1QxICAgIHtxUm93OX0sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZMRDEgICAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgOy8vY3Igcm93cyA0LDUsNiw3CisgICAgVlNUMSAgICB7cVJvdzEwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzB9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzh9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzExfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzF9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzl9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzEyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCisgICAgVlNUMSAgICB7ZFJvdzJ9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEwfSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge3FSb3cxM30sIFtsdW1hLDoxMjhdLCB3aWR0aAorICAgIFZTVDEgICAge2RSb3czfSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxMX0sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtxUm93MTR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKKyAgICBWU1QxICAgIHtkUm93NH0sIFtjYiw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93MTJ9LCBbY3IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7cVJvdzE1fSwgW2x1bWFdCisgICAgVlNUMSAgICB7ZFJvdzV9LCBbY2IsOjY0XSwgY3dpZHRoCisgICAgVlNUMSAgICB7ZFJvdzEzfSwgW2NyLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3c2fSwgW2NiLDo2NF0sIGN3aWR0aAorICAgIFZTVDEgICAge2RSb3cxNH0sIFtjciw6NjRdLCBjd2lkdGgKKyAgICBWU1QxICAgIHtkUm93N30sIFtjYiw6NjRdCisgICAgVlNUMSAgICB7ZFJvdzE1fSwgW2NyLDo2NF0KKworICAgIFZQT1AgICAge3E0LXE3fQorICAgIFBPUCAgICAge3I0LXI2LHBjfQorQCAgICBCWCAgICAgIGxyCisKKyAgICAuZW5kZnVuYworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjc3ZjhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBFeHRyYWN0TmFsVW5pdAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfYnl0ZV9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCWVRFX1NUUkVBTV9FUlJPUiAgMHhGRkZGRkZGRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBFeHRyYWN0TmFsVW5pdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBFeHRyYWN0cyBvbmUgTkFMIHVuaXQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0gYnVmZmVyLiBSZW1vdmVzCisgICAgICAgICAgICBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlcyBpZiBwcmVzZW50LiBUaGUgb3JpZ2luYWwgc3RyZWFtIGJ1ZmZlcgorICAgICAgICAgICAgaXMgdXNlZCBkaXJlY3RseSBhbmQgaXMgdGhlcmVmb3JlIG1vZGlmaWVkIGlmIGVtdWxhdGlvbiBwcmV2ZW50aW9uCisgICAgICAgICAgICBieXRlcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RyZWFtLgorCisgICAgICAgICAgICBTdHJlYW0gYnVmZmVyIGlzIGFzc3VtZWQgdG8gY29udGFpbiBlaXRoZXIgZXhhY3RseSBvbmUgTkFMIHVuaXQKKyAgICAgICAgICAgIGFuZCBub3RoaW5nIGVsc2UsIG9yIG9uZSBvciBtb3JlIE5BTCB1bml0cyBlbWJlZGRlZCBpbiBieXRlCisgICAgICAgICAgICBzdHJlYW0gZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgQW5uZXggQiBvZiB0aGUgc3RhbmRhcmQuIEZ1bmN0aW9uCisgICAgICAgICAgICBkZXRlY3RzIHdoaWNoIG9uZSBpcyB1c2VkIGJhc2VkIG9uIHRoZSBmaXJzdCBieXRlcyBpbiB0aGUgYnVmZmVyLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBCeXRlU3RyZWFtICAgICBwb2ludGVyIHRvIGJ5dGUgc3RyZWFtIGJ1ZmZlcgorICAgICAgICAgICAgbGVuICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgc3RyZWFtIGJ1ZmZlciAoaW4gYnl0ZXMpCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBzdHJlYW0gaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIHJlYWRCeXRlcyAgICAgICBudW1iZXIgb2YgYnl0ZXMgImNvbnN1bWVkIiBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZXJyb3IgaW4gYnl0ZSBzdHJlYW0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RFeHRyYWN0TmFsVW5pdCh1OCAqcEJ5dGVTdHJlYW0sIHUzMiBsZW4sIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICB1MzIgKnJlYWRCeXRlcykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgdG1wOworICAgIHUzMiBieXRlQ291bnQsaW5pdEJ5dGVDb3VudDsKKyAgICB1MzIgemVyb0NvdW50OworICAgIHU4ICBieXRlOworICAgIHUzMiBoYXNFbXVsYXRpb24gPSBIQU5UUk9fRkFMU0U7CisgICAgdTMyIGludmFsaWRTdHJlYW0gPSBIQU5UUk9fRkFMU0U7CisgICAgdTggKnJlYWRQdHIsICp3cml0ZVB0cjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBCeXRlU3RyZWFtKTsKKyAgICBBU1NFUlQobGVuKTsKKyAgICBBU1NFUlQobGVuIDwgQllURV9TVFJFQU1fRVJST1IpOworICAgIEFTU0VSVChwU3RybURhdGEpOworCisgICAgLyogYnl0ZSBzdHJlYW0gZm9ybWF0IGlmIHN0YXJ0cyB3aXRoIDB4MDAwMDAxIG9yIDB4MDAwMDAwICovCisgICAgaWYgKGxlbiA+IDMgJiYgcEJ5dGVTdHJlYW1bMF0gPT0gMHgwMCAmJiBwQnl0ZVN0cmVhbVsxXSA9PSAweDAwICYmCisgICAgICAgIChwQnl0ZVN0cmVhbVsyXSYweEZFKSA9PSAweDAwKQorICAgIHsKKyAgICAgICAgLyogc2VhcmNoIGZvciBOQUwgdW5pdCBzdGFydCBwb2ludCwgaS5lLiBwb2ludCBhZnRlciBmaXJzdCBzdGFydCBjb2RlCisgICAgICAgICAqIHByZWZpeCBpbiB0aGUgc3RyZWFtICovCisgICAgICAgIHplcm9Db3VudCA9IGJ5dGVDb3VudCA9IDI7CisgICAgICAgIHJlYWRQdHIgPSBwQnl0ZVN0cmVhbSArIDI7CisgICAgICAgIC8qbGludCAtZSg3MTYpIHdoaWxlKDEpIHVzZWQgY29uc2Npb3VzbHkgKi8KKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgPSAqcmVhZFB0cisrOworICAgICAgICAgICAgYnl0ZUNvdW50Kys7CisKKyAgICAgICAgICAgIGlmIChieXRlQ291bnQgPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vIHN0YXJ0IGNvZGUgcHJlZml4IGZvdW5kIC0+IGVycm9yICovCisgICAgICAgICAgICAgICAgKnJlYWRCeXRlcyA9IGxlbjsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYnl0ZSkKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKyAgICAgICAgICAgIGVsc2UgaWYgKChieXRlID09IDB4MDEpICYmICh6ZXJvQ291bnQgPj0gMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGluaXRCeXRlQ291bnQgPSBieXRlQ291bnQ7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHNpemUgb2YgdGhlIE5BTCB1bml0LiBTZWFyY2ggZm9yIG5leHQgc3RhcnQgY29kZSBwcmVmaXgKKyAgICAgICAgICogb3IgZW5kIG9mIHN0cmVhbSBhbmQgaWdub3JlIHBvc3NpYmxlIHRyYWlsaW5nIHplcm8gYnl0ZXMgKi8KKyAgICAgICAgemVyb0NvdW50ID0gMDsKKyAgICAgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSA9ICpyZWFkUHRyKys7CisgICAgICAgICAgICBieXRlQ291bnQrKzsKKyAgICAgICAgICAgIGlmICghYnl0ZSkKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQrKzsKKworICAgICAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAzKSAmJiAoemVyb0NvdW50ID09IDIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYXNFbXVsYXRpb24gPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoYnl0ZSA9PSAweDAxKSAmJiAoemVyb0NvdW50ID49IDIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgPQorICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgLSBpbml0Qnl0ZUNvdW50IC0gemVyb0NvdW50IC0gMTsKKyAgICAgICAgICAgICAgICB6ZXJvQ291bnQgLT0gTUlOKHplcm9Db3VudCwgMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChieXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh6ZXJvQ291bnQgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFN0cmVhbSA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChieXRlQ291bnQgPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0gYnl0ZUNvdW50IC0gaW5pdEJ5dGVDb3VudCAtIHplcm9Db3VudDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorICAgIC8qIHNlcGFyYXRlIE5BTCB1bml0cyBhcyBpbnB1dCAtPiBqdXN0IHNldCBzdHJlYW0gcGFyYW1zICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW5pdEJ5dGVDb3VudCA9IDA7CisgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplID0gbGVuOworICAgICAgICBoYXNFbXVsYXRpb24gPSBIQU5UUk9fVFJVRTsKKyAgICB9CisKKyAgICBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0ICAgID0gcEJ5dGVTdHJlYW0gKyBpbml0Qnl0ZUNvdW50OworICAgIHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zICAgICAgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0OworICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkICAgICAgPSAwOworICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAgPSAwOworCisgICAgLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyAiY29uc3VtZWQiICovCisgICAgKnJlYWRCeXRlcyA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplICsgaW5pdEJ5dGVDb3VudCArIHplcm9Db3VudDsKKworICAgIGlmIChpbnZhbGlkU3RyZWFtKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHJlbW92ZSBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlcyBiZWZvcmUgcmJzcCBwcm9jZXNzaW5nICovCisgICAgaWYgKGhhc0VtdWxhdGlvbikKKyAgICB7CisgICAgICAgIHRtcCA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplOworICAgICAgICByZWFkUHRyID0gd3JpdGVQdHIgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0OworICAgICAgICB6ZXJvQ291bnQgPSAwOworICAgICAgICBmb3IgKGkgPSB0bXA7IGktLTspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoemVyb0NvdW50ID09IDIpICYmICgqcmVhZFB0ciA9PSAweDAzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlIHNoYWxsIGJlIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgKiBmb2xsb3dpbmcgYnl0ZXM6IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMuIFRoaXMgaW1wbGllcyB0aGF0CisgICAgICAgICAgICAgICAgICogZW11bGF0aW9uIHByZXZlbnRpb24gMHgwMyBieXRlIHNoYWxsIG5vdCBiZSB0aGUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmVhbS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoIChpID09IDApIHx8ICgqKHJlYWRQdHIrMSkgPiAweDAzKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAgICAgICAgIC8qIGRvIG5vdCB3cml0ZSBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlICovCisgICAgICAgICAgICAgICAgcmVhZFB0cisrOworICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTkFMIHVuaXQgc2hhbGwgbm90IGNvbnRhaW4gYnl0ZSBzZXF1ZW5jZXMgMHgwMDAwMDAsCisgICAgICAgICAgICAgICAgICogMHgwMDAwMDEgb3IgMHgwMDAwMDIgKi8KKyAgICAgICAgICAgICAgICBpZiAoICh6ZXJvQ291bnQgPT0gMikgJiYgKCpyZWFkUHRyIDw9IDB4MDIpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICAgICAgICAgaWYgKCpyZWFkUHRyID09IDApCisgICAgICAgICAgICAgICAgICAgIHplcm9Db3VudCsrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKKworICAgICAgICAgICAgICAgICp3cml0ZVB0cisrID0gKnJlYWRQdHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIChyZWFkUHRyIC0gd3JpdGVQdHIpIGluZGljYXRlcyBudW1iZXIgb2YgInJlbW92ZWQiIGVtdWxhdGlvbgorICAgICAgICAgKiBwcmV2ZW50aW9uIGJ5dGVzIC0+IHN1YnRyYWN0IGZyb20gc3RyZWFtIGJ1ZmZlciBzaXplICovCisgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplIC09ICh1MzIpKHJlYWRQdHIgLSB3cml0ZVB0cik7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNmFlYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9ICisjZGVmaW5lIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RFeHRyYWN0TmFsVW5pdCh1OCAqcEJ5dGVTdHJlYW0sIHUzMiBsZW4sIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICB1MzIgKnJlYWRCeXRlcyk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWQ3OGJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMKQEAgLTAsMCArMSw5MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBEZWNvZGVDb2VmZlRva2VuCisgICAgICAgICAgRGVjb2RlTGV2ZWxQcmVmaXgKKyAgICAgICAgICBEZWNvZGVUb3RhbFplcm9zCisgICAgICAgICAgRGVjb2RlUnVuQmVmb3JlCisgICAgICAgICAgRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9jYXZsYy5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBGb2xsb3dpbmcgZGVzY3JpcHRpb25zIHVzZSB0ZXJtICJpbmZvcm1hdGlvbiBmaWVsZCIgdG8gcmVwcmVzZW50IGNvbWJpbmF0aW9uCisgKiBvZiBjZXJ0YWluIGRlY29kZWQgc3ltYm9sIHZhbHVlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlCisgKiBsZW5ndGggY29kZSB3b3JkLiBGb3IgZXhhbXBsZSwgdG90YWxfemVyb3MgaW5mb3JtYXRpb24gZmllbGQgY29uc2lzdHMgb2YKKyAqIDQgYml0cyBzeW1ib2wgdmFsdWUgKGJpdHMgWzQsN10pIGFsb25nIHdpdGggZm91ciBiaXRzIHRvIHJlcHJlc2VudCBsZW5ndGgKKyAqIG9mIHRoZSBWTEMgY29kZSB3b3JkIChiaXRzIFswLDNdKSAqLworCisvKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBjb2VmZiB0b2tlbiBpbmZvcm1hdGlvbiBmaWVsZCwgYml0cyBbMCw0XSAgKi8KKyNkZWZpbmUgTEVOR1RIX1RDKHZsYykgKCh2bGMpICYgMHgxRikKKy8qIG1hY3JvIHRvIG9idGFpbiBsZW5ndGggb2YgdGhlIG90aGVyIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbMCwzXSAqLworI2RlZmluZSBMRU5HVEgodmxjKSAoKHZsYykgJiAweEYpCisvKiBtYWNybyB0byBvYnRhaW4gY29kZSB3b3JkIGZyb20gdGhlIGluZm9ybWF0aW9uIGZpZWxkcywgYml0cyBbNCw3XSAqLworI2RlZmluZSBJTkZPKHZsYykgKCgodmxjKSA+PiA0KSAmIDB4RikgIC8qIDQgTVNCIGJpdHMgY29udGFpbiBpbmZvcm1hdGlvbiAqLworLyogbWFjcm8gdG8gb2J0YWluIHRyYWlsaW5nIG9uZXMgZnJvbSB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gd29yZCwKKyAqIGJpdHMgWzUsMTBdICovCisjZGVmaW5lIFRSQUlMSU5HX09ORVMoY29lZmZUb2tlbikgKChjb2VmZlRva2VuPj41KSAmIDB4M0YpCisvKiBtYWNybyB0byBvYnRhaW4gdG90YWwgY29lZmYgZnJvbSB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gd29yZCwKKyAqIGJpdHMgWzExLDE1XSAqLworI2RlZmluZSBUT1RBTF9DT0VGRihjb2VmZlRva2VuKSAoKChjb2VmZlRva2VuKSA+PiAxMSkgJiAweDFGKQorCisjZGVmaW5lIFZMQ19OT1RfRk9VTkQgMHhGRkZGRkZGRVUKKworLyogVkxDIHRhYmxlcyBmb3IgY29lZmZfdG9rZW4uIEJlY2F1c2Ugb2YgbG9uZyBjb2RlcyAobWF4LiAxNiBiaXRzKSBzb21lIG9mIHRoZQorICogdGFibGVzIGhhdmUgYmVlbiBzcGxpdHRlZCBpbnRvIG11bHRpcGxlIHNlcGFyYXRlIHRhYmxlcy4gRWFjaCBhcnJheS90YWJsZQorICogZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKiBbNSBiaXRzIGZvciB0b3QuY29lZmYuXSBbNiBiaXRzIGZvciB0ci5vbmVzXSBbNSBiaXRzIGZvciBWTEMgbGVuZ3RoXQorICogSWYgdGhlcmUgaXMgYSAweDAwMDAgdmFsdWUsIGl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm90IGNvcnJlc3BvbmRpbmcgVkxDCisgKiBjb2Rld29yZCBmb3IgdGhhdCBpbmRleC4gKi8KKworLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCAwIDw9IG5DIDwgMiAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8wWzMyXSA9IHsKKyAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDIwNjYsMHgxMDI2LDB4MDgwNiwweDE4NjUsMHgxODY1LAorICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsCisgICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwKKyAgICAweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyfTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMVs0OF0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4NDA2YSwweDMwNGEsMHgyODJhLDB4MjAwYSwKKyAgICAweDM4NjksMHgzODY5LDB4Mjg0OSwweDI4NDksMHgyMDI5LDB4MjAyOSwweDE4MDksMHgxODA5LAorICAgIDB4MzA2OCwweDMwNjgsMHgzMDY4LDB4MzA2OCwweDIwNDgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsCisgICAgMHgxODI4LDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTAwOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwKKyAgICAweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LAorICAgIDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDd9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAwIDw9IG5DIDwgMiAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8yWzU2XSA9IHsKKyAgICAweDYwNmUsMHg1ODRlLDB4NTAyZSwweDUwMGUsMHg1ODZlLDB4NTA0ZSwweDQ4MmUsMHg0ODBlLAorICAgIDB4NDAwZCwweDQwMGQsMHg0ODRkLDB4NDg0ZCwweDQwMmQsMHg0MDJkLDB4MzgwZCwweDM4MGQsCisgICAgMHg1MDZkLDB4NTA2ZCwweDQwNGQsMHg0MDRkLDB4MzgyZCwweDM4MmQsMHgzMDBkLDB4MzAwZCwKKyAgICAweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLAorICAgIDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsCisgICAgMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwKKyAgICAweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBifTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gMTYgYml0cywgMCA8PSBuQyA8IDIgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfM1szMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDY4MmYsMHg2ODJmLDB4ODAxMCwweDgwNTAsMHg4MDMwLDB4NzgxMCwKKyAgICAweDgwNzAsMHg3ODUwLDB4NzgzMCwweDcwMTAsMHg3ODcwLDB4NzA1MCwweDcwMzAsMHg2ODEwLAorICAgIDB4NzA2ZiwweDcwNmYsMHg2ODRmLDB4Njg0ZiwweDYwMmYsMHg2MDJmLDB4NjAwZiwweDYwMGYsCisgICAgMHg2ODZmLDB4Njg2ZiwweDYwNGYsMHg2MDRmLDB4NTgyZiwweDU4MmYsMHg1ODBmLDB4NTgwZn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMiA8PSBuQyA8IDQgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMFszMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4Mzg2NiwweDIwNDYsMHgyMDI2LDB4MTAwNiwKKyAgICAweDMwNjYsMHgxODQ2LDB4MTgyNiwweDA4MDYsMHgyODY1LDB4Mjg2NSwweDEwMjUsMHgxMDI1LAorICAgIDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwweDE4NjQsCisgICAgMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0M307CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cywgMiA8PSBuQyA8IDQgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMVszMl0gPSB7CisgICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4NDg2OSwweDM4NDksMHgzODI5LDB4MzAwOSwKKyAgICAweDI4MDgsMHgyODA4LDB4MzA0OCwweDMwNDgsMHgzMDI4LDB4MzAyOCwweDIwMDgsMHgyMDA4LAorICAgIDB4NDA2NywweDQwNjcsMHg0MDY3LDB4NDA2NywweDI4NDcsMHgyODQ3LDB4Mjg0NywweDI4NDcsCisgICAgMHgyODI3LDB4MjgyNywweDI4MjcsMHgyODI3LDB4MTgwNywweDE4MDcsMHgxODA3LDB4MTgwN307CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDE0IGJpdHMsIDIgPD0gbkMgPCA0ICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzJbMTI4XSA9IHsKKyAgICAweDAwMDAsMHgwMDAwLDB4Nzg2ZCwweDc4NmQsMHg4MDZlLDB4ODA0ZSwweDgwMmUsMHg4MDBlLAorICAgIDB4NzgyZSwweDc4MGUsMHg3ODRlLDB4NzAyZSwweDcwNGQsMHg3MDRkLDB4NzAwZCwweDcwMGQsCisgICAgMHg3MDZkLDB4NzA2ZCwweDY4NGQsMHg2ODRkLDB4NjgyZCwweDY4MmQsMHg2ODBkLDB4NjgwZCwKKyAgICAweDY4NmQsMHg2ODZkLDB4NjA0ZCwweDYwNGQsMHg2MDJkLDB4NjAyZCwweDYwMGQsMHg2MDBkLAorICAgIDB4NTgwYywweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4NGMsMHg1ODRjLDB4NTg0YywweDU4NGMsCisgICAgMHg1ODJjLDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTAwYywweDUwMGMsMHg1MDBjLDB4NTAwYywKKyAgICAweDYwNmMsMHg2MDZjLDB4NjA2YywweDYwNmMsMHg1MDRjLDB4NTA0YywweDUwNGMsMHg1MDRjLAorICAgIDB4NTAyYywweDUwMmMsMHg1MDJjLDB4NTAyYywweDQ4MGMsMHg0ODBjLDB4NDgwYywweDQ4MGMsCisgICAgMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwKKyAgICAweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLAorICAgIDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsCisgICAgMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwKKyAgICAweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLAorICAgIDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsCisgICAgMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwKKyAgICAweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBifTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCA0IDw9IG5DIDwgOCAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuNF8wWzY0XSA9IHsKKyAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLAorICAgIDB4MTgwNiwweDM4NDYsMHgzODI2LDB4MTAwNiwweDQ4NjYsMHgzMDQ2LDB4MzAyNiwweDA4MDYsCisgICAgMHgyODI1LDB4MjgyNSwweDI4NDUsMHgyODQ1LDB4MjAyNSwweDIwMjUsMHgyMDQ1LDB4MjA0NSwKKyAgICAweDE4MjUsMHgxODI1LDB4NDA2NSwweDQwNjUsMHgxODQ1LDB4MTg0NSwweDEwMjUsMHgxMDI1LAorICAgIDB4Mzg2NCwweDM4NjQsMHgzODY0LDB4Mzg2NCwweDMwNjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsCisgICAgMHgyODY0LDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwKKyAgICAweDE4NjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxMDQ0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LAorICAgIDB4MDgyNCwweDA4MjQsMHgwODI0LDB4MDgyNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDR9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byAxMCBiaXRzLCA0IDw9IG5DIDwgOCAqLworc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuNF8xWzEyOF0gPSB7CisgICAgMHgwMDAwLDB4ODAwYSwweDgwNmEsMHg4MDRhLDB4ODAyYSwweDc4MGEsMHg3ODZhLDB4Nzg0YSwKKyAgICAweDc4MmEsMHg3MDBhLDB4NzA2YSwweDcwNGEsMHg3MDJhLDB4NjgwYSwweDY4MjksMHg2ODI5LAorICAgIDB4NjAwOSwweDYwMDksMHg2ODQ5LDB4Njg0OSwweDYwMjksMHg2MDI5LDB4NTgwOSwweDU4MDksCisgICAgMHg2ODY5LDB4Njg2OSwweDYwNDksMHg2MDQ5LDB4NTgyOSwweDU4MjksMHg1MDA5LDB4NTAwOSwKKyAgICAweDYwNjgsMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg1ODQ4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LAorICAgIDB4NTAyOCwweDUwMjgsMHg1MDI4LDB4NTAyOCwweDQ4MDgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsCisgICAgMHg1ODY4LDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTA0OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwKKyAgICAweDQ4MjgsMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0MDA4LDB4NDAwOCwweDQwMDgsMHg0MDA4LAorICAgIDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsCisgICAgMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywKKyAgICAweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LAorICAgIDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsCisgICAgMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywKKyAgICAweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LAorICAgIDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsCisgICAgMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwN307CisKKy8qIGZpeGVkIDYgYml0IGxlbmd0aCBWTEMsIG5DIDw9IDggKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjhbNjRdID0geworICAgIDB4MDgwNiwweDA4MjYsMHgwMDAwLDB4MDAwNiwweDEwMDYsMHgxMDI2LDB4MTA0NiwweDAwMDAsCisgICAgMHgxODA2LDB4MTgyNiwweDE4NDYsMHgxODY2LDB4MjAwNiwweDIwMjYsMHgyMDQ2LDB4MjA2NiwKKyAgICAweDI4MDYsMHgyODI2LDB4Mjg0NiwweDI4NjYsMHgzMDA2LDB4MzAyNiwweDMwNDYsMHgzMDY2LAorICAgIDB4MzgwNiwweDM4MjYsMHgzODQ2LDB4Mzg2NiwweDQwMDYsMHg0MDI2LDB4NDA0NiwweDQwNjYsCisgICAgMHg0ODA2LDB4NDgyNiwweDQ4NDYsMHg0ODY2LDB4NTAwNiwweDUwMjYsMHg1MDQ2LDB4NTA2NiwKKyAgICAweDU4MDYsMHg1ODI2LDB4NTg0NiwweDU4NjYsMHg2MDA2LDB4NjAyNiwweDYwNDYsMHg2MDY2LAorICAgIDB4NjgwNiwweDY4MjYsMHg2ODQ2LDB4Njg2NiwweDcwMDYsMHg3MDI2LDB4NzA0NiwweDcwNjYsCisgICAgMHg3ODA2LDB4NzgyNiwweDc4NDYsMHg3ODY2LDB4ODAwNiwweDgwMjYsMHg4MDQ2LDB4ODA2Nn07CisKKy8qIFZMQyBsZW5ndGhzIHVwIHRvIDMgYml0cywgbkMgPT0gLTEgKi8KK3N0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbk1pbnVzMV8wWzhdID0geworICAgIDB4MDAwMCwweDEwNDMsMHgwMDAyLDB4MDAwMiwweDA4MjEsMHgwODIxLDB4MDgyMSwweDA4MjF9OworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA4IGJpdHMsIG5DID09IC0xICovCitzdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMVszMl0gPSB7CisgICAgMHgyMDY3LDB4MjA2NywweDIwNDgsMHgyMDI4LDB4MTg0NywweDE4NDcsMHgxODI3LDB4MTgyNywKKyAgICAweDIwMDYsMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgxODA2LDB4MTgwNiwweDE4MDYsMHgxODA2LAorICAgIDB4MTAwNiwweDEwMDYsMHgxMDA2LDB4MTAwNiwweDE4NjYsMHgxODY2LDB4MTg2NiwweDE4NjYsCisgICAgMHgxMDI2LDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MDgwNiwweDA4MDYsMHgwODA2LDB4MDgwNn07CisKKy8qIFZMQyB0YWJsZXMgZm9yIHRvdGFsX3plcm9zLiBPbmUgdGFibGUgY29udGFpbmluZyBsb25nZXIgY29kZSwgdG90YWxaZXJvc18xLAorICogaGFzIGJlZW4gYnJva2VuIGludG8gdHdvIHNlcGFyYXRlIHRhYmxlcy4gVGFibGUgZWxlbWVudHMgaGF2ZSB0aGUKKyAqIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKiBbNCBiaXRzIGZvciBpbmZvXSBbNCBiaXRzIGZvciBWTEMgbGVuZ3RoXSAqLworCisvKiBWTEMgbGVuZ3RocyB1cCB0byA1IGJpdHMgKi8KK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzFfMFszMl0gPSB7CisgICAgMHgwMCwweDAwLDB4NjUsMHg1NSwweDQ0LDB4NDQsMHgzNCwweDM0LAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgxMywweDEzLDB4MTMsMHgxMywKKyAgICAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisgICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxfTsKKworLyogVkxDIGxlbmd0aHMgdXAgdG8gOSBiaXRzICovCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzFbMzJdID0geworICAgIDB4MDAsMHhmOSwweGU5LDB4ZDksMHhjOCwweGM4LDB4YjgsMHhiOCwKKyAgICAweGE3LDB4YTcsMHhhNywweGE3LDB4OTcsMHg5NywweDk3LDB4OTcsCisgICAgMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LAorICAgIDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3Nn07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzJbNjRdID0geworICAgIDB4ZTYsMHhkNiwweGM2LDB4YjYsMHhhNSwweGE1LDB4OTUsMHg5NSwKKyAgICAweDg0LDB4ODQsMHg4NCwweDg0LDB4NzQsMHg3NCwweDc0LDB4NzQsCisgICAgMHg2NCwweDY0LDB4NjQsMHg2NCwweDU0LDB4NTQsMHg1NCwweDU0LAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywKKyAgICAweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDN9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18zWzY0XSA9IHsKKyAgICAweGQ2LDB4YjYsMHhjNSwweGM1LDB4YTUsMHhhNSwweDk1LDB4OTUsCisgICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDU0LDB4NTQsMHg1NCwweDU0LAorICAgIDB4NDQsMHg0NCwweDQ0LDB4NDQsMHgwNCwweDA0LDB4MDQsMHgwNCwKKyAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAorICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKKyAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCisgICAgMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNFszMl0gPSB7CisgICAgMHhjNSwweGI1LDB4YTUsMHgwNSwweDk0LDB4OTQsMHg3NCwweDc0LAorICAgIDB4MzQsMHgzNCwweDI0LDB4MjQsMHg4MywweDgzLDB4ODMsMHg4MywKKyAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg0MywweDQzLDB4NDMsMHg0MywweDEzLDB4MTMsMHgxMywweDEzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNVszMl0gPSB7CisgICAgMHhiNSwweDk1LDB4YTQsMHhhNCwweDg0LDB4ODQsMHgyNCwweDI0LAorICAgIDB4MTQsMHgxNCwweDA0LDB4MDQsMHg3MywweDczLDB4NzMsMHg3MywKKyAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NTMsMHg1MywweDUzLDB4NTMsCisgICAgMHg0MywweDQzLDB4NDMsMHg0MywweDMzLDB4MzMsMHgzMywweDMzfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNls2NF0gPSB7CisgICAgMHhhNiwweDA2LDB4MTUsMHgxNSwweDg0LDB4ODQsMHg4NCwweDg0LAorICAgIDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywKKyAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAorICAgIDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywKKyAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCisgICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAorICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyM307CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzdbNjRdID0geworICAgIDB4OTYsMHgwNiwweDE1LDB4MTUsMHg3NCwweDc0LDB4NzQsMHg3NCwKKyAgICAweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsCisgICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAorICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTJ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc184WzY0XSA9IHsKKyAgICAweDg2LDB4MDYsMHgyNSwweDI1LDB4MTQsMHgxNCwweDE0LDB4MTQsCisgICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAorICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKKyAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCisgICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAorICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOVs2NF0gPSB7CisgICAgMHgxNiwweDA2LDB4NzUsMHg3NSwweDI0LDB4MjQsMHgyNCwweDI0LAorICAgIDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywKKyAgICAweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsCisgICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAorICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKKyAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCisgICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLAorICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMn07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEwWzMyXSA9IHsKKyAgICAweDE1LDB4MDUsMHg2NCwweDY0LDB4MjMsMHgyMywweDIzLDB4MjMsCisgICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAorICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKKyAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OworCitzdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMVsxNl0gPSB7CisgICAgMHgwNCwweDE0LDB4MjMsMHgyMywweDMzLDB4MzMsMHg1MywweDUzLAorICAgIDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MX07CisKK3N0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEyWzE2XSA9IHsKKyAgICAweDA0LDB4MTQsMHg0MywweDQzLDB4MjIsMHgyMiwweDIyLDB4MjIsCisgICAgMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTNbOF0gPSB7MHgwMywweDEzLDB4MzIsMHgzMiwweDIxLDB4MjEsMHgyMSwweDIxfTsKKworc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTRbNF0gPSB7MHgwMiwweDEyLDB4MjEsMHgyMX07CisKKy8qIFZMQyB0YWJsZXMgZm9yIHJ1bl9iZWZvcmUuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKiBbNCBiaXRzIGZvciBpbmZvXSBbNGJpdHMgZm9yIFZMQyBsZW5ndGhdCisgKi8KKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV82WzhdID0gezB4MTMsMHgyMywweDQzLDB4MzMsMHg2MywweDUzLDB4MDIsMHgwMn07CisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNVs4XSA9IHsweDUzLDB4NDMsMHgzMywweDIzLDB4MTIsMHgxMiwweDAyLDB4MDJ9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzRbOF0gPSB7MHg0MywweDMzLDB4MjIsMHgyMiwweDEyLDB4MTIsMHgwMiwweDAyfTsKKworc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8zWzRdID0gezB4MzIsMHgyMiwweDEyLDB4MDJ9OworCitzdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzJbNF0gPSB7MHgyMiwweDEyLDB4MDEsMHgwMX07CisKK3N0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfMVsyXSA9IHsweDExLDB4MDF9OworCisvKiBmb2xsb3dpbmcgZm91ciBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIHN0cmVhbSBidWZmZXIgImNhY2hlIiBpbiB0aGUgQ0FWTEMKKyAqIGRlY29kaW5nIGZ1bmN0aW9uICovCisKKy8qIG1hY3JvIHRvIGluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBjYWNoZSwgZmlsbHMgdGhlIGJ1ZmZlciAoMzIgYml0cykgKi8KKyNkZWZpbmUgQlVGRkVSX0lOSVQodmFsdWUsIGJpdHMpIFwKK3sgXAorICAgIGJpdHMgPSAzMjsgXAorICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAorfQorCisvKiBtYWNybyB0byByZWFkIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIsIGJpdHMgd2lsbCBiZSB3cml0dGVuIHRvCisgKiBvdXRWYWwuIFJlZmlsbHMgdGhlIGJ1ZmZlciBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdCAqLworI2RlZmluZSBCVUZGRVJfU0hPVyh2YWx1ZSwgYml0cywgb3V0VmFsLCBudW1CaXRzKSBcCit7IFwKKyAgICBpZiAoYml0cyA8IChudW1CaXRzKSkgXAorICAgIHsgXAorICAgICAgICBpZihoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMi1iaXRzKSA9PSBFTkRfT0ZfU1RSRUFNKSBcCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7IFwKKyAgICAgICAgdmFsdWUgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCisgICAgICAgIGJpdHMgPSAzMjsgXAorICAgIH0gXAorICAgIChvdXRWYWwpID0gdmFsdWUgPj4gKDMyIC0gKG51bUJpdHMpKTsgXAorfQorCisvKiBtYWNybyB0byBmbHVzaCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyICovCisjZGVmaW5lIEJVRkZFUl9GTFVTSCh2YWx1ZSwgYml0cywgbnVtQml0cykgXAoreyBcCisgICAgdmFsdWUgPDw9IChudW1CaXRzKTsgXAorICAgIGJpdHMgLT0gKG51bUJpdHMpOyBcCit9CisKKy8qIG1hY3JvIHRvIHJlYWQgYW5kIGZsdXNoICBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbgorICogdG8gb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KKyNkZWZpbmUgQlVGRkVSX0dFVCh2YWx1ZSwgYml0cywgb3V0VmFsLCBudW1CaXRzKSBcCit7IFwKKyAgICBpZiAoYml0cyA8IChudW1CaXRzKSkgXAorICAgIHsgXAorICAgICAgICBpZihoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMi1iaXRzKSA9PSBFTkRfT0ZfU1RSRUFNKSBcCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7IFwKKyAgICAgICAgdmFsdWUgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCisgICAgICAgIGJpdHMgPSAzMjsgXAorICAgIH0gXAorICAgIChvdXRWYWwpID0gdmFsdWUgPj4gKDMyIC0gKG51bUJpdHMpKTsgXAorICAgIHZhbHVlIDw8PSAobnVtQml0cyk7IFwKKyAgICBiaXRzIC09IChudW1CaXRzKTsgXAorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlQ29lZmZUb2tlbih1MzIgYml0cywgdTMyIG5jKTsKKworc3RhdGljIHUzMiBEZWNvZGVMZXZlbFByZWZpeCh1MzIgYml0cyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlVG90YWxaZXJvcyh1MzIgYml0cywgdTMyIHRvdGFsQ29lZmYsIHUzMiBpc0Nocm9tYURDKTsKKworc3RhdGljIHUzMiBEZWNvZGVSdW5CZWZvcmUodTMyIGJpdHMsdTMyIHplcm9zTGVmdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlQ29lZmZUb2tlbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGNvZWZmX3Rva2VuIGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDE2IHN0cmVhbSBiaXRzCisgICAgICAgICAgdTMyIG5jICAgICAgICAgICAgICAgICAgICBuQywgc2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICB1MzIgIGluZm9ybWF0aW9uIGZpZWxkICgxMSBiaXRzIGZvciB2YWx1ZSwgNSBiaXRzIGZvciBsZW5ndGgpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVDb2VmZlRva2VuKHUzMiBiaXRzLCB1MzIgbmMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHZhbHVlOworCisvKiBDb2RlICovCisKKyAgICAvKiBzdGFuZGFyZCBkZWZpbmVzIHRoYXQgbmMgZm9yIGRlY29kaW5nIG9mIGNocm9tYSBkYyBjb2VmZmljaWVudHMgaXMgLTEsCisgICAgICogcmVwcmVzZW50ZWQgYnkgdTMyIGhlcmUgLT4gLTEgbWFwcyB0byAyXjMyIC0gMSAqLworICAgIEFTU0VSVChuYyA8PSAxNiB8fCBuYyA9PSAodTMyKSgtMSkpOworCisgICAgaWYgKG5jIDwgMikKKyAgICB7CisgICAgICAgIGlmIChiaXRzID49IDB4ODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSAweDAwMDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDBDMDApCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4wXzBbYml0cyA+PiAxMF07CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMTAwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8xW2JpdHMgPj4gNl07CisgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDIwKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8yWyhiaXRzPj4yKS04XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMF8zW2JpdHNdOworICAgIH0KKyAgICBlbHNlIGlmIChuYyA8IDQpCisgICAgeworICAgICAgICBpZiAoYml0cyA+PSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gYml0cyAmIDB4NDAwMCA/IDB4MDAwMiA6IDB4MDgyMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MTAwMCkKKyAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMFtiaXRzID4+IDEwXTsKKyAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDAyMDApCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzFbYml0cyA+PiA3XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8yW2JpdHM+PjJdOworICAgIH0KKyAgICBlbHNlIGlmIChuYyA8IDgpCisgICAgeworICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW40XzBbYml0cyA+PiAxMF07CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW40XzFbYml0cz4+Nl07CisgICAgfQorICAgIGVsc2UgaWYgKG5jIDw9IDE2KQorICAgIHsKKyAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuOFtiaXRzPj4xMF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbk1pbnVzMV8wW2JpdHMgPj4gMTNdOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuTWludXMxXzFbYml0cz4+OF07CisgICAgfQorCisgICAgcmV0dXJuKHZhbHVlKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUxldmVsUHJlZml4CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgbGV2ZWxfcHJlZml4IGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICB1MzIgYml0cyAgICAgIG5leHQgMTYgc3RyZWFtIGJpdHMKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHUzMiAgbGV2ZWxfcHJlZml4IGluZm9ybWF0aW9uIGZpZWxkIG9yIFZMQ19OT1RfRk9VTkQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZUxldmVsUHJlZml4KHUzMiBiaXRzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBudW1aZXJvczsKKworLyogQ29kZSAqLworCisgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQorICAgICAgICBudW1aZXJvcyA9IDA7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDQwMDApCisgICAgICAgIG51bVplcm9zID0gMTsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MjAwMCkKKyAgICAgICAgbnVtWmVyb3MgPSAyOworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMDAwKQorICAgICAgICBudW1aZXJvcyA9IDM7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDA4MDApCisgICAgICAgIG51bVplcm9zID0gNDsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDQwMCkKKyAgICAgICAgbnVtWmVyb3MgPSA1OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMjAwKQorICAgICAgICBudW1aZXJvcyA9IDY7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAxMDApCisgICAgICAgIG51bVplcm9zID0gNzsKKyAgICBlbHNlIGlmIChiaXRzID49IDB4MDA4MCkKKyAgICAgICAgbnVtWmVyb3MgPSA4OworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDQwKQorICAgICAgICBudW1aZXJvcyA9IDk7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMjApCisgICAgICAgIG51bVplcm9zID0gMTA7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMTApCisgICAgICAgIG51bVplcm9zID0gMTE7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDgpCisgICAgICAgIG51bVplcm9zID0gMTI7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDQpCisgICAgICAgIG51bVplcm9zID0gMTM7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDIpCisgICAgICAgIG51bVplcm9zID0gMTQ7CisgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMDEpCisgICAgICAgIG51bVplcm9zID0gMTU7CisgICAgZWxzZSAvKiBtb3JlIHRoYW4gMTUgemVyb3MgZW5jb3VudGVyZWQgd2hpY2ggaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuKFZMQ19OT1RfRk9VTkQpOworCisgICAgcmV0dXJuKG51bVplcm9zKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVRvdGFsWmVyb3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSB0b3RhbF96ZXJvcyBpbmZvcm1hdGlvbiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgdTMyIGJpdHMgICAgICAgICAgICAgICAgICBuZXh0IDkgc3RyZWFtIGJpdHMKKyAgICAgICAgICB1MzIgdG90YWxDb2VmZiAgICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIHRoZSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgZGVjb2RlZAorICAgICAgICAgIHUzMiBpc0Nocm9tYURDICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGNocm9tYSBEQyBibG9jaworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoNCBiaXRzIHZhbHVlLCA0IGJpdHMgbGVuZ3RoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlVG90YWxaZXJvcyh1MzIgYml0cywgdTMyIHRvdGFsQ29lZmYsIHUzMiBpc0Nocm9tYURDKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YWx1ZSA9IDB4MDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHRvdGFsQ29lZmYpOworCisgICAgaWYgKCFpc0Nocm9tYURDKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHRvdGFsQ29lZmYgPCAxNik7CisgICAgICAgIHN3aXRjaCAodG90YWxDb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xXzBbYml0cyA+PiA0XTsKKyAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMV8xW2JpdHNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzJbYml0cyA+PiAzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18zW2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNFtiaXRzID4+IDRdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzVbYml0cyA+PiA0XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc182W2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfN1tiaXRzID4+IDNdOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzhbYml0cyA+PiAzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc185W2JpdHMgPj4gM107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEwW2JpdHMgPj4gNF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzExW2JpdHMgPj4gNV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEyW2JpdHMgPj4gNV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzEzW2JpdHMgPj4gNl07CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzE0W2JpdHMgPj4gN107CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMTUgKi8KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IChiaXRzID4+IDgpID8gMHgxMSA6IDB4MDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQVNTRVJUKHRvdGFsQ29lZmYgPCA0KTsKKyAgICAgICAgYml0cyA+Pj0gNjsKKyAgICAgICAgaWYgKGJpdHMgPiAzKQorICAgICAgICAgICAgdmFsdWUgPSAweDAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0b3RhbENvZWZmID09IDMpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDExOworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDEyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodG90YWxDb2VmZiA9PSAyKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgyMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDIzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHgzMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybih2YWx1ZSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSdW5CZWZvcmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBydW5fYmVmb3JlIGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICB1MzIgYml0cyAgICAgICAgICAgICAgICAgIG5leHQgMTEgc3RyZWFtIGJpdHMKKyAgICAgICAgICB1MzIgemVyb3NMZWZ0ICAgICAgICAgICAgIG51bWJlciBvZiB6ZXJvcyBsZWZ0IGZvciB0aGUgY3VycmVudCBibG9jaworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgdTMyICBpbmZvcm1hdGlvbiBmaWVsZCAoNCBiaXRzIHZhbHVlLCA0IGJpdHMgbGVuZ3RoKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlUnVuQmVmb3JlKHUzMiBiaXRzLCB1MzIgemVyb3NMZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB2YWx1ZSA9IDB4MDsKKworLyogQ29kZSAqLworCisgICAgc3dpdGNoICh6ZXJvc0xlZnQpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8xW2JpdHM+PjEwXTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzJbYml0cz4+OV07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV8zW2JpdHM+PjldOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNFtiaXRzPj44XTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzVbYml0cz4+OF07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV82W2JpdHM+PjhdOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChiaXRzID49IDB4MTAwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gKCg3LShiaXRzPj44KSk8PDQpKzB4MzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg4MCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4NzQ7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4NDApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAweDg1OworICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDIwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHg5NjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4YTc7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4OCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4Yjg7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4NCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4Yzk7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ZEE7CisgICAgICAgICAgICBlbHNlIGlmIChiaXRzKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMHhlQjsKKyAgICAgICAgICAgIGlmIChJTkZPKHZhbHVlKSA+IHplcm9zTGVmdCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4odmFsdWUpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgb25lIENBVkxDIGNvZGVkIGJsb2NrLiBUaGlzIGNvcnJlc3BvbmRzIHRvCisgICAgICAgICAgc3ludGF4IGVsZW1lbnRzIHJlc2lkdWFsX2Jsb2NrX2NhdmxjKCkgaW4gdGhlIHN0YW5kYXJkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwU3RybURhdGEgICAgICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICBuYyAgICAgICAgICAgICAgICAgICAgbkMgdmFsdWUKKyAgICAgICAgICBtYXhOdW1Db2VmZiAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgcmVzaWR1YWwgY29lZmZpY2llbnRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBjb2VmZkxldmVsICAgICAgICAgICAgc3RvcmVzIGRlY29kZWQgY29lZmZpY2llbnQgbGV2ZWxzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBudW1Db2VmZnMgICAgICAgICAgICAgb24gYml0cyBbNCwxMV0gaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgIGNvZWZmTWFwICAgICAgICAgICAgICBvbiBiaXRzIFsxNiwzMV0gaWYgc3VjY2Vzc2Z1bCwgdGhpcyBpcyBiaXQgbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGVhY2ggYml0IGluZGljYXRlcyBpZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCB3YXMgemVybyAoMCkgb3Igbm9uLXplcm8gKDEpCisgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICAgIGVuZCBvZiBzdHJlYW0gb3IgZXJyb3IgaW4gc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIGkzMiAqY29lZmZMZXZlbCwKKyAgaTMyIG5jLAorICB1MzIgbWF4TnVtQ29lZmYpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcCwgdG90YWxDb2VmZiwgdHJhaWxpbmdPbmVzLCBzdWZmaXhMZW5ndGgsIGxldmVsUHJlZml4OworICAgIHUzMiBsZXZlbFN1ZmZpeCwgemVyb3NMZWZ0LCBiaXQ7CisgICAgaTMyIGxldmVsWzE2XTsKKyAgICB1MzIgcnVuWzE2XTsKKyAgICAvKiBzdHJlYW0gImNhY2hlIiAqLworICAgIHUzMiBidWZmZXJWYWx1ZTsKKyAgICB1MzIgYnVmZmVyQml0czsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKGNvZWZmTGV2ZWwpOworICAgIEFTU0VSVChuYyA+IC0yKTsKKyAgICBBU1NFUlQobWF4TnVtQ29lZmYgPT0gNCB8fCBtYXhOdW1Db2VmZiA9PSAxNSB8fCBtYXhOdW1Db2VmZiA9PSAxNik7CisgICAgQVNTRVJUKFZMQ19OT1RfRk9VTkQgIT0gRU5EX09GX1NUUkVBTSk7CisKKyAgICAvKiBhc3N1bWUgdGhhdCBjb2VmZkxldmVsIGFycmF5IGhhcyBiZWVuICJjbGVhbmVkIiBieSBjYWxsZXIgKi8KKworICAgIEJVRkZFUl9JTklUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzKTsKKworICAgIC8qbGludCAtZTc3NCBkaXNhYmxlIGxpbnQgd2FybmluZyBvbiBhbHdheXMgZmFsc2UgY29tcGFyaXNvbiAqLworICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIDE2KTsKKyAgICAvKmxpbnQgK2U3NzQgKi8KKyAgICB0bXAgPSBEZWNvZGVDb2VmZlRva2VuKGJpdCwgKHUzMiluYyk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSF9UQyh0bXApKTsKKworICAgIHRvdGFsQ29lZmYgPSBUT1RBTF9DT0VGRih0bXApOworICAgIGlmICh0b3RhbENvZWZmID4gbWF4TnVtQ29lZmYpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB0cmFpbGluZ09uZXMgPSBUUkFJTElOR19PTkVTKHRtcCk7CisKKyAgICBpZiAodG90YWxDb2VmZiAhPSAwKQorICAgIHsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIC8qIG5vbnplcm8gY29lZmZpY2llbnRzOiArLy0gMSAqLworICAgICAgICBpZiAodHJhaWxpbmdPbmVzKQorICAgICAgICB7CisgICAgICAgICAgICBCVUZGRVJfR0VUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsIHRyYWlsaW5nT25lcyk7CisgICAgICAgICAgICB0bXAgPSAxIDw8ICh0cmFpbGluZ09uZXMgLSAxKTsKKyAgICAgICAgICAgIGZvciAoOyB0bXA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtpXSA9IGJpdCAmIHRtcCA/IC0xIDogMTsKKyAgICAgICAgICAgICAgICB0bXAgPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBvdGhlciBsZXZlbHMgKi8KKyAgICAgICAgaWYgKHRvdGFsQ29lZmYgPiAxMCAmJiB0cmFpbGluZ09uZXMgPCAzKQorICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMDsKKworICAgICAgICBmb3IgKDsgaSA8IHRvdGFsQ29lZmY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwgMTYpOworICAgICAgICAgICAgbGV2ZWxQcmVmaXggPSBEZWNvZGVMZXZlbFByZWZpeChiaXQpOworICAgICAgICAgICAgaWYgKGxldmVsUHJlZml4ID09IFZMQ19OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBsZXZlbFByZWZpeCsxKTsKKworICAgICAgICAgICAgaWYgKGxldmVsUHJlZml4IDwgMTQpCisgICAgICAgICAgICAgICAgdG1wID0gc3VmZml4TGVuZ3RoOworICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWxQcmVmaXggPT0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gc3VmZml4TGVuZ3RoID8gc3VmZml4TGVuZ3RoIDogNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzZXR0aW5nIHN1ZmZpeExlbmd0aCB0byAxIGhlcmUgY29ycmVzcG9uZHMgdG8gYWRkaW5nIDE1CisgICAgICAgICAgICAgICAgICogdG8gbGV2ZWxDb2RlIHZhbHVlIGlmIGxldmVsUHJlZml4ID09IDE1IGFuZAorICAgICAgICAgICAgICAgICAqIHN1ZmZpeExlbmd0aCA9PSAwICovCisgICAgICAgICAgICAgICAgaWYgKCFzdWZmaXhMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7CisgICAgICAgICAgICAgICAgdG1wID0gMTI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdWZmaXhMZW5ndGgpCisgICAgICAgICAgICAgICAgbGV2ZWxQcmVmaXggPDw9IHN1ZmZpeExlbmd0aDsKKworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCVUZGRVJfR0VUKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBsZXZlbFN1ZmZpeCwgdG1wKTsKKyAgICAgICAgICAgICAgICBsZXZlbFByZWZpeCArPSBsZXZlbFN1ZmZpeDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wID0gbGV2ZWxQcmVmaXg7CisKKyAgICAgICAgICAgIGlmIChpID09IHRyYWlsaW5nT25lcyAmJiB0cmFpbGluZ09uZXMgPCAzKQorICAgICAgICAgICAgICAgIHRtcCArPSAyOworCisgICAgICAgICAgICBsZXZlbFtpXSA9ICh0bXArMik+PjE7CisKKyAgICAgICAgICAgIGlmIChzdWZmaXhMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOworCisgICAgICAgICAgICBpZiAoKGxldmVsW2ldID4gKDMgPDwgKHN1ZmZpeExlbmd0aCAtIDEpKSkgJiYgc3VmZml4TGVuZ3RoIDwgNikKKyAgICAgICAgICAgICAgICBzdWZmaXhMZW5ndGgrKzsKKworICAgICAgICAgICAgaWYgKHRtcCAmIDB4MSkKKyAgICAgICAgICAgICAgICBsZXZlbFtpXSA9IC1sZXZlbFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHplcm8gcnVucyAqLworICAgICAgICBpZiAodG90YWxDb2VmZiA8IG1heE51bUNvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LDkpOworICAgICAgICAgICAgemVyb3NMZWZ0ID0gRGVjb2RlVG90YWxaZXJvcyhiaXQsIHRvdGFsQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikobWF4TnVtQ29lZmYgPT0gNCkpOworICAgICAgICAgICAgaWYgKCF6ZXJvc0xlZnQpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEgoemVyb3NMZWZ0KSk7CisgICAgICAgICAgICB6ZXJvc0xlZnQgPSBJTkZPKHplcm9zTGVmdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgemVyb3NMZWZ0ID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDb2VmZiAtIDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHplcm9zTGVmdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwxMSk7CisgICAgICAgICAgICAgICAgdG1wID0gRGVjb2RlUnVuQmVmb3JlKGJpdCwgemVyb3NMZWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAoIXRtcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIKHRtcCkpOworICAgICAgICAgICAgICAgIHJ1bltpXSA9IElORk8odG1wKTsKKyAgICAgICAgICAgICAgICB6ZXJvc0xlZnQgLT0gcnVuW2ldKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnVuW2ldID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbWJpbmluZyBsZXZlbCBhbmQgcnVuLCBsZXZlbFN1ZmZpeCB2YXJpYWJsZSB1c2VkIHRvIGhvbGQgY29lZmZNYXAsCisgICAgICAgICAqIGkuZS4gYml0IG1hcCBpbmRpY2F0aW5nIHdoaWNoIGNvZWZmaWNpZW50cyBoYWQgbm9uLXplcm8gdmFsdWUuICovCisKKyAgICAgICAgLypsaW50IC1lc3ltKDc3MSxsZXZlbCxydW4pIGxldmVsIGFuZCBydW4gYXJlIGFsd2F5cyBpbml0aWFsaXplZCAqLworICAgICAgICB0bXAgPSB6ZXJvc0xlZnQ7CisgICAgICAgIGNvZWZmTGV2ZWxbdG1wXSA9IGxldmVsW3RvdGFsQ29lZmYtMV07CisgICAgICAgIGxldmVsU3VmZml4ID0gMSA8PCB0bXA7CisgICAgICAgIGZvciAoaSA9IHRvdGFsQ29lZmYtMTsgaS0tOykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wICs9IHJ1bltpXTsKKyAgICAgICAgICAgIGxldmVsU3VmZml4IHw9IDEgPDwgdG1wOworICAgICAgICAgICAgY29lZmZMZXZlbFt0bXBdID0gbGV2ZWxbaV07CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxldmVsU3VmZml4ID0gMDsKKworICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzItYnVmZmVyQml0cykgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4oKHRvdGFsQ29lZmYgPDwgNCkgfCAobGV2ZWxTdWZmaXggPDwgMTYpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDM1M2QzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19DQVZMQ19ICisjZGVmaW5lIEgyNjRTV0RFQ19DQVZMQ19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBpMzIgKmNvZWZmTGV2ZWwsCisgIGkzMiBuYywKKyAgdTMyIG1heE51bUNvZWZmKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ0FWTENfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmJhYmE1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jZmcuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0NGR19ICisjZGVmaW5lIEgyNjRTV0RFQ19DRkdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX05VTV9SRUZfUElDUyAxNgorI2RlZmluZSBNQVhfTlVNX1NMSUNFX0dST1VQUyA4CisjZGVmaW5lIE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgMzIKKyNkZWZpbmUgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyAyNTYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ0ZHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDkzZmI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKQEAgLTAsMCArMSw2MjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkQ29uY2VhbAorICAgICAgICAgIENvbmNlYWxNYgorICAgICAgICAgIFRyYW5zZm9ybQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfY29uY2VhbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKmxpbnQgLWU3MDIgZGlzYWJsZSBsaW50IHdhcm5pbmcgb24gcmlnaHQgc2hpZnQgb2Ygc2lnbmVkIHF1YW50aXR5ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBDb25jZWFsTWIobWJTdG9yYWdlX3QgKnBNYiwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgcm93LCB1MzIgY29sLAorICAgIHUzMiBzbGljZVR5cGUsIHU4ICpkYXRhKTsKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtKGkzMiAqZGF0YSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ29uY2VhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZXJmb3JtIGVycm9yIGNvbmNlYWxtZW50IGZvciBhIHBpY3R1cmUuIFR3byB0eXBlcyBvZiBjb25jZWFsbWVudAorICAgICAgICAgICAgaXMgcGVyZm9ybWVkIGJhc2VkIG9uIHNsaWNlVHlwZToKKyAgICAgICAgICAgICAgICAxKSBjb3B5IGZyb20gcHJldmlvdXMgcGljdHVyZSBmb3IgUC1zbGljZXMuCisgICAgICAgICAgICAgICAgMikgY29uY2VhbG1lbnQgZnJvbSBuZWlnaGJvdXIgcGl4ZWxzIGZvciBJLXNsaWNlcworCisgICAgICAgICAgICBJLXR5cGUgY29uY2VhbG1lbnQgaXMgYmFzZWQgb24gaWRlYXMgcHJlc2VudGVkIGJ5IEphcm5vIFR1bGtraS4KKyAgICAgICAgICAgIFRoZSBjb25jZWFsbWVudCBhbGdvcml0aG0gZGV0ZXJtaW5lcyBmcmVxdWVuY3kgZG9tYWluIGNvZWZmaWNpZW50cworICAgICAgICAgICAgZnJvbSB0aGUgbmVpZ2hib3VyIHBpeGVscywgYXBwbGllcyBpbnRlZ2VyIHRyYW5zZm9ybSAodGhlIHNhbWUKKyAgICAgICAgICAgIHRyYW5zZm9ybSB1c2VkIGluIHRoZSByZXNpZHVhbCBwcm9jZXNzaW5nKSBhbmQgdXNlcyB0aGUgcmVzdWx0cyBhcworICAgICAgICAgICAgcGl4ZWwgdmFsdWVzIGZvciBjb25jZWFsZWQgbWFjcm9ibG9ja3MuIFRyYW5zZm9ybSBwcm9kdWNlcyA0eDQKKyAgICAgICAgICAgIGFycmF5IGFuZCBvbmUgcGl4ZWwgdmFsdWUgaGFzIHRvIGJlIHVzZWQgZm9yIDR4NCBsdW1hIGJsb2NrcyBhbmQKKyAgICAgICAgICAgIDJ4MiBjaHJvbWEgYmxvY2tzLgorCisgICAgICAgICAgICBTaW1pbGFyIGNvbmNlYWxtZW50IGlzIHBlcmZvcm1lZCBmb3Igd2hvbGUgcGljdHVyZSAodGhlIGNob2lzZQorICAgICAgICAgICAgb2YgdGhlIHR5cGUgaXMgYmFzZWQgb24gbGFzdCBzdWNjZXNzZnVsbHkgZGVjb2RlZCBzbGljZSBoZWFkZXIgb2YKKyAgICAgICAgICAgIHRoZSBwaWN0dXJlIGJ1dCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uKS4gSXQgaXMKKyAgICAgICAgICAgIGFja25vd2xlZGdlZCB0aGF0IHRoaXMgbWF5IHJlc3VsdCBpbiB3cm9uZyB0eXBlIG9mIGNvbmNlYWxtZW50CisgICAgICAgICAgICB3aGVuIGEgcGljdHVyZSBjb250YWlucyBib3RoIHR5cGVzIG9mIHNsaWNlcy4gSG93ZXZlciwKKyAgICAgICAgICAgIGRldGVybWluYXRpb24gb2Ygc2xpY2UgdHlwZSBtYWNyb2Jsb2NrLWJ5LW1hY3JvYmxvY2sgY2Fubm90CisgICAgICAgICAgICBiZSBkb25lIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8ga25vdyB0byB3aGljaAorICAgICAgICAgICAgc2xpY2UgZWFjaCBjb3JydXB0ZWQgKG5vdCBzdWNjZXNzZnVsbHkgZGVjb2RlZCkgbWFjcm9ibG9jaworICAgICAgICAgICAgYmVsb25ncy4KKworICAgICAgICAgICAgVGhlIGVycm9yIGNvbmNlYWxtZW50IGlzIHN0YXJ0ZWQgYnkgc2VhcmNoaW5nIHRoZSBmaXJzdCBwcm9wb2VybHkKKyAgICAgICAgICAgIGRlY29kZWQgbWFjcm9ibG9jayBhbmQgY29uY2VhbGluZyB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIGluIHF1ZXN0aW9uLiBBZnRlciB0aGF0IGFsbCBtYWNyb2Jsb2NrcyBhYm92ZSB0aGUgcm93IGluIHF1ZXN0aW9uCisgICAgICAgICAgICBhcmUgY29uY2VhbGVkLiBGaW5hbGx5IGNvbmNlYWxtZW50IG9mIHJvd3MgYmVsb3cgaXMgcGVyZm9ybWVkLgorICAgICAgICAgICAgVGhlIG9yZGVyIG9mIGNvbmNlYWxtZW50IGZvciA0eDQgcGljdHVyZSB3aGVyZSBtYWNyb2Jsb2NrIDkgaXMgdGhlCisgICAgICAgICAgICBmaXJzdCBwcm9wZXJseSBkZWNvZGVkIG9uZSBpcyBhcyBmb2xsb3dzIChwcm9wZXJseSBkZWNvZGVkCisgICAgICAgICAgICBtYWNyb2Jsb2NrcyBtYXJrZWQgd2l0aCAneCcsIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgb3JkZXIgb2YKKyAgICAgICAgICAgIGNvbmNlYWxtZW50KToKKworICAgICAgICAgICAgICAgNCAgNiAgOCAxMAorICAgICAgICAgICAgICAgMyAgNSAgNyAgOQorICAgICAgICAgICAgICAgMSAgeCAgeCAgMgorICAgICAgICAgICAgICAxMSAxMiAxMyAxNAorCisgICAgICAgICAgICBJZiBhbGwgbWFjcm9ibG9ja3Mgb2YgdGhlIHBpY3R1cmUgYXJlIGxvc3QsIHRoZSBjb25jZWFsbWVudCBpcworICAgICAgICAgICAgY29weSBvZiBwcmV2aW91cyBwaWN0dXJlIGZvciBQLXR5cGUgYW5kIHNldHRpbmcgdGhlIGltYWdlIHRvCisgICAgICAgICAgICBjb25zdGFudCBncmF5IChwaXhlbCB2YWx1ZSAxMjgpIGZvciBJLXR5cGUuCisKKyAgICAgICAgICAgIENvbmNlYWxtZW50IHNldHMgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY29uY2VhbGVkCisgICAgICAgICAgICBtYWNyb2Jsb2NrcyB0byB2YWx1ZSA0MCBhbmQgbWFjcm9ibG9jayB0eXBlIHRvIGludHJhIHRvIGVuYWJsZQorICAgICAgICAgICAgZGVibG9ja2luZyBmaWx0ZXIgdG8gc21vb3RoIHRoZSBlZGdlcyBvZiB0aGUgY29uY2VhbGVkIGFyZWFzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcG9pbnRlciB0byBjdXJyZW50IGltYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgc2xpY2VUeXBlICAgICAgIHR5cGUgb2YgdGhlIHNsaWNlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBjb25jZWFsZWQgbWFjcm9ibG9ja3Mgd2lsbCBiZSB3cml0dGVuIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ29uY2VhbChzdG9yYWdlX3QgKnBTdG9yYWdlLCBpbWFnZV90ICpjdXJySW1hZ2UsIHUzMiBzbGljZVR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIGo7CisgICAgdTMyIHJvdywgY29sOworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIHU4ICpyZWZEYXRhOworICAgIG1iU3RvcmFnZV90ICptYjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQoY3VyckltYWdlKTsKKworICAgIERFQlVHKCgiQ29uY2VhbGluZyAlcyBzbGljZVxuIiwgSVNfSV9TTElDRShzbGljZVR5cGUpID8KKyAgICAgICAgICAgICJpbnRyYSIgOiAiaW50ZXIiKSk7CisKKyAgICB3aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7CisgICAgcmVmRGF0YSA9IE5VTEw7CisgICAgLyogdXNlIHJlZmVyZW5jZSBwaWN0dXJlIHdpdGggc21hbGxlc3QgYXZhaWxhYmxlIGluZGV4ICovCisgICAgaWYgKElTX1BfU0xJQ0Uoc2xpY2VUeXBlKSB8fCAocFN0b3JhZ2UtPmludHJhQ29uY2VhbG1lbnRGbGFnICE9IDApKQorICAgIHsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZkRhdGEgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShwU3RvcmFnZS0+ZHBiLCBpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChpID49IDE2KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IHdoaWxlIChyZWZEYXRhID09IE5VTEwpOworICAgIH0KKworICAgIGkgPSByb3cgPSBjb2wgPSAwOworICAgIC8qIGZpbmQgZmlyc3QgcHJvcGVybHkgZGVjb2RlZCBtYWNyb2Jsb2NrIC0+IHN0YXJ0IHBvaW50IGZvciBjb25jZWFsbWVudCAqLworICAgIHdoaWxlIChpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyAmJiAhcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQpCisgICAgeworICAgICAgICBpKys7CisgICAgICAgIGNvbCsrOworICAgICAgICBpZiAoY29sID09IHdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIGNvbCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3aG9sZSBwaWN0dXJlIGxvc3QgLT4gY29weSBwcmV2aW91cyBvciBzZXQgZ3JleSAqLworICAgIGlmIChpID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCisgICAgeworICAgICAgICBpZiAoIChJU19JX1NMSUNFKHNsaWNlVHlwZSkgJiYgKHBTdG9yYWdlLT5pbnRyYUNvbmNlYWxtZW50RmxhZyA9PSAwKSkgfHwKKyAgICAgICAgICAgICByZWZEYXRhID09IE5VTEwpCisgICAgICAgICAgICBIMjY0U3dEZWNNZW1zZXQoY3VyckltYWdlLT5kYXRhLCAxMjgsIHdpZHRoKmhlaWdodCozODQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBIMjY0U3dEZWNNZW1jcHkoY3VyckltYWdlLT5kYXRhLCByZWZEYXRhLCB3aWR0aCpoZWlnaHQqMzg0KTsKKworICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzID0gcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsKKworICAgICAgICAvKiBubyBmaWx0ZXJpbmcgaWYgd2hvbGUgcGljdHVyZSBjb25jZWFsZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKKyAgICAgICAgICAgIHBTdG9yYWdlLT5tYltpXS5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IDE7CisKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorCisgICAgLyogc3RhcnQgZnJvbSB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIGZpcnN0IGNvcnJlY3QgbWFjcm9ibG9jaywgY29uY2VhbCB0aGUKKyAgICAgKiByb3cgaW4gcXVlc3Rpb24sIGFsbCByb3dzIGFib3ZlIHRoYXQgcm93IGFuZCB0aGVuIGNvbnRpbnVlIGRvd253YXJkcyAqLworICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgcm93ICogd2lkdGg7CisgICAgZm9yIChqID0gY29sOyBqLS07KQorICAgIHsKKyAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgcm93LCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOworICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKKyAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOworICAgIH0KKyAgICBmb3IgKGogPSBjb2wgKyAxOyBqIDwgd2lkdGg7IGorKykKKyAgICB7CisgICAgICAgIGlmICghbWJbal0uZGVjb2RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uY2VhbE1iKG1iK2osIGN1cnJJbWFnZSwgcm93LCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOworICAgICAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7CisgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaWYgcHJldmlvdXMgcm93KHMpIGNvdWxkIG5vdCBiZSBjb25jZWFsZWQgLT4gY29uY2VhbCB0aGVtIG5vdyAqLworICAgIGlmIChyb3cpCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IHJvdyAtIDE7CisgICAgICAgICAgICBtYiA9IHBTdG9yYWdlLT5tYiArIGkqd2lkdGggKyBqOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25jZWFsTWIobWIsIGN1cnJJbWFnZSwgaSwgaiwgc2xpY2VUeXBlLCByZWZEYXRhKTsKKyAgICAgICAgICAgICAgICBtYi0+ZGVjb2RlZCA9IDE7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOworICAgICAgICAgICAgICAgIG1iIC09IHdpZHRoOworICAgICAgICAgICAgfSB3aGlsZShpLS0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcHJvY2VzcyByb3dzIGJlbG93IHRoZSBvbmUgY29udGFpbmluZyB0aGUgZmlyc3QgY29ycmVjdCBtYWNyb2Jsb2NrICovCisgICAgZm9yIChpID0gcm93ICsgMTsgaSA8IGhlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgbWIgPSBwU3RvcmFnZS0+bWIgKyBpICogd2lkdGg7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbWJbal0uZGVjb2RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25jZWFsTWIobWIraiwgY3VyckltYWdlLCBpLCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOworICAgICAgICAgICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogQ29uY2VhbE1iCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlcmZvcm0gZXJyb3IgY29uY2VhbG1lbnQgZm9yIG9uZSBtYWNyb2Jsb2NrLCBsb2NhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIHBpY3R1cmUgaW5kaWNhdGVkIGJ5IHJvdyBhbmQgY29sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBDb25jZWFsTWIobWJTdG9yYWdlX3QgKnBNYiwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgcm93LCB1MzIgY29sLAorICAgIHUzMiBzbGljZVR5cGUsIHU4ICpyZWZEYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqLCBjb21wOworICAgIHUzMiBob3IsIHZlcjsKKyAgICB1MzIgbWJOdW07CisgICAgdTMyIHdpZHRoLCBoZWlnaHQ7CisgICAgdTggKm1iUG9zOworICAgIHU4IGRhdGFbMzg0XTsKKyAgICB1OCAqcERhdGE7CisgICAgaTMyIHRtcDsKKyAgICBpMzIgZmlyc3RQaGFzZVsxNl07CisgICAgaTMyICpwVG1wOworICAgIC8qIG5laWdoYm91cnMgYWJvdmUsIGJlbG93LCBsZWZ0IGFuZCByaWdodCAqLworICAgIGkzMiBhWzRdLCBiWzRdLCBsWzRdLCByWzRdOworICAgIHUzMiBBLCBCLCBMLCBSOworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICB1OCBmaWxsQnVmZlszMioyMSArIDE1ICsgMzJdOworICAgIHU4ICpwRmlsbDsKKyNlbmRpZgorLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKCFwTWItPmRlY29kZWQpOworICAgIEFTU0VSVChjdXJySW1hZ2UpOworICAgIEFTU0VSVChjb2wgPCBjdXJySW1hZ2UtPndpZHRoKTsKKyAgICBBU1NFUlQocm93IDwgY3VyckltYWdlLT5oZWlnaHQpOworCisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgIHBGaWxsID0gQUxJR04oZmlsbEJ1ZmYsIDE2KTsKKyNlbmRpZgorICAgIHdpZHRoID0gY3VyckltYWdlLT53aWR0aDsKKyAgICBoZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKKyAgICBtYk51bSA9IHJvdyAqIHdpZHRoICsgY29sOworCisgICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoY3VyckltYWdlLCBtYk51bSk7CisKKyAgICBtYlBvcyA9IGN1cnJJbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggKiAxNiArIGNvbCAqIDE2OworICAgIEEgPSBCID0gTCA9IFIgPSBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBzZXQgcXBZIHRvIDQwIHRvIGVuYWJsZSBzb21lIGZpbHRlcmluZyBpbiBkZWJsb2NraW5nIChzdGV0c29uIHZhbHVlKSAqLworICAgIHBNYi0+cXBZID0gNDA7CisgICAgcE1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IDA7CisgICAgLyogbWJUeXBlIHNldCB0byBpbnRyYSB0byBwZXJmb3JtIGZpbHRlcmluZyBkZXNwaXRlIHRoZSB2YWx1ZXMgb2Ygb3RoZXIKKyAgICAgKiBib3VuZGFyeSBzdHJlbmd0aCBkZXRlcm1pbmF0aW9uIGZpZWxkcyAqLworICAgIHBNYi0+bWJUeXBlID0gSV80eDQ7CisgICAgcE1iLT5maWx0ZXJPZmZzZXRBID0gMDsKKyAgICBwTWItPmZpbHRlck9mZnNldEIgPSAwOworICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCA9IDA7CisKKyAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQorICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBtdl90IG12ID0gezAsMH07CisgICAgICAgIGltYWdlX3QgcmVmSW1hZ2U7CisgICAgICAgIHJlZkltYWdlLndpZHRoID0gd2lkdGg7CisgICAgICAgIHJlZkltYWdlLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHJlZkRhdGE7CisgICAgICAgIGlmIChyZWZJbWFnZS5kYXRhKQorICAgICAgICB7CisjaWZuZGVmIEgyNjRERUNfT01YREwKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCAmbXYsICZyZWZJbWFnZSwgY29sKjE2LCByb3cqMTYsCisgICAgICAgICAgICAgICAgMCwgMCwgMTYsIDE2KTsKKyNlbHNlCisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICgocm93KjE2KSArICgoY29sKjE2KTw8MTYpKSwKKyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMCwgcEZpbGwpOworI2VuZGlmCisgICAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7CisKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworICAgIH0KKworICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOworCisgICAgLyogY291bnRlciBmb3IgbnVtYmVyIG9mIG5laWdoYm91cnMgdXNlZCAqLworICAgIGogPSAwOworICAgIGhvciA9IHZlciA9IDA7CisgICAgaWYgKHJvdyAmJiAocE1iLXdpZHRoKS0+ZGVjb2RlZCkKKyAgICB7CisgICAgICAgIEEgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcERhdGEgPSBtYlBvcyAtIHdpZHRoKjE2OworICAgICAgICBhWzBdID0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7CisgICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKKyAgICAgICAgYVsyXSA9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOworICAgICAgICBhWzNdID0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7CisgICAgICAgIGorKzsKKyAgICAgICAgaG9yKys7CisgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYVswXSArIGFbMV0gKyBhWzJdICsgYVszXTsKKyAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOworICAgIH0KKyAgICBpZiAoKHJvdyAhPSBoZWlnaHQgLSAxKSAmJiAocE1iK3dpZHRoKS0+ZGVjb2RlZCkKKyAgICB7CisgICAgICAgIEIgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgcERhdGEgPSBtYlBvcyArIDE2KndpZHRoKjE2OworICAgICAgICBiWzBdID0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7CisgICAgICAgIGJbMV0gPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsKKyAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOworICAgICAgICBiWzNdID0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7CisgICAgICAgIGorKzsKKyAgICAgICAgaG9yKys7CisgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYlswXSArIGJbMV0gKyBiWzJdICsgYlszXTsKKyAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBiWzBdICsgYlsxXSAtIGJbMl0gLSBiWzNdOworICAgIH0KKyAgICBpZiAoY29sICYmIChwTWItMSktPmRlY29kZWQpCisgICAgeworICAgICAgICBMID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOworICAgICAgICBsWzBdID0gcERhdGFbMF07IGxbMF0gKz0gcERhdGFbMTYqd2lkdGhdOworICAgICAgICBsWzBdICs9IHBEYXRhWzMyKndpZHRoXTsgbFswXSArPSBwRGF0YVs0OCp3aWR0aF07CisgICAgICAgIHBEYXRhICs9IDY0KndpZHRoOworICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbMTYqd2lkdGhdOworICAgICAgICBsWzFdICs9IHBEYXRhWzMyKndpZHRoXTsgbFsxXSArPSBwRGF0YVs0OCp3aWR0aF07CisgICAgICAgIHBEYXRhICs9IDY0KndpZHRoOworICAgICAgICBsWzJdID0gcERhdGFbMF07IGxbMl0gKz0gcERhdGFbMTYqd2lkdGhdOworICAgICAgICBsWzJdICs9IHBEYXRhWzMyKndpZHRoXTsgbFsyXSArPSBwRGF0YVs0OCp3aWR0aF07CisgICAgICAgIHBEYXRhICs9IDY0KndpZHRoOworICAgICAgICBsWzNdID0gcERhdGFbMF07IGxbM10gKz0gcERhdGFbMTYqd2lkdGhdOworICAgICAgICBsWzNdICs9IHBEYXRhWzMyKndpZHRoXTsgbFszXSArPSBwRGF0YVs0OCp3aWR0aF07CisgICAgICAgIGorKzsKKyAgICAgICAgdmVyKys7CisgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gbFswXSArIGxbMV0gKyBsWzJdICsgbFszXTsKKyAgICAgICAgZmlyc3RQaGFzZVs0XSArPSBsWzBdICsgbFsxXSAtIGxbMl0gLSBsWzNdOworICAgIH0KKyAgICBpZiAoKGNvbCAhPSB3aWR0aCAtIDEpICYmIChwTWIrMSktPmRlY29kZWQpCisgICAgeworICAgICAgICBSID0gSEFOVFJPX1RSVUU7CisgICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNjsKKyAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgclswXSArPSBwRGF0YVszMip3aWR0aF07IHJbMF0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgclsxXSA9IHBEYXRhWzBdOyByWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgclsxXSArPSBwRGF0YVszMip3aWR0aF07IHJbMV0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgclsyXSA9IHBEYXRhWzBdOyByWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgclsyXSArPSBwRGF0YVszMip3aWR0aF07IHJbMl0gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKKyAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKKyAgICAgICAgclszXSArPSBwRGF0YVszMip3aWR0aF07IHJbM10gKz0gcERhdGFbNDgqd2lkdGhdOworICAgICAgICBqKys7CisgICAgICAgIHZlcisrOworICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107CisgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gclswXSArIHJbMV0gLSByWzJdIC0gclszXTsKKyAgICB9CisKKyAgICAvKiBhdCBsZWFzdCBvbmUgcHJvcGVybHkgZGVjb2RlZCBuZWlnaGJvdXIgYXZhaWxhYmxlICovCisgICAgQVNTRVJUKGopOworCisgICAgLypsaW50IC1lc3ltKDY0NCxsLHIsYSxiKSB2YXJpYWJsZSBpbml0aWFsaXplZCBhYm92ZSAqLworICAgIGlmICghaG9yICYmIEwgJiYgUikKKyAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDU7CisgICAgZWxzZSBpZiAoaG9yKQorICAgICAgICBmaXJzdFBoYXNlWzFdID4+PSAoMytob3IpOworCisgICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQorICAgICAgICBmaXJzdFBoYXNlWzRdID0gKGFbMF0rYVsxXSthWzJdK2FbM10tYlswXS1iWzFdLWJbMl0tYlszXSkgPj4gNTsKKyAgICBlbHNlIGlmICh2ZXIpCisgICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgzK3Zlcik7CisKKyAgICBzd2l0Y2ggKGopCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIChmaXJzdFBoYXNlWzBdKjQvMyk+PjYgKi8KKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPSAoMjEgKiBmaXJzdFBoYXNlWzBdKSA+PiAxMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDY7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworCisgICAgVHJhbnNmb3JtKGZpcnN0UGhhc2UpOworCisgICAgZm9yIChpID0gMCwgcERhdGEgPSBkYXRhLCBwVG1wID0gZmlyc3RQaGFzZTsgaSA8IDI1NjspCisgICAgeworICAgICAgICB0bXAgPSBwVG1wWyhpICYgMHhGKT4+Ml07CisgICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLworICAgICAgICAqcERhdGErKyA9IENMSVAxKHRtcCk7CisgICAgICAgIC8qbGludCArZTczNCAqLworCisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKCEoaSAmIDB4M0YpKQorICAgICAgICAgICAgcFRtcCArPSA0OworICAgIH0KKworICAgIC8qIGNocm9tYSBjb21wb25lbnRzICovCisgICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyB3aWR0aCAqIGhlaWdodCAqIDI1NiArCisgICAgICAgcm93ICogOCAqIHdpZHRoICogOCArIGNvbCAqIDg7CisgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDI7IGNvbXArKykKKyAgICB7CisKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGZpcnN0UGhhc2UsIDAsIHNpemVvZihmaXJzdFBoYXNlKSk7CisKKyAgICAgICAgLyogY291bnRlciBmb3IgbnVtYmVyIG9mIG5laWdoYm91cnMgdXNlZCAqLworICAgICAgICBqID0gMDsKKyAgICAgICAgaG9yID0gdmVyID0gMDsKKyAgICAgICAgaWYgKEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCo4OworICAgICAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYVsxXSA9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYVsyXSA9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaG9yKys7CisgICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107CisgICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGFbMF0gKyBhWzFdIC0gYVsyXSAtIGFbM107CisgICAgICAgIH0KKyAgICAgICAgaWYgKEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4KndpZHRoKjg7CisgICAgICAgICAgICBiWzBdID0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7CisgICAgICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7CisgICAgICAgICAgICBiWzJdID0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7CisgICAgICAgICAgICBiWzNdID0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBob3IrKzsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYlswXSArIGJbMV0gKyBiWzJdICsgYlszXTsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTCkKKyAgICAgICAgeworICAgICAgICAgICAgcERhdGEgPSBtYlBvcyAtIDE7CisgICAgICAgICAgICBsWzBdID0gcERhdGFbMF07IGxbMF0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIGxbMV0gPSBwRGF0YVswXTsgbFsxXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICBsWzNdID0gcERhdGFbMF07IGxbM10gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB2ZXIrKzsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gbFswXSArIGxbMV0gKyBsWzJdICsgbFszXTsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUikKKyAgICAgICAgeworICAgICAgICAgICAgcERhdGEgPSBtYlBvcyArIDg7CisgICAgICAgICAgICByWzBdID0gcERhdGFbMF07IHJbMF0gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKKyAgICAgICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVs4KndpZHRoXTsKKyAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOworICAgICAgICAgICAgclsyXSA9IHBEYXRhWzBdOyByWzJdICs9IHBEYXRhWzgqd2lkdGhdOworICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7CisgICAgICAgICAgICByWzNdID0gcERhdGFbMF07IHJbM10gKz0gcERhdGFbOCp3aWR0aF07CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB2ZXIrKzsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gclswXSArIHJbMV0gKyByWzJdICsgclszXTsKKyAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gclswXSArIHJbMV0gLSByWzJdIC0gclszXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhvciAmJiBMICYmIFIpCisgICAgICAgICAgICBmaXJzdFBoYXNlWzFdID0gKGxbMF0rbFsxXStsWzJdK2xbM10tclswXS1yWzFdLXJbMl0tclszXSkgPj4gNDsKKyAgICAgICAgZWxzZSBpZiAoaG9yKQorICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDIraG9yKTsKKworICAgICAgICBpZiAoIXZlciAmJiBBICYmIEIpCisgICAgICAgICAgICBmaXJzdFBoYXNlWzRdID0gKGFbMF0rYVsxXSthWzJdK2FbM10tYlswXS1iWzFdLWJbMl0tYlszXSkgPj4gNDsKKyAgICAgICAgZWxzZSBpZiAodmVyKQorICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA+Pj0gKDIrdmVyKTsKKworICAgICAgICBzd2l0Y2ggKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSAzOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIChmaXJzdFBoYXNlWzBdKjQvMyk+PjUgKi8KKyAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gOTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDogLyogNCAqLworICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKKworICAgICAgICBwRGF0YSA9IGRhdGEgKyAyNTYgKyBjb21wKjY0OworICAgICAgICBmb3IgKGkgPSAwLCBwVG1wID0gZmlyc3RQaGFzZTsgaSA8IDY0OykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Nyk+PjFdOworICAgICAgICAgICAgLypsaW50IC1lNzM0IENMSVAxIG1hY3JvIHJlc3VsdHMgaW4gdmFsdWUgdGhhdCBmaXRzIGludG8gOCBiaXRzICovCisgICAgICAgICAgICAqcERhdGErKyA9IENMSVAxKHRtcCk7CisgICAgICAgICAgICAvKmxpbnQgK2U3MzQgKi8KKworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKCEoaSAmIDB4RikpCisgICAgICAgICAgICAgICAgcFRtcCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgLyogaW5jcmVtZW50IHBvaW50ZXJzIGZvciBjciAqLworICAgICAgICBtYlBvcyArPSB3aWR0aCAqIGhlaWdodCAqIDY0OworICAgIH0KKworICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IFRyYW5zZm9ybQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTaW1wbGlmaWVkIHRyYW5zZm9ybSwgYXNzdW1pbmcgdGhhdCBvbmx5IGRjIGNvbXBvbmVudCBhbmQgbG93ZXN0CisgICAgICAgICAgICBob3Jpem9udGFsIGFuZCBsb3dlc3QgdmVydGljYWwgY29tcG9uZW50IG1heSBiZSBub24temVybworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpCit7CisKKyAgICB1MzIgY29sOworICAgIGkzMiB0bXAwLCB0bXAxOworCisgICAgaWYgKCFkYXRhWzFdICYmICFkYXRhWzRdKQorICAgIHsKKyAgICAgICAgZGF0YVsxXSAgPSBkYXRhWzJdICA9IGRhdGFbM10gID0gZGF0YVs0XSAgPSBkYXRhWzVdICA9CisgICAgICAgIGRhdGFbNl0gID0gZGF0YVs3XSAgPSBkYXRhWzhdICA9IGRhdGFbOV0gID0gZGF0YVsxMF0gPQorICAgICAgICBkYXRhWzExXSA9IGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gZGF0YVswXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBmaXJzdCBob3Jpem9udGFsIHRyYW5zZm9ybSBmb3Igcm93cyAwIGFuZCAxICovCisgICAgdG1wMCA9IGRhdGFbMF07CisgICAgdG1wMSA9IGRhdGFbMV07CisgICAgZGF0YVswXSA9IHRtcDAgKyB0bXAxOworICAgIGRhdGFbMV0gPSB0bXAwICsgKHRtcDE+PjEpOworICAgIGRhdGFbMl0gPSB0bXAwIC0gKHRtcDE+PjEpOworICAgIGRhdGFbM10gPSB0bXAwIC0gdG1wMTsKKworICAgIHRtcDAgPSBkYXRhWzRdOworICAgIGRhdGFbNV0gPSB0bXAwOworICAgIGRhdGFbNl0gPSB0bXAwOworICAgIGRhdGFbN10gPSB0bXAwOworCisgICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KKyAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgeworICAgICAgICB0bXAwID0gZGF0YVswXTsKKyAgICAgICAgdG1wMSA9IGRhdGFbNF07CisgICAgICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKKyAgICAgICAgZGF0YVs0XSA9IHRtcDAgKyAodG1wMT4+MSk7CisgICAgICAgIGRhdGFbOF0gPSB0bXAwIC0gKHRtcDE+PjEpOworICAgICAgICBkYXRhWzEyXSA9IHRtcDAgLSB0bXAxOworICAgIH0KKworfQorLypsaW50ICtlNzAyICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxMzQ2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9ICisjZGVmaW5lIEgyNjRTV0RFQ19DT05DRUFMX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENvbmNlYWwoc3RvcmFnZV90ICpwU3RvcmFnZSwgaW1hZ2VfdCAqY3VyckltYWdlLCB1MzIgc2xpY2VUeXBlKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ09OQ0VBTF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OWI3NGEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfQ09OVEFJTkVSX0gKKyNkZWZpbmUgSDI2NFNXREVDX0NPTlRBSU5FUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3RyaW5nIGxlbmd0aCBmb3IgdHJhY2luZyAqLworI2RlZmluZSBIMjY0REVDX1RSQUNFX1NUUl9MRU4gMTAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgSU5JVElBTElaRUQsCisgICAgICAgIE5FV19IRUFERVJTCisgICAgfSBkZWNTdGF0OworCisgICAgdTMyIHBpY051bWJlcjsKKyAgICBzdG9yYWdlX3Qgc3RvcmFnZTsKKyNpZmRlZiBIMjY0REVDX1RSQUNFCisgICAgY2hhciBzdHJbSDI2NERFQ19UUkFDRV9TVFJfTEVOXTsKKyNlbmRpZgorfSBkZWNDb250YWluZXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUNDT05UQUlORVJfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOGMxZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlYmxvY2tpbmcuYwpAQCAtMCwwICsxLDI0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZQorICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlCisgICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UKKyAgICAgICAgICBGaWx0ZXJIb3JMdW1hCisgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZQorICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UKKyAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEKKyAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgKKyAgICAgICAgICBFZGdlQm91bmRhcnlTdHJlbmd0aAorICAgICAgICAgIEdldEJvdW5kYXJ5U3RyZW5ndGhzCisgICAgICAgICAgSXNTbGljZUJvdW5kYXJ5T25MZWZ0CisgICAgICAgICAgSXNTbGljZUJvdW5kYXJ5T25Ub3AKKyAgICAgICAgICBHZXRNYkZpbHRlcmluZ0ZsYWdzCisgICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzCisgICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKKyAgICAgICAgICBGaWx0ZXJMdW1hCisgICAgICAgICAgRmlsdGVyQ2hyb21hCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RlYmxvY2tpbmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorCisjaWZkZWYgSDI2NERFQ19PTVhETAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKKyAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDEgLWU3MDIgKi8KKworLyogYXJyYXkgb2YgYWxwaGEgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCAqLworc3RhdGljIGNvbnN0IHU4IGFscGhhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDQsNSw2LDcsOCw5LDEwLAorICAgIDEyLDEzLDE1LDE3LDIwLDIyLDI1LDI4LDMyLDM2LDQwLDQ1LDUwLDU2LDYzLDcxLDgwLDkwLDEwMSwxMTMsMTI3LDE0NCwxNjIsCisgICAgMTgyLDIwMywyMjYsMjU1LDI1NX07CisKKy8qIGFycmF5IG9mIGJldGEgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCAqLworc3RhdGljIGNvbnN0IHU4IGJldGFzWzUyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwyLDMsMywzLDMsNCw0LAorICAgIDQsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE3LDE3LDE4LDE4fTsKKworCisKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyogYXJyYXkgb2YgdGMwIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQsIGVhY2ggdHJpcGxldCBjb3JyZXNwb25kcyB0byBhCisgKiBjb2x1bW4gaW4gdGhlIHRhYmxlLiBJbmRleGluZyBnb2VzIGFzIHRjMFtpbmRleEFdW2JTLTFdICovCitzdGF0aWMgY29uc3QgdTggdGMwWzUyXVszXSA9IHsKKyAgICB7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sCisgICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAorICAgIHswLDAsMH0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMCwxfSx7MCwxLDF9LHswLDEsMX0sezEsMSwxfSwKKyAgICB7MSwxLDF9LHsxLDEsMX0sezEsMSwxfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwxLDJ9LHsxLDIsM30sCisgICAgezEsMiwzfSx7MiwyLDN9LHsyLDIsNH0sezIsMyw0fSx7MiwzLDR9LHszLDMsNX0sezMsNCw2fSx7Myw0LDZ9LAorICAgIHs0LDUsN30sezQsNSw4fSx7NCw2LDl9LHs1LDcsMTB9LHs2LDgsMTF9LHs2LDgsMTN9LHs3LDEwLDE0fSx7OCwxMSwxNn0sCisgICAgezksMTIsMTh9LHsxMCwxMywyMH0sezExLDE1LDIzfSx7MTMsMTcsMjV9Cit9OworI2Vsc2UKKy8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQorICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiU10gKi8KK3N0YXRpYyBjb25zdCB1OCB0YzBbNTJdWzVdID0geworICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMCwgMSwgMH0sCisgICAgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAwLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LAorICAgIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAyLCAwfSwKKyAgICB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMiwgMywgMH0sCisgICAgezAsIDEsIDIsIDMsIDB9LCB7MCwgMiwgMiwgMywgMH0sIHswLCAyLCAyLCA0LCAwfSwgezAsIDIsIDMsIDQsIDB9LAorICAgIHswLCAyLCAzLCA0LCAwfSwgezAsIDMsIDMsIDUsIDB9LCB7MCwgMywgNCwgNiwgMH0sIHswLCAzLCA0LCA2LCAwfSwKKyAgICB7MCwgNCwgNSwgNywgMH0sIHswLCA0LCA1LCA4LCAwfSwgezAsIDQsIDYsIDksIDB9LCB7MCwgNSwgNywgMTAsIDB9LAorICAgIHswLCA2LCA4LCAxMSwgMH0sIHswLCA2LCA4LCAxMywgMH0sIHswLCA3LCAxMCwgMTQsIDB9LAorICAgIHswLCA4LCAxMSwgMTYsIDB9LCB7MCwgOSwgMTIsIDE4LCAwfSwgezAsIDEwLCAxMywgMjAsIDB9LAorICAgIHswLCAxMSwgMTUsIDIzLCAwfSwgezAsIDEzLCAxNywgMjUsIDB9Cit9OworI2VuZGlmCisKKworI2lmbmRlZiBIMjY0REVDX09NWERMCisvKiBtYXBwaW5nIG9mIHJhc3RlciBzY2FuIGJsb2NrIGluZGV4IHRvIDR4NCBibG9jayBpbmRleCAqLworc3RhdGljIGNvbnN0IHUzMiBtYjR4NEluZGV4WzE2XSA9CisgICAgezAsIDEsIDQsIDUsIDIsIDMsIDYsIDcsIDgsIDksIDEyLCAxMywgMTAsIDExLCAxNCwgMTV9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgdTggKnRjMDsKKyAgICB1MzIgYWxwaGE7CisgICAgdTMyIGJldGE7Cit9IGVkZ2VUaHJlc2hvbGRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUzMiB0b3A7CisgICAgdTMyIGxlZnQ7Cit9IGJTX3Q7CisKK2VudW0geyBUT1AgPSAwLCBMRUZUID0gMSwgSU5ORVIgPSAyIH07CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisjZGVmaW5lIEZJTFRFUl9MRUZUX0VER0UgICAgMHgwNAorI2RlZmluZSBGSUxURVJfVE9QX0VER0UgICAgIDB4MDIKKyNkZWZpbmUgRklMVEVSX0lOTkVSX0VER0UgICAweDAxCisKKworLyogY2xpcHBpbmcgdGFibGUgZGVmaW5lZCBpbiBpbnRyYV9wcmVkaWN0aW9uLmMgKi8KK2V4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpMSwgdTMyIGkyKTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCitzdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIsCisgICAgdTMyIGkxLCB1MzIgaTIpOworI2Vsc2UKK3N0YXRpYyB1MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7CitzdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKTsKK3N0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7CisjZW5kaWYKKworc3RhdGljIHUzMiBJc1NsaWNlQm91bmRhcnlPbkxlZnQobWJTdG9yYWdlX3QgKm1iKTsKKworc3RhdGljIHUzMiBJc1NsaWNlQm91bmRhcnlPblRvcChtYlN0b3JhZ2VfdCAqbWIpOworCitzdGF0aWMgdTMyIEdldE1iRmlsdGVyaW5nRmxhZ3MobWJTdG9yYWdlX3QgKm1iKTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCisKK3N0YXRpYyB1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpicywgdTMyIGZsYWdzKTsKKworc3RhdGljIHZvaWQgRmlsdGVyTHVtYSh1OCAqZGF0YSwgYlNfdCAqYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgdTMyIGltYWdlV2lkdGgpOworCitzdGF0aWMgdm9pZCBGaWx0ZXJDaHJvbWEodTggKmNiLCB1OCAqY3IsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKKworc3RhdGljIHZvaWQgRmlsdGVyVmVyTHVtYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgdTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yTHVtYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgICAgICAgaTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yTHVtYSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICAgICAgICBpMzIgaW1hZ2VXaWR0aCk7CisKK3N0YXRpYyB2b2lkIEZpbHRlclZlckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIGltYWdlV2lkdGgpOworc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBpMzIgaW1hZ2VXaWR0aCk7CitzdGF0aWMgdm9pZCBGaWx0ZXJIb3JDaHJvbWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgaTMyIGltYWdlV2lkdGgpOworCitzdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgbWJTdG9yYWdlX3QgKm1iLAorICB1MzIgZmlsdGVyaW5nRmxhZ3MpOworCitzdGF0aWMgdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICBtYlN0b3JhZ2VfdCAqbWIsCisgIHUzMiBmaWx0ZXJpbmdGbGFncywKKyAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOworCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisKK3N0YXRpYyB1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCB1OCAoKmJzKVsxNl0sIHUzMiBmbGFncyk7CisKK3N0YXRpYyB2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKKyAgICBtYlN0b3JhZ2VfdCAqbWIsCisgICAgdTggKCphbHBoYSlbMl0sCisgICAgdTggKCpiZXRhKVsyXSwKKyAgICB1OCAoKnRocmVzaG9sZClbMTZdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKTsKKworc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCisgICAgbWJTdG9yYWdlX3QgKm1iLAorICAgIHU4ICgqYWxwaGEpWzJdLAorICAgIHU4ICgqYmV0YSlbMl0sCisgICAgdTggKCp0aHJlc2hvbGQpWzhdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MsCisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOworCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IElzU2xpY2VCb3VuZGFyeU9uTGVmdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzbGljZSBib3VuZGFyeSBvbiB0aGUgbGVmdCBzaWRlCisgICAgICAgICAgICBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYiAmJiBtYi0+bWJBKTsKKworICAgIGlmIChtYi0+c2xpY2VJZCAhPSBtYi0+bWJBLT5zbGljZUlkKQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPblRvcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzbGljZSBib3VuZGFyeSBhYm92ZSB0aGUKKyAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBJc1NsaWNlQm91bmRhcnlPblRvcChtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWIgJiYgbWItPm1iQik7CisKKyAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQi0+c2xpY2VJZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0TWJGaWx0ZXJpbmdGbGFncworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGVkZ2VzIG9mIGEgbWFjcm9ibG9jayBoYXMgdG8gYmUKKyAgICAgICAgICBmaWx0ZXJlZC4gT3V0cHV0IGlzIGEgYml0LXdpc2UgT1Igb2YgRklMVEVSX0xFRlRfRURHRSwKKyAgICAgICAgICBGSUxURVJfVE9QX0VER0UgYW5kIEZJTFRFUl9JTk5FUl9FREdFLCBkZXBlbmRpbmcgb24gd2hpY2ggZWRnZXMKKyAgICAgICAgICBzaGFsbCBiZSBmaWx0ZXJlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgZmxhZ3MgPSAwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWIpOworCisgICAgLyogbm90aGluZyB3aWxsIGJlIGZpbHRlcmVkIGlmIGRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID09IDEgKi8KKyAgICBpZiAobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDEpCisgICAgeworICAgICAgICBmbGFncyB8PSBGSUxURVJfSU5ORVJfRURHRTsKKworICAgICAgICAvKiBmaWx0ZXJMZWZ0TWJFZGdlRmxhZywgbGVmdCBtYiBpcyBNQl9BICovCisgICAgICAgIGlmIChtYi0+bWJBICYmCisgICAgICAgICAgICAoKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAyKSB8fAorICAgICAgICAgICAgICFJc1NsaWNlQm91bmRhcnlPbkxlZnQobWIpKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEZJTFRFUl9MRUZUX0VER0U7CisKKyAgICAgICAgLyogZmlsdGVyVG9wTWJFZGdlRmxhZyAqLworICAgICAgICBpZiAobWItPm1iQiAmJgorICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKKyAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25Ub3AobWIpKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEZJTFRFUl9UT1BfRURHRTsKKyAgICB9CisKKyAgICByZXR1cm4oZmxhZ3MpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgYW4gaW5uZXIKKyAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGUgaXMgY2hlY2tlZCBiZWZvcmUgdGhpcyBpcworICAgICAgICAgICAgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbiBoZXJlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaW5kMSwgdTMyIGluZDIpCit7CisgICAgaTMyIHRtcDEsIHRtcDI7CisgICAgaTMyIG12MSwgbXYyLCBtdjMsIG12NDsKKworICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMV07CisgICAgdG1wMiA9IG1iMS0+dG90YWxDb2VmZltpbmQyXTsKKyAgICBtdjEgPSBtYjEtPm12W2luZDFdLmhvcjsKKyAgICBtdjIgPSBtYjEtPm12W2luZDJdLmhvcjsKKyAgICBtdjMgPSBtYjEtPm12W2luZDFdLnZlcjsKKyAgICBtdjQgPSBtYjEtPm12W2luZDJdLnZlcjsKKworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoIChBQlMobXYxIC0gbXYyKSA+PSA0KSB8fCAoQUJTKG12MyAtIG12NCkgPj0gNCkgfHwKKyAgICAgICAgICAgICAgKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMS0+cmVmQWRkcltpbmQyID4+IDJdKSApCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgYW4gaW5uZXIKKyAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBUaGUgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMKKyAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aCBidXQgd2l0aG91dCBjaGVja2luZyB0b3RhbENvZWZmLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQoreworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgdG1wMSA9IG1iMS0+bXZbaW5kMV0uaG9yOworICAgIHRtcDIgPSBtYjEtPm12W2luZDJdLmhvcjsKKyAgICB0bXAzID0gbWIxLT5tdltpbmQxXS52ZXI7CisgICAgdG1wNCA9IG1iMS0+bXZbaW5kMl0udmVyOworCisgICAgaWYgKCAoQUJTKHRtcDEgLSB0bXAyKSA+PSA0KSB8fCAoQUJTKHRtcDMgLSB0bXA0KSA+PSA0KSB8fAorICAgICAgICAgKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMS0+cmVmQWRkcltpbmQyID4+IDJdKSkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorI2lmbmRlZiBIMjY0REVDX09NWERMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgbGVmdC0gb3IKKyAgICAgICAgICAgIHRvcC1tb3N0IGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCisgICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIsCisgICAgdTMyIGluZDEsIHUzMiBpbmQyKQoreworCisgICAgaWYgKG1iMS0+dG90YWxDb2VmZltpbmQxXSB8fCBtYjItPnRvdGFsQ29lZmZbaW5kMl0pCisgICAgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMi0+cmVmQWRkcltpbmQyID4+IDJdKSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdltpbmQxXS5ob3IgLSBtYjItPm12W2luZDJdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0udmVyIC0gbWIyLT5tdltpbmQyXS52ZXIpID49IDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yCisgICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAorICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKQoreworICAgIHUzMiB0b3BCcyA9IDA7CisgICAgdTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CisKKyAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzBdOworICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTBdOworICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMV07CisgICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxMV07CisgICAgaWYgKHRtcDEgfHwgdG1wMikKKyAgICB7CisgICAgICAgIHRvcEJzID0gMjw8MDsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbMTBdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMF0udmVyIC0gbWIyLT5tdlsxMF0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzEwID4+IDJdKSkKKyAgICB7CisgICAgICAgIHRvcEJzID0gMTw8MDsKKyAgICB9CisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZls0XTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzE0XTsKKyAgICBpZiAodG1wMyB8fCB0bXA0KQorICAgIHsKKyAgICAgICAgdG9wQnMgKz0gMjw8ODsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzFdLmhvciAtIG1iMi0+bXZbMTFdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMV0udmVyIC0gbWIyLT5tdlsxMV0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzExID4+IDJdKSkKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDE8PDg7CisgICAgfQorICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbNV07CisgICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxNV07CisgICAgaWYgKHRtcDEgfHwgdG1wMikKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDI8PDE2OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbNF0uaG9yIC0gbWIyLT5tdlsxNF0uaG9yKSA+PSA0KSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdls0XS52ZXIgLSBtYjItPm12WzE0XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls0ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNCA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyArPSAxPDwxNjsKKyAgICB9CisgICAgaWYgKHRtcDMgfHwgdG1wNCkKKyAgICB7CisgICAgICAgIHRvcEJzICs9IDI8PDI0OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbNV0uaG9yIC0gbWIyLT5tdlsxNV0uaG9yKSA+PSA0KSB8fAorICAgICAgICAgICAgIChBQlMobWIxLT5tdls1XS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls1ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNSA+PiAyXSkpCisgICAgeworICAgICAgICB0b3BCcyArPSAxPDwyNDsKKyAgICB9CisKKyAgICByZXR1cm4gdG9wQnM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgbGVmdC0KKyAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCisgICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKQoreworICAgIHUzMiBsZWZ0QnMgPSAwOworICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworCisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzVdOworICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMl07CisgICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZls3XTsKKworICAgIGlmICh0bXAxIHx8IHRtcDIpCisgICAgeworICAgICAgICBsZWZ0QnMgPSAyPDwwOworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMF0uaG9yIC0gbWIyLT5tdls1XS5ob3IpID49IDQpIHx8CisgICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbNV0udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzUgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzID0gMTw8MDsKKyAgICB9CisgICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZls4XTsKKyAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEzXTsKKyAgICBpZiAodG1wMyB8fCB0bXA0KQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDI8PDg7CisgICAgfQorICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsyXS5ob3IgLSBtYjItPm12WzddLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMl0udmVyIC0gbWIyLT5tdls3XS52ZXIpID49IDQpIHx8CisgICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbNyA+PiAyXSkpCisgICAgeworICAgICAgICBsZWZ0QnMgKz0gMTw8ODsKKyAgICB9CisgICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsxMF07CisgICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxNV07CisgICAgaWYgKHRtcDEgfHwgdG1wMikKKyAgICB7CisgICAgICAgIGxlZnRCcyArPSAyPDwxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzhdLmhvciAtIG1iMi0+bXZbMTNdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbOF0udmVyIC0gbWIyLT5tdlsxM10udmVyKSA+PSA0KSB8fAorICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbOCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTMgPj4gMl0pKQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDE8PDE2OworICAgIH0KKyAgICBpZiAodG1wMyB8fCB0bXA0KQorICAgIHsKKyAgICAgICAgbGVmdEJzICs9IDI8PDI0OworICAgIH0KKyAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMTBdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMTBdLnZlciAtIG1iMi0+bXZbMTVdLnZlcikgPj0gNCkgfHwKKyAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzEwID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNSA+PiAyXSkpCisgICAgeworICAgICAgICBsZWZ0QnMgKz0gMTw8MjQ7CisgICAgfQorCisgICAgcmV0dXJuIGxlZnRCczsKK30KKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGaWx0ZXJQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nIGZvciBhIHBpY3R1cmUuIEZpbHRlciBkb2VzIG5vdCBjb3B5CisgICAgICAgICAgdGhlIG9yaWdpbmFsIHBpY3R1cmUgYW55d2hlcmUgYnV0IGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgZGlyZWN0bHkKKyAgICAgICAgICBvbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgdGhlIGZpbHRlcmluZyBwcm9jZXNzCisgICAgICAgICAgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBvZiB0aGUKKyAgICAgICAgICBmaWx0ZXJlZCBtYWNyb2Jsb2NrLCBtYWNyb2Jsb2NrIGFib3ZlIGFuZCBtYWNyb2Jsb2NrIG9uIHRoZSBsZWZ0IG9mCisgICAgICAgICAgdGhlIGZpbHRlcmVkIG9uZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIGltYWdlIHRvIGJlIGZpbHRlcmVkCisgICAgICAgICAgbWIgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHRvcC1sZWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIG9mIHRoZSBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBpbWFnZSAgICAgICAgIGZpbHRlcmVkIGltYWdlIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfT01YREwKK3ZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCisgIGltYWdlX3QgKmltYWdlLAorICBtYlN0b3JhZ2VfdCAqbWIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGZsYWdzOworICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKKyAgICB1MzIgcGljV2lkdGhJbk1iczsKKyAgICB1OCAqZGF0YTsKKyAgICBtYlN0b3JhZ2VfdCAqcE1iOworICAgIGJTX3QgYlNbMTZdOworICAgIGVkZ2VUaHJlc2hvbGRfdCB0aHJlc2hvbGRzWzNdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChtYik7CisgICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKKyAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7CisKKyAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOworICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKKyAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKKworICAgIHBNYiA9IG1iOworCisgICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKKyAgICB7CisgICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOworCisgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgeworICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKKyAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KKyAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbHVtYSAqLworICAgICAgICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiAyNTYgKyBtYkNvbCAqIDE2OworCisgICAgICAgICAgICAgICAgRmlsdGVyTHVtYSgodTgqKWRhdGEsIGJTLCB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjE2KTsKKworICAgICAgICAgICAgICAgIC8qIGNocm9tYSAqLworICAgICAgICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKHRocmVzaG9sZHMsIHBNYiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgcGljU2l6ZUluTWJzICogMjU2ICsKKyAgICAgICAgICAgICAgICAgICAgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogNjQgKyBtYkNvbCAqIDg7CisKKyAgICAgICAgICAgICAgICBGaWx0ZXJDaHJvbWEoKHU4KilkYXRhLCBkYXRhICsgNjQqcGljU2l6ZUluTWJzLCBiUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMsIHBpY1dpZHRoSW5NYnMqOCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1iQ29sKys7CisgICAgICAgIGlmIChtYkNvbCA9PSBwaWNXaWR0aEluTWJzKQorICAgICAgICB7CisgICAgICAgICAgICBtYkNvbCA9IDA7CisgICAgICAgICAgICBtYlJvdysrOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsdGVyVmVyTHVtYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSB2ZXJ0aWNhbCA0LXBpeGVsIGx1bWEgZWRnZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVyVmVyTHVtYUVkZ2UoCisgIHU4ICpkYXRhLAorICB1MzIgYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIGltYWdlV2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YywgdG1wOworICAgIHUzMiBpOworICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7CisgICAgdTMyIHRtcEZsYWc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGJTICYmIGJTIDw9IDQpOworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKworICAgIGlmIChiUyA8IDQpCisgICAgeworICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKKyAgICAgICAgdG1wID0gdGM7CisgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAyID0gZGF0YVstM107CisgICAgICAgICAgICAgICAgcTIgPSBkYXRhWzJdOworCisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLTJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisKKyAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgICAgICB0bXAgPSB0YzsKKyAgICAgICAgICAgICAgICBkYXRhWy0xXSA9IHAwOworICAgICAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhICs9IGltYWdlV2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKKyAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wRmxhZyA9CisgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAwLXEwKSA8ICgodGhyZXNob2xkcy0+YWxwaGEgPj4gMikgKzIpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgIHAyID0gZGF0YVstM107CisgICAgICAgICAgICAgICAgcTIgPSBkYXRhWzJdOworCisgICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOworICAgICAgICAgICAgICAgICAgICBkYXRhWy0xXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLTJdID0gKHU4KSgocDIgKyB0bXAgKyAyKSA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstM10gPSAodTgpKCgyICogZGF0YVstNF0gKyAzICogcDIgKyB0bXAgKyA0KSA+PiAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKworICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHAwICsgcTAgKyBxMTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOworICAgICAgICAgICAgICAgICAgICBkYXRhWzJdID0gKHU4KSgoMiAqIGRhdGFbM10gKyAzICogcTIgKyB0bXAgKyA0KSA+PiAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKHU4KSgoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsdGVySG9yTHVtYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDQtcGl4ZWwgbHVtYSBlZGdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckhvckx1bWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiBpbWFnZVdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKKyAgICB1MzIgaTsKKyAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8IDQpOworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKworICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOworICAgIHRtcCA9IHRjOworICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSsrKQorICAgIHsKKyAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOworICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKKyAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKKworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07CisKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCisgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKworICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgIHRtcCA9IHRjOworICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICB9CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIGFsbCBmb3VyIHN1Y2Nlc3NpdmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZXMuIFRoaXMgY2FuCisgICAgICAgICAgICBiZSBkb25lIHdoZW4gYlMgaXMgZXF1YWwgdG8gYWxsIGZvdXIgZWRnZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckhvckx1bWEoCisgIHU4ICpkYXRhLAorICB1MzIgYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgaTMyIGltYWdlV2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGRlbHRhLCB0YywgdG1wOworICAgIHUzMiBpOworICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7CisgICAgdTMyIHRtcEZsYWc7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGJTIDw9IDQpOworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKworICAgIGlmIChiUyA8IDQpCisgICAgeworICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKKyAgICAgICAgdG1wID0gdGM7CisgICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOworICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKKworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKKyAgICAgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOworCisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKworICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgICAgIHRtcCA9IHRjOworICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7CisgICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGk7IGktLSwgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKKyAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wRmxhZyA9ICgodW5zaWduZWQpQUJTKHAwLXEwKSA8ICgodGhyZXNob2xkcy0+YWxwaGEgPj4gMikgKzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107CisgICAgICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07CisKKyAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMSArIHAwICsgcTA7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgocDIgKyAyICogdG1wICsgcTEgKyA0KSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqM10gPSAodTgpKCgyICogZGF0YVstaW1hZ2VXaWR0aCo0XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSAodTgpKCgyICogcDEgKyBwMCArIHExICsgMikgPj4gMik7CisKKyAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbIDBdID0gKHU4KSgocDEgKyAyICogdG1wICsgcTIgKyA0KSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkoKHRtcCArIHEyICsgMikgPj4gMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aCoyXSA9ICh1OCkoKDIgKiBkYXRhW2ltYWdlV2lkdGgqM10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlclZlckNocm9tYUVkZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRmlsdGVyIG9uZSB2ZXJ0aWNhbCAyLXBpeGVsIGNocm9tYSBlZGdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlclZlckNocm9tYUVkZ2UoCisgIHU4ICpkYXRhLAorICB1MzIgYlMsCisgIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKKyAgdTMyIHdpZHRoKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBkZWx0YSwgdGM7CisgICAgdTggcDAsIHEwLCBwMSwgcTE7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGJTIDw9IDQpOworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKworICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07CisgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07CisgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKKyAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgIHsKKyAgICAgICAgaWYgKGJTIDwgNCkKKyAgICAgICAgeworICAgICAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOworICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKworICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKKyAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07CisgICAgICAgICAgICBkYXRhWy0xXSA9IHAwOworICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOworICAgICAgICAgICAgZGF0YVsgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZGF0YSArPSB3aWR0aDsKKyAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOworICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOworICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKKyAgICB7CisgICAgICAgIGlmIChiUyA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7CisgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKKyAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKyAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsdGVySG9yQ2hyb21hRWRnZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGaWx0ZXIgb25lIGhvcml6b250YWwgMi1waXhlbCBjaHJvbWEgZWRnZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGaWx0ZXJIb3JDaHJvbWFFZGdlKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiB3aWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjOworICAgIHUzMiBpOworICAgIHU4IHAwLCBxMCwgcDEsIHExOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8IDQpOworICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKKworICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKKyAgICBmb3IgKGkgPSAyOyBpOyBpLS0sIGRhdGErKykKKyAgICB7CisgICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOworICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07CisgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCisgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICB7CisgICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07CisgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKKyAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9IHAwOworICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsdGVySG9yQ2hyb21hCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgMi1waXhlbCBjaHJvbWEgZWRnZXMuIFRoaXMKKyAgICAgICAgICAgIGNhbiBiZSBkb25lIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgZm91ciBlZGdlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVySG9yQ2hyb21hKAorICB1OCAqZGF0YSwKKyAgdTMyIGJTLAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIGkzMiB3aWR0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgZGVsdGEsIHRjOworICAgIHUzMiBpOworICAgIHU4IHAwLCBxMCwgcDEsIHExOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChiUyA8PSA0KTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBpZiAoYlMgPCA0KQorICAgIHsKKyAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOworICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07CisgICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07CisgICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKKyAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOworICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOworICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOworICAgICAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9IHAwOworICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDg7IGk7IGktLSwgZGF0YSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKKyAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKKyAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCisgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgorICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQorICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKKyAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIGJTX3QgKmJTLCB1MzIgZmxhZ3MpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgLyogdGhpcyBmbGFnIGlzIHNldCBIQU5UUk9fVFJVRSBhcyBzb29uIGFzIGFueSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBpcworICAgICAqIG5vbi16ZXJvICovCisgICAgdTMyIG5vblplcm9CcyA9IEhBTlRST19GQUxTRTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQoYlMpOworICAgIEFTU0VSVChmbGFncyk7CisKKyAgICAvKiB0b3AgZWRnZXMgKi8KKyAgICBpZiAoZmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLnRvcCA9IGJTWzFdLnRvcCA9IGJTWzJdLnRvcCA9IGJTWzNdLnRvcCA9IDQ7CisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCAwLCAxMCk7CisgICAgICAgICAgICBiU1sxXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMSwgMTEpOworICAgICAgICAgICAgYlNbMl0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDQsIDE0KTsKKyAgICAgICAgICAgIGJTWzNdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA1LCAxNSk7CisgICAgICAgICAgICBpZiAoYlNbMF0udG9wIHx8IGJTWzFdLnRvcCB8fCBiU1syXS50b3AgfHwgYlNbM10udG9wKQorICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJTWzBdLnRvcCA9IGJTWzFdLnRvcCA9IGJTWzJdLnRvcCA9IGJTWzNdLnRvcCA9IDA7CisgICAgfQorCisgICAgLyogbGVmdCBlZGdlcyAqLworICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSB8fCBJU19JTlRSQV9NQigqbWItPm1iQSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gNDsKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYlNbMF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAwLCA1KTsKKyAgICAgICAgICAgIGJTWzRdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMiwgNyk7CisgICAgICAgICAgICBiU1s4XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDgsIDEzKTsKKyAgICAgICAgICAgIGJTWzEyXS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDEwLCAxNSk7CisgICAgICAgICAgICBpZiAoIW5vblplcm9CcyAmJgorICAgICAgICAgICAgICAgIChiU1swXS5sZWZ0IHx8IGJTWzRdLmxlZnQgfHwgYlNbOF0ubGVmdCB8fCBiU1sxMl0ubGVmdCkpCisgICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYlNbMF0ubGVmdCA9IGJTWzRdLmxlZnQgPSBiU1s4XS5sZWZ0ID0gYlNbMTJdLmxlZnQgPSAwOworICAgIH0KKworICAgIC8qIGlubmVyIGVkZ2VzICovCisgICAgaWYgKElTX0lOVFJBX01CKCptYikpCisgICAgeworICAgICAgICBiU1s0XS50b3AgID0gYlNbNV0udG9wICA9IGJTWzZdLnRvcCAgPSBiU1s3XS50b3AgID0KKyAgICAgICAgYlNbOF0udG9wICA9IGJTWzldLnRvcCAgPSBiU1sxMF0udG9wID0gYlNbMTFdLnRvcCA9CisgICAgICAgIGJTWzEyXS50b3AgPSBiU1sxM10udG9wID0gYlNbMTRdLnRvcCA9IGJTWzE1XS50b3AgPSAzOworCisgICAgICAgIGJTWzFdLmxlZnQgID0gYlNbMl0ubGVmdCAgPSBiU1szXS5sZWZ0ICA9CisgICAgICAgIGJTWzVdLmxlZnQgID0gYlNbNl0ubGVmdCAgPSBiU1s3XS5sZWZ0ICA9CisgICAgICAgIGJTWzldLmxlZnQgID0gYlNbMTBdLmxlZnQgPSBiU1sxMV0ubGVmdCA9CisgICAgICAgIGJTWzEzXS5sZWZ0ID0gYlNbMTRdLmxlZnQgPSBiU1sxNV0ubGVmdCA9IDM7CisgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAxNngxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIG9yIG1vdGlvbiB2ZWN0b3JzIGNhbm5vdCBkaWZmZXIsCisgICAgICAgICAqIG9ubHkgY2hlY2sgaWYgZWl0aGVyIG9mIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgaWYgKGgyNjRic2ROdW1NYlBhcnQobWItPm1iVHlwZSkgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7CisKKyAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOworICAgICAgICB9CisgICAgICAgIC8qIDE2eDggaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAorICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIGhvcml6b250YWwgZWRnZSwgZm9yIHRoZSBvdGhlciB0b3AgZWRnZXMgaXQgaXMKKyAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQorICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIGxlZnQgZWRnZXMuICovCisgICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF8xNng4KQorICAgICAgICB7CisgICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s4XS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOworICAgICAgICAgICAgYlNbOV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKKyAgICAgICAgICAgIGJTWzEwXS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKKyAgICAgICAgICAgIGJTWzExXS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKKworICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1syXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNF0gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s2XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzExXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogOHgxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgdmVydGljYWwgZWRnZSwgZm9yIHRoZSBvdGhlciBsZWZ0IGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCB0b3AgZWRnZXMuICovCisgICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF84eDE2KQorICAgICAgICB7CisgICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOworICAgICAgICAgICAgYlNbOF0udG9wID0gbWItPnRvdGFsQ29lZmZbOF0gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzldLnRvcCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzddID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKKworICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7CisgICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOworICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKKyAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOworICAgICAgICAgICAgYlNbNl0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7CisgICAgICAgICAgICBiU1sxMF0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOworICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiU1s0XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs0XSwgbWI0eDRJbmRleFswXSk7CisgICAgICAgICAgICBiU1s1XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFsxXSk7CisgICAgICAgICAgICBiU1s2XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs2XSwgbWI0eDRJbmRleFsyXSk7CisgICAgICAgICAgICBiU1s3XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs3XSwgbWI0eDRJbmRleFszXSk7CisgICAgICAgICAgICBiU1s4XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs4XSwgbWI0eDRJbmRleFs0XSk7CisgICAgICAgICAgICBiU1s5XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs1XSk7CisgICAgICAgICAgICBiU1sxMF0udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTBdLCBtYjR4NEluZGV4WzZdKTsKKyAgICAgICAgICAgIGJTWzExXS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMV0sIG1iNHg0SW5kZXhbN10pOworICAgICAgICAgICAgYlNbMTJdLnRvcCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEyXSwgbWI0eDRJbmRleFs4XSk7CisgICAgICAgICAgICBiU1sxM10udG9wID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTNdLCBtYjR4NEluZGV4WzldKTsKKyAgICAgICAgICAgIGJTWzE0XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNF0sIG1iNHg0SW5kZXhbMTBdKTsKKyAgICAgICAgICAgIGJTWzE1XS50b3AgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNV0sIG1iNHg0SW5kZXhbMTFdKTsKKworICAgICAgICAgICAgYlNbMV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzFdLCBtYjR4NEluZGV4WzBdKTsKKyAgICAgICAgICAgIGJTWzJdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsyXSwgbWI0eDRJbmRleFsxXSk7CisgICAgICAgICAgICBiU1szXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbM10sIG1iNHg0SW5kZXhbMl0pOworICAgICAgICAgICAgYlNbNV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzVdLCBtYjR4NEluZGV4WzRdKTsKKyAgICAgICAgICAgIGJTWzZdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs2XSwgbWI0eDRJbmRleFs1XSk7CisgICAgICAgICAgICBiU1s3XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbNl0pOworICAgICAgICAgICAgYlNbOV0ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzldLCBtYjR4NEluZGV4WzhdKTsKKyAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTBdLCBtYjR4NEluZGV4WzldKTsKKyAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzEwXSk7CisgICAgICAgICAgICBiU1sxM10ubGVmdCA9CisgICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFsxMl0pOworICAgICAgICAgICAgYlNbMTRdLmxlZnQgPQorICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNF0sIG1iNHg0SW5kZXhbMTNdKTsKKyAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0KKyAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzE0XSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKKyAgICAgICAgICAgIChiU1s0XS50b3AgfHwgYlNbNV0udG9wIHx8IGJTWzZdLnRvcCB8fCBiU1s3XS50b3AgfHwKKyAgICAgICAgICAgICBiU1s4XS50b3AgfHwgYlNbOV0udG9wIHx8IGJTWzEwXS50b3AgfHwgYlNbMTFdLnRvcCB8fAorICAgICAgICAgICAgIGJTWzEyXS50b3AgfHwgYlNbMTNdLnRvcCB8fCBiU1sxNF0udG9wIHx8IGJTWzE1XS50b3AgfHwKKyAgICAgICAgICAgICBiU1sxXS5sZWZ0IHx8IGJTWzJdLmxlZnQgfHwgYlNbM10ubGVmdCB8fAorICAgICAgICAgICAgIGJTWzVdLmxlZnQgfHwgYlNbNl0ubGVmdCB8fCBiU1s3XS5sZWZ0IHx8CisgICAgICAgICAgICAgYlNbOV0ubGVmdCB8fCBiU1sxMF0ubGVmdCB8fCBiU1sxMV0ubGVmdCB8fAorICAgICAgICAgICAgIGJTWzEzXS5sZWZ0IHx8IGJTWzE0XS5sZWZ0IHx8IGJTWzE1XS5sZWZ0KSkKKyAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgIH0KKworICAgIHJldHVybihub25aZXJvQnMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0THVtYUVkZ2VUaHJlc2hvbGRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCisgICAgICAgICAgICBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIG1iU3RvcmFnZV90ICptYiwKKyAgdTMyIGZpbHRlcmluZ0ZsYWdzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpbmRleEEsIGluZGV4QjsKKyAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisgICAgQVNTRVJUKG1iKTsKKworICAgIHFwID0gbWItPnFwWTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07CisgICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07CisKKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IHFwKQorICAgICAgICB7CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRjMFtpbmRleEFdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7CisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCisgICAgeworICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKKyAgICAgICAgaWYgKHFwVG1wICE9IHFwKQorICAgICAgICB7CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRjMFtpbmRleEFdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKKyAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAorICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCisgIG1iU3RvcmFnZV90ICptYiwKKyAgdTMyIGZpbHRlcmluZ0ZsYWdzLAorICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaW5kZXhBLCBpbmRleEI7CisgICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHRocmVzaG9sZHMpOworICAgIEFTU0VSVChtYik7CisKKyAgICBxcCA9IG1iLT5xcFk7CisgICAgcXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwICsgY2hyb21hUXBJbmRleE9mZnNldCldOworCisgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgdGhyZXNob2xkc1tJTk5FUl0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKKyAgICB0aHJlc2hvbGRzW0lOTkVSXS50YzAgPSB0YzBbaW5kZXhBXTsKKworICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOworICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQorICAgICAgICB7CisgICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07CisgICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOworCisgICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7CisKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRjMFtpbmRleEFdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOworICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKKyAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsdGVyTHVtYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaWx0ZXIgYWxsIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZpbHRlckx1bWEoCisgIHU4ICpkYXRhLAorICBiU190ICpiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICB1MzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHZibG9jazsKKyAgICBiU190ICp0bXA7CisgICAgdTggKnB0cjsKKyAgICB1MzIgb2Zmc2V0OworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICBwdHIgPSBkYXRhOworICAgIHRtcCA9IGJTOworCisgICAgb2Zmc2V0ICA9IFRPUDsKKworICAgIC8qIGxvb3AgYmxvY2sgcm93cywgcGVyZm9ybSBmaWx0ZXJpbmcgZm9yIGFsbCB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgYmxvY2sKKyAgICAgKiByb3cgZmlyc3QsIHRoZW4gZmlsdGVyIGVhY2ggaG9yaXpvbnRhbCBlZGdlIG9mIHRoZSByb3cgKi8KKyAgICBmb3IgKHZibG9jayA9IDQ7IHZibG9jay0tOykKKyAgICB7CisgICAgICAgIC8qIG9ubHkgcGVyZm9ybSBmaWx0ZXJpbmcgaWYgYlMgaXMgbm9uLXplcm8sIGZpcnN0IG9mIHRoZSBmb3VyCisgICAgICAgICAqIEZpbHRlclZlckx1bWFFZGdlIGhhbmRsZXMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywgb3RoZXJzCisgICAgICAgICAqIGZpbHRlciBpbm5lciBlZGdlcyAqLworICAgICAgICBpZiAodG1wWzBdLmxlZnQpCisgICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOworICAgICAgICBpZiAodG1wWzFdLmxlZnQpCisgICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrNCwgdG1wWzFdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICBpZiAodG1wWzJdLmxlZnQpCisgICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrOCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICBpZiAodG1wWzNdLmxlZnQpCisgICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrMTIsIHRtcFszXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKKworICAgICAgICAvKiBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIHJvdyAtPiBwZXJmb3JtCisgICAgICAgICAqIGZpbHRlcmluZyB3aXRoIEZpbHRlckhvckx1bWEsIG90aGVyd2lzZSB1c2UgRmlsdGVySG9yTHVtYUVkZ2UgZm9yCisgICAgICAgICAqIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrIGVkZ2UKKyAgICAgICAgICogb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBvdGhlciByb3VuZHMgKi8KKyAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKKyAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hKHB0ciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcyArIG9mZnNldCwgKGkzMil3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZih0bXBbMF0udG9wKQorICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0ciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgaWYodG1wWzFdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrNCwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgaWYodG1wWzJdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrOCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgaWYodG1wWzNdLnRvcCkKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrMTIsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZvdXIgcGl4ZWwgcm93cyBhaGVhZCwgaS5lLiBuZXh0IHJvdyBvZiA0eDQtYmxvY2tzICovCisgICAgICAgIHB0ciArPSB3aWR0aCo0OworICAgICAgICB0bXAgKz0gNDsKKyAgICAgICAgb2Zmc2V0ID0gSU5ORVI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEZpbHRlckNocm9tYQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaWx0ZXIgYWxsIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2sKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRmlsdGVyQ2hyb21hKAorICB1OCAqZGF0YUNiLAorICB1OCAqZGF0YUNyLAorICBiU190ICpiUywKKyAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAorICB1MzIgd2lkdGgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHZibG9jazsKKyAgICBiU190ICp0bXA7CisgICAgdTMyIG9mZnNldDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGFDYik7CisgICAgQVNTRVJUKGRhdGFDcik7CisgICAgQVNTRVJUKGJTKTsKKyAgICBBU1NFUlQodGhyZXNob2xkcyk7CisKKyAgICB0bXAgPSBiUzsKKyAgICBvZmZzZXQgPSBUT1A7CisKKyAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCisgICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCisgICAgZm9yICh2YmxvY2sgPSAwOyB2YmxvY2sgPCAyOyB2YmxvY2srKykKKyAgICB7CisgICAgICAgIC8qIG9ubHkgcGVyZm9ybSBmaWx0ZXJpbmcgaWYgYlMgaXMgbm9uLXplcm8sIGZpcnN0IHR3byBvZiB0aGUgZm91cgorICAgICAgICAgKiBGaWx0ZXJWZXJDaHJvbWFFZGdlIGNhbGxzIGhhbmRsZSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYWNyb2Jsb2NrLAorICAgICAgICAgKiBvdGhlcnMgZmlsdGVyIHRoZSBpbm5lciBlZGdlLiBOb3RlIHRoYXQgYXMgY2hyb21hIHVzZXMgYlMgdmFsdWVzCisgICAgICAgICAqIGRldGVybWluZWQgZm9yIGx1bWEgZWRnZXMsIGVhY2ggYlMgaXMgdXNlZCBvbmx5IGZvciAyIHBpeGVscyBvZgorICAgICAgICAgKiBhIDQtcGl4ZWwgZWRnZSAqLworICAgICAgICBpZiAodG1wWzBdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wWzRdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzIqd2lkdGgsIHRtcFs0XS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwKKyAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCisgICAgICAgICAgICAgICAgd2lkdGgpOworICAgICAgICB9CisgICAgICAgIGlmICh0bXBbMl0ubGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKKyAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLAorICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wWzZdLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzIqd2lkdGgrNCwgdG1wWzZdLmxlZnQsCisgICAgICAgICAgICAgICAgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7CisgICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAorICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQorICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JDaHJvbWEsIG90aGVyd2lzZSB1c2UgRmlsdGVySG9yQ2hyb21hRWRnZQorICAgICAgICAgKiBmb3IgZWFjaCBlZGdlIHNlcGFyYXRlbHkuIG9mZnNldCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG9wIG1hY3JvYmxvY2sKKyAgICAgICAgICogZWRnZSBvbiB0aGUgZmlyc3QgbG9vcCByb3VuZCwgaW5uZXIgZWRnZSBmb3IgdGhlIHNlY29uZCAqLworICAgICAgICBpZiAodG1wWzBdLnRvcCA9PSB0bXBbMV0udG9wICYmIHRtcFsxXS50b3AgPT0gdG1wWzJdLnRvcCAmJgorICAgICAgICAgICAgdG1wWzJdLnRvcCA9PSB0bXBbM10udG9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZih0bXBbMF0udG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG1wWzBdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG1wWzFdLnRvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYisyLCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcFsyXS50b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrNCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0bXBbM10udG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzYsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKKyAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgZGF0YUNiICs9IHdpZHRoKjQ7CisgICAgICAgIGRhdGFDciArPSB3aWR0aCo0OworICAgICAgICBvZmZzZXQgPSBJTk5FUjsKKyAgICB9Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQorICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5CisgICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcworICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCisgICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgorICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAorICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKmxpbnQgLS1lezU1MH0gU3ltYm9sIG5vdCBhY2Nlc3NlZCAqLwordm9pZCBoMjY0YnNkRmlsdGVyUGljdHVyZSgKKyAgaW1hZ2VfdCAqaW1hZ2UsCisgIG1iU3RvcmFnZV90ICptYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgZmxhZ3M7CisgICAgdTMyIHBpY1NpemVJbk1icywgbWJSb3csIG1iQ29sOworICAgIHUzMiBwaWNXaWR0aEluTWJzOworICAgIHU4ICpkYXRhOworICAgIG1iU3RvcmFnZV90ICpwTWI7CisgICAgdTggYlNbMl1bMTZdOworICAgIHU4IHRocmVzaG9sZEx1bWFbMl1bMTZdOworICAgIHU4IHRocmVzaG9sZENocm9tYVsyXVs4XTsKKyAgICB1OCBhbHBoYVsyXVsyXTsKKyAgICB1OCBiZXRhWzJdWzJdOworICAgIE9NWFJlc3VsdCByZXM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQoaW1hZ2UtPmRhdGEpOworICAgIEFTU0VSVChpbWFnZS0+d2lkdGgpOworICAgIEFTU0VSVChpbWFnZS0+aGVpZ2h0KTsKKworICAgIHBpY1dpZHRoSW5NYnMgPSBpbWFnZS0+d2lkdGg7CisgICAgZGF0YSA9IGltYWdlLT5kYXRhOworICAgIHBpY1NpemVJbk1icyA9IHBpY1dpZHRoSW5NYnMgKiBpbWFnZS0+aGVpZ2h0OworCisgICAgcE1iID0gbWI7CisKKyAgICBmb3IgKG1iUm93ID0gMCwgbWJDb2wgPSAwOyBtYlJvdyA8IGltYWdlLT5oZWlnaHQ7IHBNYisrKQorICAgIHsKKyAgICAgICAgZmxhZ3MgPSBHZXRNYkZpbHRlcmluZ0ZsYWdzKHBNYik7CisKKyAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXRCb3VuZGFyeVN0cmVuZ3RocyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIGlmIGFueSBvZgorICAgICAgICAgICAgICogdGhlIGJTIHZhbHVlcyBmb3IgdGhlIG1hY3JvYmxvY2sgYmVpbmcgcHJvY2Vzc2VkIHdhcyBub24temVybyAqLworICAgICAgICAgICAgaWYgKEdldEJvdW5kYXJ5U3RyZW5ndGhzKHBNYiwgYlMsIGZsYWdzKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIC8qIEx1bWEgKi8KKyAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHMocE1iLGFscGhhLGJldGEsdGhyZXNob2xkTHVtYSxiUyxmbGFncyk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKKworICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7CisKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRMdW1hKzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKKyAgICAgICAgICAgICAgICAvKiBDYiAqLworICAgICAgICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKHBNYiwgYWxwaGEsIGJldGEsIHRocmVzaG9sZENocm9tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUywgZmxhZ3MsIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCk7CisgICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgcGljU2l6ZUluTWJzICogMjU2ICsKKyAgICAgICAgICAgICAgICAgICAgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogNjQgKyBtYkNvbCAqIDg7CisKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7CisgICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOworICAgICAgICAgICAgICAgIC8qIENyICovCisgICAgICAgICAgICAgICAgZGF0YSArPSAocGljU2l6ZUluTWJzICogNjQpOworICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKKyAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSs4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYkNvbCsrOworICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgbWJDb2wgPSAwOworICAgICAgICAgICAgbWJSb3crKzsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldEJvdW5kYXJ5U3RyZW5ndGhzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aHMgZm9yIGFsbCBlZGdlcyBvZiBhCisgICAgICAgICAgICBtYWNyb2Jsb2NrLiBGdW5jdGlvbiByZXR1cm5zIEhBTlRST19UUlVFIGlmIGFueSBvZiB0aGUgYlMgdmFsdWVzIGZvcgorICAgICAgICAgICAgdGhlIG1hY3JvYmxvY2sgaGFkIG5vbi16ZXJvIHZhbHVlLCBIQU5UUk9fRkFMU0Ugb3RoZXJ3aXNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpiUylbMTZdLCB1MzIgZmxhZ3MpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgLyogdGhpcyBmbGFnIGlzIHNldCBIQU5UUk9fVFJVRSBhcyBzb29uIGFzIGFueSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBpcworICAgICAqIG5vbi16ZXJvICovCisgICAgdTMyIG5vblplcm9CcyA9IEhBTlRST19GQUxTRTsKKyAgICB1MzIgKnBUbXA7CisgICAgdTMyIHRtcDEsIHRtcDIsIGlzSW50cmFNYjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQoYlMpOworICAgIEFTU0VSVChmbGFncyk7CisKKyAgICBpc0ludHJhTWIgPSBJU19JTlRSQV9NQigqbWIpOworCisgICAgLyogdG9wIGVkZ2VzICovCisgICAgcFRtcCA9ICh1MzIqKSZiU1sxXVswXTsKKyAgICBpZiAoZmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCisgICAgeworICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJCKSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBUbXAgPSAweDA0MDQwNDA0OworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFRtcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iLCBtYi0+bWJCKTsKKyAgICAgICAgICAgIGlmICgqcFRtcCkKKyAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcFRtcCA9IDA7CisgICAgfQorCisgICAgLyogbGVmdCBlZGdlcyAqLworICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07CisgICAgaWYgKGZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIGlmIChpc0ludHJhTWIgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmJTWzBdWzBdID0gYlNbMF1bMV0gPSBiU1swXVsyXSA9IGJTWzBdWzNdID0gNDsqLworICAgICAgICAgICAgKnBUbXAgPSAweDA0MDQwNDA0OworICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFRtcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYiwgbWItPm1iQSk7CisgICAgICAgICAgICBpZiAoIW5vblplcm9CcyAmJiAqcFRtcCkKKyAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcFRtcCA9IDA7CisgICAgfQorCisgICAgLyogaW5uZXIgZWRnZXMgKi8KKyAgICBpZiAoaXNJbnRyYU1iKQorICAgIHsKKyAgICAgICAgcFRtcCsrOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7CisgICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOworICAgICAgICBwVG1wKys7CisgICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOworICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKKyAgICAgICAgKnBUbXAgPSAweDAzMDMwMzAzOworCisgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVG1wID0gKHUzMiopbWItPnRvdGFsQ29lZmY7CisKKyAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAorICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCisgICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCisgICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCisgICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCisKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLworICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLworICAgICAgICAgICAgdG1wMiA9ICpwVG1wOworICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLworICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KKworICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCisgICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KKworICAgICAgICAgICAgeworICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7CisKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls4XTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsyXTsKKyAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls5XTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKKworICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKKyAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOworICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKKyAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKKyAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOworICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOworICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisgICAgICAgICAgICBiU1swXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls5XTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTRdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzExXTsKKyAgICAgICAgICAgIGJTWzBdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgYlNbMF1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKKyAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLworICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KKyAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KKyAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLworICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLworICAgICAgICAgICAgdG1wMiA9ICpwVG1wOworICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLworICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KKworICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KKyAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCisgICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KKworICAgICAgICAgICAgYlNbMV1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKKyAgICAgICAgICAgIGJTWzFdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7CisgICAgICAgICAgICBiU1sxXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7CisgICAgICAgICAgICBiU1sxXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OworCisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbNF07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMV07CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbNl07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisgICAgICAgICAgICBiU1swXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls5XTsKKyAgICAgICAgICAgIGJTWzBdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTRdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzExXTsKKyAgICAgICAgICAgIGJTWzBdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgYlNbMF1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogOHgxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50CisgICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgdmVydGljYWwgZWRnZSwgZm9yIHRoZSBvdGhlciBsZWZ0IGVkZ2VzIGl0IGlzCisgICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKKyAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCB0b3AgZWRnZXMuICovCisgICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF84eDE2KQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLworICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLworICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLworICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7CisgICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCisgICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCisgICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCisgICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCisgICAgICAgICAgICB0bXAyID0gKnBUbXA7CisgICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCisgICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCisgICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCisgICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLworCisgICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLworICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KKyAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCisgICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLworCisgICAgICAgICAgICBiU1swXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOworICAgICAgICAgICAgYlNbMF1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKKyAgICAgICAgICAgIGJTWzBdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OworCisgICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07CisgICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07CisgICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107CisgICAgICAgICAgICBiU1sxXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOworICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls2XTsKKyAgICAgICAgICAgIGJTWzFdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7CisgICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTNdOworICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzddOworICAgICAgICAgICAgYlNbMV1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7CisgICAgICAgICAgICBiU1sxXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAyLCAwKTsKKyAgICAgICAgICAgIGJTWzFdWzVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMSk7CisgICAgICAgICAgICBiU1swXVs0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEsIDApOworICAgICAgICAgICAgYlNbMF1bNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAzLCAyKTsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOworICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNiwgNCk7CisgICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA3LCA1KTsKKyAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDUsIDQpOworICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNik7CisgICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKKyAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEwLCA4KTsKKyAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCA5KTsKKyAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDksIDgpOworICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTEsIDEwKTsKKyAgICAgICAgICAgIHRtcDEgPSAqcFRtcDsKKyAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE0LCAxMik7CisgICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTMpOworICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTMsIDEyKTsKKyAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE1LCAxNCk7CisKKyAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7CisgICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOworICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOworICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOworCisgICAgICAgICAgICBiU1swXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOworICAgICAgICAgICAgYlNbMF1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKKyAgICAgICAgICAgIGJTWzBdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKKyAgICAgICAgICAgIGJTWzBdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7CisgICAgICAgIH0KKyAgICAgICAgcFRtcCA9ICh1MzIqKSZiU1swXVswXTsKKyAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKHBUbXBbMV0gfHwgcFRtcFsyXSB8fCBwVG1wWzNdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wWzVdIHx8IHBUbXBbNl0gfHwgcFRtcFs3XSkgKQorICAgICAgICB7CisgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihub25aZXJvQnMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0THVtYUVkZ2VUaHJlc2hvbGRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCisgICAgICAgICAgICBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAorICAgIG1iU3RvcmFnZV90ICptYiwKKyAgICB1OCAoKmFscGhhKVsyXSwKKyAgICB1OCAoKmJldGEpWzJdLAorICAgIHU4ICgqdGhyZXNob2xkKVsxNl0sCisgICAgdTggKCpicylbMTZdLAorICAgIHUzMiBmaWx0ZXJpbmdGbGFncyApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGluZGV4QSwgaW5kZXhCOworICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7CisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0aHJlc2hvbGQpOworICAgIEFTU0VSVChicyk7CisgICAgQVNTRVJUKGJldGEpOworICAgIEFTU0VSVChhbHBoYSk7CisgICAgQVNTRVJUKG1iKTsKKworICAgIHFwID0gbWItPnFwWTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIC8qIEludGVybmFsIGVkZ2UgdmFsdWVzICovCisgICAgYWxwaGFbMF1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVsxXVsxXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBiZXRhWzBdWzFdID0gYmV0YXNbaW5kZXhCXTsKKyAgICBiZXRhWzFdWzFdID0gYmV0YXNbaW5kZXhCXTsKKyAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKKyAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKKworICAgIC8qIHZlcnRpY2FsIHNjYW4gb3JkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgdTMyIHQxLCB0MjsKKworICAgICAgICB0MSA9IGJzW2ldWzBdOworICAgICAgICB0MiA9IGJzW2ldWzFdOworICAgICAgICB0aHJlc2hvbGRbaV1bMF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bMl07CisgICAgICAgIHRocmVzaG9sZFtpXVsxXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVszXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzJdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzRdOworICAgICAgICB0aHJlc2hvbGRbaV1bM10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bNV07CisgICAgICAgIHRocmVzaG9sZFtpXVs0XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVs2XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzVdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzddOworICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bOF07CisgICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVs5XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzhdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzEwXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzldICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzExXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzEwXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzEyXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzExXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzEzXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzEyXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzE0XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzEzXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICB0MiA9IGJzW2ldWzE1XTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzE0XSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0aHJlc2hvbGRbaV1bMTVdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgfQorCisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBxcCkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIHQxLCB0MiwgdDMsIHQ0OworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgICAgICAgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisgICAgICAgICAgICB0MSA9IGJzWzFdWzBdOworICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKKyAgICAgICAgICAgIHQzID0gYnNbMV1bMl07CisgICAgICAgICAgICB0NCA9IGJzWzFdWzNdOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxICYmICh0MSA8IDQpKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIgJiYgKHQyIDwgNCkpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MyAmJiAodDMgPCA0KSkgPyB0YzBbaW5kZXhBXVt0M10gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0ICYmICh0NCA8IDQpKSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gcXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzBdID0gKGJzWzBdWzBdICYmIChic1swXVswXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzBdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMV0gPSAoYnNbMF1bMV0gJiYgKGJzWzBdWzFdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMV1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVsyXSA9IChic1swXVsyXSAmJiAoYnNbMF1bMl0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVsyXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzNdID0gKGJzWzBdWzNdICYmIChic1swXVszXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzNdXSA6IDA7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAorICAgICAgICAgICAgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCisgICAgbWJTdG9yYWdlX3QgKm1iLAorICAgIHU4ICgqYWxwaGEpWzJdLAorICAgIHU4ICgqYmV0YSlbMl0sCisgICAgdTggKCp0aHJlc2hvbGQpWzhdLAorICAgIHU4ICgqYnMpWzE2XSwKKyAgICB1MzIgZmlsdGVyaW5nRmxhZ3MsCisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGluZGV4QSwgaW5kZXhCOworICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7CisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCh0aHJlc2hvbGQpOworICAgIEFTU0VSVChicyk7CisgICAgQVNTRVJUKGJldGEpOworICAgIEFTU0VSVChhbHBoYSk7CisgICAgQVNTRVJUKG1iKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgcXAgPSBtYi0+cXBZOworICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKworICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7CisgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07CisgICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07CisgICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisgICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgIHsKKyAgICAgICAgdTMyIHQxLCB0MjsKKworICAgICAgICB0MSA9IGJzW2ldWzBdOworICAgICAgICB0MiA9IGJzW2ldWzFdOworICAgICAgICB0aHJlc2hvbGRbaV1bMF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7CisgICAgICAgIHQxID0gYnNbaV1bMl07CisgICAgICAgIHRocmVzaG9sZFtpXVsxXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVszXTsKKyAgICAgICAgdGhyZXNob2xkW2ldWzJdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOworICAgICAgICB0MSA9IGJzW2ldWzhdOworICAgICAgICB0aHJlc2hvbGRbaV1bM10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7CisgICAgICAgIHQyID0gYnNbaV1bOV07CisgICAgICAgIHRocmVzaG9sZFtpXVs0XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdDEgPSBic1tpXVsxMF07CisgICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKKyAgICAgICAgdDIgPSBic1tpXVsxMV07CisgICAgICAgIHRocmVzaG9sZFtpXVs2XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgdGhyZXNob2xkW2ldWzddICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgIH0KKworICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKKyAgICB7CisgICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOworICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIHQxLCB0MiwgdDMsIHQ0OworICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOworICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKKworICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOworICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOworCisgICAgICAgICAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOworICAgICAgICAgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07CisKKyAgICAgICAgICAgIHQxID0gYnNbMV1bMF07CisgICAgICAgICAgICB0MiA9IGJzWzFdWzFdOworICAgICAgICAgICAgdDMgPSBic1sxXVsyXTsKKyAgICAgICAgICAgIHQ0ID0gYnNbMV1bM107CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFsxXVsxXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzFdWzJdID0gKHQzKSA/IHRjMFtpbmRleEFdW3QzXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMV1bM10gPSAodDQpID8gdGMwW2luZGV4QV1bdDRdIDogMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQorICAgIHsKKyAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7CisgICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKKyAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7CisKKyAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKKyAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKKworICAgICAgICAgICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKKyAgICAgICAgICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzBdID0gKGJzWzBdWzBdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzBdXSA6IDA7CisgICAgICAgICAgICB0aHJlc2hvbGRbMF1bMV0gPSAoYnNbMF1bMV0pID8gdGMwW2luZGV4QV1bYnNbMF1bMV1dIDogMDsKKyAgICAgICAgICAgIHRocmVzaG9sZFswXVsyXSA9IChic1swXVsyXSkgPyB0YzBbaW5kZXhBXVtic1swXVsyXV0gOiAwOworICAgICAgICAgICAgdGhyZXNob2xkWzBdWzNdID0gKGJzWzBdWzNdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzNdXSA6IDA7CisgICAgICAgIH0KKyAgICB9CisKK30KKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLypsaW50ICtlNzAxICtlNzAyICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1NzFkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19ICisjZGVmaW5lIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCisgIGltYWdlX3QgKmltYWdlLAorICBtYlN0b3JhZ2VfdCAqbWIpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUJMT0NLSU5HX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxNjg3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkSW5pdAorICAgICAgICAgIGgyNjRic2REZWNvZGUKKyAgICAgICAgICBoMjY0YnNkU2h1dGRvd24KKyAgICAgICAgICBoMjY0YnNkQ3VycmVudEltYWdlCisgICAgICAgICAgaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlCisgICAgICAgICAgaDI2NGJzZFBpY1dpZHRoCisgICAgICAgICAgaDI2NGJzZFBpY0hlaWdodAorICAgICAgICAgIGgyNjRic2RGbHVzaEJ1ZmZlcgorICAgICAgICAgIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzCisgICAgICAgICAgaDI2NGJzZFZpZGVvUmFuZ2UKKyAgICAgICAgICBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzCisgICAgICAgICAgaDI2NGJzZENyb3BwaW5nUGFyYW1zCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9kZWNvZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfYnl0ZV9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfZGF0YS5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RlYmxvY2tpbmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NvbmNlYWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZEluaXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBub091dHB1dFJlb3JkZXJpbmcgIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGRlY29kZXIgdGhhdCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIHBlcmZvcm0gcmVvcmRlcmluZyBvZiBkaXNwbGF5IGltYWdlcy4KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbml0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBub091dHB1dFJlb3JkZXJpbmcpCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiBzaXplOworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGgyNjRic2RJbml0U3RvcmFnZShwU3RvcmFnZSk7CisKKyAgICAvKiBhbGxvY2F0ZSBtYkxheWVyIHRvIGJlIG5leHQgbXVsdGlwbGUgb2YgNjQgdG8gZW5hYmxlIHVzZSBvZgorICAgICAqIHNwZWNpZmljIE5FT04gb3B0aW1pemVkICJtZW1zZXQiIGZvciBjbGVhcmluZyB0aGUgc3RydWN0dXJlICovCisgICAgc2l6ZSA9IChzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpICsgNjMpICYgfjB4M0Y7CisKKyAgICBwU3RvcmFnZS0+bWJMYXllciA9IChtYWNyb2Jsb2NrTGF5ZXJfdCopSDI2NFN3RGVjTWFsbG9jKHNpemUpOworICAgIGlmICghcFN0b3JhZ2UtPm1iTGF5ZXIpCisgICAgICAgIHJldHVybiBIQU5UUk9fTk9LOworCisgICAgaWYgKG5vT3V0cHV0UmVvcmRlcmluZykKKyAgICAgICAgcFN0b3JhZ2UtPm5vUmVvcmRlcmluZyA9IEhBTlRST19UUlVFOworCisgICAgcmV0dXJuIEhBTlRST19PSzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBhIE5BTCB1bml0LiBUaGlzIGZ1bmN0aW9uIGNhbGxzIG90aGVyIG1vZHVsZXMgdG8gcGVyZm9ybQorICAgICAgICAgICAgdGFza3MgbGlrZQorICAgICAgICAgICAgICAgICogZXh0cmFjdCBhbmQgZGVjb2RlIE5BTCB1bml0IGZyb20gdGhlIGJ5dGUgc3RyZWFtCisgICAgICAgICAgICAgICAgKiBkZWNvZGUgcGFyYW1ldGVyIHNldHMKKyAgICAgICAgICAgICAgICAqIGRlY29kZSBzbGljZSBoZWFkZXIgYW5kIHNsaWNlIGRhdGEKKyAgICAgICAgICAgICAgICAqIGNvbmNlYWwgZXJyb3JzIGluIHRoZSBwaWN0dXJlCisgICAgICAgICAgICAgICAgKiBwZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nCisKKyAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY29udGFpbnMgdG9wIGxldmVsIGNvbnRyb2wgbG9naWMgb2YgdGhlIGRlY29kZXIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgYnl0ZVN0cm0gICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGJ1ZmZlciBnaXZlbiBieSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgbGVuICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzCisgICAgICAgICAgICBwaWNJZCAgICAgICAgICAgaWRlbnRpZmllciBmb3IgYSBwaWN0dXJlLCBhc3NpZ25lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICByZWFkQnl0ZXMgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtIGlzIHN0b3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSDI2NEJTRF9SRFkgICAgICAgICAgICAgZGVjb2RpbmcgZmluaXNoZWQsIG5vdGhpbmcgc3BlY2lhbAorICAgICAgICAgICAgSDI2NEJTRF9QSUNfUkRZICAgICAgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkCisgICAgICAgICAgICBIMjY0QlNEX0hEUlNfUkRZICAgICAgICBwYXJhbSBzZXRzIGFjdGl2YXRlZCwgaW5mb3JtYXRpb24gbGlrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBkaW1lbnNpb25zIGV0YyBjYW4gYmUgcmVhZAorICAgICAgICAgICAgSDI2NEJTRF9FUlJPUiAgICAgICAgICAgZXJyb3IgaW4gZGVjb2RpbmcKKyAgICAgICAgICAgIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SIHNlcml1cyBlcnJvciBpbiBkZWNvZGluZywgZmFpbGVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSBwYXJhbSBzZXRzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHU4ICpieXRlU3RybSwgdTMyIGxlbiwgdTMyIHBpY0lkLAorICAgIHUzMiAqcmVhZEJ5dGVzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHBwc0lkLCBzcHNJZDsKKyAgICBpMzIgcGljT3JkZXJDbnQ7CisgICAgbmFsVW5pdF90IG5hbFVuaXQ7CisgICAgc2VxUGFyYW1TZXRfdCBzZXFQYXJhbVNldDsKKyAgICBwaWNQYXJhbVNldF90IHBpY1BhcmFtU2V0OworICAgIHN0cm1EYXRhX3Qgc3RybTsKKyAgICB1MzIgYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19GQUxTRTsKKyAgICB1MzIgcGljUmVhZHkgPSBIQU5UUk9fRkFMU0U7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKGJ5dGVTdHJtKTsKKyAgICBBU1NFUlQobGVuKTsKKyAgICBBU1NFUlQocmVhZEJ5dGVzKTsKKworICAgIC8qIGlmIHByZXZpb3VzIGJ1ZmZlciB3YXMgbm90IGZpbmlzaGVkIGFuZCBzYW1lIHBvaW50ZXIgZ2l2ZW4gLT4gc2tpcCBOQUwKKyAgICAgKiB1bml0IGV4dHJhY3Rpb24gKi8KKyAgICBpZiAocFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCAmJiBieXRlU3RybSA9PSBwU3RvcmFnZS0+cHJldkJ1ZlBvaW50ZXIpCisgICAgeworICAgICAgICBzdHJtID0gcFN0b3JhZ2UtPnN0cm1bMF07CisgICAgICAgIHN0cm0ucFN0cm1DdXJyUG9zID0gc3RybS5wU3RybUJ1ZmZTdGFydDsKKyAgICAgICAgc3RybS5zdHJtQnVmZlJlYWRCaXRzID0gc3RybS5iaXRQb3NJbldvcmQgPSAwOworICAgICAgICAqcmVhZEJ5dGVzID0gcFN0b3JhZ2UtPnByZXZCeXRlc0NvbnN1bWVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRXh0cmFjdE5hbFVuaXQoYnl0ZVN0cm0sIGxlbiwgJnN0cm0sIHJlYWRCeXRlcyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIkJZVEVfU1RSRUFNIik7CisgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgc3RyZWFtICovCisgICAgICAgIHBTdG9yYWdlLT5zdHJtWzBdID0gc3RybTsKKyAgICAgICAgcFN0b3JhZ2UtPnByZXZCeXRlc0NvbnN1bWVkID0gKnJlYWRCeXRlczsKKyAgICAgICAgcFN0b3JhZ2UtPnByZXZCdWZQb2ludGVyID0gYnl0ZVN0cm07CisgICAgfQorICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTmFsVW5pdCgmc3RybSwgJm5hbFVuaXQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJOQUxfVU5JVCIpOworICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgfQorCisgICAgLyogRGlzY2FyZCB1bnNwZWNpZmllZCwgcmVzZXJ2ZWQsIFNQUyBleHRlbnNpb24gYW5kIGF1eGlsaWFyeSBwaWN0dXJlIHNsaWNlcyAqLworICAgIGlmKG5hbFVuaXQubmFsVW5pdFR5cGUgPT0gMCB8fCBuYWxVbml0Lm5hbFVuaXRUeXBlID49IDEzKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJESVNDQVJERUQgTkFMIChVTlNQRUNJRklFRCwgUkVHSVNURVJFRCwgU1BTIGV4dCBvciBBVVggc2xpY2UpXG4iKSk7CisgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAorICAgICAgJnN0cm0sCisgICAgICAmbmFsVW5pdCwKKyAgICAgIHBTdG9yYWdlLAorICAgICAgJmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJBQ0NFU1MgVU5JVCBCT1VOREFSWSBDSEVDSyIpOworICAgICAgICBpZiAodG1wID09IFBBUkFNX1NFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICB9CisKKyAgICBpZiAoIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgKQorICAgIHsKKyAgICAgICAgREVCVUcoKCJBY2Nlc3MgdW5pdCBib3VuZGFyeVxuIikpOworICAgICAgICAvKiBjb25jZWFsIGlmIHBpY3R1cmUgc3RhcnRlZCBhbmQgcGFyYW0gc2V0cyBhY3RpdmF0ZWQgKi8KKyAgICAgICAgaWYgKHBTdG9yYWdlLT5waWNTdGFydGVkICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUcoKCJDT05DRUFMSU5HLi4uIikpOworCisgICAgICAgICAgICAvKiByZXR1cm4gZXJyb3IgaWYgc2Vjb25kIHBoYXNlIG9mCisgICAgICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBpcyBub3QgY29tcGxldGVkICovCisgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgiUGVuZGluZyBhY3RpdmF0aW9uIG5vdCBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmRhdGEgPQorICAgICAgICAgICAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShwU3RvcmFnZS0+ZHBiKTsKKyAgICAgICAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENvbmNlYWwocFN0b3JhZ2UsIHBTdG9yYWdlLT5jdXJySW1hZ2UsIFBfU0xJQ0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDb25jZWFsKHBTdG9yYWdlLCBwU3RvcmFnZS0+Y3VyckltYWdlLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnNsaWNlVHlwZSk7CisKKyAgICAgICAgICAgIHBpY1JlYWR5ID0gSEFOVFJPX1RSVUU7CisKKyAgICAgICAgICAgIC8qIGN1cnJlbnQgTkFMIHVuaXQgc2hvdWxkIGJlIGRlY29kZWQgb24gbmV4dCBhY3RpdmF0aW9uIC0+IHNldAorICAgICAgICAgICAgICogcmVhZEJ5dGVzIHRvIDAgKi8KKyAgICAgICAgICAgICpyZWFkQnl0ZXMgPSAwOworICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCA9IEhBTlRST19UUlVFOworICAgICAgICAgICAgREVCVUcoKCIuLi5ET05FXG4iKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcyA9IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIXBpY1JlYWR5KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChuYWxVbml0Lm5hbFVuaXRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE5BTF9TRVFfUEFSQU1fU0VUOgorICAgICAgICAgICAgICAgIERFQlVHKCgiU0VRIFBBUkFNIFNFVFxuIikpOworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTZXFQYXJhbVNldCgmc3RybSwgJnNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiU0VRX1BBUkFNX1NFVCIpOworICAgICAgICAgICAgICAgICAgICBGUkVFKHNlcVBhcmFtU2V0Lm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShzZXFQYXJhbVNldC52dWlQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChwU3RvcmFnZSwgJnNlcVBhcmFtU2V0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQUxfUElDX1BBUkFNX1NFVDoKKyAgICAgICAgICAgICAgICBERUJVRygoIlBJQyBQQVJBTSBTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoJnN0cm0sICZwaWNQYXJhbVNldCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlBJQ19QQVJBTV9TRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5ydW5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LnRvcExlZnQpOworICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LmJvdHRvbVJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgRlJFRShwaWNQYXJhbVNldC5zbGljZUdyb3VwSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0KHBTdG9yYWdlLCAmcGljUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BTF9DT0RFRF9TTElDRV9JRFI6CisgICAgICAgICAgICAgICAgREVCVUcoKCJJRFIgIikpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgY2FzZSBOQUxfQ09ERURfU0xJQ0U6CisgICAgICAgICAgICAgICAgREVCVUcoKCJTTElDRSBIRUFERVJcbiIpKTsKKworICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIGFuZCBzdGlsbCBkZWNvZGluZyBzYW1lIG9sZAorICAgICAgICAgICAgICAgICAqIGFjY2VzcyB1bml0IC0+IG5vIG5lZWQgdG8gZGVjb2RlIHJlZHVuZGFudCBzbGljZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1JEWSk7CisKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGljU3RhcnRlZCA9IEhBTlRST19UUlVFOworCisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHBTdG9yYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMgPSAwOworICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VycmVudFBpY0lkICAgID0gcGljSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrUHBzSWQoJnN0cm0sICZwcHNJZCk7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVCh0bXAgPT0gSEFOVFJPX09LKTsKKyAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgb2xkIGFjdGl2ZVNwc0lkIGFuZCByZXR1cm4gaGVhZGVycyByZWFkeQorICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0aW9uIGlmIGFjdGl2ZVNwcyBjaGFuZ2VzICovCisgICAgICAgICAgICAgICAgICAgIHNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMocFN0b3JhZ2UsIHBwc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVCgmbmFsVW5pdCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUGFyYW0gc2V0IGFjdGl2YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIMjY0QlNEX01FTUFMTE9DX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX1BBUkFNX1NFVF9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc3BzSWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXFQYXJhbVNldF90ICpvbGRTUFMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgc2VxUGFyYW1TZXRfdCAqbmV3U1BTID0gcFN0b3JhZ2UtPmFjdGl2ZVNwczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTdG9yYWdlLT5vbGRTcHNJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU1BTID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+b2xkU3BzSWRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAqcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2QnVmTm90RmluaXNoZWQgPSBIQU5UUk9fVFJVRTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihuYWxVbml0Lm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKCZub091dHB1dE9mUHJpb3JQaWNzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RybSwgbmV3U1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdC5uYWxVbml0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gSEFOVFJPX05PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRtcCAhPSBIQU5UUk9fT0spIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU3RvcmFnZS0+ZHBiLT5ub1Jlb3JkZXJpbmcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5waWNXaWR0aEluTWJzICE9IG5ld1NQUy0+cGljV2lkdGhJbk1icykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTUFMtPnBpY0hlaWdodEluTWJzICE9IG5ld1NQUy0+cGljSGVpZ2h0SW5NYnMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkU1BTLT5tYXhEcGJTaXplICE9IG5ld1NQUy0+bWF4RHBiU2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmRwYi0+Zmx1c2hlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEZsdXNoRHBiKHBTdG9yYWdlLT5kcGIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+b2xkU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0hEUlNfUkRZKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHJldHVybiBlcnJvciBpZiBzZWNvbmQgcGhhc2Ugb2YKKyAgICAgICAgICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBpcyBub3QgY29tcGxldGVkICovCisgICAgICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUGVuZGluZyBhY3RpdmF0aW9uIG5vdCBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyKCZzdHJtLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIgKyAxLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLCBwU3RvcmFnZS0+YWN0aXZlUHBzLCAmbmFsVW5pdCk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlNMSUNFX0hFQURFUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNTdGFydE9mUGljdHVyZShwU3RvcmFnZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUlTX0lEUl9OQUxfVU5JVCgmbmFsVW5pdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtKHBTdG9yYWdlLT5kcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzFdLmZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXQubmFsUmVmSWRjICE9IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIkdhcHMgaW4gZnJhbWUgbnVtIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogc3RvcmUgc2xpY2UgaGVhZGVyIHRvIHN0b3JhZ2UgaWYgc3VjY2Vzc2Z1bGx5IGRlY29kZWQgKi8KKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMF0gPSBwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMV07CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cHJldk5hbFVuaXRbMF0gPSBuYWxVbml0OworCisgICAgICAgICAgICAgICAgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSk7CisKKyAgICAgICAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QocFN0b3JhZ2UtPmRwYik7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0KHBTdG9yYWdlLT5kcGIsCisgICAgICAgICAgICAgICAgICAgICZwU3RvcmFnZS0+c2xpY2VIZWFkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUmVvcmRlcmluZyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgREVCVUcoKCJTTElDRSBEQVRBLCBGSVJTVCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKCZzdHJtLCBwU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiU0xJQ0VfREFUQSIpOworICAgICAgICAgICAgICAgICAgICBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzRW5kT2ZQaWN0dXJlKHBTdG9yYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpY1JlYWR5ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5BTF9TRUk6CisgICAgICAgICAgICAgICAgREVCVUcoKCJTRUkgTUVTU0FHRSwgTk9UIERFQ09ERUQiKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgREVCVUcoKCJOT1QgSU1QTEVNRU5URUQgWUVUICVkXG4iLG5hbFVuaXQubmFsVW5pdFR5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwaWNSZWFkeSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWx0ZXJQaWN0dXJlKHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5tYik7CisKKyAgICAgICAgaDI2NGJzZFJlc2V0U3RvcmFnZShwU3RvcmFnZSk7CisKKyAgICAgICAgcGljT3JkZXJDbnQgPSBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocFN0b3JhZ2UtPnBvYywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMsIHBTdG9yYWdlLT5zbGljZUhlYWRlciwgcFN0b3JhZ2UtPnByZXZOYWxVbml0KTsKKworICAgICAgICBpZiAocFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cHJldk5hbFVuaXQtPm5hbFJlZklkYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkTWFya0RlY1JlZlBpYyhwU3RvcmFnZS0+ZHBiLAorICAgICAgICAgICAgICAgICAgICAmcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKKyAgICAgICAgICAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBTdG9yYWdlLT5wcmV2TmFsVW5pdCkgPworICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCwgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBub24tcmVmZXJlbmNlIHBpY3R1cmUsIGp1c3Qgc3RvcmUgZm9yIHBvc3NpYmxlIGRpc3BsYXkKKyAgICAgICAgICAgICAqIHJlb3JkZXJpbmcgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkTWFya0RlY1JlZlBpYyhwU3RvcmFnZS0+ZHBiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZyYW1lTnVtLAorICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKKyAgICAgICAgICAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBTdG9yYWdlLT5wcmV2TmFsVW5pdCkgPworICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJlbnRQaWNJZCwgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwU3RvcmFnZS0+cGljU3RhcnRlZCA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgcmV0dXJuKEgyNjRCU0RfUElDX1JEWSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEgyNjRCU0RfUkRZKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTaHV0ZG93bgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTaHV0ZG93biBhIGRlY29kZXIgaW5zdGFuY2UuIEZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3JpZXMKKyAgICAgICAgICAgIGFsbG9jYXRlZCBmb3IgdGhlIGRlY29kZXIgaW5zdGFuY2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RTaHV0ZG93bihzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwU3RvcmFnZS0+c3BzW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0tPm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpXS0+dnVpUGFyYW1ldGVycyk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnJ1bkxlbmd0aCk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnRvcExlZnQpOworICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2ldLT5ib3R0b21SaWdodCk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPnNsaWNlR3JvdXBJZCk7CisgICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgRlJFRShwU3RvcmFnZS0+bWJMYXllcik7CisgICAgRlJFRShwU3RvcmFnZS0+bWIpOworICAgIEZSRUUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXApOworCisgICAgaDI2NGJzZEZyZWVEcGIocFN0b3JhZ2UtPmRwYik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IG5leHQgb3V0cHV0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcGljSWQgICAgICAgaWRlbnRpZmllciBvZiB0aGUgcGljdHVyZSB3aWxsIGJlIHN0b3JlZCBoZXJlCisgICAgICAgICAgICBpc0lkclBpYyAgICBJRFIgZmxhZyBvZiB0aGUgcGljdHVyZSB3aWxsIGJlIHN0b3JlZCBoZXJlCisgICAgICAgICAgICBudW1FcnJNYnMgICBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZSBwaWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHBpY3R1cmUgZGF0YQorICAgICAgICAgICAgTlVMTCBpZiBubyBwaWN0dXJlcyBhdmFpbGFibGUgZm9yIGRpc3BsYXkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTgqIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKnBpY0lkLCB1MzIgKmlzSWRyUGljLAorICAgIHUzMiAqbnVtRXJyTWJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGRwYk91dFBpY3R1cmVfdCAqcE91dDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIHBPdXQgPSBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZShwU3RvcmFnZS0+ZHBiKTsKKworICAgIGlmIChwT3V0ICE9IE5VTEwpCisgICAgeworICAgICAgICAqcGljSWQgPSBwT3V0LT5waWNJZDsKKyAgICAgICAgKmlzSWRyUGljID0gcE91dC0+aXNJZHI7CisgICAgICAgICpudW1FcnJNYnMgPSBwT3V0LT5udW1FcnJNYnM7CisgICAgICAgIHJldHVybiAocE91dC0+ZGF0YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKE5VTEwpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFBpY1dpZHRoCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCB3aWR0aCBvZiB0aGUgcGljdHVyZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBpY3R1cmUgd2lkdGgKKyAgICAgICAgICAgIDAgaWYgcGFyYW1ldGVycyBzZXRzIG5vdCB5ZXQgYWN0aXZhdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUGljV2lkdGgoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKKyAgICAgICAgcmV0dXJuKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKDApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFBpY0hlaWdodAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgaGVpZ2h0IG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcGljdHVyZSB3aWR0aAorICAgICAgICAgICAgMCBpZiBwYXJhbWV0ZXJzIHNldHMgbm90IHlldCBhY3RpdmF0ZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RQaWNIZWlnaHQoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKKyAgICAgICAgcmV0dXJuKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybigwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJ1ZmZlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGbHVzaCB0aGUgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlciwgc2VlIGRwYi5jIGZvciBkZXRhaWxzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEZsdXNoQnVmZmVyKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaDI2NGJzZEZsdXNoRHBiKHBTdG9yYWdlLT5kcGIpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgYW55IHZhbGlkIHBhcmFtZXRlciBzZXQgY29tYmluYXRpb25zIChTUFMvUFBTKSBleGlzdHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAxICAgICAgIGF0IGxlYXN0IG9uZSB2YWxpZCBTUFMvUFBTIGNvbWJpbmF0aW9uIGZvdW5kCisgICAgICAgICAgICAwICAgICAgIG5vIHZhbGlkIHBhcmFtIHNldCBjb21iaW5hdGlvbnMgZm91bmQKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICByZXR1cm4oaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHBTdG9yYWdlKSA9PSBIQU5UUk9fT0sgPyAxIDogMCk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkVmlkZW9SYW5nZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgdmFsdWUgb2YgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIDEgICB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgcmVjZWl2ZWQgYW5kIHZhbHVlIGlzIDEKKyAgICAgICAgICAgIDAgICBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RWaWRlb1JhbmdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+dmlkZW9GdWxsUmFuZ2VGbGFnKQorICAgICAgICByZXR1cm4oMSk7CisgICAgZWxzZSAvKiBkZWZhdWx0IHZhbHVlIG9mIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyBpcyAwICovCisgICAgICAgIHJldHVybigwKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHZhbHVlIG9mIG1hdHJpeF9jb2VmZmljaWVudHMgcmVjZWl2ZWQgaW4gdGhlIFZVSSBkYXRhCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICB2YWx1ZSBvZiBtYXRyaXhfY29lZmZpY2llbnRzIGlmIHJlY2VpdmVkCisgICAgICAgICAgICAyICAgb3RoZXJ3aXNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhzdG9yYWdlX3QgKnBTdG9yYWdlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICYmCisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcpCisgICAgICAgIHJldHVybihwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMpOworICAgIGVsc2UgLyogZGVmYXVsdCB1bnNwZWNpZmllZCAqLworICAgICAgICByZXR1cm4oMik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoaDI2NGJzZENyb3BwaW5nUGFyYW1zCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBjcm9wcGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBhY3RpdmUgU1BTCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjcm9wcGluZ0ZsYWcgICAgZmxhZyBpbmRpY2F0aW5nIGlmIGNyb3BwaW5nIHBhcmFtcyBwcmVzZW50IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIGxlZnRPZmZzZXQgICAgICBjcm9wcGluZyBsZWZ0IG9mZnNldCBpbiBwaXhlbHMgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIHdpZHRoICAgICAgICAgICB3aWR0aCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgY3JvcHBpbmcgaXMgc3RvcmVkIGhlcmUKKyAgICAgICAgICAgIHRvcE9mZnNldCAgICAgICBjcm9wcGluZyB0b3Agb2Zmc2V0IGluIHBpeGVscyBpcyBzdG9yZWQgaGVyZQorICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgIGhlaWdodCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgY3JvcHBpbmcgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKmNyb3BwaW5nRmxhZywKKyAgICB1MzIgKmxlZnRPZmZzZXQsIHUzMiAqd2lkdGgsIHUzMiAqdG9wT2Zmc2V0LCB1MzIgKmhlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BwaW5nRmxhZykKKyAgICB7CisgICAgICAgICpjcm9wcGluZ0ZsYWcgPSAxOworICAgICAgICAqbGVmdE9mZnNldCA9IDIgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0OworICAgICAgICAqd2lkdGggPSAxNiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgLQorICAgICAgICAgICAgICAgICAyICogKHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcExlZnRPZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0KTsKKyAgICAgICAgKnRvcE9mZnNldCA9IDIgKiBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BUb3BPZmZzZXQ7CisgICAgICAgICpoZWlnaHQgPSAxNiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzIC0KKyAgICAgICAgICAgICAgICAgIDIgKiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wVG9wT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmNyb3BwaW5nRmxhZyA9IDA7CisgICAgICAgICpsZWZ0T2Zmc2V0ID0gMDsKKyAgICAgICAgKndpZHRoID0gMDsKKyAgICAgICAgKnRvcE9mZnNldCA9IDA7CisgICAgICAgICpoZWlnaHQgPSAwOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgYXNwZWN0IHJhdGlvIHJlY2VpdmVkIGluIHRoZSBWVUkgZGF0YQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgc2FyV2lkdGggICAgc2FtcGxlIGFzcGVjdCByYXRpbyBoZWlnaHQKKyAgICAgICAgICAgIHNhckhlaWdodCAgIHNhbXBsZSBhc3BlY3QgcmF0aW8gd2lkdGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkU2FtcGxlQXNwZWN0UmF0aW8oc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyICpzYXJXaWR0aCwgdTMyICpzYXJIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworICAgIHUzMiB3ID0gMTsKKyAgICB1MzIgaCA9IDE7CisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworCisKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgorICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnICkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPX1VOU1BFQ0lGSUVEOiAgdyA9ICAgMDsgaCA9ICAwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzFfMTogICAgICAgICAgdyA9ICAgMTsgaCA9ICAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzEyXzExOiAgICAgICAgdyA9ICAxMjsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzEwXzExOiAgICAgICAgdyA9ICAxMDsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE2XzExOiAgICAgICAgdyA9ICAxNjsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzQwXzMzOiAgICAgICAgdyA9ICA0MDsgaCA9IDMzOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzI0XzExOiAgICAgICAgdyA9ICAyNDsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzIwXzExOiAgICAgICAgdyA9ICAyMDsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzMyXzExOiAgICAgICAgdyA9ICAzMjsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzgwXzMzOiAgICAgICAgdyA9ICA4MDsgaCA9IDMzOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE4XzExOiAgICAgICAgdyA9ICAxODsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE1XzExOiAgICAgICAgdyA9ICAxNTsgaCA9IDExOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzY0XzMzOiAgICAgICAgdyA9ICA2NDsgaCA9IDMzOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzE2MF85OTogICAgICAgdyA9IDE2MDsgaCA9IDk5OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUjoKKyAgICAgICAgICAgICAgICB3ID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+c2FyV2lkdGg7CisgICAgICAgICAgICAgICAgaCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPnNhckhlaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoKHcgPT0gMCkgfHwgKGggPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHcgPSBoID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdyA9IDA7CisgICAgICAgICAgICAgICAgaCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgYXNwZWN0IHJhdGlvKi8KKyAgICAqc2FyV2lkdGggPSB3OworICAgICpzYXJIZWlnaHQgPSBoOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByb2ZpbGUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IHByb2ZpbGUgaW5mb3JtYXRpb24gZnJvbSBhY3RpdmUgU1BTCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwcm9maWxlICAgY3VycmVudCBwcm9maWxlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZFByb2ZpbGUoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKyAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcykKKyAgICAgICAgcmV0dXJuIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnByb2ZpbGVJZGM7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNjUyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19ERUNPREVSX0gKKyNkZWZpbmUgSDI2NFNXREVDX0RFQ09ERVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVudW1lcmF0ZWQgcmV0dXJuIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zICovCitlbnVtIHsKKyAgICBIMjY0QlNEX1JEWSwKKyAgICBIMjY0QlNEX1BJQ19SRFksCisgICAgSDI2NEJTRF9IRFJTX1JEWSwKKyAgICBIMjY0QlNEX0VSUk9SLAorICAgIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SLAorICAgIEgyNjRCU0RfTUVNQUxMT0NfRVJST1IKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEluaXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZyk7Cit1MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKKyAgICB1MzIgKnJlYWRCeXRlcyk7Cit2b2lkIGgyNjRic2RTaHV0ZG93bihzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKwordTgqIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKnBpY0lkLCB1MzIgKmlzSWRyUGljLAorICAgIHUzMiAqbnVtRXJyTWJzKTsKKwordTMyIGgyNjRic2RQaWNXaWR0aChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RWaWRlb1JhbmdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwordTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit2b2lkIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKmNyb3BwaW5nRmxhZywKKyAgICB1MzIgKmxlZnQsIHUzMiAqd2lkdGgsIHUzMiAqdG9wLCB1MzIgKmhlaWdodCk7Cit2b2lkIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhzdG9yYWdlX3QgKnBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICpzYXJXaWR0aCwgdTMyICpzYXJIZWlnaHQpOwordTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOworCit2b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKTsKKwordTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUNPREVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1MTdkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmMKQEAgLTAsMCArMSwxNTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgQ29tcGFyZVBpY3R1cmVzCisgICAgICAgICAgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0CisgICAgICAgICAgTW1jb3AxCisgICAgICAgICAgTW1jb3AyCisgICAgICAgICAgTW1jb3AzCisgICAgICAgICAgTW1jb3A0CisgICAgICAgICAgTW1jb3A1CisgICAgICAgICAgTW1jb3A2CisgICAgICAgICAgaDI2NGJzZE1hcmtEZWNSZWZQaWMKKyAgICAgICAgICBoMjY0YnNkR2V0UmVmUGljRGF0YQorICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCisgICAgICAgICAgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcKKyAgICAgICAgICBoMjY0YnNkSW5pdERwYgorICAgICAgICAgIGgyNjRic2RSZXNldERwYgorICAgICAgICAgIGgyNjRic2RJbml0UmVmUGljTGlzdAorICAgICAgICAgIEZpbmREcGJQaWMKKyAgICAgICAgICBTZXRQaWNOdW1zCisgICAgICAgICAgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0KKyAgICAgICAgICBGaW5kU21hbGxlc3RQaWNPcmRlckNudAorICAgICAgICAgIE91dHB1dFBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZQorICAgICAgICAgIGgyNjRic2RGbHVzaERwYgorICAgICAgICAgIGgyNjRic2RGcmVlRHBiCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1hY3JvcyB0byBkZXRlcm1pbmUgcGljdHVyZSBzdGF0dXMuIE5vdGUgdGhhdCBJU19TSE9SVF9URVJNIG1hY3JvIHJldHVybnMKKyAqIHRydWUgYWxzbyBmb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGJlY2F1c2Ugbm9uLWV4aXN0aW5nIHBpY3R1cmVzIGFyZQorICogcmVnYXJkZWQgc2hvcnQgdGVybSBwaWN0dXJlcyBhY2NvcmRpbmcgdG8gSC4yNjQgc3RhbmRhcmQgKi8KKyNkZWZpbmUgSVNfUkVGRVJFTkNFKGEpICgoYSkuc3RhdHVzKQorI2RlZmluZSBJU19FWElTVElORyhhKSAoKGEpLnN0YXR1cyA+IE5PTl9FWElTVElORykKKyNkZWZpbmUgSVNfU0hPUlRfVEVSTShhKSBcCisgICAgKChhKS5zdGF0dXMgPT0gTk9OX0VYSVNUSU5HIHx8IChhKS5zdGF0dXMgPT0gU0hPUlRfVEVSTSkKKyNkZWZpbmUgSVNfTE9OR19URVJNKGEpICgoYSkuc3RhdHVzID09IExPTkdfVEVSTSkKKworLyogbWFjcm8gdG8gc2V0IGEgcGljdHVyZSB1bnVzZWQgZm9yIHJlZmVyZW5jZSAqLworI2RlZmluZSBTRVRfVU5VU0VEKGEpIChhKS5zdGF0dXMgPSBVTlVTRUQ7CisKKyNkZWZpbmUgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSAxNgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpOworCitzdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKTsKKworc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSk7CisKK3N0YXRpYyB1MzIgTW1jb3AzKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMsCisgICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOworCitzdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpOworCitzdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYik7CisKK3N0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKKyAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCk7CisKK3N0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpOworCitzdGF0aWMgaTMyIEZpbmREcGJQaWMoZHBiU3RvcmFnZV90ICpkcGIsIGkzMiBwaWNOdW0sIHUzMiBpc1Nob3J0VGVybSk7CisKK3N0YXRpYyB2b2lkIFNldFBpY051bXMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyRnJhbWVOdW0pOworCitzdGF0aWMgZHBiUGljdHVyZV90KiBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGJTdG9yYWdlX3QgKmRwYik7CisKK3N0YXRpYyB1MzIgT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYik7CisKK3N0YXRpYyB2b2lkIFNoZWxsU29ydChkcGJQaWN0dXJlX3QgKnBQaWMsIHUzMiBudW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IENvbXBhcmVQaWN0dXJlcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBjb21wYXJlIGRwYiBwaWN0dXJlcywgdXNlZCBieSB0aGUgU2hlbGxTb3J0KCkgZnVuY3Rpb24uCisgICAgICAgICAgICBPcmRlciBvZiB0aGUgcGljdHVyZXMgYWZ0ZXIgc29ydGluZyBzaGFsbCBiZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDEpIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIGxhcmdlc3QKKyAgICAgICAgICAgICAgICAgICBwaWNOdW0KKyAgICAgICAgICAgICAgICAyKSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIHN0YXJ0aW5nIHdpdGggdGhlIHNtYWxsZXN0CisgICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1QaWNOdW0KKyAgICAgICAgICAgICAgICAzKSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBidXQgbmVlZGVkIGZvciBkaXNwbGF5CisgICAgICAgICAgICAgICAgNCkgb3RoZXIgcGljdHVyZXMKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgLTEgICAgICBwaWMgMSBpcyBncmVhdGVyIHRoYW4gcGljIDIKKyAgICAgICAgICAgICAwICAgICAgZXF1YWwgZnJvbSBjb21wYXJpc29uIHBvaW50IG9mIHZpZXcKKyAgICAgICAgICAgICAxICAgICAgcGljIDIgaXMgZ3JlYXRlciB0aGVuIHBpYyAxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpMzIgQ29tcGFyZVBpY3R1cmVzKGNvbnN0IHZvaWQgKnB0cjEsIGNvbnN0IHZvaWQgKnB0cjIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgZHBiUGljdHVyZV90ICpwaWMxLCAqcGljMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHB0cjEpOworICAgIEFTU0VSVChwdHIyKTsKKworICAgIHBpYzEgPSAoZHBiUGljdHVyZV90KilwdHIxOworICAgIHBpYzIgPSAoZHBiUGljdHVyZV90KilwdHIyOworCisgICAgLyogYm90aCBhcmUgbm9uLXJlZmVyZW5jZSBwaWN0dXJlcywgY2hlY2sgaWYgbmVlZGVkIGZvciBkaXNwbGF5ICovCisgICAgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpICYmICFJU19SRUZFUkVOQ0UoKnBpYzIpKQorICAgIHsKKyAgICAgICAgaWYgKHBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgIXBpYzItPnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICByZXR1cm4oLTEpOworICAgICAgICBlbHNlIGlmICghcGljMS0+dG9CZURpc3BsYXllZCAmJiBwaWMyLT50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIC8qIG9ubHkgcGljIDEgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLworICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzIpKQorICAgICAgICByZXR1cm4oLTEpOworICAgIC8qIG9ubHkgcGljIDIgbmVlZGVkIGZvciByZWZlcmVuY2UgLT4gZ3JlYXRlciAqLworICAgIGVsc2UgaWYgKCFJU19SRUZFUkVOQ0UoKnBpYzEpKQorICAgICAgICByZXR1cm4oMSk7CisgICAgLyogYm90aCBhcmUgc2hvcnQgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtICovCisgICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkgJiYgSVNfU0hPUlRfVEVSTSgqcGljMikpCisgICAgeworICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQorICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgZWxzZSBpZiAocGljMS0+cGljTnVtIDwgcGljMi0+cGljTnVtKQorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgfQorICAgIC8qIG9ubHkgcGljIDEgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCisgICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMSkpCisgICAgICAgIHJldHVybigtMSk7CisgICAgLyogb25seSBwaWMgMiBpcyBzaG9ydCB0ZXJtIC0+IGdyZWF0ZXIgKi8KKyAgICBlbHNlIGlmIChJU19TSE9SVF9URVJNKCpwaWMyKSkKKyAgICAgICAgcmV0dXJuKDEpOworICAgIC8qIGJvdGggYXJlIGxvbmcgdGVybSByZWZlcmVuY2UgcGljdHVyZXMgLT4gY2hlY2sgcGljTnVtIChjb250YWlucyB0aGUKKyAgICAgKiBsb25nVGVybVBpY051bSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwaWMxLT5waWNOdW0gPiBwaWMyLT5waWNOdW0pCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKKyAgICAgICAgICAgIHJldHVybigtMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIGJhc2VkIG9uCisgICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzIHJlY2VpdmVkIGluIHRoZSBzbGljZSBoZWFkZXIuIFNlZSBkZXRhaWxzCisgICAgICAgICAgICBvZiB0aGUgcHJvY2VzcyBpbiB0aGUgSC4yNjQgc3RhbmRhcmQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBvcmRlciAgICAgICAgICAgcG9pbnRlciB0byByZW9yZGVyaW5nIGNvbW1hbmRzCisgICAgICAgICAgICBjdXJyRnJhbWVOdW0gICAgY3VycmVudCBmcmFtZSBudW1iZXIKKyAgICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZSBpbmRpY2VzIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAgICAgJ2xpc3QnIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgcmVvcmRlcmVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGlmIG5vbi1leGlzdGluZyBwaWN0dXJlcyByZWZlcnJlZCB0byBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJpbmcgY29tbWFuZHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdCgKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKm9yZGVyLAorICB1MzIgY3VyckZyYW1lTnVtLAorICB1MzIgbnVtUmVmSWR4QWN0aXZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqLCBrLCBwaWNOdW1QcmVkLCByZWZJZHg7CisgICAgaTMyIHBpY051bSwgcGljTnVtTm9XcmFwLCBpbmRleDsKKyAgICB1MzIgaXNTaG9ydFRlcm07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChvcmRlcik7CisgICAgQVNTRVJUKGN1cnJGcmFtZU51bSA8PSBkcGItPm1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQobnVtUmVmSWR4QWN0aXZlIDw9IE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUpOworCisgICAgLyogc2V0IGRwYiBwaWN0dXJlIG51bWJlcnMgZm9yIHNvcnRpbmcgKi8KKyAgICBTZXRQaWNOdW1zKGRwYiwgY3VyckZyYW1lTnVtKTsKKworICAgIGlmICghb3JkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwKQorICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKworICAgIHJlZklkeCAgICAgPSAwOworICAgIHBpY051bVByZWQgPSBjdXJyRnJhbWVOdW07CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDMpCisgICAgeworICAgICAgICAvKiBzaG9ydCB0ZXJtICovCisgICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgPQorICAgICAgICAgICAgICAgICAgICAoaTMyKXBpY051bVByZWQgLSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW07CisgICAgICAgICAgICAgICAgaWYgKHBpY051bU5vV3JhcCA8IDApCisgICAgICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCArPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KKyAgICAgICAgICAgICAgICAgICAgKGkzMikocGljTnVtUHJlZCArIG9yZGVyLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW0pOworICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPj0gKGkzMilkcGItPm1heEZyYW1lTnVtKQorICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGljTnVtUHJlZCA9ICh1MzIpcGljTnVtTm9XcmFwOworICAgICAgICAgICAgcGljTnVtID0gcGljTnVtTm9XcmFwOworICAgICAgICAgICAgaWYgKCh1MzIpcGljTnVtTm9XcmFwID4gY3VyckZyYW1lTnVtKQorICAgICAgICAgICAgICAgIHBpY051bSAtPSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07CisgICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19UUlVFOworICAgICAgICB9CisgICAgICAgIC8qIGxvbmcgdGVybSAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBpY051bSA9IChpMzIpb3JkZXItPmNvbW1hbmRbaV0ubG9uZ1Rlcm1QaWNOdW07CisgICAgICAgICAgICBpc1Nob3J0VGVybSA9IEhBTlRST19GQUxTRTsKKworICAgICAgICB9CisgICAgICAgIC8qIGZpbmQgY29ycmVzcG9uZGluZyBwaWN0dXJlIGZyb20gZHBiICovCisgICAgICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIHBpY051bSwgaXNTaG9ydFRlcm0pOworICAgICAgICBpZiAoaW5kZXggPCAwIHx8ICFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIC8qIHNoaWZ0IHBpY3R1cmVzICovCisgICAgICAgIGZvciAoaiA9IG51bVJlZklkeEFjdGl2ZTsgaiA+IHJlZklkeDsgai0tKQorICAgICAgICAgICAgZHBiLT5saXN0W2pdID0gZHBiLT5saXN0W2otMV07CisgICAgICAgIC8qIHB1dCBwaWN0dXJlIGludG8gdGhlIGxpc3QgKi8KKyAgICAgICAgZHBiLT5saXN0W3JlZklkeCsrXSA9ICZkcGItPmJ1ZmZlcltpbmRleF07CisgICAgICAgIC8qIHJlbW92ZSBsYXRlciByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIHBpY3R1cmUgKi8KKyAgICAgICAgZm9yIChqID0gayA9IHJlZklkeDsgaiA8PSBudW1SZWZJZHhBY3RpdmU7IGorKykKKyAgICAgICAgICAgIGlmKGRwYi0+bGlzdFtqXSAhPSAmZHBiLT5idWZmZXJbaW5kZXhdKQorICAgICAgICAgICAgICAgIGRwYi0+bGlzdFtrKytdID0gZHBiLT5saXN0W2pdOworCisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wMQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgc2hvcnQtdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCisgICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTW1jb3AxKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyclBpY051bSwgdTMyIGRpZmZlcmVuY2VPZlBpY051bXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGluZGV4LCBwaWNOdW07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChjdXJyUGljTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7CisKKyAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7CisKKyAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2luZGV4XSk7CisgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQorICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wMgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBtYXJrIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlIHVudXNlZCBmb3IKKyAgICAgICAgICAgIHJlZmVyZW5jZSwgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDIoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBsb25nVGVybVBpY051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgaW5kZXg7CisKKy8qIENvZGUgKi8KKworICAgIGluZGV4ID0gRmluZERwYlBpYyhkcGIsIChpMzIpbG9uZ1Rlcm1QaWNOdW0sIEhBTlRST19GQUxTRSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOworICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07CisgICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKKyAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gYXNzaW5nIGEgbG9uZ1Rlcm1GcmFtZUlkeCB0byBhIHNob3J0LXRlcm0gcmVmZXJlbmNlCisgICAgICAgICAgICBmcmFtZSAoaS5lLiB0byBjaGFuZ2UgaXQgdG8gYSBsb25nLXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUpLAorICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gMworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBmYWlsdXJlLCBzaG9ydC10ZXJtIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgb3IgaXMgYSBub24tZXhpc3RpbmcgcGljdHVyZSwgb3IgaW52YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1Rlcm1GcmFtZUlkeCBnaXZlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAorICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIGkzMiBpbmRleCwgcGljTnVtOworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZHBiKTsKKyAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOworCisgICAgaWYgKCAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSB8fAorICAgICAgICAgKGxvbmdUZXJtRnJhbWVJZHggPiBkcGItPm1heExvbmdUZXJtRnJhbWVJZHgpICkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogY2hlY2sgaWYgYSBsb25nIHRlcm0gcGljdHVyZSB3aXRoIHRoZSBzYW1lIGxvbmdUZXJtRnJhbWVJZHggYWxyZWFkeQorICAgICAqIGV4aXN0IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5ICovCisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCisgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPT0gbG9uZ1Rlcm1GcmFtZUlkeCkKKyAgICAgICAgeworICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOworICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBwaWNOdW0gPSAoaTMyKWN1cnJQaWNOdW0gLSAoaTMyKWRpZmZlcmVuY2VPZlBpY051bXM7CisKKyAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIEhBTlRST19UUlVFKTsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKCFJU19FWElTVElORyhkcGItPmJ1ZmZlcltpbmRleF0pKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBkcGItPmJ1ZmZlcltpbmRleF0uc3RhdHVzID0gTE9OR19URVJNOworICAgIGRwYi0+YnVmZmVyW2luZGV4XS5waWNOdW0gPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE1tY29wNAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBzZXQgbWF4TG9uZ1Rlcm1GcmFtZUlkeCwKKyAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDQKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wNChkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1heExvbmdUZXJtRnJhbWVJZHgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IG1heExvbmdUZXJtRnJhbWVJZHg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKKyAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKKyAgICAgICAgICAoICgodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA+IG1heExvbmdUZXJtRnJhbWVJZHgpIHx8CisgICAgICAgICAgICAoZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID09IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcy0tOworICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQorICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNbWNvcDUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhbGwgcmVmZXJlbmNlIHBpY3R1cmVzIHVudXNlZCBmb3IgcmVmZXJlbmNlIGFuZAorICAgICAgICAgICAgc2V0IG1heExvbmdUZXJtRnJhbWVJZHggdG8gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMsCisgICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA1LiBGdW5jdGlvbiBmbHVzaGVzCisgICAgICAgICAgICB0aGUgYnVmZmVyIGFuZCBwbGFjZXMgYWxsIHBpY3R1cmVzIHRoYXQgYXJlIG5lZWRlZCBmb3IgZGlzcGxheSBpbnRvCisgICAgICAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlci4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIE1tY29wNShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBpZiAoSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2ldKSkKKyAgICAgICAgeworICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpXSk7CisgICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3V0cHV0IGFsbCBwaWN0dXJlcyAqLworICAgIHdoaWxlIChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKQorICAgICAgICA7CisgICAgZHBiLT5udW1SZWZGcmFtZXMgPSAwOworICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0gMDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTW1jb3A2CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2lnbiBsb25nVGVybUZyYW1lSWR4IHRvIHRoZSBjdXJyZW50IHBpY3R1cmUsCisgICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA2CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGludmFsaWQgbG9uZ1Rlcm1GcmFtZUlkeCBvciBubyByb29tIGZvciBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGluIHRoZSBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBNbWNvcDYoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgaTMyIHBpY09yZGVyQ250LAorICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKKyAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKKyAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQorICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgorICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgaWYgKGRwYi0+bnVtUmVmRnJhbWVzIDwgZHBiLT5tYXhSZWZGcmFtZXMpCisgICAgeworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgPSAoaTMyKWxvbmdUZXJtRnJhbWVJZHg7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IExPTkdfVEVSTTsKKyAgICAgICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX0ZBTFNFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKKyAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogaWYgdGhlcmUgaXMgbm8gcm9vbSwgcmV0dXJuIGFuIGVycm9yICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTWFya0RlY1JlZlBpYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4gVGhpcworICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBib3RoIGZvciByZWZlcmVuY2UgYW5kIG5vbi1yZWZlcmVuY2UKKyAgICAgICAgICAgIHBpY3R1cmVzLiAgTm9uLXJlZmVyZW5jZSBwaWN0dXJlcyBzaGFsbCBoYXZlIG1hcmsgcG9pbnRlciBzZXQgdG8KKyAgICAgICAgICAgIE5VTEwuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgcG9pbnRlciB0byB0aGUgRFBCIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBtYXJrICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgY29tbWFuZHMKKyAgICAgICAgICAgIGltYWdlICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBwaWN0dXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICBmcmFtZU51bSAgICBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGljdHVyZQorICAgICAgICAgICAgcGljT3JkZXJDbnQgcGljdHVyZSBvcmRlciBjb3VudCBmb3IgdGhlIGN1cnJlbnQgcGljdHVyZQorICAgICAgICAgICAgaXNJZHIgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBwaWN0dXJlIGlzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICBJRFIgcGljdHVyZQorICAgICAgICAgICAgY3VycmVudFBpY0lkICAgIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUsIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24sIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCisgICAgICAgICAgICBudW1FcnJNYnMgICAgICAgbnVtYmVyIG9mIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyBpbiB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUsIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBwaWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgICdidWZmZXInIG1vZGlmaWVkLCBwb3NzaWJsZSBvdXRwdXQgZnJhbWVzIHBsYWNlZCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAnb3V0QnVmJworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICBmYWlsdXJlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkTWFya0RlY1JlZlBpYygKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIGRlY1JlZlBpY01hcmtpbmdfdCAqbWFyaywKKyAgaW1hZ2VfdCAqaW1hZ2UsCisgIHUzMiBmcmFtZU51bSwKKyAgaTMyIHBpY09yZGVyQ250LAorICB1MzIgaXNJZHIsCisgIHUzMiBjdXJyZW50UGljSWQsCisgIHUzMiBudW1FcnJNYnMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHN0YXR1czsKKyAgICB1MzIgbWFya2VkQXNMb25nVGVybTsKKyAgICB1MzIgdG9CZURpc3BsYXllZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisgICAgQVNTRVJUKG1hcmsgfHwgIWlzSWRyKTsKKyAgICBBU1NFUlQoIWlzSWRyIHx8IChmcmFtZU51bSA9PSAwICYmIHBpY09yZGVyQ250ID09IDApKTsKKyAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGlmIChpbWFnZS0+ZGF0YSAhPSBkcGItPmN1cnJlbnRPdXQtPmRhdGEpCisgICAgeworICAgICAgICBFUFJJTlQoIlRSWUlORyBUTyBNQVJLIE5PTi1BTExPQ0FURUQgSU1BR0UiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIGRwYi0+bGFzdENvbnRhaW5zTW1jbzUgPSBIQU5UUk9fRkFMU0U7CisgICAgc3RhdHVzID0gSEFOVFJPX09LOworCisgICAgdG9CZURpc3BsYXllZCA9IGRwYi0+bm9SZW9yZGVyaW5nID8gSEFOVFJPX0ZBTFNFIDogSEFOVFJPX1RSVUU7CisKKyAgICAvKiBub24tcmVmZXJlbmNlIHBpY3R1cmUsIHN0b3JlZCBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzICovCisgICAgaWYgKG1hcmsgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gVU5VU0VEOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtID0gKGkzMilmcmFtZU51bTsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnRvQmVEaXNwbGF5ZWQgPSB0b0JlRGlzcGxheWVkOworICAgICAgICBpZiAoIWRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOworICAgIH0KKyAgICAvKiBJRFIgcGljdHVyZSAqLworICAgIGVsc2UgaWYgKGlzSWRyKQorICAgIHsKKworICAgICAgICAvKiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bSBub3QgY2FsbGVkIGZvciBJRFIgcGljdHVyZXMgLT4gaGF2ZSB0bworICAgICAgICAgKiByZXNldCBudW1PdXQgYW5kIG91dEluZGV4IGhlcmUgKi8KKyAgICAgICAgZHBiLT5udW1PdXQgPSBkcGItPm91dEluZGV4ID0gMDsKKworICAgICAgICAvKiBmbHVzaCB0aGUgYnVmZmVyICovCisgICAgICAgIE1tY29wNShkcGIpOworICAgICAgICAvKiBpZiBub091dHB1dE9mUHJpb3JQaWNzRmxhZyB3YXMgc2V0IC0+IHRoZSBwaWN0dXJlcyBwcmVjZWRpbmcgdGhlCisgICAgICAgICAqIElEUiBwaWN0dXJlIHNoYWxsIG5vdCBiZSBvdXRwdXQgLT4gc2V0IG91dHB1dCBidWZmZXIgZW1wdHkgKi8KKyAgICAgICAgaWYgKG1hcmstPm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHx8IGRwYi0+bm9SZW9yZGVyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBkcGItPm51bU91dCA9IDA7CisgICAgICAgICAgICBkcGItPm91dEluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXJrLT5sb25nVGVybVJlZmVyZW5jZUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gTE9OR19URVJNOworICAgICAgICAgICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzID0gU0hPUlRfVEVSTTsKKyAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTOworICAgICAgICB9CisgICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gID0gMDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICAgPSAwOworICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKKyAgICAgICAgZHBiLT5mdWxsbmVzcyA9IDE7CisgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMTsKKyAgICB9CisgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX0ZBTFNFOworICAgICAgICBpZiAobWFyay0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hcmstPm9wZXJhdGlvbltpXS5tZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmRpZmZlcmVuY2VPZlBpY051bXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3AyKGRwYiwgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtUGljTnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBNbWNvcDMoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLm1heExvbmdUZXJtRnJhbWVJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A1KGRwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDYoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZWRBc0xvbmdUZXJtID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBpbnZhbGlkIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYik7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgY3VycmVudCBwaWN0dXJlIHdhcyBub3QgbWFya2VkIGFzIGxvbmctdGVybSByZWZlcmVuY2UgYnkKKyAgICAgICAgICogbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gNiAtPiBtYXJrIGN1cnJlbnQgYXMgc2hvcnQKKyAgICAgICAgICogdGVybSBhbmQgaW5zZXJ0IGl0IGludG8gZHBiIChpZiB0aGVyZSBpcyByb29tKSAqLworICAgICAgICBpZiAoIW1hcmtlZEFzTG9uZ1Rlcm0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+ZnJhbWVOdW0gPSBmcmFtZU51bTsKKyAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilmcmFtZU51bTsKKyAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5zdGF0dXMgICA9IFNIT1JUX1RFUk07CisgICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKKyAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7CisgICAgICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIG5vIHJvb20gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQU5UUk9fTk9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZHBiLT5jdXJyZW50T3V0LT5pc0lkciA9IGlzSWRyOworICAgIGRwYi0+Y3VycmVudE91dC0+cGljSWQgPSBjdXJyZW50UGljSWQ7CisgICAgZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnMgPSBudW1FcnJNYnM7CisKKyAgICAvKiBkcGIgd2FzIGluaXRpYWxpemVkIHRvIG5vdCB0byByZW9yZGVyIHRoZSBwaWN0dXJlcyAtPiBvdXRwdXQgY3VycmVudAorICAgICAqIHBpY3R1cmUgaW1tZWRpYXRlbHkgKi8KKyAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCisgICAgeworICAgICAgICBBU1NFUlQoZHBiLT5udW1PdXQgPT0gMCk7CisgICAgICAgIEFTU0VSVChkcGItPm91dEluZGV4ID09IDApOworICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uZGF0YSAgPSBkcGItPmN1cnJlbnRPdXQtPmRhdGE7CisgICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5pc0lkciA9IGRwYi0+Y3VycmVudE91dC0+aXNJZHI7CisgICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5waWNJZCA9IGRwYi0+Y3VycmVudE91dC0+cGljSWQ7CisgICAgICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5udW1FcnJNYnMgPSBkcGItPmN1cnJlbnRPdXQtPm51bUVyck1iczsKKyAgICAgICAgZHBiLT5udW1PdXQrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogb3V0cHV0IHBpY3R1cmVzIGlmIGJ1ZmZlciBmdWxsICovCisgICAgICAgIHdoaWxlIChkcGItPmZ1bGxuZXNzID4gZHBiLT5kcGJTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gT3V0cHV0UGljdHVyZShkcGIpOworICAgICAgICAgICAgQVNTRVJUKGkgPT0gSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNvcnQgZHBiICovCisgICAgU2hlbGxTb3J0KGRwYi0+YnVmZmVyLCBkcGItPmRwYlNpemUrMSk7CisKKyAgICByZXR1cm4oc3RhdHVzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXRSZWZQaWNEYXRhCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGdldCByZWZlcmVuY2UgcGljdHVyZSBkYXRhIGZyb20gdGhlIHJlZmVyZW5jZSBwaWN0dXJlCisgICAgICAgICAgICBsaXN0CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gZGVzaXJlZCByZWZlcmVuY2UgcGljdHVyZSBkYXRhCisgICAgICAgICAgICBOVUxMIGlmIGludmFsaWQgaW5kZXggb3Igbm9uLWV4aXN0aW5nIHBpY3R1cmUgcmVmZXJyZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTgqIGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgaW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBpZihpbmRleCA+IDE2IHx8IGRwYi0+bGlzdFtpbmRleF0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIGVsc2UgaWYoIUlTX0VYSVNUSU5HKCpkcGItPmxpc3RbaW5kZXhdKSkKKyAgICAgICAgcmV0dXJuKE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKGRwYi0+bGlzdFtpbmRleF0tPmRhdGEpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIGltYWdlLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90CisgICAgICAgICAgICByZWFsbHkgYWxsb2NhdGUgYW55IG1lbW9yeSBidXQgcmVzZXJ2ZXMgb25lIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgIHBvc2l0aW9ucyBmb3IgZGVjb2Rpbmcgb2YgY3VycmVudCBwaWN0dXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGFyZWEgZm9yIHRoZSBpbWFnZQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3U4KiBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCggIWRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCAmJgorICAgICAgICAgICAgIUlTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdKSApOworICAgIEFTU0VSVChkcGItPmZ1bGxuZXNzIDw9ICBkcGItPmRwYlNpemUpOworCisgICAgZHBiLT5jdXJyZW50T3V0ID0gZHBiLT5idWZmZXIgKyBkcGItPmRwYlNpemU7CisKKyAgICByZXR1cm4oZHBiLT5jdXJyZW50T3V0LT5kYXRhKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gc2xpZGluZyB3aW5kb3cgcmVmZW5jZSBwaWN0dXJlIG1hcmtpbmcgcHJvY2Vzcy4KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgbm8gc2hvcnQtdGVybSByZWZlcmVuY2UgZnJhbWUgZm91bmQgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bGQgYmUgbWFya2VkIHVudXNlZAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIGluZGV4LCBwaWNOdW07CisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluZGV4ID0gLTE7CisgICAgICAgIHBpY051bSA9IDA7CisgICAgICAgIC8qIGZpbmQgdGhlIG9sZGVzdCBzaG9ydCB0ZXJtIHBpY3R1cmUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtUmVmRnJhbWVzOyBpKyspCisgICAgICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkpCisgICAgICAgICAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnBpY051bSA8IHBpY051bSB8fCBpbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gKGkzMilpOworICAgICAgICAgICAgICAgICAgICBwaWNOdW0gPSBkcGItPmJ1ZmZlcltpXS5waWNOdW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOworICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKKyAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOworCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbml0RHBiCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgRFBCLiBSZXNlcnZlcyBtZW1vcmllcyBmb3IgdGhlIGJ1ZmZlciwKKyAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgYW5kIG91dHB1dCBidWZmZXIuIGRwYlNpemUgaW5kaWNhdGVzCisgICAgICAgICAgICB0aGUgbWF4aW11bSBEUEIgc2l6ZSBpbmRpY2F0ZWQgYnkgdGhlIGxldmVsSWRjIGluIHRoZSBzdHJlYW0uCisgICAgICAgICAgICBJZiBub1Jlb3JkZXJpbmcgZmxhZyBpcyBGQUxTRSB0aGUgRFBCIHN0b3JlcyBkcGJTaXplIHBpY3R1cmVzCisgICAgICAgICAgICBmb3IgZGlzcGxheSByZW9yZGVyaW5nIHB1cnBvc2VzLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCisgICAgICAgICAgICBmbGFnIGlzIFRSVUUgdGhlIERQQiBvbmx5IHN0b3JlcyBtYXhSZWZGcmFtZXMgcmVmZXJlbmNlIHBpY3R1cmVzCisgICAgICAgICAgICBhbmQgb3V0cHV0cyBhbGwgdGhlIHBpY3R1cmVzIGltbWVkaWF0ZWx5LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIGRwYlNpemUgICAgICAgICBzaXplIG9mIHRoZSBEUEIgKG51bWJlciBvZiBwaWN0dXJlcykKKyAgICAgICAgICAgIG1heFJlZkZyYW1lcyAgICBtYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMKKyAgICAgICAgICAgIG1heEZyYW1lTnVtICAgICBtYXggZnJhbWUgbnVtYmVyCisgICAgICAgICAgICBub1Jlb3JkZXJpbmcgICAgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IERQQiBkb2VzIG5vdCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZSB0byByZW9yZGVyIGZyYW1lcyBmb3IgZGlzcGxheQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkcGIgICAgICAgICAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdG9yYWdlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbml0RHBiKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgdTMyIHBpY1NpemVJbk1icywKKyAgdTMyIGRwYlNpemUsCisgIHUzMiBtYXhSZWZGcmFtZXMsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyIG5vUmVvcmRlcmluZykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBNQVhfTlVNX1JFRl9QSUNTKTsKKyAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IGRwYlNpemUpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGRwYlNpemUpOworCisgICAgZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4ID0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7CisgICAgZHBiLT5tYXhSZWZGcmFtZXMgICAgICAgID0gTUFYKG1heFJlZkZyYW1lcywgMSk7CisgICAgaWYgKG5vUmVvcmRlcmluZykKKyAgICAgICAgZHBiLT5kcGJTaXplICAgICAgICAgPSBkcGItPm1heFJlZkZyYW1lczsKKyAgICBlbHNlCisgICAgICAgIGRwYi0+ZHBiU2l6ZSAgICAgICAgID0gZHBiU2l6ZTsKKyAgICBkcGItPm1heEZyYW1lTnVtICAgICAgICAgPSBtYXhGcmFtZU51bTsKKyAgICBkcGItPm5vUmVvcmRlcmluZyAgICAgICAgPSBub1Jlb3JkZXJpbmc7CisgICAgZHBiLT5mdWxsbmVzcyAgICAgICAgICAgID0gMDsKKyAgICBkcGItPm51bVJlZkZyYW1lcyAgICAgICAgPSAwOworICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtICAgICA9IDA7CisKKyAgICBBTExPQ0FURShkcGItPmJ1ZmZlciwgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSArIDEsIGRwYlBpY3R1cmVfdCk7CisgICAgaWYgKGRwYi0+YnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgSDI2NFN3RGVjTWVtc2V0KGRwYi0+YnVmZmVyLCAwLAorICAgICAgICAgICAgKE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxKSpzaXplb2YoZHBiUGljdHVyZV90KSk7CisgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZSArIDE7IGkrKykKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIG5lZWRlZCBhbW91bnQgb2YgbWVtb3J5LCB3aGljaCBpczoKKyAgICAgICAgICogaW1hZ2Ugc2l6ZSArIDMyICsgMTUsIHdoZXJlIDMyIGNhbWVzIGZyb20gdGhlIGZhY3QgdGhhdCBpbiBBUk0gT3Blbk1heAorICAgICAgICAgKiBETCBpbXBsZW1lbnRhdGlvbiBGdW5jdGlvbnMgbWF5IHJlYWQgYmV5b25kIHRoZSBlbmQgb2YgYW4gYXJyYXksCisgICAgICAgICAqIGJ5IGEgbWF4aW11bSBvZiAzMiBieXRlcy4gQW5kICsxNSBjYW1lcyBmb3IgdGhlIG5lZWQgdG8gYWxpZ24gbWVtb3J5CisgICAgICAgICAqIHRvIDE2LWJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgQUxMT0NBVEUoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEsIChwaWNTaXplSW5NYnMqMzg0ICsgMzIrMTUpLCB1OCk7CisgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5wQWxsb2NhdGVkRGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgICAgICBkcGItPmJ1ZmZlcltpXS5kYXRhID0gQUxJR04oZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEsIDE2KTsKKyAgICB9CisKKyAgICBBTExPQ0FURShkcGItPmxpc3QsIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxLCBkcGJQaWN0dXJlX3QqKTsKKyAgICBBTExPQ0FURShkcGItPm91dEJ1ZiwgZHBiLT5kcGJTaXplKzEsIGRwYk91dFBpY3R1cmVfdCk7CisKKyAgICBpZiAoZHBiLT5saXN0ID09IE5VTEwgfHwgZHBiLT5vdXRCdWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgIEgyNjRTd0RlY01lbXNldChkcGItPmxpc3QsIDAsCisgICAgICAgICAgICAoKE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgKyAxKSAqIHNpemVvZihkcGJQaWN0dXJlX3QqKSkgKTsKKworICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RSZXNldERwYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byByZXNldCBEUEIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGFuIElEUgorICAgICAgICAgICAgc2xpY2UgKG90aGVyIHRoYW4gdGhlIGZpcnN0KSBhY3RpdmF0ZXMgbmV3IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQuCisgICAgICAgICAgICBGdW5jdGlvbiBjYWxscyBoMjY0YnNkRnJlZURwYiB0byBmcmVlIG9sZCBhbGxvY2F0ZWQgbWVtb3JpZXMgYW5kCisgICAgICAgICAgICBoMjY0YnNkSW5pdERwYiB0byByZS1pbml0aWFsaXplIHRoZSBEUEIuIFNhbWUgaW5wdXRzLCBvdXRwdXRzIGFuZAorICAgICAgICAgICAgcmV0dXJucyBhcyBmb3IgaDI2NGJzZEluaXREcGIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUmVzZXREcGIoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICB1MzIgcGljU2l6ZUluTWJzLAorICB1MzIgZHBiU2l6ZSwKKyAgdTMyIG1heFJlZkZyYW1lcywKKyAgdTMyIG1heEZyYW1lTnVtLAorICB1MzIgbm9SZW9yZGVyaW5nKQoreworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKKyAgICBBU1NFUlQobWF4UmVmRnJhbWVzIDw9IE1BWF9OVU1fUkVGX1BJQ1MpOworICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gZHBiU2l6ZSk7CisgICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQoZHBiU2l6ZSk7CisKKyAgICBoMjY0YnNkRnJlZURwYihkcGIpOworCisgICAgcmV0dXJuIGgyNjRic2RJbml0RHBiKGRwYiwgcGljU2l6ZUluTWJzLCBkcGJTaXplLCBtYXhSZWZGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYW1lTnVtLCBub1Jlb3JkZXJpbmcpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbml0UmVmUGljTGlzdAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuIEZ1bmN0aW9uIGp1c3QKKyAgICAgICAgICAgIHNldHMgcG9pbnRlcnMgaW4gdGhlIGxpc3QgYWNjb3JkaW5nIHRvIHBpY3R1cmVzIGluIHRoZSBidWZmZXIuCisgICAgICAgICAgICBUaGUgYnVmZmVyIGlzIGFzc3VtZWQgdG8gY29udGFpbiBwaWN0dXJlcyBzb3J0ZWQgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICB3aGF0IHRoZSBILjI2NCBzdGFuZGFyZCBzYXlzIGFib3V0IGluaXRpYWwgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkcGIgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgJ2xpc3QnIGZpZWxkIGluaXRpYWxpemVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdFJlZlBpY0xpc3QoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQorICAgICAgICBkcGItPmxpc3RbaV0gPSAmZHBiLT5idWZmZXJbaV07CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaW5kRHBiUGljCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbmQgYSByZWZlcmVuY2UgcGljdHVyZSBmcm9tIHRoZSBidWZmZXIuIFRoZSBwaWN0dXJlCisgICAgICAgICAgICB0byBiZSBmb3VuZCBpcyBpZGVudGlmaWVkIGJ5IHBpY051bSBhbmQgaXNTaG9ydFRlcm0gZmxhZy4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgaW5kZXggb2YgdGhlIHBpY3R1cmUgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgLTEgaWYgdGhlIHNwZWNpZmllZCBwaWN0dXJlIHdhcyBub3QgZm91bmQgaW4gdGhlIGJ1ZmZlcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaTMyIEZpbmREcGJQaWMoZHBiU3RvcmFnZV90ICpkcGIsIGkzMiBwaWNOdW0sIHUzMiBpc1Nob3J0VGVybSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSA9IDA7CisgICAgdTMyIGZvdW5kID0gSEFOVFJPX0ZBTFNFOworCisvKiBDb2RlICovCisKKyAgICBpZiAoaXNTaG9ydFRlcm0pCisgICAgeworICAgICAgICB3aGlsZSAoaSA8IGRwYi0+bWF4UmVmRnJhbWVzICYmICFmb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBwaWNOdW0pCisgICAgICAgICAgICAgICAgZm91bmQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQVNTRVJUKHBpY051bSA+PSAwKTsKKyAgICAgICAgd2hpbGUgKGkgPCBkcGItPm1heFJlZkZyYW1lcyAmJiAhZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCisgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBwaWNOdW0pCisgICAgICAgICAgICAgICAgZm91bmQgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpCisgICAgICAgIHJldHVybigoaTMyKWkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKC0xKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFNldFBpY051bXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IHBpY051bSB2YWx1ZXMgZm9yIHNob3J0LXRlcm0gcGljdHVyZXMgaW4gdGhlCisgICAgICAgICAgICBidWZmZXIuIE51bWJlcmluZyBvZiBwaWN0dXJlcyBpcyBiYXNlZCBvbiBmcmFtZSBudW1iZXJzIGFuZCBhcworICAgICAgICAgICAgZnJhbWUgbnVtYmVycyBhcmUgbW9kdWxvIG1heEZyYW1lTnVtIC0+IGZyYW1lIG51bWJlcnMgb2Ygb2xkZXIKKyAgICAgICAgICAgIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgbWF5IGJlIGJpZ2dlciB0aGFuIHRoZSBjdXJyRnJhbWVOdW0uCisgICAgICAgICAgICBwaWNOdW1zIHdpbGwgYmUgc2V0IHNvIHRoYXQgY3VycmVudCBmcmFtZSBoYXMgdGhlIGxhcmdlc3QgcGljTnVtCisgICAgICAgICAgICBhbmQgYWxsIHRoZSBzaG9ydC10ZXJtIGZyYW1lcyBpbiB0aGUgYnVmZmVyIHdpbGwgZ2V0IHNtYWxsZXIgcGljTnVtCisgICAgICAgICAgICByZXByZXNlbnRpbmcgdGhlaXIgImRpc3RhbmNlIiBmcm9tIHRoZSBjdXJyZW50IGZyYW1lLiBUaGlzCisgICAgICAgICAgICBmdW5jdGlvbiBraW5kIG9mIG1hcHMgdGhlIG1vZHVsbyBhcml0aG1ldGljIGJhY2sgdG8gbm9ybWFsLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIGkzMiBmcmFtZU51bVdyYXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQorICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5mcmFtZU51bSA+IGN1cnJGcmFtZU51bSkKKyAgICAgICAgICAgICAgICBmcmFtZU51bVdyYXAgPQorICAgICAgICAgICAgICAgICAgICAoaTMyKWRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtIC0gKGkzMilkcGItPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtV3JhcCA9IChpMzIpZHBiLT5idWZmZXJbaV0uZnJhbWVOdW07CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5waWNOdW0gPSBmcmFtZU51bVdyYXA7CisgICAgICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNoZWNrIGdhcHMgaW4gZnJhbWVfbnVtIGFuZCBnZW5lcmF0ZSBub24tZXhpc3RpbmcKKyAgICAgICAgICAgIChzaG9ydCB0ZXJtKSByZWZlcmVuY2UgcGljdHVyZXMgaWYgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICAgICAgICAgICAgYmUgY2FsbGVkIG9ubHkgZm9yIG5vbi1JRFIgcGljdHVyZXMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZHBiICAgICAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZyYW1lTnVtICAgIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCBwaWN0dXJlCisgICAgICAgICAgICBpc1JlZlBpYyAgICBmbGFnIHRvIGluZGljYXRlIGlmIGN1cnJlbnQgcGljdHVyZSBpcyBhIHJlZmVyZW5jZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXJlZmVyZW5jZSBwaWN0dXJlCisgICAgICAgICAgICBnYXBzQWxsb3dlZCBGbGFnIHdoaWNoIGluZGljYXRlcyBhY3RpdmUgU1BTIHN0YW5jZSBvbiB3aGV0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGxvdyBnYXBzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRwYiAgICAgICAgICdidWZmZXInIHBvc3NpYmx5IG1vZGlmaWVkIGJ5IGluc2VydGluZyBub24tZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVzIHdpdGggc2xpZGluZyB3aW5kb3cgbWFya2luZyBwcm9jZXNzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgIGVycm9yIGluIHNsaWRpbmcgd2luZG93IHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtIGVxdWFsIHRvIHByZXZpb3VzIHJlZmVyZW5jZSBmcmFtZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgYSByZWZlcmVuY2UgcGljdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0oZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgdTMyIGlzUmVmUGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBnYXBzQWxsb3dlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07CisgICAgdTggKnRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisgICAgQVNTRVJUKGRwYi0+ZnVsbG5lc3MgPD0gZHBiLT5kcGJTaXplKTsKKyAgICBBU1NFUlQoZnJhbWVOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKKworICAgIGRwYi0+bnVtT3V0ID0gMDsKKyAgICBkcGItPm91dEluZGV4ID0gMDsKKworICAgIGlmKCFnYXBzQWxsb3dlZCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisKKyAgICBpZiAoIChmcmFtZU51bSAhPSBkcGItPnByZXZSZWZGcmFtZU51bSkgJiYKKyAgICAgICAgIChmcmFtZU51bSAhPSAoKGRwYi0+cHJldlJlZkZyYW1lTnVtICsgMSkgJSBkcGItPm1heEZyYW1lTnVtKSkpCisgICAgeworCisgICAgICAgIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtID0gKGRwYi0+cHJldlJlZkZyYW1lTnVtICsgMSkgJSBkcGItPm1heEZyYW1lTnVtOworCisgICAgICAgIC8qIHN0b3JlIGRhdGEgcG9pbnRlciBvZiBsYXN0IGJ1ZmZlciBwb3NpdGlvbiB0byBiZSB1c2VkIGFzIG5leHQKKyAgICAgICAgICogImFsbG9jYXRlZCIgZGF0YSBwb2ludGVyIGlmIGxhc3QgYnVmZmVyIHBvc2l0aW9uIGFmdGVyIHRoaXMgcHJvY2VzcworICAgICAgICAgKiBjb250YWlucyBkYXRhIHBvaW50ZXIgbG9jYXRlZCBpbiBvdXRCdWYgKGJ1ZmZlciBwbGFjZWQgaW4gdGhlIG91dHB1dAorICAgICAgICAgKiBzaGFsbCBub3QgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGN1cnJlbnQgcGljdHVyZSkgKi8KKyAgICAgICAgdG1wID0gZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBTZXRQaWNOdW1zKGRwYiwgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0pOworCisgICAgICAgICAgICBpZiAoU2xpZGluZ1dpbmRvd1JlZlBpY01hcmtpbmcoZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvdXRwdXQgcGljdHVyZXMgaWYgYnVmZmVyIGZ1bGwgKi8KKyAgICAgICAgICAgIHdoaWxlIChkcGItPmZ1bGxuZXNzID49IGRwYi0+ZHBiU2l6ZSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBfQVNTRVJUX1VTRUQKKyAgICAgICAgICAgICAgICBBU1NFUlQoIWRwYi0+bm9SZW9yZGVyaW5nKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSyk7CisjZWxzZQorICAgICAgICAgICAgICAgIE91dHB1dFBpY3R1cmUoZHBiKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBhZGQgdG8gZW5kIG9mIGxpc3QgKi8KKyAgICAgICAgICAgIEFTU0VSVCggIWRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCAmJgorICAgICAgICAgICAgICAgICAgICAhSVNfUkVGRVJFTkNFKGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0pICk7CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnN0YXR1cyA9IE5PTl9FWElTVElORzsKKyAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZnJhbWVOdW0gPSB1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKKyAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0ucGljTnVtICAgPSAoaTMyKXVuVXNlZFNob3J0VGVybUZyYW1lTnVtOworICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5waWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgICAgICBkcGItPmZ1bGxuZXNzKys7CisgICAgICAgICAgICBkcGItPm51bVJlZkZyYW1lcysrOworCisgICAgICAgICAgICAvKiBzb3J0IHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOworCisgICAgICAgICAgICB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSA9ICh1blVzZWRTaG9ydFRlcm1GcmFtZU51bSArIDEpICUKKyAgICAgICAgICAgICAgICBkcGItPm1heEZyYW1lTnVtOworCisgICAgICAgIH0gd2hpbGUgKHVuVXNlZFNob3J0VGVybUZyYW1lTnVtICE9IGZyYW1lTnVtKTsKKworICAgICAgICAvKiBwaWN0dXJlcyBwbGFjZWQgaW4gb3V0cHV0IGJ1ZmZlciAtPiBjaGVjayB0aGF0ICdkYXRhJyBpbgorICAgICAgICAgKiBidWZmZXIgcG9zaXRpb24gZHBiU2l6ZSBpcyBub3QgaW4gdGhlIG91dHB1dCBidWZmZXIgKHRoaXMgd2lsbCBiZQorICAgICAgICAgKiAiYWxsb2NhdGVkIiBieSBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZSkuIElmIGl0IGlzIC0+IGV4Y2hhbmdlIGRhdGEKKyAgICAgICAgICogcG9pbnRlciB3aXRoIHRoZSBvbmUgc3RvcmVkIGluIHRoZSBiZWdpbm5pbmcgKi8KKyAgICAgICAgaWYgKGRwYi0+bnVtT3V0KQorICAgICAgICB7CisgICAgICAgICAgICB1MzIgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtT3V0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRwYi0+b3V0QnVmW2ldLmRhdGEgPT0gZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmluZCBidWZmZXIgcG9zaXRpb24gY29udGFpbmluZyBkYXRhIHBvaW50ZXIgc3RvcmVkIGluCisgICAgICAgICAgICAgICAgICAgICAqIHRtcCAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5kcGJTaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5kYXRhID09IHRtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltpXS5kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uZGF0YSA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBU1NFUlQoaSA8IGRwYi0+ZHBiU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBmcmFtZU51bSBmb3IgcmVmZXJlbmNlIHBpY3R1cmVzIHNoYWxsIG5vdCBiZSB0aGUgc2FtZSBhcyBmb3IgcHJldmlvdXMKKyAgICAgKiByZWZlcmVuY2UgcGljdHVyZSwgb3RoZXJ3aXNlIGFjY2Vzc2VzIHRvIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgY2Fubm90CisgICAgICogYmUgc29sdmVkIHVuYW1iaWd1b3VzbHkgKi8KKyAgICBlbHNlIGlmIChpc1JlZlBpYyAmJiBmcmFtZU51bSA9PSBkcGItPnByZXZSZWZGcmFtZU51bSkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBzYXZlIGN1cnJlbnQgZnJhbWVfbnVtIGluIHByZXZSZWZGcmFtZU51bS4gRm9yIG5vbi1yZWZlcmVuY2UgZnJhbWUKKyAgICAgKiBwcmV2RnJhbWVOdW0gaXMgc2V0IHRvIGZyYW1lIG51bWJlciBvZiBsYXN0IG5vbi1leGlzdGluZyBmcmFtZSBhYm92ZSAqLworICAgIGlmIChpc1JlZlBpYykKKyAgICAgICAgZHBiLT5wcmV2UmVmRnJhbWVOdW0gPSBmcmFtZU51bTsKKyAgICBlbHNlIGlmIChmcmFtZU51bSAhPSBkcGItPnByZXZSZWZGcmFtZU51bSkKKyAgICB7CisgICAgICAgIGRwYi0+cHJldlJlZkZyYW1lTnVtID0KKyAgICAgICAgICAgIChmcmFtZU51bSArIGRwYi0+bWF4RnJhbWVOdW0gLSAxKSAlIGRwYi0+bWF4RnJhbWVOdW07CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBGaW5kU21hbGxlc3RQaWNPcmRlckNudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBmaW5kIHBpY3R1cmUgd2l0aCBzbWFsbGVzdCBwaWN0dXJlIG9yZGVyIGNvdW50LiBUaGlzCisgICAgICAgICAgICB3aWxsIGJlIHRoZSBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlci4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgcGljdHVyZSwgTlVMTCBpZiBubyBwaWN0dXJlcyB0byBiZSBkaXNwbGF5ZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZHBiUGljdHVyZV90KiBGaW5kU21hbGxlc3RQaWNPcmRlckNudChkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgcGljT3JkZXJDbnQ7CisgICAgZHBiUGljdHVyZV90ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgcGljT3JkZXJDbnQgPSAweDdGRkZGRkZGOworICAgIHRtcCA9IE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGRwYi0+ZHBiU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQgJiYKKyAgICAgICAgICAgIChkcGItPmJ1ZmZlcltpXS5waWNPcmRlckNudCA8IHBpY09yZGVyQ250KSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gZHBiLT5idWZmZXIgKyBpOworICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBkcGItPmJ1ZmZlcltpXS5waWNPcmRlckNudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybih0bXApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogT3V0cHV0UGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBwdXQgbmV4dCBkaXNwbGF5IG9yZGVyIHBpY3R1cmUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgbm8gcGljdHVyZXMgdG8gZGlzcGxheQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgT3V0cHV0UGljdHVyZShkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBkcGJQaWN0dXJlX3QgKnRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisKKyAgICBpZiAoZHBiLT5ub1Jlb3JkZXJpbmcpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IEZpbmRTbWFsbGVzdFBpY09yZGVyQ250KGRwYik7CisKKyAgICAvKiBubyBwaWN0dXJlcyB0byBiZSBkaXNwbGF5ZWQgKi8KKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5kYXRhICA9IHRtcC0+ZGF0YTsKKyAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSB0bXAtPmlzSWRyOworICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5waWNJZCA9IHRtcC0+cGljSWQ7CisgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLm51bUVyck1icyA9IHRtcC0+bnVtRXJyTWJzOworICAgIGRwYi0+bnVtT3V0Kys7CisKKyAgICB0bXAtPnRvQmVEaXNwbGF5ZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgaWYgKCFJU19SRUZFUkVOQ0UoKnRtcCkpCisgICAgeworICAgICAgICBkcGItPmZ1bGxuZXNzLS07CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRHBiT3V0cHV0UGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgbmV4dCBkaXNwbGF5IG9yZGVyIHBpY3R1cmUgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlci4KKworICAgICAgICBSZXR1cm46CisgICAgICAgICAgICBwb2ludGVyIHRvIG91dHB1dCBwaWN0dXJlIHN0cnVjdHVyZSwgTlVMTCBpZiBubyBwaWN0dXJlcyB0bworICAgICAgICAgICAgZGlzcGxheQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitkcGJPdXRQaWN0dXJlX3QqIGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRwYik7CisKKyAgICBpZiAoZHBiLT5vdXRJbmRleCA8IGRwYi0+bnVtT3V0KQorICAgICAgICByZXR1cm4oZHBiLT5vdXRCdWYgKyBkcGItPm91dEluZGV4KyspOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKE5VTEwpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoRHBiCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZsdXNoIHRoZSBEUEIuIEZ1bmN0aW9uIHB1dHMgYWxsIHBpY3R1cmVzIG5lZWRlZCBmb3IKKyAgICAgICAgICAgIGRpc3BsYXkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhpcyBmdW5jdGlvbiBzaGFsbCBiZSBjYWxsZWQgaW4KKyAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBvYnRhaW4gcGljdHVyZXMgYnVmZmVyZWQgZm9yIGRpc3BsYXkKKyAgICAgICAgICAgIHJlLW9yZGVyaW5nIHB1cnBvc2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGbHVzaERwYihkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworICAgIC8qIGRvbid0IGRvIGFueXRoaW5nIGlmIGJ1ZmZlciBub3QgcmVzZXJ2ZWQgKi8KKyAgICBpZiAoZHBiLT5idWZmZXIpCisgICAgeworICAgICAgICBkcGItPmZsdXNoZWQgPSAxOworICAgICAgICAvKiBvdXRwdXQgYWxsIHBpY3R1cmVzICovCisgICAgICAgIHdoaWxlIChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKQorICAgICAgICAgICAgOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGcmVlRHBiCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3JpZXMgcmVzZXJ2ZWQgZm9yIHRoZSBEUEIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEZyZWVEcGIoZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkcGIpOworCisgICAgaWYgKGRwYi0+YnVmZmVyKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwYi0+ZHBiU2l6ZSsxOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSRUUoZHBiLT5idWZmZXJbaV0ucEFsbG9jYXRlZERhdGEpOworICAgICAgICB9CisgICAgfQorICAgIEZSRUUoZHBiLT5idWZmZXIpOworICAgIEZSRUUoZHBiLT5saXN0KTsKKyAgICBGUkVFKGRwYi0+b3V0QnVmKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFNoZWxsU29ydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTb3J0IHBpY3R1cmVzIGluIHRoZSBidWZmZXIuIEZ1bmN0aW9uIGltcGxlbWVudHMgU2hlbGwncyBtZXRob2QsCisgICAgICAgICAgICBpLmUuIGRpbWluaXNoaW5nIGluY3JlbWVudCBzb3J0LiBTZWUgZS5nLiAiTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyIKKyAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKQoreworCisgICAgdTMyIGksIGo7CisgICAgdTMyIHN0ZXA7CisgICAgZHBiUGljdHVyZV90IHRtcFBpYzsKKworICAgIHN0ZXAgPSA3OworCisgICAgd2hpbGUgKHN0ZXApCisgICAgeworICAgICAgICBmb3IgKGkgPSBzdGVwOyBpIDwgbnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcFBpYyA9IHBQaWNbaV07CisgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgIHdoaWxlIChqID49IHN0ZXAgJiYgQ29tcGFyZVBpY3R1cmVzKHBQaWMgKyBqIC0gc3RlcCwgJnRtcFBpYykgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQaWNbal0gPSBwUGljW2otc3RlcF07CisgICAgICAgICAgICAgICAgaiAtPSBzdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFBpY1tqXSA9IHRtcFBpYzsKKyAgICAgICAgfQorICAgICAgICBzdGVwID4+PSAxOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGUyNTA4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19EUEJfSAorI2RlZmluZSBIMjY0U1dERUNfRFBCX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCBzdGF0dXMgb2YgYnVmZmVyZWQgaW1hZ2UgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgVU5VU0VEID0gMCwKKyAgICBOT05fRVhJU1RJTkcsCisgICAgU0hPUlRfVEVSTSwKKyAgICBMT05HX1RFUk0KK30gZHBiUGljdHVyZVN0YXR1c19lOworCisvKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgYnVmZmVyZWQgcGljdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHU4ICpkYXRhOyAgICAgICAgICAgLyogMTYtYnl0ZSBhbGlnbmVkIHBvaW50ZXIgb2YgcEFsbG9jYXRlZERhdGEgKi8KKyAgICB1OCAqcEFsbG9jYXRlZERhdGE7IC8qIGFsbG9jYXRlZCBwaWN0dXJlIHBvaW50ZXI7IChzaXplICsgMTUpIGJ5dGVzICovCisgICAgaTMyIHBpY051bTsKKyAgICB1MzIgZnJhbWVOdW07CisgICAgaTMyIHBpY09yZGVyQ250OworICAgIGRwYlBpY3R1cmVTdGF0dXNfZSBzdGF0dXM7CisgICAgdTMyIHRvQmVEaXNwbGF5ZWQ7CisgICAgdTMyIHBpY0lkOworICAgIHUzMiBudW1FcnJNYnM7CisgICAgdTMyIGlzSWRyOworfSBkcGJQaWN0dXJlX3Q7CisKKy8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgZGlzcGxheSBpbWFnZSBvdXRwdXQgZnJvbSB0aGUgYnVmZmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdTggKmRhdGE7CisgICAgdTMyIHBpY0lkOworICAgIHUzMiBudW1FcnJNYnM7CisgICAgdTMyIGlzSWRyOworfSBkcGJPdXRQaWN0dXJlX3Q7CisKKy8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgRFBCICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZHBiUGljdHVyZV90ICpidWZmZXI7CisgICAgZHBiUGljdHVyZV90ICoqbGlzdDsKKyAgICBkcGJQaWN0dXJlX3QgKmN1cnJlbnRPdXQ7CisgICAgZHBiT3V0UGljdHVyZV90ICpvdXRCdWY7CisgICAgdTMyIG51bU91dDsKKyAgICB1MzIgb3V0SW5kZXg7CisgICAgdTMyIG1heFJlZkZyYW1lczsKKyAgICB1MzIgZHBiU2l6ZTsKKyAgICB1MzIgbWF4RnJhbWVOdW07CisgICAgdTMyIG1heExvbmdUZXJtRnJhbWVJZHg7CisgICAgdTMyIG51bVJlZkZyYW1lczsKKyAgICB1MzIgZnVsbG5lc3M7CisgICAgdTMyIHByZXZSZWZGcmFtZU51bTsKKyAgICB1MzIgbGFzdENvbnRhaW5zTW1jbzU7CisgICAgdTMyIG5vUmVvcmRlcmluZzsKKyAgICB1MzIgZmx1c2hlZDsKK30gZHBiU3RvcmFnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW5pdERwYigKKyAgZHBiU3RvcmFnZV90ICpkcGIsCisgIHUzMiBwaWNTaXplSW5NYnMsCisgIHUzMiBkcGJTaXplLAorICB1MzIgbnVtUmVmRnJhbWVzLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiBub1Jlb3JkZXJpbmcpOworCit1MzIgaDI2NGJzZFJlc2V0RHBiKAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgdTMyIHBpY1NpemVJbk1icywKKyAgdTMyIGRwYlNpemUsCisgIHUzMiBudW1SZWZGcmFtZXMsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyIG5vUmVvcmRlcmluZyk7CisKK3ZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKTsKKwordTgqIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKKwordTgqIGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgaW5kZXgpOworCit1MzIgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0KAorICBkcGJTdG9yYWdlX3QgKmRwYiwKKyAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqb3JkZXIsCisgIHUzMiBjdXJyRnJhbWVOdW0sCisgIHUzMiBudW1SZWZJZHhBY3RpdmUpOworCit1MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCisgIGRwYlN0b3JhZ2VfdCAqZHBiLAorICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCisgIGltYWdlX3QgKmltYWdlLAorICB1MzIgZnJhbWVOdW0sCisgIGkzMiBwaWNPcmRlckNudCwKKyAgdTMyIGlzSWRyLAorICB1MzIgcGljSWQsCisgIHUzMiBudW1FcnJNYnMpOworCit1MzIgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0oZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgdTMyIGlzUmVmUGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBnYXBzQWxsb3dlZCk7CisKK2RwYk91dFBpY3R1cmVfdCogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOworCit2b2lkIGgyNjRic2RGbHVzaERwYihkcGJTdG9yYWdlX3QgKmRwYik7CisKK3ZvaWQgaDI2NGJzZEZyZWVEcGIoZHBiU3RvcmFnZV90ICpkcGIpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19EUEJfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiOTI4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2sKKyAgICAgICAgICBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogeC0gYW5kIHktY29vcmRpbmF0ZXMgZm9yIGVhY2ggYmxvY2ssIGRlZmluZWQgaW4gaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgKi8KK2V4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWFtdOworZXh0ZXJuIGNvbnN0IHUzMiBoMjY0YnNkQmxvY2tZW107CisKKy8qIGNsaXBwaW5nIHRhYmxlLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCitleHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQorICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCisgICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit2b2lkIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB3aWR0aDsKKyAgICB1MzIgKmx1bSwgKmNiLCAqY3I7CisgICAgdTMyICpwdHI7CisgICAgdTMyIHRtcDEsIHRtcDI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKKworICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOworCisgICAgLypsaW50IC1zYXZlIC1lODI2IGx1bSwgY2IgYW5kIGNyIHVzZWQgdG8gY29weSA0IGJ5dGVzIGF0IHRoZSB0aW1lLCBkaXNhYmxlCisgICAgICogImFyZWEgdG9vIHNtYWxsIiBpbmZvIG1lc3NhZ2UgKi8KKyAgICBsdW0gPSAodTMyKilpbWFnZS0+bHVtYTsKKyAgICBjYiA9ICh1MzIqKWltYWdlLT5jYjsKKyAgICBjciA9ICh1MzIqKWltYWdlLT5jcjsKKyAgICBBU1NFUlQoISgodTMyKWx1bSYweDMpKTsKKyAgICBBU1NFUlQoISgodTMyKWNiJjB4MykpOworICAgIEFTU0VSVCghKCh1MzIpY3ImMHgzKSk7CisKKyAgICBwdHIgPSAodTMyKilkYXRhOworCisgICAgd2lkdGggKj0gNDsKKyAgICBmb3IgKGkgPSAxNjsgaSA7IGktLSkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHRyKys7CisgICAgICAgIHRtcDIgPSAqcHRyKys7CisgICAgICAgICpsdW0rKyA9IHRtcDE7CisgICAgICAgICpsdW0rKyA9IHRtcDI7CisgICAgICAgIHRtcDEgPSAqcHRyKys7CisgICAgICAgIHRtcDIgPSAqcHRyKys7CisgICAgICAgICpsdW0rKyA9IHRtcDE7CisgICAgICAgICpsdW0rKyA9IHRtcDI7CisgICAgICAgIGx1bSArPSB3aWR0aC00OworICAgIH0KKworICAgIHdpZHRoID4+PSAxOworICAgIGZvciAoaSA9IDg7IGkgOyBpLS0pCisgICAgeworICAgICAgICB0bXAxID0gKnB0cisrOworICAgICAgICB0bXAyID0gKnB0cisrOworICAgICAgICAqY2IrKyA9IHRtcDE7CisgICAgICAgICpjYisrID0gdG1wMjsKKyAgICAgICAgY2IgKz0gd2lkdGgtMjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQorICAgIHsKKyAgICAgICAgdG1wMSA9ICpwdHIrKzsKKyAgICAgICAgdG1wMiA9ICpwdHIrKzsKKyAgICAgICAgKmNyKysgPSB0bXAxOworICAgICAgICAqY3IrKyA9IHRtcDI7CisgICAgICAgIGNyICs9IHdpZHRoLTI7CisgICAgfQorCit9CisjZW5kaWYKKyNpZm5kZWYgSDI2NERFQ19PTVhETAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgV3JpdGUgb25lIG1hY3JvYmxvY2sgaW50byB0aGUgaW1hZ2UuIFByZWRpY3Rpb24gZm9yIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICBhbmQgdGhlIHJlc2lkdWFsIGFyZSBnaXZlbiBzZXBhcmF0ZWx5IGFuZCB3aWxsIGJlIGNvbWJpbmVkIHdoaWxlCisgICAgICAgICAgICB3cml0aW5nIHRoZSBkYXRhIHRvIHRoZSBpbWFnZQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBwcmVkaWN0aW9uIGRhdGEsIDI1NiB2YWx1ZXMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cworICAgICAgICAgICAgbWJOdW0gICAgICAgbnVtYmVyIG9mIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICByZXNpZHVhbCAgICBwb2ludGVyIHRvIHJlc2lkdWFsIGRhdGEsIDE2IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBsdW1hCisgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSA0IDE2LWVsZW1lbnQgYXJyYXlzIGZvciBib3RoIGNocm9tYQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RXcml0ZU91dHB1dEJsb2NrcyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtLCB1OCAqZGF0YSwKKyAgICAgICAgaTMyIHJlc2lkdWFsW11bMTZdKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiBwaWNXaWR0aCwgcGljU2l6ZTsKKyAgICB1OCAqbHVtLCAqY2IsICpjcjsKKyAgICB1OCAqaW1hZ2VCbG9jazsKKyAgICB1OCAqdG1wOworICAgIHUzMiByb3csIGNvbDsKKyAgICB1MzIgYmxvY2s7CisgICAgdTMyIHgsIHk7CisgICAgaTMyICpwUmVzOworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGltYWdlKTsKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7CisgICAgQVNTRVJUKCEoKHUzMilkYXRhJjB4MykpOworCisgICAgLyogSW1hZ2Ugc2l6ZSBpbiBtYWNyb2Jsb2NrcyAqLworICAgIHBpY1dpZHRoID0gaW1hZ2UtPndpZHRoOworICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIGltYWdlLT5oZWlnaHQ7CisgICAgcm93ID0gbWJOdW0gLyBwaWNXaWR0aDsKKyAgICBjb2wgPSBtYk51bSAlIHBpY1dpZHRoOworCisgICAgLyogT3V0cHV0IG1hY3JvYmxvY2sgcG9zaXRpb24gaW4gb3V0cHV0IHBpY3R1cmUgKi8KKyAgICBsdW0gPSAoaW1hZ2UtPmRhdGEgKyByb3cgKiBwaWNXaWR0aCAqIDI1NiArIGNvbCAqIDE2KTsKKyAgICBjYiA9IChpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyByb3cgKiBwaWNXaWR0aCAqIDY0ICsgY29sICogOCk7CisgICAgY3IgPSAoY2IgKyBwaWNTaXplICogNjQpOworCisgICAgcGljV2lkdGggKj0gMTY7CisKKyAgICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxNjsgYmxvY2srKykKKyAgICB7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tdOworCisgICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107CisKKyAgICAgICAgQVNTRVJUKHBSZXMpOworCisgICAgICAgIHRtcCA9IGRhdGEgKyB5KjE2ICsgeDsKKyAgICAgICAgaW1hZ2VCbG9jayA9IGx1bSArIHkqcGljV2lkdGggKyB4OworCisgICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOworICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7CisKKyAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KKyAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKKyAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOworCisgICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKKyAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSA0OworICAgICAgICAgICAgdG1wMiA9ICppbjMyOworICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOworCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgaW1hZ2UgPSBwcmVkaWN0aW9uICsgcmVzaWR1YWwKKyAgICAgICAgICAgICAqIFByb2Nlc3MgZm91ciBwaXhlbHMgaW4gYSBsb29wICovCisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOworICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOworICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKKyAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMTY7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1szXSA9ICh1OCl0bXAzOworICAgICAgICAgICAgICAgIGltYWdlQmxvY2sgKz0gcGljV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHBpY1dpZHRoIC89IDI7CisKKyAgICBmb3IgKGJsb2NrID0gMTY7IGJsb2NrIDw9IDIzOyBibG9jaysrKQorICAgIHsKKyAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2sgJiAweDNdOworICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9jayAmIDB4M107CisKKyAgICAgICAgcFJlcyA9IHJlc2lkdWFsW2Jsb2NrXTsKKworICAgICAgICBBU1NFUlQocFJlcyk7CisKKyAgICAgICAgdG1wID0gZGF0YSArIDI1NjsKKyAgICAgICAgaW1hZ2VCbG9jayA9IGNiOworCisgICAgICAgIGlmIChibG9jayA+PSAyMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW1hZ2VCbG9jayA9IGNyOworICAgICAgICAgICAgdG1wICs9IDY0OworICAgICAgICB9CisKKyAgICAgICAgdG1wICs9IHkqOCArIHg7CisgICAgICAgIGltYWdlQmxvY2sgKz0geSpwaWNXaWR0aCArIHg7CisKKyAgICAgICAgQVNTRVJUKCEoKHUzMil0bXAmMHgzKSk7CisgICAgICAgIEFTU0VSVCghKCh1MzIpaW1hZ2VCbG9jayYweDMpKTsKKworICAgICAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocFJlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qbGludCAtZTgyNiAqLworICAgICAgICAgICAgaTMyICppbjMyID0gKGkzMiopdG1wOworICAgICAgICAgICAgaTMyICpvdXQzMiA9IChpMzIqKWltYWdlQmxvY2s7CisKKyAgICAgICAgICAgIC8qIFJlc2lkdWFsIGlzIHplcm8gPT4gY29weSBwcmVkaWN0aW9uIGJsb2NrIHRvIG91dHB1dCAqLworICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOworICAgICAgICAgICAgdG1wMiA9ICppbjMyOyAgaW4zMiArPSAyOworICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKKyAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7IG91dDMyICs9IHBpY1dpZHRoLzQ7CisgICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDI7CisgICAgICAgICAgICB0bXAyID0gKmluMzI7CisgICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OworICAgICAgICAgICAgKm91dDMyID0gdG1wMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgUkFOR0VfQ0hFQ0tfQVJSQVkocFJlcywgLTUxMiwgNTExLCAxNik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzBdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOworICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbMV07CisgICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07CisgICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1swXSA9ICh1OCl0bXAxOworICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOworICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMl07CisgICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1sxXSA9ICh1OCl0bXAzOworICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOworICAgICAgICAgICAgICAgIHRtcDMgPSB0bXBbM107CisgICAgICAgICAgICAgICAgdG1wNCA9ICpwUmVzKys7CisgICAgICAgICAgICAgICAgaW1hZ2VCbG9ja1syXSA9ICh1OCl0bXAxOworICAgICAgICAgICAgICAgIHRtcDMgPSBjbHBbdG1wMyArIHRtcDRdOworICAgICAgICAgICAgICAgIHRtcCArPSA4OworICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKKyAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVkN2MxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0lNQUdFX0gKKyNkZWZpbmUgSDI2NFNXREVDX0lNQUdFX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTggKmRhdGE7CisgICAgdTMyIHdpZHRoOworICAgIHUzMiBoZWlnaHQ7CisgICAgLyogY3VycmVudCBNQidzIGNvbXBvbmVudHMgKi8KKyAgICB1OCAqbHVtYTsKKyAgICB1OCAqY2I7CisgICAgdTggKmNyOworfSBpbWFnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpOworCisjaWZuZGVmIEgyNjRERUNfT01YREwKK3ZvaWQgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHU4ICpkYXRhLAorICAgIGkzMiByZXNpZHVhbFtdWzE2XSk7CisjZW5kaWYKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU1BR0VfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTgxYzRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYwpAQCAtMCwwICsxLDEwMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCisgICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4MTYKKyAgICAgICAgICBNdlByZWRpY3Rpb24xNng4CisgICAgICAgICAgTXZQcmVkaWN0aW9uOHgxNgorICAgICAgICAgIE12UHJlZGljdGlvbjh4OAorICAgICAgICAgIE12UHJlZGljdGlvbgorICAgICAgICAgIE1lZGlhbkZpbHRlcgorICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyCisgICAgICAgICAgR2V0UHJlZGljdGlvbk12CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgYXZhaWxhYmxlOworICAgIHUzMiByZWZJbmRleDsKKyAgICBtdl90IG12OworfSBpbnRlck5laWdoYm91cl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgTXZQcmVkaWN0aW9uMTZ4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjh4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYik7CitzdGF0aWMgdTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAorICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKK3N0YXRpYyB1MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsCisgICAgdTMyIG1iUGFydElkeCwgdTMyIHN1Yk1iUGFydElkeCk7CitzdGF0aWMgaTMyIE1lZGlhbkZpbHRlcihpMzIgYSwgaTMyIGIsIGkzMiBjKTsKKworc3RhdGljIHZvaWQgR2V0SW50ZXJOZWlnaGJvdXIodTMyIHNsaWNlSWQsIG1iU3RvcmFnZV90ICpuTWIsCisgICAgaW50ZXJOZWlnaGJvdXJfdCAqbiwgdTMyIGluZGV4KTsKK3N0YXRpYyB2b2lkIEdldFByZWRpY3Rpb25Ndihtdl90ICptdiwgaW50ZXJOZWlnaGJvdXJfdCAqYSwgdTMyIHJlZkluZGV4KTsKKworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQV9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKKyAgICB7IHsge01CX0EsNX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsNX0sIHtNQl9BLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSwge01CX0EsN30sIHtNQl9DVVJSLDJ9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiwxfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0gfSB9LAorCisgICAgeyB7IHtNQl9BLDEzfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQSwxM30sIHtNQl9BLDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSwge01CX0EsMTV9LCB7TUJfQ1VSUiwxMH0gfSB9LAorCisgICAgeyB7IHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sIHtNQl9DVVJSLDExfSwge01CX0NVUlIsMTR9IH0gfSB9OworCitzdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9CX1NVQl9QQVJUWzRdWzRdWzRdID0geworICAgIHsgeyB7TUJfQiwxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTB9LCB7TUJfQ1VSUiwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTB9LCB7TUJfQiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfQ1VSUiwwfSwge01CX0NVUlIsMX0gfSB9LAorCisgICAgeyB7IHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNH0sIHtNQl9DVVJSLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNH0sIHtNQl9CLDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOH0sIHtNQl9DVVJSLDl9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxM30gfSB9IH07CisKK3N0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfU1VCX1BBUlRbNF1bNF1bNF0gPSB7CisgICAgeyB7IHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNH0sIHtNQl9OQSw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfQ1VSUiwxfSwge01CX05BLDR9IH0gfSwKKworICAgIHsgeyB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDE1fSwge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX0NVUlIsNX0sIHtNQl9OQSwwfSB9IH0sCisKKyAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9OQSwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX05BLDEyfSB9IH0sCisKKyAgICB7IHsge01CX05BLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9OQSwyfSwge01CX05BLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw3fSwge01CX05BLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiw3fSwge01CX05BLDJ9LCB7TUJfQ1VSUiwxM30sIHtNQl9OQSw4fSB9IH0gfTsKKworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fRF9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKKyAgICB7IHsge01CX0QsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9ELDE1fSwge01CX0EsNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9ELDE1fSwge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX0EsNX0sIHtNQl9DVVJSLDB9IH0gfSwKKworICAgIHsgeyB7TUJfQiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTF9LCB7TUJfQ1VSUiwxfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0gfSB9LAorCisgICAgeyB7IHtNQl9BLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDd9LCB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0EsN30sIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sIHtNQl9DVVJSLDh9IH0gfSwKKworICAgIHsgeyB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAorICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCisgICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKKyAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9IH0gfSB9OworCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVyUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRlciBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKyAgICAgICAgICBhbmQgcmVjb25zdHJ1Y3RzIHByZWRpY3Rpb24gbWFjcm9ibG9jay4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCisgICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChjdXJySW1hZ2UpCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgICAgcE1iTGF5ZXIgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCisgICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKKyAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKKyAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCisgICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBtYWNyb2Jsb2NrIHdpbGwgYmUgc3RvcmVkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgY3VyckltYWdlICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIGltYWdlCisgICAgICAgICAgZGF0YSAgICAgICAgICBwcmVkaWN0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RJbnRlclByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAorICAgIGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWJOdW0sIGltYWdlX3QgKmN1cnJJbWFnZSwgdTggKmRhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIHgsIHk7CisgICAgdTMyIGNvbEFuZFJvdzsKKyAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViUGFydE1vZGU7CisgICAgaW1hZ2VfdCByZWZJbWFnZTsKKyAgICB1OCBmaWxsQnVmZlszMioyMSArIDE1ICsgMzJdOworICAgIHU4ICpwRmlsbDsKKyAgICB1MzIgdG1wOworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisgICAgLyogMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKyAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7CisKKyAgICAvKiBzZXQgcm93IGJpdHMgMTU6MCAqLworICAgIGNvbEFuZFJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKKyAgICAvKnNldCBjb2wgdG8gYml0cyAzMToxNiAqLworICAgIGNvbEFuZFJvdyArPSAobWJOdW0gLSBjb2xBbmRSb3cgKiBjdXJySW1hZ2UtPndpZHRoKSA8PCAxNjsKKyAgICBjb2xBbmRSb3cgPDw9IDQ7CisKKyAgICByZWZJbWFnZS53aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7CisgICAgcmVmSW1hZ2UuaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7CisKKyAgICBzd2l0Y2ggKHBNYi0+bWJUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBQX1NraXA6CisgICAgICAgIGNhc2UgUF9MMF8xNngxNjoKKyAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24xNngxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgMTY7CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgorICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb24xNng4KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICgxNjw8OCkgKyA4OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07CisgICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDg8PDE2KSArICgxNjw8OCkgKyA4OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrOCwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgorICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07CisgICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICg4PDw4KSArIDE2OworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOworICAgICAgICAgICAgdG1wID0gKDg8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07CisgICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7CisgICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKKyAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg4PDw4KSArIDg7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg4PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDg8PDgpICsgNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfNHg4OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDg7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoKHkrNCk8PDE2KSArICg0PDw4KSArIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisgICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jaworICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQorICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCisgICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB4LCB5OworICAgIHUzMiByb3csIGNvbDsKKyAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViUGFydE1vZGU7CisgICAgaW1hZ2VfdCByZWZJbWFnZTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisgICAgcm93ID0gbWJOdW0gLyBjdXJySW1hZ2UtPndpZHRoOworICAgIGNvbCA9IG1iTnVtIC0gcm93ICogY3VyckltYWdlLT53aWR0aDsKKyAgICByb3cgKj0gMTY7CisgICAgY29sICo9IDE2OworCisgICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOworICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OworCisgICAgc3dpdGNoIChwTWItPm1iVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgUF9Ta2lwOgorICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6CisgICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAorICAgICAgICAgICAgICAgIDE2LCAxNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOworICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCisgICAgICAgICAgICAgICAgMTYsIDgpOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsyXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDgsCisgICAgICAgICAgICAgICAgMTYsIDgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6CisgICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKKyAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAorICAgICAgICAgICAgICAgIDgsIDE2KTsKKyAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMV07CisgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCA4LCAwLAorICAgICAgICAgICAgICAgIDgsIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IC8qIFBfOHg4IGFuZCBQXzh4OHJlZjAgKi8KKyAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHg4KHBNYiwgJnBNYkxheWVyLT5zdWJNYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkcltpXTsKKyAgICAgICAgICAgICAgICBzdWJQYXJ0TW9kZSA9CisgICAgICAgICAgICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlKHBNYkxheWVyLT5zdWJNYlByZWQuc3ViTWJUeXBlW2ldKTsKKyAgICAgICAgICAgICAgICB4ID0gaSAmIDB4MSA/IDggOiAwOworICAgICAgICAgICAgICAgIHkgPSBpIDwgMiA/IDAgOiA4OworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViUGFydE1vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDgsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSs0LCA4LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfNHg4OgorICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgNCwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHksIDQsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSs0LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSszLCAmcmVmSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSs0LCA0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKKyAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KKyAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKKyAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKKworICAgIGlmIChwTWItPm1iVHlwZSAhPSBQX1NraXApCisgICAgeworICAgICAgICBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoY3VyckltYWdlLCBtYk51bSwgZGF0YSwKKyAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciAxNngxNiBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uMTZ4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgbXZfdCBtdjsKKyAgICBtdl90IG12UHJlZDsKKyAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KKyAgICB1MzIgcmVmSW5kZXg7CisgICAgdTggKnRtcDsKKyAgICB1MzIgKnRtcE12MSwgKnRtcE12MjsKKworLyogQ29kZSAqLworCisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7CisgICAgLypsaW50IC0tZSg3NDApICBVbnVzdWFsIHBvaW50ZXIgY2FzdCAoaW5jb21wYXRpYmxlIGluZGlyZWN0IHR5cGVzKSAqLworICAgIHRtcE12MSA9ICh1MzIqKSgmYVswXS5tdik7IC8qIHdlIHRlc3QganVzdCB0aGF0IGJvdGggTVZzIGFyZSB6ZXJvICovCisgICAgLypsaW50IC0tZSg3NDApICovCisgICAgdG1wTXYyID0gKHUzMiopKCZhWzFdLm12KTsgLyogaS5lLiBhWzBdLm12LmhvciA9PSAwICYmIGFbMF0ubXYudmVyID09IDAgKi8KKyAgICBpZiAocE1iLT5tYlR5cGUgPT0gUF9Ta2lwICYmCisgICAgICAgICghYVswXS5hdmFpbGFibGUgfHwgIWFbMV0uYXZhaWxhYmxlIHx8CisgICAgICAgICAoIGFbMF0ucmVmSW5kZXggPT0gMCAmJiAoKHUzMikoKnRtcE12MSkgPT0gMCkgKSB8fAorICAgICAgICAgKCBhWzFdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjIpID09IDApICkpKQorICAgIHsKKyAgICAgICAgICAgIG12LmhvciA9IG12LnZlciA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7CisgICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgICAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICAgICAgbXYudmVyICs9IG12UHJlZC52ZXI7CisKKyAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KKyAgICAgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XQorICAgICAgICAgKiAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KKyAgICAgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQorICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPQorICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9CisgICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKKworICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOworICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24xNng4CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4OCBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uMTZ4OChtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBtdl90IG12OworICAgIG12X3QgbXZQcmVkOworICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLworICAgIHUzMiByZWZJbmRleDsKKyAgICB1OCAqdG1wOworCisvKiBDb2RlICovCisKKyAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07CisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7CisKKyAgICBpZiAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkKKyAgICAgICAgbXZQcmVkID0gYVsxXS5tdjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7CisgICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOworICAgICAgICB9CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KKyAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0gbXY7CisgICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7CisKKyAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMV07CisgICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzFdOworCisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgMTMpOworICAgIGlmIChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KQorICAgICAgICBtdlByZWQgPSBhWzBdLm12OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFbMV0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGFbMV0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKKyAgICAgICAgYVsxXS5tdiA9IHBNYi0+bXZbMF07CisKKyAgICAgICAgLyogYyBpcyBub3QgYXZhaWxhYmxlICovCisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGErMiwgNyk7CisKKyAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKKworICAgIH0KKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCisgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQorICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7CisgICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjh4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDE2IHBhcnRpdGlvbiBtb2RlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIG12X3QgbXY7CisgICAgbXZfdCBtdlByZWQ7CisgICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCisgICAgdTMyIHJlZkluZGV4OworICAgIHU4ICp0bXA7CisKKy8qIENvZGUgKi8KKworICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKKyAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07CisKKyAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKKworICAgIGlmIChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KQorICAgICAgICBtdlByZWQgPSBhWzBdLm12OworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzIsIDE0KTsKKyAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7CisgICAgICAgIH0KKworICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOworCisgICAgfQorICAgIG12LmhvciArPSBtdlByZWQuaG9yOworICAgIG12LnZlciArPSBtdlByZWQudmVyOworCisgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KKyAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KKyAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQorICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9IG12OworICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7CisgICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7CisgICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOworCisgICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOworICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKKworICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOworICAgIGlmICghYVsyXS5hdmFpbGFibGUpCisgICAgeworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzIsIDExKTsKKyAgICB9CisgICAgaWYgKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCisgICAgICAgIG12UHJlZCA9IGFbMl0ubXY7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYVswXS5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgYVswXS5yZWZJbmRleCA9IHBNYi0+cmVmUGljWzBdOworICAgICAgICBhWzBdLm12ID0gcE1iLT5tdlswXTsKKworICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDE0KTsKKworICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOworCisgICAgfQorICAgIG12LmhvciArPSBtdlByZWQuaG9yOworICAgIG12LnZlciArPSBtdlByZWQudmVyOworCisgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KKyAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KKyAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPQorICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7CisgICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKKyAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OworICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKKyAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjh4OAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDh4OCBwYXJ0aXRpb24gbW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgTXZQcmVkaWN0aW9uOHg4KG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworICAgIHUzMiBudW1TdWJNYlBhcnQ7CisKKy8qIENvZGUgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgICBudW1TdWJNYlBhcnQgPSBoMjY0YnNkTnVtU3ViTWJQYXJ0KHN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldKTsKKyAgICAgICAgcE1iLT5yZWZQaWNbaV0gPSBzdWJNYlByZWQtPnJlZklkeEwwW2ldOworICAgICAgICBwTWItPnJlZkFkZHJbaV0gPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHN1Yk1iUHJlZC0+cmVmSWR4TDBbaV0pOworICAgICAgICBpZiAocE1iLT5yZWZBZGRyW2ldID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1TdWJNYlBhcnQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbihwTWIsIHN1Yk1iUHJlZCwgaSwgaikgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlcmZvcm0gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciBzdWItcGFydGl0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBNdlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwgdTMyIG1iUGFydElkeCwKKyAgICB1MzIgc3ViTWJQYXJ0SWR4KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIG12X3QgbXYsIG12UHJlZDsKKyAgICB1MzIgcmVmSW5kZXg7CisgICAgc3ViTWJQYXJ0TW9kZV9lIHN1Yk1iUGFydE1vZGU7CisgICAgY29uc3QgbmVpZ2hib3VyX3QgKm47CisgICAgbWJTdG9yYWdlX3QgKm5NYjsKKyAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KKworLyogQ29kZSAqLworCisgICAgbXYgPSBzdWJNYlByZWQtPm12ZEwwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XTsKKyAgICBzdWJNYlBhcnRNb2RlID0gaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJQcmVkLT5zdWJNYlR5cGVbbWJQYXJ0SWR4XSk7CisgICAgcmVmSW5kZXggPSBzdWJNYlByZWQtPnJlZklkeEwwW21iUGFydElkeF07CisKKyAgICBuID0gTl9BX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OworICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKKyAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSwgbi0+aW5kZXgpOworCisgICAgbiA9IE5fQl9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMSwgbi0+aW5kZXgpOworCisgICAgbiA9IE5fQ19TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7CisgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMiwgbi0+aW5kZXgpOworCisgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKKyAgICB7CisgICAgICAgIG4gPSBOX0RfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKKyAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMiwgbi0+aW5kZXgpOworICAgIH0KKworICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7CisKKyAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKKyAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKKworICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCisgICAgaWYgKCgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KKyAgICBpZiAoKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHN3aXRjaCAoc3ViTWJQYXJ0TW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUJfU1BfOHg4OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAxXSA9IG12OworICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDJdID0gbXY7CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgM10gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUJfU1BfOHg0OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDIqc3ViTWJQYXJ0SWR4XSA9IG12OworICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDIqc3ViTWJQYXJ0SWR4ICsgMV0gPSBtdjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUJfU1BfNHg4OgorICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKKyAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHggKyAyXSA9IG12OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNQl9TUF80eDQ6CisgICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4XSA9IG12OworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBNZWRpYW5GaWx0ZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTWVkaWFuIGZpbHRlcmluZyBmb3IgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2kzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgbWF4LG1pbixtZWQ7CisKKy8qIENvZGUgKi8KKworICAgIG1heCA9IG1pbiA9IG1lZCA9IGE7CisgICAgaWYgKGIgPiBtYXgpCisgICAgeworICAgICAgICBtYXggPSBiOworICAgIH0KKyAgICBlbHNlIGlmIChiIDwgbWluKQorICAgIHsKKyAgICAgICAgbWluID0gYjsKKyAgICB9CisgICAgaWYgKGMgPiBtYXgpCisgICAgeworICAgICAgICBtZWQgPSBtYXg7CisgICAgfQorICAgIGVsc2UgaWYgKGMgPCBtaW4pCisgICAgeworICAgICAgICBtZWQgPSBtaW47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lZCA9IGM7CisgICAgfQorCisgICAgcmV0dXJuKG1lZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0SW50ZXJOZWlnaGJvdXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGF2YWlsYWJpbGl0eSwgcmVmZXJlbmNlIGluZGV4IGFuZCBtb3Rpb24gdmVjdG9yIG9mIGEgbmVpZ2hib3VyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgR2V0SW50ZXJOZWlnaGJvdXIodTMyIHNsaWNlSWQsIG1iU3RvcmFnZV90ICpuTWIsCisgICAgaW50ZXJOZWlnaGJvdXJfdCAqbiwgdTMyIGluZGV4KQoreworCisgICAgbi0+YXZhaWxhYmxlID0gSEFOVFJPX0ZBTFNFOworICAgIG4tPnJlZkluZGV4ID0gMHhGRkZGRkZGRjsKKyAgICBuLT5tdi5ob3IgPSBuLT5tdi52ZXIgPSAwOworCisgICAgaWYgKG5NYiAmJiAoc2xpY2VJZCA9PSBuTWItPnNsaWNlSWQpKQorICAgIHsKKyAgICAgICAgdTMyIHRtcDsKKyAgICAgICAgbXZfdCB0bXBNdjsKKworICAgICAgICB0bXAgPSBuTWItPm1iVHlwZTsKKyAgICAgICAgbi0+YXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7CisgICAgICAgIC8qIE1iUGFydFByZWRNb2RlICJpbmxpbmVkIiAqLworICAgICAgICBpZiAodG1wIDw9IFBfOHg4cmVmMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wTXYgPSBuTWItPm12W2luZGV4XTsKKyAgICAgICAgICAgIHRtcCA9IG5NYi0+cmVmUGljW2luZGV4Pj4yXTsKKyAgICAgICAgICAgIG4tPnJlZkluZGV4ID0gdG1wOworICAgICAgICAgICAgbi0+bXYgPSB0bXBNdjsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEdldFByZWRpY3Rpb25NdgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGJhc2VkIG9uIG5laWdoYm91cnMgQSwgQiBhbmQgQworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEdldFByZWRpY3Rpb25Ndihtdl90ICptdiwgaW50ZXJOZWlnaGJvdXJfdCAqYSwgdTMyIHJlZkluZGV4KQoreworCisgICAgaWYgKCBhWzFdLmF2YWlsYWJsZSB8fCBhWzJdLmF2YWlsYWJsZSB8fCAhYVswXS5hdmFpbGFibGUpCisgICAgeworICAgICAgICB1MzIgaXNBLCBpc0IsIGlzQzsKKyAgICAgICAgaXNBID0gKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgICAgIGlzQiA9IChhWzFdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICBpc0MgPSAoYVsyXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICBpZiAoKCh1MzIpaXNBKyh1MzIpaXNCKyh1MzIpaXNDKSAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBtdi0+aG9yID0gKGkxNilNZWRpYW5GaWx0ZXIoYVswXS5tdi5ob3IsIGFbMV0ubXYuaG9yLCBhWzJdLm12Lmhvcik7CisgICAgICAgICAgICBtdi0+dmVyID0gKGkxNilNZWRpYW5GaWx0ZXIoYVswXS5tdi52ZXIsIGFbMV0ubXYudmVyLCBhWzJdLm12LnZlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXNBKQorICAgICAgICAgICAgKm12ID0gYVswXS5tdjsKKyAgICAgICAgZWxzZSBpZiAoaXNCKQorICAgICAgICAgICAgKm12ID0gYVsxXS5tdjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKm12ID0gYVsyXS5tdjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm12ID0gYVswXS5tdjsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGRlZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAorI2RlZmluZSBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICppbWFnZSwgdTggKmRhdGEpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTVlYWJmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKQEAgLTAsMCArMSwxOTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEludHJhUHJlZGljdGlvbgorICAgICAgICAgIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzCisgICAgICAgICAgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uCisgICAgICAgICAgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbgorICAgICAgICAgIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24KKyAgICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwKKyAgICAgICAgICBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmExNngxNkRjUHJlZGljdGlvbgorICAgICAgICAgIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYURjUHJlZGljdGlvbgorICAgICAgICAgIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24KKyAgICAgICAgICBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCisgICAgICAgICAgR2V0NHg0TmVpZ2hib3VyUGVscworICAgICAgICAgIFdyaXRlNHg0VG8xNngxNgorICAgICAgICAgIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0RGNQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbgorICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uCisgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uCisgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCisgICAgICAgICAgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorCisjaWZkZWYgSDI2NERFQ19PTVhETAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAib214VkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6CisgKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCisgKi8KKy8qbGludCAtZTcwMiAqLworCisKKy8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrICovCitjb25zdCB1MzIgaDI2NGJzZEJsb2NrWFsxNl0gPQorICAgIHsgMCwgNCwgMCwgNCwgOCwgMTIsIDgsIDEyLCAwLCA0LCAwLCA0LCA4LCAxMiwgOCwgMTIgfTsKK2NvbnN0IHUzMiBoMjY0YnNkQmxvY2tZWzE2XSA9CisgICAgeyAwLCAwLCA0LCA0LCAwLCAwLCA0LCA0LCA4LCA4LCAxMiwgMTIsIDgsIDgsIDEyLCAxMiB9OworCitjb25zdCB1OCBoMjY0YnNkQ2xpcFsxMjgwXSA9Cit7CisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsCisgICAgMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsCisgICAgMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsCisgICAgNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsCisgICAgNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksCisgICAgODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsCisgICAgOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsCisgICAgMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LAorICAgIDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywKKyAgICAxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksCisgICAgMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LAorICAgIDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwKKyAgICAxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsCisgICAgMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLAorICAgIDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwKKyAgICAyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKKyAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCisgICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NQorfTsKKworI2lmbmRlZiBIMjY0REVDX09NWERMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBHZXQ0eDROZWlnaGJvdXJQZWxzKHU4ICphLCB1OCAqbCwgdTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCisgICAgdTMyIGJsb2NrTnVtKTsKK3N0YXRpYyB2b2lkIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7CitzdGF0aWMgdm9pZCBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCisgICAgdTMyIEEsIHUzMiBCKTsKK3N0YXRpYyB2b2lkIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCisgICAgdTMyIEEsIHUzMiBCKTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOworCitzdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgQSwgdTMyIEIpOworc3RhdGljIHZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKK3N0YXRpYyB2b2lkIEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KTsKK3N0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOworc3RhdGljIHZvaWQgSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOworc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOworc3RhdGljIHZvaWQgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCk7Cit2b2lkIGgyNjRic2RBZGRSZXNpZHVhbCh1OCAqZGF0YSwgaTMyICpyZXNpZHVhbCwgdTMyIGJsb2NrTnVtKTsKKworc3RhdGljIHZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKTsKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKK3N0YXRpYyB1MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCisgICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKKyAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpOworCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZAorICAgICAgICAgIHJlc2lkdWFsIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUKKyAgICAgICAgICBzdG9yZWQgaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1OCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgd2lkdGgsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKKyAgICBPTVhSZXN1bHQgb214UmVzOworCisvKiBDb2RlICovCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChwdHIpOworICAgIEFTU0VSVChoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiggKHB0ci0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKyAoYXZhaWxhYmxlQTw8MSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKKyAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgIHJldHVybiBIQU5UUk9fTk9LOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAorICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBsdW1hIHBpeGVscyBhcmUgc3RvcmVkIGluCisgICAgICAgICAgbWFjcm9ibG9jayBhcnJheSAnZGF0YScuIFRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoCisgICAgICAgICAgYmxvY2sgaXMgc3RvcmVkIGluICdwTWInIHN0cnVjdHVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcHRyLCB1MzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsIHUzMiBibG9jaykKK3sKKworLyogVmFyaWFibGVzICovCisgICAgdTMyIG1vZGU7CisgICAgbmVpZ2hib3VyX3QgbmVpZ2hib3VyLCBuZWlnaGJvdXJCOworICAgIG1iU3RvcmFnZV90ICpuTWIsICpuTWIyOworICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVDLCBhdmFpbGFibGVEOworCisgICAgT01YUmVzdWx0IG9teFJlczsKKyAgICB1MzIgeCwgeTsKKyAgICB1OCAqbCwgKmEsICphbDsKKy8qIENvZGUgKi8KKyAgICBBU1NFUlQocE1iKTsKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKG1iTGF5ZXIpOworICAgIEFTU0VSVChwdHIpOworICAgIEFTU0VSVChwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdIDwgOSk7CisKKyAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQShibG9jayk7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgbmVpZ2hib3VyQiA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKGJsb2NrKTsKKyAgICBuTWIyID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyQi5tYik7CisgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYjIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iMi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgbW9kZSA9IERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWJMYXllciwKKyAgICAgICAgKHUzMikoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKSwKKyAgICAgICAgJm5laWdoYm91ciwgJm5laWdoYm91ckIsIGJsb2NrLCBuTWIsIG5NYjIpOworICAgIHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPSAodTgpbW9kZTsKKworICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKGJsb2NrKTsKKyAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOworICAgIGF2YWlsYWJsZUMgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgIGlmIChhdmFpbGFibGVDICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmxlQyA9IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRChibG9jayk7CisgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKKyAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICB7CisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tdOworICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKKworICAgIGlmICh5ID09IDApCisgICAgICAgIGEgPSBwdHIgLSB3aWR0aCArIHg7CisgICAgZWxzZQorICAgICAgICBhID0gZGF0YS0xNjsKKworICAgIGlmICh4ID09IDApCisgICAgICAgIGwgPSBwdHIgKyB5ICogd2lkdGggLTE7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbCA9IGRhdGEtMTsKKyAgICAgICAgd2lkdGggPSAxNjsKKyAgICB9CisKKyAgICBpZiAoeCA9PSAwKQorICAgICAgICBhbCA9IGwtd2lkdGg7CisgICAgZWxzZQorICAgICAgICBhbCA9IGEtMTsKKworICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCggbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUE8PDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQzw8NikpICk7CisgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKKyAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgY2hyb21hIHBpeGVscyBhcmUgc3RvcmVkIGluICdkYXRhJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKKyAgICBPTVhSZXN1bHQgb214UmVzOworICAgIHU4ICpwdHI7CisgICAgdTMyIHdpZHRoOworCisvKiBDb2RlICovCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKHByZWRNb2RlIDwgNCk7CisKKyAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOworICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7CisgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKKyAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKKworICAgIHB0ciA9IGltYWdlLT5jYjsKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aCo4OworCisgICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4KCAocHRyLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpKGF2YWlsYWJsZUIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVBPDwxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOworICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7CisKKyAgICAvKiBhZHZhbmNlIHBvaW50ZXJzICovCisgICAgZGF0YSArPSA2NDsKKyAgICBwdHIgPSBpbWFnZS0+Y3I7CisKKyAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoIChwdHItMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMikoYXZhaWxhYmxlQiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUE8PDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7CisgICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKworI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludHJhUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRyYSBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIHVzaW5nCisgICAgICAgICAgc3BlY2lmaWVkIHByZWRpY3Rpb24gbW9kZS4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCisgICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChpbWFnZSkKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAgICAgICAgICBtYkxheWVyICAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRhdGEgZnJvbSBzdHJlYW0KKyAgICAgICAgICBpbWFnZSAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQgIGZsYWcgc3BlY2lmeWluZyBpZiBuZWlnaGJvdXJpbmcgaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3MgYXJlIHVzZWQgaW4gaW50cmEgcHJlZGljdGlvbgorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBvdXRwdXQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGltYWdlICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQorICAgICAgICAgIGRhdGEgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKKyAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIGludHJhIHByZWRpY3Rpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgIGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTggKmRhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgLyogcGVsQWJvdmUgYW5kIHBlbExlZnQgY29udGFpbiBzYW1wbGVzIGFib3ZlIGFuZCBsZWZ0IHRvIHRoZSBjdXJyZW50CisgICAgICogbWFjcm9ibG9jay4gQWJvdmUgYXJyYXkgY29udGFpbnMgYWxzbyBzYW1wbGUgYWJvdmUtbGVmdCB0byB0aGUgY3VycmVudAorICAgICAqIG1iIGFzIHdlbGwgYXMgNCBzYW1wbGVzIGFib3ZlLXJpZ2h0IHRvIHRoZSBjdXJyZW50IG1iIChsYXR0ZXIgb25seSBmb3IKKyAgICAgKiBsdW1hKSAqLworICAgIC8qIGx1bUQgKyBsdW1CICsgbHVtQyArIGNiRCArIGNiQiArIGNyRCArIGNyQiAqLworICAgIHU4IHBlbEFib3ZlWzEgKyAxNiArIDQgKyAxICsgOCArIDEgKyA4XTsKKyAgICAvKiBsdW1BICsgY2JBICsgY3JBICovCisgICAgdTggcGVsTGVmdFsxNiArIDggKyA4XTsKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocE1iKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpICE9IFBSRURfTU9ERV9JTlRFUik7CisKKyAgICBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscyhpbWFnZSwgcGVsQWJvdmUsIHBlbExlZnQsIG1iTnVtKTsKKworICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTE2eDE2KQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKHBNYiwgZGF0YSwgbWJMYXllci0+cmVzaWR1YWwubGV2ZWwsCisgICAgICAgICAgICBwZWxBYm92ZSwgcGVsTGVmdCwgY29uc3RyYWluZWRJbnRyYVByZWQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKHBNYiwgZGF0YSwgbWJMYXllciwKKyAgICAgICAgICAgIHBlbEFib3ZlLCBwZWxMZWZ0LCBjb25zdHJhaW5lZEludHJhUHJlZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihwTWIsIGRhdGEgKyAyNTYsCisgICAgICAgICAgICBtYkxheWVyLT5yZXNpZHVhbC5sZXZlbCsxNiwgcGVsQWJvdmUgKyAyMSwgcGVsTGVmdCArIDE2LAorICAgICAgICAgICAgbWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCisgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlLCBkYXRhKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEdldE5laWdoYm91clBlbHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEdldCBwaXhlbCB2YWx1ZXMgZnJvbSBuZWlnaGJvdXJpbmcgbWFjcm9ibG9ja3MgaW50byAnYWJvdmUnCisgICAgICAgICAgYW5kICdsZWZ0JyBhcnJheXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEdldE5laWdoYm91clBlbHMoaW1hZ2VfdCAqaW1hZ2UsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBtYk51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgd2lkdGgsIHBpY1NpemU7CisgICAgdTggKnB0ciwgKnRtcDsKKyAgICB1MzIgcm93LCBjb2w7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChpbWFnZSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisgICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7CisKKyAgICBpZiAoIW1iTnVtKQorICAgICAgICByZXR1cm47CisKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKKyAgICBwaWNTaXplID0gd2lkdGggKiBpbWFnZS0+aGVpZ2h0OworICAgIHJvdyA9IG1iTnVtIC8gd2lkdGg7CisgICAgY29sID0gbWJOdW0gLSByb3cgKiB3aWR0aDsKKworICAgIHdpZHRoICo9IDE2OworICAgIHB0ciA9IGltYWdlLT5kYXRhICsgcm93ICogMTYgKiB3aWR0aCAgKyBjb2wgKiAxNjsKKworICAgIC8qIG5vdGUgdGhhdCBsdW1hIHNhbXBsZXMgYWJvdmUtcmlnaHQgdG8gY3VycmVudCBtYWNyb2Jsb2NrIGRvIG5vdCBtYWtlCisgICAgICogc2Vuc2Ugd2hlbiBjdXJyZW50IG1iIGlzIHRoZSByaWdodC1tb3N0IG1iIGluIGEgcm93LiBTYW1lIGFwcGxpZXMgdG8KKyAgICAgKiBzYW1wbGUgYWJvdmUtbGVmdCBpZiBjb2wgaXMgemVyby4gSG93ZXZlciwgdXNhZ2Ugb2YgcGVscyBpbiBwcmVkaWN0aW9uCisgICAgICogaXMgY29udHJvbGxlZCBieSBuZWlnaGJvdXIgYXZhaWxhYmlsaXR5IGluZm9ybWF0aW9uIGluIGFjdHVhbCBwcmVkaWN0aW9uCisgICAgICogcHJvY2VzcyAqLworICAgIGlmIChyb3cpCisgICAgeworICAgICAgICB0bXAgPSBwdHIgLSAod2lkdGggKyAxKTsKKyAgICAgICAgZm9yIChpID0gMjE7IGktLTspCisgICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKKyAgICB9CisKKyAgICBpZiAoY29sKQorICAgIHsKKyAgICAgICAgcHRyLS07CisgICAgICAgIGZvciAoaSA9IDE2OyBpLS07IHB0cis9d2lkdGgpCisgICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKKyAgICB9CisKKyAgICB3aWR0aCA+Pj0gMTsKKyAgICBwdHIgPSBpbWFnZS0+ZGF0YSArIHBpY1NpemUgKiAyNTYgKyByb3cgKiA4ICogd2lkdGggICsgY29sICogODsKKworICAgIGlmIChyb3cpCisgICAgeworICAgICAgICB0bXAgPSBwdHIgLSAod2lkdGggKyAxKTsKKyAgICAgICAgZm9yIChpID0gOTsgaS0tOykKKyAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOworICAgICAgICB0bXAgKz0gKHBpY1NpemUgKiA2NCkgLSA5OworICAgICAgICBmb3IgKGkgPSA5OyBpLS07KQorICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7CisgICAgfQorCisgICAgaWYgKGNvbCkKKyAgICB7CisgICAgICAgIHB0ci0tOworICAgICAgICBmb3IgKGkgPSA4OyBpLS07IHB0cis9d2lkdGgpCisgICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKKyAgICAgICAgcHRyICs9IChwaWNTaXplICogNjQpIC0gOCAqIHdpZHRoOworICAgICAgICBmb3IgKGkgPSA4OyBpLS07IHB0cis9d2lkdGgpCisgICAgICAgICAgICAqbGVmdCsrID0gKnB0cjsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmExNngxNlByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkCisgICAgICAgICAgcmVzaWR1YWwgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZQorICAgICAgICAgIHN0b3JlZCBpbiBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisgICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQocmVzaWR1YWwpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworICAgIEFTU0VSVChoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSA8IDQpOworCisgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJBKTsKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkEtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpOworICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iRCk7CisgICAgaWYgKGF2YWlsYWJsZUQgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJELT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisKKyAgICBzd2l0Y2goaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihwTWItPm1iVHlwZSkpCisgICAgeworICAgICAgICBjYXNlIDA6IC8qIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTogLyogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbihkYXRhLCBsZWZ0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjogLyogSW50cmFfMTZ4MTZfREMgKi8KKyAgICAgICAgICAgIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCwgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDM6IEludHJhXzE2eDE2X1BsYW5lICovCisgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgSW50cmExNngxNlBsYW5lUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxLCBsZWZ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBhZGQgcmVzaWR1YWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIHJlc2lkdWFsW2ldLCBpKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCisgICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4KKyAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4gVGhlIGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2gKKyAgICAgICAgICBibG9jayBpcyBzdG9yZWQgaW4gJ3BNYicgc3RydWN0dXJlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLCB1OCAqYWJvdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBibG9jazsKKyAgICB1MzIgbW9kZTsKKyAgICBuZWlnaGJvdXJfdCBuZWlnaGJvdXIsIG5laWdoYm91ckI7CisgICAgbWJTdG9yYWdlX3QgKm5NYiwgKm5NYjI7CisgICAgdTggYVsxICsgNCArIDRdLCBsWzEgKyA0XTsKKyAgICB1MzIgZGF0YTR4NFs0XTsKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlQywgYXZhaWxhYmxlRDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtYkxheWVyKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDE2OyBibG9jaysrKQorICAgIHsKKworICAgICAgICBBU1NFUlQocE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA8IDkpOworCisgICAgICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKGJsb2NrKTsKKyAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKKyAgICAgICAgYXZhaWxhYmxlQSA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7CisgICAgICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG5laWdoYm91ckIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQihibG9jayk7CisgICAgICAgIG5NYjIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXJCLm1iKTsKKyAgICAgICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYjIpOworICAgICAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWIyLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQorICAgICAgICB7CisgICAgICAgICAgICBhdmFpbGFibGVCID0gSEFOVFJPX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbW9kZSA9IERldGVybWluZUludHJhNHg0UHJlZE1vZGUobWJMYXllciwKKyAgICAgICAgICAgICh1MzIpKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQiksCisgICAgICAgICAgICAmbmVpZ2hib3VyLCAmbmVpZ2hib3VyQiwgYmxvY2ssIG5NYiwgbk1iMik7CisgICAgICAgIHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPSAodTgpbW9kZTsKKworICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyhibG9jayk7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgICAgIGF2YWlsYWJsZUMgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgICAgICBpZiAoYXZhaWxhYmxlQyAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUMgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBuZWlnaGJvdXIgPSAqaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRChibG9jayk7CisgICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7CisgICAgICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOworICAgICAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZUQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBHZXQ0eDROZWlnaGJvdXJQZWxzKGEsIGwsIGRhdGEsIGFib3ZlLCBsZWZ0LCBibG9jayk7CisKKyAgICAgICAgc3dpdGNoKG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDogLyogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8qIEludHJhXzR4NF9Ib3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLyogSW50cmFfNHg0X0RDICovCisgICAgICAgICAgICAgICAgSW50cmE0eDREY1ByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiAvKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IGFbNF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IC8qIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiAvKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjogLyogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEsIGwgKyAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzogLyogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhWzVdID0gYVs2XSA9IGFbN10gPSBhWzhdID0gYVs0XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgYSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogLyogY2FzZSA4IEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgbCArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGU0eDRUbzE2eDE2KGRhdGEsICh1OCopZGF0YTR4NCwgYmxvY2spOworICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgbWJMYXllci0+cmVzaWR1YWwubGV2ZWxbYmxvY2tdLCBibG9jayk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCisgICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGNocm9tYSBwaXhlbHMgYXJlIHN0b3JlZCBpbiAnZGF0YScuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCisgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBjb21wLCBibG9jazsKKyAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChyZXNpZHVhbCk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisgICAgQVNTRVJUKHByZWRNb2RlIDwgNCk7CisKKyAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOworICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCisgICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQorICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOworICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7CisgICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKKyAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCisgICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7CisgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKKyAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgorICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKKyAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKKworICAgIGZvciAoY29tcCA9IDAsIGJsb2NrID0gMTY7IGNvbXAgPCAyOyBjb21wKyspCisgICAgeworICAgICAgICBzd2l0Y2gocHJlZE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDogLyogSW50cmFfQ2hyb21hX0RDICovCisgICAgICAgICAgICAgICAgSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCwgYXZhaWxhYmxlQSwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTogLyogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKGRhdGEsIGxlZnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8qIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLworICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMzogSW50cmFfQ2hyb21hX1BsYW5lICovCisgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSwgbGVmdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYmxvY2srKykKKyAgICAgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCByZXNpZHVhbFtpXSwgYmxvY2spOworCisgICAgICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgKi8KKyAgICAgICAgZGF0YSArPSA2NDsKKyAgICAgICAgYWJvdmUgKz0gOTsKKyAgICAgICAgbGVmdCArPSA4OworICAgICAgICByZXNpZHVhbCArPSA0OworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEFkZFJlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBBZGQgcmVzaWR1YWwgb2YgYSBibG9jayBpbnRvIHByZWRpY3Rpb24gaW4gbWFjcm9ibG9jayBhcnJheSAnZGF0YScuCisgICAgICAgICAgVGhlIHJlc3VsdCAocmVzaWR1YWwgKyBwcmVkaWN0aW9uKSBpcyBzdG9yZWQgaW4gJ2RhdGEnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RBZGRSZXNpZHVhbCh1OCAqZGF0YSwgaTMyICpyZXNpZHVhbCwgdTMyIGJsb2NrTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIHUzMiB4LCB5OworICAgIHUzMiB3aWR0aDsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICB1OCAqdG1wOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChyZXNpZHVhbCk7CisgICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYgKyA0ICsgNCk7CisKKyAgICBpZiAoSVNfUkVTSURVQUxfRU1QVFkocmVzaWR1YWwpKQorICAgICAgICByZXR1cm47CisKKyAgICBSQU5HRV9DSEVDS19BUlJBWShyZXNpZHVhbCwgLTUxMiwgNTExLCAxNik7CisKKyAgICBpZiAoYmxvY2tOdW0gPCAxNikKKyAgICB7CisgICAgICAgIHdpZHRoID0gMTY7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW1dOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3aWR0aCA9IDg7CisgICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtICYgMHgzXTsKKyAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tOdW0gJiAweDNdOworICAgIH0KKworICAgIHRtcCA9IGRhdGEgKyB5KndpZHRoICsgeDsKKyAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCisgICAgeworICAgICAgICB0bXAxID0gKnJlc2lkdWFsKys7CisgICAgICAgIHRtcDIgPSB0bXBbMF07CisgICAgICAgIHRtcDMgPSAqcmVzaWR1YWwrKzsKKyAgICAgICAgdG1wNCA9IHRtcFsxXTsKKworICAgICAgICB0bXBbMF0gPSBjbHBbdG1wMSArIHRtcDJdOworCisgICAgICAgIHRtcDEgPSAqcmVzaWR1YWwrKzsKKyAgICAgICAgdG1wMiA9IHRtcFsyXTsKKworICAgICAgICB0bXBbMV0gPSBjbHBbdG1wMyArIHRtcDRdOworCisgICAgICAgIHRtcDMgPSAqcmVzaWR1YWwrKzsKKyAgICAgICAgdG1wNCA9IHRtcFszXTsKKworICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKKyAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07CisgICAgICAgIHRtcFsyXSA9ICh1OCl0bXAxOworICAgICAgICB0bXBbM10gPSAodTgpdG1wMzsKKworICAgICAgICB0bXAgKz0gd2lkdGg7CisgICAgfQorCit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpkYXRhKysgPSBhYm92ZVtqXTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgKmRhdGErKyA9IGxlZnRbaV07CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IERDIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKKyAgICB1MzIgYXZhaWxhYmxlQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisKKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICB0bXAgKz0gYWJvdmVbaV0gKyBsZWZ0W2ldOworICAgICAgICB0bXAgPSAodG1wICsgMTYpID4+IDU7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHRtcCArPSBsZWZ0W2ldOworICAgICAgICB0bXAgPSAodG1wICsgOCkgPj4gNDsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgdG1wICs9IGFib3ZlW2ldOworICAgICAgICB0bXAgPSAodG1wICsgOCkgPj4gNDsKKyAgICB9CisgICAgLyogbmVpdGhlciBBIG5vciBCIGF2YWlsYWJsZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IDEyODsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBkYXRhW2ldID0gKHU4KXRtcDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgcGxhbmUgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhMTZ4MTZQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIGo7CisgICAgaTMyIGEsIGIsIGM7CisgICAgaTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgYSA9IDE2ICogKGFib3ZlWzE1XSArIGxlZnRbMTVdKTsKKworICAgIGZvciAoaSA9IDAsIGIgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBiICs9ICgoaTMyKWkgKyAxKSAqIChhYm92ZVs4K2ldIC0gYWJvdmVbNi1pXSk7CisgICAgYiA9ICg1ICogYiArIDMyKSA+PiA2OworCisgICAgZm9yIChpID0gMCwgYyA9IDA7IGkgPCA3OyBpKyspCisgICAgICAgIGMgKz0gKChpMzIpaSArIDEpICogKGxlZnRbOCtpXSAtIGxlZnRbNi1pXSk7CisgICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLworICAgIGMgKz0gKChpMzIpaSArIDEpICogKGxlZnRbOCtpXSAtIGFib3ZlWy0xXSk7CisgICAgYyA9ICg1ICogYyArIDMyKSA+PiA2OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKGEgKyBiICogKChpMzIpaiAtIDcpICsgYyAqICgoaTMyKWkgLSA3KSArIDE2KSA+PiA1OworICAgICAgICAgICAgZGF0YVtpKjE2K2pdID0gKHU4KUNMSVAxKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYURjUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSBjaHJvbWEgREMgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKKyAgICB1MzIgYXZhaWxhYmxlQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgdG1wMSwgdG1wMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgLyogeSA9IDAuLjMgKi8KKyAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdG1wMSA9IGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsKKyAgICAgICAgICAgICAgbGVmdFswXSArIGxlZnRbMV0gKyBsZWZ0WzJdICsgbGVmdFszXTsKKyAgICAgICAgdG1wMSA9ICh0bXAxICsgNCkgPj4gMzsKKyAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUIpCisgICAgeworICAgICAgICB0bXAxID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKKyAgICAgICAgdG1wMiA9IChhYm92ZVs0XSArIGFib3ZlWzVdICsgYWJvdmVbNl0gKyBhYm92ZVs3XSArIDIpID4+IDI7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJsZUEpCisgICAgeworICAgICAgICB0bXAxID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworICAgICAgICB0bXAyID0gdG1wMTsKKyAgICB9CisgICAgLyogbmVpdGhlciBBIG5vciBCIGF2YWlsYWJsZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcDEgPSB0bXAyID0gMTI4OworICAgIH0KKworICAgIEFTU0VSVCh0bXAxIDwgMjU2ICYmIHRtcDIgPCAyNTYpOworICAgIGZvciAoaSA9IDQ7IGktLTspCisgICAgeworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICB9CisKKyAgICAvKiB5ID0gNC4uLjcgKi8KKyAgICBpZiAoYXZhaWxhYmxlQSkKKyAgICB7CisgICAgICAgIHRtcDEgPSAobGVmdFs0XSArIGxlZnRbNV0gKyBsZWZ0WzZdICsgbGVmdFs3XSArIDIpID4+IDI7CisgICAgICAgIGlmIChhdmFpbGFibGVCKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAyID0gYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKworICAgICAgICAgICAgICAgICAgIGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN107CisgICAgICAgICAgICB0bXAyID0gKHRtcDIgKyA0KSA+PiAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRtcDIgPSB0bXAxOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKKyAgICB9CisKKyAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKKyAgICBmb3IgKGkgPSA0OyBpLS07KQorICAgIHsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKKyAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOworICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgZm9yIChpID0gODsgaS0tOykKKyAgICB7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0OworICAgICAgICAqZGF0YSsrID0gKmxlZnQ7CisgICAgICAgICpkYXRhKysgPSAqbGVmdDsKKyAgICAgICAgKmRhdGErKyA9ICpsZWZ0Kys7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYVZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGZvciAoaSA9IDg7IGktLTtkYXRhKysvKmFib3ZlLT04Ki8pCisgICAgeworICAgICAgICBkYXRhWzBdID0gKmFib3ZlOworICAgICAgICBkYXRhWzhdID0gKmFib3ZlOworICAgICAgICBkYXRhWzE2XSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVsyNF0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbMzJdID0gKmFib3ZlOworICAgICAgICBkYXRhWzQwXSA9ICphYm92ZTsKKyAgICAgICAgZGF0YVs0OF0gPSAqYWJvdmU7CisgICAgICAgIGRhdGFbNTZdID0gKmFib3ZlKys7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIHBsYW5lIHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICBpMzIgYSwgYiwgYzsKKyAgICBpMzIgdG1wOworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgYSA9IDE2ICogKGFib3ZlWzddICsgbGVmdFs3XSk7CisKKyAgICBiID0gKGFib3ZlWzRdIC0gYWJvdmVbMl0pICsgMiAqIChhYm92ZVs1XSAtIGFib3ZlWzFdKQorICAgICAgICArIDMgKiAoYWJvdmVbNl0gLSBhYm92ZVswXSkgKyA0ICogKGFib3ZlWzddIC0gYWJvdmVbLTFdKTsKKyAgICBiID0gKDE3ICogYiArIDE2KSA+PiA1OworCisgICAgLyogcFstMSwtMV0gaGFzIHRvIGJlIGFjY2Vzc2VkIHRocm91Z2ggYWJvdmUgcG9pbnRlciAqLworICAgIGMgPSAobGVmdFs0XSAtIGxlZnRbMl0pICsgMiAqIChsZWZ0WzVdIC0gbGVmdFsxXSkKKyAgICAgICAgKyAzICogKGxlZnRbNl0gLSBsZWZ0WzBdKSArIDQgKiAobGVmdFs3XSAtIGFib3ZlWy0xXSk7CisgICAgYyA9ICgxNyAqIGMgKyAxNikgPj4gNTsKKworICAgIC8qYSArPSAxNjsqLworICAgIGEgPSBhIC0gMyAqIGMgKyAxNjsKKyAgICBmb3IgKGkgPSA4OyBpLS07IGEgKz0gYykKKyAgICB7CisgICAgICAgIHRtcCA9IChhIC0gMyAqIGIpOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgICAgIHRtcCArPSBiOworICAgICAgICAqZGF0YSsrID0gY2xwW3RtcD4+NV07CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0NHg0TmVpZ2hib3VyUGVscworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgR2V0IG5laWdoYm91cmluZyBwaXhlbHMgb2YgYSA0eDQgYmxvY2sgaW50byAnYScgYW5kICdsJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBHZXQ0eDROZWlnaGJvdXJQZWxzKHU4ICphLCB1OCAqbCwgdTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsCisgICAgdTMyIGJsb2NrTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB4LCB5OworICAgIHU4IHQxLCB0MjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGEpOworICAgIEFTU0VSVChsKTsKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKyAgICBBU1NFUlQobGVmdCk7CisgICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOworCisgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOworICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKKworICAgIC8qIEEgYW5kIEQgKi8KKyAgICBpZiAoeCA9PSAwKQorICAgIHsKKyAgICAgICAgdDEgPSBsZWZ0W3kgICAgXTsKKyAgICAgICAgdDIgPSBsZWZ0W3kgKyAxXTsKKyAgICAgICAgbFsxXSA9IHQxOworICAgICAgICBsWzJdID0gdDI7CisgICAgICAgIHQxID0gbGVmdFt5ICsgMl07CisgICAgICAgIHQyID0gbGVmdFt5ICsgM107CisgICAgICAgIGxbM10gPSB0MTsKKyAgICAgICAgbFs0XSA9IHQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgICAgIF07CisgICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDE2XTsKKyAgICAgICAgbFsxXSA9IHQxOworICAgICAgICBsWzJdID0gdDI7CisgICAgICAgIHQxID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDMyXTsKKyAgICAgICAgdDIgPSBkYXRhW3kgKiAxNiArIHggLSAxICsgNDhdOworICAgICAgICBsWzNdID0gdDE7CisgICAgICAgIGxbNF0gPSB0MjsKKyAgICB9CisKKyAgICAvKiBCLCBDIGFuZCBEICovCisgICAgaWYgKHkgPT0gMCkKKyAgICB7CisgICAgICAgIHQxID0gYWJvdmVbeCAgICBdOworICAgICAgICB0MiA9IGFib3ZlW3ggICAgXTsKKyAgICAgICAgbFswXSA9IHQxOworICAgICAgICBhWzBdID0gdDI7CisgICAgICAgIHQxID0gYWJvdmVbeCArIDFdOworICAgICAgICB0MiA9IGFib3ZlW3ggKyAyXTsKKyAgICAgICAgYVsxXSA9IHQxOworICAgICAgICBhWzJdID0gdDI7CisgICAgICAgIHQxID0gYWJvdmVbeCArIDNdOworICAgICAgICB0MiA9IGFib3ZlW3ggKyA0XTsKKyAgICAgICAgYVszXSA9IHQxOworICAgICAgICBhWzRdID0gdDI7CisgICAgICAgIHQxID0gYWJvdmVbeCArIDVdOworICAgICAgICB0MiA9IGFib3ZlW3ggKyA2XTsKKyAgICAgICAgYVs1XSA9IHQxOworICAgICAgICBhWzZdID0gdDI7CisgICAgICAgIHQxID0gYWJvdmVbeCArIDddOworICAgICAgICB0MiA9IGFib3ZlW3ggKyA4XTsKKyAgICAgICAgYVs3XSA9IHQxOworICAgICAgICBhWzhdID0gdDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICAgIF07CisgICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgMV07CisgICAgICAgIGFbMV0gPSB0MTsKKyAgICAgICAgYVsyXSA9IHQyOworICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDJdOworICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDNdOworICAgICAgICBhWzNdID0gdDE7CisgICAgICAgIGFbNF0gPSB0MjsKKyAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA0XTsKKyAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyA1XTsKKyAgICAgICAgYVs1XSA9IHQxOworICAgICAgICBhWzZdID0gdDI7CisgICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNl07CisgICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgN107CisgICAgICAgIGFbN10gPSB0MTsKKyAgICAgICAgYVs4XSA9IHQyOworCisgICAgICAgIGlmICh4ID09IDApCisgICAgICAgICAgICBsWzBdID0gYVswXSA9IGxlZnRbeS0xXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggLSAxXTsKKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTggdDEsIHQyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIHQxID0gYWJvdmVbMF07CisgICAgdDIgPSBhYm92ZVsxXTsKKyAgICBkYXRhWzBdID0gZGF0YVs0XSA9IGRhdGFbOF0gPSBkYXRhWzEyXSA9IHQxOworICAgIGRhdGFbMV0gPSBkYXRhWzVdID0gZGF0YVs5XSA9IGRhdGFbMTNdID0gdDI7CisgICAgdDEgPSBhYm92ZVsyXTsKKyAgICB0MiA9IGFib3ZlWzNdOworICAgIGRhdGFbMl0gPSBkYXRhWzZdID0gZGF0YVsxMF0gPSBkYXRhWzE0XSA9IHQxOworICAgIGRhdGFbM10gPSBkYXRhWzddID0gZGF0YVsxMV0gPSBkYXRhWzE1XSA9IHQyOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTggdDEsIHQyOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgdDEgPSBsZWZ0WzBdOworICAgIHQyID0gbGVmdFsxXTsKKyAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gdDE7CisgICAgZGF0YVs0XSA9IGRhdGFbNV0gPSBkYXRhWzZdID0gZGF0YVs3XSA9IHQyOworICAgIHQxID0gbGVmdFsyXTsKKyAgICB0MiA9IGxlZnRbM107CisgICAgZGF0YVs4XSA9IGRhdGFbOV0gPSBkYXRhWzEwXSA9IGRhdGFbMTFdID0gdDE7CisgICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSB0MjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0RGNQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBEQyBwcmVkaWN0aW9uIG1vZGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgSW50cmE0eDREY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBhdmFpbGFibGVBLAorICAgIHUzMiBhdmFpbGFibGVCKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisgICAgdTggdDEsIHQyLCB0MywgdDQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGlmIChhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpCisgICAgeworICAgICAgICB0MSA9IGFib3ZlWzBdOyB0MiA9IGFib3ZlWzFdOyB0MyA9IGFib3ZlWzJdOyB0NCA9IGFib3ZlWzNdOworICAgICAgICB0bXAgPSB0MSArIHQyICsgdDMgKyB0NDsKKyAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOworICAgICAgICB0bXAgKz0gdDEgKyB0MiArIHQzICsgdDQ7CisgICAgICAgIHRtcCA9ICh0bXAgKyA0KSA+PiAzOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVBKQorICAgIHsKKyAgICAgICAgdDEgPSBsZWZ0WzBdOyB0MiA9IGxlZnRbMV07IHQzID0gbGVmdFsyXTsgdDQgPSBsZWZ0WzNdOworICAgICAgICB0bXAgPSAodDEgKyB0MiArIHQzICsgdDQgKyAyKSA+PiAyOworICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFibGVCKQorICAgIHsKKyAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKKyAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdG1wID0gMTI4OworICAgIH0KKworICAgIEFTU0VSVCh0bXAgPCAyNTYpOworICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPQorICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPQorICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9CisgICAgZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPSAodTgpdG1wOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1sZWZ0IHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGFib3ZlKTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDVdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDZdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDldID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbMTJdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDddID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTFdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIGRhdGFbMTRdID0gKGFib3ZlWzVdICsgMiAqIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzZdICsgMyAqIGFib3ZlWzddICsgMikgPj4gMjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duUmlnaHRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBkaWFnb25hbCBkb3duLXJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworICAgIEFTU0VSVChsZWZ0KTsKKworICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA2XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxMV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDddID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKKyAgICBkYXRhWyA5XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxNF0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDhdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTJdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHJpZ2h0IHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgZGF0YVsgMF0gPSAoYWJvdmVbLTFdICsgYWJvdmVbMF0gKyAxKSA+PiAxOworICAgIGRhdGFbIDldID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA1XSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7CisgICAgZGF0YVsxNF0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOworICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbMTNdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWy0xXSArIGxlZnRbMF0gKyAyKSA+PiAyOworICAgIGRhdGFbIDFdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbMTBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbIDZdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbMTVdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDJdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbMTFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbIDddID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOworICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDhdID0gKGxlZnRbMV0gKyAyICogbGVmdFswXSArIGxlZnRbLTFdICsgMikgPj4gMjsKKyAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIGRvd24gcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0SG9yaXpvbnRhbERvd25QcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChhYm92ZSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgZGF0YVsgMF0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA2XSA9IChsZWZ0Wy0xXSArIGxlZnRbMF0gKyAxKSA+PiAxOworICAgIGRhdGFbIDVdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKKyAgICBkYXRhWzExXSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7CisgICAgZGF0YVsgNF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbMTBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKKyAgICBkYXRhWyA5XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWzE1XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKKyAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7CisgICAgZGF0YVsxNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOworICAgIGRhdGFbMTNdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOworICAgIGRhdGFbMTJdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKKyAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKKyAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWy0xXSArIDIpID4+IDI7CisgICAgZGF0YVsgM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVswXSArIDIpID4+IDI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCBsZWZ0IHByZWRpY3Rpb24gbW9kZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoYWJvdmUpOworCisgICAgZGF0YVsgMF0gPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIDEpID4+IDE7CisgICAgZGF0YVsgMV0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgMl0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7CisgICAgZGF0YVsgM10gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7CisgICAgZGF0YVsgNF0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbMV0gKyBhYm92ZVsyXSArIDIpID4+IDI7CisgICAgZGF0YVsgNV0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgZGF0YVsgNl0gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7CisgICAgZGF0YVsgN10gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7CisgICAgZGF0YVsgOF0gPSAoYWJvdmVbMV0gKyBhYm92ZVsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgOV0gPSAoYWJvdmVbMl0gKyBhYm92ZVszXSArIDEpID4+IDE7CisgICAgZGF0YVsxMF0gPSAoYWJvdmVbM10gKyBhYm92ZVs0XSArIDEpID4+IDE7CisgICAgZGF0YVsxMV0gPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIDEpID4+IDE7CisgICAgZGF0YVsxMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7CisgICAgZGF0YVsxM10gPSAoYWJvdmVbMl0gKyAyICogYWJvdmVbM10gKyBhYm92ZVs0XSArIDIpID4+IDI7CisgICAgZGF0YVsxNF0gPSAoYWJvdmVbM10gKyAyICogYWJvdmVbNF0gKyBhYm92ZVs1XSArIDIpID4+IDI7CisgICAgZGF0YVsxNV0gPSAoYWJvdmVbNF0gKyAyICogYWJvdmVbNV0gKyBhYm92ZVs2XSArIDIpID4+IDI7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgdXAgcHJlZGljdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEludHJhNHg0SG9yaXpvbnRhbFVwUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoZGF0YSk7CisgICAgQVNTRVJUKGxlZnQpOworCisgICAgZGF0YVsgMF0gPSAobGVmdFswXSArIGxlZnRbMV0gKyAxKSA+PiAxOworICAgIGRhdGFbIDFdID0gKGxlZnRbMF0gKyAyICogbGVmdFsxXSArIGxlZnRbMl0gKyAyKSA+PiAyOworICAgIGRhdGFbIDJdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKKyAgICBkYXRhWyAzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKKyAgICBkYXRhWyA0XSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7CisgICAgZGF0YVsgNV0gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsgNl0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDddID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsgOF0gPSAobGVmdFsyXSArIGxlZnRbM10gKyAxKSA+PiAxOworICAgIGRhdGFbIDldID0gKGxlZnRbMl0gKyAzICogbGVmdFszXSArIDIpID4+IDI7CisgICAgZGF0YVsxMF0gPSBsZWZ0WzNdOworICAgIGRhdGFbMTFdID0gbGVmdFszXTsKKyAgICBkYXRhWzEyXSA9IGxlZnRbM107CisgICAgZGF0YVsxM10gPSBsZWZ0WzNdOworICAgIGRhdGFbMTRdID0gbGVmdFszXTsKKyAgICBkYXRhWzE1XSA9IGxlZnRbM107CisKK30KKworI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBXcml0ZTR4NFRvMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFdyaXRlIGEgNHg0IGJsb2NrIChkYXRhNHg0KSBpbnRvIGNvcnJlY3QgcG9zaXRpb24KKyAgICAgICAgICBpbiAxNngxNiBtYWNyb2Jsb2NrIChkYXRhKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBXcml0ZTR4NFRvMTZ4MTYodTggKmRhdGEsIHU4ICpkYXRhNHg0LCB1MzIgYmxvY2tOdW0pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHgsIHk7CisgICAgdTMyICppbjMyLCAqb3V0MzI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQoZGF0YTR4NCk7CisgICAgQVNTRVJUKGJsb2NrTnVtIDwgMTYpOworCisgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOworICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrTnVtXTsKKworICAgIGRhdGEgKz0geSoxNit4OworCisgICAgQVNTRVJUKCgodTMyKWRhdGEmMHgzKSA9PSAwKTsKKworICAgIC8qbGludCAtLWUoODI2KSAqLworICAgIG91dDMyID0gKHUzMiAqKWRhdGE7CisgICAgLypsaW50IC0tZSg4MjYpICovCisgICAgaW4zMiA9ICh1MzIgKilkYXRhNHg0OworCisgICAgb3V0MzJbMF0gPSAqaW4zMisrOworICAgIG91dDMyWzRdID0gKmluMzIrKzsKKyAgICBvdXQzMls4XSA9ICppbjMyKys7CisgICAgb3V0MzJbMTJdID0gKmluMzIrKzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIG9mIGEgYmxvY2sgYmFzZWQgb24gdGhlCisgICAgICAgICAgbmVpZ2hib3VyaW5nIG1hY3JvYmxvY2tzIGFuZCBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBzdHJlYW0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICB1MzIgYXZhaWxhYmxlLCBuZWlnaGJvdXJfdCAqbkEsIG5laWdoYm91cl90ICpuQiwgdTMyIGluZGV4LAorICAgIG1iU3RvcmFnZV90ICpuTWJBLCBtYlN0b3JhZ2VfdCAqbk1iQikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgbW9kZTEsIG1vZGUyOworICAgIG1iU3RvcmFnZV90ICpwTWI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwTWJMYXllcik7CisKKyAgICAvKiBkYyBvbmx5IHByZWRpY3Rpb24/ICovCisgICAgaWYgKCFhdmFpbGFibGUpCisgICAgICAgIG1vZGUxID0gMjsKKyAgICBlbHNlCisgICAgeworICAgICAgICBwTWIgPSBuTWJBOworICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUxID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25BLT5pbmRleF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9kZTEgPSAyOworCisgICAgICAgIHBNYiA9IG5NYkI7CisgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRSQTR4NCkKKyAgICAgICAgeworICAgICAgICAgICAgbW9kZTIgPSBwTWItPmludHJhNHg0UHJlZE1vZGVbbkItPmluZGV4XTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBtb2RlMiA9IDI7CisKKyAgICAgICAgbW9kZTEgPSBNSU4obW9kZTEsIG1vZGUyKTsKKyAgICB9CisKKyAgICBpZiAoIXBNYkxheWVyLT5tYlByZWQucHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2luZGV4XSkKKyAgICB7CisgICAgICAgIGlmIChwTWJMYXllci0+bWJQcmVkLnJlbUludHJhNHg0UHJlZE1vZGVbaW5kZXhdIDwgbW9kZTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGUxID0gcE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4obW9kZTEpOworfQorCisKKy8qbGludCArZTcwMiAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ2NTJiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfSU5UUkFfUFJFRElDVElPTl9ICisjZGVmaW5lIEgyNjRTV0RFQ19JTlRSQV9QUkVESUNUSU9OX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIEgyNjRERUNfT01YREwKK3UzMiBoMjY0YnNkSW50cmFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgIGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0sIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTggKmRhdGEpOworCit1MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKK3UzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKKyAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOworCit1MzIgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAorICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKKwordm9pZCBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscyhpbWFnZV90ICppbWFnZSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIG1iTnVtKTsKKworI2Vsc2UKKwordTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwSW1hZ2UsIHUzMiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTMyIGJsb2NrKTsKKwordTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTggKnBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgd2lkdGgsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7CisKK3UzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcHJlZE1vZGUsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7CisKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTlRSQV9QUkVESUNUSU9OX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIzZTdmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmMKQEAgLTAsMCArMSwxNDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgorICAgICAgICAgIGgyNjRic2RNYlBhcnRQcmVkTW9kZQorICAgICAgICAgIGgyNjRic2ROdW1NYlBhcnQKKyAgICAgICAgICBoMjY0YnNkTnVtU3ViTWJQYXJ0CisgICAgICAgICAgRGVjb2RlTWJQcmVkCisgICAgICAgICAgRGVjb2RlU3ViTWJQcmVkCisgICAgICAgICAgRGVjb2RlUmVzaWR1YWwKKyAgICAgICAgICBEZXRlcm1pbmVOYworICAgICAgICAgIENicEludHJhMTZ4MTYKKyAgICAgICAgICBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2CisgICAgICAgICAgaDI2NGJzZERlY29kZU1hY3JvYmxvY2sKKyAgICAgICAgICBQcm9jZXNzUmVzaWR1YWwKKyAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NhdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCIKKworI2lmZGVmIEgyNjRERUNfT01YREwKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgSDI2NERFQ19PTVhETAorc3RhdGljIGNvbnN0IHUzMiBjaHJvbWFJbmRleFs4XSA9IHsgMjU2LCAyNjAsIDI4OCwgMjkyLCAzMjAsIDMyNCwgMzUyLCAzNTYgfTsKK3N0YXRpYyBjb25zdCB1MzIgbHVtYUluZGV4WzE2XSA9IHsgICAwLCAgIDQsICA2NCwgIDY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICAxMiwgIDcyLCAgNzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwgMTMyLCAxOTIsIDE5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2LCAxNDAsIDIwMCwgMjA0IH07CisjZW5kaWYKKy8qIG1hcHBpbmcgb2YgZGMgY29lZmZpY2llbnRzIGFycmF5IHRvIGx1bWEgYmxvY2tzICovCitzdGF0aWMgY29uc3QgdTMyIGRjQ29lZmZJbmRleFsxNl0gPQorICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZU1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIG1iUHJlZF90ICpwTWJQcmVkLAorICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSk7CitzdGF0aWMgdTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAorICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSk7CitzdGF0aWMgdTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAorICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKTsKKworI2lmZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIHU4ICpwVG90YWxDb2VmZik7CisjZWxzZQorc3RhdGljIHUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgaTE2ICpwVG90YWxDb2VmZik7CisjZW5kaWYKKworc3RhdGljIHUzMiBDYnBJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7CisjaWZkZWYgSDI2NERFQ19PTVhETAorc3RhdGljIHUzMiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAorICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgY29uc3QgdTggKipwU3JjLCBpbWFnZV90ICppbWFnZSk7CitzdGF0aWMgdTMyIFByb2Nlc3NDaHJvbWFSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgY29uc3QgdTggKipwU3JjICk7CitzdGF0aWMgdTMyIFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGUsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOworCisKKyNlbHNlCitzdGF0aWMgdTMyIFByb2Nlc3NSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCBpMzIgcmVzaWR1YWxMZXZlbFtdWzE2XSwgdTMyICopOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQYXJzZSBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICBwTWIgICAgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICBzbGljZVR5cGUgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IHNsaWNlCisgICAgICAgICAgbnVtUmVmSWR4QWN0aXZlICAgbWF4aW11bSByZWZlcmVuY2UgaW5kZXgKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHBNYkxheWVyICAgICAgICAgIHN0b3JlcyB0aGUgbWFjcm9ibG9jayBkYXRhIHBhcnNlZCBmcm9tIHN0cmVhbQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgc3VjY2VzcworICAgICAgICAgIEhBTlRST19OT0sgICAgICAgIGVuZCBvZiBzdHJlYW0gb3IgZXJyb3IgaW4gc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIG1iU3RvcmFnZV90ICpwTWIsIHUzMiBzbGljZVR5cGUsCisgICAgdTMyIG51bVJlZklkeEFjdGl2ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKyAgICBtYlBhcnRQcmVkTW9kZV9lIHBhcnRNb2RlOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworCisjaWZkZWYgSDI2NERFQ19ORU9OCisgICAgaDI2NGJzZENsZWFyTWJMYXllcihwTWJMYXllciwgKChzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpICsgNjMpICYgfjB4M0YpKTsKKyNlbHNlCisgICAgSDI2NFN3RGVjTWVtc2V0KHBNYkxheWVyLCAwLCBzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpKTsKKyNlbmRpZgorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKworICAgIGlmIChJU19JX1NMSUNFKHNsaWNlVHlwZSkpCisgICAgeworICAgICAgICBpZiAoKHZhbHVlICsgNikgPiAzMSB8fCB0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwTWJMYXllci0+bWJUeXBlID0gKG1iVHlwZV9lKSh2YWx1ZSArIDYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHZhbHVlICsgMSkgPiAzMSB8fCB0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwTWJMYXllci0+bWJUeXBlID0gKG1iVHlwZV9lKSh2YWx1ZSArIDEpOworICAgIH0KKworICAgIGlmIChwTWJMYXllci0+bWJUeXBlID09IElfUENNKQorICAgIHsKKyAgICAgICAgaTMyICpsZXZlbDsKKyAgICAgICAgd2hpbGUoICFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogcGNtX2FsaWdubWVudF96ZXJvX2JpdCAqLworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgbGV2ZWwgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzODQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgKmxldmVsKysgPSAoaTMyKXZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBhcnRNb2RlID0gaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYkxheWVyLT5tYlR5cGUpOworICAgICAgICBpZiAoIChwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5URVIpICYmCisgICAgICAgICAgICAgKGgyNjRic2ROdW1NYlBhcnQocE1iTGF5ZXItPm1iVHlwZSkgPT0gNCkgKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBEZWNvZGVTdWJNYlByZWQocFN0cm1EYXRhLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwKKyAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBudW1SZWZJZHhBY3RpdmUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gRGVjb2RlTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5tYlByZWQsCisgICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIGlmIChwYXJ0TW9kZSAhPSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChwU3RybURhdGEsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAodTMyKShwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5UUkE0eDQpKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gPSBDYnBJbnRyYTE2eDE2KHBNYkxheWVyLT5tYlR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gfHwKKyAgICAgICAgICAgICAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSApCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcE1iTGF5ZXItPm1iUXBEZWx0YSA9IGl0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IERlY29kZVJlc2lkdWFsKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5yZXNpZHVhbCwgcE1iLAorICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybik7CisKKyAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA9CisgICAgICAgICAgICAgICAgKHUzMikocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgLSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0KSAqIDggKworICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOworCisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE1iUGFydFByZWRNb2RlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgb2YgYSBtYWNyb2Jsb2NrIHR5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworbWJQYXJ0UHJlZE1vZGVfZSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlX2UgbWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWJUeXBlIDw9IDMxKTsKKworICAgIGlmICgobWJUeXBlIDw9IFBfOHg4cmVmMCkpCisgICAgICAgIHJldHVybihQUkVEX01PREVfSU5URVIpOworICAgIGVsc2UgaWYgKG1iVHlwZSA9PSBJXzR4NCkKKyAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTR4NCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVFJBMTZ4MTYpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE51bU1iUGFydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIG1hY3JvYmxvY2sgcGFydGl0aW9ucyBpbiBhIG1hY3JvYmxvY2sgdHlwZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOworCisgICAgc3dpdGNoIChtYlR5cGUpCisgICAgeworICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6CisgICAgICAgIGNhc2UgUF9Ta2lwOgorICAgICAgICAgICAgcmV0dXJuKDEpOworCisgICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgorICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKKyAgICAgICAgICAgIHJldHVybigyKTsKKworICAgICAgICAvKiBQXzh4OCBvciBQXzh4OHJlZjAgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybig0KTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkTnVtU3ViTWJQYXJ0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3ViLXBhcnRpdGlvbnMgaW4gYSBzdWItbWFjcm9ibG9jayB0eXBlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkTnVtU3ViTWJQYXJ0KHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHN1Yk1iVHlwZSA8PSBQX0wwXzR4NCk7CisKKyAgICBzd2l0Y2ggKHN1Yk1iVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgUF9MMF84eDg6CisgICAgICAgICAgICByZXR1cm4oMSk7CisKKyAgICAgICAgY2FzZSBQX0wwXzh4NDoKKyAgICAgICAgY2FzZSBQX0wwXzR4ODoKKyAgICAgICAgICAgIHJldHVybigyKTsKKworICAgICAgICAvKiBQX0wwXzR4NCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuKDQpOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZU1iUHJlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBwcmVkaWN0aW9uIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUKKyAgICAgICAgICBpbiAncE1iUHJlZCcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwgbWJUeXBlX2UgbWJUeXBlLAorICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgaSwgaiwgdmFsdWU7CisgICAgaTMyIGl0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwTWJQcmVkKTsKKworICAgIHN3aXRjaCAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkpCisgICAgeworICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRFUjogLyogUFJFRF9NT0RFX0lOVEVSICovCisgICAgICAgICAgICBpZiAobnVtUmVmSWR4QWN0aXZlID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikobnVtUmVmSWR4QWN0aXZlID4gMikpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+PSBudW1SZWZJZHhBY3RpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cmVmSWR4TDBbal0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IGgyNjRic2ROdW1NYlBhcnQobWJUeXBlKSwgaiA9IDA7IGktLTsgIGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwTWJQcmVkLT5tdmRMMFtqXS5ob3IgPSAoaTE2KWl0bXA7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwTWJQcmVkLT5tdmRMMFtqXS52ZXIgPSAoaTE2KWl0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRSQTR4NDoKKyAgICAgICAgICAgIGZvciAoaXRtcCA9IDAsIGkgPSAwOyBpdG1wIDwgMjsgaXRtcCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgICAgICAgICB0bXAgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDg7IGotLTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYgMHg4MDAwMDAwMCA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwTWJQcmVkLT5wcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlbUludHJhNHg0UHJlZE1vZGVbaV0gPSB2YWx1ZT4+Mjk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgOCArIDMqdG1wKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKworICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRSQTE2eDE2OgorICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwTWJQcmVkLT5pbnRyYUNocm9tYVByZWRNb2RlID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVN1Yk1iUHJlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2Ugc3ViLW1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kCisgICAgICAgICAgc3RvcmUgaW4gJ3BNYlByZWQnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlU3ViTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3ViTWJQcmVkX3QgKnBTdWJNYlByZWQsCisgICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN1Yk1iUHJlZCk7CisgICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPiAzKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0gPSAoc3ViTWJUeXBlX2UpdmFsdWU7CisgICAgfQorCisgICAgaWYgKCAobnVtUmVmSWR4QWN0aXZlID4gMSkgJiYgKG1iVHlwZSAhPSBQXzh4OHJlZjApICkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQocFN0cm1EYXRhLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgKHUzMikobnVtUmVmSWR4QWN0aXZlID4gMikpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBTdWJNYlByZWQtPnJlZklkeEwwW2ldID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IDA7CisgICAgICAgIGZvciAodmFsdWUgPSBoMjY0YnNkTnVtU3ViTWJQYXJ0KHBTdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7CisgICAgICAgICAgICAgdmFsdWUtLTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS5ob3IgPSAoaTE2KWl0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIHBTdWJNYlByZWQtPm12ZEwwW2ldW2pdLnZlciA9IChpMTYpaXRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKyNpZmRlZiBIMjY0REVDX09NWERMCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQYXJzZSByZXNpZHVhbCBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlIGluICdwUmVzaWR1YWwnLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCisgICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIGo7CisgICAgdTMyIGJsb2NrQ29kZWQ7CisgICAgdTMyIGJsb2NrSW5kZXg7CisgICAgdTMyIGlzMTZ4MTY7CisgICAgT01YX0lOVCBuYzsKKyAgICBPTVhSZXN1bHQgb214UmVzOworICAgIE9NWF9VOCAqcFBvc0NvZWZCdWY7CisKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBSZXNpZHVhbCk7CisKKyAgICBwUG9zQ29lZkJ1ZiA9IHBSZXNpZHVhbC0+cG9zQ29lZkJ1ZjsKKworICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KKyAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgeworICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYiwgMCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0sCisgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgIDE2KTsKKyNlbHNlCisgICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0sCisgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgIDE2KTsKKyNlbmRpZgorICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpczE2eDE2ID0gSEFOVFJPX0ZBTFNFOworCisgICAgZm9yIChpID0gNCwgYmxvY2tJbmRleCA9IDA7IGktLTspCisgICAgeworICAgICAgICAvKiBsdW1hIGNicCBpbiBiaXRzIDAtMyAqLworICAgICAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDE7CisgICAgICAgIGNvZGVkQmxvY2tQYXR0ZXJuID4+PSAxOworICAgICAgICBpZiAoYmxvY2tDb2RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gNDsgai0tOyBibG9ja0luZGV4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsYmxvY2tJbmRleCxwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOworICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQorICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisjaWZuZGVmIEgyNjRERUNfTkVPTgorICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1Zik7CisjZWxzZQorICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0sCisgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgIDE3LAorICAgICAgICAgICAgICAgIDQpOworI2VuZGlmCisgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKKyAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAorICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1Zik7CisjZWxzZQorICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0sCisgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAorICAgICAgICAgICAgICAgIDE3LAorICAgICAgICAgICAgICAgIDQpOworI2VuZGlmCisgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgQUMgKi8KKyAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDI7CisgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgeworICAgICAgICBmb3IgKGkgPSA4OyBpLS07YmxvY2tJbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyNpZm5kZWYgSDI2NERFQ19ORU9OCisgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCisgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCisgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgbmMsCisgICAgICAgICAgICAgICAgICAgIDE1KTsKKyNlbHNlCisgICAgICAgICAgICBvbXhSZXMgPSAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAorICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAorICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCisgICAgICAgICAgICAgICAgICAgIG5jLAorICAgICAgICAgICAgICAgICAgICAxNSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAorICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBqLCB0bXA7CisgICAgaTMyIG5jOworICAgIHUzMiBibG9ja0NvZGVkOworICAgIHUzMiBibG9ja0luZGV4OworICAgIHUzMiBpczE2eDE2OworICAgIGkzMiAoKmxldmVsKVsxNl07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwUmVzaWR1YWwpOworCisgICAgbGV2ZWwgPSBwUmVzaWR1YWwtPmxldmVsOworCisgICAgLyogbHVtYSBEQyBpcyBhdCBpbmRleCAyNCAqLworICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICB7CisgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNF0sIG5jLCAxNik7CisgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKKworICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQorICAgIHsKKyAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KKyAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOworICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKKyAgICAgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7CisgICAgICAgICAgICAgICAgaWYgKGlzMTZ4MTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdICsgMSwgbmMsIDE1KTsKKyAgICAgICAgICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9IHRtcCA+PiAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSwgbmMsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9IHRtcCA+PiAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmxvY2tJbmRleCArPSA0OworICAgIH0KKworICAgIC8qIGNocm9tYSBEQyBibG9jayBhcmUgYXQgaW5kaWNlcyAyNSBhbmQgMjYgKi8KKyAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDM7CisgICAgaWYgKGJsb2NrQ29kZWQpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjVdLCAtMSwgNCk7CisgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSA9ICh0bXAgPj4gNCkgJiAweEZGOworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjVdKzQsIC0xLCA0KTsKKyAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdID0gKHRtcCA+PiA0KSAmIDB4RkY7CisgICAgfQorCisgICAgLyogY2hyb21hIEFDICovCisgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOworICAgIGlmIChibG9ja0NvZGVkKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdICsgMSwgbmMsIDE1KTsKKyAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0gPSAodG1wID4+IDQpICYgMHhGRjsKKyAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSAodG1wID4+IDE1KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZXRlcm1pbmVOYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgbkMgb2YgYSBibG9jay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBIMjY0REVDX09NWERMCit1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIHU4ICpwVG90YWxDb2VmZikKKyNlbHNlCit1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpCisjZW5kaWYKK3sKKy8qbGludCAtZTcwMiAqLworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIGkzMiBuOworICAgIGNvbnN0IG5laWdoYm91cl90ICpuZWlnaGJvdXJBLCAqbmVpZ2hib3VyQjsKKyAgICB1OCBuZWlnaGJvdXJBaW5kZXgsIG5laWdoYm91ckJpbmRleDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7CisKKyAgICAvKiBpZiBuZWlnaGJvdXIgYmxvY2sgYmVsb25ncyB0byBjdXJyZW50IG1hY3JvYmxvY2sgdG90YWxDb2VmZiBhcnJheQorICAgICAqIG1iU3RvcmFnZSBoYXMgbm90IGJlZW4gc2V0L3VwZGF0ZWQgeWV0IC0+IHVzZSBwVG90YWxDb2VmZiAqLworICAgIG5laWdoYm91ckEgPSBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKGJsb2NrSW5kZXgpOworICAgIG5laWdoYm91ckIgPSBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKGJsb2NrSW5kZXgpOworICAgIG5laWdoYm91ckFpbmRleCA9IG5laWdoYm91ckEtPmluZGV4OworICAgIG5laWdoYm91ckJpbmRleCA9IG5laWdoYm91ckItPmluZGV4OworICAgIGlmIChuZWlnaGJvdXJBLT5tYiA9PSBNQl9DVVJSICYmIG5laWdoYm91ckItPm1iID09IE1CX0NVUlIpCisgICAgeworICAgICAgICBuID0gKHBUb3RhbENvZWZmW25laWdoYm91ckFpbmRleF0gKworICAgICAgICAgICAgIHBUb3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKT4+MTsKKyAgICB9CisgICAgZWxzZSBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUikKKyAgICB7CisgICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdOworICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSkgPj4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQorICAgIHsKKyAgICAgICAgbiA9IHBUb3RhbENvZWZmW25laWdoYm91ckJpbmRleF07CisgICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF0gKyAxKSA+PiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG4gPSB0bXAgPSAwOworICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gcE1iLT5tYkEtPnRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKKyAgICAgICAgICAgIHRtcCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtcCkKKyAgICAgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSkgPj4gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oKHUzMiluKTsKKy8qbGludCArZTcwMiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IENicEludHJhMTZ4MTYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFJldHVybnMgdGhlIGNvZGVkIGJsb2NrIHBhdHRlcm4gZm9yIGludHJhIDE2eDE2IG1hY3JvYmxvY2suCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBDYnBJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgY2JwOworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7CisKKyAgICBpZiAobWJUeXBlID49IElfMTZ4MTZfMF8wXzEpCisgICAgICAgIGNicCA9IDE1OworICAgIGVsc2UKKyAgICAgICAgY2JwID0gMDsKKworICAgIC8qIHRtcCBpcyAwIGZvciBJXzE2eDE2XzBfMF8wIG1iIHR5cGUgKi8KKyAgICAvKiBpZ25vcmUgbGludCB3YXJuaW5nIG9uIGFyaXRobWV0aWMgb24gZW51bSdzICovCisgICAgdG1wID0gLypsaW50IC1lKDY1NikqLyhtYlR5cGUgLSBJXzE2eDE2XzBfMF8wKSA+PiAyOworICAgIGlmICh0bXAgPiAyKQorICAgICAgICB0bXAgLT0gMzsKKworICAgIGNicCArPSB0bXAgPDwgNDsKKworICAgIHJldHVybihjYnApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8wICYmIG1iVHlwZSA8PSBJXzE2eDE2XzNfMl8xKTsKKworICAgIC8qIHRtcCBpcyAwIGZvciBJXzE2eDE2XzBfMF8wIG1iIHR5cGUgKi8KKyAgICAvKiBpZ25vcmUgbGludCB3YXJuaW5nIG9uIGFyaXRobWV0aWMgb24gZW51bSdzICovCisgICAgdG1wID0gLypsaW50IC1lKDY1NikqLyhtYlR5cGUgLSBJXzE2eDE2XzBfMF8wKTsKKworICAgIHJldHVybih0bXAgJiAweDMpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZU1hY3JvYmxvY2sKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIERlY29kZSBvbmUgbWFjcm9ibG9jayBhbmQgd3JpdGUgaW50byBvdXRwdXQgaW1hZ2UuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCisgICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQorICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCisgICAgICAgICAgcXBZICAgICAgICAgICBwb2ludGVyIHRvIHNsaWNlIFFQCisgICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCisgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQgIGZsYWcgc3BlY2lmeWluZyBpZiBuZWlnaGJvdXJpbmcgaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3MgYXJlIHVzZWQgaW4gaW50cmEgcHJlZGljdGlvbgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jaworICAgICAgICAgIGN1cnJJbWFnZSAgICAgZGVjb2RlZCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBvdXRwdXQgaW1hZ2UKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcworICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbWFjcm9ibG9jayBkZWNvZGluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2sobWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAorICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgZHBiU3RvcmFnZV90ICpkcGIsIGkzMiAqcXBZLCB1MzIgbWJOdW0sCisgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgdTgqIGRhdGEpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKyAgICBtYlR5cGVfZSBtYlR5cGU7CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgIGNvbnN0IHU4ICpwU3JjOworI2VuZGlmCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocE1iKTsKKyAgICBBU1NFUlQocE1iTGF5ZXIpOworICAgIEFTU0VSVChjdXJySW1hZ2UpOworICAgIEFTU0VSVChxcFkgJiYgKnFwWSA8IDUyKTsKKyAgICBBU1NFUlQobWJOdW0gPCBjdXJySW1hZ2UtPndpZHRoKmN1cnJJbWFnZS0+aGVpZ2h0KTsKKworICAgIG1iVHlwZSA9IHBNYkxheWVyLT5tYlR5cGU7CisgICAgcE1iLT5tYlR5cGUgPSBtYlR5cGU7CisKKyAgICBwTWItPmRlY29kZWQrKzsKKworICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOworCisgICAgaWYgKG1iVHlwZSA9PSBJX1BDTSkKKyAgICB7CisgICAgICAgIHU4ICpwRGF0YSA9ICh1OCopZGF0YTsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgICAgIHU4ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7CisjZWxzZQorICAgICAgICBpMTYgKnRvdCA9IHBNYi0+dG90YWxDb2VmZjsKKyNlbmRpZgorICAgICAgICBpMzIgKmxldiA9IHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbFswXTsKKworICAgICAgICBwTWItPnFwWSA9IDA7CisKKyAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAorICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KKyAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDI0OyBpLS07KQorICAgICAgICAgICAgICAgICp0b3QrKyA9IDE2OworICAgICAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDI0OyBpLS07KQorICAgICAgICB7CisgICAgICAgICAgICAqdG90KysgPSAxNjsKKyAgICAgICAgICAgIGZvciAodG1wID0gMTY7IHRtcC0tOykKKyAgICAgICAgICAgICAgICAqcERhdGErKyA9ICh1OCkoKmxldisrKTsKKyAgICAgICAgfQorICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKKworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRlclByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgZHBiLCBtYk51bSwKKyAgICAgICAgICAgICAgICBjdXJySW1hZ2UsICh1OCopZGF0YSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKG1iVHlwZSAhPSBQX1NraXApCisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRTd0RlY01lbWNweShwTWItPnRvdGFsQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLnRvdGFsQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcqc2l6ZW9mKCpwTWItPnRvdGFsQ29lZmYpKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIHFwWSAqLworICAgICAgICAgICAgaWYgKHBNYkxheWVyLT5tYlFwRGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnFwWSA9ICpxcFkgKyBwTWJMYXllci0+bWJRcERlbHRhOworICAgICAgICAgICAgICAgIGlmICgqcXBZIDwgMCkgKnFwWSArPSA1MjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgqcXBZID49IDUyKSAqcXBZIC09IDUyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE1iLT5xcFkgPSAodTMyKSpxcFk7CisKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgICAgICAgICBwU3JjID0gcE1iTGF5ZXItPnJlc2lkdWFsLnBvc0NvZWZCdWY7CisKKyAgICAgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT01YUmVzdWx0IHJlczsKKyAgICAgICAgICAgICAgICB1OCAqcDsKKyAgICAgICAgICAgICAgICB1OCAqdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywgcCwgMCwgcCwgMTYsIDE2LCAqcXBZLCAqdG90YWxDb2VmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKHBNYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJySW1hZ2UpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKHBNYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0bXAgPSBQcm9jZXNzQ2hyb21hUmVzaWR1YWwocE1iLCBkYXRhLCAmcFNyYyk7CisKKyNlbHNlCisgICAgICAgICAgICB0bXAgPSBQcm9jZXNzUmVzaWR1YWwocE1iLCBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwsCisgICAgICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLmNvZWZmTWFwKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KHBNYi0+dG90YWxDb2VmZiwgMCwgMjcqc2l6ZW9mKCpwTWItPnRvdGFsQ29lZmYpKTsKKyAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOworICAgICAgICB9CisjaWZkZWYgSDI2NERFQ19PTVhETAorICAgICAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCisgICAgICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLworICAgICAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKKyAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7CisKKyAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOworI2Vsc2UKKyAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpICE9IFBSRURfTU9ERV9JTlRFUikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludHJhUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBjdXJySW1hZ2UsIG1iTnVtLAorICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgKHU4KilkYXRhKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCisgICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIEhBTlRST19PSzsKK30KKworCisjaWZkZWYgSDI2NERFQ19PTVhETAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFByb2Nlc3NDaHJvbWFSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBjaHJvbWEgd2l0aAorICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApCit7CisgICAgdTMyIGk7CisgICAgdTMyIGNocm9tYVFwOworICAgIGkxNiAqcERjOworICAgIGkxNiBkY1s0ICsgNF0gPSB7MCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1OCAqdG90YWxDb2VmZjsKKyAgICBPTVhSZXN1bHQgcmVzdWx0OworICAgIHU4ICpwOworCisgICAgLyogY2hyb21hIERDIHByb2Nlc3NpbmcuIEZpcnN0IGNocm9tYSBkYyBibG9jayBpcyBibG9jayB3aXRoIGluZGV4IDI1ICovCisgICAgY2hyb21hUXAgPQorICAgICAgICBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXBNYi0+cXBZICsgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KV07CisKKyAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSkKKyAgICB7CisgICAgICAgIHBEYyA9IGRjOworICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAorICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOworICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCisgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgIH0KKyAgICBpZiAocE1iLT50b3RhbENvZWZmWzI2XSkKKyAgICB7CisgICAgICAgIHBEYyA9IGRjKzQ7CisgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCisgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICBwRGMsCisgICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgcERjID0gZGM7CisgICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZiArIDE2OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHBEYysrLCB0b3RhbENvZWZmKyspCisgICAgeworICAgICAgICAvKiBjaHJvbWEgcHJlZGljdGlvbiAqLworICAgICAgICBpZiAoKnRvdGFsQ29lZmYgfHwgKnBEYykKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IGRhdGEgKyBjaHJvbWFJbmRleFtpXTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCisgICAgICAgICAgICAgICAgICAgIHBTcmMsCisgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgIHBEYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCwKKyAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGx1bWEgd2l0aAorICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTgqKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdCAqaW1hZ2UpCit7CisgICAgdTMyIGk7CisgICAgaTE2ICpwRGM7CisgICAgaTE2IGRjWzE2XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1OCAqdG90YWxDb2VmZjsKKyAgICBPTVhSZXN1bHQgcmVzdWx0OworICAgIHU4ICpwOworCisgICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKKworICAgIGlmICh0b3RhbENvZWZmWzI0XSkKKyAgICB7CisgICAgICAgIHBEYyA9IGRjOworICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcigKKyAgICAgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQorICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgLyogSW50cmEgMTZ4MTYgcHJlZCAqLworICAgIGlmIChoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24ocE1iLCBkYXRhLCBpbWFnZS0+bHVtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgqMTYsIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQorICAgIHsKKyAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07CisgICAgICAgIHBEYyA9ICZkY1tkY0NvZWZmSW5kZXhbaV1dOworICAgICAgICBpZiAoKnRvdGFsQ29lZmYgfHwgKnBEYykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgcERjLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFksCisgICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAorICAgICAgICAgICAgICAgIGltYWdlLAorICAgICAgICAgICAgICAgIGludHJhQ2hyb21hUHJlZE1vZGUsCisgICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuIEhBTlRST19PSzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKKyAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit1MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKipwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQoreworICAgIHUzMiBpOworICAgIHU4ICp0b3RhbENvZWZmOworICAgIE9NWFJlc3VsdCByZXN1bHQ7CisgICAgdTggKnA7CisKKyAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKKyAgICB7CisgICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOworICAgICAgICBpZiAoaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIHAsIG1iTGF5ZXIsIGltYWdlLT5sdW1hLAorICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgqMTYsIGNvbnN0cmFpbmVkSW50cmFQcmVkLCBpKSAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKCp0b3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAorICAgICAgICAgICAgICAgICAgICBwU3JjLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAxNiwKKyAgICAgICAgICAgICAgICAgICAgMTYsCisgICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFksCisgICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAorICAgICAgICAgICAgICAgIGltYWdlLAorICAgICAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybiBIQU5UUk9fT0s7Cit9CisKKyNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcm9jZXNzUmVzaWR1YWwKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2Ygb25lIG1hY3JvYmxvY2sgd2l0aAorICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIFByb2Nlc3NSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCBpMzIgcmVzaWR1YWxMZXZlbFtdWzE2XSwgdTMyICpjb2VmZk1hcCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKyAgICB1MzIgY2hyb21hUXA7CisgICAgaTMyICgqYmxvY2tEYXRhKVsxNl07CisgICAgaTMyICgqYmxvY2tEYylbMTZdOworICAgIGkxNiAqdG90YWxDb2VmZjsKKyAgICBpMzIgKmNocm9tYURjOworICAgIGNvbnN0IHUzMiAqZGNDb2VmZklkeDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYik7CisgICAgQVNTRVJUKHJlc2lkdWFsTGV2ZWwpOworCisgICAgLyogc2V0IHBvaW50ZXJzIHRvIERDIGNvZWZmaWNpZW50IGJsb2NrcyAqLworICAgIGJsb2NrRGMgPSByZXNpZHVhbExldmVsICsgMjQ7CisKKyAgICBibG9ja0RhdGEgPSByZXNpZHVhbExldmVsOworICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7CisgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCisgICAgeworICAgICAgICBpZiAodG90YWxDb2VmZlsyNF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGgyNjRic2RQcm9jZXNzTHVtYURjKCpibG9ja0RjLCBwTWItPnFwWSk7CisgICAgICAgIH0KKyAgICAgICAgZGNDb2VmZklkeCA9IGRjQ29lZmZJbmRleDsKKworICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgbHVtYSBibG9jayAqLworICAgICAgICAgICAgKCpibG9ja0RhdGEpWzBdID0gKCpibG9ja0RjKVsqZGNDb2VmZklkeCsrXTsKKyAgICAgICAgICAgIGlmICgoKmJsb2NrRGF0YSlbMF0gfHwgKnRvdGFsQ29lZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgcE1iLT5xcFksIDEsICpjb2VmZk1hcCkgIT0KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgcE1iLT5xcFksIDAsICpjb2VmZk1hcCkgIT0KKyAgICAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLworICAgIGNocm9tYVFwID0KKyAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOworICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjVdIHx8IHBNYi0+dG90YWxDb2VmZlsyNl0pCisgICAgICAgIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMocmVzaWR1YWxMZXZlbFsyNV0sIGNocm9tYVFwKTsKKyAgICBjaHJvbWFEYyA9IHJlc2lkdWFsTGV2ZWxbMjVdOworICAgIGZvciAoaSA9IDg7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKKyAgICB7CisgICAgICAgIC8qIHNldCBkYyBjb2VmZmljaWVudCBvZiBjaHJvbWEgYmxvY2sgKi8KKyAgICAgICAgKCpibG9ja0RhdGEpWzBdID0gKmNocm9tYURjKys7CisgICAgICAgIGlmICgoKmJsb2NrRGF0YSlbMF0gfHwgKnRvdGFsQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIGNocm9tYVFwLCAxLCpjb2VmZk1hcCkgIT0KKyAgICAgICAgICAgICAgICBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7Cit9CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTdWJNYlBhcnRNb2RlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBSZXR1cm5zIHRoZSBtYWNyb2Jsb2NrJ3Mgc3ViLXBhcnRpdGlvbiBtb2RlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdWJNYlBhcnRNb2RlX2UgaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoc3ViTWJUeXBlIDwgNCk7CisKKyAgICByZXR1cm4oKHN1Yk1iUGFydE1vZGVfZSlzdWJNYlR5cGUpOworCit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzJiYzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIGludHJhIG1iICovCisjZGVmaW5lIElTX0lOVFJBX01CKGEpICgoYSkubWJUeXBlID4gNSkKKworLyogTWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGEgbWIgaXMgYW4gSV9QQ00gbWIgKi8KKyNkZWZpbmUgSVNfSV9QQ01fTUIoYSkgKChhKS5tYlR5cGUgPT0gMzEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgUF9Ta2lwICAgICAgICAgID0gMCwKKyAgICBQX0wwXzE2eDE2ICAgICAgPSAxLAorICAgIFBfTDBfTDBfMTZ4OCAgICA9IDIsCisgICAgUF9MMF9MMF84eDE2ICAgID0gMywKKyAgICBQXzh4OCAgICAgICAgICAgPSA0LAorICAgIFBfOHg4cmVmMCAgICAgICA9IDUsCisgICAgSV80eDQgICAgICAgICAgID0gNiwKKyAgICBJXzE2eDE2XzBfMF8wICAgPSA3LAorICAgIElfMTZ4MTZfMV8wXzAgICA9IDgsCisgICAgSV8xNngxNl8yXzBfMCAgID0gOSwKKyAgICBJXzE2eDE2XzNfMF8wICAgPSAxMCwKKyAgICBJXzE2eDE2XzBfMV8wICAgPSAxMSwKKyAgICBJXzE2eDE2XzFfMV8wICAgPSAxMiwKKyAgICBJXzE2eDE2XzJfMV8wICAgPSAxMywKKyAgICBJXzE2eDE2XzNfMV8wICAgPSAxNCwKKyAgICBJXzE2eDE2XzBfMl8wICAgPSAxNSwKKyAgICBJXzE2eDE2XzFfMl8wICAgPSAxNiwKKyAgICBJXzE2eDE2XzJfMl8wICAgPSAxNywKKyAgICBJXzE2eDE2XzNfMl8wICAgPSAxOCwKKyAgICBJXzE2eDE2XzBfMF8xICAgPSAxOSwKKyAgICBJXzE2eDE2XzFfMF8xICAgPSAyMCwKKyAgICBJXzE2eDE2XzJfMF8xICAgPSAyMSwKKyAgICBJXzE2eDE2XzNfMF8xICAgPSAyMiwKKyAgICBJXzE2eDE2XzBfMV8xICAgPSAyMywKKyAgICBJXzE2eDE2XzFfMV8xICAgPSAyNCwKKyAgICBJXzE2eDE2XzJfMV8xICAgPSAyNSwKKyAgICBJXzE2eDE2XzNfMV8xICAgPSAyNiwKKyAgICBJXzE2eDE2XzBfMl8xICAgPSAyNywKKyAgICBJXzE2eDE2XzFfMl8xICAgPSAyOCwKKyAgICBJXzE2eDE2XzJfMl8xICAgPSAyOSwKKyAgICBJXzE2eDE2XzNfMl8xICAgPSAzMCwKKyAgICBJX1BDTSAgICAgICAgICAgPSAzMQorfSBtYlR5cGVfZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBQX0wwXzh4OCA9IDAsCisgICAgUF9MMF84eDQgPSAxLAorICAgIFBfTDBfNHg4ID0gMiwKKyAgICBQX0wwXzR4NCA9IDMKK30gc3ViTWJUeXBlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUJfUF8xNngxNiA9IDAsCisgICAgTUJfUF8xNng4LAorICAgIE1CX1BfOHgxNiwKKyAgICBNQl9QXzh4OAorfSBtYlBhcnRNb2RlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUJfU1BfOHg4ID0gMCwKKyAgICBNQl9TUF84eDQsCisgICAgTUJfU1BfNHg4LAorICAgIE1CX1NQXzR4NAorfSBzdWJNYlBhcnRNb2RlX2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUFJFRF9NT0RFX0lOVFJBNHg0ID0gMCwKKyAgICBQUkVEX01PREVfSU5UUkExNngxNiAgLAorICAgIFBSRURfTU9ERV9JTlRFUgorfSBtYlBhcnRQcmVkTW9kZV9lOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogTXZQcmVkaWN0aW9uMTZ4MTYgYXNzdW1lcyB0aGF0IE1WcyBhcmUgMTZiaXRzICovCisgICAgaTE2IGhvcjsKKyAgICBpMTYgdmVyOworfSBtdl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbMTZdOworICAgIHUzMiByZW1JbnRyYTR4NFByZWRNb2RlWzE2XTsKKyAgICB1MzIgaW50cmFDaHJvbWFQcmVkTW9kZTsKKyAgICB1MzIgcmVmSWR4TDBbNF07CisgICAgbXZfdCBtdmRMMFs0XTsKK30gbWJQcmVkX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3ViTWJUeXBlX2Ugc3ViTWJUeXBlWzRdOworICAgIHUzMiByZWZJZHhMMFs0XTsKKyAgICBtdl90IG12ZEwwWzRdWzRdOworfSBzdWJNYlByZWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyNpZmRlZiBIMjY0REVDX09NWERMCisgICAgdTggcG9zQ29lZkJ1ZlsyNyoxNiozXTsKKyAgICB1OCB0b3RhbENvZWZmWzI3XTsKKyNlbHNlCisgICAgaTE2IHRvdGFsQ29lZmZbMjddOworI2VuZGlmCisgICAgaTMyIGxldmVsWzI2XVsxNl07CisgICAgdTMyIGNvZWZmTWFwWzI0XTsKK30gcmVzaWR1YWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBtYlR5cGVfZSBtYlR5cGU7CisgICAgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuOworICAgIGkzMiBtYlFwRGVsdGE7CisgICAgbWJQcmVkX3QgbWJQcmVkOworICAgIHN1Yk1iUHJlZF90IHN1Yk1iUHJlZDsKKyAgICByZXNpZHVhbF90IHJlc2lkdWFsOworfSBtYWNyb2Jsb2NrTGF5ZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWJTdG9yYWdlCit7CisgICAgbWJUeXBlX2UgbWJUeXBlOworICAgIHUzMiBzbGljZUlkOworICAgIHUzMiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKKyAgICBpMzIgZmlsdGVyT2Zmc2V0QTsKKyAgICBpMzIgZmlsdGVyT2Zmc2V0QjsKKyAgICB1MzIgcXBZOworICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0OworI2lmZGVmIEgyNjRERUNfT01YREwKKyAgICB1OCB0b3RhbENvZWZmWzI3XTsKKyNlbHNlCisgICAgaTE2IHRvdGFsQ29lZmZbMjddOworI2VuZGlmCisgICAgdTggaW50cmE0eDRQcmVkTW9kZVsxNl07CisgICAgdTMyIHJlZlBpY1s0XTsKKyAgICB1OCogcmVmQWRkcls0XTsKKyAgICBtdl90IG12WzE2XTsKKyAgICB1MzIgZGVjb2RlZDsKKyAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkE7CisgICAgc3RydWN0IG1iU3RvcmFnZSAqbWJCOworICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQzsKKyAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkQ7Cit9IG1iU3RvcmFnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIG1iU3RvcmFnZV90ICpwTWIsIHUzMiBzbGljZVR5cGUsCisgICAgdTMyIG51bVJlZklkeEFjdGl2ZSk7CisKK3UzMiBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZV9lIG1iVHlwZSk7Cit1MzIgaDI2NGJzZE51bVN1Yk1iUGFydChzdWJNYlR5cGVfZSBzdWJNYlR5cGUpOworCitzdWJNYlBhcnRNb2RlX2UgaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKKwordTMyIGgyNjRic2REZWNvZGVNYWNyb2Jsb2NrKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgKnFwWSwgdTMyIG1iTnVtLAorICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWcsIHU4KiBkYXRhKTsKKwordTMyIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYobWJUeXBlX2UgbWJUeXBlKTsKKworbWJQYXJ0UHJlZE1vZGVfZSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlX2UgbWJUeXBlKTsKKyNpZmRlZiBIMjY0REVDX05FT04KK3UzMiBoMjY0YnNkQ2xlYXJNYkxheWVyKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwgdTMyIHNpemUpOworI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSCAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ0YzQzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZU5hbFVuaXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVOYWxVbml0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcE5hbFVuaXQgICAgICAgIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlTmFsVW5pdChzdHJtRGF0YV90ICpwU3RybURhdGEsIG5hbFVuaXRfdCAqcE5hbFVuaXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBOYWxVbml0KTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0gMCk7CisKKyAgICAvKiBmb3JiaWRkZW5femVyb19iaXQgKG5vdCBjaGVja2VkIHRvIGJlIHplcm8sIGVycm9ycyBpZ25vcmVkKSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgLyogQXNzdW1pbmcgdGhhdCBOQUwgdW5pdCBzdGFydHMgZnJvbSBieXRlIGJvdW5kYXJ5IK0+IGRvbid0IGhhdmUgdG8gY2hlY2sKKyAgICAgKiBmb2xsb3dpbmcgNyBiaXRzIGZvciBFTkRfT0ZfU1RSRUFNICovCisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOworICAgIHBOYWxVbml0LT5uYWxSZWZJZGMgPSB0bXA7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9IChuYWxVbml0VHlwZV9lKXRtcDsKKworICAgIC8qIGRhdGEgcGFydGl0aW9uaW5nIE5BTCB1bml0cyBub3Qgc3VwcG9ydGVkICovCisgICAgaWYgKCAodG1wID09IDIpIHx8ICh0bXAgPT0gMykgfHwgKHRtcCA9PSA0KSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogbmFsX3JlZl9pZGMgc2hhbGwgbm90IGJlIHplcm8gZm9yIHRoZXNlIG5hbF91bml0X3R5cGVzICovCisgICAgaWYgKCAoICh0bXAgPT0gTkFMX1NFUV9QQVJBTV9TRVQpIHx8ICh0bXAgPT0gTkFMX1BJQ19QQVJBTV9TRVQpIHx8CisgICAgICAgICAgICh0bXAgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikgKSAmJiAocE5hbFVuaXQtPm5hbFJlZklkYyA9PSAwKSApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIC8qIG5hbF9yZWZfaWRjIHNoYWxsIGJlIHplcm8gZm9yIHRoZXNlIG5hbF91bml0X3R5cGVzICovCisgICAgZWxzZSBpZiAoICggKHRtcCA9PSBOQUxfU0VJKSB8fCAodG1wID09IE5BTF9BQ0NFU1NfVU5JVF9ERUxJTUlURVIpIHx8CisgICAgICAgICAgICAgICAgKHRtcCA9PSBOQUxfRU5EX09GX1NFUVVFTkNFKSB8fCAodG1wID09IE5BTF9FTkRfT0ZfU1RSRUFNKSB8fAorICAgICAgICAgICAgICAgICh0bXAgPT0gTkFMX0ZJTExFUl9EQVRBKSApICYmIChwTmFsVW5pdC0+bmFsUmVmSWRjICE9IDApICkKKyAgICB7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4OTU3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX05BTF9VTklUX0gKKyNkZWZpbmUgSDI2NFNXREVDX05BTF9VTklUX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBOQUwgdW5pdCBwb2ludGVkIGJ5IHBOYWxVbml0IGNvbnRhaW5zIGFuIElEUiBzbGljZSAqLworI2RlZmluZSBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIFwKKyAgICAoKHBOYWxVbml0KS0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworICAgIE5BTF9DT0RFRF9TTElDRSA9IDEsCisgICAgTkFMX0NPREVEX1NMSUNFX0lEUiA9IDUsCisgICAgTkFMX1NFSSA9IDYsCisgICAgTkFMX1NFUV9QQVJBTV9TRVQgPSA3LAorICAgIE5BTF9QSUNfUEFSQU1fU0VUID0gOCwKKyAgICBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSID0gOSwKKyAgICBOQUxfRU5EX09GX1NFUVVFTkNFID0gMTAsCisgICAgTkFMX0VORF9PRl9TVFJFQU0gPSAxMSwKKyAgICBOQUxfRklMTEVSX0RBVEEgPSAxMiwKKyAgICBOQUxfTUFYX1RZUEVfVkFMVUUgPSAzMQorfSBuYWxVbml0VHlwZV9lOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGU7CisgICAgdTMyIG5hbFJlZklkYzsKK30gbmFsVW5pdF90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlTmFsVW5pdChzdHJtRGF0YV90ICpwU3RybURhdGEsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZTVlZWZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZEluaXRNYk5laWdoYm91cnMKKyAgICAgICAgICBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKKyAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBCisgICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQgorICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKKyAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRm9sbG93aW5nIGZvdXIgdGFibGVzIGluZGljYXRlIG5laWdoYm91cnMgb2YgZWFjaCBibG9jayBvZiBhIG1hY3JvYmxvY2suCisgKiBGaXJzdCAxNiB2YWx1ZXMgYXJlIGZvciBsdW1hIGJsb2NrcywgbmV4dCA0IHZhbHVlcyBmb3IgQ2IgYW5kIGxhc3QgNAorICogdmFsdWVzIGZvciBDci4gRWxlbWVudHMgb2YgdGhlIHRhYmxlIGluZGljYXRlIHRvIHdoaWNoIG1hY3JvYmxvY2sgdGhlCisgKiBuZWlnaGJvdXIgYmxvY2sgYmVsb25ncyBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZWlnaGJvdXIgYmxvY2sgaW4gcXVlc3Rpb24uCisgKiBJbmRleGluZyBvZiB0aGUgYmxvY2tzIGdvZXMgYXMgZm9sbG93cworICoKKyAqICAgICAgICAgIFkgICAgICAgICAgICAgQ2IgICAgICAgQ3IKKyAqICAgICAgMCAgMSAgNCAgNSAgICAgIDE2IDE3ICAgIDIwIDIxCisgKiAgICAgIDIgIDMgIDYgIDcgICAgICAxOCAxOSAgICAyMiAyMworICogICAgICA4ICA5IDEyIDEzCisgKiAgICAgMTAgMTEgMTQgMTUKKyAqLworCisvKiBsZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQV80eDRCWzI0XSA9IHsKKyAgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sIHtNQl9BLDd9LCAgICB7TUJfQ1VSUiwyfSwKKyAgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwKKyAgICB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sIHtNQl9BLDE1fSwgICB7TUJfQ1VSUiwxMH0sCisgICAge01CX0NVUlIsOX0sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxMX0se01CX0NVUlIsMTR9LAorICAgIHtNQl9BLDE3fSwgICB7TUJfQ1VSUiwxNn0se01CX0EsMTl9LCAgIHtNQl9DVVJSLDE4fSwKKyAgICB7TUJfQSwyMX0sICAge01CX0NVUlIsMjB9LHtNQl9BLDIzfSwgICB7TUJfQ1VSUiwyMn0gfTsKKworLyogYWJvdmUgbmVpZ2hib3VyIGZvciBlYWNoIGJsb2NrICovCitzdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9CXzR4NEJbMjRdID0geworICAgIHtNQl9CLDEwfSwgICB7TUJfQiwxMX0sICAge01CX0NVUlIsMH0sIHtNQl9DVVJSLDF9LAorICAgIHtNQl9CLDE0fSwgICB7TUJfQiwxNX0sICAge01CX0NVUlIsNH0sIHtNQl9DVVJSLDV9LAorICAgIHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOH0sIHtNQl9DVVJSLDl9LAorICAgIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX0NVUlIsMTJ9LHtNQl9DVVJSLDEzfSwKKyAgICB7TUJfQiwxOH0sICAge01CX0IsMTl9LCAgIHtNQl9DVVJSLDE2fSx7TUJfQ1VSUiwxN30sCisgICAge01CX0IsMjJ9LCAgIHtNQl9CLDIzfSwgICB7TUJfQ1VSUiwyMH0se01CX0NVUlIsMjF9IH07CisKKy8qIGFib3ZlLXJpZ2h0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQ180eDRCWzI0XSA9IHsKKyAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfTkEsNH0sCisgICAge01CX0IsMTV9LCAgIHtNQl9DLDEwfSwgICB7TUJfQ1VSUiw1fSwge01CX05BLDB9LAorICAgIHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX0NVUlIsOX0sIHtNQl9OQSwxMn0sCisgICAge01CX0NVUlIsN30sIHtNQl9OQSwyfSwgICB7TUJfQ1VSUiwxM30se01CX05BLDh9LAorICAgIHtNQl9CLDE5fSwgICB7TUJfQywxOH0sICAge01CX0NVUlIsMTd9LHtNQl9OQSwxNn0sCisgICAge01CX0IsMjN9LCAgIHtNQl9DLDIyfSwgICB7TUJfQ1VSUiwyMX0se01CX05BLDIwfSB9OworCisvKiBhYm92ZS1sZWZ0IG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLworc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fRF80eDRCWzI0XSA9IHsKKyAgICB7TUJfRCwxNX0sICAge01CX0IsMTB9LCAgIHtNQl9BLDV9LCAgICB7TUJfQ1VSUiwwfSwKKyAgICB7TUJfQiwxMX0sICAge01CX0IsMTR9LCAgIHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwKKyAgICB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sIHtNQl9BLDEzfSwgICB7TUJfQ1VSUiw4fSwKKyAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sCisgICAge01CX0QsMTl9LCAgIHtNQl9CLDE4fSwgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LAorICAgIHtNQl9ELDIzfSwgICB7TUJfQiwyMn0sICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSB9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEluaXRNYk5laWdoYm91cnMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgSW5pdGlhbGl6ZSBtYWNyb2Jsb2NrIG5laWdoYm91cnMuIEZ1bmN0aW9uIHNldHMgbmVpZ2hib3VyCisgICAgICAgICAgICBtYWNyb2Jsb2NrIHBvaW50ZXJzIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyB0byBwb2ludCB0bworICAgICAgICAgICAgbWFjcm9ibG9ja3Mgb24gdGhlIGxlZnQsIGFib3ZlLCBhYm92ZS1yaWdodCBhbmQgYWJvdmUtbGVmdC4KKyAgICAgICAgICAgIFBvaW50ZXJzIGFyZSBzZXQgTlVMTCBpZiB0aGUgbmVpZ2hib3VyIGRvZXMgbm90IGZpdCBpbnRvIHRoZQorICAgICAgICAgICAgcGljdHVyZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgd2lkdGggb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBubyBuZWVkIHRvIGNsYXJpZnkKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcE1iU3RvcmFnZSAgICAgIG5laWdoYm91ciBwb2ludGVycyBvZiBlYWNoIG1iU3RvcmFnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEluaXRNYk5laWdoYm91cnMobWJTdG9yYWdlX3QgKnBNYlN0b3JhZ2UsIHUzMiBwaWNXaWR0aCwKKyAgICB1MzIgcGljU2l6ZUluTWJzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCByb3csIGNvbDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBNYlN0b3JhZ2UpOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY1dpZHRoIDw9IHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKCgocGljU2l6ZUluTWJzIC8gcGljV2lkdGgpICogcGljV2lkdGgpID09IHBpY1NpemVJbk1icyk7CisKKyAgICByb3cgPSBjb2wgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemVJbk1iczsgaSsrKQorICAgIHsKKworICAgICAgICBpZiAoY29sKQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkEgPSBwTWJTdG9yYWdlICsgaSAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gTlVMTDsKKworICAgICAgICBpZiAocm93KQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBwTWJTdG9yYWdlICsgaSAtIHBpY1dpZHRoOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQiA9IE5VTEw7CisKKyAgICAgICAgaWYgKHJvdyAmJiAoY29sIDwgcGljV2lkdGggLSAxKSkKKyAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggLSAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkMgPSBOVUxMOworCisgICAgICAgIGlmIChyb3cgJiYgY29sKQorICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBwTWJTdG9yYWdlICsgaSAtIChwaWNXaWR0aCArIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iRCA9IE5VTEw7CisKKyAgICAgICAgY29sKys7CisgICAgICAgIGlmIChjb2wgPT0gcGljV2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbCA9IDA7CisgICAgICAgICAgICByb3crKzsKKyAgICAgICAgfQorICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXROZWlnaGJvdXJNYgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgcG9pbnRlciB0byBuZWlnaGJvdXIgbWFjcm9ibG9jay4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwTWIgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RydWN0dXJlIG9mIHRoZSBtYWNyb2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICB3aG9zZSBuZWlnaGJvdXIgaXMgd2FudGVkCisgICAgICAgICAgICBuZWlnaGJvdXIgICBpbmRpY2F0ZXMgd2hpY2ggbmVpZ2hib3VyIGlzIHdhbnRlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2sKKyAgICAgICAgICAgIE5VTEwgaWYgbm90IGF2YWlsYWJsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCittYlN0b3JhZ2VfdCogaDI2NGJzZEdldE5laWdoYm91ck1iKG1iU3RvcmFnZV90ICpwTWIsIG5laWdoYm91ck1iX2UgbmVpZ2hib3VyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoKG5laWdoYm91ciA8PSBNQl9DVVJSKSB8fCAobmVpZ2hib3VyID09IE1CX05BKSk7CisKKyAgICBpZiAobmVpZ2hib3VyID09IE1CX0EpCisgICAgICAgIHJldHVybihwTWItPm1iQSk7CisgICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0IpCisgICAgICAgIHJldHVybihwTWItPm1iQik7CisgICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0MpCisgICAgICAgIHJldHVybihwTWItPm1iQyk7CisgICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0QpCisgICAgICAgIHJldHVybihwTWItPm1iRCk7CisgICAgZWxzZSBpZiAobmVpZ2hib3VyID09IE1CX0NVUlIpCisgICAgICAgIHJldHVybihwTWIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKE5VTEwpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KKyAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EodTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0FfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgR2V0IGFib3ZlIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0bworICAgICAgICAgICAgdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitjb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQih1MzIgYmxvY2tJbmRleCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOworCisgICAgcmV0dXJuKE5fQl80eDRCK2Jsb2NrSW5kZXgpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgYWJvdmUtcmlnaHQgIG5laWdoYm91ciBvZiB0aGUgYmxvY2suIEZ1bmN0aW9uIHJldHVybnMgcG9pbnRlcgorICAgICAgICAgICAgdG8gdGhlIHRhYmxlIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBibG9ja0luZGV4ICBpbmRpY2F0ZXMgdGhlIGJsb2NrIHdob3NlIG5laWdoYm91cnMgYXJlIHdhbnRlZAorCisgICAgICAgIE91dHB1dHM6CisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gbmVpZ2hib3VyIHN0cnVjdHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitjb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyh1MzIgYmxvY2tJbmRleCkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChibG9ja0luZGV4IDwgMjQpOworCisgICAgcmV0dXJuKE5fQ180eDRCK2Jsb2NrSW5kZXgpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgYWJvdmUtbGVmdCBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KKyAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKKworICAgICAgICBPdXRwdXRzOgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QodTMyIGJsb2NrSW5kZXgpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKKworICAgIHJldHVybihOX0RfNHg0QitibG9ja0luZGV4KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBpZiBuZWlnaGJvdXIgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUuIE5laWdoYm91ciBtYWNyb2Jsb2NrCisgICAgICAgICAgICBpcyBjb25zaWRlcmVkIGF2YWlsYWJsZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHBpY3R1cmUgYW5kIGJlbG9uZ3MKKyAgICAgICAgICAgIHRvIHRoZSBzYW1lIHNsaWNlIGFzIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgICBwTmVpZ2hib3VyICBwb2ludGVyIHRvIHRoZSBuZWlnaGJvdXIgbWFjcm9ibG9jaworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIFRSVUUgICAgbmVpZ2hib3VyIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgRkFMU0UgICBuZWlnaGJvdXIgaXMgbm90IGF2YWlsYWJsZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKG1iU3RvcmFnZV90ICpwTWIsIG1iU3RvcmFnZV90ICpwTmVpZ2hib3VyKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgaWYgKCAocE5laWdoYm91ciA9PSBOVUxMKSB8fCAocE1iLT5zbGljZUlkICE9IHBOZWlnaGJvdXItPnNsaWNlSWQpICkKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2UwYWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfTkVJR0hCT1VSX0gKKyNkZWZpbmUgSDI2NFNXREVDX05FSUdIQk9VUl9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBNQl9BID0gMCwKKyAgICBNQl9CLAorICAgIE1CX0MsCisgICAgTUJfRCwKKyAgICBNQl9DVVJSLAorICAgIE1CX05BID0gMHhGRgorfSBuZWlnaGJvdXJNYl9lOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbmVpZ2hib3VyTWJfZSAgIG1iOworICAgIHU4ICAgICAgICAgICAgIGluZGV4OworfSBuZWlnaGJvdXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCisgICAgdTMyIHBpY1NpemVJbk1icyk7CisKK21iU3RvcmFnZV90KiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIobWJTdG9yYWdlX3QgKnBNYiwgbmVpZ2hib3VyTWJfZSBuZWlnaGJvdXIpOworCit1MzIgaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKG1iU3RvcmFnZV90ICpwTWIsIG1iU3RvcmFnZV90ICpwTmVpZ2hib3VyKTsKKworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EodTMyIGJsb2NrSW5kZXgpOworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpOworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpOworY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QodTMyIGJsb2NrSW5kZXgpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ORUlHSEJPVVJfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYjIzMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19vcmRlcl9jbnQuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVQaWNPcmRlckNudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX29yZGVyX2NudC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVBpY09yZGVyQ250CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIENvbXB1dGUgcGljdHVyZSBvcmRlciBjb3VudCBmb3IgYSBwaWN0dXJlLiBGdW5jdGlvbiBpbXBsZW1lbnRzCisgICAgICAgICAgICBjb21wdXRhdGlvbiBvZiBhbGwgUE9DIHR5cGVzICgwLCAxIGFuZCAyKSwgdHlwZSBpcyBvYnRhaW5lZCBmcm9tCisgICAgICAgICAgICBzcHMuIFNlZSBzdGFuZGFyZCBmb3IgZGVzY3JpcHRpb24gb2YgdGhlIFBPQyB0eXBlcyBhbmQgaG93IFBPQyBpcworICAgICAgICAgICAgY29tcHV0ZWQgZm9yIGVhY2ggdHlwZS4KKworICAgICAgICAgICAgRnVuY3Rpb24gcmV0dXJucyB0aGUgbWluaW11bSBvZiB0b3AgZmllbGQgYW5kIGJvdHRvbSBmaWVsZCBwaWMKKyAgICAgICAgICAgIG9yZGVyIGNvdW50cy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwb2MgICAgICAgICBwb2ludGVyIHRvIHByZXZpb3VzIHJlc3VsdHMKKyAgICAgICAgICAgIHNwcyAgICAgICAgIHBvaW50ZXIgdG8gc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgc2xpY0hlYWRlciAgcG9pbnRlciB0byBjdXJyZW50IHNsaWNlIGhlYWRlciwgZnJhbWUgbnVtYmVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGFyYW1zIG5lZWRlZCBmb3IgUE9DIGNvbXB1dGF0aW9uCisgICAgICAgICAgICBwTmFsVW5pdCAgICBwb2ludGVyIHRvIGN1cnJlbnQgTkFMIHVuaXQgc3RydWN0cnVlLCBmdW5jdGlvbiBuZWVkcworICAgICAgICAgICAgICAgICAgICAgICAgdG8ga25vdyBpZiB0aGlzIGlzIGFuIElEUiBwaWN0dXJlIGFuZCBhbHNvIGlmIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcG9jICAgICAgICAgcmVzdWx0cyBzdG9yZWQgaGVyZSBmb3IgY29tcHV0YXRpb24gb2YgbmV4dCBQT0MKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgcGljdHVyZSBvcmRlciBjb3VudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCisgICAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLCBuYWxVbml0X3QgKnBOYWxVbml0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpOworICAgIGkzMiBwaWNPcmRlckNudDsKKyAgICB1MzIgZnJhbWVOdW1PZmZzZXQsIGFic0ZyYW1lTnVtLCBwaWNPcmRlckNudEN5Y2xlQ250OworICAgIHUzMiBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZTsKKyAgICBpMzIgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGU7CisgICAgdTMyIGNvbnRhaW5zTW1jbzU7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwb2MpOworICAgIEFTU0VSVChzcHMpOworICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOworICAgIEFTU0VSVChwTmFsVW5pdCk7CisgICAgQVNTRVJUKHNwcy0+cGljT3JkZXJDbnRUeXBlIDw9IDIpOworCisjaWYgMAorICAgIC8qIEphblNhOiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVjZXNzYXJ5LCBkb24ndCBzZWUgYW55IHJlYXNvbiB0bworICAgICAqIGluY3JlbWVudCBwcmV2RnJhbWVOdW0gb25lIGJ5IG9uZSBpbnN0ZWFkIG9mIG9uZSBiaWcgaW5jcmVtZW50LgorICAgICAqIEhvd2V2ZXIsIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHRoaXMgc2hvdWxkIGJlIGRvbmUgLT4gaWYgc29tZW9uZQorICAgICAqIGZpZ3VyZXMgb3V0IGFueSBjYXNlIHdoZW4gdGhlIG91dGNvbWUgd291bGQgYmUgZGlmZmVyZW50IGZvciBzdGVwIGJ5CisgICAgICogc3RlcCBpbmNyZW1lbnQsIHRoaXMgcGFydCBvZiB0aGUgY29kZSBzaG91bGQgYmUgZW5hYmxlZCAqLworCisgICAgLyogaWYgdGhlcmUgd2FzIGEgZ2FwIGluIGZyYW1lIG51bWJlcmluZyBhbmQgcGljT3JkZXJDbnRUeXBlIGlzIDEgb3IgMiAtPgorICAgICAqICJjb21wdXRlIiBwaWMgb3JkZXIgY291bnRzIGZvciBub24tZXhpc3RpbmcgZnJhbWVzLiBUaGVzZSBhcmUgbm90CisgICAgICogYWN0dWFsbHkgY29tcHV0ZWQsIGJ1dCBwcm9jZXNzIG5lZWRzIHRvIGJlIGRvbmUgdG8gdXBkYXRlIHRoZQorICAgICAqIHByZXZGcmFtZU51bSBhbmQgcHJldkZyYW1lTnVtT2Zmc2V0ICovCisgICAgaWYgKCBzcHMtPnBpY09yZGVyQ250VHlwZSA+IDAgJiYKKyAgICAgICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gIT0gcG9jLT5wcmV2RnJhbWVOdW0gJiYKKyAgICAgICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gIT0gKChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bSkpCisgICAgeworCisgICAgICAgIC8qIHVzZSB2YXJpYWJsZSBpIGZvciB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAqLworICAgICAgICBpID0gKHBvYy0+cHJldkZyYW1lTnVtICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IGkpCisgICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKKworICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gaTsKKworICAgICAgICAgICAgaSA9IChpICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtOworCisgICAgICAgIH0gd2hpbGUgKGkgIT0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBjaGVjayBpZiBjdXJyZW50IHNsaWNlIGluY2x1ZGVzIG1tY28gZXF1YWwgdG8gNSAqLworICAgIGNvbnRhaW5zTW1jbzUgPSBIQU5UUk9fRkFMU0U7CisgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbiA9PSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRhaW5zTW1jbzUgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKHNwcy0+cGljT3JkZXJDbnRUeXBlKQorICAgIHsKKworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBzZXQgcHJldlBpY09yZGVyQ250IHZhbHVlcyBmb3IgSURSIGZyYW1lICovCisgICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjb21wdXRlIHBpY09yZGVyQ250TXNiIChzdG9yZWQgaW4gcGljT3JkZXJDbnQgdmFyaWFibGUpICovCisgICAgICAgICAgICBpZiAoIChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiIDwgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpICYmCisgICAgICAgICAgICAgICAgKChwb2MtPnByZXZQaWNPcmRlckNudExzYiAtIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IpID49CisgICAgICAgICAgICAgICAgIHNwcy0+bWF4UGljT3JkZXJDbnRMc2IvMikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgKworICAgICAgICAgICAgICAgICAgICAoaTMyKXNwcy0+bWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgorICAgICAgICAgICAgICAgICgocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiAtIHBvYy0+cHJldlBpY09yZGVyQ250THNiKSA+CisgICAgICAgICAgICAgICAgIHNwcy0+bWF4UGljT3JkZXJDbnRMc2IvMikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgLQorICAgICAgICAgICAgICAgICAgICAoaTMyKXNwcy0+bWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYjsKKworICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250TXNiIGlzIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKKyAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCisgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSBwaWNPcmRlckNudDsKKworICAgICAgICAgICAgLyogY29tcHV0ZSB0b3AgZmllbGQgb3JkZXIgY250IChzdG9yZWQgaW4gcGljT3JkZXJDbnQpICovCisgICAgICAgICAgICBwaWNPcmRlckNudCArPSAoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7CisKKyAgICAgICAgICAgIC8qIGlmIGRlbHRhIGZvciBib3R0b20gZmllbGQgaXMgbmVnYXRpdmUgLT4gYm90dG9tIHdpbGwgYmUgdGhlCisgICAgICAgICAgICAgKiBtaW5pbXVtIHBpYyBvcmRlciBjb3VudCAqLworICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tOworCisgICAgICAgICAgICAvKiBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBwcmV2UGljT3JkZXJDbnRMc2IgaXMgZnJvbSBwcmV2aW91cworICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lIC0+IHJlcGxhY2Ugb2xkIHZhbHVlIG9ubHkgaWYgY3VycmVudCBmcmFtZSBpcworICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lICovCisgICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBjdXJyZW50IGZyYW1lIGNvbnRhaW5zIG1tY281IC0+IG1vZGlmeSB2YWx1ZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgKiBzdG9yZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNNbWNvNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLyogcHJldlBpY09yZGVyQ250THNiIHNob3VsZCBiZSB0aGUgdG9wIGZpZWxkIHBpY09yZGVyQ250CisgICAgICAgICAgICAgICAgICAgICAqIGlmIHByZXZpb3VzIGZyYW1lIGluY2x1ZGVkIG1tY281LiBUb3AgZmllbGQgcGljT3JkZXJDbnQKKyAgICAgICAgICAgICAgICAgICAgICogZm9yIGZyYW1lcyBjb250YWluaW5nIG1tY281IGlzIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBwaWNPcmRlckNudCBmcm9tIG9yaWdpbmFsIHRvcCBmaWVsZCBvcmRlciBjb3VudCAtPgorICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSBpcyB6ZXJvIGlmIHRvcCBmaWVsZCB3YXMgdGhlIG1pbmltdW0sIGkuZS4gZGVsdGEKKyAgICAgICAgICAgICAgICAgICAgICogZm9yIGJvdHRvbSB3YXMgcG9zaXRpdmUsIG90aGVyd2lzZSB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgKiAtZGVsdGFQaWNPcmRlckNudEJvdHRvbSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKSgtcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOworICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKworICAgICAgICAgICAgLyogc3RlcCAxIChpbiB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIHN0YW5kYXJkKSAqLworICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisKKyAgICAgICAgICAgIC8qIHN0ZXAgMiAqLworICAgICAgICAgICAgaWYgKHNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQorICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtID0gZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtID0gMDsKKworICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCAmJiBhYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gLT0gMTsKKworICAgICAgICAgICAgLyogc3RlcCAzICovCisgICAgICAgICAgICBpZiAoYWJzRnJhbWVOdW0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpY09yZGVyQ250Q3ljbGVDbnQgPQorICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKS9zcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgICAgICBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSA9CisgICAgICAgICAgICAgICAgICAgIChhYnNGcmFtZU51bSAtIDEpJXNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdGVwIDQgKi8KKyAgICAgICAgICAgIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07CisKKyAgICAgICAgICAgIC8qIHN0ZXAgNSAocGljT3JkZXJDbnQgdXNlZCB0byBzdG9yZSBleHBlY3RlZFBpY09yZGVyQ250KSAqLworICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudEN5Y2xlQ250KSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUpIGFsd2F5cyBpbml0aWFsaXplZCAqLworICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9CisgICAgICAgICAgICAgICAgICAgIChpMzIpcGljT3JkZXJDbnRDeWNsZUNudCAqIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JSZWZGcmFtZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisKKyAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JOb25SZWZQaWM7CisKKyAgICAgICAgICAgIC8qIHN0ZXAgNiAocGljT3JkZXJDbnQgaXMgdG9wIGZpZWxkIG9yZGVyIGNudCBpZiBkZWx0YSBmb3IgYm90dG9tCisgICAgICAgICAgICAgKiBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIGl0IGlzIGJvdHRvbSBmaWVsZCBvcmRlciBjbnQpICovCisgICAgICAgICAgICBwaWNPcmRlckNudCArPSBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF07CisKKyAgICAgICAgICAgIGlmICggKHNwcy0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCisgICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKworICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSBjb250YWlucyBtbWNvNSAtPiBzZXQgcHJldkZyYW1lTnVtT2Zmc2V0IGFuZAorICAgICAgICAgICAgICogcHJldkZyYW1lTnVtIHRvIDAgZm9yIGNvbXB1dGF0aW9uIG9mIHBpY09yZGVyQ250IG9mIG5leHQKKyAgICAgICAgICAgICAqIGZyYW1lLCBvdGhlcndpc2Ugc3RvcmUgZnJhbWVOdW0gYW5kIGZyYW1lTnVtT2Zmc2V0IHRvIHBvYworICAgICAgICAgICAgICogc3RydWN0dXJlICovCisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zTW1jbzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gMDsKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDIgKi8KKyAgICAgICAgICAgIC8qIGRlcml2ZSBmcmFtZU51bU9mZnNldCAqLworICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCisgICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisKKyAgICAgICAgICAgIC8qIGRlcml2ZSBwaWNPcmRlckNudCAodHlwZSAyIGhhcyBzYW1lIHZhbHVlIGZvciB0b3AgYW5kIGJvdHRvbQorICAgICAgICAgICAgICogZmllbGQgb3JkZXIgY250cykgKi8KKyAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9CisgICAgICAgICAgICAgICAgICAgIDIgKiAoaTMyKShmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pIC0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9CisgICAgICAgICAgICAgICAgICAgIDIgKiAoaTMyKShmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOworCisgICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKKyAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0CisgICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKKyAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICAvKmxpbnQgLWVzeW0oNjQ0LHBpY09yZGVyQ250KSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KKyAgICByZXR1cm4ocGljT3JkZXJDbnQpOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5NzQxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc3RydWN0dXJlIHRvIHN0b3JlIGluZm9ybWF0aW9uIGNvbXB1dGVkIGZvciBwcmV2aW91cyBwaWN0dXJlLCBuZWVkZWQgZm9yCisgKiBQT0MgY29tcHV0YXRpb24gb2YgYSBwaWN0dXJlLiBUd28gZmlyc3QgZmllbGRzIGZvciBQT0MgdHlwZSAwLCBsYXN0IHR3bworICogZm9yIHR5cGVzIDEgYW5kIDIgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHByZXZQaWNPcmRlckNudExzYjsKKyAgICBpMzIgcHJldlBpY09yZGVyQ250TXNiOworICAgIHUzMiBwcmV2RnJhbWVOdW07CisgICAgdTMyIHByZXZGcmFtZU51bU9mZnNldDsKK30gcG9jU3RvcmFnZV90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2kzMiBoMjY0YnNkRGVjb2RlUGljT3JkZXJDbnQocG9jU3RvcmFnZV90ICpwb2MsIHNlcVBhcmFtU2V0X3QgKnNwcywKKyAgICBzbGljZUhlYWRlcl90ICpzbGljZUhlYWRlciwgbmFsVW5pdF90ICpwTmFsVW5pdCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDRkZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYwpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbG9va3VwIHRhYmxlIGZvciBjZWlsKGxvZzIobnVtU2xpY2VHcm91cHMpKSwgaS5lLiBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8KKyAqIHJlcHJlc2VudCByYW5nZSBbMCwgbnVtU2xpY2VHcm91cHMpCisgKgorICogTk9URTogaWYgTUFYX05VTV9TTElDRV9HUk9VUFMgaXMgaGlnaGVyIHRoYW4gOCB0aGlzIHRhYmxlIGhhcyB0byBiZSByZXNpemVkCisgKiBhY2NvcmRpbmdseSAqLworc3RhdGljIGNvbnN0IHUzMiBDZWlsTG9nMk51bVNsaWNlR3JvdXBzWzhdID0gezEsIDEsIDIsIDIsIDMsIDMsIDMsIDN9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgICAgIEZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yCisgICAgICAgICAgICAgICAgLSBydW4gbGVuZ3RocyBpZiBzbGljZSBncm91cCBtYXAgdHlwZSBpcyAwCisgICAgICAgICAgICAgICAgLSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0IGFycmF5cyBpZiBtYXAgdHlwZSBpcyAyCisgICAgICAgICAgICAgICAgLSBmb3Igc2xpY2UgZ3JvdXAgaWRzIGlmIG1hcCB0eXBlIGlzIDYKKworICAgICAgICAgICAgVmFsaWRpdHkgb2Ygc29tZSBvZiB0aGUgc2xpY2UgZ3JvdXAgbWFwcGluZyBpbmZvcm1hdGlvbiBkZXBlbmRzCisgICAgICAgICAgICBvbiB0aGUgaW1hZ2UgZGltZW5zaW9ucyB3aGljaCBhcmUgbm90IGtub3duIGhlcmUuIFRoZXJlZm9yZSB0aGUKKyAgICAgICAgICAgIHZhbGlkaXR5IGhhcyB0byBiZSBjaGVja2VkIGFmdGVyd2FyZHMsIGN1cnJlbnRseSBpbiB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICBzZXQgYWN0aXZhdGlvbiBwaGFzZS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIGRlY29kZWQgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBpbnZhbGlkIGluZm9ybWF0aW9uIG9yIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVQaWNQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldCk7CisKKworICAgIEgyNjRTd0RlY01lbXNldChwUGljUGFyYW1TZXQsIDAsIHNpemVvZihwaWNQYXJhbVNldF90KSk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkID49IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19wYXJhbWV0ZXJfc2V0X2lkIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkID49IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCisgICAgeworICAgICAgICBFUFJJTlQoInNlcV9wYXJhbV9zZXRfaWQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZywgc2hhbGwgYmUgMCBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCkKKyAgICB7CisgICAgICAgIEVQUklOVCgiZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIC8qIG51bV9zbGljZV9ncm91cHNfbWludXMxICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA9IHZhbHVlICsgMTsKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogZGVjb2RlIHNsaWNlIGdyb3VwIG1hcHBpbmcgaW5mb3JtYXRpb24gaWYgbW9yZSB0aGFuIG9uZSBzbGljZSBncm91cHMgKi8KKyAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IDEpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfbWFwX3R5cGUiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFMTE9DQVRFKHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoLAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5ydW5MZW5ndGggPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aFtpXSA9IHZhbHVlKzE7CisgICAgICAgICAgICAgICAgLyogcGFyYW0gdmFsdWVzIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT50b3BMZWZ0LAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxLCB1MzIpOworICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodCwKKyAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzIC0gMSwgdTMyKTsKKyAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnRvcExlZnQgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+Ym90dG9tUmlnaHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT50b3BMZWZ0W2ldID0gdmFsdWU7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodFtpXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlcyBjaGVja2VkIGluIENoZWNrUHBzKCkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMykgfHwKKyAgICAgICAgICAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDQpIHx8CisgICAgICAgICAgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA1KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyA9CisgICAgICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA9IHZhbHVlICsgMTsKKyAgICAgICAgICAgIC8qIHBhcmFtIHZhbHVlIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0cyA9IHZhbHVlICsgMTsKKworICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWQsCisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5waWNTaXplSW5NYXBVbml0cywgdTMyKTsKKyAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHJhbmdlCisgICAgICAgICAgICAgKiBbMCwgbnVtU2xpY2VHcm91cHMpICovCisgICAgICAgICAgICB0bXAgPSBDZWlsTG9nMk51bVNsaWNlR3JvdXBzW3BQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMtMV07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwSWRbaV0gPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRtcCk7CisgICAgICAgICAgICAgICAgaWYgKCBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZFtpXSA+PQorICAgICAgICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX2lkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID4gMzEpCisgICAgeworICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwUGljUGFyYW1TZXQtPm51bVJlZklkeEwwQWN0aXZlID0gdmFsdWUgKyAxOworCisgICAgLyogbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICh2YWx1ZSA+IDMxKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiB3ZWlnaHRlZF9wcmVkX2ZsYWcsIHRoaXMgc2hhbGwgYmUgMCBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCkKKyAgICB7CisgICAgICAgIEVQUklOVCgid2VpZ2h0ZWRfcHJlZF9mbGFnIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICAvKiB3ZWlnaHRlZF9iaXByZWRfaWRjICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKKyAgICBpZiAodG1wID4gMikKKyAgICB7CisgICAgICAgIEVQUklOVCgid2VpZ2h0ZWRfYmlwcmVkX2lkYyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogcGljX2luaXRfcXBfbWludXMyNiAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmICgoaXRtcCA8IC0yNikgfHwgKGl0bXAgPiAyNSkpCisgICAgeworICAgICAgICBFUFJJTlQoInBpY19pbml0X3FwX21pbnVzMjYiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKyAgICBwUGljUGFyYW1TZXQtPnBpY0luaXRRcCA9ICh1MzIpKGl0bXAgKyAyNik7CisKKyAgICAvKiBwaWNfaW5pdF9xc19taW51czI2ICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSkKKyAgICB7CisgICAgICAgIEVQUklOVCgicGljX2luaXRfcXNfbWludXMyNiIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKChpdG1wIDwgLTEyKSB8fCAoaXRtcCA+IDEyKSkKKyAgICB7CisgICAgICAgIEVQUklOVCgiY2hyb21hX3FwX2luZGV4X29mZnNldCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIHBQaWNQYXJhbVNldC0+Y2hyb21hUXBJbmRleE9mZnNldCA9IGl0bXA7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQaWNQYXJhbVNldC0+ZGVibG9ja2luZ0ZpbHRlckNvbnRyb2xQcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFBpY1BhcmFtU2V0LT5jb25zdHJhaW5lZEludHJhUHJlZEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHBTdHJtRGF0YSk7CisKKyAgICAvKiBpZ25vcmUgcG9zc2libGUgZXJyb3JzIGluIHRyYWlsaW5nIGJpdHMgb2YgcGFyYW1ldGVycyBzZXRzICovCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjMyODYzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0gKKyNkZWZpbmUgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBQUFMgaW5mb3JtYXRpb24gZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHBpY1BhcmFtZXRlclNldElkOworICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKKyAgICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZzsKKyAgICB1MzIgbnVtU2xpY2VHcm91cHM7CisgICAgdTMyIHNsaWNlR3JvdXBNYXBUeXBlOworICAgIHUzMiAqcnVuTGVuZ3RoOworICAgIHUzMiAqdG9wTGVmdDsKKyAgICB1MzIgKmJvdHRvbVJpZ2h0OworICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGU7CisgICAgdTMyIHBpY1NpemVJbk1hcFVuaXRzOworICAgIHUzMiAqc2xpY2VHcm91cElkOworICAgIHUzMiBudW1SZWZJZHhMMEFjdGl2ZTsKKyAgICB1MzIgcGljSW5pdFFwOworICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0OworICAgIHUzMiBkZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnOworICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWc7CisgICAgdTMyIHJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnOworfSBwaWNQYXJhbVNldF90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5NDg3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpAQCAtMCwwICsxLDIzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfcmVjb25zdHJ1Y3QuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKyNpZmRlZiBIMjY0REVDX09NWERMCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorI2luY2x1ZGUgImFybVZDLmgiCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2l0Y2ggb2ZmIHRoZSBmb2xsb3dpbmcgTGludCBtZXNzYWdlcyBmb3IgdGhpcyBmaWxlOgorICogSW5mbyA3MDE6IFNoaWZ0IGxlZnQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCisgKiBJbmZvIDcwMjogU2hpZnQgcmlnaHQgb2Ygc2lnbmVkIHF1YW50aXR5IChpbnQpCisgKi8KKy8qbGludCAtZTcwMSAtZTcwMiAqLworCisvKiBMdW1hIGZyYWN0aW9uYWwtc2FtcGxlIHBvc2l0aW9ucworICoKKyAqICBHIGEgYiBjIEgKKyAqICBkIGUgZiBnCisgKiAgaCBpIGogayBtCisgKiAgbiBwIHEgcgorICogIE0gICBzICAgTgorICoKKyAqICBHLCBILCBNIGFuZCBOIGFyZSBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbnMKKyAqICBhLXMgYXJlIGZyYWN0aW9uYWwgc2FtcGxlcyB0aGF0IG5lZWQgdG8gYmUgaW50ZXJwb2xhdGVkLgorICovCisjaWZuZGVmIEgyNjRERUNfT01YREwKK3N0YXRpYyBjb25zdCB1MzIgbHVtYUZyYWNQb3NbNF1bNF0gPSB7CisgIC8qIEcgIGQgIGggIG4gICAgYSAgZSAgaSAgcCAgICBiICBmICBqICAgcSAgICAgYyAgIGcgICBrICAgciAqLworICAgIHswLCAxLCAyLCAzfSwgezQsIDUsIDYsIDd9LCB7OCwgOSwgMTAsIDExfSwgezEyLCAxMywgMTQsIDE1fX07CisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisvKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLworZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0REVDX09NWERMCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIGhvcml6b250YWwgZGlyZWN0aW9uLgorICAgICAgICAgIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocFJlZikgaXMKKyAgICAgICAgICByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvCisgICAgICAgICAgbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIHBSZWYgICAgICAgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIGZyYW1lIENiIHRvcC1sZWZ0IGNvcm5lcgorICAgICAgICAgIHgwICAgICAgICAgICAgICAgIGludGVnZXIgeC1jb29yZGluYXRlIGZvciBwcmVkaWN0aW9uCisgICAgICAgICAgeTAgICAgICAgICAgICAgICAgaW50ZWdlciB5LWNvb3JkaW5hdGUgZm9yIHByZWRpY3Rpb24KKyAgICAgICAgICB3aWR0aCAgICAgICAgICAgICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGNocm9taW5hbmNlIGluIHBpeGVscworICAgICAgICAgIGhlaWdodCAgICAgICAgICAgIGhlaWdodCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGNocm9taW5hbmNlIGluIHBpeGVscworICAgICAgICAgIHhGcmFjICAgICAgICAgICAgIGhvcml6b250YWwgZnJhY3Rpb24gZm9yIHByZWRpY3Rpb24gaW4gMS84IHBpeGVscworICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCAgIHdpZHRoIG9mIHRoZSBwcmVkaWN0ZWQgcGFydCBpbiBwaXhlbHMKKyAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICBoZWlnaHQgb2YgdGhlIHByZWRpY3RlZCBwYXJ0IGluIHBpeGVscworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIHByZWRQYXJ0Q2hyb21hICAgIHBvaW50ZXIgd2hlcmUgcHJlZGljdGVkIHBhcnQgaXMgd3JpdHRlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX0FSTTExCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcigKKyAgdTggKnBSZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHhGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgYywgdmFsOworICAgIHU4ICpwdHJBLCAqY2JyOworICAgIHUzMiBjb21wOworICAgIHU4IGJsb2NrWzkqOCoyXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKKyAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7CisgICAgQVNTRVJUKHhGcmFjIDwgOCk7CisgICAgQVNTRVJUKHBSZWYpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoICsgMSwgY2hyb21hUGFydEhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSk7CisgICAgICAgIHBSZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2sgKyAoY2hyb21hUGFydFdpZHRoKzEpKmNocm9tYVBhcnRIZWlnaHQsCisgICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEsCisgICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKKworICAgICAgICBwUmVmID0gYmxvY2s7CisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aCsxOworICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0OworICAgIH0KKworICAgIHZhbCA9IDggLSB4RnJhYzsKKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQorICAgIHsKKworICAgICAgICBwdHJBID0gcFJlZiArIChjb21wICogaGVpZ2h0ICsgKHUzMil5MCkgKiB3aWR0aCArIHgwOworICAgICAgICBjYnIgPSBwcmVkUGFydENocm9tYSArIGNvbXAgKiA4ICogODsKKworICAgICAgICAvKiAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCisgICAgICAgICAqIGJpbGluZWFyIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMSA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDIgPSAqcHRyQSsrOworICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXA0ID0gKnB0ckErKzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeEZyYWMgKiB0bXAzKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHhGcmFjICogdG1wNCkgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOworICAgICAgICAgICAgICAgIHRtcDEgPSBwdHJBW3dpZHRoXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gKnB0ckE7CisgICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMyArIHhGcmFjICogdG1wMSkgPDwgMykgKyAzMjsKKyAgICAgICAgICAgICAgICBjID4+PSA2OworICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDQgKyB4RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gdmVydGljYWwgZGlyZWN0aW9uLgorICAgICAgICAgIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocFJlZikgaXMKKyAgICAgICAgICByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvCisgICAgICAgICAgbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIoCisgIHU4ICpwUmVmLAorICB1OCAqcHJlZFBhcnRDaHJvbWEsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiB5RnJhYywKKyAgdTMyIGNocm9tYVBhcnRXaWR0aCwKKyAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHgsIHksIHRtcDEsIHRtcDIsIHRtcDMsIGMsIHZhbDsKKyAgICB1OCAqcHRyQSwgKmNicjsKKyAgICB1MzIgY29tcDsKKyAgICB1OCBibG9ja1s5KjgqMl07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOworICAgIEFTU0VSVCh5RnJhYyA8IDgpOworICAgIEFTU0VSVChwUmVmKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtjaHJvbWFQYXJ0V2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCsxID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLAorICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCk7CisgICAgICAgIHBSZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socFJlZiwgYmxvY2sgKyBjaHJvbWFQYXJ0V2lkdGgqKGNocm9tYVBhcnRIZWlnaHQrMSksCisgICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGgpOworCisgICAgICAgIHBSZWYgPSBibG9jazsKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoOworICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0KzE7CisgICAgfQorCisgICAgdmFsID0gOCAtIHlGcmFjOworCisgICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCisgICAgeworCisgICAgICAgIHB0ckEgPSBwUmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7CisgICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OworCisgICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICAgICAgICogYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLworICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDEgPSAqcHRyQSsrOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB5RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeUZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7CisgICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICAgICAgdG1wMiA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDEgPSAqcHRyQSsrOworICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDIgKyB5RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7CisgICAgICAgICAgICAgICAgYyA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKKyAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAxICsgeUZyYWMgKiB0bXAyKSA8PCAzKSArIDMyOworICAgICAgICAgICAgICAgIGMgPj49IDY7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnIgKz0gMio4IC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICAgICAgcHRyQSArPSAyKndpZHRoIC0gY2hyb21hUGFydFdpZHRoOworICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGNocm9tYSBpbnRlcnBvbGF0aW9uIGluIGhvcml6b250YWwgYW5kCisgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jaydzIGNocm9taW5hbmNlIChwcmVkUGFydENocm9tYSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIoCisgIHU4ICpyZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHhGcmFjLAorICB1MzIgeUZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQoreworICAgIHU4IGJsb2NrWzkqOSoyXTsKKyAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdmFsWCwgdmFsWSwgcGx1czMyID0gMzI7CisgICAgdTMyIGNvbXA7CisgICAgdTggKnB0ckEsICpjYnI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwcmVkUGFydENocm9tYSk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRXaWR0aCk7CisgICAgQVNTRVJUKGNocm9tYVBhcnRIZWlnaHQpOworICAgIEFTU0VSVCh4RnJhYyA8IDgpOworICAgIEFTU0VSVCh5RnJhYyA8IDgpOworICAgIEFTU0VSVChyZWYpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2Nocm9tYVBhcnRIZWlnaHQrMSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgYmxvY2ssIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCArIDEsIGNocm9tYVBhcnRIZWlnaHQgKyAxLCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKKyAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgYmxvY2sgKyAoY2hyb21hUGFydFdpZHRoKzEpKihjaHJvbWFQYXJ0SGVpZ2h0KzEpLAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxLAorICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCArIDEpOworCisgICAgICAgIHJlZiA9IGJsb2NrOworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGgrMTsKKyAgICAgICAgaGVpZ2h0ID0gY2hyb21hUGFydEhlaWdodCsxOworICAgIH0KKworICAgIHZhbFggPSA4IC0geEZyYWM7CisgICAgdmFsWSA9IDggLSB5RnJhYzsKKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPD0gMTsgY29tcCsrKQorICAgIHsKKworICAgICAgICBwdHJBID0gcmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7CisgICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OworCisgICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KKyAgICAgICAgICogYmlsaW5lYXIgdmVydGljYWwgYW5kIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLworICAgICAgICBmb3IgKHkgPSAoY2hyb21hUGFydEhlaWdodCA+PiAxKTsgeTsgeS0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAxID0gKnB0ckE7CisgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICB0bXA1ID0gcHRyQVt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDEgKj0gdmFsWTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMyAqIHlGcmFjOworICAgICAgICAgICAgdG1wMyAqPSB2YWxZOworICAgICAgICAgICAgdG1wMyArPSB0bXA1ICogeUZyYWM7CisgICAgICAgICAgICBmb3IgKHggPSAoY2hyb21hUGFydFdpZHRoID4+IDEpOyB4OyB4LS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wMiA9ICorK3B0ckE7CisgICAgICAgICAgICAgICAgdG1wNCA9IHB0ckFbd2lkdGhdOworICAgICAgICAgICAgICAgIHRtcDYgPSBwdHJBW3dpZHRoKjJdOworICAgICAgICAgICAgICAgIHRtcDIgKj0gdmFsWTsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDQgKiB5RnJhYzsKKyAgICAgICAgICAgICAgICB0bXA0ICo9IHZhbFk7CisgICAgICAgICAgICAgICAgdG1wNCArPSB0bXA2ICogeUZyYWM7CisgICAgICAgICAgICAgICAgdG1wMSA9IHRtcDEgKiB2YWxYICsgcGx1czMyOworICAgICAgICAgICAgICAgIHRtcDMgPSB0bXAzICogdmFsWCArIHBsdXMzMjsKKyAgICAgICAgICAgICAgICB0bXAxICs9IHRtcDIgKiB4RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAxID4+PSA2OworICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNCAqIHhGcmFjOworICAgICAgICAgICAgICAgIHRtcDMgPj49IDY7CisgICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KXRtcDM7CisgICAgICAgICAgICAgICAgKmNicisrID0gKHU4KXRtcDE7CisKKyAgICAgICAgICAgICAgICB0bXAxID0gKisrcHRyQTsKKyAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aF07CisgICAgICAgICAgICAgICAgdG1wNSA9IHB0ckFbd2lkdGgqMl07CisgICAgICAgICAgICAgICAgdG1wMSAqPSB2YWxZOworICAgICAgICAgICAgICAgIHRtcDEgKz0gdG1wMyAqIHlGcmFjOworICAgICAgICAgICAgICAgIHRtcDMgKj0gdmFsWTsKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDUgKiB5RnJhYzsKKyAgICAgICAgICAgICAgICB0bXAyID0gdG1wMiAqIHZhbFggKyBwbHVzMzI7CisgICAgICAgICAgICAgICAgdG1wNCA9IHRtcDQgKiB2YWxYICsgcGx1czMyOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wMSAqIHhGcmFjOworICAgICAgICAgICAgICAgIHRtcDIgPj49IDY7CisgICAgICAgICAgICAgICAgdG1wNCArPSB0bXAzICogeEZyYWM7CisgICAgICAgICAgICAgICAgdG1wNCA+Pj0gNjsKKyAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpdG1wNDsKKyAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpdG1wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBQcmVkaWN0Q2hyb21hCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBUb3AgbGV2ZWwgY2hyb21hIHByZWRpY3Rpb24gZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLiBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgUHJlZGljdENocm9tYSgKKyAgdTggKm1iUGFydENocm9tYSwKKyAgdTMyIHhBTCwKKyAgdTMyIHlBTCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHhGcmFjLCB5RnJhYywgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0OworICAgIGkzMiB4SW50LCB5SW50OworICAgIHU4ICpyZWY7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtdik7CisgICAgQVNTRVJUKHJlZlBpYyk7CisgICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7CisgICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOworICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7CisKKyAgICB3aWR0aCAgPSA4ICogcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSA4ICogcmVmUGljLT5oZWlnaHQ7CisKKyAgICB4SW50ID0gKHhBTCA+PiAxKSArIChtdi0+aG9yID4+IDMpOworICAgIHlJbnQgPSAoeUFMID4+IDEpICsgKG12LT52ZXIgPj4gMyk7CisgICAgeEZyYWMgPSBtdi0+aG9yICYgMHg3OworICAgIHlGcmFjID0gbXYtPnZlciAmIDB4NzsKKworICAgIGNocm9tYVBhcnRXaWR0aCAgPSBwYXJ0V2lkdGggPj4gMTsKKyAgICBjaHJvbWFQYXJ0SGVpZ2h0ID0gcGFydEhlaWdodCA+PiAxOworICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIDI1NiAqIHJlZlBpYy0+d2lkdGggKiByZWZQaWMtPmhlaWdodDsKKworICAgIGlmICh4RnJhYyAmJiB5RnJhYykKKyAgICB7CisgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCB4RnJhYywgeUZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7CisgICAgfQorICAgIGVsc2UgaWYgKHhGcmFjKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIHhGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOworICAgIH0KKyAgICBlbHNlIGlmICh5RnJhYykKKyAgICB7CisgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcihyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCB5RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIG1iUGFydENocm9tYSwgeEludCwgeUludCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCwgOCk7CisgICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIG1iUGFydENocm9tYSArIDgqOCwgeEludCwgeUludCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCwgOCk7CisgICAgfQorCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2gnCisgICAgICAgICAgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQorICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0CisgICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19BUk0xMQordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KQoreworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHUzMiBpLCBqOworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHU4ICpwdHJDLCAqcHRyVjsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGg7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBwdHJDID0gcmVmICsgd2lkdGg7CisgICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOworCisgICAgLyogNCBwaXhlbHMgcGVyIGl0ZXJhdGlvbiwgaW50ZXJwb2xhdGUgdXNpbmcgNSB2ZXJ0aWNhbCBzYW1wbGVzICovCisgICAgZm9yIChpID0gKHBhcnRIZWlnaHQgPj4gMik7IGk7IGktLSkKKyAgICB7CisgICAgICAgIC8qIGgxID0gKDE2ICsgQSArIDE2KEcrTSkgKyA0KEcrTSkgLSA0KEMrUikgLSAoQytSKSArIFQpID4+IDUgKi8KKyAgICAgICAgZm9yIChqID0gcGFydFdpZHRoOyBqOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7CisgICAgICAgICAgICB0bXAzID0gcHRyQ1t3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiArPSB0bXAzOworICAgICAgICAgICAgdG1wMiA9IGNscFt0bXAyPj41XTsKKyAgICAgICAgICAgIHRtcDEgKz0gMTY7CisgICAgICAgICAgICBtYls0OF0gPSAodTgpdG1wMjsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj41XTsKKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpdG1wMTsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICBtYlsxNl0gPSAodTgpdG1wNjsKKworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKKyAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7CisgICAgICAgICAgICBwdHJDKys7CisgICAgICAgIH0KKyAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdkJworICAgICAgICAgIG9yICduJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCisgICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKKyAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiB2ZXJPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGQsIDEgZm9yIHBpeGVsIG4gKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgaSwgajsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB1OCAqcHRyQywgKnB0clYsICpwdHJJbnQ7CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGggPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoOworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgcHRyQyA9IHJlZiArIHdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKKworICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBNIG9yIFIgKi8KKyAgICBwdHJJbnQgPSBwdHJDICsgKDIrdmVyT2Zmc2V0KSp3aWR0aDsKKworICAgIC8qIDQgcGl4ZWxzIHBlciBpdGVyYXRpb24KKyAgICAgKiBpbnRlcnBvbGF0ZSB1c2luZyA1IHZlcnRpY2FsIHNhbXBsZXMgYW5kIGF2ZXJhZ2UgYmV0d2VlbgorICAgICAqIGludGVycG9sYXRlZCB2YWx1ZSBhbmQgaW50ZWdlciBzYW1wbGUgdmFsdWUgKi8KKyAgICBmb3IgKGkgPSAocGFydEhlaWdodCA+PiAyKTsgaTsgaS0tKQorICAgIHsKKyAgICAgICAgLyogaDEgPSAoMTYgKyBBICsgMTYoRytNKSArIDQoRytNKSAtIDQoQytSKSAtIChDK1IpICsgVCkgPj4gNSAqLworICAgICAgICBmb3IgKGogPSBwYXJ0V2lkdGg7IGo7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjVdOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDEgKz0gMTY7CisgICAgICAgICAgICB0bXAyKys7CisgICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXAyICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+NV07CisgICAgICAgICAgICB0bXA3ID0gcHRySW50W3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXAxKys7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXAxICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludDsKKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICB0bXA2Kys7CisgICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICB0bXA3ID0gcHRySW50Wy0oaTMyKXdpZHRoXTsKKyAgICAgICAgICAgIHRtcDUrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgcHRyQysrOworICAgICAgICAgICAgcHRySW50Kys7CisgICAgICAgIH0KKyAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIHB0ckludCArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsIHBvc2l0aW9uICdiJworICAgICAgICAgIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCkKK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1OCAqcHRySjsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworICAgIEFTU0VSVCgocGFydFdpZHRoJjB4MykgPT0gMCk7CisgICAgQVNTRVJUKChwYXJ0SGVpZ2h0JjB4MykgPT0gMCk7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoICsgNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIHB0ckogPSByZWYgKyA1OworCisgICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA2OworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDQgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXAzICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNDsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wMzsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2EnCisgICAgICAgICAgb3IgJ2MnIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKKyAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAorICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcigKKyAgdTggKnJlZiwKKyAgdTggKm1iLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgcGFydFdpZHRoLAorICB1MzIgcGFydEhlaWdodCwKKyAgdTMyIGhvck9mZnNldCkgLyogMCBmb3IgcGl4ZWwgYSwgMSBmb3IgcGl4ZWwgYyAqLworeworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHU4ICpwdHJKOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoICsgNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIHB0ckogPSByZWYgKyA1OworCisgICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCisgICAgICAgICAgICAgICAgdG1wNiArPSB0bXA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcDYgKz0gdG1wMzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNiArIDEpID4+IDEpOworICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07CisgICAgICAgICAgICB0bXA0ICs9IDE2OworICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCisgICAgICAgICAgICAgICAgdG1wNSArPSB0bXAzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcDUgKz0gdG1wMjsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIDEpID4+IDEpOworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0Pj41XTsKKyAgICAgICAgICAgIHRtcDMgKz0gMTY7CisgICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKKyAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG1wNCArPSB0bXAxOworICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA0ICsgMSkgPj4gMSk7CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKKyAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQorICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAzICs9IHRtcDY7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDMgKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKKyAgICAgICAgICBwb3NpdGlvbiAnZScsICdnJywgJ3AnIG9yICdyJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5CisgICAgICAgICAgaWYgbmVlZGVkLiBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZAorICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JWZXJPZmZzZXQpIC8qIDAgZm9yIHBpeGVsIGUsIDEgZm9yIHBpeGVsIGcsCisgICAgICAgICAgICAgICAgICAgICAgIDIgZm9yIHBpeGVsIHAsIDMgZm9yIHBpeGVsIHIgKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1OCAqcHRyQywgKnB0ckosICpwdHJWOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OworICAgIH0KKworICAgIC8qIFJlZiBwb2ludHMgdG8gRyArICgtMiwgLTIpICovCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICAvKiBwdHJKIHBvaW50cyB0byBlaXRoZXIgSiBvciBRLCBkZXBlbmRpbmcgb24gdmVydGljYWwgb2Zmc2V0ICovCisgICAgcHRySiA9IHJlZiArICgoKGhvclZlck9mZnNldCAmIDB4MikgPj4gMSkgKyAyKSAqIHdpZHRoICsgNTsKKworICAgIC8qIHB0ckMgcG9pbnRzIHRvIGVpdGhlciBDIG9yIEQsIGRlcGVuZGluZyBvbiBob3Jpem9udGFsIG9mZnNldCAqLworICAgIHB0ckMgPSByZWYgKyB3aWR0aCArIDIgKyAoaG9yVmVyT2Zmc2V0ICYgMHgxKTsKKworICAgIGZvciAoeSA9IHBhcnRIZWlnaHQ7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworCisgICAgICAgIC8qIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbiwgY2FsY3VsYXRlIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDYgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNj4+NV07CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDUgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA2OworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDQgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA1OworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXAzICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNDsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzPj41XTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wMzsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKKyAgICAgICAgbWIgKz0gMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCisgICAgbWIgLT0gMTYqcGFydEhlaWdodDsKKyAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7CisKKyAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgLyogVmVydGljYWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnaW5nLCA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07CisgICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOworCisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7CisgICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMiAtPSB0bXA3OworICAgICAgICAgICAgdG1wMiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDI+PjVdOworICAgICAgICAgICAgdG1wMiA9IG1iWzQ4XTsKKyAgICAgICAgICAgIHRtcDEgKz0gMTY7CisgICAgICAgICAgICB0bXA3Kys7CisgICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXAyICsgdG1wNykgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1t3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMT4+NV07CisgICAgICAgICAgICB0bXAxID0gbWJbMzJdOworICAgICAgICAgICAgdG1wNiArPSAxNjsKKyAgICAgICAgICAgIHRtcDcrKzsKKyAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDEgKyB0bXA3KSA+PiAxKTsKKworICAgICAgICAgICAgdG1wMSA9ICpwdHJDOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA2Pj41XTsKKyAgICAgICAgICAgIHRtcDYgPSBtYlsxNl07CisgICAgICAgICAgICB0bXA1ICs9IDE2OworICAgICAgICAgICAgdG1wNysrOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOworCisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDU+PjVdOworICAgICAgICAgICAgdG1wNSA9ICptYjsKKyAgICAgICAgICAgIHRtcDcrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgcHRyQysrOworCisgICAgICAgIH0KKyAgICAgICAgcHRyQyArPSA0KndpZHRoIC0gcGFydFdpZHRoOworICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7CisgICAgfQorCit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKKyAgICAgICAgICBwb3NpdGlvbiAnaicgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuCisgICAgICAgICAgUmVmZXJlbmNlIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZAorICAgICAgICAgIHBhcnQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KQoreworICAgIHUzMiBwMVsyMSoyMS80KzFdOworICAgIHUzMiB4LCB5OworICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIGkzMiAqcHRyQywgKnB0clYsICpiMTsKKyAgICB1OCAgKnB0cko7CisgICAgaTMyIHRhYmxlWzIxKjE2XTsKKyAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7CisKKyAgICAvKiBDb2RlICovCisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQobWIpOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCisgICAgeworICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKKworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgcmVmID0gKHU4KilwMTsKKyAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKKyAgICB9CisKKyAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKKworICAgIGIxID0gdGFibGU7CisgICAgcHRySiA9IHJlZiArIDU7CisKKyAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKKyAgICAgKiBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0ICsgNTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisKKyAgICAgICAgLyogNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KKyAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICAqYjErKyA9IHRtcDY7CisgICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OworICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXA3OworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgKmIxKysgPSB0bXA1OworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNCArPSB0bXA1OworICAgICAgICAgICAgKmIxKysgPSB0bXA0OworICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOworICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wNDsKKyAgICAgICAgICAgICpiMSsrID0gdG1wMzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0OworICAgICAgICAgICAgdG1wNCA9IHRtcDY7CisgICAgICAgICAgICB0bXA2ID0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA3OworICAgICAgICAgICAgdG1wMyA9IHRtcDU7CisgICAgICAgICAgICB0bXA1ID0gdG1wMTsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOworICAgIH0KKworICAgIC8qIFNlY29uZCBzdGVwOiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLworICAgIHB0ckMgPSB0YWJsZSArIHBhcnRXaWR0aDsKKyAgICBwdHJWID0gcHRyQyArIDUqcGFydFdpZHRoOworICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCisgICAgeworICAgICAgICAvKiA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLworICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgPSBwdHJWW3BhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAyID0gcHRyVltwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDIgKz0gNTEyOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OworICAgICAgICAgICAgdG1wMyA9IHB0ckNbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDI+PjEwXTsKKyAgICAgICAgICAgIHRtcDEgKz0gNTEyOworICAgICAgICAgICAgbWJbNDhdID0gKHU4KXRtcDc7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1twYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDE+PjEwXTsKKyAgICAgICAgICAgIHRtcDYgKz0gNTEyOworICAgICAgICAgICAgbWJbMzJdID0gKHU4KXRtcDc7CisKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNj4+MTBdOworICAgICAgICAgICAgdG1wNSArPSA1MTI7CisgICAgICAgICAgICBtYlsxNl0gPSAodTgpdG1wNzsKKworICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpcGFydFdpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDE7CisgICAgICAgICAgICB0bXAzICs9IHRtcDI7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKKyAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNT4+MTBdOworICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNzsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgfQorICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOworICAgICAgICBwdHJDICs9IDMqcGFydFdpZHRoOworICAgICAgICBwdHJWICs9IDMqcGFydFdpZHRoOworICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2YnIG9yICdxJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KKyAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCisgICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiB2ZXJPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGYsIDEgZm9yIHBpeGVsIHEgKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBpMzIgKnB0ckMsICpwdHJWLCAqcHRySW50LCAqYjE7CisgICAgdTggICpwdHJKOworICAgIGkzMiB0YWJsZVsyMSoxNl07CisgICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOworCisgICAgLyogQ29kZSAqLworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKG1iKTsKKworICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9ICh1OCopcDE7CisgICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7CisgICAgfQorCisgICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7CisKKyAgICBiMSA9IHRhYmxlOworICAgIHB0ckogPSByZWYgKyA1OworCisgICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCisgICAgICogaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgZm9yICh5ID0gcGFydEhlaWdodCArIDU7IHk7IHktLSkKKyAgICB7CisgICAgICAgIHRtcDYgPSAqKHB0ckogLSA1KTsKKyAgICAgICAgdG1wNSA9ICoocHRySiAtIDQpOworICAgICAgICB0bXA0ID0gKihwdHJKIC0gMyk7CisgICAgICAgIHRtcDMgPSAqKHB0ckogLSAyKTsKKyAgICAgICAgdG1wMiA9ICoocHRySiAtIDEpOworICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOworICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgICpiMSsrID0gdG1wNjsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICAqYjErKyA9IHRtcDU7CisgICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7CisgICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA0IC09IHRtcDc7CisgICAgICAgICAgICB0bXA0ICs9IHRtcDU7CisgICAgICAgICAgICAqYjErKyA9IHRtcDQ7CisgICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOworICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMyAtPSB0bXA3OworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgKmIxKysgPSB0bXAzOworICAgICAgICAgICAgdG1wNyA9IHRtcDQ7CisgICAgICAgICAgICB0bXA0ID0gdG1wNjsKKyAgICAgICAgICAgIHRtcDYgPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IHRtcDc7CisgICAgICAgICAgICB0bXAzID0gdG1wNTsKKyAgICAgICAgICAgIHRtcDUgPSB0bXAxOworICAgICAgICB9CisgICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7CisgICAgfQorCisgICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdlICovCisgICAgcHRyQyA9IHRhYmxlICsgcGFydFdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSpwYXJ0V2lkdGg7CisgICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIE0gb3IgUiAqLworICAgIHB0ckludCA9IHB0ckMgKyAoMit2ZXJPZmZzZXQpKnBhcnRXaWR0aDsKKyAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gcGFydFdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXBhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxID0gcHRyVltwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbcGFydFdpZHRoKjJdOworICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKKyAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyIC09IHRtcDc7CisgICAgICAgICAgICB0bXAyICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3BhcnRXaWR0aCoyXTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFtwYXJ0V2lkdGgqMl07CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOworICAgICAgICAgICAgdG1wMSArPSA1MTI7CisgICAgICAgICAgICB0bXAyKys7CisgICAgICAgICAgICBtYls0OF0gPSAodTgpKCh0bXA3ICsgdG1wMikgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDEgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAxIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDU7CisgICAgICAgICAgICB0bXAyID0gcHRyQ1twYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gcHRySW50W3BhcnRXaWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDI7CisgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOworICAgICAgICAgICAgdG1wNiArPSA1MTI7CisgICAgICAgICAgICB0bXAxKys7CisgICAgICAgICAgICBtYlszMl0gPSAodTgpKCh0bXA3ICsgdG1wMSkgPj4gMSk7CisKKyAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDcgPSAqcHRySW50OworICAgICAgICAgICAgdG1wNiArPSB0bXAxOworICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDUgKz0gNTEyOworICAgICAgICAgICAgdG1wNisrOworICAgICAgICAgICAgbWJbMTZdID0gKHU4KSgodG1wNyArIHRtcDYpID4+IDEpOworCisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wMSArPSB0bXA0OworICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKKyAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKKyAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7CisgICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHB0ckludFstKGkzMilwYXJ0V2lkdGhdOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj4xMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3Pj41XTsKKyAgICAgICAgICAgIHRtcDUrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNyArIHRtcDUpID4+IDEpOworICAgICAgICAgICAgcHRyQysrOworICAgICAgICAgICAgcHRySW50Kys7CisgICAgICAgIH0KKyAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKKyAgICAgICAgcHRyQyArPSAzKnBhcnRXaWR0aDsKKyAgICAgICAgcHRyViArPSAzKnBhcnRXaWR0aDsKKyAgICAgICAgcHRySW50ICs9IDMqcGFydFdpZHRoOworICAgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIG9mIHBpeGVsCisgICAgICAgICAgcG9zaXRpb24gJ2knIG9yICdrJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KKyAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCisgICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIoCisgIHU4ICpyZWYsCisgIHU4ICptYiwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQsCisgIHUzMiBob3JPZmZzZXQpICAgIC8qIDAgZm9yIHBpeGVsIGksIDEgZm9yIHBpeGVsIGsgKi8KK3sKKyAgICB1MzIgcDFbMjEqMjEvNCsxXTsKKyAgICB1MzIgeCwgeTsKKyAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICBpMzIgKnB0ckosICpwdHJJbnQsICpoMTsKKyAgICB1OCAgKnB0ckMsICpwdHJWOworICAgIGkzMiB0YWJsZVsyMSoxNl07CisgICAgaTMyIHRhYmxlV2lkdGggPSAoaTMyKXBhcnRXaWR0aCs1OworICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKKworICAgIC8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChtYik7CisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKKyAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOworCisgICAgICAgIHgwID0gMDsKKyAgICAgICAgeTAgPSAwOworICAgICAgICByZWYgPSAodTgqKXAxOworICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OworICAgIH0KKworICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOworCisgICAgaDEgPSB0YWJsZSArIHRhYmxlV2lkdGg7CisgICAgcHRyQyA9IHJlZiArIHdpZHRoOworICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgorICAgICAqIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICBmb3IgKHkgPSAocGFydEhlaWdodCA+PiAyKTsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gKHUzMil0YWJsZVdpZHRoOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDQgPSBwdHJWWy0oaTMyKXdpZHRoKjJdOworICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpd2lkdGhdOworICAgICAgICAgICAgdG1wMSA9IHB0clZbd2lkdGhdOworICAgICAgICAgICAgdG1wMiA9IHB0clZbd2lkdGgqMl07CisgICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOworICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKKyAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOworICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAyICs9IHRtcDM7CisgICAgICAgICAgICBoMVt0YWJsZVdpZHRoKjJdID0gdG1wMjsKKworICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OworICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKKyAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKKyAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKKyAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKKyAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wMSArPSB0bXAyOworICAgICAgICAgICAgaDFbdGFibGVXaWR0aF0gPSB0bXAxOworCisgICAgICAgICAgICB0bXAxID0gKnB0ckM7CisgICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOworICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA2ICs9IHRtcDE7CisgICAgICAgICAgICAqaDEgPSB0bXA2OworCisgICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMil3aWR0aF07CisgICAgICAgICAgICB0bXAxICs9IHRtcDQ7CisgICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOworICAgICAgICAgICAgdG1wNSAtPSB0bXAxOworICAgICAgICAgICAgdG1wMyArPSB0bXAyOworICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7CisgICAgICAgICAgICB0bXA1ICs9IHRtcDY7CisgICAgICAgICAgICBoMVstdGFibGVXaWR0aF0gPSB0bXA1OworICAgICAgICAgICAgaDErKzsKKyAgICAgICAgICAgIHB0ckMrKzsKKyAgICAgICAgfQorICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGggLSA1OworICAgICAgICBwdHJWICs9IDQqd2lkdGggLSBwYXJ0V2lkdGggLSA1OworICAgICAgICBoMSArPSAzKnRhYmxlV2lkdGg7CisgICAgfQorCisgICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSBob3Jpem9udGFsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2UgKi8KKyAgICBwdHJKID0gdGFibGUgKyA1OworICAgIC8qIFBvaW50ZXIgdG8gaW50ZWdlciBzYW1wbGUgcG9zaXRpb24sIGVpdGhlciBHIG9yIEggKi8KKyAgICBwdHJJbnQgPSB0YWJsZSArIDIgKyBob3JPZmZzZXQ7CisgICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQorICAgIHsKKyAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOworICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7CisgICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKKyAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOworICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7CisgICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGg+PjIpOyB4OyB4LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCisgICAgICAgICAgICB0bXA2ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKKyAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OworICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNiAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKKyAgICAgICAgICAgIHRtcDYgPSBjbHBbdG1wNiA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wNSArPSA1MTI7CisgICAgICAgICAgICB0bXA2Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOworICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7CisgICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA1IC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOworICAgICAgICAgICAgdG1wNSArPSB0bXA2OworICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1ID4+IDEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07CisgICAgICAgICAgICB0bXA0ICs9IDUxMjsKKyAgICAgICAgICAgIHRtcDUrKzsKKyAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNSArIHRtcDcpID4+IDEpOworICAgICAgICAgICAgLyogVGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKKyAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgNCk7CisgICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAzOworICAgICAgICAgICAgdG1wNSA9ICpwdHJKKys7CisgICAgICAgICAgICB0bXA0IC09ICh0bXA3IDw8IDIpOworICAgICAgICAgICAgdG1wNCAtPSB0bXA3OworICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQrKzsKKyAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKKyAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wNCA+PiAxMF07CisgICAgICAgICAgICB0bXA3ICs9IDE2OworICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA3ID4+IDVdOworICAgICAgICAgICAgdG1wMyArPSA1MTI7CisgICAgICAgICAgICB0bXA0Kys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDQgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOworICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKKyAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7CisgICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKKyAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7CisgICAgICAgICAgICB0bXAzIC09IHRtcDc7CisgICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOworICAgICAgICAgICAgdG1wMyArPSB0bXA0OworICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzID4+IDEwXTsKKyAgICAgICAgICAgIHRtcDcgKz0gMTY7CisgICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07CisgICAgICAgICAgICB0bXAzKys7CisgICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDMgKyB0bXA3KSA+PiAxKTsKKyAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgdG1wNSA9IHRtcDE7CisgICAgICAgICAgICB0bXA3ID0gdG1wNDsKKyAgICAgICAgICAgIHRtcDQgPSB0bXA2OworICAgICAgICAgICAgdG1wNiA9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gdG1wNzsKKyAgICAgICAgfQorICAgICAgICBwdHJKICs9IDU7CisgICAgICAgIHB0ckludCArPSA1OworICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKKyAgICB9CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcmVkaWN0U2FtcGxlcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZWNvbnN0cnVjdHMgYSBwcmVkaWN0aW9uIGZvciBhIG1hY3JvYmxvY2sgcGFydGl0aW9uLgorICAgICAgICAgIFRoZSBwcmVkaWN0aW9uIGlzIGVpdGhlciBjb3BpZWQgb3IgaW50ZXJwb2xhdGVkIHVzaW5nIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICBmcmFtZSBhbmQgdGhlIG1vdGlvbiB2ZWN0b3IuIEJvdGggbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwYXJ0cyBhcmUKKyAgICAgICAgICBwcmVkaWN0ZWQuIFRoZSBwcmVkaWN0aW9uIGlzIHN0b3JlZCBpbiBnaXZlbiBtYWNyb2Jsb2NrIGFycmF5IChkYXRhKS4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGFycmF5ICgzODQgYnl0ZXMpIGZvciBvdXRwdXQKKyAgICAgICAgICBtdiAgICAgICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciB1c2VkIGZvciBwcmVkaWN0aW9uCisgICAgICAgICAgcmVmUGljICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIHN0cnVjdHVyZQorICAgICAgICAgIHhBICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICB5QSAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFggICAgICAgICB4LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0WSAgICAgICAgIHktb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRXaWR0aCAgICAgd2lkdGggb2YgcGFydGl0aW9uCisgICAgICAgICAgcGFydEhlaWdodCAgICBoZWlnaHQgb2YgcGFydGl0aW9uCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgZGF0YSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICgxNngxNis4eDgrOHg4KSB3aGVyZSBwcmVkaWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBpcyBzdG9yZWQgYXQgY29ycmVjdCBwb3NpdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKKyAgdTggKmRhdGEsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMsCisgIHUzMiB4QSwKKyAgdTMyIHlBLAorICB1MzIgcGFydFgsCisgIHUzMiBwYXJ0WSwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpCisKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeEZyYWMsIHlGcmFjLCB3aWR0aCwgaGVpZ2h0OworICAgIGkzMiB4SW50LCB5SW50OworICAgIHU4ICpsdW1hUGFydERhdGE7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChkYXRhKTsKKyAgICBBU1NFUlQobXYpOworICAgIEFTU0VSVChwYXJ0V2lkdGgpOworICAgIEFTU0VSVChwYXJ0SGVpZ2h0KTsKKyAgICBBU1NFUlQocmVmUGljKTsKKyAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKKyAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7CisgICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKKworICAgIC8qIGx1bWEgKi8KKyAgICBsdW1hUGFydERhdGEgPSBkYXRhICsgMTYqcGFydFkgKyBwYXJ0WDsKKworICAgIHhGcmFjID0gbXYtPmhvciAmIDB4MzsKKyAgICB5RnJhYyA9IG12LT52ZXIgJiAweDM7CisKKyAgICB3aWR0aCA9IDE2ICogcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSAxNiAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgeEludCA9IChpMzIpeEEgKyAoaTMyKXBhcnRYICsgKG12LT5ob3IgPj4gMik7CisgICAgeUludCA9IChpMzIpeUEgKyAoaTMyKXBhcnRZICsgKG12LT52ZXIgPj4gMik7CisKKyAgICBBU1NFUlQobHVtYUZyYWNQb3NbeEZyYWNdW3lGcmFjXSA8IDE2KTsKKworICAgIHN3aXRjaCAobHVtYUZyYWNQb3NbeEZyYWNdW3lGcmFjXSkKKyAgICB7CisgICAgICAgIGNhc2UgMDogLyogRyAqLworICAgICAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludCx5SW50LHdpZHRoLGhlaWdodCxwYXJ0V2lkdGgscGFydEhlaWdodCwxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBkICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBoICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOiAvKiBuICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAvKiBhICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAvKiBlICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6IC8qIGkgKi8KKyAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCisgICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogLyogcCAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OiAvKiBiICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OiAvKiBmICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvKiBqICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOiAvKiBxICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOiAvKiBjICovCisgICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAorICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLyogZyAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDogLyogayAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogY2FzZSAxNSwgciAqLworICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjaHJvbWEgKi8KKyAgICBQcmVkaWN0Q2hyb21hKAorICAgICAgZGF0YSArIDE2KjE2ICsgKHBhcnRZPj4xKSo4ICsgKHBhcnRYPj4xKSwKKyAgICAgIHhBICsgcGFydFgsCisgICAgICB5QSArIHBhcnRZLAorICAgICAgcGFydFdpZHRoLAorICAgICAgcGFydEhlaWdodCwKKyAgICAgIG12LAorICAgICAgcmVmUGljKTsKKworfQorCisjZWxzZSAvKiBIMjY0REVDX09NWERMICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcmVkaWN0U2FtcGxlcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZWNvbnN0cnVjdHMgYSBwcmVkaWN0aW9uIGZvciBhIG1hY3JvYmxvY2sgcGFydGl0aW9uLgorICAgICAgICAgIFRoZSBwcmVkaWN0aW9uIGlzIGVpdGhlciBjb3BpZWQgb3IgaW50ZXJwb2xhdGVkIHVzaW5nIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICBmcmFtZSBhbmQgdGhlIG1vdGlvbiB2ZWN0b3IuIEJvdGggbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwYXJ0cyBhcmUKKyAgICAgICAgICBwcmVkaWN0ZWQuIFRoZSBwcmVkaWN0aW9uIGlzIHN0b3JlZCBpbiBnaXZlbiBtYWNyb2Jsb2NrIGFycmF5IChkYXRhKS4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGFycmF5ICgzODQgYnl0ZXMpIGZvciBvdXRwdXQKKyAgICAgICAgICBtdiAgICAgICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciB1c2VkIGZvciBwcmVkaWN0aW9uCisgICAgICAgICAgcmVmUGljICAgICAgICBwb2ludGVyIHRvIHJlZmVyZW5jZSBwaWN0dXJlIHN0cnVjdHVyZQorICAgICAgICAgIHhBICAgICAgICAgICAgeC1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKKyAgICAgICAgICB5QSAgICAgICAgICAgIHktY29vcmRpbmF0ZSBmb3IgY3VycmVudCBtYWNyb2Jsb2NrCisgICAgICAgICAgcGFydFggICAgICAgICB4LW9mZnNldCBmb3IgcGFydGl0aW9uIGluIG1hY3JvYmxvY2sKKyAgICAgICAgICBwYXJ0WSAgICAgICAgIHktb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jaworICAgICAgICAgIHBhcnRXaWR0aCAgICAgd2lkdGggb2YgcGFydGl0aW9uCisgICAgICAgICAgcGFydEhlaWdodCAgICBoZWlnaHQgb2YgcGFydGl0aW9uCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgZGF0YSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICgxNngxNis4eDgrOHg4KSB3aGVyZSBwcmVkaWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiBpcyBzdG9yZWQgYXQgY29ycmVjdCBwb3NpdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKmxpbnQgLWV7NTUwfSBTeW1ib2wgJ3Jlcycgbm90IGFjY2Vzc2VkICovCit2b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKKyAgdTggKmRhdGEsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMsCisgIHUzMiBjb2xBbmRSb3csCisgIHUzMiBwYXJ0LAorICB1OCAqcEZpbGwpCisKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgeEZyYWMsIHlGcmFjOworICAgIHUzMiB3aWR0aCwgaGVpZ2h0OworICAgIGkzMiB4SW50LCB5SW50LCB4MCwgeTA7CisgICAgdTggKnBhcnREYXRhLCAqcmVmOworICAgIE9NWFNpemUgcm9pOworICAgIHUzMiBmaWxsV2lkdGg7CisgICAgdTMyIGZpbGxIZWlnaHQ7CisgICAgT01YUmVzdWx0IHJlczsKKyAgICB1MzIgeEEsIHlBOworICAgIHUzMiBwYXJ0WCwgcGFydFk7CisgICAgdTMyIHBhcnRXaWR0aCwgcGFydEhlaWdodDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKGRhdGEpOworICAgIEFTU0VSVChtdik7CisgICAgQVNTRVJUKHJlZlBpYyk7CisgICAgQVNTRVJUKHJlZlBpYy0+ZGF0YSk7CisgICAgQVNTRVJUKHJlZlBpYy0+d2lkdGgpOworICAgIEFTU0VSVChyZWZQaWMtPmhlaWdodCk7CisKKyAgICB4QSA9IChjb2xBbmRSb3cgJiAweEZGRkYwMDAwKSA+PiAxNjsKKyAgICB5QSA9IChjb2xBbmRSb3cgJiAweDAwMDBGRkZGKTsKKworICAgIHBhcnRYID0gKHBhcnQgJiAweEZGMDAwMDAwKSA+PiAyNDsKKyAgICBwYXJ0WSA9IChwYXJ0ICYgMHgwMEZGMDAwMCkgPj4gMTY7CisgICAgcGFydFdpZHRoID0gKHBhcnQgJiAweDAwMDBGRjAwKSA+PiA4OworICAgIHBhcnRIZWlnaHQgPSAocGFydCAmIDB4MDAwMDAwRkYpOworCisgICAgQVNTRVJUKHBhcnRXaWR0aCk7CisgICAgQVNTRVJUKHBhcnRIZWlnaHQpOworCisgICAgLyogbHVtYSAqLworICAgIHBhcnREYXRhID0gZGF0YSArIDE2KnBhcnRZICsgcGFydFg7CisKKyAgICB4RnJhYyA9IG12LT5ob3IgJiAweDM7CisgICAgeUZyYWMgPSBtdi0+dmVyICYgMHgzOworCisgICAgd2lkdGggPSAxNiAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gMTYgKiByZWZQaWMtPmhlaWdodDsKKworICAgIHhJbnQgPSAoaTMyKXhBICsgKGkzMilwYXJ0WCArIChtdi0+aG9yID4+IDIpOworICAgIHlJbnQgPSAoaTMyKXlBICsgKGkzMilwYXJ0WSArIChtdi0+dmVyID4+IDIpOworCisgICAgeDAgPSAoeEZyYWMpID8geEludC0yIDogeEludDsKKyAgICB5MCA9ICh5RnJhYykgPyB5SW50LTIgOiB5SW50OworCisgICAgaWYgKHhGcmFjKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnRXaWR0aCA9PSAxNikKKyAgICAgICAgICAgIGZpbGxXaWR0aCA9IDMyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmaWxsV2lkdGggPSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBmaWxsV2lkdGggPSAocGFydFdpZHRoKjIpOworICAgIGlmICh5RnJhYykKKyAgICAgICAgZmlsbEhlaWdodCA9IHBhcnRIZWlnaHQrNTsKKyAgICBlbHNlCisgICAgICAgIGZpbGxIZWlnaHQgPSBwYXJ0SGVpZ2h0OworCisKKyAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArZmlsbFdpZHRoID4gd2lkdGgpIHx8CisgICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2ZpbGxIZWlnaHQgPiBoZWlnaHQpKQorICAgIHsKKyAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWZQaWMtPmRhdGEsICh1OCopcEZpbGwsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBmaWxsV2lkdGgsIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7CisKKyAgICAgICAgeDAgPSAwOworICAgICAgICB5MCA9IDA7CisgICAgICAgIHJlZiA9IHBGaWxsOworICAgICAgICB3aWR0aCA9IGZpbGxXaWR0aDsKKyAgICAgICAgaWYgKHlGcmFjKQorICAgICAgICAgICAgcmVmICs9IDIqd2lkdGg7CisgICAgICAgIGlmICh4RnJhYykKKyAgICAgICAgICAgIHJlZiArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKmxpbnQgLS1lKDczNykgTG9zcyBvZiBzaWduICovCisgICAgICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIHlJbnQqd2lkdGggKyB4SW50OworICAgIH0KKyAgICAvKiBMdW1hIGludGVycG9sYXRpb24gKi8KKyAgICByb2kud2lkdGggPSAoaTMyKXBhcnRXaWR0aDsKKyAgICByb2kuaGVpZ2h0ID0gKGkzMilwYXJ0SGVpZ2h0OworCisgICAgcmVzID0gb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEocmVmLCAoaTMyKXdpZHRoLCBwYXJ0RGF0YSwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMil4RnJhYywgKGkzMil5RnJhYywgcm9pKTsKKyAgICBBU1NFUlQocmVzID09IDApOworCisgICAgLyogQ2hyb21hICovCisgICAgd2lkdGggID0gOCAqIHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gOCAqIHJlZlBpYy0+aGVpZ2h0OworCisgICAgeDAgPSAoKHhBICsgcGFydFgpID4+IDEpICsgKG12LT5ob3IgPj4gMyk7CisgICAgeTAgPSAoKHlBICsgcGFydFkpID4+IDEpICsgKG12LT52ZXIgPj4gMyk7CisgICAgeEZyYWMgPSBtdi0+aG9yICYgMHg3OworICAgIHlGcmFjID0gbXYtPnZlciAmIDB4NzsKKworICAgIHJlZiA9IHJlZlBpYy0+ZGF0YSArIDI1NiAqIHJlZlBpYy0+d2lkdGggKiByZWZQaWMtPmhlaWdodDsKKworICAgIHJvaS53aWR0aCA9IChpMzIpKHBhcnRXaWR0aCA+PiAxKTsKKyAgICBmaWxsV2lkdGggPSAoKHBhcnRXaWR0aCA+PiAxKSArIDgpICYgfjB4NzsKKyAgICByb2kuaGVpZ2h0ID0gKGkzMikocGFydEhlaWdodCA+PiAxKTsKKyAgICBmaWxsSGVpZ2h0ID0gKHBhcnRIZWlnaHQgPj4gMSkgKyAxOworCisgICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2ZpbGxXaWR0aCA+IHdpZHRoKSB8fAorICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtmaWxsSGVpZ2h0ID4gaGVpZ2h0KSkKKyAgICB7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBwRmlsbCwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgZmlsbFdpZHRoLCBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOworICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7CisgICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBwRmlsbCArIGZpbGxXaWR0aCpmaWxsSGVpZ2h0LAorICAgICAgICAgICAgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBmaWxsV2lkdGgsCisgICAgICAgICAgICBmaWxsSGVpZ2h0LCBmaWxsV2lkdGgpOworCisgICAgICAgIHJlZiA9IHBGaWxsOworICAgICAgICB4MCA9IDA7CisgICAgICAgIHkwID0gMDsKKyAgICAgICAgd2lkdGggPSBmaWxsV2lkdGg7CisgICAgICAgIGhlaWdodCA9IGZpbGxIZWlnaHQ7CisgICAgfQorCisgICAgcGFydERhdGEgPSBkYXRhICsgMTYqMTYgKyAocGFydFk+PjEpKjggKyAocGFydFg+PjEpOworCisgICAgLyogQ2hyb21hIGludGVycG9sYXRpb24gKi8KKyAgICAvKmxpbnQgLS1lKDczNykgTG9zcyBvZiBzaWduICovCisgICAgcmVmICs9IHkwICogd2lkdGggKyB4MDsKKyAgICByZXMgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYShyZWYsIHdpZHRoLCBwYXJ0RGF0YSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKXJvaS53aWR0aCwgKHUzMilyb2kuaGVpZ2h0LCB4RnJhYywgeUZyYWMpOworICAgIEFTU0VSVChyZXMgPT0gMCk7CisgICAgcGFydERhdGEgKz0gOCAqIDg7CisgICAgcmVmICs9IGhlaWdodCAqIHdpZHRoOworICAgIHJlcyA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKHJlZiwgd2lkdGgsIHBhcnREYXRhLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpcm9pLndpZHRoLCAodTMyKXJvaS5oZWlnaHQsIHhGcmFjLCB5RnJhYyk7CisgICAgQVNTRVJUKHJlcyA9PSAwKTsKKworfQorCisjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRmlsbFJvdzEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJvdyBvZiByZWZlcmVuY2UgcGVscyBpbiBhICdub3JtYWwnIGNhc2Ugd2hlbiBubworICAgICAgICAgIG92ZXJmaWxsaW5nIGlzIG5lY2Vzc2FyeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgRmlsbFJvdzEoCisgIHU4ICpyZWYsCisgIHU4ICpmaWxsLAorICBpMzIgbGVmdCwKKyAgaTMyIGNlbnRlciwKKyAgaTMyIHJpZ2h0KQoreworCisgICAgQVNTRVJUKHJlZik7CisgICAgQVNTRVJUKGZpbGwpOworCisgICAgSDI2NFN3RGVjTWVtY3B5KGZpbGwsIHJlZiwgKHUzMiljZW50ZXIpOworCisgICAgLypsaW50IC1lKDcxNSkgKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RGaWxsUm93NworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgcm93IG9mIHJlZmVyZW5jZSBwZWxzIHdoZW4gaG9yaXpvbnRhbCBjb29yZGluYXRlCisgICAgICAgICAgaXMgcGFydGx5IG5lZ2F0aXZlIG9yIHBhcnRseSBncmVhdGVyIHRoYW4gcmVmZXJlbmNlIHBpY3R1cmUgd2lkdGgKKyAgICAgICAgICAob3ZlcmZpbGxpbmcgc29tZSBwZWxzIG9uIGxlZnQgYW5kL29yIHJpZ2h0IGVkZ2UpLgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcmVmICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHNhbXBsZXMKKyAgICAgICAgICBsZWZ0ICAgICAgYW1vdW50IG9mIHBpeGVscyB0byBvdmVyZmlsbCBvbiBsZWZ0LWVkZ2UKKyAgICAgICAgICBjZW50ZXIgICAgYW1vdW50IG9mIHBpeGVscyB0byBjb3B5CisgICAgICAgICAgcmlnaHQgICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gb3ZlcmZpbGwgb24gcmlnaHQtZWRnZQorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIGZpbGwgICAgICBwb2ludGVyIHdoZXJlIHNhbXBsZXMgYXJlIHN0b3JlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX05FT04KK3ZvaWQgaDI2NGJzZEZpbGxSb3c3KAorICB1OCAqcmVmLAorICB1OCAqZmlsbCwKKyAgaTMyIGxlZnQsCisgIGkzMiBjZW50ZXIsCisgIGkzMiByaWdodCkKK3sKKyAgICB1OCB0bXA7CisKKyAgICBBU1NFUlQocmVmKTsKKyAgICBBU1NFUlQoZmlsbCk7CisKKyAgICBpZiAobGVmdCkKKyAgICAgICAgdG1wID0gKnJlZjsKKworICAgIGZvciAoIDsgbGVmdDsgbGVmdC0tKQorICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcCkgIHRtcCBpcyBpbml0aWFsaXplZCBpZiB1c2VkICovCisgICAgICAgICpmaWxsKysgPSB0bXA7CisKKyAgICBmb3IgKCA7IGNlbnRlcjsgY2VudGVyLS0pCisgICAgICAgICpmaWxsKysgPSAqcmVmKys7CisKKyAgICBpZiAocmlnaHQpCisgICAgICAgIHRtcCA9IHJlZlstMV07CisKKyAgICBmb3IgKCA7IHJpZ2h0OyByaWdodC0tKQorICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcCkgIHRtcCBpcyBpbml0aWFsaXplZCBpZiB1c2VkICovCisgICAgICAgICpmaWxsKysgPSB0bXA7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxCbG9jaworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgYmxvY2sgb2YgcmVmZXJlbmNlIHBlbHMuIEl0IGRldGVybWluZXMgd2hldGhlcgorICAgICAgICAgIG92ZXJmaWxsaW5nIGlzIG5lZWRlZCBvciBub3QgYW5kIHJlcGVhdGVkbHkgY2FsbHMgYW4gYXBwcm9wcmlhdGUKKyAgICAgICAgICBmdW5jdGlvbiAoYnkgdXNpbmcgYSBmdW5jdGlvbiBwb2ludGVyKSB0aGF0IGZpbGxzIG9uZSByb3cgdGhlIGJsb2NrLgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgcmVmICAgICAgICAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUKKyAgICAgICAgICB4MCAgICAgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGJsb2NrCisgICAgICAgICAgeTAgICAgICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBibG9jaworICAgICAgICAgIHdpZHRoICAgICAgICAgICAgIHdpZHRoIG9mIHJlZmVyZW5jZSBmcmFtZQorICAgICAgICAgIGhlaWdodCAgICAgICAgICAgIGhlaWdodCBvZiByZWZlcmVuY2UgZnJhbWUKKyAgICAgICAgICBibG9ja1dpZHRoICAgICAgICB3aWR0aCBvZiBibG9jaworICAgICAgICAgIGJsb2NrSGVpZ2h0ICAgICAgIGhlaWdodCBvZiBibG9jaworICAgICAgICAgIGZpbGxTY2FuTGVuZ3RoICAgIGxlbmd0aCBvZiBhIGxpbmUgaW4gb3V0cHV0IGFycmF5IChwaXhlbHMpCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgZmlsbCAgICAgICAgICAgICAgcG9pbnRlciB0byBhcnJheSB3aGVyZSBvdXRwdXQgYmxvY2sgaXMgd3JpdHRlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RGaWxsQmxvY2soCisgIHU4ICpyZWYsCisgIHU4ICpmaWxsLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgYmxvY2tXaWR0aCwKKyAgdTMyIGJsb2NrSGVpZ2h0LAorICB1MzIgZmlsbFNjYW5MZW5ndGgpCisKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgeHN0b3AsIHlzdG9wOworICAgIHZvaWQgKCpmcCkodTgqLCB1OCosIGkzMiwgaTMyLCBpMzIpOworICAgIGkzMiBsZWZ0LCB4LCByaWdodDsKKyAgICBpMzIgdG9wLCB5LCBib3R0b207CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChyZWYpOworICAgIEFTU0VSVChmaWxsKTsKKyAgICBBU1NFUlQod2lkdGgpOworICAgIEFTU0VSVChoZWlnaHQpOworICAgIEFTU0VSVChmaWxsKTsKKyAgICBBU1NFUlQoYmxvY2tXaWR0aCk7CisgICAgQVNTRVJUKGJsb2NrSGVpZ2h0KTsKKworICAgIHhzdG9wID0geDAgKyAoaTMyKWJsb2NrV2lkdGg7CisgICAgeXN0b3AgPSB5MCArIChpMzIpYmxvY2tIZWlnaHQ7CisKKyAgICAvKiBDaG9vc2UgY29ycmVjdCBmdW5jdGlvbiB3aGV0aGVyIG92ZXJmaWxsaW5nIG9uIGxlZnQtZWRnZSBvciByaWdodC1lZGdlCisgICAgICogaXMgbmVlZGVkIG9yIG5vdCAqLworICAgIGlmICh4MCA+PSAwICYmIHhzdG9wIDw9IChpMzIpd2lkdGgpCisgICAgICAgIGZwID0gRmlsbFJvdzE7CisgICAgZWxzZQorICAgICAgICBmcCA9IGgyNjRic2RGaWxsUm93NzsKKworICAgIGlmICh5c3RvcCA8IDApCisgICAgICAgIHkwID0gLShpMzIpYmxvY2tIZWlnaHQ7CisKKyAgICBpZiAoeHN0b3AgPCAwKQorICAgICAgICB4MCA9IC0oaTMyKWJsb2NrV2lkdGg7CisKKyAgICBpZiAoeTAgPiAoaTMyKWhlaWdodCkKKyAgICAgICAgeTAgPSAoaTMyKWhlaWdodDsKKworICAgIGlmICh4MCA+IChpMzIpd2lkdGgpCisgICAgICAgIHgwID0gKGkzMil3aWR0aDsKKworICAgIHhzdG9wID0geDAgKyAoaTMyKWJsb2NrV2lkdGg7CisgICAgeXN0b3AgPSB5MCArIChpMzIpYmxvY2tIZWlnaHQ7CisKKyAgICBpZiAoeDAgPiAwKQorICAgICAgICByZWYgKz0geDA7CisKKyAgICBpZiAoeTAgPiAwKQorICAgICAgICByZWYgKz0geTAgKiAoaTMyKXdpZHRoOworCisgICAgbGVmdCA9IHgwIDwgMCA/IC14MCA6IDA7CisgICAgcmlnaHQgPSB4c3RvcCA+IChpMzIpd2lkdGggPyB4c3RvcCAtIChpMzIpd2lkdGggOiAwOworICAgIHggPSAoaTMyKWJsb2NrV2lkdGggLSBsZWZ0IC0gcmlnaHQ7CisKKyAgICB0b3AgPSB5MCA8IDAgPyAteTAgOiAwOworICAgIGJvdHRvbSA9IHlzdG9wID4gKGkzMiloZWlnaHQgPyB5c3RvcCAtIChpMzIpaGVpZ2h0IDogMDsKKyAgICB5ID0gKGkzMilibG9ja0hlaWdodCAtIHRvcCAtIGJvdHRvbTsKKworICAgIC8qIFRvcC1vdmVyZmlsbGluZyAqLworICAgIGZvciAoIDsgdG9wOyB0b3AtLSApCisgICAgeworICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKKyAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKKyAgICB9CisKKyAgICAvKiBMaW5lcyBpbnNpZGUgcmVmZXJlbmNlIGltYWdlICovCisgICAgZm9yICggOyB5OyB5LS0gKQorICAgIHsKKyAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7CisgICAgICAgIHJlZiArPSB3aWR0aDsKKyAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKKyAgICB9CisKKyAgICByZWYgLT0gd2lkdGg7CisKKyAgICAvKiBCb3R0b20tb3ZlcmZpbGxpbmcgKi8KKyAgICBmb3IgKCA7IGJvdHRvbTsgYm90dG9tLS0gKQorICAgIHsKKyAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7CisgICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7CisgICAgfQorfQorCisvKmxpbnQgK2U3MDEgK2U3MDIgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhMWExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICisjZGVmaW5lIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX09NWERMCit2b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKKyAgdTggKmRhdGEsCisgIG12X3QgKm12LAorICBpbWFnZV90ICpyZWZQaWMsCisgIHUzMiB4QSwKKyAgdTMyIHlBLAorICB1MzIgcGFydFgsCisgIHUzMiBwYXJ0WSwKKyAgdTMyIHBhcnRXaWR0aCwKKyAgdTMyIHBhcnRIZWlnaHQpOworI2Vsc2UKK3ZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAorICB1OCAqZGF0YSwKKyAgbXZfdCAqbXYsCisgIGltYWdlX3QgKnJlZlBpYywKKyAgdTMyIGNvbEFuZFJvdywvKiBwYWNrYWdlZCBkYXRhIHwgY29sdW1uICAgIHwgcm93ICAgICAgICAgICAgICAgIHwqLworICB1MzIgcGFydCwgICAgIC8qIHBhY2thZ2VkIGRhdGEgfHBhcnRYfHBhcnRZfHBhcnRXaWR0aHxwYXJ0SGVpZ2h0fCovCisgIHU4ICpwRmlsbCk7CisjZW5kaWYKKwordm9pZCBoMjY0YnNkRmlsbEJsb2NrKAorICB1OCAqIHJlZiwKKyAgdTggKiBmaWxsLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgYmxvY2tXaWR0aCwKKyAgdTMyIGJsb2NrSGVpZ2h0LAorICB1MzIgZmlsbFNjYW5MZW5ndGgpOworCit2b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvcigKKyAgdTggKnBSZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHhGcmFjLAorICB1MzIgY2hyb21hUGFydFdpZHRoLAorICB1MzIgY2hyb21hUGFydEhlaWdodCk7CisKK3ZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKAorICB1OCAqcFJlZiwKKyAgdTggKnByZWRQYXJ0Q2hyb21hLAorICBpMzIgeDAsCisgIGkzMiB5MCwKKyAgdTMyIHdpZHRoLAorICB1MzIgaGVpZ2h0LAorICB1MzIgeUZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIoCisgIHU4ICpyZWYsCisgIHU4ICpwcmVkUGFydENocm9tYSwKKyAgaTMyIHgwLAorICBpMzIgeTAsCisgIHUzMiB3aWR0aCwKKyAgdTMyIGhlaWdodCwKKyAgdTMyIHhGcmFjLAorICB1MzIgeUZyYWMsCisgIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCisgIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yT2Zmc2V0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yVmVyT2Zmc2V0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIYWxmKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgdmVyT2Zmc2V0KTsKKwordm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKAorICB1OCAqcmVmLAorICB1OCAqbWIsCisgIGkzMiB4MCwKKyAgaTMyIHkwLAorICB1MzIgd2lkdGgsCisgIHUzMiBoZWlnaHQsCisgIHUzMiBwYXJ0V2lkdGgsCisgIHUzMiBwYXJ0SGVpZ2h0LAorICB1MzIgaG9yT2Zmc2V0KTsKKworCit2b2lkIGgyNjRic2RGaWxsUm93NygKKyAgdTggKnJlZiwKKyAgdTggKmZpbGwsCisgIGkzMiBsZWZ0LAorICBpMzIgY2VudGVyLAorICBpMzIgcmlnaHQpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19SRUNPTlNUUlVDVF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzU2YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jCkBAIC0wLDAgKzEsMTY5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVTZWlNZXNzYWdlCisgICAgICAgICAgRGVjb2RlQnVmZmVyaW5nUGVyaW9kCisgICAgICAgICAgRGVjb2RlUGljdHVyZVRpbWluZworICAgICAgICAgIERlY29kZVBhblNjYW5SZWN0YW5nbGUKKyAgICAgICAgICBEZWNvZGVGaWxsZXJQYXlsb2FkCisgICAgICAgICAgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNQorICAgICAgICAgIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkCisgICAgICAgICAgRGVjb2RlUmVjb3ZlcnlQb2ludAorICAgICAgICAgIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uCisgICAgICAgICAgRGVjb2RlU3BhcmVQaWMKKyAgICAgICAgICBEZWNvZGVTY2VuZUluZm8KKyAgICAgICAgICBEZWNvZGVTdWJTZXFJbmZvCisgICAgICAgICAgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MKKyAgICAgICAgICBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MKKyAgICAgICAgICBEZWNvZGVGdWxsRnJhbWVGcmVlemUKKyAgICAgICAgICBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdAorICAgICAgICAgIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydAorICAgICAgICAgIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQKKyAgICAgICAgICBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQKKyAgICAgICAgICBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NlaS5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb25zdCB1MzIgbnVtQ2xvY2tUU1s5XSA9IHsxLDEsMSwyLDIsMywzLDIsM307CitzdGF0aWMgY29uc3QgdTMyIGNlaWxMb2cyTnVtU2xpY2VHcm91cHNbOV0gPSB7MCwxLDEsMiwyLDMsMywzLDN9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUJ1ZmZlcmluZ1BlcmlvZF90ICpwQnVmZmVyaW5nUGVyaW9kLAorICB1MzIgY3BiQ250LAorICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIG5hbEhyZEJwUHJlc2VudEZsYWcsCisgIHUzMiB2Y2xIcmRCcFByZXNlbnRGbGFnKTsKKworc3RhdGljIHUzMiBEZWNvZGVQaWN0dXJlVGltaW5nKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVBpY1RpbWluZ190ICpwUGljVGltaW5nLAorICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCisgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoLAorICB1MzIgY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCisgIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQYW5TY2FuUmVjdF90ICpwUGFuU2NhblJlY3RhbmdsZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlRmlsbGVyUGF5bG9hZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBwYXlsb2FkU2l6ZSk7CisKK3N0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgKnBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAorICB1MzIgcGF5bG9hZFNpemUpOworCitzdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgKnBVc2VyRGF0YVVucmVnaXN0ZXJlZCwKKyAgdTMyIHBheWxvYWRTaXplKTsKKworc3RhdGljIHUzMiBEZWNvZGVSZWNvdmVyeVBvaW50KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVJlY292ZXJ5UG9pbnRfdCAqcFJlY292ZXJ5UG9pbnQpOworCitzdGF0aWMgdTMyIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgKnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKKyAgdTMyIG51bVJlZkZyYW1lcyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU3BhcmVQaWMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3BhcmVQaWNfdCAqcFNwYXJlUGljLAorICB1MzIgcGljU2l6ZUluTWFwVW5pdHMpOworCitzdGF0aWMgdTMyIERlY29kZVNjZW5lSW5mbygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTY2VuZUluZm9fdCAqcFNjZW5lSW5mbyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxSW5mbygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFJbmZvX3QgKnBTdWJTZXFJbmZvKTsKKworc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOworCitzdGF0aWMgdTMyIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUNoYXJhY3RlcmlzdGljcyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lRnJlZXplKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUZ1bGxGcmFtZUZyZWV6ZV90ICpwRnVsbEZyYW1lRnJlZXplKTsKKworc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90ICpwRnVsbEZyYW1lU25hcHNob3QpOworCitzdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKKworc3RhdGljIHUzMiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgKnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCisgIHUzMiBudW1TbGljZUdyb3Vwcyk7CisKK3N0YXRpYyB1MzIgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90ICpwUmVzZXJ2ZWRTZWlNZXNzYWdlLAorICB1MzIgcGF5bG9hZFNpemUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVTZWlNZXNzYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBzZWlNZXNzYWdlX3QgKnBTZWlNZXNzYWdlLAorICB1MzIgbnVtU2xpY2VHcm91cHMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgcGF5bG9hZFR5cGUsIHBheWxvYWRTaXplLCBzdGF0dXM7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VpTWVzc2FnZSk7CisKKworICAgIEgyNjRTd0RlY01lbXNldChwU2VpTWVzc2FnZSwgMCwgc2l6ZW9mKHNlaU1lc3NhZ2VfdCkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHBheWxvYWRUeXBlID0gMDsKKyAgICAgICAgd2hpbGUoKHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCkpID09IDB4RkYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBheWxvYWRUeXBlICs9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBheWxvYWRUeXBlICs9IHRtcDsKKworICAgICAgICBwYXlsb2FkU2l6ZSA9IDA7CisgICAgICAgIHdoaWxlKCh0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpKSA9PSAweEZGKQorICAgICAgICB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSArPSAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwYXlsb2FkU2l6ZSArPSB0bXA7CisKKyAgICAgICAgcFNlaU1lc3NhZ2UtPnBheWxvYWRUeXBlID0gcGF5bG9hZFR5cGU7CisKKyAgICAgICAgc3dpdGNoIChwYXlsb2FkVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUJ1ZmZlcmluZ1BlcmlvZCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+YnVmZmVyaW5nUGVyaW9kLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYkNudCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZywKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUGljdHVyZVRpbWluZygKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cGljVGltaW5nLAorICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgIGNwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICBkcGJPdXRwdXREZWxheUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgdGltZU9mZnNldExlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnIHx8CisgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA/CisgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRSwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+cGljU3RydWN0UHJlc2VudEZsYWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cGFuU2NhblJlY3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRmlsbGVyUGF5bG9hZChwU3RybURhdGEsIHBheWxvYWRTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCisgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+dXNlckRhdGFVbnJlZ2lzdGVyZWQsCisgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVSZWNvdmVyeVBvaW50KAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5yZWNvdmVyeVBvaW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5kZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVNwYXJlUGljKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zcGFyZVBpYywKKyAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU2NlbmVJbmZvKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zY2VuZUluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUluZm8oCisgICAgICAgICAgICAgICAgICBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5zdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZnVsbEZyYW1lRnJlZXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNDogLyogVGhpcyBTRUkgZG9lcyBub3QgY29udGFpbiBkYXRhLCB3aGF0IHRvIGRvID8/PyAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhBTlRST19PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+ZnVsbEZyYW1lU25hcHNob3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAorICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+bW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAorICAgICAgICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVJlc2VydmVkU2VpTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4oc3RhdHVzKTsKKworICAgICAgICB3aGlsZSAoIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgd2hpbGUgKCFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGgyNjRic2RNb3JlUmJzcERhdGEocFN0cm1EYXRhKSk7CisKKyAgICByZXR1cm4oaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKSk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaUJ1ZmZlcmluZ1BlcmlvZF90ICpwQnVmZmVyaW5nUGVyaW9kLAorICB1MzIgY3BiQ250LAorICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKKyAgdTMyIG5hbEhyZEJwUHJlc2VudEZsYWcsCisgIHUzMiB2Y2xIcmRCcFByZXNlbnRGbGFnKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwQnVmZmVyaW5nUGVyaW9kKTsKKyAgICBBU1NFUlQoY3BiQ250KTsKKyAgICBBU1NFUlQoaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcEJ1ZmZlcmluZ1BlcmlvZC0+c2VxUGFyYW1ldGVyU2V0SWQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocEJ1ZmZlcmluZ1BlcmlvZC0+c2VxUGFyYW1ldGVyU2V0SWQgPiAzMSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgaWYgKG5hbEhyZEJwUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BiQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgaWYgKHRtcCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlbaV0gPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtpXSA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2Y2xIcmRCcFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNwYkNudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBCdWZmZXJpbmdQZXJpb2QtPmluaXRpYWxDcGJSZW1vdmFsRGVsYXlbaV0gPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtpXSA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlUGljdHVyZVRpbWluZworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVQaWN0dXJlVGltaW5nKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVBpY1RpbWluZ190ICpwUGljVGltaW5nLAorICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAorICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGgsCisgIHUzMiB0aW1lT2Zmc2V0TGVuZ3RoLAorICB1MzIgY3BiRHBiRGVsYXlzUHJlc2VudEZsYWcsCisgIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworICAgIGkzMiBpdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFBpY1RpbWluZyk7CisKKworICAgIGlmIChjcGJEcGJEZWxheXNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUGljVGltaW5nLT5jcGJSZW1vdmFsRGVsYXkgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBkcGJPdXRwdXREZWxheUxlbmd0aCk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBpY1RpbWluZy0+ZHBiT3V0cHV0RGVsYXkgPSB0bXA7CisgICAgfQorCisgICAgaWYgKHBpY1N0cnVjdFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA0KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBpZiAodG1wID4gOCkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFBpY1RpbWluZy0+cGljU3RydWN0ID0gdG1wOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1DbG9ja1RTW3BQaWNUaW1pbmctPnBpY1N0cnVjdF07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwUGljVGltaW5nLT5jbG9ja1RpbWVTdGFtcEZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmNsb2NrVGltZVN0YW1wRmxhZ1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmN0VHlwZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bnVpdEZpZWxkQmFzZWRGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIGlmICh0bXAgPiA2KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y291bnRpbmdUeXBlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5mdWxsVGltZVN0YW1wRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5kaXNjb250aW51aXR5RmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jbnREcm9wcGVkRmxhZ1tpXSA9IHRtcCA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5uRnJhbWVzW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmZ1bGxUaW1lU3RhbXBGbGFnW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNWYWx1ZVtpXSA9IHRtcDsKKworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc1ZhbHVlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDIzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc1ZhbHVlW2ldID0gdG1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNGbGFnW2ldID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPnNlY29uZHNGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5zZWNvbmRzVmFsdWVbaV0gPSB0bXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc0ZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPm1pbnV0ZXNGbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+bWludXRlc1ZhbHVlW2ldID0gdG1wOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc0ZsYWdbaV0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUGljVGltaW5nLT5ob3Vyc0ZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+aG91cnNWYWx1ZVtpXSA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRpbWVPZmZzZXRMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHRpbWVPZmZzZXRMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIGl0bXAgPSAoaTMyKXRtcDsKKyAgICAgICAgICAgICAgICAgICAgLyogZm9sbG93aW5nICJjb252ZXJ0cyIgdGltZU9mZnNldExlbmd0aC1iaXQgc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAqIGludGVnZXIgaW50byBpMzIgKi8KKyAgICAgICAgICAgICAgICAgICAgLypsaW50IC1zYXZlIC1lNzAxIC1lNzAyICovCisgICAgICAgICAgICAgICAgICAgIGl0bXAgPDw9ICgzMiAtIHRpbWVPZmZzZXRMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpdG1wID4+PSAoMzIgLSB0aW1lT2Zmc2V0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLypsaW50IC1yZXN0b3JlICovCisgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnRpbWVPZmZzZXRbaV0gPSBpdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+dGltZU9mZnNldFtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVBhblNjYW5SZWN0YW5nbGUKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUGFuU2NhblJlY3RhbmdsZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlQYW5TY2FuUmVjdF90ICpwUGFuU2NhblJlY3RhbmdsZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFBhblNjYW5SZWN0YW5nbGUpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdENhbmNlbEZsYWcgPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKCFwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RDYW5jZWxGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQgPiAyKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCsrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdExlZnRPZmZzZXRbaV0pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmlnaHRPZmZzZXRbaV0pOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0VG9wT2Zmc2V0W2ldKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdEJvdHRvbU9mZnNldFtpXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSZXBldGl0aW9uUGVyaW9kKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QgPiAxNjM4NCkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgaWYgKHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250ID4gMSAmJgorICAgICAgICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QgPiAxKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZUZpbGxlclBheWxvYWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlRmlsbGVyUGF5bG9hZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBwYXlsb2FkU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworCisKKyAgICBpZiAocGF5bG9hZFNpemUpCisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgOCAqIHBheWxvYWRTaXplKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90ICpwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKKyAgdTMyIHBheWxvYWRTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGo7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSk7CisgICAgQVNTRVJUKHBheWxvYWRTaXplKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGUgPSB0bXA7CisKKyAgICBpZiAocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZSAhPSAweEZGKQorICAgICAgICBpID0gMTsKKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1Q291bnRyeUNvZGVFeHRlbnNpb25CeXRlID0gdG1wOworICAgICAgICBpID0gMjsKKyAgICB9CisKKyAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICBBTExPQ0FURShwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNVBheWxvYWRCeXRlLHBheWxvYWRTaXplLWksdTgpOworICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZSAtIGk7CisgICAgaWYgKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgIGogPSAwOworICAgIGRvCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGVbal0gPSAodTgpdG1wOworICAgICAgICBpKys7CisgICAgICAgIGorKzsKKyAgICB9IHdoaWxlIChpIDwgcGF5bG9hZFNpemUpOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVVucmVnaXN0ZXJlZCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90ICpwVXNlckRhdGFVbnJlZ2lzdGVyZWQsCisgIHUzMiBwYXlsb2FkU2l6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFVzZXJEYXRhVW5yZWdpc3RlcmVkKTsKKworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXVpZElzb0llYzExNTc4W2ldID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLworICAgIEFMTE9DQVRFKHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZSwgcGF5bG9hZFNpemUgLSAxNiwgdTgpOworICAgIGlmIChwVXNlckRhdGFVbnJlZ2lzdGVyZWQtPnVzZXJEYXRhUGF5bG9hZEJ5dGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKworICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+bnVtUGF5bG9hZEJ5dGVzID0gcGF5bG9hZFNpemUgLSAxNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZSAtIDE2OyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZVtpXSA9ICh1OCl0bXA7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZWNvdmVyeVBvaW50CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVJlY292ZXJ5UG9pbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUmVjb3ZlcnlQb2ludF90ICpwUmVjb3ZlcnlQb2ludCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFJlY292ZXJ5UG9pbnQpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFJlY292ZXJ5UG9pbnQtPnJlY292ZXJ5RnJhbWVDbnQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFJlY292ZXJ5UG9pbnQtPmV4YWN0TWF0Y2hGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFJlY292ZXJ5UG9pbnQtPmJyb2tlbkxpbmtGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKHRtcCA+IDIpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwUmVjb3ZlcnlQb2ludC0+Y2hhbmdpbmdTbGljZUdyb3VwSWRjID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbigKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90ICpwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24sCisgIHUzMiBudW1SZWZGcmFtZXMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbik7CisKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLT5vcmlnaW5hbElkckZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPm9yaWdpbmFsRnJhbWVOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGZyYW1lX21ic19vbmx5X2ZsYWcgYXNzdW1lZCBhbHdheXMgdHJ1ZSBzbyBzb21lIGZpZWxkIHJlbGF0ZWQgc3ludGF4CisgICAgICogZWxlbWVudHMgYXJlIHNraXBwZWQsIHNlZSBILjI2NCBzdGFuZGFyZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNSZWZQaWNNYXJraW5nKHBTdHJtRGF0YSwKKyAgICAgICZwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPmRlY1JlZlBpY01hcmtpbmcsIE5BTF9TRUksIG51bVJlZkZyYW1lcyk7CisKKyAgICByZXR1cm4odG1wKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVNwYXJlUGljCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVNwYXJlUGljKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVNwYXJlUGljX3QgKnBTcGFyZVBpYywKKyAgdTMyIHBpY1NpemVJbk1hcFVuaXRzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIGosIG1hcFVuaXRDbnQ7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3BhcmVQaWMpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFNwYXJlUGljLT50YXJnZXRGcmFtZU51bSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3BhcmVQaWMtPnNwYXJlRmllbGRGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAvKiBkbyBub3QgYWNjZXB0IGZpZWxkcyAqLworICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlRmllbGRGbGFnKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFNwYXJlUGljLT5udW1TcGFyZVBpY3MpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU3BhcmVQaWMtPm51bVNwYXJlUGljcysrOworICAgIGlmIChwU3BhcmVQaWMtPm51bVNwYXJlUGljcyA+IE1BWF9OVU1fU1BBUkVfUElDUykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwU3BhcmVQaWMtPmRlbHRhU3BhcmVGcmFtZU51bVtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA+IDIpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLworICAgICAgICAgICAgQUxMT0NBVEUocFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldLCBwaWNTaXplSW5NYXBVbml0cywgdTMyKTsKKyAgICAgICAgICAgIGlmIChwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgICAgICAgICAgcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID0gTlVMTDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBpY1NpemVJbk1hcFVuaXRzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV1bal0gPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwU3BhcmVQaWMtPnNwYXJlQXJlYUlkY1tpXSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICAgICAgICAgIEFMTE9DQVRFKHBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXSwgcGljU2l6ZUluTWFwVW5pdHMsIHUzMik7CisgICAgICAgICAgICBpZiAocFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICAgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDAsIG1hcFVuaXRDbnQgPSAwOyBtYXBVbml0Q250IDwgcGljU2l6ZUluTWFwVW5pdHM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgJnBTcGFyZVBpYy0+emVyb1J1bkxlbmd0aFtpXVtqXSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIG1hcFVuaXRDbnQgKz0gcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldW2pdICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldCByZXN0IHRvIG51bGwgKi8KKyAgICBmb3IgKGkgPSBwU3BhcmVQaWMtPm51bVNwYXJlUGljczsgaSA8IE1BWF9OVU1fU1BBUkVfUElDUzsgaSsrKQorICAgIHsKKyAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID0gTlVMTDsKKyAgICAgICAgcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVNjZW5lSW5mbworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVTY2VuZUluZm8oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU2NlbmVJbmZvX3QgKnBTY2VuZUluZm8pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTY2VuZUluZm8pOworCisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTY2VuZUluZm8tPnNjZW5lSW5mb1ByZXNlbnRGbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZUluZm9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU2NlbmVJbmZvLT5zY2VuZUlkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUgPiA2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChwU2NlbmVJbmZvLT5zY2VuZVRyYW5zaXRpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgICAmcFNjZW5lSW5mby0+c2Vjb25kU2NlbmVJZCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFJbmZvCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxSW5mbygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlTdWJTZXFJbmZvX3QgKnBTdWJTZXFJbmZvKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3ViU2VxSW5mbyk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICZwU3ViU2VxSW5mby0+c3ViU2VxTGF5ZXJOdW0pOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUxheWVyTnVtID4gMjU1KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcFN1YlNlcUluZm8tPnN1YlNlcUlkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFJZCA+IDY1NTM1KQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTdWJTZXFJbmZvLT5maXJzdFJlZlBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxSW5mby0+bGVhZGluZ05vblJlZlBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxSW5mby0+bGFzdFBpY0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW1GbGFnID0gdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW1GbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU3ViU2VxSW5mby0+c3ViU2VxRnJhbWVOdW0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCAqcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+bnVtU3ViU2VxTGF5ZXJzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMrKzsKKyAgICBpZiAocFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMgPiBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnW2ldID0KKyAgICAgICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlQml0UmF0ZVtpXSA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VGcmFtZVJhdGVbaV0gPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKKworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFMYXllck51bSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5zdWJTZXFMYXllck51bSA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMtMSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUlkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUlkID4gNjU1MzUpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+ZHVyYXRpb25GbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmR1cmF0aW9uRmxhZykKKyAgICB7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUR1cmF0aW9uID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKKyAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZVJhdGVGbGFnID0gdG1wID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VSYXRlRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YWNjdXJhdGVTdGF0aXN0aWNzRmxhZyA9CisgICAgICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VCaXRSYXRlID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VGcmFtZVJhdGUgPSB0bXA7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2Vxcyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5udW1SZWZlcmVuY2VkU3Vic2VxcyA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMtMSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFMYXllck51bVtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxSWRbaV0pOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+cmVmU3ViU2VxRGlyZWN0aW9uW2ldID0gdG1wOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRnVsbEZyYW1lRnJlZXplCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZUZyZWV6ZSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZWlGdWxsRnJhbWVGcmVlemVfdCAqcEZ1bGxGcmFtZUZyZWV6ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEZ1bGxGcmFtZUZyZWV6ZSk7CisKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAmcEZ1bGxGcmFtZUZyZWV6ZS0+ZnVsbEZyYW1lRnJlZXplUmVwZXRpdGlvblBlcmlvZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwRnVsbEZyYW1lRnJlZXplLT5mdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kID4gMTYzODQpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRnVsbEZyYW1lU25hcHNob3QKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lU25hcHNob3QoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpRnVsbEZyYW1lU25hcHNob3RfdCAqcEZ1bGxGcmFtZVNuYXBzaG90KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwRnVsbEZyYW1lU25hcHNob3QpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcEZ1bGxGcmFtZVNuYXBzaG90LT5zbmFwU2hvdElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgPCsrPgorICAgICAgICBJbnB1dHM6CisgICAgICAgICAgPCsrPgorICAgICAgICBPdXRwdXRzOgorICAgICAgICAgIDwrKz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPnByb2dyZXNzaXZlUmVmaW5lbWVudElkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPm51bVJlZmluZW1lbnRTdGVwcyk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQtPm51bVJlZmluZW1lbnRTdGVwcysrOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICA8Kys+CisgICAgICAgIElucHV0czoKKyAgICAgICAgICA8Kys+CisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgPCsrPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90ICpwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LAorICB1MzIgbnVtU2xpY2VHcm91cHMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCxpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCk7CisgICAgQVNTRVJUKG51bVNsaWNlR3JvdXBzIDwgTUFYX05VTV9TTElDRV9HUk9VUFMpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgJnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5udW1TbGljZUdyb3Vwc0luU2V0Kys7CisgICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQgPiBudW1TbGljZUdyb3VwcykKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQ7IGkrKykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwKKyAgICAgICAgICAgIGNlaWxMb2cyTnVtU2xpY2VHcm91cHNbbnVtU2xpY2VHcm91cHNdKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5zbGljZUdyb3VwSWRbaV0gPSB0bXA7CisgICAgICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5zbGljZUdyb3VwSWRbaV0gPgorICAgICAgICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQtMSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPmV4YWN0U2FtcGxlVmFsdWVNYXRjaEZsYWcgPQorICAgICAgICB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdEZsYWcgPSB0bXAgPT0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+cGFuU2NhblJlY3RJZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgIDwrKz4KKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICA8Kys+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlaVJlc2VydmVkU2VpTWVzc2FnZV90ICpwUmVzZXJ2ZWRTZWlNZXNzYWdlLAorICB1MzIgcGF5bG9hZFNpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGksIHRtcDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBSZXNlcnZlZFNlaU1lc3NhZ2UpOworCisKKyAgICAvKiB3aGVyZSBjb3JyZXNwb25kaW5nIEZSRUUoKSA/Pz8gKi8KKyAgICBBTExPQ0FURShwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2VQYXlsb2FkQnl0ZSxwYXlsb2FkU2l6ZSx1OCk7CisgICAgaWYgKHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlID09IE5VTEwpCisgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICBwUmVzZXJ2ZWRTZWlNZXNzYWdlLT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwYXlsb2FkU2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLDgpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlW2ldID0gKHU4KXRtcDsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWZlNTQzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TRUlfSAorI2RlZmluZSBIMjY0U1dERUNfU0VJX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9QQU5fU0NBTl9DTlQgMzIKKyNkZWZpbmUgTUFYX05VTV9TUEFSRV9QSUNTIDE2CisjZGVmaW5lIE1BWF9OVU1fQ0xPQ0tfVFMgMworI2RlZmluZSBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTIDI1NgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHNlcVBhcmFtZXRlclNldElkOworICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5W01BWF9DUEJfQ05UXTsKKyAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtNQVhfQ1BCX0NOVF07Cit9IHNlaUJ1ZmZlcmluZ1BlcmlvZF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBjcGJSZW1vdmFsRGVsYXk7CisgICAgdTMyIGRwYk91dHB1dERlbGF5OworICAgIHUzMiBwaWNTdHJ1Y3Q7CisgICAgdTMyIGNsb2NrVGltZVN0YW1wRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgY2xvY2tUaW1lU3RhbXBbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGN0VHlwZVtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgbnVpdEZpZWxkQmFzZWRGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBjb3VudGluZ1R5cGVbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGZ1bGxUaW1lU3RhbXBGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBkaXNjb250aW51aXR5RmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgY250RHJvcHBlZEZsYWdbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIG5GcmFtZXNbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIHNlY29uZHNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBzZWNvbmRzVmFsdWVbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIG1pbnV0ZXNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOworICAgIHUzMiBtaW51dGVzVmFsdWVbTUFYX05VTV9DTE9DS19UU107CisgICAgdTMyIGhvdXJzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICB1MzIgaG91cnNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKKyAgICBpMzIgdGltZU9mZnNldFtNQVhfTlVNX0NMT0NLX1RTXTsKK30gc2VpUGljVGltaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHBhblNjYW5SZWN0SWQ7CisgICAgdTMyIHBhblNjYW5SZWN0Q2FuY2VsRmxhZzsKKyAgICB1MzIgcGFuU2NhbkNudDsKKyAgICBpMzIgcGFuU2NhblJlY3RMZWZ0T2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOworICAgIGkzMiBwYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOworICAgIGkzMiBwYW5TY2FuUmVjdFRvcE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKKyAgICBpMzIgcGFuU2NhblJlY3RCb3R0b21PZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07CisgICAgdTMyIHBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZDsKK30gc2VpUGFuU2NhblJlY3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgaXR1VFQzNUNvdW50cnlDb2RlOworICAgIHUzMiBpdHVUVDM1Q291bnRyeUNvZGVFeHRlbnNpb25CeXRlOworICAgIHU4ICppdHVUVDM1UGF5bG9hZEJ5dGU7CisgICAgdTMyIG51bVBheWxvYWRCeXRlczsKK30gc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiB1dWlkSXNvSWVjMTE1NzhbNF07CisgICAgdTggKnVzZXJEYXRhUGF5bG9hZEJ5dGU7CisgICAgdTMyIG51bVBheWxvYWRCeXRlczsKK30gc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcmVjb3ZlcnlGcmFtZUNudDsKKyAgICB1MzIgZXhhY3RNYXRjaEZsYWc7CisgICAgdTMyIGJyb2tlbkxpbmtGbGFnOworICAgIHUzMiBjaGFuZ2luZ1NsaWNlR3JvdXBJZGM7Cit9IHNlaVJlY292ZXJ5UG9pbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgb3JpZ2luYWxJZHJGbGFnOworICAgIHUzMiBvcmlnaW5hbEZyYW1lTnVtOworICAgIGRlY1JlZlBpY01hcmtpbmdfdCBkZWNSZWZQaWNNYXJraW5nOworfSBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiB0YXJnZXRGcmFtZU51bTsKKyAgICB1MzIgc3BhcmVGaWVsZEZsYWc7CisgICAgdTMyIHRhcmdldEJvdHRvbUZpZWxkRmxhZzsKKyAgICB1MzIgbnVtU3BhcmVQaWNzOworICAgIHUzMiBkZWx0YVNwYXJlRnJhbWVOdW1bTUFYX05VTV9TUEFSRV9QSUNTXTsKKyAgICB1MzIgc3BhcmVCb3R0b21GaWVsZEZsYWdbTUFYX05VTV9TUEFSRV9QSUNTXTsKKyAgICB1MzIgc3BhcmVBcmVhSWRjW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyICpzcGFyZVVuaXRGbGFnW01BWF9OVU1fU1BBUkVfUElDU107CisgICAgdTMyICp6ZXJvUnVuTGVuZ3RoW01BWF9OVU1fU1BBUkVfUElDU107Cit9IHNlaVNwYXJlUGljX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHNjZW5lSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBzY2VuZUlkOworICAgIHUzMiBzY2VuZVRyYW5zaXRpb25UeXBlOworICAgIHUzMiBzZWNvbmRTY2VuZUlkOworfSBzZWlTY2VuZUluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgc3ViU2VxTGF5ZXJOdW07CisgICAgdTMyIHN1YlNlcUlkOworICAgIHUzMiBmaXJzdFJlZlBpY0ZsYWc7CisgICAgdTMyIGxlYWRpbmdOb25SZWZQaWNGbGFnOworICAgIHUzMiBsYXN0UGljRmxhZzsKKyAgICB1MzIgc3ViU2VxRnJhbWVOdW1GbGFnOworICAgIHUzMiBzdWJTZXFGcmFtZU51bTsKK30gc2VpU3ViU2VxSW5mb190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBudW1TdWJTZXFMYXllcnM7CisgICAgdTMyIGFjY3VyYXRlU3RhdGlzdGljc0ZsYWdbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107CisgICAgdTMyIGF2ZXJhZ2VCaXRSYXRlW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworICAgIHUzMiBhdmVyYWdlRnJhbWVSYXRlW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOworfSBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzdWJTZXFMYXllck51bTsKKyAgICB1MzIgc3ViU2VxSWQ7CisgICAgdTMyIGR1cmF0aW9uRmxhZzsKKyAgICB1MzIgc3ViU2VxRHVyYXRpb247CisgICAgdTMyIGF2ZXJhZ2VSYXRlRmxhZzsKKyAgICB1MzIgYWNjdXJhdGVTdGF0aXN0aWNzRmxhZzsKKyAgICB1MzIgYXZlcmFnZUJpdFJhdGU7CisgICAgdTMyIGF2ZXJhZ2VGcmFtZVJhdGU7CisgICAgdTMyIG51bVJlZmVyZW5jZWRTdWJzZXFzOworICAgIHUzMiByZWZTdWJTZXFMYXllck51bVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKKyAgICB1MzIgcmVmU3ViU2VxSWRbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107CisgICAgdTMyIHJlZlN1YlNlcURpcmVjdGlvbltNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKK30gc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2Q7Cit9IHNlaUZ1bGxGcmFtZUZyZWV6ZV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzbmFwU2hvdElkOworfSBzZWlGdWxsRnJhbWVTbmFwc2hvdF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBwcm9ncmVzc2l2ZVJlZmluZW1lbnRJZDsKKyAgICB1MzIgbnVtUmVmaW5lbWVudFN0ZXBzOworfSBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQ7Cit9IHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbnVtU2xpY2VHcm91cHNJblNldDsKKyAgICB1MzIgc2xpY2VHcm91cElkW01BWF9OVU1fU0xJQ0VfR1JPVVBTXTsKKyAgICB1MzIgZXhhY3RTYW1wbGVWYWx1ZU1hdGNoRmxhZzsKKyAgICB1MzIgcGFuU2NhblJlY3RGbGFnOworICAgIHUzMiBwYW5TY2FuUmVjdElkOworfSBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1OCAqcmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGU7CisgICAgdTMyIG51bVBheWxvYWRCeXRlczsKK30gc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIHBheWxvYWRUeXBlOworICAgIHNlaUJ1ZmZlcmluZ1BlcmlvZF90IGJ1ZmZlcmluZ1BlcmlvZDsKKyAgICBzZWlQaWNUaW1pbmdfdCBwaWNUaW1pbmc7CisgICAgc2VpUGFuU2NhblJlY3RfdCBwYW5TY2FuUmVjdDsKKyAgICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgdXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNTsKKyAgICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90IHVzZXJEYXRhVW5yZWdpc3RlcmVkOworICAgIHNlaVJlY292ZXJ5UG9pbnRfdCByZWNvdmVyeVBvaW50OworICAgIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb247CisgICAgc2VpU3BhcmVQaWNfdCBzcGFyZVBpYzsKKyAgICBzZWlTY2VuZUluZm9fdCBzY2VuZUluZm87CisgICAgc2VpU3ViU2VxSW5mb190IHN1YlNlcUluZm87CisgICAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCBzdWJTZXFMYXllckNoYXJhY3RlcmlzdGljczsKKyAgICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCBzdWJTZXFDaGFyYWN0ZXJpc3RpY3M7CisgICAgc2VpRnVsbEZyYW1lRnJlZXplX3QgZnVsbEZyYW1lRnJlZXplOworICAgIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgZnVsbEZyYW1lU25hcHNob3Q7CisgICAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0OworICAgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCBwcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kOworICAgIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90IG1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldDsKKyAgICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCByZXNlcnZlZFNlaU1lc3NhZ2U7Cit9IHNlaU1lc3NhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBzZWlNZXNzYWdlX3QgKnBTZWlNZXNzYWdlLAorICB1MzIgbnVtU2xpY2VHcm91cHMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRUlfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTEwNTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYwpAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldAorICAgICAgICAgIEdldERwYlNpemUKKyAgICAgICAgICBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGlvbiB0byBpbmRpY2F0ZSBpbnZhbGlkIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBHZXREcGJTaXplIGZ1bmN0aW9uICovCitlbnVtIHtJTlZBTElEX0RQQl9TSVpFID0gMHg3RkZGRkZGRn07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBHZXREcGJTaXplKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBsZXZlbElkYyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RyZWFtLgorCisgICAgICAgICAgICBGdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvZmZzZXRGb3JSZWZGcmFtZSBhcnJheSBpZgorICAgICAgICAgICAgcGljdHVyZSBvcmRlciBjb3VudCB0eXBlIGlzIDEgYW5kIG51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZQorICAgICAgICAgICAgaXMgZ3JlYXRlciB0aGFuIHplcm8uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgaW52YWxpZCBpbmZvcm1hdGlvbiBvciBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGksIHZhbHVlOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKworICAgIEgyNjRTd0RlY01lbXNldChwU2VxUGFyYW1TZXQsIDAsIHNpemVvZihzZXFQYXJhbVNldF90KSk7CisKKyAgICAvKiBwcm9maWxlX2lkYyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgaWYgKHRtcCAhPSA2NikKKyAgICB7CisgICAgICAgIERFQlVHKCgiTk9UIEJBU0VMSU5FIFBST0ZJTEUgJWRcbiIsIHRtcCkpOworICAgIH0KKyAgICBwU2VxUGFyYW1TZXQtPnByb2ZpbGVJZGMgPSB0bXA7CisKKyAgICAvKiBjb25zdHJhaW5lZF9zZXQwX2ZsYWcgKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIC8qIGNvbnN0cmFpbmVkX3NldDFfZmxhZyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgLyogY29uc3RyYWluZWRfc2V0Ml9mbGFnICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogcmVzZXJ2ZWRfemVyb181Yml0cywgdmFsdWVzIG9mIHRoZXNlIGJpdHMgc2hhbGwgYmUgaWdub3JlZCAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMgPSB0bXA7CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAmcFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIGlmIChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkID49IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpCisgICAgeworICAgICAgICBFUFJJTlQoInNlcV9wYXJhbV9zZXRfaWQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBpZiAodmFsdWUgPiAxMikKKyAgICB7CisgICAgICAgIEVQUklOVCgibG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorICAgIC8qIG1heEZyYW1lTnVtID0gMl4obG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpICovCisgICAgcFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA9IDEgPDwgKHZhbHVlKzQpOworCisgICAgLyogdmFsaWQgUE9DIHR5cGVzIGFyZSAwLCAxIGFuZCAyICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID4gMikKKyAgICB7CisgICAgICAgIEVQUklOVCgicGljX29yZGVyX2NudF90eXBlIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPSB2YWx1ZTsKKworICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICovCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmICh2YWx1ZSA+IDEyKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgICAgIC8qIG1heFBpY09yZGVyQ250THNiID0gMl4obG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkgKi8KKyAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA9IDEgPDwgKHZhbHVlKzQpOworICAgIH0KKyAgICBlbHNlIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yTm9uUmVmUGljKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUgPiAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOT1RFOiBUaGlzIGhhcyB0byBiZSBmcmVlZCBzb21ld2hlcmUhICovCisgICAgICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUsIGkzMik7CisgICAgICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9ICBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSArIGkpOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gTUFYX05VTV9SRUZfUElDUykKKyAgICB7CisgICAgICAgIEVQUklOVCgibnVtX3JlZl9mcmFtZXMiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNlcVBhcmFtU2V0LT5nYXBzSW5GcmFtZU51bVZhbHVlQWxsb3dlZEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyA9IHZhbHVlICsgMTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgPSB2YWx1ZSArIDE7CisKKyAgICAvKiBmcmFtZV9tYnNfb25seV9mbGFnLCBzaGFsbCBiZSAxIGZvciBiYXNlbGluZSBwcm9maWxlICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBpZiAoIXRtcCkKKyAgICB7CisgICAgICAgIEVQUklOVCgiZnJhbWVfbWJzX29ubHlfZmxhZyIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgLyogZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcgPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BwaW5nRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0KTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgIC8qIGNoZWNrIHRoYXQgZnJhbWUgY3JvcHBpbmcgcGFyYW1zIGFyZSB2YWxpZCwgcGFyYW1ldGVycyBzaGFsbAorICAgICAgICAgKiBzcGVjaWZ5IG5vbi1uZWdhdGl2ZSBhcmVhIHdpdGhpbiB0aGUgb3JpZ2luYWwgcGljdHVyZSAqLworICAgICAgICBpZiAoICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcExlZnRPZmZzZXQgPgorICAgICAgICAgICAgICAgKCA4ICogKGkzMilwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgLQorICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICsgMSkgKSApIHx8CisgICAgICAgICAgICAgKCAoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wVG9wT2Zmc2V0ID4KKyAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyAtCisgICAgICAgICAgICAgICAgICgoaTMyKXBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICsgMSkgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJmcmFtZV9jcm9wcGluZyIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCBpbWFnZSBkaW1lbnNpb25zIGFuZCBsZXZlbElkYyBtYXRjaCAqLworICAgIHRtcCA9IHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnM7CisgICAgdmFsdWUgPSBHZXREcGJTaXplKHRtcCwgcFNlcVBhcmFtU2V0LT5sZXZlbElkYyk7CisgICAgaWYgKHZhbHVlID09IElOVkFMSURfRFBCX1NJWkUgfHwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIERFQlVHKCgiV0FSTklORyEgSW52YWxpZCBEUEIgc2l6ZSBiYXNlZCBvbiBTUFMgTGV2ZWwhXG4iKSk7CisgICAgICAgIERFQlVHKCgiV0FSTklORyEgVXNpbmcgbnVtX3JlZl9mcmFtZXMgPSVkIGZvciBEUEIgc2l6ZSFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcykpOworICAgICAgICB2YWx1ZSA9IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzOworICAgIH0KKyAgICBwU2VxUGFyYW1TZXQtPm1heERwYlNpemUgPSB2YWx1ZTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAvKiBWVUkgKi8KKyAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICBBTExPQ0FURShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMsIDEsIHZ1aVBhcmFtZXRlcnNfdCk7CisgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHBTdHJtRGF0YSwKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIC8qIGNoZWNrIG51bVJlb3JkZXJGcmFtZXMgYW5kIG1heERlY0ZyYW1lQnVmZmVyaW5nICovCisgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyA+CisgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgfHwKKyAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIDwKKyAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgfHwKKyAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nID4KKyAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3RhbmRhcmQgc2F5cyB0aGF0ICJ0aGUgc2VxdWVuY2Ugc2hhbGwgbm90IHJlcXVpcmUgYSBEUEIgd2l0aAorICAgICAgICAgICAgICogc2l6ZSBvZiBtb3JlIHRoYW4gbWF4KDEsIG1heERlY0ZyYW1lQnVmZmVyaW5nKSAqLworICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0KKyAgICAgICAgICAgICAgICBNQVgoMSwgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpOworCisgICAgLyogaWdub3JlIHBvc3NpYmxlIGVycm9ycyBpbiB0cmFpbGluZyBiaXRzIG9mIHBhcmFtZXRlcnMgc2V0cyAqLworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogR2V0RHBiU2l6ZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBHZXQgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcy4gU2l6ZSBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZQorICAgICAgICAgICAgcGljdHVyZSBzaXplIGFuZCBNYXhEUEIgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwuIFRoZXNlIGRldGVybWluZQorICAgICAgICAgICAgaG93IG1hbnkgcGljdHVyZXMgbWF5IGZpdCBpbnRvIHRvIHRoZSBidWZmZXIuIEhvd2V2ZXIsIHRoZSBzaXplCisgICAgICAgICAgICBpcyBhbHNvIGxpbWl0ZWQgdG8gYSBtYXhpbXVtIG9mIDE2IGZyYW1lcyBhbmQgdGhlcmVmb3JlIGZ1bmN0aW9uCisgICAgICAgICAgICByZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHRoZSBkZXRlcm1pbmVkIHNpemUgYW5kIDE2LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICBudW1iZXIgb2YgbWFjcm9ibG9ja3MgaW4gdGhlIHBpY3R1cmUKKyAgICAgICAgICAgIGxldmVsSWRjICAgICAgICBpbmRpY2F0ZXMgdGhlIGxldmVsCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIGluIGZyYW1lcworICAgICAgICAgICAgSU5WQUxJRF9EUEJfU0laRSB3aGVuIGludmFsaWQgbGV2ZWxJZGMgc3BlY2lmaWVkIG9yIHBpY1NpemVJbk1icworICAgICAgICAgICAgaXMgaGlnaGVyIHRoYW4gc3VwcG9ydGVkIGJ5IHRoZSBsZXZlbCBpbiBxdWVzdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcDsKKyAgICB1MzIgbWF4UGljU2l6ZUluTWJzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKKworICAgIC8qIHVzZSB0bXAgYXMgdGhlIHNpemUgb2YgdGhlIERQQiBpbiBieXRlcywgY29tcHV0ZXMgYXMgMTAyNCAqIE1heERQQgorICAgICAqIChmcm9tIHRhYmxlIEEtMSBpbiBBbm5leCBBKSAqLworICAgIHN3aXRjaCAobGV2ZWxJZGMpCisgICAgeworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgdG1wID0gMTUyMDY0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gOTk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgdG1wID0gMzQ1NjAwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICB0bXAgPSA5MTIzODQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgdG1wID0gOTEyMzg0OworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIHRtcCA9IDE4MjQ3Njg7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA3OTI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgdG1wID0gMzExMDQwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDE2MjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgdG1wID0gNjkxMjAwMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM2MDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgdG1wID0gNzg2NDMyMDsKKyAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDUxMjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgdG1wID0gMTI1ODI5MTI7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4MTkyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICB0bXAgPSAzNDgxNiozODQ7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA4NzA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgNDIzMDE0NDAgaGVyZSwgYnV0IGNvcnJpZ2VuZHVtICJjb3JyZWN0cyIgdGhpcyB0bworICAgICAgICAgICAgICogNDIzOTM2MDAgKi8KKyAgICAgICAgICAgIHRtcCA9IDQyMzkzNjAwOworICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMjIwODA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDUxOgorICAgICAgICAgICAgdG1wID0gNzA3Nzg4ODA7CisgICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjg2NDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7CisgICAgfQorCisgICAgLyogdGhpcyBpcyBub3QgImNvcnJlY3QiIHJldHVybiB2YWx1ZSEgSG93ZXZlciwgaXQgcmVzdWx0cyBpbiBlcnJvciBpbgorICAgICAqIGRlY29kaW5nIGFuZCB0aGlzIHdhcyBlYXNpZXN0IHBsYWNlIHRvIGNoZWNrIHBpY3R1cmUgc2l6ZSAqLworICAgIGlmIChwaWNTaXplSW5NYnMgPiBtYXhQaWNTaXplSW5NYnMpCisgICAgICAgIHJldHVybihJTlZBTElEX0RQQl9TSVpFKTsKKworICAgIHRtcCAvPSAocGljU2l6ZUluTWJzKjM4NCk7CisKKyAgICByZXR1cm4oTUlOKHRtcCwgMTYpKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFNwczEgICBwb2ludGVyIHRvIGEgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorICAgICAgICAgICAgcFNwczIgICBwb2ludGVyIHRvIGFub3RoZXIgc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICAwICAgICAgIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzIGFyZSBlcXVhbAorICAgICAgICAgICAgMSAgICAgICBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHNlcVBhcmFtU2V0X3QgKnBTcHMxLCBzZXFQYXJhbVNldF90ICpwU3BzMikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTcHMxKTsKKyAgICBBU1NFUlQocFNwczIpOworCisgICAgLyogZmlyc3QgY29tcGFyZSBwYXJhbWV0ZXJzIHdob3NlIGV4aXN0ZW5jZSBkb2VzIG5vdCBkZXBlbmQgb24gb3RoZXIKKyAgICAgKiBwYXJhbWV0ZXJzIGFuZCBvbmx5IGNvbXBhcmUgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtcyBpZiB0aGVzZSBhcmUgZXF1YWwgKi8KKyAgICBpZiAocFNwczEtPnByb2ZpbGVJZGMgICAgICAgID09IHBTcHMyLT5wcm9maWxlSWRjICYmCisgICAgICAgIHBTcHMxLT5sZXZlbElkYyAgICAgICAgICA9PSBwU3BzMi0+bGV2ZWxJZGMgJiYKKyAgICAgICAgcFNwczEtPm1heEZyYW1lTnVtICAgICAgID09IHBTcHMyLT5tYXhGcmFtZU51bSAmJgorICAgICAgICBwU3BzMS0+cGljT3JkZXJDbnRUeXBlICAgPT0gcFNwczItPnBpY09yZGVyQ250VHlwZSAmJgorICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzICAgICAgPT0gcFNwczItPm51bVJlZkZyYW1lcyAmJgorICAgICAgICBwU3BzMS0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID09CisgICAgICAgICAgICBwU3BzMi0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnICYmCisgICAgICAgIHBTcHMxLT5waWNXaWR0aEluTWJzICAgICA9PSBwU3BzMi0+cGljV2lkdGhJbk1icyAmJgorICAgICAgICBwU3BzMS0+cGljSGVpZ2h0SW5NYnMgICAgPT0gcFNwczItPnBpY0hlaWdodEluTWJzICYmCisgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BwaW5nRmxhZyA9PSBwU3BzMi0+ZnJhbWVDcm9wcGluZ0ZsYWcgJiYKKyAgICAgICAgcFNwczEtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyA9PSBwU3BzMi0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTcHMxLT5tYXhQaWNPcmRlckNudExzYiAhPSBwU3BzMi0+bWF4UGljT3JkZXJDbnRMc2IpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocFNwczEtPnBpY09yZGVyQ250VHlwZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFNwczEtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyAhPQorICAgICAgICAgICAgICAgICAgICBwU3BzMi0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnIHx8CisgICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvck5vblJlZlBpYyAhPSBwU3BzMi0+b2Zmc2V0Rm9yTm9uUmVmUGljIHx8CisgICAgICAgICAgICAgICAgcFNwczEtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlICE9CisgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTcHMxLT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTcHMxLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgcFNwczItPm9mZnNldEZvclJlZkZyYW1lW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwU3BzMS0+ZnJhbWVDcm9wTGVmdE9mZnNldCAgICE9IHBTcHMyLT5mcmFtZUNyb3BMZWZ0T2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0ICAhPSBwU3BzMi0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wVG9wT2Zmc2V0ICAgICE9IHBTcHMyLT5mcmFtZUNyb3BUb3BPZmZzZXQgfHwKKyAgICAgICAgICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0ICE9IHBTcHMyLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTE4ZGY5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19TRVFfUEFSQU1fU0VUX0gKKyNkZWZpbmUgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGRlY29kZWQgZnJvbSB0aGUKKyAqIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgcHJvZmlsZUlkYzsKKyAgICB1MzIgbGV2ZWxJZGM7CisgICAgdTMyIHNlcVBhcmFtZXRlclNldElkOworICAgIHUzMiBtYXhGcmFtZU51bTsKKyAgICB1MzIgcGljT3JkZXJDbnRUeXBlOworICAgIHUzMiBtYXhQaWNPcmRlckNudExzYjsKKyAgICB1MzIgZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnOworICAgIGkzMiBvZmZzZXRGb3JOb25SZWZQaWM7CisgICAgaTMyIG9mZnNldEZvclRvcFRvQm90dG9tRmllbGQ7CisgICAgdTMyIG51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKKyAgICBpMzIgKm9mZnNldEZvclJlZkZyYW1lOworICAgIHUzMiBudW1SZWZGcmFtZXM7CisgICAgdTMyIGdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZzsKKyAgICB1MzIgcGljV2lkdGhJbk1iczsKKyAgICB1MzIgcGljSGVpZ2h0SW5NYnM7CisgICAgdTMyIGZyYW1lQ3JvcHBpbmdGbGFnOworICAgIHUzMiBmcmFtZUNyb3BMZWZ0T2Zmc2V0OworICAgIHUzMiBmcmFtZUNyb3BSaWdodE9mZnNldDsKKyAgICB1MzIgZnJhbWVDcm9wVG9wT2Zmc2V0OworICAgIHUzMiBmcmFtZUNyb3BCb3R0b21PZmZzZXQ7CisgICAgdTMyIHZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZzsKKyAgICB2dWlQYXJhbWV0ZXJzX3QgKnZ1aVBhcmFtZXRlcnM7CisgICAgdTMyIG1heERwYlNpemU7Cit9IHNlcVBhcmFtU2V0X3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KTsKKwordTMyIGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzKHNlcVBhcmFtU2V0X3QgKnBTcHMxLCBzZXFQYXJhbVNldF90ICpwU3BzMik7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMjg4ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2RhdGEuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZURhdGEKKyAgICAgICAgICBTZXRNYlBhcmFtcworICAgICAgICAgIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIFNldE1iUGFyYW1zKG1iU3RvcmFnZV90ICpwTWIsIHNsaWNlSGVhZGVyX3QgKnBTbGljZSwgdTMyIHNsaWNlSWQsCisgICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjEgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTbGljZURhdGEKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIG9uZSBzbGljZS4gRnVuY3Rpb24gZGVjb2RlcyBzdHJlYW0gZGF0YSwgaS5lLiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgYW5kIHBvc3NpYmxlIHNraXBfcnVuIGZpZWxkcy4gaDI2NGJzZERlY29kZU1hY3JvYmxvY2sgZnVuY3Rpb24gaXMKKyAgICAgICAgICAgIGNhbGxlZCB0byBoYW5kbGUgYWxsIG90aGVyIG1hY3JvYmxvY2sgcmVsYXRlZCBwcm9jZXNzaW5nLgorICAgICAgICAgICAgTWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXBwaW5nIGlzIGNvbnNpZGVyZWQgd2hlbiBuZXh0CisgICAgICAgICAgICBtYWNyb2Jsb2NrIHRvIHByb2Nlc3MgaXMgZGV0ZXJtaW5lZCAoaDI2NGJzZE5leHRNYkFkZHJlc3MgZnVuY3Rpb24pCisgICAgICAgICAgICBtYXAKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcG9pbnRlciB0byBjdXJyZW50IHByb2Nlc3NlZCBwaWN0dXJlLCBuZWVkZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmEgcHJlZGljdGlvbiBvZiB0aGUgbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBTbGljZUhlYWRlciAgICBwb2ludGVyIHRvIHNsaWNlIGhlYWRlciBvZiB0aGUgY3VycmVudCBzbGljZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcHJvY2Vzc2VkIG1hY3JvYmxvY2tzIGFyZSB3cml0dGVuIHRvIGN1cnJlbnQgaW1hZ2UKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBtYlN0b3JhZ2Ugc3RydWN0dXJlIG9mIGVhY2ggcHJvY2Vzc2VkIG1hY3JvYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1cGRhdGVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3RvcmFnZV90ICpwU3RvcmFnZSwKKyAgICBpbWFnZV90ICpjdXJySW1hZ2UsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlcikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1OCBtYkRhdGFbMzg0ICsgMTUgKyAzMl07CisgICAgdTggKmRhdGE7CisgICAgdTMyIHRtcDsKKyAgICB1MzIgc2tpcFJ1bjsKKyAgICB1MzIgcHJldlNraXBwZWQ7CisgICAgdTMyIGN1cnJNYkFkZHI7CisgICAgdTMyIG1vcmVNYnM7CisgICAgdTMyIG1iQ291bnQ7CisgICAgaTMyIHFwWTsKKyAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllcjsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTbGljZUhlYWRlcik7CisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOworCisgICAgLyogZW5zdXJlIDE2LWJ5dGUgYWxpZ25tZW50ICovCisgICAgZGF0YSA9ICh1OCopQUxJR04obWJEYXRhLCAxNik7CisKKyAgICBtYkxheWVyID0gcFN0b3JhZ2UtPm1iTGF5ZXI7CisKKyAgICBjdXJyTWJBZGRyID0gcFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZTsKKyAgICBza2lwUnVuID0gMDsKKyAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19GQUxTRTsKKworICAgIC8qIGluY3JlbWVudCBzbGljZSBpbmRleCwgd2lsbCBiZSBvbmUgZm9yIGRlY29kaW5nIG9mIHRoZSBmaXJzdCBzbGljZSBvZgorICAgICAqIHRoZSBwaWN0dXJlICovCisgICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkKys7CisKKyAgICAvKiBsYXN0TWJBZGRyIHN0b3JlcyBhZGRyZXNzIG9mIHRoZSBtYWNyb2Jsb2NrIHRoYXQgd2FzIGxhc3Qgc3VjY2Vzc2Z1bGx5CisgICAgICogZGVjb2RlZCwgbmVlZGVkIGZvciBlcnJvciBoYW5kbGluZyAqLworICAgIHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciA9IDA7CisKKyAgICBtYkNvdW50ID0gMDsKKyAgICAvKiBpbml0aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBzbGljZSBpcyBvYnRhaW5lZCBhcyB0aGUgc3VtIG9mCisgICAgICogaW5pdGlhbCBRUCBmb3IgdGhlIHBpY3R1cmUgYW5kIHNsaWNlUXBEZWx0YSBmb3IgdGhlIGN1cnJlbnQgc2xpY2UgKi8KKyAgICBxcFkgPSAoaTMyKXBTdG9yYWdlLT5hY3RpdmVQcHMtPnBpY0luaXRRcCArIHBTbGljZUhlYWRlci0+c2xpY2VRcERlbHRhOworICAgIGRvCisgICAgeworICAgICAgICAvKiBwcmltYXJ5IHBpY3R1cmUgYW5kIGFscmVhZHkgZGVjb2RlZCBtYWNyb2Jsb2NrIC0+IGVycm9yICovCisgICAgICAgIGlmICghcFNsaWNlSGVhZGVyLT5yZWR1bmRhbnRQaWNDbnQgJiYgcFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiUHJpbWFyeSBhbmQgYWxyZWFkeSBkZWNvZGVkIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKworICAgICAgICBTZXRNYlBhcmFtcyhwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBwU2xpY2VIZWFkZXIsCisgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQsIHBTdG9yYWdlLT5hY3RpdmVQcHMtPmNocm9tYVFwSW5kZXhPZmZzZXQpOworCisgICAgICAgIGlmICghSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcHJldlNraXBwZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnNraXBSdW4pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICAvKiBza2lwX3J1biBzaGFsbCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICogbWFjcm9ibG9ja3MgbGVmdCAqLworICAgICAgICAgICAgICAgIGlmIChza2lwUnVuID4gKHBTdG9yYWdlLT5waWNTaXplSW5NYnMgLSBjdXJyTWJBZGRyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEVQUklOVCgic2tpcF9ydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2tpcFJ1bikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldCgmbWJMYXllci0+bWJQcmVkLCAwLCBzaXplb2YobWJQcmVkX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgLyogbWFyayBjdXJyZW50IG1hY3JvYmxvY2sgc2tpcHBlZCAqLworICAgICAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlR5cGUgPSBQX1NraXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNraXBSdW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKCgiU2tpcHBpbmcgbWFjcm9ibG9jayAlZFxuIiwgY3Vyck1iQWRkcikpOworICAgICAgICAgICAgc2tpcFJ1bi0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fRkFMU0U7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHBTdHJtRGF0YSwgbWJMYXllciwKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSwKKyAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgibWFjcm9ibG9ja19sYXllciIpOworICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZU1hY3JvYmxvY2socFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgbWJMYXllciwKKyAgICAgICAgICAgIGN1cnJJbWFnZSwgcFN0b3JhZ2UtPmRwYiwgJnFwWSwgY3Vyck1iQWRkciwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMtPmNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgZGF0YSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIk1BQ1JPX0JMT0NLIik7CisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluY3JlbWVudCBtYWNyb2Jsb2NrIGNvdW50IG9ubHkgZm9yIG1hY3JvYmxvY2tzIHRoYXQgd2VyZSBkZWNvZGVkCisgICAgICAgICAqIGZvciB0aGUgZmlyc3QgdGltZSAocmVkdW5kYW50IHNsaWNlcykgKi8KKyAgICAgICAgaWYgKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkID09IDEpCisgICAgICAgICAgICBtYkNvdW50Kys7CisKKyAgICAgICAgLyoga2VlcCBvbiBwcm9jZXNzaW5nIGFzIGxvbmcgYXMgdGhlcmUgaXMgc3RyZWFtIGRhdGEgbGVmdCBvcgorICAgICAgICAgKiBwcm9jZXNzaW5nIG9mIG1hY3JvYmxvY2tzIHRvIGJlIHNraXBwZWQgYmFzZWQgb24gdGhlIGxhc3Qgc2tpcFJ1biBpcworICAgICAgICAgKiBub3QgZmluaXNoZWQgKi8KKyAgICAgICAgbW9yZU1icyA9IChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkgfHwgc2tpcFJ1bikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIC8qIGxhc3RNYkFkZHIgaXMgb25seSB1cGRhdGVkIGZvciBpbnRyYSBzbGljZXMgKGFsbCBtYWNyb2Jsb2NrcyBvZgorICAgICAgICAgKiBpbnRlciBzbGljZXMgd2lsbCBiZSBsb3N0IGluIGNhc2Ugb2YgYW4gZXJyb3IpICovCisgICAgICAgIGlmIChJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKKyAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciA9IGN1cnJNYkFkZHI7CisKKyAgICAgICAgY3Vyck1iQWRkciA9IGgyNjRic2ROZXh0TWJBZGRyZXNzKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgY3Vyck1iQWRkcik7CisgICAgICAgIC8qIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyIGJ1dCBubyBtb3JlIG1hY3JvYmxvY2tzIGZvciBjdXJyZW50IHNsaWNlCisgICAgICAgICAqIGdyb3VwIC0+IGVycm9yICovCisgICAgICAgIGlmIChtb3JlTWJzICYmICFjdXJyTWJBZGRyKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoIk5leHQgbWIgYWRkcmVzcyIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisKKyAgICB9IHdoaWxlIChtb3JlTWJzKTsKKworICAgIGlmICgocFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzICsgbWJDb3VudCkgPiBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJOdW0gZGVjb2RlZCBtYnMiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyArPSBtYkNvdW50OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4yICBGdW5jdGlvbjogU2V0TWJQYXJhbXMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgU2V0IG1hY3JvYmxvY2sgcGFyYW1ldGVycyB0aGF0IHJlbWFpbiBjb25zdGFudCBmb3IgdGhpcyBzbGljZQorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTbGljZSAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIKKyAgICAgICAgICAgIHNsaWNlSWQgICAgIGlkIG9mIHRoZSBjdXJyZW50IHNsaWNlCisgICAgICAgICAgICBjaHJvbWFRcEluZGV4T2Zmc2V0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXBkYXRlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU2V0TWJQYXJhbXMobWJTdG9yYWdlX3QgKnBNYiwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlLCB1MzIgc2xpY2VJZCwKKyAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKK3sKKworLyogVmFyaWFibGVzICovCisgICAgdTMyIHRtcDE7CisgICAgaTMyIHRtcDIsIHRtcDM7CisKKy8qIENvZGUgKi8KKworICAgIHRtcDEgPSBwU2xpY2UtPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjOworICAgIHRtcDIgPSBwU2xpY2UtPnNsaWNlQWxwaGFDME9mZnNldDsKKyAgICB0bXAzID0gcFNsaWNlLT5zbGljZUJldGFPZmZzZXQ7CisgICAgcE1iLT5zbGljZUlkID0gc2xpY2VJZDsKKyAgICBwTWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gdG1wMTsKKyAgICBwTWItPmZpbHRlck9mZnNldEEgPSB0bXAyOworICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QiA9IHRtcDM7CisgICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gY2hyb21hUXBJbmRleE9mZnNldDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjMgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgTWFyayBtYWNyb2Jsb2NrcyBvZiB0aGUgc2xpY2UgY29ycnVwdGVkLiBJZiBsYXN0TWJBZGRyIGluIHRoZSBzbGljZQorICAgICAgICAgICAgc3RvcmFnZSBpcyBzZXQgLT4gcGljV2lkaHRJbk1icyAob3IgYXQgbGVhc3QgMTApIG1hY3JvYmxvY2tzIGJhY2sKKyAgICAgICAgICAgIGZyb20gIHRoZSBsYXN0TWJBZGRyIGFyZSBtYXJrZWQgY29ycnVwdGVkLiBIb3dldmVyLCBpZiBsYXN0TWJBZGRyCisgICAgICAgICAgICBpcyBub3Qgc2V0IC0+IGFsbCBtYWNyb2Jsb2NrcyBvZiB0aGUgc2xpY2UgYXJlIG1hcmtlZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgZmlyc3RNYkluU2xpY2UgIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgaW4gdGhlIHNsaWNlLCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgc2xpY2UgdG8gYmUgbWFya2VkIGNvcnJ1cHRlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgbWJTdG9yYWdlIGZvciB0aGUgY29ycnVwdGVkIG1hY3JvYmxvY2tzIHVwZGF0ZWQKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIGZpcnN0TWJJblNsaWNlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIGk7CisgICAgdTMyIHNsaWNlSWQ7CisgICAgdTMyIGN1cnJNYkFkZHI7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisgICAgQVNTRVJUKGZpcnN0TWJJblNsaWNlIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7CisKKyAgICBjdXJyTWJBZGRyID0gZmlyc3RNYkluU2xpY2U7CisKKyAgICBzbGljZUlkID0gcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkOworCisgICAgLyogRGVjb2RlU2xpY2VEYXRhIHNldHMgbGFzdE1iQWRkciBmb3IgSSBzbGljZXMgLT4gaWYgaXQgd2FzIHNldCwgZ28gYmFjaworICAgICAqIE1BWChwaWNXaWR0aEluTWJzLCAxMCkgbWFjcm9ibG9ja3MgYW5kIHN0YXJ0IG1hcmtpbmcgZnJvbSB0aGVyZSAqLworICAgIGlmIChwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIpCisgICAgeworICAgICAgICBBU1NFUlQocFN0b3JhZ2UtPm1iW3BTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkcl0uc2xpY2VJZCA9PSBzbGljZUlkKTsKKyAgICAgICAgaSA9IHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciAtIDE7CisgICAgICAgIHRtcCA9IDA7CisgICAgICAgIHdoaWxlIChpID4gY3Vyck1iQWRkcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5tYltpXS5zbGljZUlkID09IHNsaWNlSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgaWYgKHRtcCA+PSBNQVgocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywgMTApKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICBjdXJyTWJBZGRyID0gaTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKworICAgICAgICBpZiAoIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uc2xpY2VJZCA9PSBzbGljZUlkKSAmJgorICAgICAgICAgICAgIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCkgKQorICAgICAgICB7CisgICAgICAgICAgICBwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjdXJyTWJBZGRyID0gaDI2NGJzZE5leHRNYkFkZHJlc3MocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCisgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBjdXJyTWJBZGRyKTsKKworICAgIH0gd2hpbGUgKGN1cnJNYkFkZHIpOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyM2Q0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICisjZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9EQVRBX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVTbGljZURhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzdG9yYWdlX3QgKnBTdG9yYWdlLAorICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyKTsKKwordm9pZCBoMjY0YnNkTWFya1NsaWNlQ29ycnVwdGVkKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBmaXJzdE1iSW5TbGljZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NiYjUzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYwpAQCAtMCwwICsxLDU4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIERlY29kZUludGVybGVhdmVkTWFwCisgICAgICAgICAgRGVjb2RlRGlzcGVyc2VkTWFwCisgICAgICAgICAgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwCisgICAgICAgICAgRGVjb2RlQm94T3V0TWFwCisgICAgICAgICAgRGVjb2RlUmFzdGVyU2Nhbk1hcAorICAgICAgICAgIERlY29kZVdpcGVNYXAKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIERlY29kZUludGVybGVhdmVkTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIG51bVNsaWNlR3JvdXBzLAorICB1MzIgKnJ1bkxlbmd0aCwKKyAgdTMyIHBpY1NpemUpOworCitzdGF0aWMgdm9pZCBEZWNvZGVEaXNwZXJzZWRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgbnVtU2xpY2VHcm91cHMsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKK3N0YXRpYyB2b2lkIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyICp0b3BMZWZ0LAorICB1MzIgKmJvdHRvbVJpZ2h0LAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpOworCitzdGF0aWMgdm9pZCBEZWNvZGVCb3hPdXRNYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiB1bml0c0luU2xpY2VHcm91cDAsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKK3N0YXRpYyB2b2lkIERlY29kZVJhc3RlclNjYW5NYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKKyAgdTMyIHBpY1NpemUpOworCitzdGF0aWMgdm9pZCBEZWNvZGVXaXBlTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlSW50ZXJsZWF2ZWRNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGludGVybGVhdmVkIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCisgICAgICAgICAgICBncm91cCBtYXAgdHlwZSAwLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKKyAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCisgICAgICAgICAgICBydW5MZW5ndGggICAgICAgcnVuX2xlbmd0aFtdIHZhbHVlcyBmb3IgZWFjaCBzbGljZSBncm91cAorICAgICAgICAgICAgcGljU2l6ZSAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVJbnRlcmxlYXZlZE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyICpydW5MZW5ndGgsCisgIHUzMiBwaWNTaXplKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLGosIGdyb3VwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7CisgICAgQVNTRVJUKHJ1bkxlbmd0aCk7CisKKyAgICBpID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbnVtU2xpY2VHcm91cHMgJiYgaSA8IHBpY1NpemU7CisgICAgICAgICAgaSArPSBydW5MZW5ndGhbZ3JvdXArK10pCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChydW5MZW5ndGhbZ3JvdXBdIDw9IHBpY1NpemUpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJ1bkxlbmd0aFtncm91cF0gJiYgaSArIGogPCBwaWNTaXplOyBqKyspCisgICAgICAgICAgICAgICAgbWFwW2kral0gPSBncm91cDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGkgPCBwaWNTaXplKTsKKworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlRGlzcGVyc2VkTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBkaXNwZXJzZWQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKKyAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZURpc3BlcnNlZE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBwaWNTaXplOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKworICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgIG1hcFtpXSA9ICgoaSAlIHBpY1dpZHRoKSArICgoKGkgLyBwaWNXaWR0aCkgKiBudW1TbGljZUdyb3VwcykgPj4gMSkpICUKKyAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGZvcmVncm91bmQgd2l0aCBsZWZ0LW92ZXIgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsCisgICAgICAgICAgICBpLmUuIHNsaWNlIGdyb3VwIG1hcCB0eXBlIDIuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBudW1TbGljZUdyb3VwcyAgICBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCisgICAgICAgICAgICB0b3BMZWZ0ICAgICAgICAgICB0b3BfbGVmdFtdIHZhbHVlcworICAgICAgICAgICAgYm90dG9tUmlnaHQgICAgICAgYm90dG9tX3JpZ2h0W10gdmFsdWVzCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCisgICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBudW1TbGljZUdyb3VwcywKKyAgdTMyICp0b3BMZWZ0LAorICB1MzIgKmJvdHRvbVJpZ2h0LAorICB1MzIgcGljV2lkdGgsCisgIHUzMiBwaWNIZWlnaHQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGkseSx4LHlUb3BMZWZ0LHlCb3R0b21SaWdodCx4VG9wTGVmdCx4Qm90dG9tUmlnaHQsIHBpY1NpemU7CisgICAgdTMyIGdyb3VwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPj0gMSAmJiBudW1TbGljZUdyb3VwcyA8PSBNQVhfTlVNX1NMSUNFX0dST1VQUyk7CisgICAgQVNTRVJUKHRvcExlZnQpOworICAgIEFTU0VSVChib3R0b21SaWdodCk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKworICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCisgICAgICAgIG1hcFtpXSA9IG51bVNsaWNlR3JvdXBzIC0gMTsKKworICAgIGZvciAoZ3JvdXAgPSBudW1TbGljZUdyb3VwcyAtIDE7IGdyb3VwLS07ICkKKyAgICB7CisgICAgICAgIEFTU0VSVCggdG9wTGVmdFtncm91cF0gPD0gYm90dG9tUmlnaHRbZ3JvdXBdICYmCisgICAgICAgICAgICAgICAgYm90dG9tUmlnaHRbZ3JvdXBdIDwgcGljU2l6ZSApOworICAgICAgICB5VG9wTGVmdCA9IHRvcExlZnRbZ3JvdXBdIC8gcGljV2lkdGg7CisgICAgICAgIHhUb3BMZWZ0ID0gdG9wTGVmdFtncm91cF0gJSBwaWNXaWR0aDsKKyAgICAgICAgeUJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRbZ3JvdXBdIC8gcGljV2lkdGg7CisgICAgICAgIHhCb3R0b21SaWdodCA9IGJvdHRvbVJpZ2h0W2dyb3VwXSAlIHBpY1dpZHRoOworICAgICAgICBBU1NFUlQoeFRvcExlZnQgPD0geEJvdHRvbVJpZ2h0KTsKKworICAgICAgICBmb3IgKHkgPSB5VG9wTGVmdDsgeSA8PSB5Qm90dG9tUmlnaHQ7IHkrKykKKyAgICAgICAgICAgIGZvciAoeCA9IHhUb3BMZWZ0OyB4IDw9IHhCb3R0b21SaWdodDsgeCsrKQorICAgICAgICAgICAgICAgIG1hcFsgeSAqIHBpY1dpZHRoICsgeCBdID0gZ3JvdXA7CisgICAgfQorCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVCb3hPdXRNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGJveC1vdXQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UgZ3JvdXAKKyAgICAgICAgICAgIG1hcCB0eXBlIDMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZworICAgICAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwICAgICAgICAgICAgICAgIG1icyBvbiBzbGljZSBncm91cCAwCisgICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcworICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZUJveE91dE1hcCgKKyAgdTMyICptYXAsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKKyAgdTMyIHVuaXRzSW5TbGljZUdyb3VwMCwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBpLCBrLCBwaWNTaXplOworICAgIGkzMiB4LCB5LCB4RGlyLCB5RGlyLCBsZWZ0Qm91bmQsIHRvcEJvdW5kLCByaWdodEJvdW5kLCBib3R0b21Cb3VuZDsKKyAgICB1MzIgbWFwVW5pdFZhY2FudDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKG1hcCk7CisgICAgQVNTRVJUKHBpY1dpZHRoKTsKKyAgICBBU1NFUlQocGljSGVpZ2h0KTsKKworICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKKyAgICBBU1NFUlQodW5pdHNJblNsaWNlR3JvdXAwIDw9IHBpY1NpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgbWFwW2ldID0gMTsKKworICAgIHggPSAocGljV2lkdGggLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnKSA+PiAxOworICAgIHkgPSAocGljSGVpZ2h0IC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZykgPj4gMTsKKworICAgIGxlZnRCb3VuZCA9IHg7CisgICAgdG9wQm91bmQgPSB5OworCisgICAgcmlnaHRCb3VuZCA9IHg7CisgICAgYm90dG9tQm91bmQgPSB5OworCisgICAgeERpciA9IChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOworICAgIHlEaXIgPSAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworCisgICAgZm9yIChrID0gMDsgayA8IHVuaXRzSW5TbGljZUdyb3VwMDsgayArPSBtYXBVbml0VmFjYW50ID8gMSA6IDApCisgICAgeworICAgICAgICBtYXBVbml0VmFjYW50ID0gKG1hcFsgKHUzMil5ICogcGljV2lkdGggKyAodTMyKXggXSA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgaWYgKG1hcFVuaXRWYWNhbnQpCisgICAgICAgICAgICBtYXBbICh1MzIpeSAqIHBpY1dpZHRoICsgKHUzMil4IF0gPSAwOworCisgICAgICAgIGlmICh4RGlyID09IC0xICYmIHggPT0gbGVmdEJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgICBsZWZ0Qm91bmQgPSBNQVgobGVmdEJvdW5kIC0gMSwgMCk7CisgICAgICAgICAgICB4ID0gbGVmdEJvdW5kOworICAgICAgICAgICAgeERpciA9IDA7CisgICAgICAgICAgICB5RGlyID0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHhEaXIgPT0gMSAmJiB4ID09IHJpZ2h0Qm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJpZ2h0Qm91bmQgPSBNSU4ocmlnaHRCb3VuZCArIDEsIChpMzIpcGljV2lkdGggLSAxKTsKKyAgICAgICAgICAgIHggPSByaWdodEJvdW5kOworICAgICAgICAgICAgeERpciA9IDA7CisgICAgICAgICAgICB5RGlyID0gMSAtIDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHlEaXIgPT0gLTEgJiYgeSA9PSB0b3BCb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgdG9wQm91bmQgPSBNQVgodG9wQm91bmQgLSAxLCAwKTsKKyAgICAgICAgICAgIHkgPSB0b3BCb3VuZDsKKyAgICAgICAgICAgIHhEaXIgPSAxIC0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisgICAgICAgICAgICB5RGlyID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh5RGlyID09IDEgJiYgeSA9PSBib3R0b21Cb3VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm90dG9tQm91bmQgPSBNSU4oYm90dG9tQm91bmQgKyAxLCAoaTMyKXBpY0hlaWdodCAtIDEpOworICAgICAgICAgICAgeSA9IGJvdHRvbUJvdW5kOworICAgICAgICAgICAgeERpciA9IDIgKiAoaTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnIC0gMTsKKyAgICAgICAgICAgIHlEaXIgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeCArPSB4RGlyOworICAgICAgICAgICAgeSArPSB5RGlyOworICAgICAgICB9CisgICAgfQorCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNvZGVSYXN0ZXJTY2FuTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSByYXN0ZXIgc2NhbiBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQorICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgNC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCisgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCAgICAgICAgICAgICAgbWJzIGluIHVwcGVyTGVmdEdyb3VwCisgICAgICAgICAgICBwaWNTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIERlY29kZVJhc3RlclNjYW5NYXAoCisgIHUzMiAqbWFwLAorICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKKyAgdTMyIHBpY1NpemUpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChwaWNTaXplKTsKKyAgICBBU1NFUlQoc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPD0gcGljU2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQorICAgICAgICBpZiAoaSA8IHNpemVPZlVwcGVyTGVmdEdyb3VwKQorICAgICAgICAgICAgbWFwW2ldID0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWFwW2ldID0gMSAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IERlY29kZVdpcGVNYXAKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHdpcGUgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UgZ3JvdXAgbWFwCisgICAgICAgICAgICB0eXBlIDUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZworICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgICAgICAgICAgICAgIG1icyBpbiB1cHBlckxlZnRHcm91cAorICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGhlaWdodCBpbiBtYWNyb2Jsb2NrcworCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBEZWNvZGVXaXBlTWFwKAorICB1MzIgKm1hcCwKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAorICB1MzIgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSxqLGs7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChtYXApOworICAgIEFTU0VSVChwaWNXaWR0aCk7CisgICAgQVNTRVJUKHBpY0hlaWdodCk7CisgICAgQVNTRVJUKHNpemVPZlVwcGVyTGVmdEdyb3VwIDw9IHBpY1dpZHRoICogcGljSGVpZ2h0KTsKKworICAgIGsgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCBwaWNXaWR0aDsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljSGVpZ2h0OyBpKyspCisgICAgICAgICAgICBpZiAoaysrIDwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXApCisgICAgICAgICAgICAgICAgbWFwWyBpICogcGljV2lkdGggKyBqIF0gPSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1hcFsgaSAqIHBpY1dpZHRoICsgaiBdID0gMSAtCisgICAgICAgICAgICAgICAgICAgICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBtYWNyb2Jsb2NrIHRvIHNsaWNlIGdyb3VwIG1hcC4gQ29uc3RydWN0aW9uCisgICAgICAgICAgICBvZiBkaWZmZXJlbnQgc2xpY2UgZ3JvdXAgbWFwIHR5cGVzIGlzIGhhbmRsZWQgYnkgc2VwYXJhdGUKKyAgICAgICAgICAgIGZ1bmN0aW9ucyBkZWZpbmVkIGFib3ZlLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMgaG93IHNsaWNlIGdyb3VwCisgICAgICAgICAgICBtYXBzIGFyZSBjb21wdXRlZC4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwcHMgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0CisgICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUKKyAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAoCisgIHUzMiAqbWFwLAorICBwaWNQYXJhbVNldF90ICpwcHMsCisgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUsCisgIHUzMiBwaWNXaWR0aCwKKyAgdTMyIHBpY0hlaWdodCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgcGljU2l6ZSwgdW5pdHNJblNsaWNlR3JvdXAwID0gMCwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPSAwOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQobWFwKTsKKyAgICBBU1NFUlQocHBzKTsKKyAgICBBU1NFUlQocGljV2lkdGgpOworICAgIEFTU0VSVChwaWNIZWlnaHQpOworICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNyk7CisKKyAgICBwaWNTaXplID0gcGljV2lkdGggKiBwaWNIZWlnaHQ7CisKKyAgICAvKiBqdXN0IG9uZSBzbGljZSBncm91cCAtPiBhbGwgbWFjcm9ibG9ja3MgYmVsb25nIHRvIGdyb3VwIDAgKi8KKyAgICBpZiAocHBzLT5udW1TbGljZUdyb3VwcyA9PSAxKQorICAgIHsKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KG1hcCwgMCwgcGljU2l6ZSAqIHNpemVvZih1MzIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID4gMiAmJiBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlIDwgNikKKyAgICB7CisgICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlICYmCisgICAgICAgICAgICAgICBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlIDw9IHBpY1NpemUpOworCisgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCA9CisgICAgICAgICAgICBNSU4oc2xpY2VHcm91cENoYW5nZUN5Y2xlICogcHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSwgcGljU2l6ZSk7CisKKyAgICAgICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNCB8fCBwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDUpCisgICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCA9IHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgPworICAgICAgICAgICAgICAgIChwaWNTaXplIC0gdW5pdHNJblNsaWNlR3JvdXAwKSA6IHVuaXRzSW5TbGljZUdyb3VwMDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBEZWNvZGVJbnRlcmxlYXZlZE1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsCisgICAgICAgICAgICAgIHBwcy0+cnVuTGVuZ3RoLCBwaWNTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERlY29kZURpc3BlcnNlZE1hcChtYXAsIHBwcy0+bnVtU2xpY2VHcm91cHMsIHBpY1dpZHRoLAorICAgICAgICAgICAgICBwaWNIZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywKKyAgICAgICAgICAgICAgcHBzLT50b3BMZWZ0LCBwcHMtPmJvdHRvbVJpZ2h0LCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIERlY29kZUJveE91dE1hcChtYXAsIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgICAgICAgICAgICAgIHVuaXRzSW5TbGljZUdyb3VwMCwgcGljV2lkdGgsIHBpY0hlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBEZWNvZGVSYXN0ZXJTY2FuTWFwKG1hcCwKKyAgICAgICAgICAgICAgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsCisgICAgICAgICAgICAgIHBpY1NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgRGVjb2RlV2lwZU1hcChtYXAsIHBwcy0+c2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCisgICAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwLCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwSWQpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocHBzLT5zbGljZUdyb3VwSWRbaV0gPCBwcHMtPm51bVNsaWNlR3JvdXBzKTsKKyAgICAgICAgICAgICAgICBtYXBbaV0gPSBwcHMtPnNsaWNlR3JvdXBJZFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJjYjZmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9ICisjZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCgKKyAgdTMyICptYXAsCisgIHBpY1BhcmFtU2V0X3QgKnBwcywKKyAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKKyAgdTMyIHBpY1dpZHRoLAorICB1MzIgcGljSGVpZ2h0KTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3YzZmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKQEAgLTAsMCArMSwxNTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVNsaWNlSGVhZGVyCisgICAgICAgICAgTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cworICAgICAgICAgIFJlZlBpY0xpc3RSZW9yZGVyaW5nCisgICAgICAgICAgRGVjUmVmUGljTWFya2luZworICAgICAgICAgIENoZWNrUHBzSWQKKyAgICAgICAgICBDaGVja0ZyYW1lTnVtCisgICAgICAgICAgQ2hlY2tJZHJQaWNJZAorICAgICAgICAgIENoZWNrUGljT3JkZXJDbnRMc2IKKyAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20KKyAgICAgICAgICBDaGVja0RlbHRhUGljT3JkZXJDbnQKKyAgICAgICAgICBDaGVja1JlZHVuZGFudFBpY0NudAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIFJlZlBpY0xpc3RSZW9yZGVyaW5nKHN0cm1EYXRhX3QgKiwgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqLAorICAgIHUzMiwgdTMyKTsKKworc3RhdGljIHUzMiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHUzMiBwaWNTaXplSW5NYnMsCisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKKworc3RhdGljIHUzMiBEZWNSZWZQaWNNYXJraW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICBkZWNSZWZQaWNNYXJraW5nX3QgKnBEZWNSZWZQaWNNYXJraW5nLCBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICAgIHUzMiBudW1SZWZGcmFtZXMpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHNsaWNlIGhlYWRlciBkYXRhIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0CisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0CisgICAgICAgICAgICBwTmFsVW5pdCAgICAgICAgcG9pbnRlciB0byBjdXJyZW50IE5BTCB1bml0IHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU2xpY2VIZWFkZXIgICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YSBvciBlbmQgb2Ygc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsCisgICAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCisgICAgbmFsVW5pdF90ICpwTmFsVW5pdCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKKyAgICBpMzIgaXRtcDsKKyAgICB1MzIgcGljU2l6ZUluTWJzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNsaWNlSGVhZGVyKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQoIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0UgfHwKKyAgICAgICAgICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICk7CisKKworICAgIEgyNjRTd0RlY01lbXNldChwU2xpY2VIZWFkZXIsIDAsIHNpemVvZihzbGljZUhlYWRlcl90KSk7CisKKyAgICBwaWNTaXplSW5NYnMgPSBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzOworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIHBTbGljZUhlYWRlci0+Zmlyc3RNYkluU2xpY2UgPSB2YWx1ZTsKKyAgICBpZiAodmFsdWUgPj0gcGljU2l6ZUluTWJzKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJmaXJzdF9tYl9pbl9zbGljZSIpOworICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgcFNsaWNlSGVhZGVyLT5zbGljZVR5cGUgPSB2YWx1ZTsKKyAgICAvKiBzbGljZSB0eXBlIGhhcyB0byBiZSBlaXRoZXIgSSBvciBQIHNsaWNlLiBQIHNsaWNlIGlzIG5vdCBhbGxvd2VkIHdoZW4KKyAgICAgKiBjdXJyZW50IE5BTCB1bml0IGlzIGFuIElEUiBOQUwgdW5pdCBvciBudW1fcmVmX2ZyYW1lcyBpcyAwICovCisgICAgaWYgKCAhSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkgJiYKKyAgICAgICAgICggIUlTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpIHx8CisgICAgICAgICAgIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgfHwKKyAgICAgICAgICAgIXBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzICkgKQorICAgIHsKKyAgICAgICAgRVBSSU5UKCJzbGljZV90eXBlIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2xpY2VIZWFkZXItPnBpY1BhcmFtZXRlclNldElkID0gdmFsdWU7CisgICAgaWYgKHBTbGljZUhlYWRlci0+cGljUGFyYW1ldGVyU2V0SWQgIT0gcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCkKKyAgICB7CisgICAgICAgIEVQUklOVCgicGljX3BhcmFtZXRlcl9zZXRfaWQiKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJiB0bXAgIT0gMCkKKyAgICB7CisgICAgICAgIEVQUklOVCgiZnJhbWVfbnVtIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisgICAgcFNsaWNlSGVhZGVyLT5mcmFtZU51bSA9IHRtcDsKKworICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5pZHJQaWNJZCA9IHZhbHVlOworICAgICAgICBpZiAodmFsdWUgPiA2NTUzNSkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJpZHJfcGljX2lkIik7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgaS0tOworCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA9IHRtcDsKKworICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20gPSBpdG1wOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgdGhhdCBwaWNPcmRlckNudCBmb3IgSURSIHBpY3R1cmUgd2lsbCBiZSB6ZXJvLiBTZWUKKyAgICAgICAgICogRGVjb2RlUGljT3JkZXJDbnQgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgaGVyZSAqLworICAgICAgICBpZiAoIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYKKyAgICAgICAgICAgICAoIChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID4KKyAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiLzIpIHx8CisgICAgICAgICAgICAgICAgTUlOKChpMzIpcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiwKKyAgICAgICAgICAgICAgICAgICAgKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiICsKKyAgICAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tKSAhPSAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxKSAmJgorICAgICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnICkKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSA9IGl0bXA7CisKKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdID0gaXRtcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIHRoYXQgcGljT3JkZXJDbnQgZm9yIElEUiBwaWN0dXJlIHdpbGwgYmUgemVyby4gU2VlCisgICAgICAgICAqIERlY29kZVBpY09yZGVyQ250IGZ1bmN0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljIGhlcmUgKi8KKyAgICAgICAgaWYgKCBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmCisgICAgICAgICAgICAgTUlOKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFswXSwKKyAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdICsKKyAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICsKKyAgICAgICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzFdKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIHBTbGljZUhlYWRlci0+cmVkdW5kYW50UGljQ250ID0gdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSA+IDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJyZWR1bmRhbnRfcGljX2NudCIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKElTX1BfU0xJQ0UocFNsaWNlSGVhZGVyLT5zbGljZVR5cGUpKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZyA9IHRtcDsKKworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5udW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IDE1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSIpOworICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUgPSB2YWx1ZSArIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogc2V0IG51bVJlZklkeEwwQWN0aXZlIGZyb20gcGljIHBhcmFtIHNldCAqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIHZhbHVlIChtaW51czEpIGluIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBleGNlZWRzIDE1IGl0IHNob3VsZAorICAgICAgICAgICAgICogaGF2ZSBiZWVuIG92ZXJyaWRkZW4gaGVyZSAqLworICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmUgPiAxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnIik7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSA9IHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCisgICAgeworICAgICAgICB0bXAgPSBSZWZQaWNMaXN0UmVvcmRlcmluZyhwU3RybURhdGEsCisgICAgICAgICAgICAmcFNsaWNlSGVhZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZywKKyAgICAgICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUsCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYyAhPSAwKQorICAgIHsKKyAgICAgICAgdG1wID0gRGVjUmVmUGljTWFya2luZyhwU3RybURhdGEsICZwU2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcsCisgICAgICAgICAgICBwTmFsVW5pdC0+bmFsVW5pdFR5cGUsIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgc2xpY2VRcERlbHRhIGFuZCBjaGVjayB0aGF0IGluaXRpYWwgUVAgZm9yIHRoZSBzbGljZSB3aWxsIGJlIG9uCisgICAgICogdGhlIHJhbmdlIFswLCA1MV0gKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKyAgICBwU2xpY2VIZWFkZXItPnNsaWNlUXBEZWx0YSA9IGl0bXA7CisgICAgaXRtcCArPSAoaTMyKXBQaWNQYXJhbVNldC0+cGljSW5pdFFwOworICAgIGlmICggKGl0bXAgPCAwKSB8fCAoaXRtcCA+IDUxKSApCisgICAgeworICAgICAgICBFUFJJTlQoInNsaWNlX3FwX2RlbHRhIik7CisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICBpZiAocFBpY1BhcmFtU2V0LT5kZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgcFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IHZhbHVlOworICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVQUklOVCgiZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgIGlmICggKGl0bXAgPCAtNikgfHwgKGl0bXAgPiA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyIik7CisgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlQWxwaGFDME9mZnNldCA9IGl0bXAgKiAyOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICBpZiAoIChpdG1wIDwgLTYpIHx8IChpdG1wID4gNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9iZXRhX29mZnNldF9kaXYyIik7CisgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2xpY2VIZWFkZXItPnNsaWNlQmV0YU9mZnNldCA9IGl0bXAgKiAyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAocFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyA+IDEpICYmCisgICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA+PSAzKSAmJgorICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPD0gNSkgKQorICAgIHsKKyAgICAgICAgLyogc2V0IHRtcCB0byBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUKKyAgICAgICAgICogaW4gdGhlIHN0cmVhbSAqLworICAgICAgICB0bXAgPSBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHBpY1NpemVJbk1icywKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUpOworICAgICAgICB2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdG1wKTsKKyAgICAgICAgaWYgKHZhbHVlID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VHcm91cENoYW5nZUN5Y2xlID0gdmFsdWU7CisKKyAgICAgICAgLyogY29ycmVzcG9uZHMgdG8gdG1wID0gQ2VpbChwaWNTaXplSW5NYnMgLyBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkgKi8KKyAgICAgICAgdG1wID0gKHBpY1NpemVJbk1icyArIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGUgLSAxKSAvCisgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cENoYW5nZVJhdGU7CisgICAgICAgIGlmIChwU2xpY2VIZWFkZXItPnNsaWNlR3JvdXBDaGFuZ2VDeWNsZSA+IHRtcCkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUiKTsKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogTnVtU2xpY2VHcm91cENoYW5nZUN5Y2xlQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZXRlcm1pbmUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudAorICAgICAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGluIHRoZSBzdHJlYW0uIFRoZSBzdGFuZGFyZCBzdGF0ZXMgdGhhdAorICAgICAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlIGlzIHJlcHJlc2VudGVkIGJ5CisgICAgICAgICAgICAgICAgQ2VpbCggTG9nMiggKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKSArIDEpICkKKworICAgICAgICAgICAgYml0cy4gRGl2aXNpb24gIi8iIGluIHRoZSBlcXVhdGlvbiBpcyBub24tdHJ1bmNhdGluZyBkaXZpc2lvbi4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKKyAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VSYXRlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgbmVlZGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzKHUzMiBwaWNTaXplSW5NYnMsIHUzMiBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLG51bUJpdHMsbWFzazsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBpY1NpemVJbk1icyk7CisgICAgQVNTRVJUKHNsaWNlR3JvdXBDaGFuZ2VSYXRlKTsKKyAgICBBU1NFUlQoc2xpY2VHcm91cENoYW5nZVJhdGUgPD0gcGljU2l6ZUluTWJzKTsKKworICAgIC8qIGNvbXB1dGUgKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlICsgMSksIHJvdW5kZWQgdXAgKi8KKyAgICBpZiAocGljU2l6ZUluTWJzICUgc2xpY2VHcm91cENoYW5nZVJhdGUpCisgICAgICAgIHRtcCA9IDIgKyBwaWNTaXplSW5NYnMvc2xpY2VHcm91cENoYW5nZVJhdGU7CisgICAgZWxzZQorICAgICAgICB0bXAgPSAxICsgcGljU2l6ZUluTWJzL3NsaWNlR3JvdXBDaGFuZ2VSYXRlOworCisgICAgbnVtQml0cyA9IDA7CisgICAgbWFzayA9IH4wVTsKKworICAgIC8qIHNldCBudW1CaXRzIHRvIHBvc2l0aW9uIG9mIHJpZ2h0LW1vc3Qgbm9uLXplcm8gYml0ICovCisgICAgd2hpbGUgKHRtcCAmIChtYXNrPDwrK251bUJpdHMpKQorICAgICAgICA7CisgICAgbnVtQml0cy0tOworCisgICAgLyogYWRkIG9uZSBtb3JlIGJpdCBpZiB2YWx1ZSBncmVhdGVyIHRoYW4gMl5udW1CaXRzICovCisgICAgaWYgKHRtcCAmICgoMTw8bnVtQml0cyktMSkpCisgICAgICAgIG51bUJpdHMrKzsKKworICAgIHJldHVybihudW1CaXRzKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IFJlZlBpY0xpc3RSZW9yZGVyaW5nCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgc3ludGF4IGVsZW1lbnRzIGZyb20KKyAgICAgICAgICAgIHRoZSBzdHJlYW0uIE1heCBudW1iZXIgb2YgcmVvcmRlcmluZyBjb21tYW5kcyBpcyBudW1SZWZJZHhBY3RpdmUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyB0byBiZSB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgc2xpY2UKKyAgICAgICAgICAgIG1heFBpY051bSAgICAgICBtYXhGcmFtZU51bSBmcm9tIHRoZSBhY3RpdmUgU1BTCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZyAgIGRlY29kZWQgZGF0YSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIFJlZlBpY0xpc3RSZW9yZGVyaW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpwUmVmUGljTGlzdFJlb3JkZXJpbmcsIHUzMiBudW1SZWZJZHhBY3RpdmUsCisgICAgdTMyIG1heFBpY051bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICB1MzIgY29tbWFuZDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBSZWZQaWNMaXN0UmVvcmRlcmluZyk7CisgICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSk7CisgICAgQVNTRVJUKG1heFBpY051bSk7CisKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPnJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwID0gdG1wOworCisgICAgaWYgKHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+cmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDApCisgICAgeworICAgICAgICBpID0gMDsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IG51bVJlZklkeEFjdGl2ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFUFJJTlQoIlRvbyBtYW55IHJlb3JkZXJpbmcgY29tbWFuZHMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb21tYW5kKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgaWYgKGNvbW1hbmQgPiAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVQUklOVCgicmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID0gY29tbWFuZDsKKworICAgICAgICAgICAgaWYgKChjb21tYW5kID09IDApIHx8IChjb21tYW5kID09IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSBtYXhQaWNOdW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoImFic19kaWZmX3BpY19udW1fbWludXMxIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLmFic0RpZmZQaWNOdW0gPSB2YWx1ZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29tbWFuZCA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+Y29tbWFuZFtpXS5sb25nVGVybVBpY051bSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSB3aGlsZSAoY29tbWFuZCAhPSAzKTsKKworICAgICAgICAvKiB0aGVyZSBzaGFsbCBiZSBhdCBsZWFzdCBvbmUgcmVvcmRlcmluZyBjb21tYW5kIGlmCisgICAgICAgICAqIHJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwIHdhcyBzZXQgKi8KKyAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgRVBSSU5UKCJyZWZfcGljX2xpc3RfcmVvcmRlcmluZyIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBEZWNSZWZQaWNNYXJraW5nCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlIG1hcmtpbmcgc3ludGF4IGVsZW1lbnRzIGZyb20KKyAgICAgICAgICAgIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorICAgICAgICAgICAgbnVtUmVmRnJhbWVzICAgIG1heCBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcyBmcm9tIHRoZSBhY3RpdmUgU1BTCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgRGVjUmVmUGljTWFya2luZyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgZGVjUmVmUGljTWFya2luZ190ICpwRGVjUmVmUGljTWFya2luZywgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgICB1MzIgbnVtUmVmRnJhbWVzKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlOworICAgIHUzMiBpOworICAgIHUzMiBvcGVyYXRpb247CisgICAgLyogdmFyaWFibGVzIGZvciBlcnJvciBjaGVja2luZyBwdXJwb3Nlcywgc3RvcmUgbnVtYmVyIG9mIG1lbW9yeQorICAgICAqIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyBvZiBjZXJ0YWluIHR5cGUgKi8KKyAgICB1MzIgbnVtNCA9IDAsIG51bTUgPSAwLCBudW02ID0gMCwgbnVtMXRvMyA9IDA7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVCggbmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUiB8fAorICAgICAgICAgICAgbmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFIHx8CisgICAgICAgICAgICBuYWxVbml0VHlwZSA9PSBOQUxfU0VJICk7CisKKworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+bm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSB0bXA7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnID0gdG1wOworICAgICAgICBpZiAoIW51bVJlZkZyYW1lcyAmJiBwRGVjUmVmUGljTWFya2luZy0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBFUFJJTlQoImxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyIpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnID0gdG1wOworICAgICAgICBpZiAocERlY1JlZlBpY01hcmtpbmctPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2VlIGV4cGxhbmF0aW9uIG9mIHRoZSBNQVhfTlVNX01NQ19PUEVSQVRJT05TIGluCisgICAgICAgICAgICAgICAgICogc2xpY2VfaGVhZGVyLmggKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA+ICgyICogbnVtUmVmRnJhbWVzICsgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIlRvbyBtYW55IG1hbmFnZW1lbnQgb3BlcmF0aW9ucyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJm9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPiA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KKyAgICAgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24gPSBvcGVyYXRpb247CisgICAgICAgICAgICAgICAgaWYgKChvcGVyYXRpb24gPT0gMSkgfHwgKG9wZXJhdGlvbiA9PSAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1QaWNOdW0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChvcGVyYXRpb24gPT0gMykgfHwgKG9wZXJhdGlvbiA9PSA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0ubG9uZ1Rlcm1GcmFtZUlkeCA9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgICAgICAgICAgICAgLyogdmFsdWUgc2hhbGwgYmUgaW4gcmFuZ2UgWzAsIG51bVJlZkZyYW1lc10gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gbnVtUmVmRnJhbWVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9uZ1Rlcm1GcmFtZUlkeCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvbmdUZXJtRnJhbWVJZHggPSB2YWx1ZSAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbnVtNCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBudW01Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gJiYgb3BlcmF0aW9uIDw9IDMpCisgICAgICAgICAgICAgICAgICAgIG51bTF0bzMrKzsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDYpCisgICAgICAgICAgICAgICAgICAgIG51bTYrKzsKKworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKG9wZXJhdGlvbiAhPSAwKTsKKworICAgICAgICAgICAgLyogZXJyb3IgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmIChudW00ID4gMSB8fCBudW01ID4gMSB8fCBudW02ID4gMSB8fCAobnVtMXRvMyAmJiBudW01KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZENoZWNrUHBzSWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBwaWNfcGFyYW1ldGVyX3NldF9pZCBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCisgICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQorICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZworICAgICAgICAgICAgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBpY1BhcmFtU2V0SWQgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1Bwc0lkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpwaWNQYXJhbVNldElkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgaWYgKHZhbHVlID49IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICpwaWNQYXJhbVNldElkID0gdmFsdWU7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0ZyYW1lTnVtCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgZnJhbWVfbnVtIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QKKyAgICAgICAgICAgIG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEKKyAgICAgICAgICAgIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbQorICAgICAgICAgICAgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG1heEZyYW1lTnVtCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGZyYW1lTnVtICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0ZyYW1lTnVtKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHUzMiBtYXhGcmFtZU51bSwKKyAgdTMyICpmcmFtZU51bSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQobWF4RnJhbWVOdW0pOworICAgIEFTU0VSVChmcmFtZU51bSk7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChtYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICpmcmFtZU51bSA9IHRtcDsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrSWRyUGljSWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBpZHJfcGljX2lkIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QKKyAgICAgICAgICAgIG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEKKyAgICAgICAgICAgIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbQorICAgICAgICAgICAgZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG1heEZyYW1lTnVtICAgICBtYXggZnJhbWUgbnVtYmVyIGZyb20gYWN0aXZlIFNQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgaWRyUGljSWQgICAgICAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrSWRyUGljSWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyIG1heEZyYW1lTnVtLAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKmlkclBpY0lkKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChtYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKGlkclBpY0lkKTsKKworICAgIC8qIG5hbFVuaXRUeXBlIG11c3QgYmUgZXF1YWwgdG8gNSBiZWNhdXNlIG90aGVyd2lzZSBpZHJQaWNJZCBpcyBub3QKKyAgICAgKiBwcmVzZW50ICovCisgICAgaWYgKG5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKG1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGlkcl9waWNfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsIGlkclBpY0lkKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcGljX29yZGVyX2NudF9sc2IgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgorICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICAgICAgICAgIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUworICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgcGljT3JkZXJDbnRMc2IgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKnBpY09yZGVyQ250THNiKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiB0bXAsIHZhbHVlLCBpOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChwaWNPcmRlckNudExzYik7CisKKyAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAwICovCisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7CisKKyAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCisgICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKKworICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBza2lwIGZyYW1lX251bSAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKworICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgIGkgPSAwOworICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCisgICAgICAgIGkrKzsKKyAgICBpLS07CisKKyAgICAvKiBwaWNfb3JkZXJfY250X2xzYiAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAqcGljT3JkZXJDbnRMc2IgPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20KKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSBmcm9tIHRoZSBzbGljZSBoZWFkZXIuCisgICAgICAgICAgICBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlCisgICAgICAgICAgICBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlCisgICAgICAgICAgICBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250Qm90dG9tICB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICBpMzIgKmRlbHRhUGljT3JkZXJDbnRCb3R0b20pCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7CisgICAgQVNTRVJUKGRlbHRhUGljT3JkZXJDbnRCb3R0b20pOworCisgICAgLyogcGljT3JkZXJDbnRUeXBlIG11c3QgYmUgZXF1YWwgdG8gMCBhbmQgcGljT3JkZXJQcmVzZW50RmxhZyBtdXN0IGJlIFRSVUUKKyAgICAgKiAqLworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSk7CisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWVzIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gYW5kIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0KKyAgICAgICAgICAgIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24gZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtCisgICAgICAgICAgICBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nIHN0cmVhbSBkYXRhLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgICAgICAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICAgICAgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKKyAgICAgICAgICAgIHBpY09yZGVyUHJlc2VudEZsYWcgICAgIGZsYWcgaW5kaWNhdGluZyBpZiBkZWx0YV9waWNfb3JkZXJfY250WzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcmVzZW50IGluIHRoZSBzdHJlYW0KKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudCAgICAgICAgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICAgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250KAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyIHBpY09yZGVyUHJlc2VudEZsYWcsCisgIGkzMiAqZGVsdGFQaWNPcmRlckNudCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQoZGVsdGFQaWNPcmRlckNudCk7CisKKyAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAxIGFuZCBkZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgbXVzdAorICAgICAqIGJlIEZBTFNFICovCisgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpOworICAgIEFTU0VSVCghcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCisgICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorCisgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFswXSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZkZWx0YVBpY09yZGVyQ250WzBdKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KKyAgICBpZiAocGljT3JkZXJQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZkZWx0YVBpY09yZGVyQ250WzFdKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHJlZHVuZGFudF9waWNfY250IGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KKyAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCisgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCisgICAgICAgICAgICBzdHJlYW0gZGF0YS4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKKyAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBQUFMKKyAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0CisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHJlZHVuZGFudFBpY0NudCB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICpyZWR1bmRhbnRQaWNDbnQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIHRtcCwgdmFsdWUsIGk7CisgICAgaTMyIGl2YWx1ZTsKKyAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKKyAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKKyAgICBBU1NFUlQocmVkdW5kYW50UGljQ250KTsKKworICAgIC8qIHJlZHVuZGFudF9waWNfY250X2ZsYWcgbXVzdCBiZSBUUlVFICovCisgICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKKyAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPiAwIHx8CisgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IpOworCisgICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLworICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7CisKKyAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KKyAgICBpID0gMDsKKyAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQorICAgICAgICBpKys7CisgICAgaS0tOworCisgICAgLyogc2tpcCBmcmFtZV9udW0gKi8KKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KKyAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgaS0tOworCisgICAgICAgIC8qIHBpY19vcmRlcl9jbnRfbHNiICovCisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSAmJgorICAgICAgIXBTZXFQYXJhbVNldC0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQorICAgIHsKKyAgICAgICAgLyogZGVsdGFfcGljX29yZGVyX2NudFswXSAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KKyAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlZHVuZGFudF9waWNfY250ICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCByZWR1bmRhbnRQaWNDbnQpOworICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4odG1wKTsKKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFBlZWsgdmFsdWUgb2Ygbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyBmcm9tIHRoZSBzbGljZSBoZWFkZXIuCisgICAgICAgICAgICBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMKKyAgICAgICAgICAgIHRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlCisgICAgICAgICAgICBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgUFBTCisgICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub091dHB1dE9mUHJpb3JQaWNzRmxhZyB2YWx1ZSBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qbGludCAtZTcxNSBkaXNhYmxlIGxpbnQgaW5mbyBuYWxVbml0VHlwZSBub3QgcmVmZXJlbmNlZCAqLwordTMyIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcodTMyICogbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJtRGF0YV90ICogcFN0cm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VxUGFyYW1TZXRfdCAqIHBTZXFQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpY1BhcmFtU2V0X3QgKiBwUGljUGFyYW1TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlKQoreworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKKyAgICBpMzIgaXZhbHVlOworICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworICAgIEFTU0VSVChub091dHB1dE9mUHJpb3JQaWNzRmxhZyk7CisKKyAgICAvKiBtdXN0IGJlIElEUiBsc2ljZSAqLworICAgIEFTU0VSVChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKTsKKworICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KKyAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOworCisgICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLworICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICBpZih0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICByZXR1cm4gKHRtcCk7CisKKyAgICAvKiBzbGljZV90eXBlICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAodG1wKTsKKworICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7CisgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuICh0bXApOworCisgICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLworICAgIGkgPSAwOworICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKKyAgICAgICAgaSsrOworICAgIGktLTsKKworICAgIC8qIHNraXAgZnJhbWVfbnVtICovCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgIGlmKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOworCisgICAgLyogc2tpcCBpZHJfcGljX2lkICovCisgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOworICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybiAodG1wKTsKKworICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICAvKiBsb2cyKG1heFBpY09yZGVyQ250THNiKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgaS0tOworCisgICAgICAgIC8qIHNraXAgcGljX29yZGVyX2NudF9sc2IgKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOworICAgICAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICovCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSAmJgorICAgICAgICFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKKyAgICB7CisgICAgICAgIC8qIHNraXAgZGVsdGFfcGljX29yZGVyX2NudFswXSAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKKyAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybiAodG1wKTsKKworICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLworICAgICAgICBpZihwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOworICAgICAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBza2lwIHJlZHVuZGFudF9waWNfY250ICovCisgICAgaWYocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKKyAgICAgICAgaWYodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybiAodG1wKTsKKyAgICB9CisKKyAgICAqbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgMSk7CisgICAgaWYoKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisKKyAgICByZXR1cm4gKEhBTlRST19PSyk7CisKK30KKy8qbGludCArZTcxNSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTg4OThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9ICisjZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZW51bSB7CisgICAgUF9TTElDRSA9IDAsCisgICAgSV9TTElDRSA9IDIKK307CisKK2VudW0ge05PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTID0gMHhGRkZGfTsKKworLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIHNsaWNlIGlzIGFuIGludGVyIHNsaWNlLCBzbGljZVR5cGVzIDAgYW5kIDUgKi8KKyNkZWZpbmUgSVNfUF9TTElDRShzbGljZVR5cGUpICgoKHNsaWNlVHlwZSkgPT0gUF9TTElDRSkgfHwgXAorICAgICgoc2xpY2VUeXBlKSA9PSBQX1NMSUNFICsgNSkpCisKKy8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBzbGljZSBpcyBhbiBpbnRyYSBzbGljZSwgc2xpY2VUeXBlcyAyIGFuZCA3ICovCisjZGVmaW5lIElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSAoKChzbGljZVR5cGUpID09IElfU0xJQ0UpIHx8IFwKKyAgICAoKHNsaWNlVHlwZSkgPT0gSV9TTElDRSArIDUpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIERhdGEgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBkYXRhIG9mIG9uZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgb3BlcmF0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiByZW9yZGVyaW5nT2ZQaWNOdW1zSWRjOworICAgIHUzMiBhYnNEaWZmUGljTnVtOworICAgIHUzMiBsb25nVGVybVBpY051bTsKK30gcmVmUGljTGlzdFJlb3JkZXJpbmdPcGVyYXRpb25fdDsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBvcGVyYXRpb25zICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiByZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMDsKKyAgICByZWZQaWNMaXN0UmVvcmRlcmluZ09wZXJhdGlvbl90IGNvbW1hbmRbTUFYX05VTV9SRUZfUElDUysxXTsKK30gcmVmUGljTGlzdFJlb3JkZXJpbmdfdDsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIGRhdGEgb2Ygb25lIERQQiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgbWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb247CisgICAgdTMyIGRpZmZlcmVuY2VPZlBpY051bXM7CisgICAgdTMyIGxvbmdUZXJtUGljTnVtOworICAgIHUzMiBsb25nVGVybUZyYW1lSWR4OworICAgIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4OworfSBtZW1vcnlNYW5hZ2VtZW50T3BlcmF0aW9uX3Q7CisKKy8qIHdvcnN0IGNhc2Ugc2NlbmFyaW86IGFsbCBNQVhfTlVNX1JFRl9QSUNTIHBpY3R1cmVzIGluIHRoZSBidWZmZXIgYXJlCisgKiBzaG9ydCB0ZXJtIHBpY3R1cmVzLCBlYWNoIG9uZSBvZiB0aGVtIGlzIGZpcnN0IG1hcmtlZCBhcyBsb25nIHRlcm0KKyAqIHJlZmVyZW5jZSBwaWN0dXJlIHdoaWNoIGlzIHRoZW4gbWFya2VkIGFzIHVudXNlZCBmb3IgcmVmZXJlbmNlLgorICogQWRkaXRpb25hbGx5LCBtYXggbG9uZy10ZXJtIGZyYW1lIGluZGV4IGlzIHNldCBhbmQgY3VycmVudCBwaWN0dXJlIGlzCisgKiBtYXJrZWQgYXMgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlLiBMYXN0IHBvc2l0aW9uIHJlc2VydmVkIGZvcgorICogZW5kIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUFYX05VTV9NTUNfT1BFUkFUSU9OUyAoMipNQVhfTlVNX1JFRl9QSUNTKzIrMSkKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIGRlY29kZWQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBkYXRhICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBub091dHB1dE9mUHJpb3JQaWNzRmxhZzsKKyAgICB1MzIgbG9uZ1Rlcm1SZWZlcmVuY2VGbGFnOworICAgIHUzMiBhZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZzsKKyAgICBtZW1vcnlNYW5hZ2VtZW50T3BlcmF0aW9uX3Qgb3BlcmF0aW9uW01BWF9OVU1fTU1DX09QRVJBVElPTlNdOworfSBkZWNSZWZQaWNNYXJraW5nX3Q7CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBzbGljZSBoZWFkZXIgZGF0YSBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgZmlyc3RNYkluU2xpY2U7CisgICAgdTMyIHNsaWNlVHlwZTsKKyAgICB1MzIgcGljUGFyYW1ldGVyU2V0SWQ7CisgICAgdTMyIGZyYW1lTnVtOworICAgIHUzMiBpZHJQaWNJZDsKKyAgICB1MzIgcGljT3JkZXJDbnRMc2I7CisgICAgaTMyIGRlbHRhUGljT3JkZXJDbnRCb3R0b207CisgICAgaTMyIGRlbHRhUGljT3JkZXJDbnRbMl07CisgICAgdTMyIHJlZHVuZGFudFBpY0NudDsKKyAgICB1MzIgbnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnOworICAgIHUzMiBudW1SZWZJZHhMMEFjdGl2ZTsKKyAgICBpMzIgc2xpY2VRcERlbHRhOworICAgIHUzMiBkaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYzsKKyAgICBpMzIgc2xpY2VBbHBoYUMwT2Zmc2V0OworICAgIGkzMiBzbGljZUJldGFPZmZzZXQ7CisgICAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZTsKKyAgICByZWZQaWNMaXN0UmVvcmRlcmluZ190IHJlZlBpY0xpc3RSZW9yZGVyaW5nOworICAgIGRlY1JlZlBpY01hcmtpbmdfdCBkZWNSZWZQaWNNYXJraW5nOworfSBzbGljZUhlYWRlcl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzbGljZUhlYWRlcl90ICpwU2xpY2VIZWFkZXIsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAorICBuYWxVbml0X3QgKnBOYWxVbml0KTsKKwordTMyIGgyNjRic2RDaGVja1Bwc0lkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpwcHNJZCk7CisKK3UzMiBoMjY0YnNkQ2hlY2tGcmFtZU51bSgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICB1MzIgbWF4RnJhbWVOdW0sCisgIHUzMiAqZnJhbWVOdW0pOworCit1MzIgaDI2NGJzZENoZWNrSWRyUGljSWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyIG1heEZyYW1lTnVtLAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgKmlkclBpY0lkKTsKKwordTMyIGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICpwaWNPcmRlckNudExzYik7CisKK3UzMiBoMjY0YnNkQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tKAorICBzdHJtRGF0YV90ICpwU3RybURhdGEsCisgIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgaTMyICpkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKwordTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAorICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAorICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZywKKyAgaTMyICpkZWx0YVBpY09yZGVyQ250KTsKKwordTMyIGgyNjRic2RDaGVja1JlZHVuZGFudFBpY0NudCgKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCisgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKKyAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSwKKyAgdTMyICpyZWR1bmRhbnRQaWNDbnQpOworCit1MzIgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZyh1MzIgKiBub091dHB1dE9mUHJpb3JQaWNzRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cm1EYXRhX3QgKiBwU3RybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXFQYXJhbVNldF90ICogcFNlcVBhcmFtU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGljUGFyYW1TZXRfdCAqIHBQaWNQYXJhbVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9IRUFERVJfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjM0NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuYwpAQCAtMCwwICsxLDg4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworICAgICAzLiBNb2R1bGUgZGVmaW5lcworICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgIDUuIEZ1bmN0aW9ucworICAgICAgICAgIGgyNjRic2RJbml0U3RvcmFnZQorICAgICAgICAgIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0CisgICAgICAgICAgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQKKyAgICAgICAgICBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMKKyAgICAgICAgICBoMjY0YnNkUmVzZXRTdG9yYWdlCisgICAgICAgICAgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkSXNFbmRPZlBpY3R1cmUKKyAgICAgICAgICBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKKyAgICAgICAgICBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkKKyAgICAgICAgICBDaGVja1BwcworICAgICAgICAgIGgyNjRic2RWYWxpZFBhcmFtU2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgorI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCIKKyNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgorI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDMuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgQ2hlY2tQcHMocGljUGFyYW1TZXRfdCAqcHBzLCBzZXFQYXJhbVNldF90ICpzcHMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZEluaXRTdG9yYWdlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEluaXRpYWxpemUgc3RvcmFnZSBzdHJ1Y3R1cmUuIFNldHMgY29udGVudHMgb2YgdGhlIHN0b3JhZ2UgdG8gJzAnCisgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBhY3RpdmUgcGFyYW1ldGVyIHNldCBpZHMsIHdoaWNoIGFyZSBpbml0aWFsaXplZAorICAgICAgICAgICAgdG8gaW52YWxpZCB2YWx1ZXMuCisKKyAgICAgICAgSW5wdXRzOgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICBpbml0aWFsaXplZCBkYXRhIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBoMjY0YnNkSW5pdFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RvcmFnZSk7CisKKyAgICBIMjY0U3dEZWNNZW1zZXQocFN0b3JhZ2UsIDAsIHNpemVvZihzdG9yYWdlX3QpKTsKKworICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFM7CisgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsKKworICAgIHBTdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcgPSBIQU5UUk9fVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTdG9yZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGludG8gdGhlIHN0b3JhZ2UuIElmIGFjdGl2ZSBTUFMgaXMKKyAgICAgICAgICAgIG92ZXJ3cml0dGVuIC0+IGNoZWNrIGlmIGNvbnRlbnRzIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMsIHNldAorICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkU3RvcmVTZXFQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGlkOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOworICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7CisKKyAgICBpZCA9IHBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQ7CisKKyAgICAvKiBzZXEgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICBpZiAocFN0b3JhZ2UtPnNwc1tpZF0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5zcHNbaWRdLCAxLCBzZXFQYXJhbVNldF90KTsKKyAgICAgICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIH0KKyAgICAvKiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgZXF1YWwgdG8gaWQgb2YgYWN0aXZlIHNwcyAqLworICAgIGVsc2UgaWYgKGlkID09IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICB7CisgICAgICAgIC8qIGlmIHNlcSBwYXJhbWV0ZXIgc2V0IGNvbnRlbnRzIGNoYW5nZXMKKyAgICAgICAgICogICAgLT4gb3ZlcndyaXRlIGFuZCByZS1hY3RpdmF0ZSB3aGVuIG5leHQgSURSIHBpY3R1cmUgZGVjb2RlZAorICAgICAgICAgKiAgICBpZHMgb2YgYWN0aXZlIHBhcmFtIHNldHMgc2V0IHRvIGludmFsaWQgdmFsdWVzIHRvIGZvcmNlCisgICAgICAgICAqICAgIHJlLWFjdGl2YXRpb24uIE1lbW9yaWVzIGFsbG9jYXRlZCBmb3Igb2xkIHNwcyBmcmVlZAorICAgICAgICAgKiBvdGhlcndpc2UgZnJlZSBtZW1lcmllcyBhbGxvY2F0ZWQgZm9yIGp1c3QgZGVjb2RlZCBzcHMgYW5kCisgICAgICAgICAqIGNvbnRpbnVlICovCisgICAgICAgIGlmIChoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhwU2VxUGFyYW1TZXQsIHBTdG9yYWdlLT5hY3RpdmVTcHMpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPm9mZnNldEZvclJlZkZyYW1lKTsKKyAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUyArIDE7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTICsgMTsKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBOVUxMOworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGUkVFKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUpOworICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogb3ZlcndyaXRlIHNlcSBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKKyAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpZF0tPnZ1aVBhcmFtZXRlcnMpOworICAgIH0KKworICAgICpwU3RvcmFnZS0+c3BzW2lkXSA9ICpwU2VxUGFyYW1TZXQ7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RTdG9yZVBpY1BhcmFtU2V0CisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFN0b3JlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgUFBTIGlzCisgICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBhY3RpdmUgU1BTIGNoYW5nZXMgYW5kIGlmIGl0IGRvZXMgLT4gc2V0CisgICAgICAgICAgICBwYXJhbWV0ZXJzIHRvIGZvcmNlIHJlYWN0aXZhdGlvbiBvZiBwYXJhbWV0ZXIgc2V0cworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisgICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgcG9pbnRlciB0byBwYXJhbSBzZXQgdG8gYmUgc3RvcmVkCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgdTMyIGlkOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOworICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUyk7CisgICAgQVNTRVJUKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPCBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKTsKKworICAgIGlkID0gcFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZDsKKworICAgIC8qIHBpYyBwYXJhbWV0ZXIgc2V0IHdpdGggaWQgbm90IHVzZWQgYmVmb3JlIC0+IGFsbG9jYXRlIG1lbW9yeSAqLworICAgIGlmIChwU3RvcmFnZS0+cHBzW2lkXSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnBwc1tpZF0sIDEsIHBpY1BhcmFtU2V0X3QpOworICAgICAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgfQorICAgIC8qIHBpY3R1cmUgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBwcHMgKi8KKyAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlUHBzSWQpCisgICAgeworICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHNlcSBwYXJhbSBzZXQgY2hhbmdlcywgZm9yY2UgcmUtYWN0aXZhdGlvbiBvZgorICAgICAgICAgKiBwYXJhbSBzZXQgaWYgaXQgZG9lcy4gU2V0IGFjdGl2ZVNwc0lkIHRvIGludmFsaWQgdmFsdWUgdG8KKyAgICAgICAgICogYWNjb21wbGlzaCB0aGlzICovCisgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkICE9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZCkKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogZnJlZSBtZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7CisgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKKyAgICB9CisgICAgLyogb3ZlcndyaXRlIHBpYyBwYXJhbSBzZXQgb3RoZXIgdGhhbiBhY3RpdmUgb25lIC0+IGZyZWUgbWVtb3JpZXMKKyAgICAgKiBhbGxvY2F0ZWQgZm9yIG9sZCBwYXJhbSBzZXQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ydW5MZW5ndGgpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT50b3BMZWZ0KTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+Ym90dG9tUmlnaHQpOworICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5zbGljZUdyb3VwSWQpOworICAgIH0KKworICAgICpwU3RvcmFnZS0+cHBzW2lkXSA9ICpwUGljUGFyYW1TZXQ7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBBY3RpdmF0ZSBjZXJ0YWluIFNQUy9QUFMgY29tYmluYXRpb24uIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUKKyAgICAgICAgICAgIGNhbGxlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGljdHVyZS4gUGljdHVyZSBwYXJhbWV0ZXIgc2V0CisgICAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBhcyB3YW50ZWQsIGJ1dCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IG1heSBvbmx5IGJlCisgICAgICAgICAgICBjaGFuZ2VkIHdoZW4gdGhlIHN0YXJ0aW5nIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUuCisKKyAgICAgICAgICAgIFdoZW4gbmV3IFNQUyBpcyBhY3RpdmF0ZWQgdGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yCisgICAgICAgICAgICBtYWNyb2Jsb2NrIHN0b3JhZ2VzIGFuZCBzbGljZSBncm91cCBtYXAgYW5kIChyZS0paW5pdGlhbGl6ZXMgdGhlCisgICAgICAgICAgICBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgYWN0aXZhdGlvbiB0aGUgb2xkCisgICAgICAgICAgICBhbGxvY2F0aW9ucyBhcmUgZnJlZWQgYW5kIEZyZWVEcGIgY2FsbGVkIGJlZm9yZSBuZXcgYWxsb2NhdGlvbnMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgcHBzSWQgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIFBQUyB0byBiZSBhY3RpdmF0ZWQsIFNQUyBpZCBvYnRhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIFBQUworICAgICAgICAgICAgaXNJZHIgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHBpY3R1cmUgaXMgYW4gSURSIHBpY3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIG5vbi1leGlzdGluZyBvciBpbnZhbGlkIHBhcmFtIHNldCBjb21iaW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlpbmcgdG8gY2hhbmdlIFNQUyB3aXRoIG5vbi1JRFIgcGljdHVyZQorICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgICAgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgcHBzSWQsIHUzMiBpc0lkcikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworICAgIHUzMiBmbGFnOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0b3JhZ2UpOworICAgIEFTU0VSVChwcHNJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOworCisgICAgLyogY2hlY2sgdGhhdCBwcHMgYW5kIGNvcnJlc3BvbmRpbmcgc3BzIGV4aXN0ICovCisgICAgaWYgKCAocFN0b3JhZ2UtPnBwc1twcHNJZF0gPT0gTlVMTCkgfHwKKyAgICAgICAgIChwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZF0gPT0gTlVMTCkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgcHBzIHBhcmFtZXRlcnMgZG8gbm90IHZpb2xhdGUgcGljdHVyZSBzaXplIGNvbnN0cmFpbnRzICovCisgICAgdG1wID0gQ2hlY2tQcHMocFN0b3JhZ2UtPnBwc1twcHNJZF0sCisgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdKTsKKyAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAvKiBmaXJzdCBhY3RpdmF0aW9uIHBhcnQxICovCisgICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9PSBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKQorICAgIHsKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKKyAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+c2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5hY3RpdmVTcHNJZF07CisgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPQorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKKworICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT53aWR0aCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnM7CisgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmhlaWdodCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgICAgIHBTdG9yYWdlLT5wZW5kaW5nQWN0aXZhdGlvbiA9IEhBTlRST19UUlVFOworICAgIH0KKyAgICAvKiBmaXJzdCBhY3RpdmF0aW9uIHBhcnQyICovCisgICAgZWxzZSBpZiAocFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uKQorICAgIHsKKyAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX0ZBTFNFOworCisgICAgICAgIEZSRUUocFN0b3JhZ2UtPm1iKTsKKyAgICAgICAgRlJFRShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCk7CisKKyAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPm1iLCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBtYlN0b3JhZ2VfdCk7CisgICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCB1MzIpOworICAgICAgICBpZiAocFN0b3JhZ2UtPm1iID09IE5VTEwgfHwgcFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisKKyAgICAgICAgSDI2NFN3RGVjTWVtc2V0KHBTdG9yYWdlLT5tYiwgMCwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgKiBzaXplb2YobWJTdG9yYWdlX3QpKTsKKworICAgICAgICBoMjY0YnNkSW5pdE1iTmVpZ2hib3VycyhwU3RvcmFnZS0+bWIsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzLAorICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7CisKKyAgICAgICAgLyogZHBiIG91dHB1dCByZW9yZGVyaW5nIGRpc2FibGVkIGlmCisgICAgICAgICAqIDEpIGFwcGxpY2F0aW9uIHNldCBub1Jlb3JkZXJpbmcgZmxhZworICAgICAgICAgKiAyKSBQT0MgdHlwZSBlcXVhbCB0byAyCisgICAgICAgICAqIDMpIG51bV9yZW9yZGVyX2ZyYW1lcyBpbiB2dWkgZXF1YWwgdG8gMCAqLworICAgICAgICBpZiAoIHBTdG9yYWdlLT5ub1Jlb3JkZXJpbmcgfHwKKyAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNPcmRlckNudFR5cGUgPT0gMiB8fAorICAgICAgICAgICAgIChwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKKyAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnICYmCisgICAgICAgICAgICAgICFwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzKSApCisgICAgICAgICAgICBmbGFnID0gSEFOVFJPX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsYWcgPSBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZFJlc2V0RHBiKHBTdG9yYWdlLT5kcGIsCisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzLAorICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bWF4RHBiU2l6ZSwKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm51bVJlZkZyYW1lcywKKyAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPm1heEZyYW1lTnVtLAorICAgICAgICAgICAgZmxhZyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHBwc0lkICE9IHBTdG9yYWdlLT5hY3RpdmVQcHNJZCkKKyAgICB7CisgICAgICAgIC8qIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc2hhbGwgbm90IGNoYW5nZSBidXQgYmVmb3JlIGFuIElEUiBwaWN0dXJlICovCisgICAgICAgIGlmIChwU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkKQorICAgICAgICB7CisgICAgICAgICAgICBERUJVRygoIlNFUSBQQVJBTSBTRVQgQ0hBTkdJTkcuLi5cbiIpKTsKKyAgICAgICAgICAgIGlmIChpc0lkcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gcFN0b3JhZ2UtPmFjdGl2ZVBwcy0+c2VxUGFyYW1ldGVyU2V0SWQ7CisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcyA9IHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkXTsKKyAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0KKyAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAqCisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+d2lkdGggPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzOworICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPmhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzOworCisgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoKCJUUllJTkcgVE8gQ0hBTkdFIFNQUyBJTiBOT04tSURSIFNMSUNFXG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gcHBzSWQ7CisgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RSZXNldFN0b3JhZ2UKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgUmVzZXQgY29udGVudHMgb2YgdGhlIHN0b3JhZ2UuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAgICAgICAgICAgIHByb2Nlc3Npbmcgb2YgbmV3IGltYWdlIGlzIHN0YXJ0ZWQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RSZXNldFN0b3JhZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyA9IDA7CisgICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCisgICAgeworICAgICAgICBwU3RvcmFnZS0+bWJbaV0uc2xpY2VJZCA9IDA7CisgICAgICAgIHBTdG9yYWdlLT5tYltpXS5kZWNvZGVkID0gMDsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIHN0YXJ0IG9mIGEgcGljdHVyZS4gVGhpcworICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlY2lkZSBpZiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMgYW5kCisgICAgICAgICAgICBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZC4gRnVuY3Rpb24KKyAgICAgICAgICAgIGNvbnNpZGVycyB0aGF0IG5ldyBwaWN0dXJlIGlzIHN0YXJ0aW5nIGlmIG5vIHNsaWNlIGhlYWRlcnMKKyAgICAgICAgICAgIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBmb3IgdGhlIGN1cnJlbnQgYWNjZXNzIHVuaXQuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19UUlVFICAgICAgICBuZXcgcGljdHVyZSBpcyBzdGFydGluZworICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgICAgIG5vdCBzdGFydGluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKworLyogQ29kZSAqLworCisgICAgaWYgKHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID09IEhBTlRST19GQUxTRSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZElzRW5kT2ZQaWN0dXJlCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgZW5kIG9mIGEgcGljdHVyZS4gVGhpcworICAgICAgICAgICAgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRldGVybWluZSB3aGVuIGRlYmxvY2tpbmcgZmlsdGVyaW5nCisgICAgICAgICAgICBhbmQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBwcm9jZXNzZXMgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKworICAgICAgICAgICAgSWYgdGhlIGRlY29kZXIgaXMgcHJvY2Vzc2luZyBwcmltYXJ5IHNsaWNlcyB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZSB2YWx1ZSBvZiBudW1EZWNvZGVkTWJzIGluIHRoZQorICAgICAgICAgICAgc3RvcmFnZS4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkZWNvZGVyIGlzIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHJlZHVuZGFudCBzbGljZXMgdGhlIG51bURlY29kZWRNYnMgbWF5IG5vdCBjb250YWluIHZhbGlkCisgICAgICAgICAgICBpbmZvcm1hdGlvbmEgYW5kIGVhY2ggbWFjcm9ibG9jayBoYXMgdG8gYmUgY2hlY2tlZCBzZXBhcmF0ZWx5LgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fVFJVRSAgICAgICAgZW5kIG9mIHBpY3R1cmUKKyAgICAgICAgICAgIEhBTlRST19GQUxTRSAgICAgICBub3VwCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgdG1wOworCisvKiBDb2RlICovCisKKyAgICAvKiBwcmltYXJ5IHBpY3R1cmUgKi8KKyAgICBpZiAoIXBTdG9yYWdlLT5zbGljZUhlYWRlclswXS5yZWR1bmRhbnRQaWNDbnQpCisgICAgeworICAgICAgICBpZiAocFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQorICAgICAgICAgICAgdG1wICs9IHBTdG9yYWdlLT5tYltpXS5kZWNvZGVkID8gMSA6IDA7CisKKyAgICAgICAgaWYgKHRtcCA9PSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcAorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDb21wdXRlIHNsaWNlIGdyb3VwIG1hcC4gSnVzdCBjYWxsIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwIHdpdGgKKyAgICAgICAgICAgIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgICAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZUN5Y2xlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworCisvKiBDb2RlICovCisKKyAgICBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcChwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMsIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1icyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgbmV4dCBOQUwgdW5pdCBzdGFydHMgYSBuZXcgYWNjZXNzIHVuaXQuIEZvbGxvd2luZworICAgICAgICAgICAgY29uZGl0aW9ucyBzcGVjaWZ5IHN0YXJ0IG9mIGEgbmV3IGFjY2VzcyB1bml0OgorCisgICAgICAgICAgICAgICAgLU5BTCB1bml0IHR5cGVzIDYtMTEsIDEzLTE4IChlLmcuIFNQUywgUFBTKQorCisgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGNoZWNrZWQgb25seSBmb3Igc2xpY2UgTkFMIHVuaXRzLCB2YWx1ZXMKKyAgICAgICAgICAgY29tcGFyZWQgdG8gb25lcyBvYnRhaW5lZCBmcm9tIHByZXZpb3VzIHNsaWNlOgorCisgICAgICAgICAgICAgICAgLU5BTCB1bml0IHR5cGUgZGlmZmVycyAoc2xpY2UgLyBJRFIgc2xpY2UpCisgICAgICAgICAgICAgICAgLWZyYW1lX251bSBkaWZmZXJzCisgICAgICAgICAgICAgICAgLW5hbF9yZWZfaWRjIGRpZmZlcnMgYW5kIG9uZSBvZiB0aGUgdmFsdWVzIGlzIDAKKyAgICAgICAgICAgICAgICAtUE9DIGluZm9ybWF0aW9uIGRpZmZlcnMKKyAgICAgICAgICAgICAgICAtYm90aCBhcmUgSURSIHNsaWNlcyBhbmQgaWRyX3BpY19pZCBkaWZmZXJzCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgc3RybSAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG51TmV4dCAgICAgIHBvaW50ZXIgdG8gTkFMIHVuaXQgc3RydWN0dXJlCisgICAgICAgICAgICBzdG9yYWdlICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgIHRoZSByZXN1bHQgaXMgc3RvcmVkIGhlcmUsIFRSVUUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdW5pdCBib3VuZGFyeSwgRkFMU0Ugb3RoZXJ3aXNlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgICAgICBmYWlsdXJlLCBpbnZhbGlkIHN0cmVhbSBkYXRhCisgICAgICAgICAgICBQQVJBTV9TRVRfRVJST1IgICAgIGludmFsaWQgcGFyYW0gc2V0IHVzYWdlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCisgIHN0cm1EYXRhX3QgKnN0cm0sCisgIG5hbFVuaXRfdCAqbnVOZXh0LAorICBzdG9yYWdlX3QgKnN0b3JhZ2UsCisgIHUzMiAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBwcHNJZCwgZnJhbWVOdW0sIGlkclBpY0lkLCBwaWNPcmRlckNudExzYjsKKyAgICBpMzIgZGVsdGFQaWNPcmRlckNudEJvdHRvbSwgZGVsdGFQaWNPcmRlckNudFsyXTsKKyAgICBzZXFQYXJhbVNldF90ICpzcHM7CisgICAgcGljUGFyYW1TZXRfdCAqcHBzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQoc3RybSk7CisgICAgQVNTRVJUKG51TmV4dCk7CisgICAgQVNTRVJUKHN0b3JhZ2UpOworICAgIEFTU0VSVChzdG9yYWdlLT5zcHMpOworICAgIEFTU0VSVChzdG9yYWdlLT5wcHMpOworCisgICAgLyogaW5pdGlhbGl6ZSBkZWZhdWx0IG91dHB1dCB0byBGQUxTRSAqLworICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKCAoIChudU5leHQtPm5hbFVuaXRUeXBlID4gNSkgJiYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPCAxMikgKSB8fAorICAgICAgICAgKCAobnVOZXh0LT5uYWxVbml0VHlwZSA+IDEyKSAmJiAobnVOZXh0LT5uYWxVbml0VHlwZSA8PSAxOCkgKSApCisgICAgeworICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFICYmCisgICAgICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUiApCisgICAgeworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBpZiB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiAqLworICAgIGlmIChzdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcpCisgICAgeworICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICBzdG9yYWdlLT5hdWItPmZpcnN0Q2FsbEZsYWcgPSBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgLyogZ2V0IHBpY3R1cmUgcGFyYW1ldGVyIHNldCBpZCAqLworICAgIHRtcCA9IGgyNjRic2RDaGVja1Bwc0lkKHN0cm0sICZwcHNJZCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworCisgICAgLyogc3RvcmUgc3BzIGFuZCBwcHMgaW4gc2VwYXJhdGUgcG9pbnRlcnMganVzdCB0byBtYWtlIG5hbWVzIHNob3J0ZXIgKi8KKyAgICBwcHMgPSBzdG9yYWdlLT5wcHNbcHBzSWRdOworICAgIGlmICggcHBzID09IE5VTEwgfHwgc3RvcmFnZS0+c3BzW3Bwcy0+c2VxUGFyYW1ldGVyU2V0SWRdID09IE5VTEwgIHx8CisgICAgICAgICAoc3RvcmFnZS0+YWN0aXZlU3BzSWQgIT0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUyAmJgorICAgICAgICAgIHBwcy0+c2VxUGFyYW1ldGVyU2V0SWQgIT0gc3RvcmFnZS0+YWN0aXZlU3BzSWQgJiYKKyAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpICkKKyAgICAgICAgcmV0dXJuKFBBUkFNX1NFVF9FUlJPUik7CisgICAgc3BzID0gc3RvcmFnZS0+c3BzW3Bwcy0+c2VxUGFyYW1ldGVyU2V0SWRdOworCisgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxSZWZJZGMgIT0gbnVOZXh0LT5uYWxSZWZJZGMgJiYKKyAgICAgIChzdG9yYWdlLT5hdWItPm51UHJldi0+bmFsUmVmSWRjID09IDAgfHwgbnVOZXh0LT5uYWxSZWZJZGMgPT0gMCkpCisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisKKyAgICBpZiAoKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCisgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSKSB8fAorICAgICAgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCisgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKSkKKyAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKworICAgIHRtcCA9IGgyNjRic2RDaGVja0ZyYW1lTnVtKHN0cm0sIHNwcy0+bWF4RnJhbWVOdW0sICZmcmFtZU51bSk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZGcmFtZU51bSAhPSBmcmFtZU51bSkKKyAgICB7CisgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldkZyYW1lTnVtID0gZnJhbWVOdW07CisgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7CisgICAgfQorCisgICAgaWYgKG51TmV4dC0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0lkclBpY0lkKHN0cm0sIHNwcy0+bWF4RnJhbWVOdW0sIG51TmV4dC0+bmFsVW5pdFR5cGUsCisgICAgICAgICAgJmlkclBpY0lkKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSICYmCisgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2SWRyUGljSWQgIT0gaWRyUGljSWQpCisgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworCisgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldklkclBpY0lkID0gaWRyUGljSWQ7CisgICAgfQorCisgICAgaWYgKHNwcy0+cGljT3JkZXJDbnRUeXBlID09IDApCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYihzdHJtLCBzcHMsIG51TmV4dC0+bmFsVW5pdFR5cGUsCisgICAgICAgICAgJnBpY09yZGVyQ250THNiKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldlBpY09yZGVyQ250THNiICE9IHBpY09yZGVyQ250THNiKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZQaWNPcmRlckNudExzYiA9IHBpY09yZGVyQ250THNiOworICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcHMtPnBpY09yZGVyUHJlc2VudEZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oc3RybSwgc3BzLAorICAgICAgICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUsICZkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgICAgIHJldHVybih0bXApOworCisgICAgICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbSAhPQorICAgICAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b20pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbSA9CisgICAgICAgICAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b207CisgICAgICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzcHMtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmICFzcHMtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoc3RybSwgc3BzLCBudU5leHQtPm5hbFVuaXRUeXBlLAorICAgICAgICAgIHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZywgZGVsdGFQaWNPcmRlckNudCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisKKyAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMF0gIT0gZGVsdGFQaWNPcmRlckNudFswXSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFswXSA9IGRlbHRhUGljT3JkZXJDbnRbMF07CisgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZykKKyAgICAgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzFdICE9IGRlbHRhUGljT3JkZXJDbnRbMV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFsxXSA9IGRlbHRhUGljT3JkZXJDbnRbMV07CisgICAgICAgICAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RvcmFnZS0+YXViLT5udVByZXYgPSAqbnVOZXh0OworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBDaGVja1BwcworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBwaWN0dXJlIHBhcmFtZXRlciBzZXQuIENvbnRlbnRzIG9mIHRoZSBwaWN0dXJlIHBhcmFtZXRlcgorICAgICAgICAgICAgc2V0IGluZm9ybWF0aW9uIHRoYXQgZGVwZW5kcyBvbiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBpcyBjaGVja2VkCisgICAgICAgICAgICBhZ2FpbnN0IHRoZSBkaW1lbnNpb25zIGluIHRoZSBzcHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcHBzICAgICBwb2ludGVyIHRvIHBpY3R1cmUgcGFyYW10ZXIgc2V0CisgICAgICAgICAgICBzcHMgICAgIHBvaW50ZXIgdG8gc2VxdWVuY2UgcGFyYW1ldGVyIHNldAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgIGV2ZXJ5dGhpbmcgb2sKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGludmFsaWQgZGF0YSBpbiBwaWN0dXJlIHBhcmFtZXRlciBzZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMiBDaGVja1BwcyhwaWNQYXJhbVNldF90ICpwcHMsIHNlcVBhcmFtU2V0X3QgKnNwcykKK3sKKworICAgIHUzMiBpOworICAgIHUzMiBwaWNTaXplOworCisgICAgcGljU2l6ZSA9IHNwcy0+cGljV2lkdGhJbk1icyAqIHNwcy0+cGljSGVpZ2h0SW5NYnM7CisKKyAgICAvKiBjaGVjayBzbGljZSBncm91cCBwYXJhbXMgKi8KKyAgICBpZiAocHBzLT5udW1TbGljZUdyb3VwcyA+IDEpCisgICAgeworICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQocHBzLT5ydW5MZW5ndGgpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtU2xpY2VHcm91cHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHBzLT5ydW5MZW5ndGhbaV0gPiBwaWNTaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQocHBzLT50b3BMZWZ0KTsKKyAgICAgICAgICAgIEFTU0VSVChwcHMtPmJvdHRvbVJpZ2h0KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bVNsaWNlR3JvdXBzLTE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHBzLT50b3BMZWZ0W2ldID4gcHBzLT5ib3R0b21SaWdodFtpXSB8fAorICAgICAgICAgICAgICAgICAgICBwcHMtPmJvdHRvbVJpZ2h0W2ldID49IHBpY1NpemUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgICAgICAgICAgICAgIGlmICggKHBwcy0+dG9wTGVmdFtpXSAlIHNwcy0+cGljV2lkdGhJbk1icykgPgorICAgICAgICAgICAgICAgICAgICAgKHBwcy0+Ym90dG9tUmlnaHRbaV0gJSBzcHMtPnBpY1dpZHRoSW5NYnMpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPiAyICYmIHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSA+IHBpY1NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNiAmJgorICAgICAgICAgICAgICAgICBwcHMtPnBpY1NpemVJbk1hcFVuaXRzIDwgcGljU2l6ZSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkVmFsaWRQYXJhbVNldHMKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgYW55IHZhbGlkIFNQUy9QUFMgY29tYmluYXRpb24gZXhpc3RzIGluIHRoZSBzdG9yYWdlLgorICAgICAgICAgICAgRnVuY3Rpb24gdHJpZXMgZWFjaCBQUFMgaW4gdGhlIGJ1ZmZlciBhbmQgY2hlY2tzIGlmIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIFNQUyBleGlzdHMgYW5kIGNhbGxzIENoZWNrUHBzIHRvIGRldGVybWluZSBpZiB0aGUgUFBTIGNvbmZvcm1zCisgICAgICAgICAgICB0byBpbWFnZSBkaW1lbnNpb25zIG9mIHRoZSBTUFMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmFsaWQgY29tYmluYXRpb24KKyAgICAgICAgICAgIEhBTlRST19OT0sgIG5vIHZhbGlkIGNvbWJpbmF0aW9ucyBmb3VuZAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkVmFsaWRQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaTsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdG9yYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHBTdG9yYWdlLT5wcHNbaV0gJiYKKyAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbaV0tPnNlcVBhcmFtZXRlclNldElkXSAmJgorICAgICAgICAgICAgIENoZWNrUHBzKHBTdG9yYWdlLT5wcHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW2ldLT5zZXFQYXJhbWV0ZXJTZXRJZF0pID09CisgICAgICAgICAgICAgICAgIEhBTlRST19PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmEzYjJkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfU1RPUkFHRV9ICisjZGVmaW5lIEgyNjRTV0RFQ19TVE9SQUdFX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgorI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCisjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBzbGljZUlkOworICAgIHUzMiBudW1EZWNvZGVkTWJzOworICAgIHUzMiBsYXN0TWJBZGRyOworfSBzbGljZVN0b3JhZ2VfdDsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBhY2Nlc3MgdW5pdCBib3VuZGFyeSBjaGVja2luZyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBuYWxVbml0X3QgbnVQcmV2WzFdOworICAgIHUzMiBwcmV2RnJhbWVOdW07CisgICAgdTMyIHByZXZJZHJQaWNJZDsKKyAgICB1MzIgcHJldlBpY09yZGVyQ250THNiOworICAgIGkzMiBwcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbTsKKyAgICBpMzIgcHJldkRlbHRhUGljT3JkZXJDbnRbMl07CisgICAgdTMyIGZpcnN0Q2FsbEZsYWc7Cit9IGF1YkNoZWNrX3Q7CisKKy8qIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUsIGhvbGRzIGFsbCBkYXRhIG9mIGEgZGVjb2RlciBpbnN0YW5jZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBhY3RpdmUgcGFyYW1ldCBzZXQgaWRzIGFuZCBwb2ludGVycyAqLworICAgIHUzMiBvbGRTcHNJZDsKKyAgICB1MzIgYWN0aXZlUHBzSWQ7CisgICAgdTMyIGFjdGl2ZVNwc0lkOworICAgIHBpY1BhcmFtU2V0X3QgKmFjdGl2ZVBwczsKKyAgICBzZXFQYXJhbVNldF90ICphY3RpdmVTcHM7CisgICAgc2VxUGFyYW1TZXRfdCAqc3BzW01BWF9OVU1fU0VRX1BBUkFNX1NFVFNdOworICAgIHBpY1BhcmFtU2V0X3QgKnBwc1tNQVhfTlVNX1BJQ19QQVJBTV9TRVRTXTsKKworICAgIC8qIGN1cnJlbnQgc2xpY2UgZ3JvdXAgbWFwLCByZWNvbXB1dGVkIGZvciBlYWNoIHNsaWNlICovCisgICAgdTMyICpzbGljZUdyb3VwTWFwOworCisgICAgdTMyIHBpY1NpemVJbk1iczsKKworICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgYWZ0ZXIgYWxsIG1hY3JvYmxvY2tzIG9mIGEgcGljdHVyZSBzdWNjZXNzZnVsbHkKKyAgICAgKiBkZWNvZGVkIC0+IHJlZHVuZGFudCBzbGljZXMgbm90IGRlY29kZWQgKi8KKyAgICB1MzIgc2tpcFJlZHVuZGFudFNsaWNlczsKKyAgICB1MzIgcGljU3RhcnRlZDsKKworICAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgaWYgY3VycmVudCBhY2Nlc3MgdW5pdCBjb250YWlucyBhbnkgdmFsaWQgc2xpY2VzICovCisgICAgdTMyIHZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQ7CisKKyAgICAvKiBzdG9yZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGhhbmRsaW5nIG9mIHNsaWNlIGRlY29kaW5nICovCisgICAgc2xpY2VTdG9yYWdlX3Qgc2xpY2VbMV07CisKKyAgICAvKiBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZSBjdXJyZW50IGltYWdlICovCisgICAgdTMyIG51bUNvbmNlYWxlZE1iczsKKworICAgIC8qIHBpY0lkIGdpdmVuIGJ5IGFwcGxpY2F0aW9uICovCisgICAgdTMyIGN1cnJlbnRQaWNJZDsKKworICAgIC8qIG1hY3JvYmxvY2sgc3BlY2lmaWMgc3RvcmFnZXMsIHNpemUgZGV0ZXJtaW5lZCBieSBpbWFnZSBkaW1lbnNpb25zICovCisgICAgbWJTdG9yYWdlX3QgKm1iOworCisgICAgLyogZmxhZyB0byBzdG9yZSBub091dHB1dFJlb3JkZXJpbmcgZmxhZyBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uICovCisgICAgdTMyIG5vUmVvcmRlcmluZzsKKworICAgIC8qIERQQiAqLworICAgIGRwYlN0b3JhZ2VfdCBkcGJbMV07CisKKyAgICAvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGljdHVyZSBvcmRlciBjb3VudCByZWxhdGVkIGluZm9ybWF0aW9uICovCisgICAgcG9jU3RvcmFnZV90IHBvY1sxXTsKKworICAgIC8qIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGNoZWNraW5nIHJlbGF0ZWQgZGF0YSAqLworICAgIGF1YkNoZWNrX3QgYXViWzFdOworCisgICAgLyogY3VycmVudCBwcm9jZXNzZWQgaW1hZ2UgKi8KKyAgICBpbWFnZV90IGN1cnJJbWFnZVsxXTsKKworICAgIC8qIGxhc3QgdmFsaWQgTkFMIHVuaXQgaGVhZGVyIGlzIHN0b3JlZCBoZXJlICovCisgICAgbmFsVW5pdF90IHByZXZOYWxVbml0WzFdOworCisgICAgLyogc2xpY2UgaGVhZGVyLCBzZWNvbmQgc3RydWN0dXJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSB3aGlsZQorICAgICAqIGRlY29kaW5nIHNsaWNlIGhlYWRlciwgZmlyc3Qgb25lIHN0b3JlcyBsYXN0IHN1Y2Nlc3NmdWxseSBkZWNvZGVkCisgICAgICogc2xpY2UgaGVhZGVyICovCisgICAgc2xpY2VIZWFkZXJfdCBzbGljZUhlYWRlclsyXTsKKworICAgIC8qIGZpZWxkcyB0byBzdG9yZSBvbGQgc3RyZWFtIGJ1ZmZlciBwb2ludGVycywgbmVlZGVkIHdoZW4gb25seSBwYXJ0IG9mCisgICAgICogYSBzdHJlYW0gYnVmZmVyIGlzIHByb2Nlc3NlZCBieSBoMjY0YnNkRGVjb2RlIGZ1bmN0aW9uICovCisgICAgdTMyIHByZXZCdWZOb3RGaW5pc2hlZDsKKyAgICB1OCAqcHJldkJ1ZlBvaW50ZXI7CisgICAgdTMyIHByZXZCeXRlc0NvbnN1bWVkOworICAgIHN0cm1EYXRhX3Qgc3RybVsxXTsKKworICAgIC8qIG1hY3JvYmxvY2sgbGF5ZXIgc3RydWN0dXJlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYnV0IGl0CisgICAgICogd291bGQgaGF2ZSBpbmNyZWFzZWQgdGhlIHN0YWNrIHNpemUgZXhjZXNzaXZlbHkgYW5kIG5lZWRlZCB0byBiZQorICAgICAqIGFsbG9jYXRlZCBmcm9tIGhlYWQgLT4gZWFzaWVzdCB0byBwdXQgaXQgaGVyZSAqLworICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyOworCisgICAgdTMyIHBlbmRpbmdBY3RpdmF0aW9uOyAvKiBBY3RpdmF0ZSBwYXJhbWV0ZXIgc2V0cyBhZnRlciByZXR1cm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUlNfUkRZIHRvIHRoZSB1c2VyICovCisgICAgdTMyIGludHJhQ29uY2VhbG1lbnRGbGFnOyAvKiAwIGdyYXkgcGljdHVyZSBmb3IgY29ycnVwdGVkIGludHJhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIHByZXZpb3VzIGZyYW1lIHVzZWQgaWYgYXZhaWxhYmxlICovCit9IHN0b3JhZ2VfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGgyNjRic2RJbml0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3ZvaWQgaDI2NGJzZFJlc2V0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKK3UzMiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Cit1MzIgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KTsKK3UzMiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpOwordTMyIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgcHBzSWQsIHUzMiBpc0lkcik7Cit2b2lkIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChzdG9yYWdlX3QgKnBTdG9yYWdlLAorICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOworCit1MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAorICBzdHJtRGF0YV90ICpzdHJtLAorICBuYWxVbml0X3QgKm51TmV4dCwKKyAgc3RvcmFnZV90ICpzdG9yYWdlLAorICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpOworCit1MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVE9SQUdFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwZDEwODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkR2V0Qml0cworICAgICAgICAgIGgyNjRic2RTaG93Qml0czMyCisgICAgICAgICAgaDI2NGJzZEZsdXNoQml0cworICAgICAgICAgIGgyNjRic2RJc0J5dGVBbGlnbmVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RHZXRCaXRzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIFJlYWQgYW5kIHJlbW92ZSBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuCisKKyAgICAgICAgSW5wdXQ6CisgICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgbnVtQml0cyAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAorCisgICAgICAgIE91dHB1dDoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYml0cyByZWFkIGZyb20gc3RyZWFtCisgICAgICAgICAgICBFTkRfT0ZfU1RSRUFNIGlmIG5vdCBlbm91Z2ggYml0cyBsZWZ0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkR2V0Qml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQoreworCisgICAgdTMyIG91dDsKKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVChudW1CaXRzIDwgMzIpOworCisgICAgb3V0ID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKSA+PiAoMzIgLSBudW1CaXRzKTsKKworICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgbnVtQml0cykgPT0gSEFOVFJPX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuKG91dCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkU2hvd0JpdHMzMgorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZWFkIDMyIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4gQnVmZmVyIGlzIGxlZnQgYXMgaXQgaXMsIGkuZS4KKyAgICAgICAgICAgIG5vIGJpdHMgYXJlIHJlbW92ZWQuIEZpcnN0IGJpdCByZWFkIGZyb20gdGhlIHN0cmVhbSBpcyB0aGUgTVNCIG9mCisgICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciAtPgorICAgICAgICAgICAgYml0cyBiZXlvbmcgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFyZSBzZXQgdG8gJzAnIGluIHRoZSByZXR1cm4KKyAgICAgICAgICAgIHZhbHVlLgorCisgICAgICAgIElucHV0OgorICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXQ6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZFNob3dCaXRzMzIoc3RybURhdGFfdCAqcFN0cm1EYXRhKQoreworCisgICAgaTMyIGJpdHMsIHNoaWZ0OworICAgIHUzMiBvdXQ7CisgICAgdTggKnBTdHJtOworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPT0KKyAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NykpOworCisgICAgcFN0cm0gPSBwU3RybURhdGEtPnBTdHJtQ3VyclBvczsKKworICAgIC8qIG51bWJlciBvZiBiaXRzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgIGJpdHMgPSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKjggLSAoaTMyKXBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0czsKKworICAgIC8qIGF0IGxlYXN0IDMyLWJpdHMgaW4gdGhlIGJ1ZmZlciAqLworICAgIGlmIChiaXRzID49IDMyKQorICAgIHsKKyAgICAgICAgdTMyIGJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOworICAgICAgICBvdXQgPSAoKHUzMilwU3RybVswXSA8PCAyNCkgfCAoKHUzMilwU3RybVsxXSA8PCAxNikgfAorICAgICAgICAgICAgICAoKHUzMilwU3RybVsyXSA8PCAgOCkgfCAoKHUzMilwU3RybVszXSk7CisKKyAgICAgICAgaWYgKGJpdFBvc0luV29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGJ5dGUgPSAodTMyKXBTdHJtWzRdOworICAgICAgICAgICAgdTMyIHRtcCA9ICg4LWJpdFBvc0luV29yZCk7CisgICAgICAgICAgICBvdXQgPDw9IGJpdFBvc0luV29yZDsKKyAgICAgICAgICAgIG91dCB8PSBieXRlPj50bXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChvdXQpOworICAgIH0KKyAgICAvKiBhdCBsZWFzdCBvbmUgYml0IGluIHRoZSBidWZmZXIgKi8KKyAgICBlbHNlIGlmIChiaXRzID4gMCkKKyAgICB7CisgICAgICAgIHNoaWZ0ID0gKGkzMikoMjQgKyBwU3RybURhdGEtPmJpdFBvc0luV29yZCk7CisgICAgICAgIG91dCA9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKKyAgICAgICAgYml0cyAtPSAoaTMyKSg4IC0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOworICAgICAgICB3aGlsZSAoYml0cyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNoaWZ0IC09IDg7CisgICAgICAgICAgICBvdXQgfD0gKHUzMikoKnBTdHJtKyspIDw8IHNoaWZ0OworICAgICAgICAgICAgYml0cyAtPSA4OworICAgICAgICB9CisgICAgICAgIHJldHVybiAob3V0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKDApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBSZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyCisKKyAgICAgICAgSW5wdXQ6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIG51bUJpdHMgICAgICAgICBudW1iZXIgb2YgYml0cyB0byByZW1vdmUKKworICAgICAgICBPdXRwdXQ6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBFTkRfT0ZfU1RSRUFNICAgbm90IGVub3VnaCBiaXRzIGxlZnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZEZsdXNoQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKQoreworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQpOworICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7CisgICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09IChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKKworICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyArPSBudW1CaXRzOworICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID0gcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3OworICAgIGlmICggKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyApIDw9ICg4KnBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKSApCisgICAgeworICAgICAgICBwU3RybURhdGEtPnBTdHJtQ3VyclBvcyA9IHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQgKworICAgICAgICAgICAgKHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA+PiAzKTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEVORF9PRl9TVFJFQU0pOworCit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZElzQnl0ZUFsaWduZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ2hlY2sgaWYgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gaXMgYnl0ZSBhbGlnbmVkLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgVFJVRSAgICAgICAgc3RyZWFtIGlzIGJ5dGUgYWxpZ25lZAorICAgICAgICAgICAgRkFMU0UgICAgICAgc3RyZWFtIGlzIG5vdCBieXRlIGFsaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RJc0J5dGVBbGlnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKy8qIENvZGUgKi8KKworICAgIGlmICghcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpCisgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQwNGI2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1NUUkVBTV9ICisjZGVmaW5lIEgyNjRTV0RFQ19TVFJFQU1fSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1OCAgKnBTdHJtQnVmZlN0YXJ0OyAgICAvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHN0cmVhbSBidWZmZXIgKi8KKyAgICB1OCAgKnBTdHJtQ3VyclBvczsgICAgICAvKiBjdXJyZW50IHJlYWQgYWRkcmVzcyBpbiBzdHJlYW0gYnVmZmVyICovCisgICAgdTMyICBiaXRQb3NJbldvcmQ7ICAgICAgLyogYml0IHBvc2l0aW9uIGluIHN0cmVhbSBidWZmZXIgYnl0ZSAqLworICAgIHUzMiAgc3RybUJ1ZmZTaXplOyAgICAgIC8qIHNpemUgb2Ygc3RyZWFtIGJ1ZmZlciAoYnl0ZXMpICovCisgICAgdTMyICBzdHJtQnVmZlJlYWRCaXRzOyAgLyogbnVtYmVyIG9mIGJpdHMgcmVhZCBmcm9tIHN0cmVhbSBidWZmZXIgKi8KK30gc3RybURhdGFfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZEdldEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cyk7CisKK3UzMiBoMjY0YnNkU2hvd0JpdHMzMihzdHJtRGF0YV90ICpwU3RybURhdGEpOworCit1MzIgaDI2NGJzZEZsdXNoQml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKTsKKwordTMyIGgyNjRic2RJc0J5dGVBbGlnbmVkKHN0cm1EYXRhX3QgKik7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NUUkVBTV9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWI2ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZFByb2Nlc3NCbG9jaworICAgICAgICAgIGgyNjRic2RQcm9jZXNzTHVtYURjCisgICAgICAgICAgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDEuIEluY2x1ZGUgaGVhZGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImJhc2V0eXBlLmgiCisjaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKKyAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQorICovCisvKmxpbnQgLWU3MDEgLWU3MDIgKi8KKworLyogTGV2ZWxTY2FsZSBmdW5jdGlvbiAqLworc3RhdGljIGNvbnN0IGkzMiBsZXZlbFNjYWxlWzZdWzNdID0geworICAgIHsxMCwxMywxNn0sIHsxMSwxNCwxOH0sIHsxMywxNiwyMH0sIHsxNCwxOCwyM30sIHsxNiwyMCwyNX0sIHsxOCwyMywyOX19OworCisvKiBxcCAlIDYgYXMgYSBmdW5jdGlvbiBvZiBxcCAqLworc3RhdGljIGNvbnN0IHU4IHFwTW9kNls1Ml0gPSB7MCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsCisgICAgMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsM307CisKKy8qIHFwIC8gNiBhcyBhIGZ1bmN0aW9uIG9mIHFwICovCitzdGF0aWMgY29uc3QgdTggcXBEaXY2WzUyXSA9IHswLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwyLDIsMiwyLDIsMiwzLDMsMywzLDMsMywKKyAgICA0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw2LDYsNiw2LDYsNiw3LDcsNyw3LDcsNyw4LDgsOCw4fTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzQmxvY2sKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB6aWctemFnIHNjYW4sIGludmVyc2Ugc2NhbGluZyBhbmQKKyAgICAgICAgICAgIGludmVyc2UgdHJhbnNmb3JtIGZvciBhIGx1bWEgb3IgYSBjaHJvbWEgcmVzaWR1YWwgYmxvY2sKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHNraXAgICAgICAgICAgICBza2lwIHByb2Nlc3Npbmcgb2YgZGF0YVswXSwgc2V0IHRvIG5vbi16ZXJvIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGMgY29lZmYgaGFubGVkIHNlcGFyYXRlbHkKKyAgICAgICAgICAgIGNvZWZmTWFwICAgICAgICAxNiBsc2IncyBpbmRpY2F0ZSB3aGljaCBjb2VmZnMgYXJlIG5vbi16ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAwIChsc2IpIGZvciBjb2VmZiAwLCBiaXQgMSBmb3IgY29lZmYgMSBldGMuCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIHByb2Nlc3NlZCBkYXRhIG5vdCBpbiB2YWxpZCByYW5nZSBbLTUxMiwgNTExXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIGgyNjRic2RQcm9jZXNzQmxvY2soaTMyICpkYXRhLCB1MzIgcXAsIHUzMiBza2lwLCB1MzIgY29lZmZNYXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgaTMyIGQxLCBkMiwgZDM7CisgICAgdTMyIHJvdyxjb2w7CisgICAgdTMyIHFwRGl2OworICAgIGkzMiAqcHRyOworCisvKiBDb2RlICovCisKKyAgICBxcERpdiA9IHFwRGl2NltxcF07CisgICAgdG1wMSA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMF0gPDwgcXBEaXY7CisgICAgdG1wMiA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMV0gPDwgcXBEaXY7CisgICAgdG1wMyA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMl0gPDwgcXBEaXY7CisKKyAgICBpZiAoIXNraXApCisgICAgICAgIGRhdGFbMF0gPSAoZGF0YVswXSAqIHRtcDEpOworCisgICAgLyogYXQgbGVhc3Qgb25lIG9mIHRoZSByb3dzIDEsIDIgb3IgMyBjb250YWluIG5vbi16ZXJvIGNvZWZmcywgbWFzayB0YWtlcworICAgICAqIHRoZSBzY2FubmluZyBvcmRlciBpbnRvIGFjY291bnQgKi8KKyAgICBpZiAoY29lZmZNYXAgJiAweEZGOUMpCisgICAgeworICAgICAgICAvKiBkbyB0aGUgemlnLXphZyBzY2FuIGFuZCBpbnZlcnNlIHF1YW50aXphdGlvbiAqLworICAgICAgICBkMSA9IGRhdGFbMV07CisgICAgICAgIGQyID0gZGF0YVsxNF07CisgICAgICAgIGQzID0gZGF0YVsxNV07CisgICAgICAgIGRhdGFbMV0gPSAoZDEgKiB0bXAyKTsKKyAgICAgICAgZGF0YVsxNF0gPSAoZDIgKiB0bXAyKTsKKyAgICAgICAgZGF0YVsxNV0gPSAoZDMgKiB0bXAzKTsKKworICAgICAgICBkMSA9IGRhdGFbMl07CisgICAgICAgIGQyID0gZGF0YVs1XTsKKyAgICAgICAgZDMgPSBkYXRhWzRdOworICAgICAgICBkYXRhWzRdID0gKGQxICogdG1wMik7CisgICAgICAgIGRhdGFbMl0gID0gKGQyICogdG1wMSk7CisgICAgICAgIGRhdGFbNV0gPSAoZDMgKiB0bXAzKTsKKworICAgICAgICBkMSA9IGRhdGFbOF07CisgICAgICAgIGQyID0gZGF0YVszXTsKKyAgICAgICAgZDMgPSBkYXRhWzZdOworICAgICAgICB0bXAwID0gKGQxICogdG1wMik7CisgICAgICAgIGRhdGFbOF0gPSAoZDIgKiB0bXAxKTsKKyAgICAgICAgZGF0YVszXSAgPSAoZDMgKiB0bXAyKTsKKyAgICAgICAgZDEgPSBkYXRhWzddOworICAgICAgICBkMiA9IGRhdGFbMTJdOworICAgICAgICBkMyA9IGRhdGFbOV07CisgICAgICAgIGRhdGFbNl0gID0gKGQxICogdG1wMik7CisgICAgICAgIGRhdGFbN10gID0gKGQyICogdG1wMyk7CisgICAgICAgIGRhdGFbMTJdID0gKGQzICogdG1wMik7CisgICAgICAgIGRhdGFbOV0gID0gdG1wMDsKKworICAgICAgICBkMSA9IGRhdGFbMTBdOworICAgICAgICBkMiA9IGRhdGFbMTFdOworICAgICAgICBkMyA9IGRhdGFbMTNdOworICAgICAgICBkYXRhWzEzXSA9IChkMSAqIHRtcDMpOworICAgICAgICBkYXRhWzEwXSA9IChkMiAqIHRtcDEpOworICAgICAgICBkYXRhWzExXSA9IChkMyAqIHRtcDIpOworCisgICAgICAgIC8qIGhvcml6b250YWwgdHJhbnNmb3JtICovCisgICAgICAgIGZvciAocm93ID0gNCwgcHRyID0gZGF0YTsgcm93LS07IHB0ciArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gcHRyWzBdICsgcHRyWzJdOworICAgICAgICAgICAgdG1wMSA9IHB0clswXSAtIHB0clsyXTsKKyAgICAgICAgICAgIHRtcDIgPSAocHRyWzFdID4+IDEpIC0gcHRyWzNdOworICAgICAgICAgICAgdG1wMyA9IHB0clsxXSArIChwdHJbM10gPj4gMSk7CisgICAgICAgICAgICBwdHJbMF0gPSB0bXAwICsgdG1wMzsKKyAgICAgICAgICAgIHB0clsxXSA9IHRtcDEgKyB0bXAyOworICAgICAgICAgICAgcHRyWzJdID0gdG1wMSAtIHRtcDI7CisgICAgICAgICAgICBwdHJbM10gPSB0bXAwIC0gdG1wMzsKKyAgICAgICAgfQorCisgICAgICAgIC8qbGludCArZTY2MSArZTY2MiovCisgICAgICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzhdOworICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzhdOworICAgICAgICAgICAgdG1wMiA9IChkYXRhWzRdID4+IDEpIC0gZGF0YVsxMl07CisgICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIChkYXRhWzEyXSA+PiAxKTsKKyAgICAgICAgICAgIGRhdGFbMCBdID0gKHRtcDAgKyB0bXAzICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVs0IF0gPSAodG1wMSArIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzggXSA9ICh0bXAxIC0gdG1wMiArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbMTJdID0gKHRtcDAgLSB0bXAzICsgMzIpPj42OworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBlYWNoIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCisgICAgICAgICAgICBpZiAoKCh1MzIpKGRhdGFbMF0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVs0XSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzhdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMTJdICsgNTEyKSA+IDEwMjMpICkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiByb3dzIDEsIDIgYW5kIDMgYXJlIHplcm8gKi8KKyAgICB7CisgICAgICAgIC8qIG9ubHkgZGMtY29lZmYgaXMgbm9uLXplcm8sIGkuZS4gY29lZmZzIGF0IG9yaWdpbmFsIHBvc2l0aW9ucworICAgICAgICAgKiAxLCA1IGFuZCA2IGFyZSB6ZXJvICovCisgICAgICAgIGlmICgoY29lZmZNYXAgJiAweDYyKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAwID0gKGRhdGFbMF0gKyAzMikgPj4gNjsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KKyAgICAgICAgICAgIGlmICgodTMyKSh0bXAwICsgNTEyKSA+IDEwMjMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgZGF0YVswXSA9IGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQorICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gID0gZGF0YVs3XSAgPSBkYXRhWzhdICA9IGRhdGFbOV0gID0gZGF0YVsxMF0gPQorICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTFdID0gZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPQorICAgICAgICAgICAgICAgICAgICAgIHRtcDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBhdCBsZWFzdCBvbmUgb2YgdGhlIGNvZWZmcyAxLCA1IG9yIDYgaXMgbm9uLXplcm8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVsxXSA9IChkYXRhWzFdICogdG1wMik7CisgICAgICAgICAgICBkYXRhWzJdID0gKGRhdGFbNV0gKiB0bXAxKTsKKyAgICAgICAgICAgIGRhdGFbM10gPSAoZGF0YVs2XSAqIHRtcDIpOworICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzJdOworICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzJdOworICAgICAgICAgICAgdG1wMiA9IChkYXRhWzFdID4+IDEpIC0gZGF0YVszXTsKKyAgICAgICAgICAgIHRtcDMgPSBkYXRhWzFdICsgKGRhdGFbM10gPj4gMSk7CisgICAgICAgICAgICBkYXRhWzBdID0gKHRtcDAgKyB0bXAzICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVsxXSA9ICh0bXAxICsgdG1wMiArIDMyKT4+NjsKKyAgICAgICAgICAgIGRhdGFbMl0gPSAodG1wMSAtIHRtcDIgKyAzMik+PjY7CisgICAgICAgICAgICBkYXRhWzNdID0gKHRtcDAgLSB0bXAzICsgMzIpPj42OworICAgICAgICAgICAgZGF0YVs0XSA9IGRhdGFbOF0gPSBkYXRhWzEyXSA9IGRhdGFbMF07CisgICAgICAgICAgICBkYXRhWzVdID0gZGF0YVs5XSA9IGRhdGFbMTNdID0gZGF0YVsxXTsKKyAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzEwXSA9IGRhdGFbMTRdID0gZGF0YVsyXTsKKyAgICAgICAgICAgIGRhdGFbN10gPSBkYXRhWzExXSA9IGRhdGFbMTVdID0gZGF0YVszXTsKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgZWFjaCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLworICAgICAgICAgICAgaWYgKCgodTMyKShkYXRhWzBdICsgNTEyKSA+IDEwMjMpIHx8CisgICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMV0gKyA1MTIpID4gMTAyMykgfHwKKyAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsyXSArIDUxMikgPiAxMDIzKSB8fAorICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzNdICsgNTEyKSA+IDEwMjMpICkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzTHVtYURjCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgemlnLXphZyBzY2FuLCBpbnZlcnNlIHRyYW5zZm9ybSBhbmQKKyAgICAgICAgICAgIGludmVyc2Ugc2NhbGluZyBmb3IgYSBsdW1hIERDIGNvZWZmaWNpZW50cyBibG9jaworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgbm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBoMjY0YnNkUHJvY2Vzc0x1bWFEYyhpMzIgKmRhdGEsIHUzMiBxcCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB1MzIgcm93LGNvbDsKKyAgICB1MzIgcXBNb2QsIHFwRGl2OworICAgIGkzMiBsZXZTY2FsZTsKKyAgICBpMzIgKnB0cjsKKworLyogQ29kZSAqLworCisgICAgcXBNb2QgPSBxcE1vZDZbcXBdOworICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKKworICAgIC8qIHppZy16YWcgc2NhbiAqLworICAgIHRtcDAgPSBkYXRhWzJdOworICAgIGRhdGFbMl0gID0gZGF0YVs1XTsKKyAgICBkYXRhWzVdID0gZGF0YVs0XTsKKyAgICBkYXRhWzRdID0gdG1wMDsKKworICAgIHRtcDAgPSBkYXRhWzhdOworICAgIGRhdGFbOF0gPSBkYXRhWzNdOworICAgIGRhdGFbM10gID0gZGF0YVs2XTsKKyAgICBkYXRhWzZdICA9IGRhdGFbN107CisgICAgZGF0YVs3XSAgPSBkYXRhWzEyXTsKKyAgICBkYXRhWzEyXSA9IGRhdGFbOV07CisgICAgZGF0YVs5XSAgPSB0bXAwOworCisgICAgdG1wMCA9IGRhdGFbMTBdOworICAgIGRhdGFbMTBdID0gZGF0YVsxMV07CisgICAgZGF0YVsxMV0gPSBkYXRhWzEzXTsKKyAgICBkYXRhWzEzXSA9IHRtcDA7CisKKyAgICAvKiBob3Jpem9udGFsIHRyYW5zZm9ybSAqLworICAgIGZvciAocm93ID0gNCwgcHRyID0gZGF0YTsgcm93LS07IHB0ciArPSA0KQorICAgIHsKKyAgICAgICAgdG1wMCA9IHB0clswXSArIHB0clsyXTsKKyAgICAgICAgdG1wMSA9IHB0clswXSAtIHB0clsyXTsKKyAgICAgICAgdG1wMiA9IHB0clsxXSAtIHB0clszXTsKKyAgICAgICAgdG1wMyA9IHB0clsxXSArIHB0clszXTsKKyAgICAgICAgcHRyWzBdID0gdG1wMCArIHRtcDM7CisgICAgICAgIHB0clsxXSA9IHRtcDEgKyB0bXAyOworICAgICAgICBwdHJbMl0gPSB0bXAxIC0gdG1wMjsKKyAgICAgICAgcHRyWzNdID0gdG1wMCAtIHRtcDM7CisgICAgfQorCisgICAgLypsaW50ICtlNjYxICtlNjYyKi8KKyAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSBhbmQgaW52ZXJzZSBzY2FsaW5nICovCisgICAgbGV2U2NhbGUgPSBsZXZlbFNjYWxlWyBxcE1vZCBdWzBdOworICAgIGlmIChxcCA+PSAxMikKKyAgICB7CisgICAgICAgIGxldlNjYWxlIDw8PSAocXBEaXYtMik7CisgICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzggXTsKKyAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4IF07CisgICAgICAgICAgICB0bXAyID0gZGF0YVs0XSAtIGRhdGFbMTJdOworICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyBkYXRhWzEyXTsKKyAgICAgICAgICAgIGRhdGFbMCBdID0gKCh0bXAwICsgdG1wMykqbGV2U2NhbGUpOworICAgICAgICAgICAgZGF0YVs0IF0gPSAoKHRtcDEgKyB0bXAyKSpsZXZTY2FsZSk7CisgICAgICAgICAgICBkYXRhWzggXSA9ICgodG1wMSAtIHRtcDIpKmxldlNjYWxlKTsKKyAgICAgICAgICAgIGRhdGFbMTJdID0gKCh0bXAwIC0gdG1wMykqbGV2U2NhbGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGkzMiB0bXA7CisgICAgICAgIHRtcCA9ICgoMSAtIHFwRGl2KSA9PSAwKSA/IDEgOiAyOworICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4IF07CisgICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOCBdOworICAgICAgICAgICAgdG1wMiA9IGRhdGFbNF0gLSBkYXRhWzEyXTsKKyAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgZGF0YVsxMl07CisgICAgICAgICAgICBkYXRhWzAgXSA9ICgodG1wMCArIHRtcDMpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOworICAgICAgICAgICAgZGF0YVs0IF0gPSAoKHRtcDEgKyB0bXAyKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKKyAgICAgICAgICAgIGRhdGFbOCBdID0gKCh0bXAxIC0gdG1wMikqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7CisgICAgICAgICAgICBkYXRhWzEyXSA9ICgodG1wMCAtIHRtcDMpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NDaHJvbWFEYworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgaW52ZXJzZSBzY2FsaW5nIGZvciBhCisgICAgICAgICAgICBjaHJvbWEgREMgY29lZmZpY2llbnRzIGJsb2NrCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBub25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMoaTMyICpkYXRhLCB1MzIgcXApCit7CisKKy8qIFZhcmlhYmxlcyAqLworCisgICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdTMyIHFwRGl2OworICAgIGkzMiBsZXZTY2FsZTsKKyAgICB1MzIgbGV2U2hpZnQ7CisKKy8qIENvZGUgKi8KKworICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKKyAgICBsZXZTY2FsZSA9IGxldmVsU2NhbGVbIHFwTW9kNltxcF0gXVswXTsKKworICAgIGlmIChxcCA+PSA2KQorICAgIHsKKyAgICAgICAgbGV2U2NhbGUgPDw9IChxcERpdi0xKTsKKyAgICAgICAgbGV2U2hpZnQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZXZTaGlmdCA9IDE7CisgICAgfQorCisgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzJdOworICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVsyXTsKKyAgICB0bXAyID0gZGF0YVsxXSAtIGRhdGFbM107CisgICAgdG1wMyA9IGRhdGFbMV0gKyBkYXRhWzNdOworICAgIGRhdGFbMF0gPSAoKHRtcDAgKyB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzFdID0gKCh0bXAwIC0gdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVsyXSA9ICgodG1wMSArIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbM10gPSAoKHRtcDEgLSB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICB0bXAwID0gZGF0YVs0XSArIGRhdGFbNl07CisgICAgdG1wMSA9IGRhdGFbNF0gLSBkYXRhWzZdOworICAgIHRtcDIgPSBkYXRhWzVdIC0gZGF0YVs3XTsKKyAgICB0bXAzID0gZGF0YVs1XSArIGRhdGFbN107CisgICAgZGF0YVs0XSA9ICgodG1wMCArIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworICAgIGRhdGFbNV0gPSAoKHRtcDAgLSB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKKyAgICBkYXRhWzZdID0gKCh0bXAxICsgdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7CisgICAgZGF0YVs3XSA9ICgodG1wMSAtIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OworCit9CisKKy8qbGludCArZTcwMSArZTcwMiAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjQxYTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0gKKyNkZWZpbmUgSDI2NFNXREVDX1RSQU5TRk9STV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkUHJvY2Vzc0Jsb2NrKGkzMiAqZGF0YSwgdTMyIHFwLCB1MzIgc2tpcCwgdTMyIGNvZWZmTWFwKTsKK3ZvaWQgaDI2NGJzZFByb2Nlc3NMdW1hRGMoaTMyICpkYXRhLCB1MzIgcXApOwordm9pZCBoMjY0YnNkUHJvY2Vzc0Nocm9tYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVFJBTlNGT1JNX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTNiMmZkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKyAgICAgMy4gTW9kdWxlIGRlZmluZXMKKyAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICA1LiBGdW5jdGlvbnMKKyAgICAgICAgICBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKyAgICAgICAgICBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cworICAgICAgICAgIGgyNjRic2RNb3JlUmJzcERhdGEKKyAgICAgICAgICBoMjY0YnNkTmV4dE1iQWRkcmVzcworICAgICAgICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGxvb2stdXAgdGFibGUgZm9yIGV4cGVjdGVkIHZhbHVlcyBvZiBzdHVmZmluZyBiaXRzICovCitzdGF0aWMgY29uc3QgdTMyIHN0dWZmaW5nVGFibGVbOF0gPSB7MHgxLDB4MiwweDQsMHg4LDB4MTAsMHgyMCwweDQwLDB4ODB9OworCisvKiBsb29rLXVwIHRhYmxlIGZvciBjaHJvbWEgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhcyBhIGZ1bmN0aW9uIG9mIGx1bWEgUVAgKi8KK2NvbnN0IHUzMiBoMjY0YnNkUXBDWzUyXSA9IHswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LAorICAgIDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDI5LDMwLDMxLDMyLDMyLDMzLDM0LDM0LDM1LDM1LDM2LDM2LDM3LDM3LDM3LAorICAgIDM4LDM4LDM4LDM5LDM5LDM5LDM5fTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjEgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgQ291bnQgbGVhZGluZyB6ZXJvcyBpbiBhIGNvZGUgd29yZC4gQ29kZSB3b3JkIGlzIGFzc3VtZWQgdG8gYmUKKyAgICAgICAgICAgIHJpZ2h0LWFsaWduZWQsIGxhc3QgYml0IG9mIHRoZSBjb2RlIHdvcmQgaW4gdGhlIGxzYiBvZiB0aGUgdmFsdWUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgdmFsdWUgICBjb2RlIHdvcmQKKyAgICAgICAgICAgIGxlbmd0aCAgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGUgd29yZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG51bWJlciBvZiBsZWFkaW5nIHplcm9zIGluIHRoZSBjb2RlIHdvcmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgSDI2NERFQ19ORU9OCit1MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSwgdTMyIGxlbmd0aCkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgemVyb3MgPSAwOworICAgIHUzMiBtYXNrID0gMSA8PCAobGVuZ3RoIC0gMSk7CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChsZW5ndGggPD0gMzIpOworCisgICAgd2hpbGUgKG1hc2sgJiYgISh2YWx1ZSAmIG1hc2spKQorICAgIHsKKyAgICAgICAgemVyb3MrKzsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuKHplcm9zKTsKKworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjIgIEZ1bmN0aW9uOiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBSYXcgQnl0ZSBTdHJlYW0gUGF5bG9hZCAoUkJTUCkgdHJhaWxpbmcgYml0cywgaS5lLiBzdHVmZmluZy4KKyAgICAgICAgICAgIFJlc3Qgb2YgdGhlIGN1cnJlbnQgYnl0ZSAod2hvbGUgYnl0ZSBpZiBhbGxyZWFkeSBieXRlIGFsaWduZWQpCisgICAgICAgICAgICBpbiB0aGUgc3RyZWFtIGJ1ZmZlciBzaGFsbCBjb250YWluIGEgJzEnIGJpdCBmb2xsb3dlZCBieSB6ZXJvIG9yCisgICAgICAgICAgICBtb3JlICcwJyBiaXRzLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgUkJTUCB0cmFpbGluZyBiaXRzIGZvdW5kCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICBvdGhlcndpc2UKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgc3R1ZmZpbmc7CisgICAgdTMyIHN0dWZmaW5nTGVuZ3RoOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgPCA4KTsKKworICAgIHN0dWZmaW5nTGVuZ3RoID0gOCAtIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOworCisgICAgc3R1ZmZpbmcgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIHN0dWZmaW5nTGVuZ3RoKTsKKyAgICBpZiAoc3R1ZmZpbmcgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgaWYgKHN0dWZmaW5nICE9IHN0dWZmaW5nVGFibGVbc3R1ZmZpbmdMZW5ndGggLSAxXSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4zICBGdW5jdGlvbjogaDI2NGJzZE1vcmVSYnNwRGF0YQorCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBDaGVjayBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgaW4gdGhlIGN1cnJlbnQgUkJTUC4gVGhlIHN0YW5kYXJkCisgICAgICAgICAgICBkZWZpbmVzIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB0aGVyZSBpcyBtb3JlIGRhdGEgaWYKKyAgICAgICAgICAgICAgICAtbW9yZSB0aGFuIDggYml0cyBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLWxhc3QgYml0cyBhcmUgbm90IFJCU1AgdHJhaWxpbmcgYml0cworCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIG5vbmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgdGhlcmUgaXMgbW9yZSBkYXRhCisgICAgICAgICAgICBIQU5UUk9fRkFMU0UgICBubyBtb3JlIGRhdGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2RNb3JlUmJzcERhdGEoc3RybURhdGFfdCAqcFN0cm1EYXRhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBiaXRzOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzIDw9IDggKiBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSk7CisKKyAgICBiaXRzID0gcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgKiA4IC0gcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzOworCisgICAgaWYgKGJpdHMgPT0gMCkKKyAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CisKKyAgICBpZiAoIChiaXRzID4gOCkgfHwKKyAgICAgICAgICgoaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKT4+KDMyLWJpdHMpKSAhPSAoMSA8PCAoYml0cy0xKSkpICkKKyAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuNCAgRnVuY3Rpb246IGgyNjRic2ROZXh0TWJBZGRyZXNzCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIEdldCBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgc2xpY2UgZ3JvdXAuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFNsaWNlR3JvdXBNYXAgICAgICBzbGljZSBncm91cCBmb3IgZWFjaCBtYWNyb2Jsb2NrCisgICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgICAgIHNpemUgb2YgdGhlIHBpY3R1cmUKKyAgICAgICAgICAgIGN1cnJNYkFkZHIgICAgICAgICAgd2hlcmUgdG8gc3RhcnQKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgbm9uZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sKKyAgICAgICAgICAgIDAgICBpZiBub25lIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9ibG9ja3MgYmVsb25nIHRvIHNhbWUgc2xpY2UKKyAgICAgICAgICAgICAgICBncm91cCBhcyBjdXJyTWJBZGRyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcikKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgaSwgc2xpY2VHcm91cCwgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFNsaWNlR3JvdXBNYXApOworICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOworICAgIEFTU0VSVChjdXJyTWJBZGRyIDwgcGljU2l6ZUluTWJzKTsKKworICAgIHNsaWNlR3JvdXAgPSBwU2xpY2VHcm91cE1hcFtjdXJyTWJBZGRyXTsKKworICAgIGkgPSBjdXJyTWJBZGRyICsgMTsKKyAgICB0bXAgPSBwU2xpY2VHcm91cE1hcFtpXTsKKyAgICB3aGlsZSAoKGkgPCBwaWNTaXplSW5NYnMpICYmICh0bXAgIT0gc2xpY2VHcm91cCkpCisgICAgeworICAgICAgICBpKys7CisgICAgICAgIHRtcCA9IHBTbGljZUdyb3VwTWFwW2ldOworICAgIH0KKworICAgIGlmIChpID09IHBpY1NpemVJbk1icykKKyAgICAgICAgaSA9IDA7CisKKyAgICByZXR1cm4oaSk7CisKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjUgIEZ1bmN0aW9uOiBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBTZXQgbHVtYSBhbmQgY2hyb21hIHBvaW50ZXJzIGluIGltYWdlX3QgZm9yIGN1cnJlbnQgTUIKKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBpbWFnZSAgICAgICBDdXJyZW50IGltYWdlCisgICAgICAgICAgICBtYk51bSAgICAgICBudW1iZXIgb2YgY3VycmVudCBNQgorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICBub25lCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIG5vbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0pCit7CisgICAgdTMyIHdpZHRoLCBoZWlnaHQ7CisgICAgdTMyIHBpY1NpemU7CisgICAgdTMyIHJvdywgY29sOworICAgIHUzMiB0bXA7CisKKyAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKKyAgICBoZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OworICAgIHJvdyA9IG1iTnVtIC8gd2lkdGg7CisgICAgY29sID0gbWJOdW0gJSB3aWR0aDsKKworICAgIHRtcCA9IHJvdyAqIHdpZHRoOworICAgIHBpY1NpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIGltYWdlLT5sdW1hID0gKHU4KikoaW1hZ2UtPmRhdGEgKyBjb2wgKiAxNiArIHRtcCAqIDI1Nik7CisgICAgaW1hZ2UtPmNiID0gKHU4KikoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgdG1wICogNjQgKyBjb2wgKiA4KTsKKyAgICBpbWFnZS0+Y3IgPSAodTgqKShpbWFnZS0+Y2IgKyBwaWNTaXplICogNjQpOworfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiM2FkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKyAgICAyLiBNb2R1bGUgZGVmaW5lcworICAgIDMuIERhdGEgdHlwZXMKKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgSDI2NFNXREVDX1VUSUxfSAorI2RlZmluZSBIMjY0U1dERUNfVVRJTF9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX0FTU0VSVF9VU0VECisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorCisjaWYgZGVmaW5lZChfUkFOR0VfQ0hFQ0spIHx8IGRlZmluZWQoX0RFQlVHX1BSSU5UKSB8fCBkZWZpbmVkKF9FUlJPUl9QUklOVCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEhBTlRST19PSyAgIDAKKyNkZWZpbmUgSEFOVFJPX05PSyAgMQorCisjZGVmaW5lIEhBTlRST19UUlVFICAgICAoMSkKKyNkZWZpbmUgSEFOVFJPX0ZBTFNFICAgICgwKQorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworI2RlZmluZSBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAweEZGRkYKKyNkZWZpbmUgUEFSQU1fU0VUX0VSUk9SIDB4RkZGMAorCisvKiB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSBHZXRCaXRzIGlmIHN0cmVhbSBidWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUgRU5EX09GX1NUUkVBTSAweEZGRkZGRkZGVQorCisjZGVmaW5lIEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUiAweEZGRkZGRgorCisvKiBtYWNybyB0byBtYXJrIGEgcmVzaWR1YWwgYmxvY2sgZW1wdHksIGkuZS4gY29udGFpbiB6ZXJvIGNvZWZmaWNpZW50cyAqLworI2RlZmluZSBNQVJLX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9IEVNUFRZX1JFU0lEVUFMX0lORElDQVRPUikKKy8qIG1hY3JvIHRvIGNoZWNrIGlmIHJlc2lkdWFsIGJsb2NrIGlzIGVtcHR5ICovCisjZGVmaW5lIElTX1JFU0lEVUFMX0VNUFRZKHJlc2lkdWFsKSAoKHJlc2lkdWFsKVswXSA9PSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCisKKy8qIG1hY3JvIGZvciBhc3NlcnRpb24sIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9BU1NFUlRfVVNFRCBpcyBkZWZpbmVkICovCisjaWZkZWYgX0FTU0VSVF9VU0VECisjZGVmaW5lIEFTU0VSVChleHByKSBhc3NlcnQoZXhwcikKKyNlbHNlCisjZGVmaW5lIEFTU0VSVChleHByKQorI2VuZGlmCisKKy8qIG1hY3JvIGZvciByYW5nZSBjaGVja2luZyBhbiB2YWx1ZSwgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX1JBTkdFX0NIRUNLCisgKiBpcyBkZWZpbmVkICovCisjaWZkZWYgX1JBTkdFX0NIRUNLCisjZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpIFwKK3sgXAorICAgIGlmICgodmFsdWUpIDwgKG1pbkJvdW5kKSB8fCAodmFsdWUpID4gKG1heEJvdW5kKSkgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IFZhbHVlIGV4Y2VlZHMgZ2l2ZW4gbGltaXQocykhXG4iKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgUkFOR0VfQ0hFQ0sodmFsdWUsIG1pbkJvdW5kLCBtYXhCb3VuZCkKKyNlbmRpZgorCisvKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gYXJyYXksIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSworICogaXMgZGVmaW5lZCAqLworI2lmZGVmIF9SQU5HRV9DSEVDSworI2RlZmluZSBSQU5HRV9DSEVDS19BUlJBWShhcnJheSwgbWluQm91bmQsIG1heEJvdW5kLCBsZW5ndGgpIFwKK3sgXAorICAgIGkzMiBpOyBcCisgICAgZm9yIChpID0gMDsgaSA8IChsZW5ndGgpOyBpKyspIFwKKyAgICAgICAgaWYgKChhcnJheSlbaV0gPCAobWluQm91bmQpIHx8IChhcnJheSlbaV0gPiAobWF4Qm91bmQpKSBcCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogVmFsdWUgWyVkXSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIixpKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKQorI2VuZGlmCisKKy8qIG1hY3JvIGZvciBkZWJ1ZyBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0RFQlVHX1BSSU5UIGlzCisgKiBkZWZpbmVkICovCisjaWZkZWYgX0RFQlVHX1BSSU5UCisjZGVmaW5lIERFQlVHKGFyZ3MpIHByaW50ZiBhcmdzCisjZWxzZQorI2RlZmluZSBERUJVRyhhcmdzKQorI2VuZGlmCisKKy8qIG1hY3JvIGZvciBlcnJvciBwcmludGluZywgdXNlZCBvbmx5IGlmIGNvbXBpbGVyIGZsYWcgX0VSUk9SX1BSSU5UIGlzCisgKiBkZWZpbmVkICovCisjaWZkZWYgX0VSUk9SX1BSSU5UCisjZGVmaW5lIEVQUklOVChtc2cpIGZwcmludGYoc3RkZXJyLCJFUlJPUjogJXNcbiIsbXNnKQorI2Vsc2UKKyNkZWZpbmUgRVBSSU5UKG1zZykKKyNlbmRpZgorCisvKiBtYWNybyB0byBnZXQgc21hbGxlciBvZiB0d28gdmFsdWVzICovCisjZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKKy8qIG1hY3JvIHRvIGdldCBncmVhdGVyIG9mIHR3byB2YWx1ZXMgKi8KKyNkZWZpbmUgTUFYKGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworLyogbWFjcm8gdG8gZ2V0IGFic29sdXRlIHZhbHVlICovCisjZGVmaW5lIEFCUyhhKSAoKChhKSA8IDApID8gLShhKSA6IChhKSkKKworLyogbWFjcm8gdG8gY2xpcCBhIHZhbHVlIHosIHNvIHRoYXQgeCA8PSB6ID08IHkgKi8KKyNkZWZpbmUgQ0xJUDMoeCx5LHopICgoKHopIDwgKHgpKSA/ICh4KSA6ICgoKHopID4gKHkpKSA/ICh5KSA6ICh6KSkpCisKKy8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IDAgPD0geiA9PCAyNTUgKi8KKyNkZWZpbmUgQ0xJUDEoeikgKCgoeikgPCAwKSA/IDAgOiAoKCh6KSA+IDI1NSkgPyAyNTUgOiAoeikpKQorCisvKiBtYWNybyB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQUxMT0NBVEUocHRyLCBjb3VudCwgdHlwZSkgXAoreyBcCisgICAgKHB0cikgPSBIMjY0U3dEZWNNYWxsb2MoKGNvdW50KSAqIHNpemVvZih0eXBlKSk7IFwKK30KKworLyogbWFjcm8gdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisjZGVmaW5lIEZSRUUocHRyKSBcCit7IFwKKyAgICBIMjY0U3dEZWNGcmVlKChwdHIpKTsgKHB0cikgPSBOVUxMOyBcCit9CisKKyNkZWZpbmUgQUxJR04ocHRyLCBieXRlUG9zKSBcCisgICAgICAgIChwdHIgKyAoICgoYnl0ZVBvcyAtIChpbnQpcHRyKSAmIChieXRlUG9zIC0gMSkpIC8gc2l6ZW9mKCpwdHIpICkpCisKK2V4dGVybiBjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBIMjY0REVDX05FT04KK3UzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlLCB1MzIgbGVuZ3RoKTsKKyNlbHNlCit1MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSk7CisjZW5kaWYKK3UzMiBoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhzdHJtRGF0YV90ICpzdHJtRGF0YSk7CisKK3UzMiBoMjY0YnNkTW9yZVJic3BEYXRhKHN0cm1EYXRhX3QgKnN0cm1EYXRhKTsKKwordTMyIGgyNjRic2ROZXh0TWJBZGRyZXNzKHUzMiAqcFNsaWNlR3JvdXBNYXAsIHUzMiBwaWNTaXplSW5NYnMsIHUzMiBjdXJyTWJBZGRyKTsKKwordm9pZCBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycyhpbWFnZV90ICppbWFnZSwgdTMyIG1iTnVtKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVVRJTF9IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjBmMzVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCisgICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZAorICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQKKyAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisjaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGRlZmluaXRpb24gb2Ygc3BlY2lhbCBjb2RlIG51bSwgdGhpcyBhbG9uZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZAorICogdG8gaGFuZGxlIGNvZGUgbnVtIGluIHRoZSByYW5nZSBbMCwgMl4zMl0gaW4gdGhlIERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCisgKiBmdW5jdGlvbiAqLworI2RlZmluZSBCSUdfQ09ERV9OVU0gMHhGRkZGRkZGRlUKKworLyogTWFwcGluZyB0YWJsZXMgZm9yIGNvZGVkX2Jsb2NrX3BhdHRlcm4sIHVzZWQgZm9yIGRlY29kaW5nIG9mIG1hcHBlZAorICogRXhwLUdvbG9tYiBjb2RlcyAqLworc3RhdGljIGNvbnN0IHU4IGNvZGVkQmxvY2tQYXR0ZXJuSW50cmE0eDRbNDhdID0geworICAgIDQ3LDMxLDE1LDAsMjMsMjcsMjksMzAsNywxMSwxMywxNCwzOSw0Myw0NSw0NiwxNiwzLDUsMTAsMTIsMTksMjEsMjYsMjgsMzUsCisgICAgMzcsNDIsNDQsMSwyLDQsOCwxNywxOCwyMCwyNCw2LDksMjIsMjUsMzIsMzMsMzQsMzYsNDAsMzgsNDF9OworCitzdGF0aWMgY29uc3QgdTggY29kZWRCbG9ja1BhdHRlcm5JbnRlcls0OF0gPSB7CisgICAgMCwxNiwxLDIsNCw4LDMyLDMsNSwxMCwxMiwxNSw0Nyw3LDExLDEzLDE0LDYsOSwzMSwzNSwzNyw0Miw0NCwzMywzNCwzNiw0MCwKKyAgICAzOSw0Myw0NSw0NiwxNywxOCwyMCwyNCwxOSwyMSwyNiwyOCwyMywyNywyOSwzMCwyMiwyNSwzOCw0MX07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgNS4xICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSB1bnNpZ25lZCBFeHAtR29sb21iIGNvZGUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29kZU51bSB1c2VkCisgICAgICAgICAgICBpbiBvdGhlciBFeHAtR29sb21iIGNvZGUgbWFwcGluZ3MuIENvZGUgbnVtIChpLmUuIHRoZSBkZWNvZGVkCisgICAgICAgICAgICBzeW1ib2wpIGlzIGRldGVybWluZWQgYXMKKworICAgICAgICAgICAgICAgIGNvZGVOdW0gPSAyXmxlYWRpbmdaZXJvcyAtIDEgKyBHZXRCaXRzKGxlYWRpbmdaZXJvcykKKworICAgICAgICAgICAgTm9ybWFsIGRlY29kZWQgc3ltYm9scyBhcmUgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0uIFN5bWJvbAorICAgICAgICAgICAgMl4zMi0xIGlzIGluZGljYXRlZCBieSBCSUdfQ09ERV9OVU0gd2l0aCByZXR1cm4gdmFsdWUgSEFOVFJPX09LCisgICAgICAgICAgICB3aGlsZSBzeW1ib2wgMl4zMiAgaXMgaW5kaWNhdGVkIGJ5IEJJR19DT0RFX05VTSB3aXRoIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgSEFOVFJPX05PSy4gIFRoZXNlIHR3byBzeW1ib2xzIGFyZSBzcGVjaWFsIGNhc2VzIHdpdGggY29kZSBsZW5ndGgKKyAgICAgICAgICAgIG9mIDY1LCBpLmUuICAzMiAnMCcgYml0cywgYSAnMScgYml0LCBhbmQgZWl0aGVyIDAgb3IgMSByZXByZXNlbnRlZAorICAgICAgICAgICAgYnkgMzIgYml0cy4KKworICAgICAgICAgICAgU3ltYm9sIDJeMzIgaXMgb3V0IG9mIHVuc2lnbmVkIDMyLWJpdCByYW5nZSBidXQgaXMgbmVlZGVkIGZvcgorICAgICAgICAgICAgRGVjb2RlRXhwR29sb21iU2lnbmVkIHRvIGV4cHJlc3MgdmFsdWUgLTJeMzEuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIGNvZGVOdW0gICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcworICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZCwgbm90ZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEJJR19DT0RFX05VTQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyICpjb2RlTnVtKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBiaXRzLCBudW1aZXJvczsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKGNvZGVOdW0pOworCisgICAgYml0cyA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisKKyAgICAvKiBmaXJzdCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCAxICovCisgICAgaWYgKGJpdHMgPj0gMHg4MDAwMDAwMCkKKyAgICB7CisgICAgICAgIGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgKmNvZGVOdW0gPSAwOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogc2Vjb25kIGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDMgKi8KKyAgICBlbHNlIGlmIChiaXRzID49IDB4NDAwMDAwMDApCisgICAgeworICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICpjb2RlTnVtID0gMSArICgoYml0cyA+PiAyOSkgJiAweDEpOworICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICB9CisgICAgLyogdGhpcmQgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggNSAqLworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMDAwMDAwMCkKKyAgICB7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgNSkgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgKmNvZGVOdW0gPSAzICsgKChiaXRzID4+IDI3KSAmIDB4Myk7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICAvKiBmb3VydGggYml0IGlzIDEgLT4gY29kZSBsZW5ndGggNyAqLworICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMDAwMDAwMCkKKyAgICB7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgNykgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgKmNvZGVOdW0gPSA3ICsgKChiaXRzID4+IDI1KSAmIDB4Nyk7CisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKyAgICAvKiBvdGhlciBjb2RlIGxlbmd0aHMgKi8KKyAgICBlbHNlCisgICAgeworI2lmbmRlZiBIMjY0REVDX05FT04KKyAgICAgICAgbnVtWmVyb3MgPSA0ICsgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKGJpdHMsIDI4KTsKKyNlbHNlCisgICAgICAgIG51bVplcm9zID0gaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKGJpdHMpOworI2VuZGlmCisgICAgICAgIC8qIGFsbCAzMiBiaXRzIGFyZSB6ZXJvICovCisgICAgICAgIGlmIChudW1aZXJvcyA9PSAzMikKKyAgICAgICAgeworICAgICAgICAgICAgKmNvZGVOdW0gPSAwOworICAgICAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpOworICAgICAgICAgICAgYml0cyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgICAgICAvKiBjaGVjayAzM3JkIGJpdCwgbXVzdCBiZSAxICovCisgICAgICAgICAgICBpZiAoYml0cyA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNhbm5vdCB1c2UgaDI2NGJzZEdldEJpdHMsIGxpbWl0ZWQgdG8gMzEgYml0cyAqLworICAgICAgICAgICAgICAgIGJpdHMgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOworICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICAvKiBjb2RlIG51bSAyXjMyIC0gMSwgbmVlZGVkIGZvciB1bnNpZ25lZCBtYXBwaW5nICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpjb2RlTnVtID0gQklHX0NPREVfTlVNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY29kZSBudW0gMl4zMiwgbmVlZGVkIGZvciB1bnNpZ25lZCBtYXBwaW5nCisgICAgICAgICAgICAgICAgICogKHJlc3VsdHMgaW4gLTJeMzEpICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKmNvZGVOdW0gPSBCSUdfQ09ERV9OVU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpZiBtb3JlIHplcm9zIHRoYW4gMzIsIGl0IGlzIGFuIGVycm9yICovCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsbnVtWmVyb3MrMSk7CisKKyAgICAgICAgYml0cyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgbnVtWmVyb3MpOworICAgICAgICBpZiAoYml0cyA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgICpjb2RlTnVtID0gKDEgPDwgbnVtWmVyb3MpIC0gMSArIGJpdHM7CisKKyAgICB9CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjIgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBzaWduZWQgRXhwLUdvbG9tYiBjb2RlLiBDb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5CisgICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoZW4gbWFwcGVkIHRvIHNpZ25lZAorICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gYXMKKworICAgICAgICAgICAgICAgIHN5bWJvbCA9ICgtMSleKGNvZGVOdW0rMSkgKiAoY29kZU51bSsxKS8yCisKKyAgICAgICAgICAgIFNpZ25lZCBzeW1ib2xzIHNoYWxsIGJlIGluIHRoZSByYW5nZSBbLTJeMzEsIDJeMzEgLSAxXS4gU3ltYm9sCisgICAgICAgICAgICAtMl4zMSBpcyBvYnRhaW5lZCB3aGVuIGNvZGVOdW0gaXMgMl4zMiwgd2hpY2ggY2Fubm90IGJlIGV4cHJlc3NlZAorICAgICAgICAgICAgYnkgdW5zaWduZWQgMzItYml0IHZhbHVlLiBUaGlzIGlzIHNpZ25hbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGZyb20KKyAgICAgICAgICAgIHRoZSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYnkgc2V0dGluZyBjb2RlTnVtIHRvCisgICAgICAgICAgICBCSUdfQ09ERV9OVU0gYW5kIHJldHVybmluZyBIQU5UUk9fTk9LIHN0YXR1cy4KKworICAgICAgICBJbnB1dHM6CisgICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKKworICAgICAgICBPdXRwdXRzOgorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgaTMyICp2YWx1ZSkKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgc3RhdHVzLCBjb2RlTnVtID0gMDsKKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHZhbHVlKTsKKworICAgIHN0YXR1cyA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb2RlTnVtKTsKKworICAgIGlmIChjb2RlTnVtID09IEJJR19DT0RFX05VTSkKKyAgICB7CisgICAgICAgIC8qIEJJR19DT0RFX05VTSBhbmQgSEFOVFJPX09LIHN0YXR1cyBtZWFucyBjb2RlTnVtIDJeMzItMSB3aGljaCB3b3VsZAorICAgICAgICAgKiByZXN1bHQgaW4gc2lnbmVkIGludGVnZXIgdmFsdWVkIDJeMzEgKGkuZS4gb3V0IG9mIDMyLWJpdCBzaWduZWQKKyAgICAgICAgICogaW50ZWdlciByYW5nZSkgKi8KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIC8qIEJJR19DT0RFX05VTSBhbmQgSEFOVFJPX05PSyBzdGF0dXMgbWVhbnMgY29kZU51bSAyXjMyIHdoaWNoIHJlc3VsdHMKKyAgICAgICAgICogaW4gc2lnbmVkIGludGVnZXIgdmFsdWVkIC0yXjMxICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnZhbHVlID0gKGkzMikoMjE0NzQ4MzY0OFUpOworICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fT0spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCisgICAgeworICAgICAgICAvKiAoLTEpXihjb2RlTnVtKzEpIHJlc3VsdHMgaW4gcG9zaXRpdmUgc2lnbiBpZiBjb2RlTnVtIGlzIG9kZCwKKyAgICAgICAgICogbmVnYXRpdmUgd2hlbiBpdCBpcyBldmVuLiAoY29kZU51bSsxKS8yIGlzIG9idGFpbmVkIGFzCisgICAgICAgICAqIChjb2RlTnVtKzEpPj4xIHdoZW4gdmFsdWUgaXMgcG9zaXRpdmUgYW5kIGFzICgtY29kZU51bSk+PjEgZm9yCisgICAgICAgICAqIG5lZ2F0aXZlIHZhbHVlICovCisgICAgICAgIC8qbGludCAtZTcwMiAqLworICAgICAgICAqdmFsdWUgPSAoY29kZU51bSAmIDB4MSkgPyAoaTMyKSgoY29kZU51bSArIDEpID4+IDEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKGkzMikoKGNvZGVOdW0gKyAxKSA+PiAxKTsKKyAgICAgICAgLypsaW50ICtlNzAyICovCisgICAgICAgIHJldHVybihIQU5UUk9fT0spOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICA1LjMgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iTWFwcGVkCisKKyAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIERlY29kZSBtYXBwZWQgRXhwLUdvbG9tYiBjb2RlLiBDb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5CisgICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoZW4gbWFwcGVkIHRvIGNvZGVkQmxvY2tQYXR0ZXJuCisgICAgICAgICAgICBlaXRoZXIgZm9yIGludHJhIG9yIGludGVyIG1hY3JvYmxvY2suIFRoZSBtYXBwaW5nIGlzIGltcGxlbWVudGVkIGJ5CisgICAgICAgICAgICBsb29rLXVwIHRhYmxlcyBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBpc0ludHJhICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBpZiBpbnRyYSBvciBpbnRlciBtYXBwaW5nIGlzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZAorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAorICAgIHUzMiBpc0ludHJhKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworICAgIHUzMiBzdGF0dXMsIGNvZGVOdW07CisKKy8qIENvZGUgKi8KKworICAgIEFTU0VSVChwU3RybURhdGEpOworICAgIEFTU0VSVCh2YWx1ZSk7CisKKyAgICBzdGF0dXMgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmY29kZU51bSk7CisKKyAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKKyAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiByYW5nZSBvZiB2YWxpZCBjb2RlTnVtcyBbMCw0N10gKi8KKyAgICAgICAgaWYgKGNvZGVOdW0gPiA0NykKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgIGlmIChpc0ludHJhKQorICAgICAgICAgICAgKnZhbHVlID0gY29kZWRCbG9ja1BhdHRlcm5JbnRyYTR4NFtjb2RlTnVtXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnZhbHVlID0gY29kZWRCbG9ja1BhdHRlcm5JbnRlcltjb2RlTnVtXTsKKyAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDUuNCAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQKKworICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgRGVjb2RlIHRydW5jYXRlZCBFeHAtR29sb21iIGNvZGUuIGdyZWF0ZXJUaGFuT25lIGZsYWcgaW5kaWNhdGVzCisgICAgICAgICAgICB0aGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbCB0byBiZSBkZWNvZGVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgRkFMU0UgICAtPiAgWzAsMV0KKyAgICAgICAgICAgICAgICBUUlVFICAgIC0+ICBbMCwyXjMyLTFdCisKKyAgICAgICAgICAgIElmIGZsYWcgaXMgZmFsc2UgdGhlIGRlY29kaW5nIGlzIHBlcmZvcm1lZCBieSByZWFkaW5nIG9uZSBiaXQKKyAgICAgICAgICAgIGZyb20gdGhlIHN0cmVhbSB3aXRoIGgyNjRic2RHZXRCaXRzIGFuZCBtYXBwaW5nIHRoaXMgdG8gZGVjb2RlZAorICAgICAgICAgICAgc3ltYm9sIGFzCisgICAgICAgICAgICAgICAgc3ltYm9sID0gYml0ID8gMCA6IDEKKworICAgICAgICAgICAgT3RoZXJ3aXNlLCBpLmUuIHdoZW4gZmxhZyBpcyBUUlVFLCBjb2RlIG51bSBpcyBkZXRlcm1pbmVkIGJ5CisgICAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQgYW5kIHRoaXMgaXMgdXNlZCBhcyB0aGUgZGVjb2RlZAorICAgICAgICAgICAgc3ltYm9sLgorCisgICAgICAgIElucHV0czoKKyAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgZ3JlYXRlclRoYW5PbmUgIGZsYWcgdG8gaW5kaWNhdGUgaWYgcmFuZ2UgaXMgd2lkZXIgdGhhbiBbMCwxXQorCisgICAgICAgIE91dHB1dHM6CisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKKyAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgdTMyICp2YWx1ZSwKKyAgdTMyIGdyZWF0ZXJUaGFuT25lKQoreworCisvKiBWYXJpYWJsZXMgKi8KKworLyogQ29kZSAqLworCisgICAgQVNTRVJUKHBTdHJtRGF0YSk7CisgICAgQVNTRVJUKHZhbHVlKTsKKworICAgIGlmIChncmVhdGVyVGhhbk9uZSkKKyAgICB7CisgICAgICAgIHJldHVybihoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCB2YWx1ZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsMSk7CisgICAgICAgIGlmICgqdmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7CisgICAgICAgICp2YWx1ZSBePSAweDE7CisgICAgfQorCisgICAgcmV0dXJuIChIQU5UUk9fT0spOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzE2NzczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfVkxDX0gKKyNkZWZpbmUgSDI2NFNXREVDX1ZMQ19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlKTsKKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBpMzIgKnZhbHVlKTsKKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAorICAgIHUzMiBpc0ludHJhKTsKKwordTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAorICAgIHUzMiBncmVhdGVyVGhhbk9uZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZMQ19IICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTkzMzVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5jCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKyAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCisgICAgIDMuIE1vZHVsZSBkZWZpbmVzCisgICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgNS4gRnVuY3Rpb25zCisgICAgICAgICAgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKKyAgICAgICAgICBEZWNvZGVIcmRQYXJhbWV0ZXJzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiaDI2NGJzZF92dWkuaCIKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCisjaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKKyNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBNb2R1bGUgZGVmaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNQVhfRFBCX1NJWkUgMTYKKyNkZWZpbmUgTUFYX0JSICAgICAgIDI0MDAwMCAvKiBmb3IgbGV2ZWwgNS4xICovCisjZGVmaW5lIE1BWF9DUEIgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1MzIgRGVjb2RlSHJkUGFyYW1ldGVycygKKyAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICBocmRQYXJhbWV0ZXJzX3QgKnBIcmRQYXJhbWV0ZXJzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgVlVJIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YSBvciBlbmQgb2Ygc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3UzMiBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhzdHJtRGF0YV90ICpwU3RybURhdGEsCisgICAgdnVpUGFyYW1ldGVyc190ICpwVnVpUGFyYW1ldGVycykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocFZ1aVBhcmFtZXRlcnMpOworCisgICAgSDI2NFN3RGVjTWVtc2V0KHBWdWlQYXJhbWV0ZXJzLCAwLCBzaXplb2YodnVpUGFyYW1ldGVyc190KSk7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPSB0bXA7CisKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYyA9PSBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FyV2lkdGggPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5zYXJIZWlnaHQgPSB0bXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkluZm9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5vdmVyc2NhbkFwcHJvcHJpYXRlRmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDMpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Z1bGxSYW5nZUZsYWcgPSAodG1wID09IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9CisgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgPSB0bXA7CisKKyAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7CisgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gdG1wOworCisgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzICAgICAgICAgPSAyOworICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKKyAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZpZGVvRm9ybWF0ICAgICAgICAgICAgID0gNTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gMjsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyAgICAgID0gMjsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYUxvY0luZm9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVUb3BGaWVsZCA+IDUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZUJvdHRvbUZpZWxkID4gNSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnRpbWluZ0luZm9QcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlmICh0bXAgPT0gMCkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVVuaXRzSW5UaWNrID0gdG1wOworCisgICAgICAgIHRtcCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7CisgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMzIpID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIGlmICh0bXAgPT0gMCkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnRpbWVTY2FsZSA9IHRtcDsKKworICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5maXhlZEZyYW1lUmF0ZUZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworICAgIH0KKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9CisgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKworICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQorICAgIHsKKyAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycyk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7CisgICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYworICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcworICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMjAwICogTUFYX0JSICsgMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9DUEIgKyAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0KKyAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCisgICAgeworICAgICAgICB0bXAgPSBEZWNvZGVIcmRQYXJhbWV0ZXJzKHBTdHJtRGF0YSwgJnBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiQ250ICAgICAgICAgID0gMTsKKyAgICAgICAgLyogTWF4QlIgYW5kIE1heENQQiBzaG91bGQgYmUgdGhlIHZhbHVlcyBjb3JyZXNwb25kaWcgdG8gdGhlIGxldmVsSWRjCisgICAgICAgICAqIGluIHRoZSBTUFMgY29udGFpbmluZyB0aGVzZSBWVUkgcGFyYW1ldGVycy4gSG93ZXZlciwgdGhlc2UgdmFsdWVzCisgICAgICAgICAqIGFyZSBub3QgdXNlZCBhbnl3aGVyZSBhbmQgbWF4aW11bSBmb3IgYW55IGxldmVsIHdpbGwgYmUgdXNlZCBoZXJlICovCisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmJpdFJhdGVWYWx1ZVswXSA9IDEwMDAgKiBNQVhfQlIgKyAxOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5jcGJTaXplVmFsdWVbMF0gPSAxMDAwICogTUFYX0NQQiArIDE7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGggPSAyNDsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiUmVtb3ZhbERlbGF5TGVuZ3RoICAgICAgICA9IDI0OworICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5kcGJPdXRwdXREZWxheUxlbmd0aCAgICAgICAgID0gMjQ7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLnRpbWVPZmZzZXRMZW5ndGggICAgICAgICAgICAgPSAyNDsKKyAgICB9CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyB8fAorICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvd0RlbGF5SHJkRmxhZyA9CisgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisgICAgfQorCisgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICBwVnVpUGFyYW1ldGVycy0+cGljU3RydWN0UHJlc2VudEZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcgPQorICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7CisKKyAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmJpdHN0cmVhbVJlc3RyaWN0aW9uRmxhZykKKyAgICB7CisgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7CisgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPQorICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCeXRlc1BlclBpY0Rlbm9tID4gMTYpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heEJpdHNQZXJNYkRlbm9tKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID4gMTYpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCA+IDE2KQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworCisgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCisgICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOworICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKKyAgICAgICAgICAgIHJldHVybih0bXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bW90aW9uVmVjdG9yc092ZXJQaWNCb3VuZGFyaWVzRmxhZyA9IEhBTlRST19UUlVFOworICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSAgICAgICA9IDI7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSAgICAgICAgID0gMTsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aEhvcml6b250YWwgPSAxNjsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmxvZzJNYXhNdkxlbmd0aFZlcnRpY2FsICAgPSAxNjsKKyAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgICAgICAgICAgPSBNQVhfRFBCX1NJWkU7CisgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyAgICAgID0gTUFYX0RQQl9TSVpFOworICAgIH0KKworICAgIHJldHVybihIQU5UUk9fT0spOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBGdW5jdGlvbjogRGVjb2RlSHJkUGFyYW1ldGVycworCisgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246CisgICAgICAgICAgICBEZWNvZGUgSFJEIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RyZWFtLiBTZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMuCisKKyAgICAgICAgSW5wdXRzOgorICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCisKKyAgICAgICAgT3V0cHV0czoKKyAgICAgICAgICAgIHBIcmRQYXJhbWV0ZXJzICBkZWNvZGVkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCisgICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCisgIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycykKK3sKKworLyogVmFyaWFibGVzICovCisKKyAgICB1MzIgdG1wLCBpOworCisvKiBDb2RlICovCisKKyAgICBBU1NFUlQocFN0cm1EYXRhKTsKKyAgICBBU1NFUlQocEhyZFBhcmFtZXRlcnMpOworCisKKyAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmcEhyZFBhcmFtZXRlcnMtPmNwYkNudCk7CisgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgIHJldHVybih0bXApOworICAgIC8qIGNwYkNvdW50ID0gY3BiX2NudF9taW51czEgKyAxICovCisgICAgcEhyZFBhcmFtZXRlcnMtPmNwYkNudCsrOworICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiQ250ID4gTUFYX0NQQl9DTlQpCisgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVTY2FsZSA9IHRtcDsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNCk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSA9IHRtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwSHJkUGFyYW1ldGVycy0+Y3BiQ250OyBpKyspCisgICAgeworICAgICAgICAvKiBiaXRfcmF0ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KKyAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKKyAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSk7CisgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQorICAgICAgICAgICAgcmV0dXJuKHRtcCk7CisgICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCisgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0rKzsKKyAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKKyAgICAgICAgICogYW55dGhpbmcgKi8KKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSAqPQorICAgICAgICAgICAgMSA8PCAoNiArIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUpOworCisgICAgICAgIC8qIGNwYl9zaXplX3ZhbHVlX21pbnVzMSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXSAqLworICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAorICAgICAgICAgICZwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldKTsKKyAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCisgICAgICAgICAgICByZXR1cm4odG1wKTsKKyAgICAgICAgaWYgKHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0gPiA0Mjk0OTY3Mjk0VSkKKyAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKKyAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSsrOworICAgICAgICAvKiB0aGlzIG1heSByZXN1bHQgaW4gb3ZlcmZsb3csIGJ1dCB0aGlzIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgorICAgICAgICAgKiBhbnl0aGluZyAqLworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldICo9CisgICAgICAgICAgICAxIDw8ICg0ICsgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVTY2FsZSk7CisKKyAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKKyAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgICAgICBwSHJkUGFyYW1ldGVycy0+Y2JyRmxhZ1tpXSA9ICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKKyAgICB9CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT5kcGJPdXRwdXREZWxheUxlbmd0aCA9IHRtcCArIDE7CisKKyAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOworICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOworICAgIHBIcmRQYXJhbWV0ZXJzLT50aW1lT2Zmc2V0TGVuZ3RoID0gdG1wOworCisgICAgcmV0dXJuKEhBTlRST19PSyk7CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3Z1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1ZDUyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVGFibGUgb2YgY29udGVudHMKKworICAgIDEuIEluY2x1ZGUgaGVhZGVycworICAgIDIuIE1vZHVsZSBkZWZpbmVzCisgICAgMy4gRGF0YSB0eXBlcworICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBIMjY0U1dERUNfVlVJX0gKKyNkZWZpbmUgSDI2NFNXREVDX1ZVSV9ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiYmFzZXR5cGUuaCIKKyNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDIuIE1vZHVsZSBkZWZpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIE1BWF9DUEJfQ05UIDMyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMy4gRGF0YSB0eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZW51bWVyYXRlZCBzYW1wbGUgYXNwZWN0IHJhdGlvcywgQVNQRUNUX1JBVElPX01fTiBtZWFucyBNOk4gKi8KK2VudW0KK3sKKyAgICBBU1BFQ1RfUkFUSU9fVU5TUEVDSUZJRUQgPSAwLAorICAgIEFTUEVDVF9SQVRJT18xXzEsCisgICAgQVNQRUNUX1JBVElPXzEyXzExLAorICAgIEFTUEVDVF9SQVRJT18xMF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTZfMTEsCisgICAgQVNQRUNUX1JBVElPXzQwXzMzLAorICAgIEFTUEVDVF9SQVRJT18yNF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMjBfMTEsCisgICAgQVNQRUNUX1JBVElPXzMyXzExLAorICAgIEFTUEVDVF9SQVRJT184MF8zMywKKyAgICBBU1BFQ1RfUkFUSU9fMThfMTEsCisgICAgQVNQRUNUX1JBVElPXzE1XzExLAorICAgIEFTUEVDVF9SQVRJT182NF8zMywKKyAgICBBU1BFQ1RfUkFUSU9fMTYwXzk5LAorICAgIEFTUEVDVF9SQVRJT19FWFRFTkRFRF9TQVIgPSAyNTUKK307CisKKy8qIHN0cnVjdHVyZSB0byBzdG9yZSBIeXBvdGhldGljYWwgUmVmZXJlbmNlIERlY29kZXIgKEhSRCkgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgY3BiQ250OworICAgIHUzMiBiaXRSYXRlU2NhbGU7CisgICAgdTMyIGNwYlNpemVTY2FsZTsKKyAgICB1MzIgYml0UmF0ZVZhbHVlW01BWF9DUEJfQ05UXTsKKyAgICB1MzIgY3BiU2l6ZVZhbHVlW01BWF9DUEJfQ05UXTsKKyAgICB1MzIgY2JyRmxhZ1tNQVhfQ1BCX0NOVF07CisgICAgdTMyIGluaXRpYWxDcGJSZW1vdmFsRGVsYXlMZW5ndGg7CisgICAgdTMyIGNwYlJlbW92YWxEZWxheUxlbmd0aDsKKyAgICB1MzIgZHBiT3V0cHV0RGVsYXlMZW5ndGg7CisgICAgdTMyIHRpbWVPZmZzZXRMZW5ndGg7Cit9IGhyZFBhcmFtZXRlcnNfdDsKKworLyogc3RvcmFnZSBmb3IgVlVJIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdTMyIGFzcGVjdFJhdGlvUHJlc2VudEZsYWc7CisgICAgdTMyIGFzcGVjdFJhdGlvSWRjOworICAgIHUzMiBzYXJXaWR0aDsKKyAgICB1MzIgc2FySGVpZ2h0OworICAgIHUzMiBvdmVyc2NhbkluZm9QcmVzZW50RmxhZzsKKyAgICB1MzIgb3ZlcnNjYW5BcHByb3ByaWF0ZUZsYWc7CisgICAgdTMyIHZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnOworICAgIHUzMiB2aWRlb0Zvcm1hdDsKKyAgICB1MzIgdmlkZW9GdWxsUmFuZ2VGbGFnOworICAgIHUzMiBjb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnOworICAgIHUzMiBjb2xvdXJQcmltYXJpZXM7CisgICAgdTMyIHRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzOworICAgIHUzMiBtYXRyaXhDb2VmZmljaWVudHM7CisgICAgdTMyIGNocm9tYUxvY0luZm9QcmVzZW50RmxhZzsKKyAgICB1MzIgY2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkOworICAgIHUzMiBjaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQ7CisgICAgdTMyIHRpbWluZ0luZm9QcmVzZW50RmxhZzsKKyAgICB1MzIgbnVtVW5pdHNJblRpY2s7CisgICAgdTMyIHRpbWVTY2FsZTsKKyAgICB1MzIgZml4ZWRGcmFtZVJhdGVGbGFnOworICAgIHUzMiBuYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWc7CisgICAgaHJkUGFyYW1ldGVyc190IG5hbEhyZFBhcmFtZXRlcnM7CisgICAgdTMyIHZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZzsKKyAgICBocmRQYXJhbWV0ZXJzX3QgdmNsSHJkUGFyYW1ldGVyczsKKyAgICB1MzIgbG93RGVsYXlIcmRGbGFnOworICAgIHUzMiBwaWNTdHJ1Y3RQcmVzZW50RmxhZzsKKyAgICB1MzIgYml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnOworICAgIHUzMiBtb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnOworICAgIHUzMiBtYXhCeXRlc1BlclBpY0Rlbm9tOworICAgIHUzMiBtYXhCaXRzUGVyTWJEZW5vbTsKKyAgICB1MzIgbG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbDsKKyAgICB1MzIgbG9nMk1heE12TGVuZ3RoVmVydGljYWw7CisgICAgdTMyIG51bVJlb3JkZXJGcmFtZXM7CisgICAgdTMyIG1heERlY0ZyYW1lQnVmZmVyaW5nOworfSB2dWlQYXJhbWV0ZXJzX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTMyIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKKyAgICB2dWlQYXJhbWV0ZXJzX3QgKnBWdWlQYXJhbWV0ZXJzKTsKKworI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfVlVJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKaW5kZXggNWM3NjhjOC4uZjMzZjNhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCkBAIC0yLDEyICsyLDE5IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgICAgVm9yYmlzRGVjb2Rlci5jcHAgXAorICAgICAgICBTb2Z0Vm9yYmlzLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZXh0ZXJuYWwvdHJlbW9sbyBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZXh0ZXJuYWwvdHJlbW9sbworICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKIAotTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3ZvcmJpc2RlYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYnZvcmJpc2lkZWMgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscwogCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDkxMTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRWb3JiaXMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0Vm9yYmlzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0Vm9yYmlzOjpTb2Z0Vm9yYmlzKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbVN0YXRlKE5VTEwpLAorICAgICAgbVZpKE5VTEwpLAorICAgICAgbUFuY2hvclRpbWVVcygwKSwKKyAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCisgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSgtMSksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0Vm9yYmlzOjp+U29mdFZvcmJpcygpIHsKKyAgICBpZiAobVN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtVmkgIT0gTlVMTCkgeworICAgICAgICB2b3JiaXNfaW5mb19jbGVhcihtVmkpOworICAgICAgICBkZWxldGUgbVZpOworICAgICAgICBtVmkgPSBOVUxMOworICAgIH0KK30KKwordm9pZCBTb2Z0Vm9yYmlzOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdBQUM7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRWb3JiaXM6OmluaXREZWNvZGVyKCkgeworICAgIHJldHVybiBPSzsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0Vm9yYmlzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAodm9yYmlzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5CaXRSYXRlID0gMDsKKyAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bk1pbkJpdFJhdGUgPSAwOworICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uTWF4Qml0UmF0ZSA9IDA7CisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7CisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPm5RdWFsaXR5ID0gMzsKKyAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+Yk1hbmFnZWQgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICB2b3JiaXNQYXJhbXMtPmJEb3dubWl4ID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+blNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uQml0UmF0ZSA9IG1WaS0+Yml0cmF0ZV9ub21pbmFsOworICAgICAgICAgICAgICAgIHZvcmJpc1BhcmFtcy0+bk1pbkJpdFJhdGUgPSBtVmktPmJpdHJhdGVfbG93ZXI7CisgICAgICAgICAgICAgICAgdm9yYmlzUGFyYW1zLT5uTWF4Qml0UmF0ZSA9IG1WaS0+Yml0cmF0ZV91cHBlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOworICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1WaS0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRWb3JiaXM6OmludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpczoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKnZvcmJpc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAodm9yYmlzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitib29sIFNvZnRWb3JiaXM6OmlzQ29uZmlndXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlucHV0QnVmZmVyQ291bnQgPj0gMjsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gTlVMTDsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCit2b2lkIFNvZnRWb3JiaXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDIpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOworCisgICAgICAgIG9nZ19idWZmZXIgYnVmOworICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgb2dncGFja19idWZmZXIgYml0czsKKworICAgICAgICBtYWtlQml0UmVhZGVyKAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIDcsIHNpemUgLSA3LAorICAgICAgICAgICAgICAgICZidWYsICZyZWYsICZiaXRzKTsKKworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0sobVZpID09IE5VTEwpOworICAgICAgICAgICAgbVZpID0gbmV3IHZvcmJpc19pbmZvOworICAgICAgICAgICAgdm9yYmlzX2luZm9faW5pdChtVmkpOworCisgICAgICAgICAgICBDSEVDS19FUSgwLCBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKDAsIF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpKTsKKworICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE5VTEwpOworICAgICAgICAgICAgbVN0YXRlID0gbmV3IHZvcmJpc19kc3Bfc3RhdGU7CisgICAgICAgICAgICBDSEVDS19FUSgwLCB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICB9CisKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOworCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKKyAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAorICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0ICsgaW5IZWFkZXItPm5GaWxsZWRMZW4gLSA0LAorICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisKKyAgICAgICAgaWYgKG51bVBhZ2VTYW1wbGVzID49IDApIHsKKyAgICAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOzsKKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgYnVmLmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBidWYuc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBidWYucmVmY291bnQgPSAxOworICAgICAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgICAgIHJlZi5iZWdpbiA9IDA7CisgICAgICAgIHJlZi5sZW5ndGggPSBidWYuc2l6ZTsKKyAgICAgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgICAgIG9nZ19wYWNrZXQgcGFjazsKKyAgICAgICAgcGFjay5wYWNrZXQgPSAmcmVmOworICAgICAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICAgICAgcGFjay5iX29fcyA9IDA7CisgICAgICAgIHBhY2suZV9vX3MgPSAwOworICAgICAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgICAgICBwYWNrLnBhY2tldG5vID0gMDsKKworICAgICAgICBpbnQgbnVtRnJhbWVzID0gMDsKKworICAgICAgICBpbnQgZXJyID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgTE9HVygidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtRnJhbWVzID0gdm9yYmlzX2RzcF9wY21vdXQoCisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyKTsKKworICAgICAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJ2b3JiaXNfZHNwX3BjbW91dCByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTnVtRnJhbWVzTGVmdE9uUGFnZSA+PSAwKSB7CisgICAgICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsCisgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBtTnVtRnJhbWVzTGVmdE9uUGFnZSk7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzID0gbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSAtPSBudW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtVmktPmNoYW5uZWxzOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0KKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKKyAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1WaS0+cmF0ZTsKKworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKKworICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdFZvcmJpczo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbVN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisKKyAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworICAgIH0KK30KKwordm9pZCBTb2Z0Vm9yYmlzOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIGlmIChwb3J0SW5kZXggIT0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdFZvcmJpcyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MmY1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX1ZPUkJJU19IXworCisjZGVmaW5lIFNPRlRfVk9SQklTX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0Vm9yYmlzIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRWb3JiaXMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRWb3JiaXMoKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA4MTkyICogMgorICAgIH07CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICB2b3JiaXNfZHNwX3N0YXRlICptU3RhdGU7CisgICAgdm9yYmlzX2luZm8gKm1WaTsKKworICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZvcmJpcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfVk9SQklTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1ZvcmJpc0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNGZiOTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVm9yYmlzRGVjb2RlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlZvcmJpc0RlY29kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1leHRlcm4gIkMiIHsKLSAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgotCi0gICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKLSAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7Ci0gICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOwotfQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZvcmJpc0RlY29kZXI6OlZvcmJpc0RlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCi0gICAgICBtQW5jaG9yVGltZVVzKDApLAotICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKLSAgICAgIG1TdGF0ZShOVUxMKSwKLSAgICAgIG1WaShOVUxMKSB7Ci0gICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKLSAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci19Ci0KLVZvcmJpc0RlY29kZXI6On5Wb3JiaXNEZWNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7Ci0gICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOwotICAgIGJ1Zi0+c2l6ZSA9IHNpemU7Ci0gICAgYnVmLT5yZWZjb3VudCA9IDE7Ci0gICAgYnVmLT5wdHIub3duZXIgPSBOVUxMOwotCi0gICAgcmVmLT5idWZmZXIgPSBidWY7Ci0gICAgcmVmLT5iZWdpbiA9IDA7Ci0gICAgcmVmLT5sZW5ndGggPSBzaXplOwotICAgIHJlZi0+bmV4dCA9IE5VTEw7Ci0KLSAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Ci19Ci0KLXN0YXR1c190IFZvcmJpc0RlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKAotICAgICAgICAgICAgbmV3IE1lZGlhQnVmZmVyKGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mbzsKLSAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOwotCi0gICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgb2dncGFja19idWZmZXIgYml0czsKLSAgICBtYWtlQml0UmVhZGVyKChjb25zdCB1aW50OF90ICopZGF0YSArIDcsIHNpemUgLSA3LCAmYnVmLCAmcmVmLCAmYml0cyk7Ci0gICAgQ0hFQ0tfRVEoMCwgX3ZvcmJpc191bnBhY2tfaW5mbyhtVmksICZiaXRzKSk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOwotCi0gICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOwotICAgIENIRUNLX0VRKDAsIF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgbVN0YXRlID0gbmV3IHZvcmJpc19kc3Bfc3RhdGU7Ci0gICAgQ0hFQ0tfRVEoMCwgdm9yYmlzX2RzcF9pbml0KG1TdGF0ZSwgbVZpKSk7Ci0KLSAgICBtQW5jaG9yVGltZVVzID0gMDsKLSAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLQotICAgIC8vIElmIHRoZSBzb3VyY2UgbmV2ZXIgbGltaXRzIHRoZSBudW1iZXIgb2YgdmFsaWQgZnJhbWVzIGNvbnRhaW5lZAotICAgIC8vIGluIHRoZSBpbnB1dCBkYXRhLCB3ZSdsbCBhc3N1bWUgdGhhdCBhbGwgb2YgdGhlIGRlY29kZWQgZnJhbWVzIGFyZQotICAgIC8vIHZhbGlkLgotICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZvcmJpc0RlY29kZXI6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOwotICAgIGRlbGV0ZSBtU3RhdGU7Ci0gICAgbVN0YXRlID0gTlVMTDsKLQotICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7Ci0gICAgZGVsZXRlIG1WaTsKLSAgICBtVmkgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFZvcmJpc0RlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIlZvcmJpc0RlY29kZXIiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1pbnQgVm9yYmlzRGVjb2Rlcjo6ZGVjb2RlUGFja2V0KE1lZGlhQnVmZmVyICpwYWNrZXQsIE1lZGlhQnVmZmVyICpvdXQpIHsKLSAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICBidWYuZGF0YSA9ICh1aW50OF90ICopcGFja2V0LT5kYXRhKCkgKyBwYWNrZXQtPnJhbmdlX29mZnNldCgpOwotICAgIGJ1Zi5zaXplID0gcGFja2V0LT5yYW5nZV9sZW5ndGgoKTsKLSAgICBidWYucmVmY291bnQgPSAxOwotICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwotCi0gICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgcmVmLmJ1ZmZlciA9ICZidWY7Ci0gICAgcmVmLmJlZ2luID0gMDsKLSAgICByZWYubGVuZ3RoID0gcGFja2V0LT5yYW5nZV9sZW5ndGgoKTsKLSAgICByZWYubmV4dCA9IE5VTEw7Ci0KLSAgICBvZ2dfcGFja2V0IHBhY2s7Ci0gICAgcGFjay5wYWNrZXQgPSAmcmVmOwotICAgIHBhY2suYnl0ZXMgPSBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpOwotICAgIHBhY2suYl9vX3MgPSAwOwotICAgIHBhY2suZV9vX3MgPSAwOwotICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7Ci0gICAgcGFjay5wYWNrZXRubyA9IDA7Ci0KLSAgICBpbnQgbnVtRnJhbWVzID0gMDsKLQotICAgIGludCBlcnIgPSB2b3JiaXNfZHNwX3N5bnRoZXNpcyhtU3RhdGUsICZwYWNrLCAxKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgTE9HVygidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAotICAgICAgICAgICAgICAgIG1TdGF0ZSwgKGludDE2X3QgKilvdXQtPmRhdGEoKSwga01heE51bVNhbXBsZXNQZXJCdWZmZXIpOwotCi0gICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJ2b3JiaXNfZHNwX3BjbW91dCByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICBudW1GcmFtZXMgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1OdW1GcmFtZXNMZWZ0T25QYWdlID49IDApIHsKLSAgICAgICAgaWYgKG51bUZyYW1lcyA+IG1OdW1GcmFtZXNMZWZ0T25QYWdlKSB7Ci0gICAgICAgICAgICBMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsCi0gICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKLSAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOwotICAgICAgICB9Ci0gICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKLSAgICB9Ci0KLSAgICBvdXQtPnNldF9yYW5nZSgwLCBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtTnVtQ2hhbm5lbHMpOwotCi0gICAgcmV0dXJuIG51bUZyYW1lczsKLX0KLQotc3RhdHVzX3QgVm9yYmlzRGVjb2Rlcjo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLQotICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLSAgICAgICAgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2Vla1RpbWVVcyA9IC0xOwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICppbnB1dEJ1ZmZlcjsKLSAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZpbnB1dEJ1ZmZlciwgb3B0aW9ucyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgbUFuY2hvclRpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2UgbXVzdCBoYXZlIGEgbmV3IHRpbWVzdGFtcCBhZnRlciBzZWVraW5nLgotICAgICAgICBDSEVDSyhzZWVrVGltZVVzIDwgMCk7Ci0gICAgfQotCi0gICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICBpZiAoaW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgewotICAgICAgICBDSEVDSyhudW1QYWdlU2FtcGxlcyA+PSAwKTsKLSAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSBudW1QYWdlU2FtcGxlczsKLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyOwotICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dHB1dEJ1ZmZlciksIE9LKTsKLQotICAgIGludCBudW1GcmFtZXMgPSBkZWNvZGVQYWNrZXQoaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlcik7Ci0KLSAgICBpbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIGlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAga0tleVRpbWUsCi0gICAgICAgICAgICBtQW5jaG9yVGltZVVzCi0gICAgICAgICAgICAgICAgKyAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtU2FtcGxlUmF0ZSk7Ci0KLSAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKLQotICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAppbmRleCAzYjkyZTVkLi41Y2MzZjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKQEAgLTE0LDE0ICsxNCwxNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2xvckNvbnZlcnRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IGludCBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMDsKLQogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCkBAIC00NCw2ICs0Niw3IEBACiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTExNSw2ICsxMTgsMTAgQEAKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKHNyYywgZHN0KTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICBlcnIgPSBjb252ZXJ0VElZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKHNyYywgZHN0KTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiBVbmtub3duIGNvbG9yIGNvbnZlcnNpb24uIik7CkBAIC0xODcsOCArMTk0LDcgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewotICAgIGlmICghKChkc3QubVdpZHRoICYgMSkgPT0gMAotICAgICAgICAgICAgJiYgKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCisgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCiAgICAgICAgICAgICAmJiBzcmMuY3JvcFdpZHRoKCkgPT0gZHN0LmNyb3BXaWR0aCgpCiAgICAgICAgICAgICAmJiBzcmMuY3JvcEhlaWdodCgpID09IGRzdC5jcm9wSGVpZ2h0KCkpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTE5Niw4ICsyMDIsOCBAQAogCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MzJfdCAqZHN0X3B0ciA9ICh1aW50MzJfdCAqKWRzdC5tQml0cwotICAgICAgICArIChkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdCkgLyAyOworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CkBAIC0yNjAsNyArMjY2LDExIEBACiAgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCiAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPj4gMyk7CiAKLSAgICAgICAgICAgIGRzdF9wdHJbeCAvIDJdID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKKyAgICAgICAgICAgIGlmICh4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKSkgeworICAgICAgICAgICAgICAgICoodWludDMyX3QgKikoJmRzdF9wdHJbeF0pID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0X3B0clt4XSA9IHJnYjE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOwpAQCAtMjcwLDcgKzI4MCw3IEBACiAgICAgICAgICAgICBzcmNfdiArPSBzcmMubVdpZHRoIC8gMjsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aCAvIDI7CisgICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC00MTYsNiArNDI2LDczIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFRJWVVWNDIwUGFja2VkU2VtaVBsYW5hcigKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CisKKyAgICBpZiAoISgoZHN0Lm1XaWR0aCAmIDMpID09IDAKKyAgICAgICAgICAgICYmIChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAorICAgICAgICAgICAgJiYgc3JjLmNyb3BXaWR0aCgpID09IGRzdC5jcm9wV2lkdGgoKQorICAgICAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgdWludDMyX3QgKmRzdF9wdHIgPSAodWludDMyX3QgKilkc3QubUJpdHMKKyAgICAgICAgKyAoZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQpIC8gMjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHM7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogKHNyYy5tSGVpZ2h0IC0gc3JjLm1Dcm9wVG9wIC8gMik7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CisgICAgICAgICAgICBzaWduZWQgeTEgPSAoc2lnbmVkKXNyY195W3hdIC0gMTY7CisgICAgICAgICAgICBzaWduZWQgeTIgPSAoc2lnbmVkKXNyY195W3ggKyAxXSAtIDE2OworCisgICAgICAgICAgICBzaWduZWQgdSA9IChzaWduZWQpc3JjX3VbeCAmIH4xXSAtIDEyODsKKyAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdVsoeCAmIH4xKSArIDFdIC0gMTI4OworCisgICAgICAgICAgICBzaWduZWQgdV9iID0gdSAqIDUxNzsKKyAgICAgICAgICAgIHNpZ25lZCB1X2cgPSAtdSAqIDEwMDsKKyAgICAgICAgICAgIHNpZ25lZCB2X2cgPSAtdiAqIDIwODsKKyAgICAgICAgICAgIHNpZ25lZCB2X3IgPSB2ICogNDA5OworCisgICAgICAgICAgICBzaWduZWQgdG1wMSA9IHkxICogMjk4OworICAgICAgICAgICAgc2lnbmVkIGIxID0gKHRtcDEgKyB1X2IpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIGcxID0gKHRtcDEgKyB2X2cgKyB1X2cpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIHIxID0gKHRtcDEgKyB2X3IpIC8gMjU2OworCisgICAgICAgICAgICBzaWduZWQgdG1wMiA9IHkyICogMjk4OworICAgICAgICAgICAgc2lnbmVkIGIyID0gKHRtcDIgKyB1X2IpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OworICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OworCisgICAgICAgICAgICB1aW50MzJfdCByZ2IxID0KKyAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdID4+IDMpOworCisgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KKyAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOworCisgICAgICAgICAgICBkc3RfcHRyW3ggLyAyXSA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworCisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aCAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiB1aW50OF90ICpDb2xvckNvbnZlcnRlcjo6aW5pdENsaXAoKSB7CiAgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1pbiA9IC0yNzg7CiAgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBrQ2xpcE1heCA9IDUzNTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCAzMWFmYzQzLi4zMjQ2MDIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC01MCwxNSArNTAsMzEgQEAKICAgICAgICAgbUNyb3BCb3R0b20gPSBtSGVpZ2h0IC0gMTsKICAgICB9CiAKKyAgICBtQ3JvcFdpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CisgICAgbUNyb3BIZWlnaHQgPSBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wICsgMTsKKwogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKICAgICB9CiAKICAgICBpbnQgaGFsRm9ybWF0OworICAgIHNpemVfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OworCiAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICBidWZXaWR0aCA9IChtQ3JvcFdpZHRoICsgMSkgJiB+MTsKKyAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgICAgICBidWZXaWR0aCA9IG1Dcm9wV2lkdGg7CisgICAgICAgICAgICBidWZIZWlnaHQgPSBtQ3JvcEhlaWdodDsKIAogICAgICAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigKICAgICAgICAgICAgICAgICAgICAgbUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpOwpAQCAtNjcsOCArODMsOCBAQAogICAgIH0KIAogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCk7Ci0gICAgQ0hFQ0sobVdpZHRoID4gMCk7Ci0gICAgQ0hFQ0sobUhlaWdodCA+IDApOworICAgIENIRUNLKG1Dcm9wV2lkdGggPiAwKTsKKyAgICBDSEVDSyhtQ3JvcEhlaWdodCA+IDApOwogICAgIENIRUNLKG1Db252ZXJ0ZXIgPT0gTlVMTCB8fCBtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwogCiAgICAgQ0hFQ0tfRVEoMCwKQEAgLTc3LDEzICs5MywxNiBAQAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgogICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApKTsKIAotICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtTmF0aXZlV2luZG93LmdldCgpLCAyKSk7CisgICAgQ0hFQ0tfRVEoMCwKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKKyAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpKTsKIAogICAgIC8vIFdpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMzI/Pz8KICAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDEsCi0gICAgICAgICAgICAgICAgbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDEsCisgICAgICAgICAgICAgICAgYnVmV2lkdGgsCisgICAgICAgICAgICAgICAgYnVmSGVpZ2h0LAogICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogCiAgICAgdWludDMyX3QgdHJhbnNmb3JtOwpAQCAtMTA2LDkgKzEyNSwxNCBAQAogICAgIG1Db252ZXJ0ZXIgPSBOVUxMOwogfQogCitzdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgeworICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7Cit9CisKIHZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKmJ1ZjsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgaW50IGVycjsKICAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPmRlcXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1ZikpICE9IDApIHsKICAgICAgICAgTE9HVygiU3VyZmFjZTo6ZGVxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CkBAIC0xMTksNyArMTQzLDcgQEAKIAogICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwogCi0gICAgUmVjdCBib3VuZHMobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBSZWN0IGJvdW5kcyhtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodCk7CiAKICAgICB2b2lkICpkc3Q7CiAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soCkBAIC0xMzIsMTEgKzE1Niw3MCBAQAogICAgICAgICAgICAgICAgIG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tLAogICAgICAgICAgICAgICAgIGRzdCwKICAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgMCwgMCwKLSAgICAgICAgICAgICAgICBtQ3JvcFJpZ2h0IC0gbUNyb3BMZWZ0LAotICAgICAgICAgICAgICAgIG1Dcm9wQm90dG9tIC0gbUNyb3BUb3ApOworICAgICAgICAgICAgICAgIDAsIDAsIG1Dcm9wV2lkdGggLSAxLCBtQ3JvcEhlaWdodCAtIDEpOworICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOworCisgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKKyAgICAgICAgc2l6ZV90IGRzdF9jX3N0cmlkZSA9IEFMSUdOKGJ1Zi0+c3RyaWRlIC8gMiwgMTYpOworICAgICAgICBzaXplX3QgZHN0X2Nfc2l6ZSA9IGRzdF9jX3N0cmlkZSAqIGJ1Zi0+aGVpZ2h0IC8gMjsKKyAgICAgICAgdWludDhfdCAqZHN0X3YgPSBkc3RfeSArIGRzdF95X3NpemU7CisgICAgICAgIHVpbnQ4X3QgKmRzdF91ID0gZHN0X3YgKyBkc3RfY19zaXplOworCisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdF95LCBzcmNfeSwgbUNyb3BXaWR0aCk7CisKKyAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdF91LCBzcmNfdSwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOworICAgICAgICAgICAgbWVtY3B5KGRzdF92LCBzcmNfdiwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOworCisgICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKKyAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIENIRUNLX0VRKG1Db2xvckZvcm1hdCwgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdXYgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogKG1IZWlnaHQgLSBtQ3JvcFRvcCAvIDIpOworCisgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CisKKyAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OworICAgICAgICBzaXplX3QgZHN0X2Nfc3RyaWRlID0gQUxJR04oYnVmLT5zdHJpZGUgLyAyLCAxNik7CisgICAgICAgIHNpemVfdCBkc3RfY19zaXplID0gZHN0X2Nfc3RyaWRlICogYnVmLT5oZWlnaHQgLyAyOworICAgICAgICB1aW50OF90ICpkc3RfdiA9IGRzdF95ICsgZHN0X3lfc2l6ZTsKKyAgICAgICAgdWludDhfdCAqZHN0X3UgPSBkc3RfdiArIGRzdF9jX3NpemU7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0X3ksIHNyY195LCBtQ3JvcFdpZHRoKTsKKworICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgICAgICBzaXplX3QgdG1wID0gKG1Dcm9wV2lkdGggKyAxKSAvIDI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHRtcDsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBzcmNfdXZbMiAqIHhdOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gc3JjX3V2WzIgKiB4ICsgMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY191diArPSBtV2lkdGg7CisgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CisgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCBiNzA4N2Y4Li5hNWIzMTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTMzLDE4ICszMywzMCBAQAogc3RydWN0IEFMb29wZXI6Okxvb3BlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewogICAgIExvb3BlclRocmVhZChBTG9vcGVyICpsb29wZXIsIGJvb2wgY2FuQ2FsbEphdmEpCiAgICAgICAgIDogVGhyZWFkKGNhbkNhbGxKYXZhKSwKLSAgICAgICAgICBtTG9vcGVyKGxvb3BlcikgeworICAgICAgICAgIG1Mb29wZXIobG9vcGVyKSwKKyAgICAgICAgICBtVGhyZWFkSWQoTlVMTCkgeworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZHlUb1J1bigpIHsKKyAgICAgICAgbVRocmVhZElkID0gYW5kcm9pZEdldFRocmVhZElkKCk7CisKKyAgICAgICAgcmV0dXJuIFRocmVhZDo6cmVhZHlUb1J1bigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgewogICAgICAgICByZXR1cm4gbUxvb3Blci0+bG9vcCgpOwogICAgIH0KIAorICAgIGJvb2wgaXNDdXJyZW50VGhyZWFkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRocmVhZElkID09IGFuZHJvaWRHZXRUaHJlYWRJZCgpOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkxvb3BlclRocmVhZCgpIHt9CiAKIHByaXZhdGU6CiAgICAgQUxvb3BlciAqbUxvb3BlcjsKKyAgICBhbmRyb2lkX3RocmVhZF9pZF90IG1UaHJlYWRJZDsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvb3BlclRocmVhZCk7CiB9OwpAQCAtMTM2LDcgKzE0OCw5IEBACiAKICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgaWYgKCFydW5uaW5nTG9jYWxseSkgeworICAgIGlmICghcnVubmluZ0xvY2FsbHkgJiYgIXRocmVhZC0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gSWYgbm90IHJ1bm5pbmcgbG9jYWxseSBhbmQgdGhpcyB0aHJlYWQgX2lzXyB0aGUgbG9vcGVyIHRocmVhZCwKKyAgICAgICAgLy8gdGhlIGxvb3AoKSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbmQgbmV2ZXIgYmUgY2FsbGVkIGFnYWluLgogICAgICAgICB0aHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgIH0KIApAQCAtMTk3LDYgKzIxMSwxMSBAQAogCiAgICAgZ0xvb3BlclJvc3Rlci5kZWxpdmVyTWVzc2FnZShldmVudC5tTWVzc2FnZSk7CiAKKyAgICAvLyBOT1RFOiBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgYXQgdGhpcyBwb2ludCBvdXIgIkFMb29wZXIiIG9iamVjdAorICAgIC8vIG1heSBubyBsb25nZXIgZXhpc3QgKGl0cyBmaW5hbCByZWZlcmVuY2UgbWF5IGhhdmUgZ29uZSBhd2F5IHdoaWxlCisgICAgLy8gZGVsaXZlcmluZyB0aGUgbWVzc2FnZSkuIFdlIGhhdmUgbWFkZSBzdXJlLCBob3dldmVyLCB0aGF0IGxvb3AoKQorICAgIC8vIHdvbid0IGJlIGNhbGxlZCBhZ2Fpbi4KKwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKaW5kZXggNGUwN2Y2Zi4uZDUwMjVhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsNiBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFOj0gZmFsc2UKKwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggZjBjZDZhMC4uZjY3Y2RhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCiAKICNpbmNsdWRlICJpbmNsdWRlL00zVVBhcnNlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC0zNiwxOCArMzYsMTkgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtNYXhQbGF5bGlzdEFnZVVzID0gMTUwMDAwMDBsbDsKLQotTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKHVpbnQzMl90IGZsYWdzKQorTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKHVpbnQzMl90IGZsYWdzLCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCiAgICAgOiBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgIG1VSUQodWlkKSwKICAgICAgIG1EYXRhU291cmNlKG5ldyBMaXZlRGF0YVNvdXJjZSksCiAgICAgICBtSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgIG5ldyBOdUhUVFBEYXRhU291cmNlKAorICAgICAgICAgICAgICBIVFRQQmFzZTo6Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKQotICAgICAgICAgICAgICAgICAgICA/IE51SFRUUERhdGFTb3VyY2U6OmtGbGFnSW5jb2duaXRvCisgICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCiAgICAgICAgICAgICAgICAgICAgIDogMCkpLAogICAgICAgbVByZXZCYW5kd2lkdGhJbmRleCgtMSksCiAgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMoLTEpLApAQCAtNTcsNyArNTgsMTEgQEAKICAgICAgIG1EdXJhdGlvblVzKC0xKSwKICAgICAgIG1TZWVrRG9uZShmYWxzZSksCiAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcoZmFsc2UpLAotICAgICAgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb24oMCkgeworICAgICAgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtUmVmcmVzaFN0YXRlKElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVkpIHsKKyAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0VUlEKG1VSUQpOworICAgIH0KIH0KIAogTGl2ZVNlc3Npb246On5MaXZlU2Vzc2lvbigpIHsKQEAgLTY3LDkgKzcyLDE3IEBACiAgICAgcmV0dXJuIG1EYXRhU291cmNlOwogfQogCi12b2lkIExpdmVTZXNzaW9uOjpjb25uZWN0KGNvbnN0IGNoYXIgKnVybCkgewordm9pZCBMaXZlU2Vzc2lvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25uZWN0LCBpZCgpKTsKICAgICBtc2ctPnNldFN0cmluZygidXJsIiwgdXJsKTsKKworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKAorICAgICAgICAgICAgICAgICJoZWFkZXJzIiwKKyAgICAgICAgICAgICAgICBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4oKmhlYWRlcnMpKTsKKyAgICB9CisKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMTQ0LDYgKzE1NywxNiBAQAogICAgIEFTdHJpbmcgdXJsOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJsIiwgJnVybCkpOwogCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOworICAgIGlmICghbXNnLT5maW5kUG9pbnRlcigiaGVhZGVycyIsICh2b2lkICoqKSZoZWFkZXJzKSkgeworICAgICAgICBtRXh0cmFIZWFkZXJzLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUV4dHJhSGVhZGVycyA9ICpoZWFkZXJzOworCisgICAgICAgIGRlbGV0ZSBoZWFkZXJzOworICAgICAgICBoZWFkZXJzID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKICAgICAgICAgTE9HSSgib25Db25uZWN0ICclcyciLCB1cmwuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTE1Miw3ICsxNzUsOCBAQAogCiAgICAgbU1hc3RlclVSTCA9IHVybDsKIAotICAgIHNwPE0zVVBhcnNlcj4gcGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpKTsKKyAgICBib29sIGR1bW15OworICAgIHNwPE0zVVBhcnNlcj4gcGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpLCAmZHVtbXkpOwogCiAgICAgaWYgKHBsYXlsaXN0ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAnJXMnLiIsIHVybC5jX3N0cigpKTsKQEAgLTIxMCw3ICsyMzQsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCgKKyAgICAgICAgICAgICAgICB1cmwsIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMjY1LDcgKzI5MCw5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zcDxNM1VQYXJzZXI+IExpdmVTZXNzaW9uOjpmZXRjaFBsYXlsaXN0KGNvbnN0IGNoYXIgKnVybCkgeworc3A8TTNVUGFyc2VyPiBMaXZlU2Vzc2lvbjo6ZmV0Y2hQbGF5bGlzdChjb25zdCBjaGFyICp1cmwsIGJvb2wgKnVuY2hhbmdlZCkgeworICAgICp1bmNoYW5nZWQgPSBmYWxzZTsKKwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBmZXRjaEZpbGUodXJsLCAmYnVmZmVyKTsKIApAQCAtMjczLDEwICszMDAsNDQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgLy8gTUQ1IGZ1bmN0aW9uYWxpdHkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc2ltdWxhdG9yLCB0cmVhdCBhbGwKKyAgICAvLyBwbGF5bGlzdHMgYXMgY2hhbmdlZC4KKworI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQorICAgIHVpbnQ4X3QgaGFzaFsxNl07CisKKyAgICBNRDVfQ1RYIG07CisgICAgTUQ1X0luaXQoJm0pOworICAgIE1ENV9VcGRhdGUoJm0sIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBNRDVfRmluYWwoaGFzaCwgJm0pOworCisgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMICYmICFtZW1jbXAoaGFzaCwgbVBsYXlsaXN0SGFzaCwgMTYpKSB7CisgICAgICAgIC8vIHBsYXlsaXN0IHVuY2hhbmdlZAorCisgICAgICAgIGlmIChtUmVmcmVzaFN0YXRlICE9IFRISVJEX1VOQ0hBTkdFRF9SRUxPQURfQVRURU1QVCkgeworICAgICAgICAgICAgbVJlZnJlc2hTdGF0ZSA9IChSZWZyZXNoU3RhdGUpKG1SZWZyZXNoU3RhdGUgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOworCisgICAgICAgIExPR1YoIlBsYXlsaXN0IHVuY2hhbmdlZCwgcmVmcmVzaCBzdGF0ZSBpcyBub3cgJWQiLAorICAgICAgICAgICAgIChpbnQpbVJlZnJlc2hTdGF0ZSk7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtY3B5KG1QbGF5bGlzdEhhc2gsIGhhc2gsIHNpemVvZihoYXNoKSk7CisKKyAgICBtUmVmcmVzaFN0YXRlID0gSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWTsKKyNlbmRpZgorCiAgICAgc3A8TTNVUGFyc2VyPiBwbGF5bGlzdCA9CiAgICAgICAgIG5ldyBNM1VQYXJzZXIodXJsLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCiAgICAgaWYgKHBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcGFyc2UgLm0zdTggcGxheWxpc3QiKTsKKwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTM1OCw2ICs0MTksNjMgQEAKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKK2Jvb2wgTGl2ZVNlc3Npb246OnRpbWVUb1JlZnJlc2hQbGF5bGlzdChpbnQ2NF90IG5vd1VzKSBjb25zdCB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIENIRUNLX0VRKChpbnQpbVJlZnJlc2hTdGF0ZSwgKGludClJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7CisgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOworCisgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworCisgICAgaW50NjRfdCBtaW5QbGF5bGlzdEFnZVVzOworCisgICAgc3dpdGNoIChtUmVmcmVzaFN0YXRlKSB7CisgICAgICAgIGNhc2UgSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWToKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IG4gPSBtUGxheWxpc3QtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChuIC0gMSwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJml0ZW1EdXJhdGlvblVzKSk7CisKKyAgICAgICAgICAgICAgICBtaW5QbGF5bGlzdEFnZVVzID0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGSVJTVF9VTkNIQU5HRURfUkVMT0FEX0FUVEVNUFQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1pblBsYXlsaXN0QWdlVXMgPSB0YXJnZXREdXJhdGlvblVzIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNPTkRfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBUOgorICAgICAgICB7CisgICAgICAgICAgICBtaW5QbGF5bGlzdEFnZVVzID0gKHRhcmdldER1cmF0aW9uVXMgKiAzKSAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgVEhJUkRfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBUOgorICAgICAgICB7CisgICAgICAgICAgICBtaW5QbGF5bGlzdEFnZVVzID0gdGFyZ2V0RHVyYXRpb25VcyAqIDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyArIG1pblBsYXlsaXN0QWdlVXMgPD0gbm93VXM7Cit9CisKIHZvaWQgTGl2ZVNlc3Npb246Om9uRG93bmxvYWROZXh0KCkgewogICAgIHNpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KCk7CiAKQEAgLTM2Niw4ICs0ODQsNyBAQAogCiAgICAgaWYgKG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyA8IDAKICAgICAgICAgICAgIHx8IChzc2l6ZV90KWJhbmR3aWR0aEluZGV4ICE9IG1QcmV2QmFuZHdpZHRoSW5kZXgKLSAgICAgICAgICAgIHx8ICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkKLSAgICAgICAgICAgICAgICAmJiBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMgKyBrTWF4UGxheWxpc3RBZ2VVcyA8PSBub3dVcykpIHsKKyAgICAgICAgICAgIHx8ICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgJiYgdGltZVRvUmVmcmVzaFBsYXlsaXN0KG5vd1VzKSkpIHsKICAgICAgICAgQVN0cmluZyB1cmw7CiAgICAgICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgdXJsID0gbUJhbmR3aWR0aEl0ZW1zLmVkaXRJdGVtQXQoYmFuZHdpZHRoSW5kZXgpLm1VUkk7CkBAIC0zNzcsMjMgKzQ5NCw0NCBAQAogCiAgICAgICAgIGJvb2wgZmlyc3RUaW1lID0gKG1QbGF5bGlzdCA9PSBOVUxMKTsKIAotICAgICAgICBtUGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpKTsKLSAgICAgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gbG9hZCBwbGF5bGlzdCBhdCB1cmwgJyVzJyIsIHVybC5jX3N0cigpKTsKLSAgICAgICAgICAgIG1EYXRhU291cmNlLT5xdWV1ZUVPUyhFUlJPUl9JTyk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICgoc3NpemVfdCliYW5kd2lkdGhJbmRleCAhPSBtUHJldkJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBzd2l0Y2ggYmFuZHdpZHRocywgZG8gbm90IHBheSBhbnkgaGVlZCB0byB3aGV0aGVyCisgICAgICAgICAgICAvLyBwbGF5bGlzdHMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lLi4uCisgICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgdW5jaGFuZ2VkOworICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gZmV0Y2hQbGF5bGlzdCh1cmwuY19zdHIoKSwgJnVuY2hhbmdlZCk7CisgICAgICAgIGlmIChwbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAodW5jaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugc3VjY2VlZGVkIGluIGZldGNoaW5nIHRoZSBwbGF5bGlzdCwgYnV0IGl0IHdhcworICAgICAgICAgICAgICAgIC8vIHVuY2hhbmdlZCBmcm9tIHRoZSBsYXN0IHRpbWUgd2UgdHJpZWQuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBsb2FkIHBsYXlsaXN0IGF0IHVybCAnJXMnIiwgdXJsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5xdWV1ZUVPUyhFUlJPUl9JTyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmlyc3RUaW1lKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOwotICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QtPmlzQ29tcGxldGUoKQotICAgICAgICAgICAgICAgICAgICB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikpIHsKKyAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkpIHsKICAgICAgICAgICAgICAgICBtRHVyYXRpb25VcyA9IC0xOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb25VcyA9IDEwMDAwMDBsbCAqIHRhcmdldER1cmF0aW9uICogbVBsYXlsaXN0LT5zaXplKCk7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXlsaXN0LT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzICs9IGl0ZW1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00MDYsMTggKzU0NCwzMSBAQAogICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwogICAgIH0KIAorICAgIGJvb2wgc2Vla0Rpc2NvbnRpbnVpdHkgPSBmYWxzZTsKICAgICBib29sIGV4cGxpY2l0RGlzY29udGludWl0eSA9IGZhbHNlOwogICAgIGJvb2wgYmFuZHdpZHRoQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKLSAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmCi0gICAgICAgICAgICAgICAgbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVTZWNzID0gKG1TZWVrVGltZVVzICsgNTAwMDAwbGwpIC8gMTAwMDAwMGxsOwotICAgICAgICAgICAgaW50NjRfdCBpbmRleCA9IHNlZWtUaW1lU2VjcyAvIHRhcmdldER1cmF0aW9uOworICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFVzID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CiAKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA8IHNlZ21lbnRTdGFydFVzICsgaXRlbUR1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VXMgKz0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OwogCiAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciAhPSBtU2VxTnVtYmVyKSB7CkBAIC00MzAsMTAgKzU4MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyByZXNldGluZyB0aGUgZGF0YSBzb3VyY2Ugd2lsbCBoYXZlIGhhZCB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gc2lkZSBlZmZlY3Qgb2YgZGlzY2FyZGluZyBhbnkgcHJldmlvdXNseSBxdWV1ZWQKICAgICAgICAgICAgICAgICAgICAgLy8gYmFuZHdpZHRoIGNoYW5nZSBkaXNjb250aW51aXR5LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgbmVlZCB0byB0cmVhdCB0aGVzZSBleHBsaWNpdAorICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgbmVlZCB0byB0cmVhdCB0aGVzZSBzZWVrCiAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2NvbnRpbnVpdGllcyBhcyBpbnZvbHZpbmcgYSBiYW5kd2lkdGggY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhleSBhcmVuJ3QgZGlyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNlZWtEaXNjb250aW51aXR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDQ3LDExICs1OTgsNyBAQAogICAgIH0KIAogICAgIGlmIChtU2VxTnVtYmVyIDwgMCkgewotICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCkgLyAyOwotICAgICAgICB9CisgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgfQogCiAgICAgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9CkBAIC00NzAsMjMgKzYxNywzMiBAQAogICAgICAgICAgICAgZ290byByaW5zZV9yZXBlYXQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpCi0gICAgICAgICAgICAgICAgJiYgbVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0Ci0gICAgICAgICAgICAgICAgJiYgbU51bVJldHJpZXMgPCBrTWF4TnVtUmV0cmllcykgeworICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmIG1OdW1SZXRyaWVzIDwga01heE51bVJldHJpZXMpIHsKICAgICAgICAgICAgICsrbU51bVJldHJpZXM7CiAKLSAgICAgICAgICAgIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyA9IC0xOwotICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZSgzMDAwMDAwbGwpOworICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICAgICAgICAgIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyA9IC0xOworICAgICAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoMzAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlJ3ZlIG1pc3NlZCB0aGUgYm9hdCwgbGV0J3Mgc3RhcnQgZnJvbSB0aGUgbG93ZXN0IHNlcXVlbmNlCisgICAgICAgICAgICAvLyBudW1iZXIgYXZhaWxhYmxlIGFuZCBzaWduYWwgYSBkaXNjb250aW51aXR5LgorCisgICAgICAgICAgICBMT0dJKCJXZSd2ZSBtaXNzZWQgdGhlIGJvYXQsIHJlc3RhcnRpbmcgcGxheWJhY2suIik7CisgICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSB0cnVlOworCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIHNlcXVlbmNlIG51bWJlciAlZCBpbiBwbGF5bGlzdCAiCisgICAgICAgICAgICAgICAgICIoY29udGFpbnMgJWQgLSAlZCkiLAorICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCisgICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMSk7CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlLT5xdWV1ZUVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCi0gICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIHNlcXVlbmNlIG51bWJlciAlZCBpbiBwbGF5bGlzdCAiCi0gICAgICAgICAgICAgIihjb250YWlucyAlZCAtICVkKSIsCi0gICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAotICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgbURhdGFTb3VyY2UtPnF1ZXVlRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbU51bVJldHJpZXMgPSAwOwpAQCAtNTU0LDE1ICs3MTAsMTcgQEAKICAgICAgICAgYmFuZHdpZHRoQ2hhbmdlZCA9IGZhbHNlOwogICAgIH0KIAotICAgIGlmIChleHBsaWNpdERpc2NvbnRpbnVpdHkgfHwgYmFuZHdpZHRoQ2hhbmdlZCkgeworICAgIGlmIChzZWVrRGlzY29udGludWl0eSB8fCBleHBsaWNpdERpc2NvbnRpbnVpdHkgfHwgYmFuZHdpZHRoQ2hhbmdlZCkgewogICAgICAgICAvLyBTaWduYWwgZGlzY29udGludWl0eS4KIAotICAgICAgICBMT0dJKCJxdWV1ZWluZyBkaXNjb250aW51aXR5IChleHBsaWNpdD0lZCwgYmFuZHdpZHRoQ2hhbmdlZD0lZCkiLAotICAgICAgICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSwgYmFuZHdpZHRoQ2hhbmdlZCk7CisgICAgICAgIExPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKHNlZWs9JWQsIGV4cGxpY2l0PSVkLCBiYW5kd2lkdGhDaGFuZ2VkPSVkKSIsCisgICAgICAgICAgICAgc2Vla0Rpc2NvbnRpbnVpdHksIGV4cGxpY2l0RGlzY29udGludWl0eSwgYmFuZHdpZHRoQ2hhbmdlZCk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wID0gbmV3IEFCdWZmZXIoMTg4KTsKICAgICAgICAgbWVtc2V0KHRtcC0+ZGF0YSgpLCAwLCB0bXAtPnNpemUoKSk7Ci0gICAgICAgIHRtcC0+ZGF0YSgpWzFdID0gYmFuZHdpZHRoQ2hhbmdlZDsKKworICAgICAgICAvLyBzaWduYWwgYSAnaGFyZCcgZGlzY29udGludWl0eSBmb3IgZXhwbGljaXQgb3IgYmFuZHdpZHRoQ2hhbmdlZC4KKyAgICAgICAgdG1wLT5kYXRhKClbMV0gPSAoZXhwbGljaXREaXNjb250aW51aXR5IHx8IGJhbmR3aWR0aENoYW5nZWQpID8gMSA6IDA7CiAKICAgICAgICAgbURhdGFTb3VyY2UtPnF1ZXVlQnVmZmVyKHRtcCk7CiAgICAgfQpAQCAtNjI1LDggKzc4MywyMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGtleSA9IG5ldyBBQnVmZmVyKDE2KTsKIAotICAgICAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBrZXlTb3VyY2UgPSBuZXcgTnVIVFRQRGF0YVNvdXJjZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0ga2V5U291cmNlLT5jb25uZWN0KGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgc3A8SFRUUEJhc2U+IGtleVNvdXJjZSA9CisgICAgICAgICAgICAgIEhUVFBCYXNlOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pCisgICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCisgICAgICAgICAgICAgICAgICAgIDogMCk7CisKKyAgICAgICAgaWYgKG1VSURWYWxpZCkgeworICAgICAgICAgICAga2V5U291cmNlLT5zZXRVSUQobVVJRCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAga2V5U291cmNlLT5jb25uZWN0KAorICAgICAgICAgICAgICAgICAgICBrZXlVUkkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOwogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggMmViMTgwYS4uOWRmOWY1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC02NCwxNCArNjQsMjEgQEAKIH0KIAogYm9vbCBNM1VQYXJzZXI6Oml0ZW1BdChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKnVyaSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgdXJpLT5jbGVhcigpOwotICAgIGlmIChtZXRhKSB7ICptZXRhID0gTlVMTDsgfQorICAgIGlmICh1cmkpIHsKKyAgICAgICAgdXJpLT5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtZXRhKSB7CisgICAgICAgICptZXRhID0gTlVMTDsKKyAgICB9CiAKICAgICBpZiAoaW5kZXggPj0gbUl0ZW1zLnNpemUoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgaWYgKHVyaSkgeworICAgICAgICAqdXJpID0gbUl0ZW1zLml0ZW1BdChpbmRleCkubVVSSTsKKyAgICB9CiAKICAgICBpZiAobWV0YSkgewogICAgICAgICAqbWV0YSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwpAQCAtOTksMjEgKzEwNiwzOCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBzaXplX3QgbiA9IHN0cmxlbihiYXNlVVJMKTsKLSAgICBpZiAoYmFzZVVSTFtuIC0gMV0gPT0gJy8nKSB7Ci0gICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7Ci0gICAgICAgIG91dC0+YXBwZW5kKHVybCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgaWYgKHVybFswXSA9PSAnLycpIHsKKyAgICAgICAgLy8gVVJMIGlzIGFuIGFic29sdXRlIHBhdGguCiAKLSAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKLSAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKKyAgICAgICAgY2hhciAqcHJvdG9jb2xFbmQgPSBzdHJzdHIoYmFzZVVSTCwgIi8vIikgKyAyOworICAgICAgICBjaGFyICpwYXRoU3RhcnQgPSBzdHJjaHIocHJvdG9jb2xFbmQsICcvJyk7CisKKyAgICAgICAgaWYgKHBhdGhTdGFydCAhPSBOVUxMKSB7CisgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHBhdGhTdGFydCAtIGJhc2VVUkwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKICAgICAgICAgfQogCi0gICAgICAgIG91dC0+YXBwZW5kKCIvIik7CiAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVVJMIGlzIGEgcmVsYXRpdmUgcGF0aAorCisgICAgICAgIHNpemVfdCBuID0gc3RybGVuKGJhc2VVUkwpOworICAgICAgICBpZiAoYmFzZVVSTFtuIC0gMV0gPT0gJy8nKSB7CisgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworCisgICAgICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgeworICAgICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LT5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBMT0dWKCJiYXNlOiclcycsIHVybDonJXMnID0+ICclcyciLCBiYXNlVVJMLCB1cmwsIG91dC0+Y19zdHIoKSk7CkBAIC0xNzksNyArMjAzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobUlzVmFyaWFudFBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlTWV0YURhdGEobGluZSwgJml0ZW1NZXRhLCAiZHVyYXRpb24iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1ldGFEYXRhRHVyYXRpb24obGluZSwgJml0ZW1NZXRhLCAiZHVyYXRpb25VcyIpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1ESVNDT05USU5VSVRZIikpIHsKICAgICAgICAgICAgICAgICBpZiAobUlzVmFyaWFudFBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0yMDMsOSArMjI3LDkgQEAKIAogICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgICAgICAgICBpZiAoIW1Jc1ZhcmlhbnRQbGF5bGlzdCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgZHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICAgICAgICAgICAgICBpZiAoaXRlbU1ldGEgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWl0ZW1NZXRhLT5maW5kSW50MzIoImR1cmF0aW9uIiwgJmR1cmF0aW9uU2VjcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjUyLDYgKzI3NiwzMCBAQAogfQogCiAvLyBzdGF0aWMKK3N0YXR1c190IE0zVVBhcnNlcjo6cGFyc2VNZXRhRGF0YUR1cmF0aW9uKAorICAgICAgICBjb25zdCBBU3RyaW5nICZsaW5lLCBzcDxBTWVzc2FnZT4gKm1ldGEsIGNvbnN0IGNoYXIgKmtleSkgeworICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKworICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBkb3VibGUgeDsKKyAgICBzdGF0dXNfdCBlcnIgPSBQYXJzZURvdWJsZShsaW5lLmNfc3RyKCkgKyBjb2xvblBvcyArIDEsICZ4KTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICB9CisgICAgKCptZXRhKS0+c2V0SW50NjQoa2V5LCAoaW50NjRfdCl4ICogMUU2KTsKKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCiBzdGF0dXNfdCBNM1VQYXJzZXI6OnBhcnNlU3RyZWFtSW5mKAogICAgICAgICBjb25zdCBBU3RyaW5nICZsaW5lLCBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7CkBAIC00MTIsNCArNDYwLDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvLyBzdGF0aWMKK3N0YXR1c190IE0zVVBhcnNlcjo6UGFyc2VEb3VibGUoY29uc3QgY2hhciAqcywgZG91YmxlICp4KSB7CisgICAgY2hhciAqZW5kOworICAgIGRvdWJsZSBkdmFsID0gc3RydG9kKHMsICZlbmQpOworCisgICAgaWYgKGVuZCA9PSBzIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnLCcpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnggPSBkdmFsOworCisgICAgcmV0dXJuIE9LOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVJUU1BDb250cm9sbGVyLmgKaW5kZXggY2U3ZmZlNS4uMmJkNWJlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BUlRTUENvbnRyb2xsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oCkBAIC0zMCw2ICszMCw4IEBACiBzdHJ1Y3QgQVJUU1BDb250cm9sbGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKICAgICBBUlRTUENvbnRyb2xsZXIoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3Blcik7CiAKKyAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOworCiAgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBjaGFyICp1cmwpOwogICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCkBAIC04MCw2ICs4Miw5IEBACiAgICAgc3A8TXlIYW5kbGVyPiBtSGFuZGxlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRTUENvbnRyb2xsZXI+ID4gbVJlZmxlY3RvcjsKIAorICAgIGJvb2wgbVVJRFZhbGlkOworICAgIHVpZF90IG1VSUQ7CisKICAgICB2b2lkICgqbVNlZWtEb25lQ2IpKHZvaWQgKik7CiAgICAgdm9pZCAqbVNlZWtEb25lQ29va2llOwogICAgIGludDY0X3QgbUxhc3RTZWVrQ29tcGxldGVkVGltZVVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVklFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZJRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZJRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFWSV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBBVklfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBVklFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIEFWSUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworCisgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BVklFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQVZJU291cmNlOworCisgICAgc3RydWN0IFNhbXBsZUluZm8geworICAgICAgICB1aW50MzJfdCBtT2Zmc2V0OworICAgICAgICBib29sIG1Jc0tleTsKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgICAgICBWZWN0b3I8U2FtcGxlSW5mbz4gbVNhbXBsZXM7CisgICAgICAgIHVpbnQzMl90IG1SYXRlOworICAgICAgICB1aW50MzJfdCBtU2NhbGU7CisKKyAgICAgICAgZW51bSBLaW5kIHsKKyAgICAgICAgICAgIEFVRElPLAorICAgICAgICAgICAgVklERU8sCisgICAgICAgICAgICBPVEhFUgorCisgICAgICAgIH0gbUtpbmQ7CisKKyAgICAgICAgc2l6ZV90IG1OdW1TeW5jU2FtcGxlczsKKyAgICAgICAgc2l6ZV90IG1UaHVtYm5haWxTYW1wbGVTaXplOworICAgICAgICBzc2l6ZV90IG1UaHVtYm5haWxTYW1wbGVJbmRleDsKKyAgICAgICAgc2l6ZV90IG1NYXhTYW1wbGVTaXplOworICAgIH07CisKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIFZlY3RvcjxUcmFjaz4gbVRyYWNrczsKKworICAgIG9mZjY0X3QgbU1vdmllT2Zmc2V0OworICAgIGJvb2wgbUZvdW5kSW5kZXg7CisgICAgYm9vbCBtT2Zmc2V0c0FyZUFic29sdXRlOworCisgICAgc3NpemVfdCBwYXJzZUNodW5rKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUsIGludCBkZXB0aCA9IDApOworICAgIHN0YXR1c190IHBhcnNlU3RyZWFtSGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VTdHJlYW1Gb3JtYXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUluZGV4KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBwYXJzZUhlYWRlcnMoKTsKKworICAgIHN0YXR1c190IGdldFNhbXBsZUluZm8oCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc2l6ZV90IHNhbXBsZUluZGV4LAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIGJvb2wgKmlzS2V5KTsKKworICAgIHN0YXR1c190IGdldFNhbXBsZUluZGV4QXRUaW1lKAorICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlLAorICAgICAgICAgICAgc2l6ZV90ICpzYW1wbGVJbmRleCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBhZGRNUEVHNENvZGVjU3BlY2lmaWNEYXRhKHNpemVfdCB0cmFja0luZGV4KTsKKworICAgIHN0YXRpYyBib29sIElzQ29ycmVjdENodW5rVHlwZSgKKyAgICAgICAgc3NpemVfdCB0cmFja0luZGV4LCBUcmFjazo6S2luZCBraW5kLCB1aW50MzJfdCBjaHVua1R5cGUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVZJRXh0cmFjdG9yKTsKK307CisKK2NsYXNzIFN0cmluZzg7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKK2Jvb2wgU25pZmZBVkkoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFWSV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggM2EyMWYyNS4uOTVmMmFlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBBV0VTT01FX1BMQVlFUl9IXwogCi0jaW5jbHVkZSAiTnVIVFRQRGF0YVNvdXJjZS5oIgorI2luY2x1ZGUgIkhUVFBCYXNlLmgiCiAjaW5jbHVkZSAiVGltZWRFdmVudFF1ZXVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtNDQsNiArNDQsNyBAQAogY2xhc3MgRHJtTWFuYWdlckNsaW5ldDsKIGNsYXNzIERlY3J5cHRIYW5kbGU7CiAKK2NsYXNzIFRpbWVkVGV4dFBsYXllcjsKIHN0cnVjdCBXVk1FeHRyYWN0b3I7CiAKIHN0cnVjdCBBd2Vzb21lUmVuZGVyZXIgOiBwdWJsaWMgUmVmQmFzZSB7CkBAIC02MSw2ICs2Miw3IEBACiAgICAgfkF3ZXNvbWVQbGF5ZXIoKTsKIAogICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOworICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLApAQCAtOTAsNTMgKzkyLDY3IEBACiAgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgc3RhdHVzX3QgZ2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25Vcyk7CiAKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKyAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKwogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7CiAKICAgICAvLyBUaGlzIGlzIGEgbWFzayBvZiBNZWRpYUV4dHJhY3Rvcjo6RmxhZ3MuCiAgICAgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKIAotICAgIHZvaWQgcG9zdEF1ZGlvRU9TKCk7CisgICAgdm9pZCBwb3N0QXVkaW9FT1MoaW50NjRfdCBkZWxheVVzID0gMGxsKTsKICAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwogCisgICAgc3RhdHVzX3Qgc2V0VGltZWRUZXh0VHJhY2tJbmRleChpbnQzMl90IGluZGV4KTsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IEF3ZXNvbWVFdmVudDsKICAgICBmcmllbmQgc3RydWN0IFByZXZpZXdQbGF5ZXI7CiAKICAgICBlbnVtIHsKLSAgICAgICAgUExBWUlORyAgICAgICAgICAgICA9IDEsCi0gICAgICAgIExPT1BJTkcgICAgICAgICAgICAgPSAyLAotICAgICAgICBGSVJTVF9GUkFNRSAgICAgICAgID0gNCwKLSAgICAgICAgUFJFUEFSSU5HICAgICAgICAgICA9IDgsCi0gICAgICAgIFBSRVBBUkVEICAgICAgICAgICAgPSAxNiwKLSAgICAgICAgQVRfRU9TICAgICAgICAgICAgICA9IDMyLAotICAgICAgICBQUkVQQVJFX0NBTkNFTExFRCAgID0gNjQsCi0gICAgICAgIENBQ0hFX1VOREVSUlVOICAgICAgPSAxMjgsCi0gICAgICAgIEFVRElPX0FUX0VPUyAgICAgICAgPSAyNTYsCi0gICAgICAgIFZJREVPX0FUX0VPUyAgICAgICAgPSA1MTIsCi0gICAgICAgIEFVVE9fTE9PUElORyAgICAgICAgPSAxMDI0LAorICAgICAgICBQTEFZSU5HICAgICAgICAgICAgID0gMHgwMSwKKyAgICAgICAgTE9PUElORyAgICAgICAgICAgICA9IDB4MDIsCisgICAgICAgIEZJUlNUX0ZSQU1FICAgICAgICAgPSAweDA0LAorICAgICAgICBQUkVQQVJJTkcgICAgICAgICAgID0gMHgwOCwKKyAgICAgICAgUFJFUEFSRUQgICAgICAgICAgICA9IDB4MTAsCisgICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAweDIwLAorICAgICAgICBQUkVQQVJFX0NBTkNFTExFRCAgID0gMHg0MCwKKyAgICAgICAgQ0FDSEVfVU5ERVJSVU4gICAgICA9IDB4ODAsCisgICAgICAgIEFVRElPX0FUX0VPUyAgICAgICAgPSAweDAxMDAsCisgICAgICAgIFZJREVPX0FUX0VPUyAgICAgICAgPSAweDAyMDAsCisgICAgICAgIEFVVE9fTE9PUElORyAgICAgICAgPSAweDA0MDAsCiAKICAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZyBidXQgYXJlIGN1cnJlbnRseSBidWZmZXJpbmcKICAgICAgICAgLy8gc3VmZmljaWVudCBkYXRhIHRvIGJlZ2luIHBsYXliYWNrIGFuZCBmaW5pc2ggdGhlIHByZXBhcmF0aW9uIHBoYXNlCiAgICAgICAgIC8vIGZvciBnb29kLgotICAgICAgICBQUkVQQVJJTkdfQ09OTkVDVEVEID0gMjA0OCwKKyAgICAgICAgUFJFUEFSSU5HX0NPTk5FQ1RFRCA9IDB4MDgwMCwKIAogICAgICAgICAvLyBXZSdyZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIHZpZGVvIGV2ZW50IHRvIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lCiAgICAgICAgIC8vIGFmdGVyIHRoZSBzZWVrcG9pbnQuCi0gICAgICAgIFNFRUtfUFJFVklFVyAgICAgICAgPSA0MDk2LAorICAgICAgICBTRUVLX1BSRVZJRVcgICAgICAgID0gMHgxMDAwLAogCi0gICAgICAgIEFVRElPX1JVTk5JTkcgICAgICAgPSA4MTkyLAotICAgICAgICBBVURJT1BMQVlFUl9TVEFSVEVEID0gMTYzODQsCisgICAgICAgIEFVRElPX1JVTk5JTkcgICAgICAgPSAweDIwMDAsCisgICAgICAgIEFVRElPUExBWUVSX1NUQVJURUQgPSAweDQwMDAsCiAKLSAgICAgICAgSU5DT0dOSVRPICAgICAgICAgICA9IDMyNzY4LAorICAgICAgICBJTkNPR05JVE8gICAgICAgICAgID0gMHg4MDAwLAorCisgICAgICAgIFRFWFRfUlVOTklORyAgICAgICAgPSAweDEwMDAwLAorICAgICAgICBURVhUUExBWUVSX1NUQVJURUQgID0gMHgyMDAwMCwKICAgICB9OwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICBNdXRleCBtTWlzY1N0YXRlTG9jazsKKyAgICBtdXRhYmxlIE11dGV4IG1TdGF0c0xvY2s7CiAKICAgICBPTVhDbGllbnQgbUNsaWVudDsKICAgICBUaW1lZEV2ZW50UXVldWUgbVF1ZXVlOwogICAgIGJvb2wgbVF1ZXVlU3RhcnRlZDsKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOwogCiAgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKQEAgLTE2NSw3ICsxODEsNiBAQAogCiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIHVpbnQzMl90IG1FeHRyYWN0b3JGbGFnczsKLSAgICB1aW50MzJfdCBtU2luY2VMYXN0RHJvcHBlZDsKIAogICAgIGludDY0X3QgbVRpbWVTb3VyY2VEZWx0YVVzOwogICAgIGludDY0X3QgbVZpZGVvVGltZVVzOwpAQCAtMjA1LDEzICsyMjAsMTMgQEAKICAgICB2b2lkIHBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzID0gLTEpOwogICAgIHZvaWQgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKICAgICB2b2lkIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChzdGF0dXNfdCBzdGF0dXMpOwotICAgIHZvaWQgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKCk7CisgICAgdm9pZCBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKTsKICAgICB2b2lkIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKICAgICBzdGF0dXNfdCBwbGF5X2woKTsKIAogICAgIE1lZGlhQnVmZmVyICptVmlkZW9CdWZmZXI7CiAKLSAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtQ29ubmVjdGluZ0RhdGFTb3VyY2U7CisgICAgc3A8SFRUUEJhc2U+IG1Db25uZWN0aW5nRGF0YVNvdXJjZTsKICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwpAQCAtMjE5LDcgKzIzNCwxMSBAQAogICAgIHNwPEFSVFNQQ29udHJvbGxlcj4gbUNvbm5lY3RpbmdSVFNQQ29udHJvbGxlcjsKIAogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworCisgICAgaW50NjRfdCBtTGFzdFZpZGVvVGltZVVzOworICAgIFRpbWVkVGV4dFBsYXllciAqbVRleHRQbGF5ZXI7CisgICAgbXV0YWJsZSBNdXRleCBtVGltZWRUZXh0TG9jazsKIAogICAgIHNwPFdWTUV4dHJhY3Rvcj4gbVdWTUV4dHJhY3RvcjsKIApAQCAtMjQ0LDYgKzI2Myw4IEBACiAgICAgdm9pZCBzZXRWaWRlb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKTsKICAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyKHVpbnQzMl90IGZsYWdzID0gMCk7CiAKKyAgICB2b2lkIGFkZFRleHRTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSk7CisKICAgICB2b2lkIG9uU3RyZWFtRG9uZSgpOwogCiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwKTsKQEAgLTI3MCw5ICsyOTEsNDEgQEAKICAgICB2b2lkIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKTsKICAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CiAKLSAgICBzdGF0dXNfdCBzdGFydEF1ZGlvUGxheWVyX2woKTsKKyAgICBzdGF0dXNfdCBzdGFydEF1ZGlvUGxheWVyX2woYm9vbCBzZW5kRXJyb3JOb3RpZmljYXRpb24gPSB0cnVlKTsKKyAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZV9sKCk7CisKKyAgICB2b2lkIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKKyAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwogCiAgICAgYm9vbCBpc1N0cmVhbWluZ0hUVFAoKSBjb25zdDsKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBlbnVtIEZsYWdNb2RlIHsKKyAgICAgICAgU0VULAorICAgICAgICBDTEVBUiwKKyAgICAgICAgQVNTSUdOCisgICAgfTsKKyAgICB2b2lkIG1vZGlmeUZsYWdzKHVuc2lnbmVkIHZhbHVlLCBGbGFnTW9kZSBtb2RlKTsKKworICAgIHN0cnVjdCBUcmFja1N0YXQgeworICAgICAgICBTdHJpbmc4IG1NSU1FOworICAgICAgICBTdHJpbmc4IG1EZWNvZGVyTmFtZTsKKyAgICB9OworCisgICAgLy8gcHJvdGVjdGVkIGJ5IG1TdGF0c0xvY2sKKyAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICBpbnQgbUZkOworICAgICAgICBTdHJpbmc4IG1VUkk7CisgICAgICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgICAgIHNzaXplX3QgbUF1ZGlvVHJhY2tJbmRleDsKKyAgICAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OworICAgICAgICBpbnQ2NF90IG1OdW1WaWRlb0ZyYW1lc0RlY29kZWQ7CisgICAgICAgIGludDY0X3QgbU51bVZpZGVvRnJhbWVzRHJvcHBlZDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKKyAgICAgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgVmVjdG9yPFRyYWNrU3RhdD4gbVRyYWNrczsKKyAgICB9IG1TdGF0czsKIAogICAgIEF3ZXNvbWVQbGF5ZXIoY29uc3QgQXdlc29tZVBsYXllciAmKTsKICAgICBBd2Vzb21lUGxheWVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZVBsYXllciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmODkxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXworCisjZGVmaW5lIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJIVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTZkRlbGVnYXRlOworCitzdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DaHJvbWl1bUhUVFBEYXRhU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBTZkRlbGVnYXRlOworCisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIERJU0NPTk5FQ1RFRCwKKyAgICAgICAgQ09OTkVDVElORywKKyAgICAgICAgQ09OTkVDVEVELAorICAgICAgICBSRUFESU5HLAorICAgICAgICBESVNDT05ORUNUSU5HCisgICAgfTsKKworICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBTdGF0ZSBtU3RhdGU7CisKKyAgICBTZkRlbGVnYXRlICptRGVsZWdhdGU7CisKKyAgICBBU3RyaW5nIG1VUkk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUhlYWRlcnM7CisKKyAgICBvZmY2NF90IG1DdXJyZW50T2Zmc2V0OworCisgICAgLy8gQW55IGNvbm5lY3Rpb24gZXJyb3Igb3IgdGhlIHJlc3VsdCBvZiBhIHJlYWQgb3BlcmF0aW9uCisgICAgLy8gKGZvciB0aGUgbGF0dHRlciB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgaWYgc3VjY2Vzc2Z1bCkuCisgICAgc3NpemVfdCBtSU9SZXN1bHQ7CisKKyAgICBpbnQ2NF90IG1Db250ZW50U2l6ZTsKKworICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOworCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpOworCisgICAgc3RhdHVzX3QgY29ubmVjdF9sKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICBzdGF0aWMgdm9pZCBJbml0aWF0ZVJlYWQoCisgICAgICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBpbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKKyAgICAgICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKTsKKworICAgIHZvaWQgb25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycik7CisgICAgdm9pZCBvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdENvbXBsZXRlKCk7CisKKyAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaAppbmRleCA5ODgxY2MxLi5iNGU0YWZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBtT3JpZ2luYWxFeHRyYWN0b3I7Ci0gICAgRGVjcnlwdEhhbmRsZSogbURlY3J5cHRIYW5kbGU7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCogbURybU1hbmFnZXJDbGllbnQ7CiAKICAgICBEUk1FeHRyYWN0b3IoY29uc3QgRFJNRXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWFmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSFRUUF9CQVNFX0hfCisKKyNkZWZpbmUgSFRUUF9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBIVFRQQmFzZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgLy8gRG9uJ3QgbG9nIGFueSBVUkxzLgorICAgICAgICBrRmxhZ0luY29nbml0byA9IDEKKyAgICB9OworCisgICAgSFRUUEJhc2UoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCisgICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKKworICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CisgICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyKGludCBzLCB1aWRfdCB1aWQpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKKyAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKKyAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKKyAgICBzaXplX3QgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKKyAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOworICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOworCisgICAgZW51bSB7CisgICAgICAgIGtNaW5CYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gMTAwMCwgICAvLyAxIHNlY29uZAorICAgICAgICBrTWF4QmFuZHdpZHRoQ29sbGVjdEZyZXFNcyA9IDYwMDAwLCAgLy8gb25lIG1pbnV0ZQorICAgIH07CisKKyAgICBpbnQ2NF90IG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVczsKKyAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKKyAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOworCisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSFRUUF9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBTdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUFN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWU2YTVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUFN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSFRUUF9TVFJFQU1fSF8KLQotI2RlZmluZSBIVFRQX1NUUkVBTV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEhUVFBTdHJlYW0gewotcHVibGljOgotICAgIEhUVFBTdHJlYW0oKTsKLSAgICB+SFRUUFN0cmVhbSgpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBjaGFyICpzZXJ2ZXIsIGludCBwb3J0ID0gLTEsIGJvb2wgaHR0cHMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwotCi0gICAgc3RhdHVzX3Qgc2VuZChjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBBc3N1bWVzIGRhdGEgaXMgYSAnXDAnIHRlcm1pbmF0ZWQgc3RyaW5nLgotICAgIHN0YXR1c190IHNlbmQoY29uc3QgY2hhciAqZGF0YSk7Ci0KLSAgICAvLyBSZWNlaXZlIHVwIHRvICJzaXplIiBieXRlcyBvZiBkYXRhLgotICAgIHNzaXplX3QgcmVjZWl2ZSh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCByZWNlaXZlX2hlYWRlcihpbnQgKmh0dHBfc3RhdHVzKTsKLQotICAgIC8vIFRoZSBoZWFkZXIga2V5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHN0YXR1cyBsaW5lLgotICAgIHN0YXRpYyBjb25zdCBjaGFyICprU3RhdHVzS2V5OwotCi0gICAgYm9vbCBmaW5kX2hlYWRlcl92YWx1ZSgKLSAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OwotCi0gICAgLy8gUGFzcyBhIG5lZ2F0aXZlIHZhbHVlIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQuCi0gICAgdm9pZCBzZXRSZWNlaXZlVGltZW91dChpbnQgc2Vjb25kcyk7Ci0KLSAgICAvLyBSZWNlaXZlIGEgbGluZSBvZiBkYXRhIHRlcm1pbmF0ZWQgYnkgQ1JMRiwgbGluZSB3aWxsIGJlICdcMCcgdGVybWluYXRlZAotICAgIC8vIF9leGNsdWRpbmdfIHRoZSB0ZXJtaWFudGluZyBDUkxGLgotICAgIHN0YXR1c190IHJlY2VpdmVfbGluZShjaGFyICpsaW5lLCBzaXplX3Qgc2l6ZSk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIFJFQURZLAotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQKLSAgICB9OwotCi0gICAgU3RhdGUgbVN0YXRlOwotICAgIE11dGV4IG1Mb2NrOwotICAgIGludCBtU29ja2V0OwotCi0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbUhlYWRlcnM7Ci0KLSAgICB2b2lkICptU1NMQ29udGV4dDsKLSAgICB2b2lkICptU1NMOwotCi0gICAgSFRUUFN0cmVhbShjb25zdCBIVFRQU3RyZWFtICYpOwotICAgIEhUVFBTdHJlYW0gJm9wZXJhdG9yPShjb25zdCBIVFRQU3RyZWFtICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBIVFRQX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU2Vzc2lvbi5oCmluZGV4IDNmZTVkNGUuLjExNmVkMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0xpdmVTZXNzaW9uLmgKQEAgLTIwLDI0ICsyMCwyOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IERhdGFTb3VyY2U7CiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwotc3RydWN0IE51SFRUUERhdGFTb3VyY2U7CitzdHJ1Y3QgSFRUUEJhc2U7CiAKIHN0cnVjdCBMaXZlU2Vzc2lvbiA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KICAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAogICAgIH07Ci0gICAgTGl2ZVNlc3Npb24odWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICBMaXZlU2Vzc2lvbih1aW50MzJfdCBmbGFncyA9IDAsIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwgdWlkX3QgdWlkID0gMCk7CiAKICAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CiAKLSAgICB2b2lkIGNvbm5lY3QoY29uc3QgY2hhciAqdXJsKTsKKyAgICB2b2lkIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOworCiAgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICAvLyBCbG9ja3MgdW50aWwgc2VlayBpcyBjb21wbGV0ZS4KQEAgLTU3LDggKzYyLDYgQEAKICAgICAgICAga01heE51bVJldHJpZXMgICAgICAgICA9IDUsCiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhQbGF5bGlzdEFnZVVzOwotCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29ubmVjdCAgICAgICAgPSAnY29ubicsCiAgICAgICAgIGtXaGF0RGlzY29ubmVjdCAgICAgPSAnZGlzYycsCkBAIC03MiwxMiArNzUsMTYgQEAKICAgICB9OwogCiAgICAgdWludDMyX3QgbUZsYWdzOworICAgIGJvb2wgbVVJRFZhbGlkOworICAgIHVpZF90IG1VSUQ7CiAKICAgICBzcDxMaXZlRGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAKLSAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtSFRUUERhdGFTb3VyY2U7CisgICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKIAogICAgIEFTdHJpbmcgbU1hc3RlclVSTDsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOworCiAgICAgVmVjdG9yPEJhbmR3aWR0aEl0ZW0+IG1CYW5kd2lkdGhJdGVtczsKIAogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPEFCdWZmZXI+ID4gbUFFU0tleUZvclVSSTsKQEAgLTk3LDYgKzEwNCwxNiBAQAogCiAgICAgaW50MzJfdCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbjsKIAorICAgIGVudW0gUmVmcmVzaFN0YXRlIHsKKyAgICAgICAgSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSwKKyAgICAgICAgRklSU1RfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBULAorICAgICAgICBTRUNPTkRfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBULAorICAgICAgICBUSElSRF9VTkNIQU5HRURfUkVMT0FEX0FUVEVNUFQKKyAgICB9OworICAgIFJlZnJlc2hTdGF0ZSBtUmVmcmVzaFN0YXRlOworCisgICAgdWludDhfdCBtUGxheWxpc3RIYXNoWzE2XTsKKwogICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uRGlzY29ubmVjdCgpOwogICAgIHZvaWQgb25Eb3dubG9hZE5leHQoKTsKQEAgLTEwNCw3ICsxMjEsNyBAQAogICAgIHZvaWQgb25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHN0YXR1c190IGZldGNoRmlsZShjb25zdCBjaGFyICp1cmwsIHNwPEFCdWZmZXI+ICpvdXQpOwotICAgIHNwPE0zVVBhcnNlcj4gZmV0Y2hQbGF5bGlzdChjb25zdCBjaGFyICp1cmwpOworICAgIHNwPE0zVVBhcnNlcj4gZmV0Y2hQbGF5bGlzdChjb25zdCBjaGFyICp1cmwsIGJvb2wgKnVuY2hhbmdlZCk7CiAgICAgc2l6ZV90IGdldEJhbmR3aWR0aEluZGV4KCk7CiAKICAgICBzdGF0dXNfdCBkZWNyeXB0QnVmZmVyKApAQCAtMTEyLDYgKzEyOSw4IEBACiAKICAgICB2b2lkIHBvc3RNb25pdG9yUXVldWUoaW50NjRfdCBkZWxheVVzID0gMCk7CiAKKyAgICBib29sIHRpbWVUb1JlZnJlc2hQbGF5bGlzdChpbnQ2NF90IG5vd1VzKSBjb25zdDsKKwogICAgIHN0YXRpYyBpbnQgU29ydEJ5QmFuZHdpZHRoKGNvbnN0IEJhbmR3aWR0aEl0ZW0gKiwgY29uc3QgQmFuZHdpZHRoSXRlbSAqKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpdmVTZXNzaW9uKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL00zVVBhcnNlci5oCmluZGV4IDYzODk1YjQuLjQ3ODU4MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NM1VQYXJzZXIuaApAQCAtNjMsNiArNjMsOSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZU1ldGFEYXRhKAogICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbGluZSwgc3A8QU1lc3NhZ2U+ICptZXRhLCBjb25zdCBjaGFyICprZXkpOwogCisgICAgc3RhdGljIHN0YXR1c190IHBhcnNlTWV0YURhdGFEdXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmxpbmUsIHNwPEFNZXNzYWdlPiAqbWV0YSwgY29uc3QgY2hhciAqa2V5KTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZVN0cmVhbUluZigKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmxpbmUsIHNwPEFNZXNzYWdlPiAqbWV0YSk7CiAKQEAgLTcwLDYgKzczLDcgQEAKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmxpbmUsIHNwPEFNZXNzYWdlPiAqbWV0YSwgY29uc3QgQVN0cmluZyAmYmFzZVVSSSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgUGFyc2VJbnQzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp4KTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgUGFyc2VEb3VibGUoY29uc3QgY2hhciAqcywgZG91YmxlICp4KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE0zVVBhcnNlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKaW5kZXggZWY3MWI4Zi4uYzgzZDllOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCkBAIC0zOSwxMSArMzksNiBAQAogCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKIAotICAgIHN0YXRpYyBib29sIGdldF9tcDNfZnJhbWVfc2l6ZSgKLSAgICAgICAgICAgIHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAotICAgICAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IE5VTEwsIGludCAqb3V0X2NoYW5uZWxzID0gTlVMTCwKLSAgICAgICAgICAgIGludCAqb3V0X2JpdHJhdGUgPSBOVUxMKTsKLQogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggMDRlOGE2YS4uZWFlNjJjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtNDAsNyArNDAsNiBAQAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKICAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCB2b2lkIHNldERybUZsYWcoYm9vbCBmbGFnKTsKICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pOwogCiBwcm90ZWN0ZWQ6CkBAIC01Nyw3ICs1Niw3IEBACiAgICAgfTsKIAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIGJvb2wgbUhhdmVNZXRhZGF0YTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbUhhc1ZpZGVvOwogCiAgICAgVHJhY2sgKm1GaXJzdFRyYWNrLCAqbUxhc3RUcmFjazsKQEAgLTkwLDYgKzg5LDggQEAKIAogICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpOwogCisgICAgVHJhY2sgKmZpbmRUcmFja0J5TWltZVByZWZpeChjb25zdCBjaGFyICptaW1lUHJlZml4KTsKKwogICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogICAgIE1QRUc0RXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggMDIyODA0Yy4uMjJiMjg1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw5ICszNywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKCk7Ci0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oRGVjcnlwdEhhbmRsZSAqKmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAgICAgc2l6ZV90IGNhY2hlZFNpemUoKTsKQEAgLTQ3LDYgKzUwLDEyIEBACiAKICAgICB2b2lkIHJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKIAorICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkIG9ubHkgaWYgdGhlCisgICAgLy8gZGF0YSBzb3VyY2UgaXMgSFRUUC1iYXNlZDsgb3RoZXJ3aXNlLCBFUlJPUl9VTlNVUFBPUlRFRAorICAgIC8vIGlzIHJldHVybmVkLgorICAgIHN0YXR1c190IGdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2Jwcyk7CisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVDYWNoZWRTb3VyY2UyKCk7CiAKQEAgLTY4LDYgKzc3LDEwIEBACiAgICAgICAgIGtXaGF0UmVhZCAgICAgICA9ICdyZWFkJywKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1SZXRyaWVzID0gMTAsCisgICAgfTsKKwogICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8TnVDYWNoZWRTb3VyY2UyPiA+IG1SZWZsZWN0b3I7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKQEAgLTg0LDYgKzk3LDggQEAKICAgICBib29sIG1GZXRjaGluZzsKICAgICBpbnQ2NF90IG1MYXN0RmV0Y2hUaW1lVXM7CiAKKyAgICBpbnQzMl90IG1OdW1SZXRyaWVzTGVmdDsKKwogICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25GZXRjaCgpOwogICAgIHZvaWQgb25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTkzLDcgKzEwOCw5IEBACiAgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpOwotICAgIHZvaWQgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQgPSBmYWxzZSk7CisKKyAgICB2b2lkIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgKKyAgICAgICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQgPSBmYWxzZSwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51Q2FjaGVkU291cmNlMik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2OTU2OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgTlVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiSFRUUFN0cmVhbS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBOdUhUVFBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotICAgIGVudW0gRmxhZ3MgewotICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCi0gICAgICAgIGtGbGFnSW5jb2duaXRvID0gMQotICAgIH07Ci0gICAgTnVIVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBiYW5kd2lkdGggY291bGQgc3VjY2Vzc2Z1bGx5IGJlIGVzdGltYXRlZCwKLSAgICAvLyBmYWxzZSBvdGhlcndpc2UuCi0gICAgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKLQotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogRHJtSW5pdGlhbGl6YXRpb24oKTsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5OdUhUVFBEYXRhU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIERJU0NPTk5FQ1RFRCwKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVECi0gICAgfTsKLQotICAgIHN0cnVjdCBCYW5kd2lkdGhFbnRyeSB7Ci0gICAgICAgIGludDY0X3QgbURlbGF5VXM7Ci0gICAgICAgIHNpemVfdCBtTnVtQnl0ZXM7Ci0gICAgfTsKLQotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotCi0gICAgU3RhdGUgbVN0YXRlOwotCi0gICAgU3RyaW5nOCBtSG9zdDsKLSAgICB1bnNpZ25lZCBtUG9ydDsKLSAgICBTdHJpbmc4IG1QYXRoOwotICAgIGJvb2wgbUhUVFBTOwotICAgIFN0cmluZzggbUhlYWRlcnM7Ci0gICAgU3RyaW5nOCBtVXJpOwotCi0gICAgSFRUUFN0cmVhbSBtSFRUUDsKLSAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgb2ZmNjRfdCBtQ29udGVudExlbmd0aDsKLSAgICBib29sIG1Db250ZW50TGVuZ3RoVmFsaWQ7Ci0gICAgYm9vbCBtSGFzQ2h1bmtlZFRyYW5zZmVyRW5jb2Rpbmc7Ci0KLSAgICAvLyBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIGN1cnJlbnQgY2h1bmsgYmVmb3JlIGFueSBzdWJzZXF1ZW50Ci0gICAgLy8gY2h1bmsgaGVhZGVyIChvciAtMSBpZiBubyBtb3JlIGNodW5rcykuCi0gICAgc3NpemVfdCBtQ2h1bmtEYXRhQnl0ZXNMZWZ0OwotCi0gICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7Ci0gICAgc2l6ZV90IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKLSAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKLQotICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOwotICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwotCi0gICAgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgU3RyaW5nOCAmaGVhZGVycywgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgICAgICAgICBib29sIGh0dHBzLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIC8vIFJlYWQgdXAgdG8gInNpemUiIGJ5dGVzIG9mIGRhdGEsIHJlc3BlY3QgdHJhbnNmZXIgZW5jb2RpbmcuCi0gICAgc3NpemVfdCBpbnRlcm5hbFJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwotICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBNYWtlRnVsbEhlYWRlcnMoCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqb3ZlcnJpZGVzLAotICAgICAgICAgICAgU3RyaW5nOCAqaGVhZGVycyk7Ci0KLSAgICBOdUhUVFBEYXRhU291cmNlKGNvbnN0IE51SFRUUERhdGFTb3VyY2UgJik7Ci0gICAgTnVIVFRQRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE51SFRUUERhdGFTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5VX0hUVFBfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCmluZGV4IGVjM2U1ZmEuLmQ1NGIxYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApAQCAtMTIxLDYgKzEyMSw3IEBACiAgICAgdmlydHVhbCB+T01YKCk7CiAKIHByaXZhdGU6CisgICAgc3RydWN0IENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZDsKICAgICBzdHJ1Y3QgQ2FsbGJhY2tEaXNwYXRjaGVyOwogCiAgICAgTXV0ZXggbUxvY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCBjYTI1NzhmLi4xY2NmNTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTEwOSw3ICsxMDksOSBAQAogICAgIHZvaWQgYWRkQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKTsKICAgICB2b2lkIGZyZWVBY3RpdmVCdWZmZXJzKCk7Ci0KKyAgICBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyMl9sKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAorICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CiAgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgT25FdmVudCgKICAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAogICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKaW5kZXggMmY5NWRlOS4uZjQ0ZTBhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCAqZGVjb2RpbmdUaW1lLAorICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKICAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwpOwogCiAgICAgZW51bSB7CkBAIC0xMDcsNiArMTA3LDEyIEBACiAgICAgdWludDMyX3QgbVRpbWVUb1NhbXBsZUNvdW50OwogICAgIHVpbnQzMl90ICptVGltZVRvU2FtcGxlOwogCisgICAgc3RydWN0IFNhbXBsZVRpbWVFbnRyeSB7CisgICAgICAgIHVpbnQzMl90IG1TYW1wbGVJbmRleDsKKyAgICAgICAgdWludDMyX3QgbUNvbXBvc2l0aW9uVGltZTsKKyAgICB9OworICAgIFNhbXBsZVRpbWVFbnRyeSAqbVNhbXBsZVRpbWVFbnRyaWVzOworCiAgICAgdWludDMyX3QgKm1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CiAgICAgc2l6ZV90IG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CiAKQEAgLTEzMCw2ICsxMzYsMTAgQEAKIAogICAgIHVpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCkgY29uc3Q7CiAKKyAgICBzdGF0aWMgaW50IENvbXBhcmVJbmNyZWFzaW5nVGltZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisKKyAgICB2b2lkIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7CisKICAgICBTYW1wbGVUYWJsZShjb25zdCBTYW1wbGVUYWJsZSAmKTsKICAgICBTYW1wbGVUYWJsZSAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZVRhYmxlICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjZDI3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfU09GVF9PTVhfQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgU0lNUExFX1NPRlRfT01YX0NPTVBPTkVOVF9IXworCisjaW5jbHVkZSAiU29mdE9NWENvbXBvbmVudC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CisKK3N0cnVjdCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IDogcHVibGljIFNvZnRPTVhDb21wb25lbnQgeworICAgIFNpbXBsZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVGb3JEZXN0cnVjdGlvbigpOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptSGVhZGVyOworICAgICAgICBib29sIG1Pd25lZEJ5VXM7CisgICAgfTsKKworICAgIHN0cnVjdCBQb3J0SW5mbyB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgbURlZjsKKyAgICAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJzOworICAgICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gbVF1ZXVlOworCisgICAgICAgIGVudW0geworICAgICAgICAgICAgTk9ORSwKKyAgICAgICAgICAgIERJU0FCTElORywKKyAgICAgICAgICAgIEVOQUJMSU5HLAorICAgICAgICB9IG1UcmFuc2l0aW9uOworICAgIH07CisKKyAgICB2b2lkIGFkZFBvcnQoY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAmZGVmKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmdldFBvcnRRdWV1ZShPTVhfVTMyIHBvcnRJbmRleCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCk7CisKKyAgICBQb3J0SW5mbyAqZWRpdFBvcnRJbmZvKE9NWF9VMzIgcG9ydEluZGV4KTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZW5kQ29tbWFuZCwKKyAgICAgICAga1doYXRFbXB0eVRoaXNCdWZmZXIsCisgICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIsCisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxTaW1wbGVTb2Z0T01YQ29tcG9uZW50PiA+IG1IYW5kbGVyOworCisgICAgT01YX1NUQVRFVFlQRSBtU3RhdGU7CisgICAgT01YX1NUQVRFVFlQRSBtVGFyZ2V0U3RhdGU7CisKKyAgICBWZWN0b3I8UG9ydEluZm8+IG1Qb3J0czsKKworICAgIGJvb2wgaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIGNvbnN0OworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNlbmRDb21tYW5kKAorICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSwgT01YX1BUUiBkYXRhKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHVzZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfVTMyIHNpemUsCisgICAgICAgICAgICBPTVhfVTggKnB0cik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX1UzMiBzaXplKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBmcmVlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbXB0eVRoaXNCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBmaWxsVGhpc0J1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFN0YXRlKE9NWF9TVEFURVRZUEUgKnN0YXRlKTsKKworICAgIHZvaWQgb25TZW5kQ29tbWFuZChPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfVTMyIHBhcmFtKTsKKyAgICB2b2lkIG9uQ2hhbmdlU3RhdGUoT01YX1NUQVRFVFlQRSBzdGF0ZSk7CisgICAgdm9pZCBvblBvcnRFbmFibGUoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlKTsKKyAgICB2b2lkIG9uUG9ydEZsdXNoKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIHNlbmRGbHVzaENvbXBsZXRlKTsKKworICAgIHZvaWQgY2hlY2tUcmFuc2l0aW9ucygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlU29mdE9NWENvbXBvbmVudCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNJTVBMRV9TT0ZUX09NWF9DT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwODYxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX09NWF9DT01QT05FTlRfSF8KKworI2RlZmluZSBTT0ZUX09NWF9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRPTVhDb21wb25lbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2b2lkIHNldExpYkhhbmRsZSh2b2lkICpsaWJIYW5kbGUpOworICAgIHZvaWQgKmxpYkhhbmRsZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVGb3JEZXN0cnVjdGlvbigpIHt9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0T01YQ29tcG9uZW50KCk7CisKKyAgICBjb25zdCBjaGFyICpuYW1lKCkgY29uc3Q7CisKKyAgICB2b2lkIG5vdGlmeSgKKyAgICAgICAgICAgIE9NWF9FVkVOVFRZUEUgZXZlbnQsCisgICAgICAgICAgICBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyLCBPTVhfUFRSIGRhdGEpOworCisgICAgdm9pZCBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcik7CisgICAgdm9pZCBub3RpZnlGaWxsQnVmZmVyRG9uZShPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZW5kQ29tbWFuZCgKKyAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHVzZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfVTMyIHNpemUsCisgICAgICAgICAgICBPTVhfVTggKnB0cik7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgYWxsb2NhdGVCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX1UzMiBzaXplKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBmcmVlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbXB0eVRoaXNCdWZmZXIoCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBmaWxsVGhpc0J1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFN0YXRlKE9NWF9TVEFURVRZUEUgKnN0YXRlKTsKKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1OYW1lOworICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKm1DYWxsYmFja3M7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgKm1Db21wb25lbnQ7CisKKyAgICB2b2lkICptTGliSGFuZGxlOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgU2VuZENvbW1hbmRXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwKKyAgICAgICAgICAgIE9NWF9VMzIgcGFyYW0sCisgICAgICAgICAgICBPTVhfUFRSIGRhdGEpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgR2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBTZXRQYXJhbWV0ZXJXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwKKyAgICAgICAgICAgIE9NWF9QVFIgcGFyYW1zKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEdldENvbmZpZ1dyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICAgICAgT01YX1BUUiBwYXJhbXMpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgU2V0Q29uZmlnV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBHZXRFeHRlbnNpb25JbmRleFdyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICppbmRleCk7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBVc2VCdWZmZXJXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgICAgIE9NWF9VOCAqcHRyKTsKKworICAgIHN0YXRpYyBPTVhfRVJST1JUWVBFIEFsbG9jYXRlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfVTMyIHNpemUpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgRnJlZUJ1ZmZlcldyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgRW1wdHlUaGlzQnVmZmVyV3JhcHBlcigKKyAgICAgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpOworCisgICAgc3RhdGljIE9NWF9FUlJPUlRZUEUgRmlsbFRoaXNCdWZmZXJXcmFwcGVyKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcik7CisKKyAgICBzdGF0aWMgT01YX0VSUk9SVFlQRSBHZXRTdGF0ZVdyYXBwZXIoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgICAgICBPTVhfU1RBVEVUWVBFICpzdGF0ZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0T01YQ29tcG9uZW50KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9PTVhfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDc4MDM3YjkuLjhmMmVhOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKICAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKICAgICBpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOworICAgIGludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDA3YjFlYzguLmIwMmVkMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMiw3ICszMiwxMCBAQAogICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKTsKICAgICB2aXJ0dWFsIH5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqdXJsKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCiAgICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RocmVhZGVkU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RocmVhZGVkU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzI5NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJlYWRlZFNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVEhSRUFERURfU09VUkNFX0hfCi0KLSNkZWZpbmUgVEhSRUFERURfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBUaHJlYWRlZFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgVGhyZWFkZWRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5UaHJlYWRlZFNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdERlY29kZU1vcmUgPSAnZGVjbycsCi0gICAgICAgIGtXaGF0U2VlayAgICAgICA9ICdzZWVrJywKLSAgICB9OwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8VGhyZWFkZWRTb3VyY2U+ID4gbVJlZmxlY3RvcjsKLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtUXVldWU7Ci0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotICAgIGJvb2wgbURlY29kZVBlbmRpbmc7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1TZWVrTW9kZTsKLQotICAgIHZvaWQgcG9zdERlY29kZU1vcmVfbCgpOwotICAgIHZvaWQgY2xlYXJRdWV1ZV9sKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUaHJlYWRlZFNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFRIUkVBREVEX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9YSU5HU2Vla2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAppbmRleCBkNWE0ODRlLi5lYzViZDliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaApAQCAtMzcsNyArMzcsNyBAQAogICAgIGludDMyX3QgbVNpemVCeXRlczsKIAogICAgIC8vIFRPQyBlbnRyaWVzIGluIFhJTkcgaGVhZGVyLiBTa2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgaXQncyBhbHdheXMgMC4KLSAgICBjaGFyIG1UYWJsZU9mQ29udGVudHNbOTldOworICAgIHVuc2lnbmVkIGNoYXIgbVRhYmxlT2ZDb250ZW50c1s5OV07CiAKICAgICBYSU5HU2Vla2VyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCmluZGV4IGFmZmY4MjQuLjE1Y2Q0ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaApAQCAtNTcsNiArNTcsMTYgQEAKICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKICAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKIAorLy8gR2l2ZW4gYW4gTVBFRzQgdmlkZW8gVk9MLWhlYWRlciBjaHVuayAoc3RhcnRpbmcgd2l0aCAweDAwIDB4MDAgMHgwMSAweDI/KQorLy8gcGFyc2UgaXQgYW5kIGZpbGwgaW4gZGltZW5zaW9ucywgcmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorYm9vbCBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKKworYm9vbCBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgIHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICBpbnQgKm91dF9zYW1wbGluZ19yYXRlID0gTlVMTCwgaW50ICpvdXRfY2hhbm5lbHMgPSBOVUxMLAorICAgICAgICBpbnQgKm91dF9iaXRyYXRlID0gTlVMTCwgaW50ICpvdXRfbnVtX3NhbXBsZXMgPSBOVUxMKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBVkNfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCA2NDI4MzVhLi5lMWI5OTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC02MCw3ICs2MCwxMCBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKnRvdGFsID0gLTE7CisgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHRvdGFsKSB7CkBAIC04NCw3ICs4Nyw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdHJ1Y3QgQmxvY2tJdGVyYXRvciB7Ci0gICAgQmxvY2tJdGVyYXRvcihta3ZwYXJzZXI6OlNlZ21lbnQgKnNlZ21lbnQsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pOworICAgIEJsb2NrSXRlcmF0b3IoTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSk7CiAKICAgICBib29sIGVvcygpIGNvbnN0OwogCkBAIC05NiwxMSArOTksMTQgQEAKICAgICBpbnQ2NF90IGJsb2NrVGltZVVzKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKKyAgICBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKIAotICAgIG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7CisgICAgY29uc3QgbWt2cGFyc2VyOjpDbHVzdGVyICptQ2x1c3RlcjsKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OworICAgIGxvbmcgbUJsb2NrRW50cnlJbmRleDsKKworICAgIHZvaWQgYWR2YW5jZV9sKCk7CiAKICAgICBCbG9ja0l0ZXJhdG9yKGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7CiAgICAgQmxvY2tJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7CkBAIC0xNTAsNyArMTU2LDcgQEAKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKICAgICAgIG1UcmFja0luZGV4KGluZGV4KSwKICAgICAgIG1UeXBlKE9USEVSKSwKLSAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci0+bVNlZ21lbnQsCisgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IuZ2V0KCksCiAgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0pLAogICAgICAgbU5BTFNpemVMZW4oMCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwpAQCAtMTk5LDExICsyMDUsMTIgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEJsb2NrSXRlcmF0b3I6OkJsb2NrSXRlcmF0b3IoCi0gICAgICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqc2VnbWVudCwgdW5zaWduZWQgbG9uZyB0cmFja051bSkKLSAgICA6IG1TZWdtZW50KHNlZ21lbnQpLAorICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKICAgICAgIG1DbHVzdGVyKE5VTEwpLAotICAgICAgbUJsb2NrRW50cnkoTlVMTCkgeworICAgICAgbUJsb2NrRW50cnkoTlVMTCksCisgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKICAgICByZXNldCgpOwogfQogCkBAIC0yMTIsNDUgKzIxOSwxMDAgQEAKIH0KIAogdm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlKCkgewotICAgIHdoaWxlICghZW9zKCkpIHsKLSAgICAgICAgaWYgKG1CbG9ja0VudHJ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1CbG9ja0VudHJ5ID0gbUNsdXN0ZXItPkdldE5leHQobUJsb2NrRW50cnkpOwotICAgICAgICB9IGVsc2UgaWYgKG1DbHVzdGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1DbHVzdGVyID0gbVNlZ21lbnQtPkdldE5leHQobUNsdXN0ZXIpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CisgICAgYWR2YW5jZV9sKCk7Cit9CiAKLSAgICAgICAgICAgIGlmIChlb3MoKSkgewordm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlX2woKSB7CisgICAgZm9yICg7OykgeworICAgICAgICBsb25nIHJlcyA9IG1DbHVzdGVyLT5HZXRFbnRyeShtQmxvY2tFbnRyeUluZGV4LCBtQmxvY2tFbnRyeSk7CisgICAgICAgIExPR1YoIkdldEVudHJ5IHJldHVybmVkICVsZCIsIHJlcyk7CisKKyAgICAgICAgbG9uZyBsb25nIHBvczsKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIHBhcnNlIHRoaXMgY2x1c3RlciBzb21lIG1vcmUKKworICAgICAgICAgICAgQ0hFQ0tfRVEocmVzLCBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMKTsKKworICAgICAgICAgICAgcmVzID0gbUNsdXN0ZXItPlBhcnNlKHBvcywgbGVuKTsKKyAgICAgICAgICAgIExPR1YoIlBhcnNlIHJldHVybmVkICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gSS9PIGVycm9yCisKKyAgICAgICAgICAgICAgICBMT0dFKCJDbHVzdGVyOjpQYXJzZSByZXR1cm5lZCByZXN1bHQgJWxkIiwgcmVzKTsKKworICAgICAgICAgICAgICAgIG1DbHVzdGVyID0gTlVMTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUJsb2NrRW50cnkgPSBtQ2x1c3Rlci0+R2V0Rmlyc3QoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBjbHVzdGVyCisKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbmV4dENsdXN0ZXI7CisgICAgICAgICAgICByZXMgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+UGFyc2VOZXh0KAorICAgICAgICAgICAgICAgICAgICBtQ2x1c3RlciwgbmV4dENsdXN0ZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIExPR1YoIlBhcnNlTmV4dCByZXR1cm5lZCAlbGQiLCByZXMpOworCisgICAgICAgICAgICBpZiAocmVzID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEVPRgorCisgICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19FUShyZXMsIDApOworICAgICAgICAgICAgQ0hFQ0sobmV4dENsdXN0ZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyghbmV4dENsdXN0ZXItPkVPUygpKTsKKworICAgICAgICAgICAgbUNsdXN0ZXIgPSBuZXh0Q2x1c3RlcjsKKworICAgICAgICAgICAgcmVzID0gbUNsdXN0ZXItPlBhcnNlKHBvcywgbGVuKTsKKyAgICAgICAgICAgIExPR1YoIlBhcnNlICgyKSByZXR1cm5lZCAlbGQiLCByZXMpOworICAgICAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKKworICAgICAgICAgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQmxvY2tFbnRyeSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgbUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgPT0gbVRyYWNrTnVtKSB7CisgICAgICAgIENIRUNLKG1CbG9ja0VudHJ5ICE9IE5VTEwpOworICAgICAgICBDSEVDSyhtQmxvY2tFbnRyeS0+R2V0QmxvY2soKSAhPSBOVUxMKTsKKyAgICAgICAgKyttQmxvY2tFbnRyeUluZGV4OworCisgICAgICAgIGlmIChtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSA9PSBtVHJhY2tOdW0pIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIEJsb2NrSXRlcmF0b3I6OnJlc2V0KCkgewotICAgIG1DbHVzdGVyID0gbVNlZ21lbnQtPkdldEZpcnN0KCk7Ci0gICAgbUJsb2NrRW50cnkgPSBtQ2x1c3Rlci0+R2V0Rmlyc3QoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV4dHJhY3Rvci0+bUxvY2spOwogCi0gICAgd2hpbGUgKCFlb3MoKSAmJiBibG9jaygpLT5HZXRUcmFja051bWJlcigpICE9IG1UcmFja051bSkgewotICAgICAgICBhZHZhbmNlKCk7Ci0gICAgfQorICAgIG1DbHVzdGVyID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgbUJsb2NrRW50cnkgPSBOVUxMOworICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOworCisgICAgZG8geworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9IHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pOwogfQogCiB2b2lkIEJsb2NrSXRlcmF0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgbUNsdXN0ZXIgPSBtU2VnbWVudC0+RmluZENsdXN0ZXIoc2Vla1RpbWVVcyAqIDEwMDBsbCk7Ci0gICAgbUJsb2NrRW50cnkgPSBtQ2x1c3RlciAhPSBOVUxMID8gbUNsdXN0ZXItPkdldEZpcnN0KCkgOiBOVUxMOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CiAKLSAgICB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB7Ci0gICAgICAgIGFkdmFuY2UoKTsKKyAgICBtQ2x1c3RlciA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5GaW5kQ2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKKyAgICBtQmxvY2tFbnRyeSA9IE5VTEw7CisgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGFkdmFuY2VfbCgpOwogICAgIH0KKyAgICB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKTsKIAogICAgIHdoaWxlICghZW9zKCkgJiYgIW1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5Jc0tleSgpKSB7Ci0gICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgYWR2YW5jZV9sKCk7CiAgICAgfQogfQogCkBAIC0yOTEsMTYgKzM1Myw2IEBACiAgICAgfQogfQogCi0jZGVmaW5lIEJBSUwoZXJyKSBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGJpZ2J1ZikgeyAgICAgICAgICAgXAotICAgICAgICAgICAgYmlnYnVmLT5yZWxlYXNlKCk7ICBcCi0gICAgICAgICAgICBiaWdidWYgPSBOVUxMOyAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlICgwKQotCiBzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgewogICAgIENIRUNLKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpOwogCkBAIC0zMTAsMTgxICszNjIsMzkgQEAKIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gbUJsb2NrSXRlci5ibG9jaygpOwogCi0gICAgc2l6ZV90IHNpemUgPSBibG9jay0+R2V0U2l6ZSgpOwogICAgIGludDY0X3QgdGltZVVzID0gbUJsb2NrSXRlci5ibG9ja1RpbWVVcygpOwotICAgIGludDMyX3QgaXNTeW5jID0gYmxvY2stPklzS2V5KCk7CiAKLSAgICBNZWRpYUJ1ZmZlciAqYmlnYnVmID0gbmV3IE1lZGlhQnVmZmVyKHNpemUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2stPkdldEZyYW1lQ291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKIAotICAgIGxvbmcgcmVzID0gYmxvY2stPlJlYWQoCi0gICAgICAgICAgICBtRXh0cmFjdG9yLT5tUmVhZGVyLCAodW5zaWduZWQgY2hhciAqKWJpZ2J1Zi0+ZGF0YSgpKTsKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWUubGVuKTsKKyAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBibG9jay0+SXNLZXkoKSk7CiAKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgYmlnYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJpZ2J1ZiA9IE5VTEw7CisgICAgICAgIGxvbmcgbiA9IGZyYW1lLlJlYWQobUV4dHJhY3Rvci0+bVJlYWRlciwgKHVuc2lnbmVkIGNoYXIgKiltYnVmLT5kYXRhKCkpOworICAgICAgICBpZiAobiAhPSAwKSB7CisgICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcy5jbGVhcigpOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBtUGVuZGluZ0ZyYW1lcy5wdXNoX2JhY2sobWJ1Zik7CiAgICAgfQogCiAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAKLSAgICBiaWdidWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICBiaWdidWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7Ci0KLSAgICB1bnNpZ25lZCBsYWNpbmcgPSAoYmxvY2stPkZsYWdzKCkgPj4gMSkgJiAzOwotCi0gICAgaWYgKGxhY2luZyA9PSAwKSB7Ci0gICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhiaWdidWYpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgTE9HVigibGFjaW5nID0gJXUsIHNpemUgPSAlZCIsIGxhY2luZywgc2l6ZSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiliaWdidWYtPmRhdGEoKTsKLSAgICAvLyBoZXhkdW1wKGRhdGEsIHNpemUpOwotCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBCQUlMKEVSUk9SX01BTEZPUk1FRCk7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbnVtRnJhbWVzID0gKHVuc2lnbmVkKWRhdGFbMF0gKyAxOwotICAgICsrZGF0YTsKLSAgICAtLXNpemU7Ci0KLSAgICBWZWN0b3I8dWludDY0X3Q+IGZyYW1lU2l6ZXM7Ci0KLSAgICBzd2l0Y2ggKGxhY2luZykgewotICAgICAgICBjYXNlIDE6ICAvLyBYaXBoCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRnJhbWVzIC0gMTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBieXRlOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQkFJTChFUlJPUl9NQUxGT1JNRUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgPSBkYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICArK2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIC0tc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgKz0gYnl0ZTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChieXRlID09IDB4ZmYpOwotCi0gICAgICAgICAgICAgICAgZnJhbWVTaXplcy5wdXNoKGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSAyOiAgLy8gZml4ZWQtc2l6ZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKHNpemUgJSBudW1GcmFtZXMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBCQUlMKEVSUk9SX01BTEZPUk1FRCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBzaXplIC8gbnVtRnJhbWVzOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GcmFtZXMgLSAxOyArK2kpIHsKLSAgICAgICAgICAgICAgICBmcmFtZVNpemVzLnB1c2goZnJhbWVTaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDM6ICAvLyBFQk1MCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IGxhc3RGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GcmFtZXMgLSAxOyArK2kpIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IGJ5dGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJBSUwoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZSA9IGRhdGFbMF07Ci0gICAgICAgICAgICAgICAgKytkYXRhOwotICAgICAgICAgICAgICAgIC0tc2l6ZTsKLQotICAgICAgICAgICAgICAgIHNpemVfdCBudW1MZWFkaW5nWmVyb2VzID0gY2x6KGJ5dGUpOwotCi0gICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVTaXplID0gYnl0ZSAmIH4oMHg4MCA+PiBudW1MZWFkaW5nWmVyb2VzKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG51bUxlYWRpbmdaZXJvZXM7ICsraikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCQUlMKEVSUk9SX01BTEZPUk1FRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSBmcmFtZVNpemUgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplIHw9IGRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICsrZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgLS1zaXplOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplcy5wdXNoKGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNoaWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDcgLSBudW1MZWFkaW5nWmVyb2VzICsgOCAqIG51bUxlYWRpbmdaZXJvZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClmcmFtZVNpemUgLSAoMWxsIDw8IChzaGlmdCAtIDEpKSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gbGFzdEZyYW1lU2l6ZSArIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZXMucHVzaChmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RGcmFtZVNpemUgPSBmcmFtZVNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLQotI2lmIDAKLSAgICBBU3RyaW5nIG91dDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lU2l6ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBvdXQuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIlbGx1IiwgZnJhbWVTaXplcy5pdGVtQXQoaSkpKTsKLSAgICB9Ci0gICAgTE9HVigic2l6ZXMgPSBbJXNdIiwgb3V0LmNfc3RyKCkpOwotI2VuZGlmCi0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lU2l6ZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgdWludDY0X3QgZnJhbWVTaXplID0gZnJhbWVTaXplcy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBmcmFtZVNpemUpIHsKLSAgICAgICAgICAgIEJBSUwoRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lU2l6ZSk7Ci0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKLSAgICAgICAgbWVtY3B5KG1idWYtPmRhdGEoKSwgZGF0YSwgZnJhbWVTaXplKTsKLSAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwotCi0gICAgICAgIGRhdGEgKz0gZnJhbWVTaXplOwotICAgICAgICBzaXplIC09IGZyYW1lU2l6ZTsKLSAgICB9Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gYmlnYnVmLT5yYW5nZV9sZW5ndGgoKSAtIHNpemU7Ci0gICAgYmlnYnVmLT5zZXRfcmFuZ2Uob2Zmc2V0LCBzaXplKTsKLQotICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhiaWdidWYpOwotCiAgICAgcmV0dXJuIE9LOwogfQogCi0jdW5kZWYgQkFJTAotCiBzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKQorICAgICAgICAgICAgJiYgIW1FeHRyYWN0b3ItPmlzTGl2ZVN0cmVhbWluZygpKSB7CiAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogICAgICAgICBtQmxvY2tJdGVyLnNlZWsoc2Vla1RpbWVVcyk7CiAgICAgfQpAQCAtNTg0LDYgKzQ5NCwxMyBAQAogICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZVJlYWRlcihtRGF0YVNvdXJjZSkpLAogICAgICAgbVNlZ21lbnQoTlVMTCksCiAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyhmYWxzZSkgeworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBtSXNMaXZlU3RyZWFtaW5nID0KKyAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCisgICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZworICAgICAgICAgICAgICAgIHwgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpKQorICAgICAgICAmJiBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0s7CisKICAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKICAgICBsb25nIGxvbmcgcG9zOwogICAgIGlmIChlYm1sSGVhZGVyLlBhcnNlKG1SZWFkZXIsIHBvcykgPCAwKSB7CkBAIC01OTgsNyArNTE1LDE2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXQgPSBtU2VnbWVudC0+TG9hZCgpOworICAgIGlmIChpc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7CisgICAgICAgIENIRUNLX0VRKHJldCwgMCk7CisKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgIENIRUNLX0VRKHJldCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWQoKTsKKyAgICB9CiAKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBkZWxldGUgbVNlZ21lbnQ7CkBAIC02MzUsNyArNTYxLDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscykgeworICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKKyAgICAgICAgICAgICYmICFpc0xpdmVTdHJlYW1pbmcoKSkgewogICAgICAgICBmaW5kVGh1bWJuYWlscygpOwogICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7CiAgICAgfQpAQCAtNjQzLDYgKzU3MCwxMCBAQAogICAgIHJldHVybiBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CiB9CiAKK2Jvb2wgTWF0cm9za2FFeHRyYWN0b3I6OmlzTGl2ZVN0cmVhbWluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzTGl2ZVN0cmVhbWluZzsKK30KKwogc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21BdWRpb1NwZWNpZmljSW5mbygKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCB2b2lkICphc2ksIHNpemVfdCBhc2lTaXplKSB7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKQEAgLTgwMCw3ICs3MzEsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIobVNlZ21lbnQsIGluZm8tPm1UcmFja051bSk7CisgICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCBpbmZvLT5tVHJhY2tOdW0pOwogICAgICAgICBpbnQzMl90IGkgPSAwOwogICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVcyA9IDA7CiAgICAgICAgIHNpemVfdCBtYXhCbG9ja1NpemUgPSAwOwpAQCAtODA4LDcgKzczOSwxMSBAQAogICAgICAgICAgICAgaWYgKGl0ZXIuYmxvY2soKS0+SXNLZXkoKSkgewogICAgICAgICAgICAgICAgICsraTsKIAotICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUgPSBpdGVyLmJsb2NrKCktPkdldFNpemUoKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXIuYmxvY2soKS0+R2V0RnJhbWVDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplICs9IGl0ZXIuYmxvY2soKS0+R2V0RnJhbWUoaSkubGVuOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGlmIChibG9ja1NpemUgPiBtYXhCbG9ja1NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4QmxvY2tTaXplID0gYmxvY2tTaXplOwogICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxUaW1lVXMgPSBpdGVyLmJsb2NrVGltZVVzKCk7CkBAIC04MjcsNiArNzYyLDE1IEBACiAgICAgcmV0dXJuIG1ldGE7CiB9CiAKK3VpbnQzMl90IE1hdHJvc2thRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB4ID0gQ0FOX1BBVVNFOworICAgIGlmICghaXNMaXZlU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgeCB8PSBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSzsKKyAgICB9CisKKyAgICByZXR1cm4geDsKK30KKwogYm9vbCBTbmlmZk1hdHJvc2thKAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAppbmRleCBmYTIwYjg0Li4zOGViZDYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgbWt2cGFyc2VyIHsKIHN0cnVjdCBTZWdtZW50OwpAQCAtNDUsMjYgKzQ2LDM0IEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWF0cm9za2FFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE1hdHJvc2thU291cmNlOworICAgIGZyaWVuZCBzdHJ1Y3QgQmxvY2tJdGVyYXRvcjsKIAogICAgIHN0cnVjdCBUcmFja0luZm8gewogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgRGF0YVNvdXJjZVJlYWRlciAqbVJlYWRlcjsKICAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OwogICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7CisgICAgYm9vbCBtSXNMaXZlU3RyZWFtaW5nOwogCiAgICAgdm9pZCBhZGRUcmFja3MoKTsKICAgICB2b2lkIGZpbmRUaHVtYm5haWxzKCk7CiAKKyAgICBib29sIGlzTGl2ZVN0cmVhbWluZygpIGNvbnN0OworCiAgICAgTWF0cm9za2FFeHRyYWN0b3IoY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7CiAgICAgTWF0cm9za2FFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggN2Q0YmM2ZS4uNWJiYzJiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4OwogCiBzdHJ1Y3QgQVRTUGFyc2VyOjpQcm9ncmFtIDogcHVibGljIFJlZkJhc2UgewotICAgIFByb2dyYW0oQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpOworICAgIFByb2dyYW0oQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpOwogCiAgICAgYm9vbCBwYXJzZVBJRCgKICAgICAgICAgICAgIHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKQEAgLTYzLDggKzYzLDE1IEBACiAgICAgICAgIHJldHVybiBtRmlyc3RQVFNWYWxpZDsKICAgICB9CiAKKyAgICB1bnNpZ25lZCBudW1iZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZ3JhbU51bWJlcjsgfQorCisgICAgdm9pZCB1cGRhdGVQcm9ncmFtTWFwUElEKHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpIHsKKyAgICAgICAgbVByb2dyYW1NYXBQSUQgPSBwcm9ncmFtTWFwUElEOworICAgIH0KKwogcHJpdmF0ZToKICAgICBBVFNQYXJzZXIgKm1QYXJzZXI7CisgICAgdW5zaWduZWQgbVByb2dyYW1OdW1iZXI7CiAgICAgdW5zaWduZWQgbVByb2dyYW1NYXBQSUQ7CiAgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFN0cmVhbT4gPiBtU3RyZWFtczsKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwpAQCAtMTA3LDcgKzExNCw3IEBACiAgICAgRGlzY29udGludWl0eVR5cGUgbVBlbmRpbmdEaXNjb250aW51aXR5OwogICAgIHNwPEFNZXNzYWdlPiBtUGVuZGluZ0Rpc2NvbnRpbnVpdHlFeHRyYTsKIAotICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSBtUXVldWU7CisgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlICptUXVldWU7CiAKICAgICB2b2lkIGZsdXNoKCk7CiAgICAgdm9pZCBwYXJzZVBFUyhBQml0UmVhZGVyICpicik7CkBAIC0xMjYsMTEgKzEzMywxNCBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1BVFNQYXJzZXI6OlByb2dyYW06OlByb2dyYW0oQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCitBVFNQYXJzZXI6OlByb2dyYW06OlByb2dyYW0oCisgICAgICAgIEFUU1BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCB1bnNpZ25lZCBwcm9ncmFtTWFwUElEKQogICAgIDogbVBhcnNlcihwYXJzZXIpLAorICAgICAgbVByb2dyYW1OdW1iZXIocHJvZ3JhbU51bWJlciksCiAgICAgICBtUHJvZ3JhbU1hcFBJRChwcm9ncmFtTWFwUElEKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSB7CisgICAgTE9HVigibmV3IHByb2dyYW0gbnVtYmVyICV1IiwgcHJvZ3JhbU51bWJlcik7CiB9CiAKIGJvb2wgQVRTUGFyc2VyOjpQcm9ncmFtOjpwYXJzZVBJRCgKQEAgLTI5OSw3ICszMDksNyBAQAogfQogCiBzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7Ci0gICAgc2l6ZV90IGluZGV4ID0gKHR5cGUgPT0gTVBFRzJBRFRTX0FVRElPKSA/IDAgOiAwOworICAgIHNpemVfdCBpbmRleCA9ICh0eXBlID09IEFVRElPKSA/IDAgOiAwOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVN0cmVhbXMuZWRpdFZhbHVlQXQoaSktPmdldFNvdXJjZSh0eXBlKTsKQEAgLTMzOCwxNCArMzQ4LDQzIEBACiAgICAgICBtQnVmZmVyKG5ldyBBQnVmZmVyKDE5MiAqIDEwMjQpKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtUGVuZGluZ0Rpc2NvbnRpbnVpdHkoRElTQ09OVElOVUlUWV9OT05FKSwKLSAgICAgIG1RdWV1ZShzdHJlYW1UeXBlID09IDB4MWIKLSAgICAgICAgICAgICAgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkgyNjQgOiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFBQykgeworICAgICAgbVF1ZXVlKE5VTEwpIHsKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKIAorICAgIHN3aXRjaCAobVN0cmVhbVR5cGUpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0gyNjQ6CisgICAgICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6SDI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FURFM6CisgICAgICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUFDKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzFfQVVESU86CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJTzoKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFR19BVURJTyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzFfVklERU86CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9WSURFTzoKKyAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFR19WSURFTyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzRfVklERU86CisgICAgICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1QRUc0X1ZJREVPKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKICAgICBMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4IiwgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSk7CiB9CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjp+U3RyZWFtKCkgeworICAgIGRlbGV0ZSBtUXVldWU7CisgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCkBAIC0zOTcsNyArNDM2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgYm9vbCBpc0FTZWVrID0gKHR5cGUgPT0gRElTQ09OVElOVUlUWV9TRUVLKTsKIAotICAgICAgICAgICAgbVF1ZXVlLmNsZWFyKCFpc0FTZWVrKTsKKyAgICAgICAgICAgIG1RdWV1ZS0+Y2xlYXIoIWlzQVNlZWspOwogCiAgICAgICAgICAgICB1aW50NjRfdCByZXN1bWVBdFBUUzsKICAgICAgICAgICAgIGlmIChleHRyYSAhPSBOVUxMCkBAIC00NDQsNiArNDgzLDEyIEBACiAKICAgICBMT0dWKCJwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCA9IDB4JTA4eCIsIHBhY2tldF9zdGFydGNvZGVfcHJlZml4KTsKIAorICAgIGlmIChwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCAhPSAxKSB7CisgICAgICAgIExPR1YoIlN1cHBvc2VkbHkgcGF5bG9hZF91bml0X3N0YXJ0PTEgdW5pdCBkb2VzIG5vdCBzdGFydCAiCisgICAgICAgICAgICAgIndpdGggc3RhcnRjb2RlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgQ0hFQ0tfRVEocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgsIDB4MDAwMDAxdSk7CiAKICAgICB1bnNpZ25lZCBzdHJlYW1faWQgPSBici0+Z2V0Qml0cyg4KTsKQEAgLTYxMSwyMiArNjU2LDI4IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTE9HVigib25QYXlsb2FkRGF0YSBtU3RyZWFtVHlwZT0weCUwMngiLCBtU3RyZWFtVHlwZSk7CiAKKyAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIENIRUNLKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpOwogICAgIGludDY0X3QgdGltZVVzID0gbVByb2dyYW0tPmNvbnZlcnRQVFNUb1RpbWVzdGFtcChQVFMpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbVF1ZXVlLmFwcGVuZERhdGEoZGF0YSwgc2l6ZSwgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUXVldWUtPmFwcGVuZERhdGEoZGF0YSwgc2l6ZSwgdGltZVVzKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgd2hpbGUgKChhY2Nlc3NVbml0ID0gbVF1ZXVlLmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKKyAgICB3aGlsZSAoKGFjY2Vzc1VuaXQgPSBtUXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KCkpICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUXVldWUuZ2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1RdWV1ZS0+Z2V0Rm9ybWF0KCk7CiAKICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJjcmVhdGVkIHNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJTdHJlYW0gUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCBub3cgaGFzIGRhdGEuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBtU3RyZWFtVHlwZSk7CisKICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CiAKICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdEaXNjb250aW51aXR5ICE9IERJU0NPTlRJTlVJVFlfTk9ORSkgewpAQCAtNjM4LDEzICs2ODksMTMgQEAKIAogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtUXVldWUuZ2V0Rm9ybWF0KCkgIT0gTlVMTCkgeworICAgICAgICB9IGVsc2UgaWYgKG1RdWV1ZS0+Z2V0Rm9ybWF0KCkgIT0gTlVMTCkgewogICAgICAgICAgICAgLy8gQWZ0ZXIgYSBkaXNjb250aW51aXR5IHdlIGludmFsaWRhdGUgdGhlIHF1ZXVlJ3MgZm9ybWF0CiAgICAgICAgICAgICAvLyBhbmQgd29uJ3QgZW5xdWV1ZSBhbnkgYWNjZXNzIHVuaXRzIHRvIHRoZSBzb3VyY2UgdW50aWwKICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBoYXMgcmVlc3RhYmxpc2hlZCB0aGUgbmV3IGZvcm1hdC4KIAogICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zZXRGb3JtYXQobVF1ZXVlLmdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5zZXRGb3JtYXQobVF1ZXVlLT5nZXRGb3JtYXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KQEAgLTY1Miw5ICs3MDMsMzAgQEAKIH0KIAogc3A8TWVkaWFTb3VyY2U+IEFUU1BhcnNlcjo6U3RyZWFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7Ci0gICAgaWYgKCh0eXBlID09IEFWQ19WSURFTyAmJiBtU3RyZWFtVHlwZSA9PSAweDFiKQotICAgICAgICB8fCAodHlwZSA9PSBNUEVHMkFEVFNfQVVESU8gJiYgbVN0cmVhbVR5cGUgPT0gMHgwZikpIHsKLSAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVklERU86CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX0gyNjQKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NUEVHMV9WSURFTworICAgICAgICAgICAgICAgICAgICB8fCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX01QRUcyX1ZJREVPCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfTVBFRzRfVklERU8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBVURJTzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfTVBFRzFfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0cmVhbVR5cGUgPT0gU1RSRUFNVFlQRV9NUEVHMl9BVURJTworICAgICAgICAgICAgICAgICAgICB8fCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FURFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHJldHVybiBOVUxMOwpAQCAtNzI5LDcgKzgwMSwyMSBAQAogCiAgICAgICAgICAgICBMT0dWKCIgICAgcHJvZ3JhbV9tYXBfUElEID0gMHglMDR4IiwgcHJvZ3JhbU1hcFBJRCk7CiAKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXNoKG5ldyBQcm9ncmFtKHRoaXMsIHByb2dyYW1NYXBQSUQpKTsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtUHJvZ3JhbXMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8UHJvZ3JhbT4gJnByb2dyYW0gPSBtUHJvZ3JhbXMuaXRlbUF0KGluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLT5udW1iZXIoKSA9PSBwcm9ncmFtX251bWJlcikgeworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLT51cGRhdGVQcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2dyYW0odGhpcywgcHJvZ3JhbV9udW1iZXIsIHByb2dyYW1NYXBQSUQpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtODA1LDggKzg5MSwxNiBAQAogfQogCiBzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CisgICAgaW50IHdoaWNoID0gLTE7ICAvLyBhbnkKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtUHJvZ3JhbXMuZWRpdEl0ZW1BdChpKS0+Z2V0U291cmNlKHR5cGUpOworICAgICAgICBjb25zdCBzcDxQcm9ncmFtPiAmcHJvZ3JhbSA9IG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmICh3aGljaCA+PSAwICYmIChpbnQpcHJvZ3JhbS0+bnVtYmVyKCkgIT0gd2hpY2gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IHByb2dyYW0tPmdldFNvdXJjZSh0eXBlKTsKIAogICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCAzOTM2ZjA1Li4xZTY0NTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTQ4LDggKzQ4LDggQEAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CiAKICAgICBlbnVtIFNvdXJjZVR5cGUgewotICAgICAgICBBVkNfVklERU8sCi0gICAgICAgIE1QRUcyQURUU19BVURJTworICAgICAgICBWSURFTywKKyAgICAgICAgQVVESU8KICAgICB9OwogICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKIApAQCAtNTksNiArNTksMTcgQEAKICAgICB2aXJ0dWFsIH5BVFNQYXJzZXIoKTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRnJvbSBJU08vSUVDIDEzODE4LTE6IDIwMDAgKEUpLCBUYWJsZSAyLTI5CisgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfVklERU8gICAgICAgICAgPSAweDAxLAorICAgICAgICBTVFJFQU1UWVBFX01QRUcyX1ZJREVPICAgICAgICAgID0gMHgwMiwKKyAgICAgICAgU1RSRUFNVFlQRV9NUEVHMV9BVURJTyAgICAgICAgICA9IDB4MDMsCisgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU8gICAgICAgICAgPSAweDA0LAorICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FURFMgICAgID0gMHgwZiwKKyAgICAgICAgU1RSRUFNVFlQRV9NUEVHNF9WSURFTyAgICAgICAgICA9IDB4MTAsCisgICAgICAgIFNUUkVBTVRZUEVfSDI2NCAgICAgICAgICAgICAgICAgPSAweDFiLAorICAgIH07CisKICAgICBzdHJ1Y3QgUHJvZ3JhbTsKICAgICBzdHJ1Y3QgU3RyZWFtOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCBkY2FmOWY3Li5mOGExZDg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKQEAgLTc5LDExICs4MCw0OSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkTVBFR0F1ZGlvSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBkYXRhIHRvIHZlcmlmeSBoZWFkZXIuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocHRyWzBdICE9IDB4ZmYgfHwgKHB0clsxXSA+PiA1KSAhPSAweDA3KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBJRCA9IChwdHJbMV0gPj4gMykgJiAzOworCisgICAgaWYgKElEID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gcmVzZXJ2ZWQKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsYXllciA9IChwdHJbMV0gPj4gMSkgJiAzOworCisgICAgaWYgKGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gcmVzZXJ2ZWQKKyAgICB9CisKKyAgICB1bnNpZ25lZCBiaXRyYXRlSW5kZXggPSAocHRyWzJdID4+IDQpOworCisgICAgaWYgKGJpdHJhdGVJbmRleCA9PSAweDBmKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHJlc2VydmVkCisgICAgfQorCisgICAgdW5zaWduZWQgc2FtcGxpbmdSYXRlSW5kZXggPSAocHRyWzJdID4+IDIpICYgMzsKKworICAgIGlmIChzYW1wbGluZ1JhdGVJbmRleCA9PSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHJlc2VydmVkCisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6YXBwZW5kRGF0YSgKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZVVzKSB7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewogICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEgyNjQ6CisgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICB7CiAjaWYgMAogICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNCB8fCBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBkYXRhLCA0KSkgewpAQCAtMTA1LDcgKzE0NCw0MCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gSC4yNjQgc3luY3dvcmQgYXQgIgorICAgICAgICAgICAgICAgICAgICBMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NC9NUEVHIHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTVBFRzRfVklERU86CisgICAgICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMyB8fCBtZW1jbXAoIlx4MDBceDAwXHgwMSIsIGRhdGEsIDMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gLTE7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgKyAyIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWVtY21wKCJceDAwXHgwMFx4MDEiLCAmcHRyW2ldLCAzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NC9NUEVHIHN5bmN3b3JkIGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICVsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0OCw2ICsyMjAsMzMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNUEVHX0FVRElPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZE1QRUdBdWRpb0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gTVBFRyBhdWRpbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmN3b3JkIGF0IG9mZnNldCAlbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhID0gJnB0cltzdGFydE9mZnNldF07CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBzdGFydE9mZnNldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTkwLDExICsyODksMTggQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAobU1vZGUgPT0gSDI2NCkgewotICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1Nb2RlLCAodW5zaWduZWQpQUFDKTsKLSAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUFDKCk7CisgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICBjYXNlIEgyNjQ6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CisgICAgICAgIGNhc2UgQUFDOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUFDKCk7CisgICAgICAgIGNhc2UgTVBFR19WSURFTzoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOworICAgICAgICBjYXNlIE1QRUc0X1ZJREVPOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1Nb2RlLCAodW5zaWduZWQpTVBFR19BVURJTyk7CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICB9CiB9CiAKQEAgLTQ1NSw0ICs1NjEsMzcxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKKworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBoZWFkZXIgPSBVMzJfQVQoZGF0YSk7CisKKyAgICBzaXplX3QgZnJhbWVTaXplOworICAgIGludCBzYW1wbGluZ1JhdGUsIG51bUNoYW5uZWxzLCBiaXRyYXRlLCBudW1TYW1wbGVzOworICAgIENIRUNLKEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZVNpemUsICZzYW1wbGluZ1JhdGUsICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAmYml0cmF0ZSwgJm51bVNhbXBsZXMpKTsKKworICAgIGlmIChzaXplIDwgZnJhbWVTaXplKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihmcmFtZVNpemUpOworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGRhdGEsIGZyYW1lU2l6ZSk7CisKKyAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIGZyYW1lU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBmcmFtZVNpemUpOworCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChmcmFtZVNpemUpOworICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICB9CisKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKworc3RhdGljIHZvaWQgRW5jb2RlU2l6ZTE0KHVpbnQ4X3QgKipfcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLX0xFKHNpemUsIDB4M2ZmZik7CisKKyAgICB1aW50OF90ICpwdHIgPSAqX3B0cjsKKworICAgICpwdHIrKyA9IDB4ODAgfCAoc2l6ZSA+PiA3KTsKKyAgICAqcHRyKysgPSBzaXplICYgMHg3ZjsKKworICAgICpfcHRyID0gcHRyOworfQorCitzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZU1QRUdWaWRlb0VTRFMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNzZCkgeworICAgIHNwPEFCdWZmZXI+IGVzZHMgPSBuZXcgQUJ1ZmZlcihjc2QtPnNpemUoKSArIDI1KTsKKworICAgIHVpbnQ4X3QgKnB0ciA9IGVzZHMtPmRhdGEoKTsKKyAgICAqcHRyKysgPSAweDAzOworICAgIEVuY29kZVNpemUxNCgmcHRyLCAyMiArIGNzZC0+c2l6ZSgpKTsKKworICAgICpwdHIrKyA9IDB4MDA7ICAvLyBFU19JRAorICAgICpwdHIrKyA9IDB4MDA7CisKKyAgICAqcHRyKysgPSAweDAwOyAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAqcHRyKysgPSAweDA0OworICAgIEVuY29kZVNpemUxNCgmcHRyLCAxNiArIGNzZC0+c2l6ZSgpKTsKKworICAgICpwdHIrKyA9IDB4NDA7ICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICAqcHRyKysgPSAweDAwOworICAgIH0KKworICAgICpwdHIrKyA9IDB4MDU7CisgICAgRW5jb2RlU2l6ZTE0KCZwdHIsIGNzZC0+c2l6ZSgpKTsKKworICAgIG1lbWNweShwdHIsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICByZXR1cm4gZXNkczsKK30KKworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgYm9vbCBzYXdQaWN0dXJlU3RhcnQgPSBmYWxzZTsKKyAgICBpbnQgcHByZXZTdGFydENvZGUgPSAtMTsKKyAgICBpbnQgcHJldlN0YXJ0Q29kZSA9IC0xOworICAgIGludCBjdXJyZW50U3RhcnRDb2RlID0gLTE7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMyA8IHNpemUpIHsKKyAgICAgICAgaWYgKG1lbWNtcCgmZGF0YVtvZmZzZXRdLCAiXHgwMFx4MDBceDAxIiwgMykpIHsKKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwcHJldlN0YXJ0Q29kZSA9IHByZXZTdGFydENvZGU7CisgICAgICAgIHByZXZTdGFydENvZGUgPSBjdXJyZW50U3RhcnRDb2RlOworICAgICAgICBjdXJyZW50U3RhcnRDb2RlID0gZGF0YVtvZmZzZXQgKyAzXTsKKworICAgICAgICBpZiAoY3VycmVudFN0YXJ0Q29kZSA9PSAweGIzICYmIG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgICAgICAgICBzaXplIC09IG9mZnNldDsKKyAgICAgICAgICAgICh2b2lkKWZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHByZXZTdGFydENvZGUgPT0gMHhiMyAmJiBjdXJyZW50U3RhcnRDb2RlICE9IDB4YjUpCisgICAgICAgICAgICAgICAgfHwgKHBwcmV2U3RhcnRDb2RlID09IDB4YjMgJiYgcHJldlN0YXJ0Q29kZSA9PSAweGI1KSkgeworICAgICAgICAgICAgLy8gc2VxSGVhZGVyIHdpdGhvdXQvd2l0aCBleHRlbnNpb24KKworICAgICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIENIRUNLX0dFKHNpemUsIDd1KTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgKGRhdGFbNF0gPDwgNCkgfCBkYXRhWzVdID4+IDQ7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBoZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAoKGRhdGFbNV0gJiAweDBmKSA8PCA4KSB8IGRhdGFbNl07CisKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIExPR0koImZvdW5kIE1QRUcyIHZpZGVvIGNvZGVjIGNvbmZpZyAoJWQgeCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBkYXRhLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBzaXplIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICAodm9pZClmZXRjaFRpbWVzdGFtcChvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBlc2RzID0gTWFrZU1QRUdWaWRlb0VTRFMoY3NkKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy0+ZGF0YSgpLCBlc2RzLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZvcm1hdCAhPSBOVUxMICYmIGN1cnJlbnRTdGFydENvZGUgPT0gMHgwMCkgeworICAgICAgICAgICAgLy8gUGljdHVyZSBzdGFydAorCisgICAgICAgICAgICBpZiAoIXNhd1BpY3R1cmVTdGFydCkgeworICAgICAgICAgICAgICAgIHNhd1BpY3R1cmVTdGFydCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOworICAgICAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGRhdGEsIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOworICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKworICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBnZXROZXh0Q2h1bmtTaXplKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdGFydENvZGVbXSA9ICJceDAwXHgwMFx4MDEiOworCisgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIGlmIChtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgMykpIHsKKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMzsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMiA8IHNpemUpIHsKKyAgICAgICAgaWYgKCFtZW1jbXAoJmRhdGFbb2Zmc2V0XSwga1N0YXJ0Q29kZSwgMykpIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICArK29mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVBR0FJTjsKK30KKworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdE1QRUc0VmlkZW8oKSB7CisgICAgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKKworICAgIGVudW0geworICAgICAgICBTS0lQX1RPX1ZJU1VBTF9PQkpFQ1RfU0VRX1NUQVJULAorICAgICAgICBFWFBFQ1RfVklTVUFMX09CSkVDVF9TVEFSVCwKKyAgICAgICAgRVhQRUNUX1ZPX1NUQVJULAorICAgICAgICBFWFBFQ1RfVk9MX1NUQVJULAorICAgICAgICBXQUlUX0ZPUl9WT1BfU1RBUlQsCisgICAgICAgIFNLSVBfVE9fVk9QX1NUQVJULAorCisgICAgfSBzdGF0ZTsKKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdGUgPSBTS0lQX1RPX1ZJU1VBTF9PQkpFQ1RfU0VRX1NUQVJUOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRlID0gU0tJUF9UT19WT1BfU1RBUlQ7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aCA9IC0xLCBoZWlnaHQgPSAtMTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHNzaXplX3QgY2h1bmtTaXplOworICAgIHdoaWxlICgoY2h1bmtTaXplID0gZ2V0TmV4dENodW5rU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgJmRhdGFbb2Zmc2V0XSwgc2l6ZSAtIG9mZnNldCkpID4gMCkgeworICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZTsKKworICAgICAgICB1bnNpZ25lZCBjaHVua1R5cGUgPSBkYXRhW29mZnNldCArIDNdOworCisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU0tJUF9UT19WSVNVQUxfT0JKRUNUX1NFUV9TVEFSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtUeXBlID09IDB4YjApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCBhbnl0aGluZyBiZWZvcmUgdGhpcyBtYXJrZXIuCisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBFWFBFQ1RfVklTVUFMX09CSkVDVF9TVEFSVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgRVhQRUNUX1ZJU1VBTF9PQkpFQ1RfU1RBUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoY2h1bmtUeXBlLCAweGI1KTsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVYUEVDVF9WT19TVEFSVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBFWFBFQ1RfVk9fU1RBUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUoY2h1bmtUeXBlLCAweDFmKTsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVYUEVDVF9WT0xfU1RBUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgRVhQRUNUX1ZPTF9TVEFSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDSygoY2h1bmtUeXBlICYgMHhmMCkgPT0gMHgyMCk7CisKKyAgICAgICAgICAgICAgICBDSEVDSyhFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFbb2Zmc2V0XSwgY2h1bmtTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCkpOworCisgICAgICAgICAgICAgICAgc3RhdGUgPSBXQUlUX0ZPUl9WT1BfU1RBUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgV0FJVF9GT1JfVk9QX1NUQVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT0gMHhiMyB8fCBjaHVua1R5cGUgPT0gMHhiNikgeworICAgICAgICAgICAgICAgICAgICAvLyBncm91cCBvZiBWT1Agb3IgVk9QIHN0YXJ0LgorCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgTE9HSSgiZm91bmQgTVBFRzQgdmlkZW8gY29kZWMgY29uZmlnICglZCB4ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBkYXRhLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBlc2RzID0gTWFrZU1QRUdWaWRlb0VTRFMoY3NkKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RVNEUywga1R5cGVFU0RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzZHMtPmRhdGEoKSwgZXNkcy0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTS0lQX1RPX1ZPUF9TVEFSVDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBTS0lQX1RPX1ZPUF9TVEFSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtUeXBlID09IDB4YjYpIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgZGF0YSwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGRhdGEsICZkYXRhW29mZnNldF0sIHNpemUgLSBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBzaXplIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIExPR1YoInJldHVybmluZyBNUEVHNCB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua1R5cGUgIT0gMHhiMykgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpc2NhcmQpIHsKKyAgICAgICAgICAgICh2b2lkKWZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgICAgICAgICBtZW1tb3ZlKGRhdGEsICZkYXRhW29mZnNldF0sIHNpemUgLSBvZmZzZXQpOworICAgICAgICAgICAgc2l6ZSAtPSBvZmZzZXQ7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IDE1M2NmZTYuLjQwMzVlZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zMSw3ICszMSwxMCBAQAogc3RydWN0IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSB7CiAgICAgZW51bSBNb2RlIHsKICAgICAgICAgSDI2NCwKLSAgICAgICAgQUFDCisgICAgICAgIEFBQywKKyAgICAgICAgTVBFR19BVURJTywKKyAgICAgICAgTVBFR19WSURFTywKKyAgICAgICAgTVBFRzRfVklERU8sCiAgICAgfTsKICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUoTW9kZSBtb2RlKTsKIApAQCAtNTcsNiArNjAsOSBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKKyAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CiAKICAgICAvLyBjb25zdW1lIGEgbG9naWNhbCAoY29tcHJlc3NlZCkgYWNjZXNzIHVuaXQgb2Ygc2l6ZSAic2l6ZSIsCiAgICAgLy8gcmV0dXJucyBpdHMgdGltZXN0YW1wIGluIHVzIChvciAtMSBpZiBubyB0aW1lIGluZm9ybWF0aW9uKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IGRmZWM0N2YuLjgyNTBhZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIGlmICghaGF2ZVZpZGVvKSB7CiAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0KICAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6QVZDX1ZJREVPKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6VklERU8pLmdldCgpOwogCiAgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICBpZiAoIWhhdmVBdWRpbykgewogICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gaW1wbCA9CiAgICAgICAgICAgICAgICAgKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6Ok1QRUcyQURUU19BVURJTykuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkFVRElPKS5nZXQoKTsKIAogICAgICAgICAgICAgaWYgKGltcGwgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICgrK251bVBhY2tldHNQYXJzZWQgPiAyNTAwKSB7CisgICAgICAgIGlmICgrK251bVBhY2tldHNQYXJzZWQgPiAxMDAwMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCmluZGV4IDZlMDY5YzguLmQ4NDRmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCkBAIC0xLDUzICsxLDM0IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1pZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQotIyBTZXQgdXAgdGhlIE9wZW5Db3JlIHZhcmlhYmxlcy4KLWluY2x1ZGUgZXh0ZXJuYWwvb3BlbmNvcmUvQ29uZmlnLm1rCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoUFZfSU5DTFVERVMpCi1MT0NBTF9DRkxBR1MgOj0gJChQVl9DRkxBR1NfTUlOVVNfVklTSUJJTElUWSkKLWVuZGlmCi0KIExPQ0FMX0NfSU5DTFVERVMgKz0gJChKTklfSF9JTkNMVURFKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgIFwKLQlPTVguY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9NWC5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgT01YQ29tcG9uZW50QmFzZS5jcHAgICAgICAgICAgXAorICAgICAgICBPTVhNYXN0ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE9NWE5vZGVJbnN0YW5jZS5jcHAgICAgICAgICAgIFwKLSAgICAgICAgT01YTWFzdGVyLmNwcAorICAgICAgICBTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCAgICBcCisgICAgICAgIFNvZnRPTVhDb21wb25lbnQuY3BwICAgICAgICAgIFwKKyAgICAgICAgU29mdE9NWFBsdWdpbi5jcHAgICAgICAgICAgICAgXAogCi1pZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICAgICAgT01YUFZDb2RlY3NQbHVnaW4uY3BwCi1lbHNlCi1MT0NBTF9DRkxBR1MgKz0gLUROT19PUEVOQ09SRQotZW5kaWYKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAogCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAotICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCi0gICAgICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGlidXRpbHMgICAgICAgICAgICAgICAgXAotICAgICAgICBsaWJ1aSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgIFwKLQotaWZuZXEgKCQoQlVJTERfV0lUSE9VVF9QViksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgICAgICBsaWJvcGVuY29yZV9jb21tb24KLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi0gICAgICAgIExPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQgLWxkbAotZW5kaWYKLQotaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJ1aSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICAgICAgXAorICAgICAgICBsaWJkbAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9vbXgKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDRiMWMzYTcuLmJjMjRkYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0yMCw5ICsyMCw2IEBACiAKICNpbmNsdWRlIDxkbGZjbi5oPgogCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KICNpbmNsdWRlICIuLi9pbmNsdWRlL09NWC5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCIKQEAgLTM5LDExICszNiwzMiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCisvLyBUaGlzIHByb3ZpZGVzIHRoZSB1bmRlcmx5aW5nIFRocmVhZCB1c2VkIGJ5IENhbGxiYWNrRGlzcGF0Y2hlci4KKy8vIE5vdGUgdGhhdCBkZXJpdmluZyBDYWxsYmFja0Rpc3BhdGNoZXIgZnJvbSBUaHJlYWQgZG9lcyBub3Qgd29yay4KKworc3RydWN0IE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgQ2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkKENhbGxiYWNrRGlzcGF0Y2hlciAqZGlzcGF0Y2hlcikKKyAgICAgICAgOiBtRGlzcGF0Y2hlcihkaXNwYXRjaGVyKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIENhbGxiYWNrRGlzcGF0Y2hlciAqbURpc3BhdGNoZXI7CisKKyAgICBib29sIHRocmVhZExvb3AoKTsKKworICAgIENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZChjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXJUaHJlYWQgJik7CisgICAgQ2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkICZvcGVyYXRvcj0oY29uc3QgQ2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkICYpOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwogc3RydWN0IE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyIDogcHVibGljIFJlZkJhc2UgewogICAgIENhbGxiYWNrRGlzcGF0Y2hlcihPTVhOb2RlSW5zdGFuY2UgKm93bmVyKTsKIAogICAgIHZvaWQgcG9zdChjb25zdCBvbXhfbWVzc2FnZSAmbXNnKTsKIAorICAgIGJvb2wgbG9vcCgpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+Q2FsbGJhY2tEaXNwYXRjaGVyKCk7CiAKQEAgLTU1LDEzICs3MywxMCBAQAogICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkOwogICAgIExpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKIAotICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIHNwPENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZD4gbVRocmVhZDsKIAogICAgIHZvaWQgZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CiAKLSAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICptZSk7Ci0gICAgdm9pZCB0aHJlYWRFbnRyeSgpOwotCiAgICAgQ2FsbGJhY2tEaXNwYXRjaGVyKGNvbnN0IENhbGxiYWNrRGlzcGF0Y2hlciAmKTsKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIgJm9wZXJhdG9yPShjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXIgJik7CiB9OwpAQCAtNjksMTMgKzg0LDggQEAKIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpDYWxsYmFja0Rpc3BhdGNoZXIoT01YTm9kZUluc3RhbmNlICpvd25lcikKICAgICA6IG1Pd25lcihvd25lciksCiAgICAgICBtRG9uZShmYWxzZSkgewotICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7Ci0gICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOwotICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwotCi0gICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKLQotICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICBtVGhyZWFkID0gbmV3IENhbGxiYWNrRGlzcGF0Y2hlclRocmVhZCh0aGlzKTsKKyAgICBtVGhyZWFkLT5ydW4oIk9NWENhbGxiYWNrRGlzcCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogfQogCiBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6fkNhbGxiYWNrRGlzcGF0Y2hlcigpIHsKQEAgLTg2LDExICs5NiwxNCBAQAogICAgICAgICBtUXVldWVDaGFuZ2VkLnNpZ25hbCgpOwogICAgIH0KIAotICAgIC8vIERvbid0IGNhbGwgam9pbiBvbiBteXNlbGYKLSAgICBDSEVDSyhtVGhyZWFkICE9IHB0aHJlYWRfc2VsZigpKTsKLQotICAgIHZvaWQgKmR1bW15OwotICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOworICAgIC8vIEEgam9pbiBvbiBzZWxmIGNhbiBoYXBwZW4gaWYgdGhlIGxhc3QgcmVmIHRvIENhbGxiYWNrRGlzcGF0Y2hlcgorICAgIC8vIGlzIHJlbGVhc2VkIHdpdGhpbiB0aGUgQ2FsbGJhY2tEaXNwYXRjaGVyVGhyZWFkIGxvb3AKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVGhyZWFkLT5qb2luKCk7CisgICAgaWYgKHN0YXR1cyAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAvLyBPdGhlciB0aGFuIGpvaW4gdG8gc2VsZiwgdGhlIG9ubHkgb3RoZXIgZXJyb3IgcmV0dXJuIGNvZGVzIGFyZQorICAgICAgICAvLyB3aGF0ZXZlciByZWFkeVRvUnVuKCkgcmV0dXJucywgYW5kIHdlIGRvbid0IG92ZXJyaWRlIHRoYXQKKyAgICAgICAgQ0hFQ0tfRVEoc3RhdHVzLCBOT19FUlJPUik7CisgICAgfQogfQogCiB2b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKQEAgLTEwOCwxNyArMTIxLDcgQEAKICAgICBtT3duZXItPm9uTWVzc2FnZShtc2cpOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgKk9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8Q2FsbGJhY2tEaXNwYXRjaGVyICo+KG1lKS0+dGhyZWFkRW50cnkoKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjp0aHJlYWRFbnRyeSgpIHsKLSAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT01YQ2FsbGJhY2tEaXNwIiwgMCwgMCwgMCk7Ci0KK2Jvb2wgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6Omxvb3AoKSB7CiAgICAgZm9yICg7OykgewogICAgICAgICBvbXhfbWVzc2FnZSBtc2c7CiAKQEAgLTEzOCw2ICsxNDEsMTQgQEAKIAogICAgICAgICBkaXNwYXRjaChtc2cpOwogICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICByZXR1cm4gbURpc3BhdGNoZXItPmxvb3AoKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKaW5kZXggNTZiMTY5YS4uYzgyNzhhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKQEAgLTIwLDIzICsyMCwxOCBAQAogCiAjaW5jbHVkZSAiT01YTWFzdGVyLmgiCiAKKyNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCisKICNpbmNsdWRlIDxkbGZjbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogCi0jaWZuZGVmIE5PX09QRU5DT1JFCi0jaW5jbHVkZSAiT01YUFZDb2RlY3NQbHVnaW4uaCIKLSNlbmRpZgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKICAgICA6IG1WZW5kb3JMaWJIYW5kbGUoTlVMTCkgewogICAgIGFkZFZlbmRvclBsdWdpbigpOwotCi0jaWZuZGVmIE5PX09QRU5DT1JFCi0gICAgYWRkUGx1Z2luKG5ldyBPTVhQVkNvZGVjc1BsdWdpbik7Ci0jZW5kaWYKKyAgICBhZGRQbHVnaW4obmV3IFNvZnRPTVhQbHVnaW4pOwogfQogCiBPTVhNYXN0ZXI6On5PTVhNYXN0ZXIoKSB7CkBAIC00OSw3ICs0NCwxMSBAQAogfQogCiB2b2lkIE9NWE1hc3Rlcjo6YWRkVmVuZG9yUGx1Z2luKCkgewotICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0aHcuc28iLCBSVExEX05PVyk7CisgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodGh3LnNvIik7Cit9CisKK3ZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgeworICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBkbG9wZW4obGlibmFtZSwgUlRMRF9OT1cpOwogCiAgICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC01OCw2ICs1Nyw5IEBACiAgICAgdHlwZWRlZiBPTVhQbHVnaW5CYXNlICooKkNyZWF0ZU9NWFBsdWdpbkZ1bmMpKCk7CiAgICAgQ3JlYXRlT01YUGx1Z2luRnVuYyBjcmVhdGVPTVhQbHVnaW4gPQogICAgICAgICAoQ3JlYXRlT01YUGx1Z2luRnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICBtVmVuZG9yTGliSGFuZGxlLCAiY3JlYXRlT01YUGx1Z2luIik7CisgICAgaWYgKCFjcmVhdGVPTVhQbHVnaW4pCisgICAgICAgIGNyZWF0ZU9NWFBsdWdpbiA9IChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAogICAgICAgICAgICAgICAgIG1WZW5kb3JMaWJIYW5kbGUsICJfWk43YW5kcm9pZDE1Y3JlYXRlT01YUGx1Z2luRXYiKTsKIAogICAgIGlmIChjcmVhdGVPTVhQbHVnaW4pIHsKQEAgLTg3LDE3ICs4OSwyOSBAQAogCiAgICAgICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuYWRkKG5hbWU4LCBwbHVnaW4pOwogICAgIH0KLSAgICBDSEVDS19FUShlcnIsIE9NWF9FcnJvck5vTW9yZSk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vTW9yZSkgeworICAgICAgICBMT0dFKCJPTVggcGx1Z2luIGZhaWxlZCB3LyBlcnJvciAweCUwOHggYWZ0ZXIgcmVnaXN0ZXJpbmcgJWQgIgorICAgICAgICAgICAgICJjb21wb25lbnRzIiwgZXJyLCBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKSk7CisgICAgfQogfQogCiB2b2lkIE9NWE1hc3Rlcjo6Y2xlYXJQbHVnaW5zKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95T01YUGx1Z2luRnVuYykoT01YUGx1Z2luQmFzZSopOworICAgIERlc3Ryb3lPTVhQbHVnaW5GdW5jIGRlc3Ryb3lPTVhQbHVnaW4gPQorICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgImRlc3Ryb3lPTVhQbHVnaW4iKTsKKwogICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKIAogICAgIGZvciAoTGlzdDxPTVhQbHVnaW5CYXNlICo+OjppdGVyYXRvciBpdCA9IG1QbHVnaW5zLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBtUGx1Z2lucy5lbmQoKTsgKytpdCkgewotICAgICAgICBkZWxldGUgKml0OworICAgICAgICAgICAgaXQgIT0gbVBsdWdpbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGRlc3Ryb3lPTVhQbHVnaW4pCisgICAgICAgICAgICBkZXN0cm95T01YUGx1Z2luKCppdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbGV0ZSAqaXQ7CiAgICAgICAgICppdCA9IE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggN2JhOGQxOC4uZmVlZTFmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtNTgsNiArNTgsNyBAQAogICAgIHZvaWQgKm1WZW5kb3JMaWJIYW5kbGU7CiAKICAgICB2b2lkIGFkZFZlbmRvclBsdWdpbigpOworICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOwogICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CiAgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCA2Y2JkNTk5Li4xMmFiOTQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YTm9kZUluc3RhbmNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yMzQsNiArMjM0LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCBwYXJhbXMpOworCiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCkBAIC00MDUsMTIgKzQwNiw3NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VHcmFwaGljQnVmZmVyMl9sKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsCisgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKKworICAgIC8vIHBvcnQgZGVmaW5pdGlvbgorICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIGRlZi5uU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKKyAgICBkZWYublZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBkZWYublZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBkZWYublZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIGRlZi5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKyAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRQYXJhbWV0ZXIobUhhbmRsZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZik7CisgICAgaWYgKGVyciAhPSBPSykKKyAgICB7CisgICAgICAgIExPR0UoIiVzOjolZDpFcnJvciBnZXR0aW5nIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gbmV3IEJ1ZmZlck1ldGEoZ3JhcGhpY0J1ZmZlcik7CisKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTgqIGJ1ZmZlckhhbmRsZSA9IGNvbnN0X2Nhc3Q8T01YX1U4Kj4oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE9NWF9VOCo+KGdyYXBoaWNCdWZmZXItPmhhbmRsZSkpOworCisgICAgZXJyID0gT01YX1VzZUJ1ZmZlcigKKyAgICAgICAgICAgIG1IYW5kbGUsCisgICAgICAgICAgICAmaGVhZGVyLAorICAgICAgICAgICAgcG9ydEluZGV4LAorICAgICAgICAgICAgYnVmZmVyTWV0YSwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX1VzZUJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlZCAoMHglMDh4KSIsIGVyciwgZXJyKTsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlck1ldGE7CisgICAgICAgIGJ1ZmZlck1ldGEgPSBOVUxMOworICAgICAgICAqYnVmZmVyID0gMDsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQnVmZmVyLCBidWZmZXJIYW5kbGUpOworICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlck1ldGEpOworCisgICAgKmJ1ZmZlciA9IGhlYWRlcjsKKworICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBYWFg6IFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBPbmNlIHRoZSBPTVgKKy8vIGltcGxlbWVudGF0aW9ucyBoYXZlIGJlZW4gdXBkYXRlZCB0aGlzIGNhbiBiZSByZW1vdmVkIGFuZCB1c2VHcmFwaGljQnVmZmVyMgorLy8gY2FuIGJlIHJlbmFtZWQgdG8gdXNlR3JhcGhpY0J1ZmZlci4KIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIC8vIFNlZSBpZiB0aGUgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQuCiAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBpZiAoT01YX0dldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgbUhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyMiIpLAorICAgICAgICAgICAgJmluZGV4KSA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHJldHVybiB1c2VHcmFwaGljQnVmZmVyMl9sKHBvcnRJbmRleCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBMT0dXKCJGYWxsaW5nIGJhY2sgdG8gdGhlIGRlcHJlY2F0ZWQgdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBzdXBwb3J0LiAgWW91ICIKKyAgICAgICAgInNob3VsZCBzd2l0Y2ggdG8gdGhlIHVzZUFuZHJvaWROYXRpdmVCdWZmZXIyIGV4dGVuc2lvbi4iKTsKKwogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgbUhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIiksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFBWQ29kZWNzUGx1Z2luLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNWJlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiT01YUFZDb2RlY3NQbHVnaW4uaCIKLQotI2luY2x1ZGUgInB2X29teGNvcmUuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1PTVhQVkNvZGVjc1BsdWdpbjo6T01YUFZDb2RlY3NQbHVnaW4oKSB7Ci0gICAgT01YX01hc3RlckluaXQoKTsKLX0KLQotT01YUFZDb2RlY3NQbHVnaW46On5PTVhQVkNvZGVjc1BsdWdpbigpIHsKLSAgICBPTVhfTWFzdGVyRGVpbml0KCk7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgT01YUFZDb2RlY3NQbHVnaW46Om1ha2VDb21wb25lbnRJbnN0YW5jZSgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7Ci0gICAgcmV0dXJuIE9NWF9NYXN0ZXJHZXRIYW5kbGUoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9IQU5ETEVUWVBFICo+KGNvbXBvbmVudCksCi0gICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4obmFtZSksCi0gICAgICAgICAgICBhcHBEYXRhLAotICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfQ0FMTEJBQ0tUWVBFICo+KGNhbGxiYWNrcykpOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWFBWQ29kZWNzUGx1Z2luOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKLSAgICByZXR1cm4gT01YX01hc3RlckZyZWVIYW5kbGUoY29tcG9uZW50KTsKLX0KLQotT01YX0VSUk9SVFlQRSBPTVhQVkNvZGVjc1BsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgT01YX1UzMiBpbmRleCkgewotICAgIHJldHVybiBPTVhfTWFzdGVyQ29tcG9uZW50TmFtZUVudW0obmFtZSwgc2l6ZSwgaW5kZXgpOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWFBWQ29kZWNzUGx1Z2luOjpnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7Ci0gICAgcm9sZXMtPmNsZWFyKCk7Ci0KLSAgICBPTVhfVTMyIG51bVJvbGVzOwotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgT01YX01hc3RlckdldFJvbGVzT2ZDb21wb25lbnQoCi0gICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KG5hbWUpLAotICAgICAgICAgICAgICAgICZudW1Sb2xlcywKLSAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChudW1Sb2xlcyA+IDApIHsKLSAgICAgICAgT01YX1U4ICoqYXJyYXkgPSBuZXcgT01YX1U4ICpbbnVtUm9sZXNdOwotICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7Ci0gICAgICAgICAgICBhcnJheVtpXSA9IG5ldyBPTVhfVThbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOwotICAgICAgICB9Ci0KLSAgICAgICAgT01YX1UzMiBudW1Sb2xlczI7Ci0gICAgICAgIGVyciA9IE9NWF9NYXN0ZXJHZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihuYW1lKSwgJm51bVJvbGVzMiwgYXJyYXkpOwotCi0gICAgICAgIENIRUNLX0VRKGVyciwgT01YX0Vycm9yTm9uZSk7Ci0gICAgICAgIENIRUNLX0VRKG51bVJvbGVzLCBudW1Sb2xlczIpOwotCi0gICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IG51bVJvbGVzOyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZzggcygoY29uc3QgY2hhciAqKWFycmF5W2ldKTsKLSAgICAgICAgICAgIHJvbGVzLT5wdXNoKHMpOwotCi0gICAgICAgICAgICBkZWxldGVbXSBhcnJheVtpXTsKLSAgICAgICAgICAgIGFycmF5W2ldID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbGV0ZVtdIGFycmF5OwotICAgICAgICBhcnJheSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YUFZDb2RlY3NQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhQVkNvZGVjc1BsdWdpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMzMjMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhQVkNvZGVjc1BsdWdpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgT01YX1BWX0NPREVDU19QTFVHSU5fSF8KLQotI2RlZmluZSBPTVhfUFZfQ09ERUNTX1BMVUdJTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhQVkNvZGVjc1BsdWdpbiA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKLSAgICBPTVhQVkNvZGVjc1BsdWdpbigpOwotICAgIHZpcnR1YWwgfk9NWFBWQ29kZWNzUGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAotICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOwotCi1wcml2YXRlOgotICAgIE9NWFBWQ29kZWNzUGx1Z2luKGNvbnN0IE9NWFBWQ29kZWNzUGx1Z2luICYpOwotICAgIE9NWFBWQ29kZWNzUGx1Z2luICZvcGVyYXRvcj0oY29uc3QgT01YUFZDb2RlY3NQbHVnaW4gJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9NWF9QVl9DT0RFQ1NfUExVR0lOX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMzBmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDY0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlU29mdE9NWENvbXBvbmVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2ltcGxlU29mdE9NWENvbXBvbmVudDo6U2ltcGxlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxTaW1wbGVTb2Z0T01YQ29tcG9uZW50Pih0aGlzKSksCisgICAgICBtU3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICBtTG9vcGVyLT5zZXROYW1lKG5hbWUpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICBtTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworfQorCit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnByZXBhcmVGb3JEZXN0cnVjdGlvbigpIHsKKyAgICAvLyBUaGUgbG9vcGVyJ3MgcXVldWUgbWF5IHN0aWxsIGNvbnRhaW4gbWVzc2FnZXMgcmVmZXJlbmNpbmcgdGhpcworICAgIC8vIG9iamVjdC4gTWFrZSBzdXJlIHRob3NlIGFyZSBmbHVzaGVkIGJlZm9yZSByZXR1cm5pbmcgc28gdGhhdAorICAgIC8vIGEgc3Vic2VxdWVudCBkbHVubG9hZCgpIGRvZXMgbm90IHB1bGwgb3V0IHRoZSBydWcgZnJvbSB1bmRlciB1cy4KKworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2VuZENvbW1hbmQoCisgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSkgeworICAgIENIRUNLKGRhdGEgPT0gTlVMTCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJjbWQiLCBjbWQpOworICAgIG1zZy0+c2V0SW50MzIoInBhcmFtIiwgcGFyYW0pOworICAgIG1zZy0+cG9zdCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK2Jvb2wgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3QgeworICAgIGlmIChtU3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIE9NWF9VMzIgcG9ydEluZGV4OworCisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnRJbmRleCA9ICgoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtcyktPm5Qb3J0SW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKKyAgICAgICAgeworICAgICAgICAgICAgcG9ydEluZGV4ID0gKChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXMpLT5uUG9ydEluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnRJbmRleCA9ICgoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zKS0+blBvcnRJbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDSyhwb3J0SW5kZXggPCBtUG9ydHMuc2l6ZSgpKTsKKworICAgIHJldHVybiAhbVBvcnRzLml0ZW1BdChwb3J0SW5kZXgpLm1EZWYuYkVuYWJsZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0soaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKGluZGV4LCBwYXJhbXMpKTsKKworICAgIHJldHVybiBpbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA+PSBtUG9ydHMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGRlZlBhcmFtcy0+blNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBQb3J0SW5mbyAqcG9ydCA9CisgICAgICAgICAgICAgICAgJm1Qb3J0cy5pdGVtQXQoZGVmUGFyYW1zLT5uUG9ydEluZGV4KTsKKworICAgICAgICAgICAgbWVtY3B5KGRlZlBhcmFtcywgJnBvcnQtPm1EZWYsIHNpemVvZihwb3J0LT5tRGVmKSk7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA+PSBtUG9ydHMuc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGRlZlBhcmFtcy0+blNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQb3J0SW5mbyAqcG9ydCA9CisgICAgICAgICAgICAgICAgJm1Qb3J0cy5lZGl0SXRlbUF0KGRlZlBhcmFtcy0+blBvcnRJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChkZWZQYXJhbXMtPm5CdWZmZXJTaXplICE9IHBvcnQtPm1EZWYubkJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShkZWZQYXJhbXMtPm5CdWZmZXJTaXplLCBwb3J0LT5tRGVmLm5CdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBwb3J0LT5tRGVmLm5CdWZmZXJTaXplID0gZGVmUGFyYW1zLT5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+bkJ1ZmZlckNvdW50QWN0dWFsCisgICAgICAgICAgICAgICAgICAgICE9IHBvcnQtPm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfR0UoZGVmUGFyYW1zLT5uQnVmZmVyQ291bnRBY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bURlZi5uQnVmZmVyQ291bnRNaW4pOworCisgICAgICAgICAgICAgICAgcG9ydC0+bURlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWZQYXJhbXMtPm5CdWZmZXJDb3VudEFjdHVhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOworICAgICgqaGVhZGVyKS0+blNpemUgPSBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICgqaGVhZGVyKS0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICAoKmhlYWRlciktPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgKCpoZWFkZXIpLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgKCpoZWFkZXIpLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKyAgICAoKmhlYWRlciktPnBCdWZmZXIgPSBwdHI7CisgICAgKCpoZWFkZXIpLT5uQWxsb2NMZW4gPSBzaXplOworICAgICgqaGVhZGVyKS0+bkZpbGxlZExlbiA9IDA7CisgICAgKCpoZWFkZXIpLT5uT2Zmc2V0ID0gMDsKKyAgICAoKmhlYWRlciktPnBBcHBQcml2YXRlID0gYXBwUHJpdmF0ZTsKKyAgICAoKmhlYWRlciktPnBQbGF0Zm9ybVByaXZhdGUgPSBOVUxMOworICAgICgqaGVhZGVyKS0+cElucHV0UG9ydFByaXZhdGUgPSBOVUxMOworICAgICgqaGVhZGVyKS0+cE91dHB1dFBvcnRQcml2YXRlID0gTlVMTDsKKyAgICAoKmhlYWRlciktPmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gTlVMTDsKKyAgICAoKmhlYWRlciktPnBNYXJrRGF0YSA9IE5VTEw7CisgICAgKCpoZWFkZXIpLT5uVGlja0NvdW50ID0gMDsKKyAgICAoKmhlYWRlciktPm5UaW1lU3RhbXAgPSAwOworICAgICgqaGVhZGVyKS0+bkZsYWdzID0gMDsKKyAgICAoKmhlYWRlciktPm5PdXRwdXRQb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgKCpoZWFkZXIpLT5uSW5wdXRQb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworCisgICAgQ0hFQ0sobVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCB8fCBwb3J0LT5tRGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSk7CisKKyAgICBDSEVDS19MVChwb3J0LT5tQnVmZmVycy5zaXplKCksIHBvcnQtPm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKworICAgIHBvcnQtPm1CdWZmZXJzLnB1c2goKTsKKworICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9CisgICAgICAgICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KHBvcnQtPm1CdWZmZXJzLnNpemUoKSAtIDEpOworCisgICAgYnVmZmVyLT5tSGVhZGVyID0gKmhlYWRlcjsKKyAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKworICAgIGlmIChwb3J0LT5tQnVmZmVycy5zaXplKCkgPT0gcG9ydC0+bURlZi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgcG9ydC0+bURlZi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgIGNoZWNrVHJhbnNpdGlvbnMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjphbGxvY2F0ZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSkgeworICAgIE9NWF9VOCAqcHRyID0gbmV3IE9NWF9VOFtzaXplXTsKKworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KKyAgICAgICAgdXNlQnVmZmVyKGhlYWRlciwgcG9ydEluZGV4LCBhcHBQcml2YXRlLCBzaXplLCBwdHIpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGRlbGV0ZVtdIHB0cjsKKyAgICAgICAgcHRyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIENIRUNLKCgqaGVhZGVyKS0+cFBsYXRmb3JtUHJpdmF0ZSA9PSBOVUxMKTsKKyAgICAoKmhlYWRlciktPnBQbGF0Zm9ybVByaXZhdGUgPSBwdHI7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpmcmVlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDS19MVChwb3J0SW5kZXgsIG1Qb3J0cy5zaXplKCkpOworCisgICAgUG9ydEluZm8gKnBvcnQgPSAmbVBvcnRzLmVkaXRJdGVtQXQocG9ydEluZGV4KTsKKworI2lmIDAgLy8gWFhYCisgICAgQ0hFQ0soKG1TdGF0ZSA9PSBPTVhfU3RhdGVJZGxlICYmIG1UYXJnZXRTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpCisgICAgICAgICAgICB8fCBwb3J0LT5tRGVmLmJFbmFibGVkID09IE9NWF9GQUxTRSk7CisjZW5kaWYKKworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChidWZmZXItPm1IZWFkZXIgPT0gaGVhZGVyKSB7CisgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlci0+cFBsYXRmb3JtUHJpdmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBidWZmZXIncyBkYXRhIHdhcyBhbGxvY2F0ZWQgYnkgdXMuCisgICAgICAgICAgICAgICAgQ0hFQ0soaGVhZGVyLT5wUGxhdGZvcm1Qcml2YXRlID09IGhlYWRlci0+cEJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBoZWFkZXItPnBCdWZmZXI7CisgICAgICAgICAgICAgICAgaGVhZGVyLT5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVsZXRlIGhlYWRlcjsKKyAgICAgICAgICAgIGhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHBvcnQtPm1CdWZmZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgcG9ydC0+bURlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICBjaGVja1RyYW5zaXRpb25zKCk7CisKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soZm91bmQpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXItPmlkKCkpOworICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmZpbGxUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZpbGxUaGlzQnVmZmVyLCBtSGFuZGxlci0+aWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKnN0YXRlID0gbVN0YXRlOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2VuZENvbW1hbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgY21kLCBwYXJhbTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjbWQiLCAmY21kKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGFyYW0iLCAmcGFyYW0pKTsKKworICAgICAgICAgICAgb25TZW5kQ29tbWFuZCgoT01YX0NPTU1BTkRUWVBFKWNtZCwgKE9NWF9VMzIpcGFyYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RW1wdHlUaGlzQnVmZmVyOgorICAgICAgICBjYXNlIGtXaGF0RmlsbFRoaXNCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJoZWFkZXIiLCAodm9pZCAqKikmaGVhZGVyKSk7CisKKyAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CisKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgUG9ydEluZm8gKnBvcnQgPSAmbVBvcnRzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBvcnQtPm1CdWZmZXJzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmJ1ZmZlciA9ICZwb3J0LT5tQnVmZmVycy5lZGl0SXRlbUF0KGopOworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXItPm1IZWFkZXIgPT0gaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soKG1zZy0+d2hhdCgpID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJPdXRwdXQpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+bVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb25RdWV1ZUZpbGxlZChpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGZvdW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25TZW5kQ29tbWFuZCgKKyAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSkgeworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKKyAgICAgICAgeworICAgICAgICAgICAgb25DaGFuZ2VTdGF0ZSgoT01YX1NUQVRFVFlQRSlwYXJhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgorICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydERpc2FibGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUG9ydEVuYWJsZShwYXJhbSwgY21kID09IE9NWF9Db21tYW5kUG9ydEVuYWJsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3J0Rmx1c2gocGFyYW0sIHRydWUgLyogc2VuZEZsdXNoQ29tcGxldGUgKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvbkNoYW5nZVN0YXRlKE9NWF9TVEFURVRZUEUgc3RhdGUpIHsKKyAgICAvLyBXZSBzaG91bGRuJ3QgYmUgaW4gYSBzdGF0ZSB0cmFuc2l0aW9uIGFscmVhZHkuCisgICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpbVRhcmdldFN0YXRlKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClzdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgICAgICBDSEVDSyhzdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQgfHwgc3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUV4ZWN1dGluZzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClzdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvblBvcnRGbHVzaChpLCBmYWxzZSAvKiBzZW5kRmx1c2hDb21wbGV0ZSAqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIHN0YXRlLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgbVRhcmdldFN0YXRlID0gc3RhdGU7CisKKyAgICBjaGVja1RyYW5zaXRpb25zKCk7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25Qb3J0RW5hYmxlKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZSkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworICAgIENIRUNLKHBvcnQtPm1EZWYuYkVuYWJsZWQgPT0gIWVuYWJsZSk7CisKKyAgICBpZiAoIWVuYWJsZSkgeworICAgICAgICBwb3J0LT5tRGVmLmJFbmFibGVkID0gT01YX0ZBTFNFOworICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpESVNBQkxJTkc7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqYnVmZmVyID0gJnBvcnQtPm1CdWZmZXJzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1Pd25lZEJ5VXMpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShidWZmZXItPm1IZWFkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKHBvcnQtPm1EZWYuZURpciwgT01YX0Rpck91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKGJ1ZmZlci0+bUhlYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcG9ydC0+bVF1ZXVlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9ydC0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6RU5BQkxJTkc7CisgICAgfQorCisgICAgY2hlY2tUcmFuc2l0aW9ucygpOworfQorCit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEZsdXNoKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBzZW5kRmx1c2hDb21wbGV0ZSkgeworICAgIGlmIChwb3J0SW5kZXggPT0gT01YX0FMTCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qb3J0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgb25Qb3J0Rmx1c2goaSwgc2VuZEZsdXNoQ29tcGxldGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbmRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kRmx1c2gsIE9NWF9BTEwsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisKKyAgICBQb3J0SW5mbyAqcG9ydCA9ICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworICAgIENIRUNLX0VRKChpbnQpcG9ydC0+bVRyYW5zaXRpb24sIChpbnQpUG9ydEluZm86Ok5PTkUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5tQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBCdWZmZXJJbmZvICpidWZmZXIgPSAmcG9ydC0+bUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoIWJ1ZmZlci0+bU93bmVkQnlVcykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBidWZmZXItPm1IZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHBvcnQtPm1EZWYuZURpciA9PSBPTVhfRGlySW5wdXQpIHsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShidWZmZXItPm1IZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfRVEocG9ydC0+bURlZi5lRGlyLCBPTVhfRGlyT3V0cHV0KTsKKworICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUoYnVmZmVyLT5tSGVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvcnQtPm1RdWV1ZS5jbGVhcigpOworCisgICAgaWYgKHNlbmRGbHVzaENvbXBsZXRlKSB7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRGbHVzaCwgcG9ydEluZGV4LCBOVUxMKTsKKworICAgICAgICBvblBvcnRGbHVzaENvbXBsZXRlZChwb3J0SW5kZXgpOworICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpjaGVja1RyYW5zaXRpb25zKCkgeworICAgIGlmIChtU3RhdGUgIT0gbVRhcmdldFN0YXRlKSB7CisgICAgICAgIGJvb2wgdHJhbnNpdGlvbkNvbXBsZXRlID0gdHJ1ZTsKKworICAgICAgICBpZiAobVN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltVGFyZ2V0U3RhdGUsIChpbnQpT01YX1N0YXRlSWRsZSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgUG9ydEluZm8gJnBvcnQgPSBtUG9ydHMuaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChwb3J0Lm1EZWYuYkVuYWJsZWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwb3J0Lm1EZWYuYlBvcHVsYXRlZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVGFyZ2V0U3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClPTVhfU3RhdGVJZGxlKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9ydHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBQb3J0SW5mbyAmcG9ydCA9IG1Qb3J0cy5pdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHBvcnQubURlZi5iRW5hYmxlZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZV90IG4gPSBwb3J0Lm1CdWZmZXJzLnNpemUoKTsKKworICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19MRShuLCBwb3J0Lm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBwb3J0Lm1EZWYubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KXBvcnQubURlZi5iUG9wdWxhdGVkLCAoaW50KU9NWF9UUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpcG9ydC5tRGVmLmJQb3B1bGF0ZWQsIChpbnQpT01YX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Db21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNpdGlvbkNvbXBsZXRlKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBtVGFyZ2V0U3RhdGU7CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgbVN0YXRlLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvcnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBvcnRJbmZvICpwb3J0ID0gJm1Qb3J0cy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChwb3J0LT5tVHJhbnNpdGlvbiA9PSBQb3J0SW5mbzo6RElTQUJMSU5HKSB7CisgICAgICAgICAgICBpZiAocG9ydC0+bUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExPR1YoIlBvcnQgJWQgbm93IGRpc2FibGVkLiIsIGkpOworCisgICAgICAgICAgICAgICAgcG9ydC0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIGksIE5VTEwpOworCisgICAgICAgICAgICAgICAgb25Qb3J0RW5hYmxlQ29tcGxldGVkKGksIGZhbHNlIC8qIGVuYWJsZWQgKi8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBvcnQtPm1UcmFuc2l0aW9uID09IFBvcnRJbmZvOjpFTkFCTElORykgeworICAgICAgICAgICAgaWYgKHBvcnQtPm1EZWYuYlBvcHVsYXRlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIExPR1YoIlBvcnQgJWQgbm93IGVuYWJsZWQuIiwgaSk7CisKKyAgICAgICAgICAgICAgICBwb3J0LT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOworICAgICAgICAgICAgICAgIHBvcnQtPm1EZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50Q21kQ29tcGxldGUsIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgaSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBvblBvcnRFbmFibGVDb21wbGV0ZWQoaSwgdHJ1ZSAvKiBlbmFibGVkICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjphZGRQb3J0KGNvbnN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgJmRlZikgeworICAgIENIRUNLX0VRKGRlZi5uUG9ydEluZGV4LCBtUG9ydHMuc2l6ZSgpKTsKKworICAgIG1Qb3J0cy5wdXNoKCk7CisgICAgUG9ydEluZm8gKmluZm8gPSAmbVBvcnRzLmVkaXRJdGVtQXQobVBvcnRzLnNpemUoKSAtIDEpOworICAgIGluZm8tPm1EZWYgPSBkZWY7CisgICAgaW5mby0+bVRyYW5zaXRpb24gPSBQb3J0SW5mbzo6Tk9ORTsKK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit9CisKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK30KKwordm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpvblBvcnRFbmFibGVDb21wbGV0ZWQoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKK30KKworTGlzdDxTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpCdWZmZXJJbmZvICo+ICYKK1NpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldFBvcnRRdWV1ZShPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisgICAgcmV0dXJuIG1Qb3J0cy5lZGl0SXRlbUF0KHBvcnRJbmRleCkubVF1ZXVlOworfQorCitTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpQb3J0SW5mbyAqU2ltcGxlU29mdE9NWENvbXBvbmVudDo6ZWRpdFBvcnRJbmZvKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLX0xUKHBvcnRJbmRleCwgbVBvcnRzLnNpemUoKSk7CisgICAgcmV0dXJuICZtUG9ydHMuZWRpdEl0ZW1BdChwb3J0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhDb21wb25lbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU29mdE9NWENvbXBvbmVudDo6U29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogbU5hbWUobmFtZSksCisgICAgICBtQ2FsbGJhY2tzKGNhbGxiYWNrcyksCisgICAgICBtQ29tcG9uZW50KG5ldyBPTVhfQ09NUE9ORU5UVFlQRSksCisgICAgICBtTGliSGFuZGxlKE5VTEwpIHsKKyAgICBtQ29tcG9uZW50LT5uU2l6ZSA9IHNpemVvZigqbUNvbXBvbmVudCk7CisgICAgbUNvbXBvbmVudC0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICBtQ29tcG9uZW50LT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIG1Db21wb25lbnQtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBtQ29tcG9uZW50LT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKyAgICBtQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9IHRoaXM7CisgICAgbUNvbXBvbmVudC0+cEFwcGxpY2F0aW9uUHJpdmF0ZSA9IGFwcERhdGE7CisKKyAgICBtQ29tcG9uZW50LT5HZXRDb21wb25lbnRWZXJzaW9uID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5TZW5kQ29tbWFuZCA9IFNlbmRDb21tYW5kV3JhcHBlcjsKKyAgICBtQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgPSBHZXRQYXJhbWV0ZXJXcmFwcGVyOworICAgIG1Db21wb25lbnQtPlNldFBhcmFtZXRlciA9IFNldFBhcmFtZXRlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+R2V0Q29uZmlnID0gR2V0Q29uZmlnV3JhcHBlcjsKKyAgICBtQ29tcG9uZW50LT5TZXRDb25maWcgPSBTZXRDb25maWdXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ID0gR2V0RXh0ZW5zaW9uSW5kZXhXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkdldFN0YXRlID0gR2V0U3RhdGVXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkNvbXBvbmVudFR1bm5lbFJlcXVlc3QgPSBOVUxMOworICAgIG1Db21wb25lbnQtPlVzZUJ1ZmZlciA9IFVzZUJ1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+QWxsb2NhdGVCdWZmZXIgPSBBbGxvY2F0ZUJ1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+RnJlZUJ1ZmZlciA9IEZyZWVCdWZmZXJXcmFwcGVyOworICAgIG1Db21wb25lbnQtPkVtcHR5VGhpc0J1ZmZlciA9IEVtcHR5VGhpc0J1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+RmlsbFRoaXNCdWZmZXIgPSBGaWxsVGhpc0J1ZmZlcldyYXBwZXI7CisgICAgbUNvbXBvbmVudC0+U2V0Q2FsbGJhY2tzID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgPSBOVUxMOworICAgIG1Db21wb25lbnQtPlVzZUVHTEltYWdlID0gTlVMTDsKKyAgICBtQ29tcG9uZW50LT5Db21wb25lbnRSb2xlRW51bSA9IE5VTEw7CisKKyAgICAqY29tcG9uZW50ID0gbUNvbXBvbmVudDsKK30KKworU29mdE9NWENvbXBvbmVudDo6flNvZnRPTVhDb21wb25lbnQoKSB7CisgICAgZGVsZXRlIG1Db21wb25lbnQ7CisgICAgbUNvbXBvbmVudCA9IE5VTEw7Cit9CisKK3ZvaWQgU29mdE9NWENvbXBvbmVudDo6c2V0TGliSGFuZGxlKHZvaWQgKmxpYkhhbmRsZSkgeworICAgIENIRUNLKGxpYkhhbmRsZSAhPSBOVUxMKTsKKyAgICBtTGliSGFuZGxlID0gbGliSGFuZGxlOworfQorCit2b2lkICpTb2Z0T01YQ29tcG9uZW50OjpsaWJIYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaWJIYW5kbGU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitjb25zdCBjaGFyICpTb2Z0T01YQ29tcG9uZW50OjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtTmFtZS5jX3N0cigpOworfQorCit2b2lkIFNvZnRPTVhDb21wb25lbnQ6Om5vdGlmeSgKKyAgICAgICAgT01YX0VWRU5UVFlQRSBldmVudCwKKyAgICAgICAgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMiwgT01YX1BUUiBkYXRhKSB7CisgICAgKCptQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnBBcHBsaWNhdGlvblByaXZhdGUsCisgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgIGRhdGExLAorICAgICAgICAgICAgZGF0YTIsCisgICAgICAgICAgICBkYXRhKTsKK30KKwordm9pZCBTb2Z0T01YQ29tcG9uZW50Ojpub3RpZnlFbXB0eUJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgICgqbUNhbGxiYWNrcy0+RW1wdHlCdWZmZXJEb25lKSgKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1Db21wb25lbnQtPnBBcHBsaWNhdGlvblByaXZhdGUsIGhlYWRlcik7Cit9CisKK3ZvaWQgU29mdE9NWENvbXBvbmVudDo6bm90aWZ5RmlsbEJ1ZmZlckRvbmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgeworICAgICgqbUNhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUpKAorICAgICAgICAgICAgbUNvbXBvbmVudCwgbUNvbXBvbmVudC0+cEFwcGxpY2F0aW9uUHJpdmF0ZSwgaGVhZGVyKTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OlNlbmRDb21tYW5kV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLAorICAgICAgICBPTVhfVTMyIHBhcmFtLAorICAgICAgICBPTVhfUFRSIGRhdGEpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPnNlbmRDb21tYW5kKGNtZCwgcGFyYW0sIGRhdGEpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+Z2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6U2V0UGFyYW1ldGVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+c2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0Q29uZmlnV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+Z2V0Q29uZmlnKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6U2V0Q29uZmlnV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LAorICAgICAgICBPTVhfUFRSIHBhcmFtcykgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+c2V0Q29uZmlnKGluZGV4LCBwYXJhbXMpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6R2V0RXh0ZW5zaW9uSW5kZXhXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKKyAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OlVzZUJ1ZmZlcldyYXBwZXIoCisgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPnVzZUJ1ZmZlcihidWZmZXIsIHBvcnRJbmRleCwgYXBwUHJpdmF0ZSwgc2l6ZSwgcHRyKTsKK30KKworLy8gc3RhdGljCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OkFsbG9jYXRlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgT01YX1UzMiBzaXplKSB7CisgICAgU29mdE9NWENvbXBvbmVudCAqbWUgPQorICAgICAgICAoU29mdE9NWENvbXBvbmVudCAqKQorICAgICAgICAgICAgKChPTVhfQ09NUE9ORU5UVFlQRSAqKWNvbXBvbmVudCktPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcmV0dXJuIG1lLT5hbGxvY2F0ZUJ1ZmZlcihidWZmZXIsIHBvcnRJbmRleCwgYXBwUHJpdmF0ZSwgc2l6ZSk7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpGcmVlQnVmZmVyV3JhcHBlcigKKyAgICAgICAgT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHJldHVybiBtZS0+ZnJlZUJ1ZmZlcihwb3J0SW5kZXgsIGJ1ZmZlcik7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpFbXB0eVRoaXNCdWZmZXJXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmVtcHR5VGhpc0J1ZmZlcihidWZmZXIpOworfQorCisvLyBzdGF0aWMKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6RmlsbFRoaXNCdWZmZXJXcmFwcGVyKAorICAgICAgICBPTVhfSEFORExFVFlQRSBjb21wb25lbnQsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmZpbGxUaGlzQnVmZmVyKGJ1ZmZlcik7Cit9CisKKy8vIHN0YXRpYworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpHZXRTdGF0ZVdyYXBwZXIoCisgICAgICAgIE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwKKyAgICAgICAgT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICBTb2Z0T01YQ29tcG9uZW50ICptZSA9CisgICAgICAgIChTb2Z0T01YQ29tcG9uZW50ICopCisgICAgICAgICAgICAoKE9NWF9DT01QT05FTlRUWVBFICopY29tcG9uZW50KS0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICByZXR1cm4gbWUtPmdldFN0YXRlKHN0YXRlKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZW5kQ29tbWFuZCgKKyAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSwgT01YX1BUUiBkYXRhKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAorICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCisgICAgICAgIE9NWF9VMzIgc2l6ZSwKKyAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmFsbG9jYXRlQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCisgICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKKyAgICAgICAgT01YX1UzMiBzaXplKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmcmVlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzNmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhQbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0T01YUGx1Z2luLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICBjb25zdCBjaGFyICptTGliTmFtZVN1ZmZpeDsKKyAgICBjb25zdCBjaGFyICptUm9sZTsKKworfSBrQ29tcG9uZW50c1tdID0geworICAgIHsgIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAiYWFjZGVjIiwgImF1ZGlvX2RlY29kZXIuYWFjIiB9LAorICAgIHsgIk9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIsICJhbXJkZWMiLCAiYXVkaW9fZGVjb2Rlci5hbXJuYiIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1yd2IiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJtcGVnNGRlYyIsICJ2aWRlb19kZWNvZGVyLmgyNjMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiwgIm1wZWc0ZGVjIiwgInZpZGVvX2RlY29kZXIubXBlZzQiIH0sCisgICAgeyAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIsICJtcDNkZWMiLCAiYXVkaW9fZGVjb2Rlci5tcDMiIH0sCisgICAgeyAiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJ2b3JiaXNkZWMiLCAiYXVkaW9fZGVjb2Rlci52b3JiaXMiIH0sCisgICAgeyAiT01YLmdvb2dsZS52cHguZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cHgiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1Db21wb25lbnRzID0KKyAgICBzaXplb2Yoa0NvbXBvbmVudHMpIC8gc2l6ZW9mKGtDb21wb25lbnRzWzBdKTsKKworU29mdE9NWFBsdWdpbjo6U29mdE9NWFBsdWdpbigpIHsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T01YUGx1Z2luOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIExPR1YoIm1ha2VDb21wb25lbnRJbnN0YW5jZSAnJXMnIiwgbmFtZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1Db21wb25lbnRzOyArK2kpIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrQ29tcG9uZW50c1tpXS5tTmFtZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyBsaWJOYW1lID0gImxpYnN0YWdlZnJpZ2h0X3NvZnRfIjsKKyAgICAgICAgbGliTmFtZS5hcHBlbmQoa0NvbXBvbmVudHNbaV0ubUxpYk5hbWVTdWZmaXgpOworICAgICAgICBsaWJOYW1lLmFwcGVuZCgiLnNvIik7CisKKyAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1cpOworCisgICAgICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgidW5hYmxlIHRvIGRsb3BlbiAlcyIsIGxpYk5hbWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgU29mdE9NWENvbXBvbmVudCAqKCpDcmVhdGVTb2Z0T01YQ29tcG9uZW50RnVuYykoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICosCisgICAgICAgICAgICAgICAgT01YX1BUUiwgT01YX0NPTVBPTkVOVFRZUEUgKiopOworCisgICAgICAgIENyZWF0ZVNvZnRPTVhDb21wb25lbnRGdW5jIGNyZWF0ZVNvZnRPTVhDb21wb25lbnQgPQorICAgICAgICAgICAgKENyZWF0ZVNvZnRPTVhDb21wb25lbnRGdW5jKWRsc3ltKAorICAgICAgICAgICAgICAgICAgICBsaWJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICJfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFIgorICAgICAgICAgICAgICAgICAgICAiUHZQUDE3T01YX0NPTVBPTkVOVFRZUEUiKTsKKworICAgICAgICBpZiAoY3JlYXRlU29mdE9NWENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgICAgICBsaWJIYW5kbGUgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxTb2Z0T01YQ29tcG9uZW50PiBjb2RlYyA9CisgICAgICAgICAgICAoKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQpKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKworICAgICAgICBpZiAoY29kZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgICAgICAgICAgbGliSGFuZGxlID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfQorCisgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gY29kZWMtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgIGxpYkhhbmRsZSA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjb2RlYy0+aW5jU3Ryb25nKHRoaXMpOworICAgICAgICBjb2RlYy0+c2V0TGliSGFuZGxlKGxpYkhhbmRsZSk7CisKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPTVhQbHVnaW46OmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgeworICAgIFNvZnRPTVhDb21wb25lbnQgKm1lID0KKyAgICAgICAgKFNvZnRPTVhDb21wb25lbnQgKikKKyAgICAgICAgICAgICgoT01YX0NPTVBPTkVOVFRZUEUgKiljb21wb25lbnQpLT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIG1lLT5wcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKTsKKworICAgIHZvaWQgKmxpYkhhbmRsZSA9IG1lLT5saWJIYW5kbGUoKTsKKworICAgIENIRUNLX0VRKG1lLT5nZXRTdHJvbmdDb3VudCgpLCAxKTsKKyAgICBtZS0+ZGVjU3Ryb25nKHRoaXMpOworICAgIG1lID0gTlVMTDsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICBsaWJIYW5kbGUgPSBOVUxMOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgT01YX1UzMiBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBrTnVtQ29tcG9uZW50cykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgIH0KKworICAgIHN0cmNweShuYW1lLCBrQ29tcG9uZW50c1tpbmRleF0ubU5hbWUpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bUNvbXBvbmVudHM7ICsraSkgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtDb21wb25lbnRzW2ldLm1OYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICByb2xlcy0+Y2xlYXIoKTsKKyAgICAgICAgcm9sZXMtPnB1c2goU3RyaW5nOChrQ29tcG9uZW50c1tpXS5tUm9sZSkpOworCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2MzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfT01YX1BMVUdJTl9IXworCisjZGVmaW5lIFNPRlRfT01YX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdE9NWFBsdWdpbiA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKKyAgICBTb2Z0T01YUGx1Z2luKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRPTVhQbHVnaW4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX09NWF9QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCA0ZjI4ODU1Li5kNDM1NGRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgpAQCAtNDU0LDYgKzQ1NSw3IEBACiAgICAgICAgIHsgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvL2F2YyIgfSwKICAgICAgICAgeyAidmlkZW9fZGVjb2Rlci5tcGVnNCIsICJ2aWRlby9tcDR2LWVzIiB9LAogICAgICAgICB7ICJ2aWRlb19kZWNvZGVyLmgyNjMiLCAidmlkZW8vM2dwcCIgfSwKKyAgICAgICAgeyAidmlkZW9fZGVjb2Rlci52cHgiLCAidmlkZW8veC12bmQub24yLnZwOCIgfSwKIAogICAgICAgICAvLyB3ZSBhcHBlYXIgdG8gdXNlIHRoaXMgYXMgYSBzeW5vbnltIHRvIGFtcm5iLgogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFtciIsICJhdWRpby8zZ3BwIiB9LApAQCAtNDYxLDcgKzQ2MywxMCBAQAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFtcm5iIiwgImF1ZGlvLzNncHAiIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuYW1yd2IiLCAiYXVkaW8vYW1yLXdiIiB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpby9tcDRhLWxhdG0iIH0sCi0gICAgICAgIHsgImF1ZGlvX2RlY29kZXIubXAzIiwgImF1ZGlvL21wZWciIH0KKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5tcDMiLCAiYXVkaW8vbXBlZyIgfSwKKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW8vdm9yYmlzIiB9LAorICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXIH0sCisgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcgfSwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa1JvbGVUb01pbWUpIC8gc2l6ZW9mKGtSb2xlVG9NaW1lWzBdKTsgKytpKSB7CkBAIC00ODAsMjEgKzQ4NSwyMyBAQAogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1pbWVUb1VSTCBrTWltZVRvVVJMW10gPSB7CiAgICAgICAgIHsgInZpZGVvL2F2YyIsCi0gICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjY0X0FBQy4zZ3AiIH0sCi0gICAgICAgIHsgInZpZGVvL21wNHYtZXMiLCAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2dpbmdlcmtpZHMuTVA0IiB9LAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2NF81MDBfQUFDXzEyOC4zZ3AiIH0sCisgICAgICAgIHsgInZpZGVvL21wNHYtZXMiLCAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL01QRUc0XzMyMF9BQUNfNjQubXA0IiB9LAogICAgICAgICB7ICJ2aWRlby8zZ3BwIiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjNfNTAwX0FNUk5CXzEyLjNncCIgfSwKICAgICAgICAgeyAiYXVkaW8vM2dwcCIsCiAgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjYzXzUwMF9BTVJOQl8xMi4zZ3AiIH0sCi0gICAgICAgIHsgImF1ZGlvL2Ftci13YiIsCi0gICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FNUldCLyIKLSAgICAgICAgICAiTklOX0FNUi1XQl8xNS44NWticHNfMTZrYnBzLmFtciIgfSwKKyAgICAgICAgeyAiYXVkaW8vYW1yLXdiIiwgTlVMTCB9LAogICAgICAgICB7ICJhdWRpby9tcDRhLWxhdG0iLAotICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvIgotICAgICAgICAgICJXQ19BQUNfODBrYnBzXzMya2h6X1N0ZXJlb18xcENCUl9TU0UubXA0IiB9LAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2M181Nl9BQUNfMjQuM2dwIiB9LAogICAgICAgICB7ICJhdWRpby9tcGVnIiwKLSAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzLyIKLSAgICAgICAgICAiV0NfMjU2a2Jwc180NC4xa2h6X21vbm9fQ0JSX0RQQS5tcDMiIH0KKyAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19DQlIubXAzIiB9LAorICAgICAgICB7ICJhdWRpby92b3JiaXMiLCBOVUxMIH0sCisgICAgICAgIHsgInZpZGVvL3gtdm5kLm9uMi52cDgiLAorICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vYmlnLWJ1Y2stYnVubnlfdHJhaWxlci53ZWJtIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgImZpbGU6Ly8vc2RjYXJkL00xRjEtQWxhdy1BRnNwLndhdiIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCisgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL00xRjEtbXVsYXctQUZzcC53YXYiIH0sCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtNaW1lVG9VUkwpIC8gc2l6ZW9mKGtNaW1lVG9VUkxbMF0pOyArK2kpIHsKQEAgLTYyNiw4ICs2MzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlZWtUaW1lVXMsIHJlcXVlc3RlZFNlZWtUaW1lVXMgLyAxRTYpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocmVxdWVzdGVkU2Vla1RpbWVVcyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKTsKKwogICAgICAgICAgICAgaWYgKHNlZWtTb3VyY2UtPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnVmZmVyLCBOVUxMKTsKICAgICAgICAgICAgICAgICBhY3R1YWxTZWVrVGltZVVzID0gLTE7CkBAIC03NDYsNiArNzU1LDEwIEBACiAgICAgICAgIGNvbnN0IElPTVg6OkNvbXBvbmVudEluZm8gJmluZm8gPSAqaXQ7CiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBpbmZvLm1OYW1lLnN0cmluZygpOwogCisgICAgICAgIGlmIChzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguZ29vZ2xlLiIsIDExKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKExpc3Q8U3RyaW5nOD46OmNvbnN0X2l0ZXJhdG9yIHJvbGVfaXQgPSBpbmZvLm1Sb2xlcy5iZWdpbigpOwogICAgICAgICAgICAgIHJvbGVfaXQgIT0gaW5mby5tUm9sZXMuZW5kKCk7ICsrcm9sZV9pdCkgewogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSA9ICgqcm9sZV9pdCkuc3RyaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCA2ODE5ZmVmLi5hMDI1OTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTMyOSw3ICszMjksNyBAQAogICAgIHJldHVybiBkc3Q7CiB9CiAKLXN0YXRpYyBib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKK3N0YXRpYyBib29sIEV4dHJhY3REaW1lbnNpb25zTVBFRzRDb25maWcoCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZjb25maWcsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKICAgICAqd2lkdGggPSAwOwogICAgICpoZWlnaHQgPSAwOwpAQCAtMzUyLDg3ICszNTIsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIoJnB0cltvZmZzZXQgKyA0XSwgY29uZmlnLT5zaXplKCkgLSBvZmZzZXQgLSA0KTsKLSAgICBici5za2lwQml0cygxKTsgIC8vIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSBici5nZXRCaXRzKDgpOwotCi0gICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKLQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHk7Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKLSAgICB9Ci0gICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOwotICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgewotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl93aWR0aAotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl9oZWlnaHQKLSAgICB9Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMKLSAgICAgICAgYnIuc2tpcEJpdHMoMik7ICAvLyBjaHJvbWFfZm9ybWF0Ci0gICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gbG93X2RlbGF5Ci0gICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2YnZfcGFyYW1ldGVycwotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygzKTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTEpOyAgLy8gZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5Ci0gICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICB9Ci0gICAgfQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGJyLmdldEJpdHMoMik7Ci0gICAgQ0hFQ0tfRVEodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlLCAweDAwdSAvKiByZWN0YW5ndWxhciAqLyk7Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA9IGJyLmdldEJpdHMoMTYpOwotICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotCi0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZpeGVkX3ZvcF9yYXRlCi0gICAgICAgIC8vIHJhbmdlIFswLi52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbikKLQotICAgICAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbgotICAgICAgICAvLyAyID0+IDAuLjEsIDEgYml0Ci0gICAgICAgIC8vIDMgPT4gMC4uMiwgMiBiaXRzCi0gICAgICAgIC8vIDQgPT4gMC4uMywgMiBiaXRzCi0gICAgICAgIC8vIDUgPT4gMC4uNCwgMyBiaXRzCi0gICAgICAgIC8vIC4uLgotCi0gICAgICAgIENIRUNLX0dUKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCAwdSk7Ci0gICAgICAgIC0tdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb247Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtQml0cyA9IDA7Ci0gICAgICAgIHdoaWxlICh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+IDApIHsKLSAgICAgICAgICAgICsrbnVtQml0czsKLSAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4+PSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgYnIuc2tpcEJpdHMobnVtQml0cyk7ICAvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQKLSAgICB9Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSBici5nZXRCaXRzKDEzKTsKLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7Ci0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0KLSAgICB1bnNpZ25lZCBpbnRlcmxhY2VkID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKLSAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKLQotICAgIExPR0koIlZPTCBkaW1lbnNpb25zID0gJWR4JWQiLCAqd2lkdGgsICpoZWlnaHQpOwotCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgICAgICZwdHJbb2Zmc2V0XSwgY29uZmlnLT5zaXplKCkgLSBvZmZzZXQsIHdpZHRoLCBoZWlnaHQpOwogfQogCi1zcDxBQnVmZmVyPiBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKAorc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VNUEVHNFZpZGVvQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtcywgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgewogICAgICp3aWR0aCA9IDA7CiAgICAgKmhlaWdodCA9IDA7CkBAIC00NDMsMTAgKzM2NywxMiBAQAogICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGRlY29kZUhleCh2YWwpOwogICAgIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKIAotICAgIGlmICghRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKGNvbmZpZywgd2lkdGgsIGhlaWdodCkpIHsKKyAgICBpZiAoIUV4dHJhY3REaW1lbnNpb25zTVBFRzRDb25maWcoY29uZmlnLCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBMT0dJKCJWT0wgZGltZW5zaW9ucyA9ICVkeCVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKKwogICAgIHNpemVfdCBsZW4xID0gY29uZmlnLT5zaXplKCkgKyBHZXRTaXplV2lkdGgoY29uZmlnLT5zaXplKCkpICsgMTsKICAgICBzaXplX3QgbGVuMiA9IGxlbjEgKyBHZXRTaXplV2lkdGgobGVuMSkgKyAxICsgMTM7CiAgICAgc2l6ZV90IGxlbjMgPSBsZW4yICsgR2V0U2l6ZVdpZHRoKGxlbjIpICsgMSArIDM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggMDc0MDUxNS4uYjM5OGM5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMjAsNiArMjAsOCBAQAogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zMiwxOCArMzQsMjMgQEAKICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIAorI2luY2x1ZGUgIkhUVFBCYXNlLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IEFSVFNQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBsbDsKIAotQVJUU1BDb25uZWN0aW9uOjpBUlRTUENvbm5lY3Rpb24oKQotICAgIDogbVN0YXRlKERJU0NPTk5FQ1RFRCksCitBUlRTUENvbm5lY3Rpb246OkFSVFNQQ29ubmVjdGlvbihib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCisgICAgOiBtVUlEVmFsaWQodWlkVmFsaWQpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCiAgICAgICBtQXV0aFR5cGUoTk9ORSksCiAgICAgICBtU29ja2V0KC0xKSwKICAgICAgIG1Db25uZWN0aW9uSUQoMCksCiAgICAgICBtTmV4dENTZXEoMCksCiAgICAgICBtUmVjZWl2ZVJlc3BvbnNlRXZlbnRQZW5kaW5nKGZhbHNlKSB7CisgICAgTWFrZVVzZXJBZ2VudCgmbVVzZXJBZ2VudCk7CiB9CiAKIEFSVFNQQ29ubmVjdGlvbjo6fkFSVFNQQ29ubmVjdGlvbigpIHsKQEAgLTI0Myw2ICsyNTAsMTAgQEAKIAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCisgICAgaWYgKG1VSURWYWxpZCkgeworICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyKG1Tb2NrZXQsIG1VSUQpOworICAgIH0KKwogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CiAKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlOwpAQCAtMzc4LDYgKzM4OSw3IEBACiAgICAgcmVwbHktPnNldFN0cmluZygib3JpZ2luYWwtcmVxdWVzdCIsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwogCiAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QpOworICAgIGFkZFVzZXJBZ2VudCgmcmVxdWVzdCk7CiAKICAgICAvLyBGaW5kIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGhlYWRlcnMgYW5kIHRoZSBib2R5LgogICAgIHNzaXplX3QgaSA9IHJlcXVlc3QuZmluZCgiXHJcblxyXG4iKTsKQEAgLTk3OSw0ICs5OTEsMjcgQEAKICNlbmRpZgogfQogCisvLyBzdGF0aWMKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpNYWtlVXNlckFnZW50KEFTdHJpbmcgKnVzZXJBZ2VudCkgeworICAgIHVzZXJBZ2VudC0+Y2xlYXIoKTsKKyAgICB1c2VyQWdlbnQtPnNldFRvKCJVc2VyLUFnZW50OiBzdGFnZWZyaWdodC8xLjEgKExpbnV4O0FuZHJvaWQgIik7CisKKyNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKKyNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKKyNlbmRpZgorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7CisgICAgdXNlckFnZW50LT5hcHBlbmQodmFsdWUpOworICAgIHVzZXJBZ2VudC0+YXBwZW5kKCIpXHJcbiIpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6YWRkVXNlckFnZW50KEFTdHJpbmcgKnJlcXVlc3QpIGNvbnN0IHsKKyAgICAvLyBGaW5kIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGhlYWRlcnMgYW5kIHRoZSBib2R5LgorICAgIHNzaXplX3QgaSA9IHJlcXVlc3QtPmZpbmQoIlxyXG5cclxuIik7CisgICAgQ0hFQ0tfR0UoaSwgMCk7CisKKyAgICByZXF1ZXN0LT5pbnNlcnQobVVzZXJBZ2VudCwgaSArIDIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKaW5kZXggMGZlY2YzYzYuLjVjYjg0ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApAQCAtMzMsNyArMzMsNyBAQAogfTsKIAogc3RydWN0IEFSVFNQQ29ubmVjdGlvbiA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgQVJUU1BDb25uZWN0aW9uKCk7CisgICAgQVJUU1BDb25uZWN0aW9uKGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwgdWlkX3QgdWlkID0gMCk7CiAKICAgICB2b2lkIGNvbm5lY3QoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKICAgICB2b2lkIGRpc2Nvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CkBAIC03NCw2ICs3NCw4IEBACiAKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU2VsZWN0VGltZW91dFVzOwogCisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgQVN0cmluZyBtVXNlciwgbVBhc3M7CiAgICAgQXV0aFR5cGUgbUF1dGhUeXBlOwpAQCAtODcsNiArODksOCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1PYnNlcnZlQmluYXJ5TWVzc2FnZTsKIAorICAgIEFTdHJpbmcgbVVzZXJBZ2VudDsKKwogICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uRGlzY29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNvbXBsZXRlQ29ubmVjdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xMDYsNiArMTEwLDggQEAKICAgICBib29sIHBhcnNlQXV0aE1ldGhvZChjb25zdCBzcDxBUlRTUFJlc3BvbnNlPiAmcmVzcG9uc2UpOwogICAgIHZvaWQgYWRkQXV0aGVudGljYXRpb24oQVN0cmluZyAqcmVxdWVzdCk7CiAKKyAgICB2b2lkIGFkZFVzZXJBZ2VudChBU3RyaW5nICpyZXF1ZXN0KSBjb25zdDsKKwogICAgIHN0YXR1c190IGZpbmRQZW5kaW5nUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSwgc3NpemVfdCAqaW5kZXgpIGNvbnN0OwogCkBAIC0xMTQsNiArMTIwLDggQEAKICAgICBzdGF0aWMgYm9vbCBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgKngpOwogCisgICAgc3RhdGljIHZvaWQgTWFrZVVzZXJBZ2VudChBU3RyaW5nICp1c2VyQWdlbnQpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUU1BDb25uZWN0aW9uKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb250cm9sbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb250cm9sbGVyLmNwcAppbmRleCAxMzI4ZDJlLi4yZWJhZTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29udHJvbGxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbnRyb2xsZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiBBUlRTUENvbnRyb2xsZXI6OkFSVFNQQ29udHJvbGxlcihjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQogICAgIDogbVN0YXRlKERJU0NPTk5FQ1RFRCksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCisgICAgICBtVUlEVmFsaWQoZmFsc2UpLAogICAgICAgbVNlZWtEb25lQ2IoTlVMTCksCiAgICAgICBtU2Vla0RvbmVDb29raWUoTlVMTCksCiAgICAgICBtTGFzdFNlZWtDb21wbGV0ZWRUaW1lVXMoLTEpIHsKQEAgLTQwLDYgKzQxLDExIEBACiAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvci0+aWQoKSk7CiB9CiAKK3ZvaWQgQVJUU1BDb250cm9sbGVyOjpzZXRVSUQodWlkX3QgdWlkKSB7CisgICAgbVVJRFZhbGlkID0gdHJ1ZTsKKyAgICBtVUlEID0gdWlkOworfQorCiBzdGF0dXNfdCBBUlRTUENvbnRyb2xsZXI6OmNvbm5lY3QoY29uc3QgY2hhciAqdXJsKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtNDksNyArNTUsNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3REb25lLCBtUmVmbGVjdG9yLT5pZCgpKTsKIAotICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcih1cmwsIG1Mb29wZXIpOworICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcih1cmwsIG1Mb29wZXIsIG1VSURWYWxpZCwgbVVJRCk7CiAKICAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTVkOWM1Li43MWQ2OGY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAorI2luY2x1ZGUgIkhUVFBCYXNlLmgiCisKIC8vIElmIG5vIGFjY2VzcyB1bml0cyBhcmUgcmVjZWl2ZWQgd2l0aGluIDUgc2VjcywgYXNzdW1lIHRoYXQgdGhlIHJ0cAogLy8gc3RyZWFtIGhhcyBlbmRlZCBhbmQgc2lnbmFsIGVuZCBvZiBzdHJlYW0uCiBzdGF0aWMgaW50NjRfdCBrQWNjZXNzVW5pdFRpbWVvdXRVcyA9IDUwMDAwMDBsbDsKQEAgLTkyLDEwICs5NCwxNCBAQAogfQogCiBzdHJ1Y3QgTXlIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBNeUhhbmRsZXIoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQotICAgICAgICA6IG1Mb29wZXIobG9vcGVyKSwKKyAgICBNeUhhbmRsZXIoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApCisgICAgICAgIDogbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgICAgICBtVUlEKHVpZCksCisgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAogICAgICAgICAgIG1OZXRMb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgICAgIG1Db25uKG5ldyBBUlRTUENvbm5lY3Rpb24pLAorICAgICAgICAgIG1Db25uKG5ldyBBUlRTUENvbm5lY3Rpb24obVVJRFZhbGlkLCBtVUlEKSksCiAgICAgICAgICAgbVJUUENvbm4obmV3IEFSVFBDb25uZWN0aW9uKSwKICAgICAgICAgICBtT3JpZ2luYWxTZXNzaW9uVVJMKHVybCksCiAgICAgICAgICAgbVNlc3Npb25VUkwodXJsKSwKQEAgLTEwNzgsNiArMTA4NCw4IEBACiAgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUGFja2V0czsKICAgICB9OwogCisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFMb29wZXI+IG1OZXRMb29wZXI7CiAgICAgc3A8QVJUU1BDb25uZWN0aW9uPiBtQ29ubjsKQEAgLTExNzIsNiArMTE4MCwxMSBAQAogICAgICAgICAgICAgQVJUUENvbm5lY3Rpb246Ok1ha2VQb3J0UGFpcigKICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1SVFBTb2NrZXQsICZpbmZvLT5tUlRDUFNvY2tldCwgJnJ0cFBvcnQpOwogCisgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlcihpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHJ0cFBvcnQpOwogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIi0iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYThmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTMgQEAKKyMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9NT0RVTEUgOj0gU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgXAorCUR1bW15UmVjb3JkZXIuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliRUdMIFwKKwlsaWJHTEVTdjIgXAorCWxpYmFuZHJvaWQgXAorCWxpYmJpbmRlciBcCisJbGliY3V0aWxzIFwKKwlsaWJndWkgXAorCWxpYnN0bHBvcnQgXAorCWxpYnVpIFwKKwlsaWJ1dGlscyBcCisJbGlic3RhZ2VmcmlnaHQgXAorCWxpYnN0YWdlZnJpZ2h0X29teCBcCisJbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorCWxpYmd0ZXN0IFwKKwlsaWJndGVzdF9tYWluIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgYmlvbmljIFwKKyAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCisjIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCitpZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCitpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEdW1teVJlY29yZGVyIgorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlICJEdW1teVJlY29yZGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgKkR1bW15UmVjb3JkZXI6OnRocmVhZFdyYXBwZXIodm9pZCAqcHRoaXMpIHsKKyAgICBMT0dWKCJUaHJlYWRXcmFwcGVyOiAlcCIsIHB0aGlzKTsKKyAgICBEdW1teVJlY29yZGVyICp3cml0ZXIgPSBzdGF0aWNfY2FzdDxEdW1teVJlY29yZGVyICo+KHB0aGlzKTsKKyAgICB3cml0ZXItPnJlYWRGcm9tU291cmNlKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdHVzX3QgRHVtbXlSZWNvcmRlcjo6c3RhcnQoKSB7CisgICAgTE9HVigiU3RhcnQiKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICBtU291cmNlLT5zdGFydCgpOworCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgaW50IGVyciA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgdGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgaWYgKGVycikgeworICAgICAgICBMT0dFKCJFcnJvciBjcmVhdGluZyB0aHJlYWQhIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKworc3RhdHVzX3QgRHVtbXlSZWNvcmRlcjo6c3RvcCgpIHsKKyAgICBMT0dWKCJTdG9wIik7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICB2b2lkICpkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKyAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworCisgICAgTE9HVigiRW5kaW5nIHRoZSByZWFkaW5nIHRocmVhZCIpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8vIHByZXRlbmQgdG8gcmVhZCB0aGUgc291cmNlIGJ1ZmZlcnMKK3ZvaWQgRHVtbXlSZWNvcmRlcjo6cmVhZEZyb21Tb3VyY2UoKSB7CisgICAgTE9HVigiUmVhZEZyb21Tb3VyY2UiKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIExPR1YoIkEgZmFrZSB3cml0ZXIgYWNjZXNzaW5nIHRoZSBmcmFtZXMiKTsKKyAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcikpID09IE9LKXsKKyAgICAgICAgLy8gaWYgbm90IGdldHRpbmcgYSB2YWxpZCBidWZmZXIgZnJvbSBzb3VyY2UsIHRoZW4gZXhpdAorICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9Cit9CisKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JlYTFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERVTU1ZX1JFQ09SREVSX0hfCisjZGVmaW5lIERVTU1ZX1JFQ09SREVSX0hfCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhU291cmNlOworY2xhc3MgTWVkaWFCdWZmZXI7CisKK2NsYXNzIER1bW15UmVjb3JkZXIgeworICAgIHB1YmxpYzoKKyAgICAvLyBUaGUgbWVkaWEgc291cmNlIGZyb20gd2hpY2ggdGhpcyB3aWxsIHJlY2VpdmUgZnJhbWVzCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gYWN0dWFsIGVudHJ5IHBvaW50IGZvciB0aGUgdGhyZWFkCisgICAgdm9pZCByZWFkRnJvbVNvdXJjZSgpOworCisgICAgLy8gc3RhdGljIGZ1bmN0aW9uIHRvIHdyYXAgdGhlIGFjdHVhbCB0aHJlYWQgZW50cnkgcG9pbnQKKyAgICBzdGF0aWMgdm9pZCAqdGhyZWFkV3JhcHBlcih2b2lkICpwdGhpcyk7CisKKyAgICBEdW1teVJlY29yZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbVN0YXJ0ZWQoZmFsc2UpIHt9CisgICAgfkR1bW15UmVjb3JkZXIoICkge30KKworICAgIHByaXZhdGU6CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEdW1teVJlY29yZGVyKTsKK307CisKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzMmI2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KKworI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiRHVtbXlSZWNvcmRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorCisgICAgU3VyZmFjZU1lZGlhU291cmNlVGVzdCggKTogbVl1dlRleFdpZHRoKDY0KSwgbVl1dlRleEhlaWdodCg2NikgeyB9CisgICAgc3A8TVBFRzRXcml0ZXI+ICBzZXRVcFdyaXRlcihPTVhDbGllbnQgJmNsaWVudCApOworICAgIHZvaWQgb25lQnVmZmVyUGFzcyhpbnQgd2lkdGgsIGludCBoZWlnaHQgKTsKKyAgICBzdGF0aWMgdm9pZCBmaWxsWVYxMkJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgOworICAgIHN0YXRpYyB2b2lkIGZpbGxZVjEyQnVmZmVyUmVjdCh1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCYgcmVjdCkgOworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7CisgICAgICAgIG1TTVMtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChtU01TKTsKKyAgICAgICAgbUFOVyA9IG1TVEM7CisKKyAgICB9CisKKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICAgICAgbVNNUy5jbGVhcigpOworICAgICAgICBtU1RDLmNsZWFyKCk7CisgICAgICAgIG1BTlcuY2xlYXIoKTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgbVl1dlRleFdpZHRoOworICAgIGNvbnN0IGludCBtWXV2VGV4SGVpZ2h0OworCisgICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBtU01TOworICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiBtU1RDOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7CisKK307CisKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzcyhpbnQgd2lkdGgsIGludCBoZWlnaHQgKSB7CisgICAgTE9HVigiT25lIEJ1ZmZlciBQYXNzIik7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSk7CisgICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmxvY2tCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOworCisgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4KKyAgICB1aW50OF90KiBpbWcgPSBOVUxMOworICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7CisgICAgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6ZmlsbFlWMTJCdWZmZXIoaW1nLCB3aWR0aCwgaGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKKyAgICBidWYtPnVubG9jaygpOworCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Cit9CisKK3NwPE1QRUc0V3JpdGVyPiBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpzZXRVcFdyaXRlcihPTVhDbGllbnQgJmNsaWVudCApIHsKKyAgICAvLyBXcml0aW5nIHRvIGEgZmlsZQorICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvb3V0cHV0U3VyZkVuYy5tcDQiOworICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIDMwMDAwMCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIDMwKTsKKworICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU01TLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOworCisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAxKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7CisgICAgLy8gVE9ETzogb3ZlcndyaXRpbmcgdGhlIGNvbG9yZm9ybWF0IHNpbmNlIHRoZSBmb3JtYXQgc2V0IGJ5IEdSQWxsb2MKKyAgICAvLyBjb3VsZCBiZSB3cm9uZyBvciBub3QgYmUgcmVhZCBieSBPTVgKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKworCisgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPQorICAgICAgICBPTVhDb2RlYzo6Q3JlYXRlKAorICAgICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgbVNNUyk7CisKKyAgICBzcDxNUEVHNFdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZpbGVOYW1lKTsKKyAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKworICAgIHJldHVybiB3cml0ZXI7Cit9CisKKy8vIEZpbGwgYSBZVjEyIGJ1ZmZlciB3aXRoIGEgbXVsdGktY29sb3JlZCBjaGVja2VyYm9hcmQgcGF0dGVybgordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpmaWxsWVYxMkJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICAgIGNvbnN0IGludCBibG9ja1dpZHRoID0gdyA+IDE2ID8gdyAvIDE2IDogMTsKKyAgICBjb25zdCBpbnQgYmxvY2tIZWlnaHQgPSBoID4gMTYgPyBoIC8gMTYgOiAxOworICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKKyAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKKyAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiBoOworICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOworICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiBoLzI7CisgICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gYmxvY2tXaWR0aCkgJiAxOworICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvIGJsb2NrSGVpZ2h0KSAmIDE7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGludGVuc2l0eSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyA2MyA6IDE5MTsKKyAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRZICsgKHkgKiB5dXZUZXhTdHJpZGVZKSArIHhdID0gaW50ZW5zaXR5OworICAgICAgICAgICAgaWYgKHggPCB3IC8gMiAmJiB5IDwgaCAvIDIpIHsKKyAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IGludGVuc2l0eTsKKyAgICAgICAgICAgICAgICBpZiAoeCAqIDIgPCB3IC8gMiAmJiB5ICogMiA8IGggLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQorICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMF0gPQorICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBGaWxsIGEgWVYxMiBidWZmZXIgd2l0aCByZWQgb3V0c2lkZSBhIGdpdmVuIHJlY3RhbmdsZSBhbmQgZ3JlZW4gaW5zaWRlIGl0Lgordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpmaWxsWVYxMkJ1ZmZlclJlY3QodWludDhfdCogYnVmLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgc3RyaWRlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QmIHJlY3QpIHsKKyAgICBjb25zdCBpbnQgeXV2VGV4T2Zmc2V0WSA9IDA7CisgICAgaW50IHl1dlRleFN0cmlkZVkgPSBzdHJpZGU7CisgICAgaW50IHl1dlRleE9mZnNldFYgPSB5dXZUZXhTdHJpZGVZICogaDsKKyAgICBpbnQgeXV2VGV4U3RyaWRlViA9ICh5dXZUZXhTdHJpZGVZLzIgKyAweGYpICYgfjB4ZjsKKyAgICBpbnQgeXV2VGV4T2Zmc2V0VSA9IHl1dlRleE9mZnNldFYgKyB5dXZUZXhTdHJpZGVWICogaC8yOworICAgIGludCB5dXZUZXhTdHJpZGVVID0geXV2VGV4U3RyaWRlVjsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgYm9vbCBpbnNpZGUgPSByZWN0LmxlZnQgPD0geCAmJiB4IDwgcmVjdC5yaWdodCAmJgorICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA8PSB5ICYmIHkgPCByZWN0LmJvdHRvbTsKKyAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRZICsgKHkgKiB5dXZUZXhTdHJpZGVZKSArIHhdID0gaW5zaWRlID8gMjQwIDogNjQ7CisgICAgICAgICAgICBpZiAoeCA8IHcgLyAyICYmIHkgPCBoIC8gMikgeworICAgICAgICAgICAgICAgIGJvb2wgaW5zaWRlID0gcmVjdC5sZWZ0IDw9IDIqeCAmJiAyKnggPCByZWN0LnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA8PSAyKnkgJiYgMip5IDwgcmVjdC5ib3R0b207CisgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFUgKyAoeSAqIHl1dlRleFN0cmlkZVUpICsgeF0gPSAxNjsKKyAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5ICogeXV2VGV4U3RyaWRlVikgKyB4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPyAxNiA6IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30gIC8vLy8vLy8vLyBFbmQgb2YgY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlVGVzdAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyB0byBpbWl0YXRlIHRoZSByZWNvcmRpbmcgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdHJ1Y3QgU2ltcGxlRHVtbXlSZWNvcmRlciB7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworCisgICAgICAgIFNpbXBsZUR1bW15UmVjb3JkZXIKKyAgICAgICAgICAgICAgICAoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOiBtU291cmNlKHNvdXJjZSkge30KKworICAgICAgICBzdGF0dXNfdCBzdGFydCgpIHsgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KCk7fQorICAgICAgICBzdGF0dXNfdCBzdG9wKCkgIHsgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTt9CisKKyAgICAgICAgLy8gZmFrZXMgcmVhZGluZyBmcm9tIGEgbWVkaWEgc291cmNlCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tU291cmNlKCkgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgIFRFU1RTCisvLyBKdXN0IHBhc3Mgb25lIGJ1ZmZlciBmcm9tIHRoZSBuYXRpdmVfd2luZG93IHRvIHRoZSBTdXJmYWNlTWVkaWFTb3VyY2UKK1RFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCBFbmNvZGluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyTnBvdE9uZUJ1ZmZlclBhc3MpIHsKKyAgICBMT0dWKCJUZXN0aW5nIE9uZUJ1ZmZlclBhc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKKyAgICAgICAgICAgIDAsIDAsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKKyAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKKworICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKK30KKworLy8gUGFzcyB0aGUgYnVmZmVyIHdpdGggdGhlIHdyb25nIGhlaWdodCBhbmQgd2VpZ2h0IGFuZCBzaG91bGQgbm90IGJlIGFjY2VwdGVkCitURVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RXcm9uZ1NpemVCdWZmZXJQYXNzKSB7CisgICAgTE9HVigiVGVzdGluZyBXcm9uZyBzaXplIEJ1ZmZlclBhc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CisKKyAgICAvLyBzZXR0aW5nIHRoZSBjbGllbnQgc2lkZSBidWZmZXIgc2l6ZSBkaWZmZXJlbnQgdGhhbiB0aGUgc2VydmVyIHNpemUKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKKyAgICAgICAgICAgICAxMCwgMTAsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKKyAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKKworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKKworICAgIC8vIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gZXJyb3IgYmFjayB3aGVuIGRlcXVldWluZyEKKyAgICBBU1NFUlRfTkUoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOworfQorCisKKy8vIHBhc3MgbXVsdGlwbGUgYnVmZmVycyBmcm9tIHRoZSBuYXRpdmVfd2luZG93IHRoZSBTdXJmYWNlTWVkaWFTb3VyY2UKKy8vIEEgZHVtbXkgd3JpdGVyIGlzIHVzZWQgdG8gc2ltdWxhdGUgYWN0dWFsIE1QRUc0V3JpdGVyCitURVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgIEVuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90TXVsdGlCdWZmZXJQYXNzKSB7CisgICAgTE9HVigiVGVzdGluZyBNdWx0aUJ1ZmZlclBhc3MsIER1bW15IFJlY29yZGVyICoqKioqKioqKioqKioqKioqKioqKiIpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLAorICAgICAgICAgICAgMCwgMCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOworCisgICAgU2ltcGxlRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7CisgICAgd3JpdGVyLnN0YXJ0KCk7CisKKyAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDA7CisgICAgd2hpbGUgKG5GcmFtZXNDb3VudCA8IDMwMCkgeworICAgICAgICBvbmVCdWZmZXJQYXNzKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7CisKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCB3cml0ZXIucmVhZEZyb21Tb3VyY2UoKSk7CisKKyAgICAgICAgbkZyYW1lc0NvdW50Kys7CisgICAgfQorICAgIHdyaXRlci5zdG9wKCk7Cit9CisKKy8vIERlbGF5ZWQgcGFzcyBvZiBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQorLy8gQSBkdW1teSB3cml0ZXIgaXMgdXNlZCB0byBzaW11bGF0ZSBhY3R1YWwgTVBFRzRXcml0ZXIKK1RFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCAgRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RNdWx0aUJ1ZmZlclBhc3NMYWcpIHsKKyAgICBMT0dWKCJUZXN0aW5nIE11bHRpQnVmZmVyUGFzcywgRHVtbXkgUmVjb3JkZXIgTGFnZ2luZyAqKioqKioqKioqKioqKiIpOworCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCisgICAgICAgICAgICAwLCAwLCBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1BTlcuZ2V0KCksCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKSk7CisKKyAgICBTaW1wbGVEdW1teVJlY29yZGVyIHdyaXRlcihtU01TKTsKKyAgICB3cml0ZXIuc3RhcnQoKTsKKworICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMTsKKyAgICBjb25zdCBpbnQgRlJBTUVTX0xBRyA9IG1TTVMtPmdldEJ1ZmZlckNvdW50KCkgLSAxOworICAgIHdoaWxlIChuRnJhbWVzQ291bnQgPD0gMzAwKSB7CisgICAgICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKKyAgICAgICAgLy8gRm9yY2luZyB0aGUgd3JpdGVyIHRvIGxhZyBiZWhpbmQgYSBmZXcgZnJhbWVzCisgICAgICAgIGlmIChuRnJhbWVzQ291bnQgPiBGUkFNRVNfTEFHKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHdyaXRlci5yZWFkRnJvbVNvdXJjZSgpKTsKKyAgICAgICAgfQorICAgICAgICBuRnJhbWVzQ291bnQrKzsKKyAgICB9CisgICAgd3JpdGVyLnN0b3AoKTsKK30KKworLy8gcGFzcyBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQorLy8gQSBkdW1teSB3cml0ZXIgKE1VTFRJVEhSRUFERUQpIGlzIHVzZWQgdG8gc2ltdWxhdGUgYWN0dWFsIE1QRUc0V3JpdGVyCitURVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RNdWx0aUJ1ZmZlclBhc3NUaHJlYWRlZCkgeworICAgIExPR1YoIlRlc3RpbmcgTXVsdGlCdWZmZXJQYXNzLCBEdW1teSBSZWNvcmRlciBNdWx0aS1UaHJlYWRlZCAqKioqKioqKioqIik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCisgICAgICAgICAgICAwLCAwLCBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1BTlcuZ2V0KCksCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKSk7CisKKyAgICBEdW1teVJlY29yZGVyIHdyaXRlcihtU01TKTsKKyAgICB3cml0ZXIuc3RhcnQoKTsKKworICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKKyAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgeworICAgICAgICBvbmVCdWZmZXJQYXNzKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7CisKKyAgICAgICAgbkZyYW1lc0NvdW50Kys7CisgICAgfQorICAgIHdyaXRlci5zdG9wKCk7Cit9CisKKy8vIFRlc3QgdG8gZXhhbWluZSB0aGUgYWN0dWFsIGVuY29kaW5nLiBUZW1wb3JhcmlseSBkaXNhYmxlZCB0aWxsIHRoZQorLy8gY29sb3Jmb3JtYXQgYW5kIGVuY29kaW5nIGZyb20gR1JBbGxvYyBkYXRhIGlzIHJlc29sdmVkCitURVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRElTQUJMRURfRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RXcml0ZSkgeworICAgIExPR1YoIlRlc3RpbmcgdGhlIHdob2xlIHBpcGVsaW5lIHdpdGggYWN0dWFsIFJlY29yZGVyIik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCisgICAgICAgICAgICAwLCAwLCBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1BTlcuZ2V0KCksCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKSk7CisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBDSEVDS19FUShPSywgY2xpZW50LmNvbm5lY3QoKSk7CisKKyAgICBzcDxNUEVHNFdyaXRlcj4gd3JpdGVyID0gc2V0VXBXcml0ZXIoY2xpZW50KTsKKyAgICBpbnQ2NF90IHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIENIRUNLX0VRKE9LLCB3cml0ZXItPnN0YXJ0KCkpOworCisgICAgaW50MzJfdCBuRnJhbWVzQ291bnQgPSAwOworICAgIHdoaWxlIChuRnJhbWVzQ291bnQgPD0gMzAwKSB7CisgICAgICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKKyAgICAgICAgbkZyYW1lc0NvdW50Kys7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoT0ssIHdyaXRlci0+c3RvcCgpKTsKKyAgICB3cml0ZXIuY2xlYXIoKTsKKyAgICBpbnQ2NF90IGVuZCA9IHN5c3RlbVRpbWUoKTsKKyAgICBjbGllbnQuZGlzY29ubmVjdCgpOworfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkMGUxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRleHREZXNjcmlwdGlvbnMuY3BwICAgICAgXAorICAgICAgICBUaW1lZFRleHRQYXJzZXIuY3BwICAgICAgIFwKKyAgICAgICAgVGltZWRUZXh0UGxheWVyLmNwcAorCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWMxZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuY3BwCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczo6VGV4dERlc2NyaXB0aW9ucygpIHsKK30KKworc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBhcmNlbCAqcGFyY2VsKSB7CisgICAgcGFyY2VsLT5mcmVlRGF0YSgpOworCisgICAgaWYgKGZsYWdzICYgSU5fQkFORF9URVhUXzNHUFApIHsKKyAgICAgICAgaWYgKGZsYWdzICYgR0xPQkFMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHBhcmNlbCwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHRpbWVNcywgcGFyY2VsLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBPVVRfT0ZfQkFORF9URVhUX1NSVCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwYXJjZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLyBQYXJzZSB0aGUgU1JUIHRleHQgc2FtcGxlLCBhbmQgc3RvcmUgdGhlIHRpbWluZyBhbmQgdGV4dCBzYW1wbGUgaW4gYSBQYXJjZWwuCisvLyBUaGUgUGFyY2VsIHdpbGwgYmUgc2VudCB0byBNZWRpYVBsYXllci5qYXZhIHRocm91Z2ggZXZlbnQsIGFuZCB3aWxsIGJlCisvLyBwYXJzZWQgaW4gVGltZWRUZXh0LmphdmEuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGFyY2VsICpwYXJjZWwpIHsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX0xPQ0FMX1NFVFRJTkcpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RBUlRfVElNRSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHRpbWVNcyk7CisKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUUlVDVF9URVhUKTsKKyAgICAvLyB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBzYW1wbGUKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc2l6ZSk7CisgICAgLy8gd3JpdGUgdGhlIHRleHQgc2FtcGxlIGFzIGEgYnl0ZSBhcnJheQorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBwYXJjZWwtPndyaXRlKGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBFeHRyYWN0IHRoZSBsb2NhbCAzR1BQIGRpc3BsYXkgZGVzY3JpcHRpb25zLiAzR1BQIGxvY2FsIGRlc2NyaXB0aW9ucworLy8gYXJlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNhbXBsZSBpZiBhbnkuIFRoZSBkZXNjcmlwdGlvbnMgY291bGQgaW5jbHVkZQorLy8gaW5mb3JtYXRpb24gc3VjaCBhcyB0ZXh0IHN0eWxlcywgaGlnaGxpZ2h0cywga2FyYW9rZSBhbmQgc28gb24uIFRoZXkKKy8vIGFyZSBjb250YWluZWQgaW4gZGlmZmVyZW50IGJveGVzLCBzdWNoIGFzICdzdHlsJyBib3ggY29udGFpbnMgdGV4dAorLy8gc3R5bGVzLCBhbmQgJ2tyb2snIGJveCBjb250YWlucyBrYXJhb2tlIHRpbWluZyBhbmQgcG9zaXRpb25zLgorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczo6ZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICBpbnQgdGltZU1zLCBQYXJjZWwgKnBhcmNlbCwgaW50IGRlcHRoKSB7CisgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9MT0NBTF9TRVRUSU5HKTsKKworICAgICAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUQVJUX1RJTUUpOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIodGltZU1zKTsKKworICAgICAgICBzc2l6ZV90IHRleHRMZW4gPSAoKmRhdGEpIDw8IDggfCAoKihkYXRhICsgMSkpOworCisgICAgICAgIC8vIHdyaXRlIHRleHQgc2FtcGxlIGxlbmd0aCBhbmQgdGV4dCBzYW1wbGUgaXRzZWxmCisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RSVUNUX1RFWFQpOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIodGV4dExlbik7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0ZXh0TGVuKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZShkYXRhICsgMiwgdGV4dExlbik7CisKKyAgICAgICAgaWYgKHNpemUgPiB0ZXh0TGVuKSB7CisgICAgICAgICAgICBkYXRhICs9ICh0ZXh0TGVuICsgMik7CisgICAgICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVCh0bXBEYXRhKTsKKyAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgaWYgKGNodW5rU2l6ZSA8PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB0bXBEYXRhICs9IDg7CisKKyAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgIC8vICdzdHlsJyBib3ggc3BlY2lmaWVzIHRoZSBzdHlsZSBvZiB0aGUgdGV4dC4KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd5JywgJ2wnKToKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY291bnQgPSBVMTZfQVQodG1wRGF0YSk7CisKKyAgICAgICAgICAgIHRtcERhdGEgKz0gMjsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFJVQ1RfU1RZTEVfTElTVCk7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVEFSVF9DSEFSKTsKKyAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEpKTsKKworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfRU5EX0NIQVIpOworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSArIDIpKTsKKworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfRk9OVF9JRCk7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhICsgNCkpOworCisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFlMRV9GTEFHUyk7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKCoodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfRk9OVF9TSVpFKTsKKyAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoKih0bXBEYXRhICsgNykpOworCisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9URVhUX0NPTE9SX1JHQkEpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYmEgPSAqKHRtcERhdGEgKyA4KSA8PCAyNCB8ICoodG1wRGF0YSArIDkpIDw8IDE2CisgICAgICAgICAgICAgICAgICAgIHwgKih0bXBEYXRhICsgMTApIDw8IDggfCAqKHRtcERhdGEgKyAxMSk7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKHJnYmEpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gJ2tyb2snIGJveC4gVGhlIG51bWJlciBvZiBoaWdobGlnaHQgZXZlbnRzIGlzIHNwZWNpZmllZCwgYW5kIGVhY2gKKyAgICAgICAgLy8gZXZlbnQgaXMgc3BlY2lmaWVkIGJ5IGEgc3RhcnRpbmcgYW5kIGVuZGluZyBjaGFyIG9mZnNldCBhbmQgYW4gZW5kCisgICAgICAgIC8vIHRpbWUgZm9yIHRoZSBldmVudC4KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2snLCAncicsICdvJywgJ2snKToKKyAgICAgICAgeworCisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QpOworCisgICAgICAgICAgICBpbnQgc3RhcnRUaW1lID0gVTMyX0FUKHRtcERhdGEpOworICAgICAgICAgICAgdWludDE2X3QgY291bnQgPSBVMTZfQVQodG1wRGF0YSArIDQpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNvdW50KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSA2OworICAgICAgICAgICAgaW50IGxhc3RFbmRUaW1lID0gMDsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXJ0VGltZSArIGxhc3RFbmRUaW1lKTsKKworICAgICAgICAgICAgICAgIGxhc3RFbmRUaW1lID0gVTMyX0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihsYXN0RW5kVGltZSk7CisKKyAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyAnaGxpdCcgYm94IHNwZWNpZmllcyBoaWdobGlnaHRlZCB0ZXh0CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2wnLCAnaScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUKTsKKworICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGNoYXIgb2Zmc2V0IHRvIGhpZ2hsaWdodAorICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAvLyB0aGUgbGFzdCBjaGFyIG9mZnNldCB0byBoaWdobGlnaHQKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSArIDIpKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gJ2hjbHInIGJveCBzcGVjaWZpZXMgdGhlIFJHQkEgY29sb3I6IDggYml0cyBlYWNoIG9mCisgICAgICAgIC8vIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbiBhbHBoYSh0cmFuc3BhcmVuY3kpIHZhbHVlCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2MnLCAnbCcsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEpOworCisgICAgICAgICAgICB1aW50MzJfdCByZ2JhID0gKih0bXBEYXRhKSA8PCAyNCB8ICoodG1wRGF0YSArIDEpIDw8IDE2CisgICAgICAgICAgICAgICAgfCAqKHRtcERhdGEgKyAyKSA8PCA4IHwgKih0bXBEYXRhICsgMyk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIocmdiYSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vICdkbGF5JyBib3ggc3BlY2lmaWVzIGEgZGVsYXkgYWZ0ZXIgYSBzY3JvbGwgaW4gYW5kL29yCisgICAgICAgIC8vIGJlZm9yZSBzY3JvbGwgb3V0LgorICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdsJywgJ2EnLCAneScpOgorICAgICAgICB7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NDUk9MTF9ERUxBWSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5ID0gKih0bXBEYXRhKSA8PCAyNCB8ICoodG1wRGF0YSArIDEpIDw8IDE2CisgICAgICAgICAgICAgICAgfCAqKHRtcERhdGEgKyAyKSA8PCA4IHwgKih0bXBEYXRhICsgMyk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZGVsYXkpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyAnaHJlZicgYm94IGZvciBoeXBlciB0ZXh0IGxpbmsKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUKTsKKworICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCB0byBiZSBsaW5rZWQKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgLy8gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSArIDIpKTsKKworICAgICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZm9sbG93aW5nIFVSTAorICAgICAgICAgICAgaW50IGxlbiA9ICoodG1wRGF0YSArIDQpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGxlbik7CisKKyAgICAgICAgICAgIC8vIHRoZSBsaW5rZWQtdG8gVVJMCisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobGVuKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGUodG1wRGF0YSArIDUsIGxlbik7CisKKyAgICAgICAgICAgIHRtcERhdGEgKz0gKDUgKyBsZW4pOworCisgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmb2xsb3dpbmcgImFsdCIgc3RyaW5nCisgICAgICAgICAgICBsZW4gPSAqdG1wRGF0YTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihsZW4pOworCisgICAgICAgICAgICAvLyBhbiAiYWx0IiBzdHJpbmcgZm9yIHVzZXIgZGlzcGxheQorICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGxlbik7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlKHRtcERhdGEgKyAxLCBsZW4pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyAndGJveCcgYm94IHRvIGluZGljYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdGV4dCB3aXRoIHZhbHVlcworICAgICAgICAvLyBvZiB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgeworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFJVQ1RfVEVYVF9QT1MpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vICdibG5rJyB0byBzcGVjaWZ5IHRoZSBjaGFyIHJhbmdlIHRvIGJlIGJsaW5rZWQKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2InLCAnbCcsICduJywgJ2snKToKKyAgICAgICAgeworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFJVQ1RfQkxJTktJTkdfVEVYVF9MSVNUKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgY2hhciBvZmZzZXQKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgLy8gZW5kIGNoYXIgb2Zmc2V0CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vICd0d3JwJyBib3ggc3BlY2lmaWVzIHRleHQgd3JhcCBiZWhhdmlvci4gSWYgdGhlIHZhbHVlIGlmIDB4MDAsCisgICAgICAgIC8vIHRoZW4gbm8gd3JhcC4gSWYgaXQncyAweDAxLCB0aGVuIGF1dG9tYXRpYyAnc29mdCcgd3JhcCBpcyBlbmFibGVkLgorICAgICAgICAvLyAweDAyLTB4ZmYgYXJlIHJlc2VydmVkLgorICAgICAgICBjYXNlIEZPVVJDQygndCcsICd3JywgJ3InLCAncCcpOgorICAgICAgICB7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1dSQVBfVEVYVCk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoKnRtcERhdGEpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplID4gY2h1bmtTaXplKSB7CisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICAgICAgLy8gY29udGludWUgdG8gcGFyc2UgbmV4dCBib3gKKyAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgMCwgcGFyY2VsLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQYXJjZWwKK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnM6OmV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIFBhcmNlbCAqcGFyY2VsLCBpbnQgZGVwdGgpIHsKKworICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgIHVpbnQzMl90IGNodW5rVHlwZSA9IFUzMl9BVChkYXRhICsgNCk7CisgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgdG1wRGF0YSArPSA4OworCisgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfR0xPQkFMX1NFVFRJTkcpOworICAgIH0KKyAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcERhdGEgKz0gODsgLy8gc2tpcCB0aGUgZmlyc3QgOCBieXRlcworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9ESVNQTEFZX0ZMQUdTKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMzJfQVQodG1wRGF0YSkpOworCisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUUlVDVF9KVVNUSUZJQ0FUSU9OKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0bXBEYXRhWzRdKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0bXBEYXRhWzVdKTsKKworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEpOworICAgICAgICAgICAgdWludDMyX3QgcmdiYSA9ICoodG1wRGF0YSArIDYpIDw8IDI0IHwgKih0bXBEYXRhICsgNykgPDwgMTYKKyAgICAgICAgICAgICAgICB8ICoodG1wRGF0YSArIDgpIDw8IDggfCAqKHRtcERhdGEgKyA5KTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZ2JhKTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAxMDsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhICsgMikpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUUlVDVF9TVFlMRV9MSVNUKTsKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RBUlRfQ0hBUik7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEpKTsKKworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9FTkRfQ0hBUik7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfRk9OVF9JRCk7CisgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RZTEVfRkxBR1MpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKCoodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9GT05UX1NJWkUpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKCoodG1wRGF0YSArIDcpKTsKKworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9URVhUX0NPTE9SX1JHQkEpOworICAgICAgICAgICAgcmdiYSA9ICoodG1wRGF0YSArIDgpIDw8IDI0IHwgKih0bXBEYXRhICsgOSkgPDwgMTYKKyAgICAgICAgICAgICAgICB8ICoodG1wRGF0YSArIDEwKSA8PCA4IHwgKih0bXBEYXRhICsgMTEpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKHJnYmEpOworCisgICAgICAgICAgICB0bXBEYXRhICs9IDEyOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKEtFWV9TVFJVQ1RfRk9OVF9MSVNUKTsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvdW50ID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNvdW50KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gZm9udCBJRAorICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSkpOworCisgICAgICAgICAgICAgICAgLy8gZm9udCBuYW1lIGxlbmd0aAorICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigqKHRtcERhdGEgKyAyKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gKih0bXBEYXRhICsgMik7CisKKyAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlKHRtcERhdGEgKyAzLCBsZW4pOworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMyArIGxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICBzaXplIC09IGNodW5rU2l6ZTsKKworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAvLyBjb250aW51ZSB0byBleHRyYWN0IG5leHQgJ3R4M2cnCisgICAgICAgIHJldHVybiBleHRyYWN0M0dQUEdsb2JhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCBwYXJjZWwsIDEpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDQ5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCkBAIC0wLDAgKzEsODQgQEAKKyAvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVhUX0RFU0NSSVBUSU9OU19IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHREZXNjcmlwdGlvbnMgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywgaW50IHRpbWVNcywgUGFyY2VsICpwYXJjZWwpOworcHJpdmF0ZToKKyAgICBUZXh0RGVzY3JpcHRpb25zKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGFyY2VsICpwYXJjZWwpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUEdsb2JhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIFBhcmNlbCAqcGFyY2VsLCBpbnQgZGVwdGgpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGFyY2VsICpwYXJjZWwsIGludCBkZXB0aCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0RGVzY3JpcHRpb25zKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYWRhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGFyc2VyLmNwcApAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUaW1lZFRleHRQYXJzZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGltZWRUZXh0UGFyc2VyOjpUaW1lZFRleHRQYXJzZXIoKQorICAgIDogbURhdGFTb3VyY2UoTlVMTCksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUluZGV4KDApIHsKK30KKworVGltZWRUZXh0UGFyc2VyOjp+VGltZWRUZXh0UGFyc2VyKCkgeworICAgIHJlc2V0KCk7Cit9CisKK3N0YXR1c190IFRpbWVkVGV4dFBhcnNlcjo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsIEZpbGVUeXBlIGZpbGVUeXBlKSB7CisgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOworICAgIG1GaWxlVHlwZSA9IGZpbGVUeXBlOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gc2NhbkZpbGUoKSkgIT0gT0spIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgVGltZWRUZXh0UGFyc2VyOjpyZXNldCgpIHsKKyAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgIG1UZXh0VmVjdG9yLmNsZWFyKCk7CisgICAgbU9mZnNldCA9IDA7CisgICAgbUluZGV4ID0gMDsKK30KKworLy8gc2NhbiB0aGUgdGV4dCBmaWxlIHRvIGdldCBzdGFydC9zdG9wIHRpbWUgYW5kIHRoZQorLy8gb2Zmc2V0IG9mIGVhY2ggcGllY2Ugb2YgdGV4dCBjb250ZW50CitzdGF0dXNfdCBUaW1lZFRleHRQYXJzZXI6OnNjYW5GaWxlKCkgeworICAgIGlmIChtRmlsZVR5cGUgIT0gT1VUX09GX0JBTkRfRklMRV9TUlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgIGJvb2wgZW5kT2ZGaWxlID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIWVuZE9mRmlsZSkgeworICAgICAgICBUZXh0SW5mbyBpbmZvOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXROZXh0SW5TcnRGaWxlRm9ybWF0KCZvZmZzZXQsICZzdGFydFRpbWVVcywgJmluZm8pOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIGVuZE9mRmlsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV4dFZlY3Rvci5hZGQoc3RhcnRUaW1lVXMsIGluZm8pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1UZXh0VmVjdG9yLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHJlYWQgb25lIGxpbmUgc3RhcnRlZCBmcm9tICpvZmZzZXQgYW5kIHN0b3JlIGl0IGludG8gZGF0YS4KK3N0YXR1c190IFRpbWVkVGV4dFBhcnNlcjo6cmVhZE5leHRMaW5lKG9mZjY0X3QgKm9mZnNldCwgQVN0cmluZyAqZGF0YSkgeworICAgIGNoYXIgY2hhcmFjdGVyOworCisgICAgZGF0YS0+Y2xlYXIoKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHNzaXplX3QgZXJyOworICAgICAgICBpZiAoKGVyciA9IG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgJmNoYXJhY3RlciwgMSkpIDwgMSkgeworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICAoKm9mZnNldCkgKys7CisKKyAgICAgICAgLy8gYSBsaW5lIGNvdWxkIGVuZCB3aXRoIENSLCBMRiBvciBDUiArIExGCisgICAgICAgIGlmIChjaGFyYWN0ZXIgPT0gMTApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PSAxMykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsICZjaGFyYWN0ZXIsIDEpKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApIHsgLy8gZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgqb2Zmc2V0KSArKzsKKworICAgICAgICAgICAgaWYgKGNoYXJhY3RlciAhPSAxMCkgeworICAgICAgICAgICAgICAgICgqb2Zmc2V0KSAtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS0+YXBwZW5kKGNoYXJhY3Rlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvKiBTUlQgZm9ybWF0OgorICogIFN1YnRpdGxlIG51bWJlcgorICogIFN0YXJ0IHRpbWUgLS0+IEVuZCB0aW1lCisgKiAgVGV4dCBvZiBzdWJ0aXRsZSAob25lIG9yIG1vcmUgbGluZXMpCisgKiAgQmxhbmsgbGluZQorICoKKyAqIC5zcnQgZmlsZSBleGFtcGxlOgorICogIDEKKyAqICAwMDowMDoyMCwwMDAgLS0+IDAwOjAwOjI0LDQwMAorICogIEFsdG9jdW11bHVzIGNsb3VkcyBvY2N1ciBiZXR3ZWVuIHNpeCB0aG91c2FuZAorICoKKyAqICAyCisgKiAgMDA6MDA6MjQsNjAwIC0tPiAwMDowMDoyNyw4MDAKKyAqICBhbmQgdHdlbnR5IHRob3VzYW5kIGZlZXQgYWJvdmUgZ3JvdW5kIGxldmVsLgorICovCitzdGF0dXNfdCBUaW1lZFRleHRQYXJzZXI6OmdldE5leHRJblNydEZpbGVGb3JtYXQoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgaW50NjRfdCAqc3RhcnRUaW1lVXMsIFRleHRJbmZvICppbmZvKSB7CisgICAgQVN0cmluZyBkYXRhOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWROZXh0TGluZShvZmZzZXQsICZkYXRhKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyB0byBza2lwIHRoZSBmaXJzdCBsaW5lCisgICAgaWYgKChlcnIgPSByZWFkTmV4dExpbmUob2Zmc2V0LCAmZGF0YSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGhvdXIxLCBob3VyMiwgbWluMSwgbWluMiwgc2VjMSwgc2VjMiwgbXNlYzEsIG1zZWMyOworICAgIC8vIHRoZSBzdGFydCB0aW1lIGZvcm1hdCBpczogaG91cnM6bWludXRlczpzZWNvbmRzLG1pbGxpc2Vjb25kcworICAgIC8vIDAwOjAwOjI0LDYwMCAtLT4gMDA6MDA6MjcsODAwCisgICAgaWYgKHNzY2FuZihkYXRhLmNfc3RyKCksICIlMDJkOiUwMmQ6JTAyZCwlMDNkIC0tPiAlMDJkOiUwMmQ6JTAyZCwlMDNkIiwKKyAgICAgICAgICAgICAgICAmaG91cjEsICZtaW4xLCAmc2VjMSwgJm1zZWMxLCAmaG91cjIsICZtaW4yLCAmc2VjMiwgJm1zZWMyKSAhPSA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnN0YXJ0VGltZVVzID0gKChob3VyMSAqIDM2MDAgKyBtaW4xICogNjAgKyBzZWMxKSAqIDEwMDAgKyBtc2VjMSkgKiAxMDAwbGw7CisgICAgaW5mby0+ZW5kVGltZVVzID0gKChob3VyMiAqIDM2MDAgKyBtaW4yICogNjAgKyBzZWMyKSAqIDEwMDAgKyBtc2VjMikgKiAxMDAwbGw7CisgICAgaWYgKGluZm8tPmVuZFRpbWVVcyA8PSAqc3RhcnRUaW1lVXMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbmZvLT5vZmZzZXQgPSAqb2Zmc2V0OworCisgICAgYm9vbCBuZWVkTW9yZURhdGEgPSB0cnVlOworICAgIHdoaWxlIChuZWVkTW9yZURhdGEpIHsKKyAgICAgICAgaWYgKChlcnIgPSByZWFkTmV4dExpbmUob2Zmc2V0LCAmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZWVkTW9yZURhdGEpIHsKKyAgICAgICAgICAgIGRhdGEudHJpbSgpOworICAgICAgICAgICAgaWYgKGRhdGEuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIGl0J3MgYW4gZW1wdHkgbGluZSB1c2VkIHRvIHNlcGFyYXRlIHR3byBzdWJ0aXRsZXMKKyAgICAgICAgICAgICAgICBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGluZm8tPnRleHRMZW4gPSAqb2Zmc2V0IC0gaW5mby0+b2Zmc2V0OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBUaW1lZFRleHRQYXJzZXI6OmdldFRleHQoCisgICAgICAgIEFTdHJpbmcgKnRleHQsIGludDY0X3QgKnN0YXJ0VGltZVVzLCBpbnQ2NF90ICplbmRUaW1lVXMsCisgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICB0ZXh0LT5jbGVhcigpOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpbnQ2NF90IGxhc3RFbmRUaW1lVXMgPSBtVGV4dFZlY3Rvci52YWx1ZUF0KG1UZXh0VmVjdG9yLnNpemUoKSAtIDEpLmVuZFRpbWVVczsKKyAgICAgICAgaW50NjRfdCBmaXJzdFN0YXJ0VGltZVVzID0gbVRleHRWZWN0b3Iua2V5QXQoMCk7CisKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPCAwIHx8IHNlZWtUaW1lVXMgPiBsYXN0RW5kVGltZVVzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9IGVsc2UgaWYgKHNlZWtUaW1lVXMgPCBmaXJzdFN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICBtSW5kZXggPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYmluYXJ5IHNlYXJjaAorICAgICAgICAgICAgc3NpemVfdCBsb3cgPSAwOworICAgICAgICAgICAgc3NpemVfdCBoaWdoID0gbVRleHRWZWN0b3Iuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgIHNzaXplX3QgbWlkID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgY3VyclRpbWVVczsKKworICAgICAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisgICAgICAgICAgICAgICAgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpLzI7CisgICAgICAgICAgICAgICAgY3VyclRpbWVVcyA9IG1UZXh0VmVjdG9yLmtleUF0KG1pZCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGRpZmYgPSBjdXJyVGltZVVzIC0gc2Vla1RpbWVVczsKKworICAgICAgICAgICAgICAgIGlmIChkaWZmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaGlnaCA9PSBtaWQgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzZWVrVGltZVVzIDwgbVRleHRWZWN0b3Iua2V5QXQoaGlnaCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1JbmRleCA9IG1pZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRleHRJbmZvIGluZm8gPSBtVGV4dFZlY3Rvci52YWx1ZUF0KG1JbmRleCk7CisgICAgKnN0YXJ0VGltZVVzID0gbVRleHRWZWN0b3Iua2V5QXQobUluZGV4KTsKKyAgICAqZW5kVGltZVVzID0gaW5mby5lbmRUaW1lVXM7CisgICAgbUluZGV4ICsrOworCisgICAgY2hhciAqc3RyID0gbmV3IGNoYXJbaW5mby50ZXh0TGVuXTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChpbmZvLm9mZnNldCwgc3RyLCBpbmZvLnRleHRMZW4pIDwgaW5mby50ZXh0TGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIHN0cjsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHRleHQtPmFwcGVuZChzdHIsIGluZm8udGV4dExlbik7CisgICAgZGVsZXRlW10gc3RyOworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc3NGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBhcnNlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRJTUVEX1RFWFRfUEFSU0VSX0hfCisKKyNkZWZpbmUgVElNRURfVEVYVF9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKKworY2xhc3MgVGltZWRUZXh0UGFyc2VyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFRpbWVkVGV4dFBhcnNlcigpOworICAgIHZpcnR1YWwgflRpbWVkVGV4dFBhcnNlcigpOworCisgICAgZW51bSBGaWxlVHlwZSB7CisgICAgICAgIE9VVF9PRl9CQU5EX0ZJTEVfU1JUID0gMSwKKyAgICB9OworCisgICAgc3RhdHVzX3QgZ2V0VGV4dChBU3RyaW5nICp0ZXh0LCBpbnQ2NF90ICpzdGFydFRpbWVVcywgaW50NjRfdCAqZW5kVGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgc3RhdHVzX3QgaW5pdChjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwgRmlsZVR5cGUgZmlsZVR5cGUpOworICAgIHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIG9mZjY0X3QgbU9mZnNldDsKKworICAgIHN0cnVjdCBUZXh0SW5mbyB7CisgICAgICAgIGludDY0X3QgZW5kVGltZVVzOworICAgICAgICAvLyB0aGUgb2Zmc2V0IG9mIHRoZSB0ZXh0IGluIHRoZSBvcmlnaW5hbCBmaWxlCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgICAgICBpbnQgdGV4dExlbjsKKyAgICB9OworCisgICAgaW50IG1JbmRleDsKKyAgICBGaWxlVHlwZSBtRmlsZVR5cGU7CisKKyAgICAvLyB0aGUga2V5IGluZGljYXRlZCB0aGUgc3RhcnQgdGltZSBvZiB0aGUgdGV4dAorICAgIEtleWVkVmVjdG9yPGludDY0X3QsIFRleHRJbmZvPiBtVGV4dFZlY3RvcjsKKworICAgIHN0YXR1c190IGdldE5leHRJblNydEZpbGVGb3JtYXQoCisgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsIGludDY0X3QgKnN0YXJ0VGltZVVzLCBUZXh0SW5mbyAqaW5mbyk7CisgICAgc3RhdHVzX3QgcmVhZE5leHRMaW5lKG9mZjY0X3QgKm9mZnNldCwgQVN0cmluZyAqZGF0YSk7CisKKyAgICBzdGF0dXNfdCBzY2FuRmlsZSgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0UGFyc2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVElNRURfVEVYVF9QQVJTRVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhhNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKQEAgLTAsMCArMSw0MTYgQEAKKyAvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRQbGF5ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgiCisjaW5jbHVkZSAiVGltZWRUZXh0UGxheWVyLmgiCisjaW5jbHVkZSAiVGltZWRUZXh0UGFyc2VyLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBUaW1lZFRleHRFdmVudCA6IHB1YmxpYyBUaW1lZEV2ZW50UXVldWU6OkV2ZW50IHsKKyAgICBUaW1lZFRleHRFdmVudCgKKyAgICAgICAgICAgIFRpbWVkVGV4dFBsYXllciAqcGxheWVyLAorICAgICAgICAgICAgdm9pZCAoVGltZWRUZXh0UGxheWVyOjoqbWV0aG9kKSgpKQorICAgICAgICA6IG1QbGF5ZXIocGxheWVyKSwKKyAgICAgICAgICBtTWV0aG9kKG1ldGhvZCkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRpbWVkVGV4dEV2ZW50KCkge30KKworICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7CisgICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVGltZWRUZXh0UGxheWVyICptUGxheWVyOworICAgIHZvaWQgKFRpbWVkVGV4dFBsYXllcjo6Km1NZXRob2QpKCk7CisKKyAgICBUaW1lZFRleHRFdmVudChjb25zdCBUaW1lZFRleHRFdmVudCAmKTsKKyAgICBUaW1lZFRleHRFdmVudCAmb3BlcmF0b3I9KGNvbnN0IFRpbWVkVGV4dEV2ZW50ICYpOworfTsKKworVGltZWRUZXh0UGxheWVyOjpUaW1lZFRleHRQbGF5ZXIoCisgICAgICAgIEF3ZXNvbWVQbGF5ZXIgKm9ic2VydmVyLAorICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lciwKKyAgICAgICAgVGltZWRFdmVudFF1ZXVlICpxdWV1ZSkKKyAgICA6IG1Tb3VyY2UoTlVMTCksCisgICAgICBtT3V0T2ZCYW5kU291cmNlKE5VTEwpLAorICAgICAgbVNlZWtUaW1lVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtVGV4dEV2ZW50UGVuZGluZyhmYWxzZSksCisgICAgICBtUXVldWUocXVldWUpLAorICAgICAgbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgIG1PYnNlcnZlcihvYnNlcnZlciksCisgICAgICBtVGV4dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1UZXh0UGFyc2VyKE5VTEwpLAorICAgICAgbVRleHRUeXBlKGtOb1RleHQpIHsKKyAgICBtVGV4dEV2ZW50ID0gbmV3IFRpbWVkVGV4dEV2ZW50KHRoaXMsICZUaW1lZFRleHRQbGF5ZXI6Om9uVGV4dEV2ZW50KTsKK30KKworVGltZWRUZXh0UGxheWVyOjp+VGltZWRUZXh0UGxheWVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIG1UZXh0VHJhY2tWZWN0b3IuY2xlYXIoKTsKKyAgICBtVGV4dE91dE9mQmFuZFZlY3Rvci5jbGVhcigpOworfQorCitzdGF0dXNfdCBUaW1lZFRleHRQbGF5ZXI6OnN0YXJ0KHVpbnQ4X3QgaW5kZXgpIHsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgaWYgKGluZGV4ID49CisgICAgICAgICAgICBtVGV4dFRyYWNrVmVjdG9yLnNpemUoKSArIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLnNpemUoKSkgeworICAgICAgICBMT0dFKCJJbmNvcnJlY3QgdGV4dCB0cmFjayBpbmRleDogJWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChpbmRleCA8IG1UZXh0VHJhY2tWZWN0b3Iuc2l6ZSgpKSB7IC8vIHN0YXJ0IGFuIGluLWJhbmQgdGV4dAorICAgICAgICBtU291cmNlID0gbVRleHRUcmFja1ZlY3Rvci5pdGVtQXQoaW5kZXgpOworCisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtVGV4dFR5cGUgPSBrSW5CYW5kVGV4dDsKKyAgICB9IGVsc2UgeyAvLyBzdGFydCBhbiBvdXQtb2YtYmFuZCB0ZXh0CisgICAgICAgIE91dE9mQmFuZFRleHQgdGV4dCA9CisgICAgICAgICAgICBtVGV4dE91dE9mQmFuZFZlY3Rvci5pdGVtQXQoaW5kZXggLSBtVGV4dFRyYWNrVmVjdG9yLnNpemUoKSk7CisKKyAgICAgICAgbU91dE9mQmFuZFNvdXJjZSA9IHRleHQuc291cmNlOworICAgICAgICBUaW1lZFRleHRQYXJzZXI6OkZpbGVUeXBlIGZpbGVUeXBlID0gdGV4dC50eXBlOworCisgICAgICAgIGlmIChtVGV4dFBhcnNlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtVGV4dFBhcnNlciA9IG5ldyBUaW1lZFRleHRQYXJzZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZXJyID0gbVRleHRQYXJzZXItPmluaXQobU91dE9mQmFuZFNvdXJjZSwgZmlsZVR5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtVGV4dFR5cGUgPSBrT3V0T2ZCYW5kVGV4dDsKKyAgICB9CisKKyAgICAvLyBzZW5kIHNhbXBsZSBkZXNjcmlwdGlvbiBmb3JtYXQKKyAgICBpZiAoKGVyciA9IGV4dHJhY3RBbmRTZW5kR2xvYmFsRGVzY3JpcHRpb25zKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCBwb3NpdGlvblVzOworICAgIG1PYnNlcnZlci0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uVXMpOworICAgIHNlZWtUbyhwb3NpdGlvblVzKTsKKworICAgIHBvc3RUZXh0RXZlbnQoKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBhdXNlKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGNhbmNlbFRleHRFdmVudCgpOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6cmVzdW1lKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIHBvc3RUZXh0RXZlbnQoKTsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6OnJlc2V0KCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIC8vIHNlbmQgYW4gZW1wdHkgdGV4dCB0byBjbGVhciB0aGUgc2NyZWVuCisgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCk7CisKKyAgICBjYW5jZWxUZXh0RXZlbnQoKTsKKworICAgIG1TZWVraW5nID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIGlmIChtVGV4dFR5cGUgPT0ga0luQmFuZFRleHQpIHsKKyAgICAgICAgaWYgKG1UZXh0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UZXh0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtVGV4dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICBtU291cmNlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVGV4dFBhcnNlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtVGV4dFBhcnNlci5jbGVhcigpOworICAgICAgICAgICAgbVRleHRQYXJzZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0T2ZCYW5kU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1PdXRPZkJhbmRTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIG1PdXRPZkJhbmRTb3VyY2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBUaW1lZFRleHRQbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVNlZWtpbmcgPSB0cnVlOworICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKKworICAgIHBvc3RUZXh0RXZlbnQoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgVGltZWRUZXh0UGxheWVyOjpzZXRUaW1lZFRleHRUcmFja0luZGV4KGludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPj0KKyAgICAgICAgICAgIChpbnQpKG1UZXh0VHJhY2tWZWN0b3Iuc2l6ZSgpICsgbVRleHRPdXRPZkJhbmRWZWN0b3Iuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBzdGFydChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6Om9uVGV4dEV2ZW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoIW1UZXh0RXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVRleHRFdmVudFBlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmIChtRGF0YS5kYXRhU2l6ZSgpID4gMCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhULCAmbURhdGEpOworICAgICAgICBtRGF0YS5mcmVlRGF0YSgpOworICAgIH0KKworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworICAgIGlmIChtU2Vla2luZykgeworICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgIG1TZWVraW5nID0gZmFsc2U7CisKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCk7IC8vZW1wdHkgdGV4dCB0byBjbGVhciB0aGUgc2NyZWVuCisgICAgfQorCisgICAgaW50NjRfdCBwb3NpdGlvblVzLCB0aW1lVXM7CisgICAgbU9ic2VydmVyLT5nZXRQb3NpdGlvbigmcG9zaXRpb25Vcyk7CisKKyAgICBpZiAobVRleHRUeXBlID09IGtJbkJhbmRUZXh0KSB7CisgICAgICAgIGlmIChtU291cmNlLT5yZWFkKCZtVGV4dEJ1ZmZlciwgJm9wdGlvbnMpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtVGV4dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBlbmRUaW1lVXM7CisgICAgICAgIGlmIChtVGV4dFBhcnNlci0+Z2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgJm1UZXh0LCAmdGltZVVzLCAmZW5kVGltZVVzLCAmb3B0aW9ucykgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lVXMgPiAwKSB7CisgICAgICAgIGV4dHJhY3RBbmRBcHBlbmRMb2NhbERlc2NyaXB0aW9ucyh0aW1lVXMpOworICAgIH0KKworICAgIGlmIChtVGV4dFR5cGUgPT0ga0luQmFuZFRleHQpIHsKKyAgICAgICAgaWYgKG1UZXh0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UZXh0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtVGV4dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtVGV4dC5jbGVhcigpOworICAgIH0KKworICAgIC8vc2VuZCB0aGUgdGV4dCBub3cKKyAgICBpZiAodGltZVVzIDw9IHBvc2l0aW9uVXMgKyAxMDAwMDBsbCkgeworICAgICAgICBwb3N0VGV4dEV2ZW50KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9zdFRleHRFdmVudCh0aW1lVXMgLSBwb3NpdGlvblVzIC0gMTAwMDAwbGwpOworICAgIH0KK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6OnBvc3RUZXh0RXZlbnQoaW50NjRfdCBkZWxheVVzKSB7CisgICAgaWYgKG1UZXh0RXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtVGV4dEV2ZW50UGVuZGluZyA9IHRydWU7CisgICAgbVF1ZXVlLT5wb3N0RXZlbnRXaXRoRGVsYXkobVRleHRFdmVudCwgZGVsYXlVcyA8IDAgPyAxMDAwMCA6IGRlbGF5VXMpOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6Y2FuY2VsVGV4dEV2ZW50KCkgeworICAgIG1RdWV1ZS0+Y2FuY2VsRXZlbnQobVRleHRFdmVudC0+ZXZlbnRJRCgpKTsKKyAgICBtVGV4dEV2ZW50UGVuZGluZyA9IGZhbHNlOworfQorCit2b2lkIFRpbWVkVGV4dFBsYXllcjo6YWRkVGV4dFNvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtVGV4dFRyYWNrVmVjdG9yLmFkZChzb3VyY2UpOworfQorCitzdGF0dXNfdCBUaW1lZFRleHRQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKGtleSA9PSBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfQUREX09VVF9PRl9CQU5EX1NPVVJDRSkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiB1cmkxNiA9IHJlcXVlc3QucmVhZFN0cmluZzE2KCk7CisgICAgICAgIFN0cmluZzggdXJpID0gU3RyaW5nOCh1cmkxNik7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisKKyAgICAgICAgLy8gVG8gc3VwcG9ydCBsb2NhbCBzdWJ0aXRsZSBmaWxlIG9ubHkgZm9yIG5vdworICAgICAgICBpZiAoc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmkuc3RyaW5nKCksIDcpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSwgJmhlYWRlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhU291cmNlLT5pbml0Q2hlY2soKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgT3V0T2ZCYW5kVGV4dCB0ZXh0OworICAgICAgICB0ZXh0LnNvdXJjZSA9IGRhdGFTb3VyY2U7CisgICAgICAgIGlmICh1cmkuZ2V0UGF0aEV4dGVuc2lvbigpID09IFN0cmluZzgoIi5zcnQiKSkgeworICAgICAgICAgICAgdGV4dC50eXBlID0gVGltZWRUZXh0UGFyc2VyOjpPVVRfT0ZfQkFORF9GSUxFX1NSVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXh0T3V0T2ZCYW5kVmVjdG9yLmFkZCh0ZXh0KTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBUaW1lZFRleHRQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyKGludCBtc2csIGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworCisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocGFyY2VsICYmIChwYXJjZWwtPmRhdGFTaXplKCkgPiAwKSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnLCAwLCAwLCBwYXJjZWwpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0IHRvIGNsZWFyIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEVhY2ggdGV4dCBzYW1wbGUgY29uc2lzdHMgb2YgYSBzdHJpbmcgb2YgdGV4dCwgb3B0aW9uYWxseSB3aXRoIHNhbXBsZQorLy8gbW9kaWZpZXIgZGVzY3JpcHRpb24uIFRoZSBtb2RpZmllciBkZXNjcmlwdGlvbiBjb3VsZCBzcGVjaWZ5IGEgbmV3CisvLyB0ZXh0IHN0eWxlIGZvciB0aGUgc3RyaW5nIG9mIHRleHQuIFRoZXNlIGRlc2NyaXB0aW9ucyBhcmUgcHJlc2VudCBvbmx5CisvLyBpZiB0aGV5IGFyZSBuZWVkZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgbW9kaWZpZXIKKy8vIGRlc2NyaXB0aW9uIGFuZCBhcHBlbmQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KK3N0YXR1c190IFRpbWVkVGV4dFBsYXllcjo6ZXh0cmFjdEFuZEFwcGVuZExvY2FsRGVzY3JpcHRpb25zKGludDY0X3QgdGltZVVzKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworCisgICAgaWYgKG1UZXh0VHlwZSA9PSBrSW5CYW5kVGV4dCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgICAgICAgICAgZGF0YSA9IG1UZXh0QnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzaXplID0gbVRleHRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgM0dQUCBvbmx5IGZvciBub3cKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgPSBtVGV4dC5jX3N0cigpOworICAgICAgICBzaXplID0gbVRleHQuc2l6ZSgpOworICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6Ok9VVF9PRl9CQU5EX1RFWFRfU1JUOworICAgIH0KKworICAgIGlmICgoc2l6ZSA+IDApICYmIChmbGFnICE9IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUykpIHsKKyAgICAgICAgbURhdGEuZnJlZURhdGEoKTsKKyAgICAgICAgcmV0dXJuIFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJm1EYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYW5kIHNlbmQgdGhlIGdsb2JhbCB0ZXh0IGRlc2NyaXB0aW9ucyBmb3IgYWxsIHRoZSB0ZXh0IHNhbXBsZXMKKy8vIGluIHRoZSB0ZXh0IHRyYWNrIG9yIHRleHQgZmlsZS4KK3N0YXR1c190IFRpbWVkVGV4dFBsYXllcjo6ZXh0cmFjdEFuZFNlbmRHbG9iYWxEZXNjcmlwdGlvbnMoKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6R0xPQkFMX0RFU0NSSVBUSU9OUzsKKworICAgIGlmIChtVGV4dFR5cGUgPT0ga0luQmFuZFRleHQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICAvLyBzdXBwb3J0IDNHUFAgb25seSBmb3Igbm93CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICAgICAgLy8gZ2V0IHRoZSAndHgzZycgYm94IGNvbnRlbnQuIFRoaXMgYm94IGNvbnRhaW5zIHRoZSB0ZXh0IGRlc2NyaXB0aW9ucworICAgICAgICAgICAgLy8gdXNlZCB0byByZW5kZXIgdGhlIHRleHQgdHJhY2sKKyAgICAgICAgICAgIGlmICghbVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmREYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHNpemUgPiAwKSAmJiAoZmxhZyAhPSBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TKSkgeworICAgICAgICBQYXJjZWwgcGFyY2VsOworICAgICAgICBpZiAoVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCAwLCAmcGFyY2VsKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsICZwYXJjZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDRkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRJTUVEVEVYVF9QTEFZRVJfSF8KKworI2RlZmluZSBUSU1FRFRFWFRfUExBWUVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgiCisjaW5jbHVkZSAiVGltZWRUZXh0UGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFTb3VyY2U7CitjbGFzcyBBd2Vzb21lUGxheWVyOworY2xhc3MgTWVkaWFCdWZmZXI7CisKK2NsYXNzIFRpbWVkVGV4dFBsYXllciB7CitwdWJsaWM6CisgICAgVGltZWRUZXh0UGxheWVyKEF3ZXNvbWVQbGF5ZXIgKm9ic2VydmVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgVGltZWRFdmVudFF1ZXVlICpxdWV1ZSk7CisKKyAgICB2aXJ0dWFsIH5UaW1lZFRleHRQbGF5ZXIoKTsKKworICAgIC8vIGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIHRleHQgdHJhY2sgd2hpY2ggd2lsbAorICAgIC8vIGJlIHR1cm5lZCBvbgorICAgIHN0YXR1c190IHN0YXJ0KHVpbnQ4X3QgaW5kZXgpOworCisgICAgdm9pZCBwYXVzZSgpOworCisgICAgdm9pZCByZXN1bWUoKTsKKworICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpOworCisgICAgdm9pZCBhZGRUZXh0U291cmNlKHNwPE1lZGlhU291cmNlPiBzb3VyY2UpOworCisgICAgc3RhdHVzX3Qgc2V0VGltZWRUZXh0VHJhY2tJbmRleChpbnQzMl90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFRleHRUeXBlIHsKKyAgICAgICAga05vVGV4dCAgICAgICAgPSAwLAorICAgICAgICBrSW5CYW5kVGV4dCAgICA9IDEsCisgICAgICAgIGtPdXRPZkJhbmRUZXh0ID0gMiwKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBtT3V0T2ZCYW5kU291cmNlOworCisgICAgYm9vbCBtU2Vla2luZzsKKyAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworCisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1UZXh0RXZlbnQ7CisgICAgYm9vbCBtVGV4dEV2ZW50UGVuZGluZzsKKworICAgIFRpbWVkRXZlbnRRdWV1ZSAqbVF1ZXVlOworCisgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CisgICAgQXdlc29tZVBsYXllciAqbU9ic2VydmVyOworCisgICAgTWVkaWFCdWZmZXIgKm1UZXh0QnVmZmVyOworICAgIFBhcmNlbCBtRGF0YTsKKworICAgIC8vIGZvciBpbi1iYW5kIHRpbWVkIHRleHQKKyAgICBWZWN0b3I8c3A8TWVkaWFTb3VyY2U+ID4gbVRleHRUcmFja1ZlY3RvcjsKKworICAgIC8vIGZvciBvdXQtb2YtYmFuZCB0aW1lZCB0ZXh0CisgICAgc3RydWN0IE91dE9mQmFuZFRleHQgeworICAgICAgICBUaW1lZFRleHRQYXJzZXI6OkZpbGVUeXBlIHR5cGU7CisgICAgICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZTsKKyAgICB9OworICAgIFZlY3RvcjxPdXRPZkJhbmRUZXh0ID4gbVRleHRPdXRPZkJhbmRWZWN0b3I7CisKKyAgICBzcDxUaW1lZFRleHRQYXJzZXI+IG1UZXh0UGFyc2VyOworICAgIEFTdHJpbmcgbVRleHQ7CisKKyAgICBUZXh0VHlwZSBtVGV4dFR5cGU7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICB2b2lkIG9uVGV4dEV2ZW50KCk7CisgICAgdm9pZCBwb3N0VGV4dEV2ZW50KGludDY0X3QgZGVsYXlVcyA9IC0xKTsKKyAgICB2b2lkIGNhbmNlbFRleHRFdmVudCgpOworCisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBjb25zdCBQYXJjZWwgKnBhcmNlbCA9IE5VTEwpOworCisgICAgc3RhdHVzX3QgZXh0cmFjdEFuZEFwcGVuZExvY2FsRGVzY3JpcHRpb25zKGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBleHRyYWN0QW5kU2VuZEdsb2JhbERlc2NyaXB0aW9ucygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0UGxheWVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVElNRURURVhUX1BMQVlFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawppbmRleCA3Njk3ZTNjLi5hNDI1M2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpAQCAtMTAsNiArMTAsNiBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKIAotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCmluZGV4IGMyNTI4NWUuLmU1OTBiYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL210cC9BbmRyb2lkLm1rCkBAIC0xNiw4ICsxNiw2IEBACiAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi1pZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00NSw4ICs0Myw2IEBACiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAotZW5kaWYKLQogaWZlcSAoJChIT1NUX09TKSxsaW51eCkKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKaW5kZXggODE3ZWFjMC4uMjAyMjViYSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMzQ1LDU2ICszNDUsMjggQEAKIAogI2lmZGVmIE1UUF9ERVZJQ0UgCiBpbnQgTXRwRGF0YVBhY2tldDo6cmVhZChpbnQgZmQpIHsKLSAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKLSAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKLSAgICBpZiAocmV0ICE9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgIGlmIChyZXQgPCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgLy8gdGhlbiB0aGUgZm9sbG93aW5nIGRhdGEKLSAgICBpbnQgdG90YWwgPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOwotICAgIGFsbG9jYXRlKHRvdGFsKTsKLSAgICBpbnQgcmVtYWluaW5nID0gdG90YWwgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOwotICAgIHJldCA9IDo6cmVhZChmZCwgJm1CdWZmZXJbMF0gKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCByZW1haW5pbmcpOwotICAgIGlmIChyZXQgIT0gcmVtYWluaW5nKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBtUGFja2V0U2l6ZSA9IHRvdGFsOworICAgIG1QYWNrZXRTaXplID0gcmV0OwogICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOwotICAgIHJldHVybiB0b3RhbDsKLX0KLQotaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKGludCBmZCkgewotICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOwotICAgIGlmIChyZXQgPiAwKQotICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKLSAgICBlbHNlCi0gICAgICAgIG1QYWNrZXRTaXplID0gMDsKICAgICByZXR1cm4gcmV0OwogfQogCiBpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CiAgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CiAgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOwotICAgIC8vIHNlbmQgaGVhZGVyIHNlcGFyYXRlbHkgZnJvbSBkYXRhCi0gICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOwotICAgIGlmIChyZXQgPT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKLSAgICAgICAgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOwotICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOwotfQotCi1pbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKSB7Ci0gICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOwotICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKLSAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKICAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKIH0KIAogaW50IE10cERhdGFQYWNrZXQ6OndyaXRlRGF0YShpbnQgZmQsIHZvaWQqIGRhdGEsIHVpbnQzMl90IGxlbmd0aCkgewotICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgYWxsb2NhdGUobGVuZ3RoKTsKKyAgICBtZW1jcHkobUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIGRhdGEsIGxlbmd0aCk7CisgICAgbGVuZ3RoICs9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOwogICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKLSAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7Ci0gICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQotICAgICAgICByZXQgPSA6OndyaXRlKGZkLCBkYXRhLCBsZW5ndGgpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBsZW5ndGgpOwogICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAppbmRleCA4YTA4OTQ4Li4yYjgxMDYzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTQxLDYgKzQxLDcgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCk7CiAKKyAgICBpbmxpbmUgY29uc3QgdWludDhfdCogICAgIGdldERhdGEoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsgfQogICAgIGlubGluZSB1aW50OF90ICAgICAgZ2V0VUludDgoKSB7IHJldHVybiAodWludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KICAgICBpbmxpbmUgaW50OF90ICAgICAgIGdldEludDgoKSB7IHJldHVybiAoaW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQogICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KCk7CkBAIC05NSwxMSArOTYsOSBAQAogI2lmZGVmIE1UUF9ERVZJQ0UKICAgICAvLyBmaWxsIG91ciBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgogICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChpbnQgZmQpOwotICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGFIZWFkZXIoaW50IGZkKTsKIAogICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKICAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpOwogICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVEYXRhKGludCBmZCwgdm9pZCogZGF0YSwgdWludDMyX3QgbGVuZ3RoKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IDRhOGZkM2UuLmE5YjUzOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC05NSwxMCArOTUsMTEgQEAKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKIH07CiAKLU10cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLAorTXRwU2VydmVyOjpNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAogICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKQogICAgIDogICBtRkQoZmQpLAogICAgICAgICBtRGF0YWJhc2UoZGF0YWJhc2UpLAorICAgICAgICBtUHRwKHB0cCksCiAgICAgICAgIG1GaWxlR3JvdXAoZmlsZUdyb3VwKSwKICAgICAgICAgbUZpbGVQZXJtaXNzaW9uKGZpbGVQZXJtKSwKICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb24oZGlyZWN0b3J5UGVybSksCkBAIC0yMzYsNiArMjM3LDggQEAKIAogICAgIGlmIChtU2Vzc2lvbk9wZW4pCiAgICAgICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7CisgICAgY2xvc2UoZmQpOworICAgIG1GRCA9IC0xOwogfQogCiB2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKQEAgLTQyNiw5ICs0MjksMjAgQEAKIAogICAgIC8vIGZpbGwgaW4gZGV2aWNlIGluZm8KICAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOwotICAgIG1EYXRhLnB1dFVJbnQzMig2KTsgLy8gTVRQIFZlbmRvciBFeHRlbnNpb24gSUQKKyAgICBpZiAobVB0cCkgeworICAgICAgICBtRGF0YS5wdXRVSW50MzIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTVRQIFZlbmRvciBFeHRlbnNpb24gSUQKKyAgICAgICAgbURhdGEucHV0VUludDMyKDYpOworICAgIH0KICAgICBtRGF0YS5wdXRVSW50MTYoTVRQX1NUQU5EQVJEX1ZFUlNJT04pOwotICAgIHN0cmluZy5zZXQoIm1pY3Jvc29mdC5jb206IDEuMDsgYW5kcm9pZC5jb206IDEuMDsiKTsKKyAgICBpZiAobVB0cCkgeworICAgICAgICAvLyBubyBleHRlbnNpb25zCisgICAgICAgIHN0cmluZy5zZXQoIiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1UUCBleHRlbnNpb25zCisgICAgICAgIHN0cmluZy5zZXQoIm1pY3Jvc29mdC5jb206IDEuMDsgYW5kcm9pZC5jb206IDEuMDsiKTsKKyAgICB9CiAgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7IC8vIE1UUCBFeHRlbnNpb25zCiAgICAgbURhdGEucHV0VUludDE2KDApOyAvL0Z1bmN0aW9uYWwgTW9kZQogICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzLApAQCAtNTMzLDEyICs1NDcsMTAgQEAKICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCiAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cwogICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cwogCiAgICAgaWYgKCFoYXNTdG9yYWdlKHN0b3JhZ2VJRCkpCiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOwotICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikKLSAgICAgICAgcGFyZW50ID0gMDsKIAogICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBtRGF0YWJhc2UtPmdldE9iamVjdExpc3Qoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CiAgICAgbURhdGEucHV0QVVJbnQzMihoYW5kbGVzKTsKQEAgLTU1MiwxMSArNTY0LDkgQEAKICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCiAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cwogICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cwogICAgIGlmICghaGFzU3RvcmFnZShzdG9yYWdlSUQpKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKLSAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCi0gICAgICAgIHBhcmVudCA9IDA7CiAKICAgICBpbnQgY291bnQgPSBtRGF0YWJhc2UtPmdldE51bU9iamVjdHMoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CiAgICAgaWYgKGNvdW50ID49IDApIHsKQEAgLTcyMSwxNCArNzMxLDEyIEBACiAgICAgfQogICAgIG1mci5vZmZzZXQgPSAwOwogICAgIG1mci5sZW5ndGggPSBmaWxlTGVuZ3RoOwotCi0gICAgLy8gc2VuZCBkYXRhIGhlYWRlcgotICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKLSAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7Ci0gICAgbURhdGEud3JpdGVEYXRhSGVhZGVyKG1GRCwgZmlsZUxlbmd0aCArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIG1mci5jb21tYW5kID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgIG1mci50cmFuc2FjdGlvbl9pZCA9IG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKTsKIAogICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFX1dJVEhfSEVBREVSLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBMT0dWKCJNVFBfU0VORF9GSUxFX1dJVEhfSEVBREVSIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgIGNsb3NlKG1mci5mZCk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKQEAgLTc4OCwxNSArNzk2LDEzIEBACiAgICAgfQogICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbWZyLmxlbmd0aCA9IGxlbmd0aDsKKyAgICBtZnIuY29tbWFuZCA9IG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKTsKKyAgICBtZnIudHJhbnNhY3Rpb25faWQgPSBtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCk7CiAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBsZW5ndGgpOwogCi0gICAgLy8gc2VuZCBkYXRhIGhlYWRlcgotICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKLSAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7Ci0gICAgbURhdGEud3JpdGVEYXRhSGVhZGVyKG1GRCwgbGVuZ3RoICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7Ci0KLSAgICAvLyB0aGVuIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgaW50IHJldCA9IGlvY3RsKG1GRCwgTVRQX1NFTkRfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFX1dJVEhfSEVBREVSLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBMT0dWKCJNVFBfU0VORF9GSUxFX1dJVEhfSEVBREVSIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgIGNsb3NlKG1mci5mZCk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKQEAgLTg2Myw2ICs4NjksMTQgQEAKICAgICAvLyBjaGVjayBzcGFjZSBmaXJzdAogICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID4gc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpCiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU1RPUkFHRV9GVUxMOworICAgIHVpbnQ2NF90IG1heEZpbGVTaXplID0gc3RvcmFnZS0+Z2V0TWF4RmlsZVNpemUoKTsKKyAgICAvLyBjaGVjayBzdG9yYWdlIG1heCBmaWxlIHNpemUKKyAgICBpZiAobWF4RmlsZVNpemUgIT0gMCkgeworICAgICAgICAvLyBpZiBtU2VuZE9iamVjdEZpbGVTaXplIGlzIDB4RkZGRkZGRkYsIHRoZW4gYWxsIHdlIGtub3cgaXMgdGhlIGZpbGUgc2l6ZQorICAgICAgICAvLyBpcyA+PSAweEZGRkZGRkZGCisgICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID4gbWF4RmlsZVNpemUgfHwgbVNlbmRPYmplY3RGaWxlU2l6ZSA9PSAweEZGRkZGRkZGKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFOworICAgIH0KIAogTE9HRCgicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwKQEAgLTkwMCw3ICs5MTQsNyBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9PSzsKICAgICBtb2RlX3QgbWFzazsKLSAgICBpbnQgcmV0OworICAgIGludCByZXQsIGluaXRpYWxEYXRhOwogCiAgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIExPR0UoIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0Iik7CkBAIC05MDgsMTIgKzkyMiwxMyBAQAogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0gICAgLy8gcmVhZCB0aGUgaGVhZGVyCi0gICAgcmV0ID0gbURhdGEucmVhZERhdGFIZWFkZXIobUZEKTsKLSAgICAvLyBGSVhNRSAtIGNoZWNrIGZvciBlcnJvcnMgaGVyZS4KLQotICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGlzIGJhY2sKLSAgICBtRGF0YS5yZXNldCgpOworICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQorICAgIHJldCA9IG1EYXRhLnJlYWQobUZEKTsKKyAgICBpZiAocmV0IDwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpbml0aWFsRGF0YSA9IHJldCAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CiAKICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwogICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMpOwpAQCAtOTI3LDE2ICs5NDIsMjAgQEAKICAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOwogICAgIHVtYXNrKG1hc2spOwogCi0gICAgbWZyLm9mZnNldCA9IDA7Ci0gICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemU7CisgICAgaWYgKGluaXRpYWxEYXRhID4gMCkKKyAgICAgICAgcmV0ID0gd3JpdGUobWZyLmZkLCBtRGF0YS5nZXREYXRhKCksIGluaXRpYWxEYXRhKTsKIAotICAgIExPR1YoInJlY2VpdmluZyAlc1xuIiwgKGNvbnN0IGNoYXIgKiltU2VuZE9iamVjdEZpbGVQYXRoKTsKLSAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQotICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YSA+IDApIHsKKyAgICAgICAgbWZyLm9mZnNldCA9IGluaXRpYWxEYXRhOworICAgICAgICBtZnIubGVuZ3RoID0gbVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhOworCisgICAgICAgIExPR1YoInJlY2VpdmluZyAlc1xuIiwgKGNvbnN0IGNoYXIgKiltU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICAgICAgTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9CiAgICAgY2xvc2UobWZyLmZkKTsKIAotICAgIExPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOwotCiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOwogICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQpAQCAtOTQ2LDYgKzk2NSw5IEBACiAgICAgfQogCiBkb25lOgorICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGUgZGF0YSBiYWNrCisgICAgbURhdGEucmVzZXQoKTsKKwogICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCiAgICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOwpAQCAtMTA3OCwyMyArMTEwMCwzMSBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQogCi0gICAgLy8gcmVhZCB0aGUgaGVhZGVyCi0gICAgaW50IHJldCA9IG1EYXRhLnJlYWREYXRhSGVhZGVyKG1GRCk7Ci0gICAgLy8gRklYTUUgLSBjaGVjayBmb3IgZXJyb3JzIGhlcmUuCi0KLSAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIHNlbmQgdGhpcyBiYWNrCi0gICAgbURhdGEucmVzZXQoKTsKLQogICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKillZGl0LT5tUGF0aDsKLSAgICBMT0dWKCJyZWNlaXZpbmcgcGFydGlhbCAlcyAlbGxkICVsZFxuIiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwotICAgIG1mci5mZCA9IGVkaXQtPm1GRDsKLSAgICBtZnIub2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CisgICAgTE9HVigicmVjZWl2aW5nIHBhcnRpYWwgJXMgJWxsZCAlbGxkXG4iLCBmaWxlUGF0aCwgb2Zmc2V0LCBsZW5ndGgpOwogCi0gICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOwotICAgIExPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQorICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1GRCk7CisgICAgaWYgKHJldCA8IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICBpbnQgaW5pdGlhbERhdGEgPSByZXQgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworCisgICAgaWYgKGluaXRpYWxEYXRhID4gMCkgeworICAgICAgICByZXQgPSB3cml0ZShlZGl0LT5tRkQsIG1EYXRhLmdldERhdGEoKSwgaW5pdGlhbERhdGEpOworICAgICAgICBvZmZzZXQgKz0gaW5pdGlhbERhdGE7CisgICAgICAgIGxlbmd0aCAtPSBpbml0aWFsRGF0YTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOworICAgICAgICBtZnIuZmQgPSBlZGl0LT5tRkQ7CisgICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CisKKyAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICAgICAgTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgfQogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CiAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCkBAIC0xMTAyLDYgKzExMzIsOSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQorCisgICAgLy8gcmVzZXQgc28gd2UgZG9uJ3QgYXR0ZW1wdCB0byBzZW5kIHRoaXMgYmFjaworICAgIG1EYXRhLnJlc2V0KCk7CiAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBsZW5ndGgpOwogICAgIHVpbnQ2NF90IGVuZCA9IG9mZnNldCArIGxlbmd0aDsKICAgICBpZiAoZW5kID4gZWRpdC0+bVNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCA4NTlhMThlLi5kZmE4MjU4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0zOSw2ICszOSw5IEBACiAKICAgICBNdHBEYXRhYmFzZSogICAgICAgIG1EYXRhYmFzZTsKIAorICAgIC8vIGFwcGVhciBhcyBhIFBUUCBkZXZpY2UKKyAgICBib29sICAgICAgICAgICAgICAgIG1QdHA7CisKICAgICAvLyBncm91cCB0byBvd24gbmV3IGZpbGVzIGFuZCBmb2xkZXJzCiAgICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZUdyb3VwOwogICAgIC8vIHBlcm1pc3Npb25zIGZvciBuZXcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCkBAIC04Nyw3ICs5MCw3IEBACiAgICAgVmVjdG9yPE9iamVjdEVkaXQqPiAgbU9iamVjdEVkaXRMaXN0OwogCiBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwU2VydmVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcAppbmRleCBmZWY4MDY2Li45NDFlMzAzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCkBAIC0zMywxMSArMzMsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLAotICAgICAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwgdWludDY0X3QgcmVzZXJ2ZVNwYWNlLCBib29sIHJlbW92YWJsZSkKKyAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sIHVpbnQ2NF90IHJlc2VydmVTcGFjZSwKKyAgICAgICAgYm9vbCByZW1vdmFibGUsIHVpbnQ2NF90IG1heEZpbGVTaXplKQogICAgIDogICBtU3RvcmFnZUlEKGlkKSwKICAgICAgICAgbUZpbGVQYXRoKGZpbGVQYXRoKSwKICAgICAgICAgbURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKSwKICAgICAgICAgbU1heENhcGFjaXR5KDApLAorICAgICAgICBtTWF4RmlsZVNpemUobWF4RmlsZVNpemUpLAogICAgICAgICBtUmVzZXJ2ZVNwYWNlKHJlc2VydmVTcGFjZSksCiAgICAgICAgIG1SZW1vdmFibGUocmVtb3ZhYmxlKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKaW5kZXggM2U0ZjQwZC4uZTVhMmU1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0zMSw2ICszMSw3IEBACiAgICAgTXRwU3RyaW5nICAgICAgICAgICAgICAgbUZpbGVQYXRoOwogICAgIE10cFN0cmluZyAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbjsKICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heEZpbGVTaXplOwogICAgIC8vIGFtb3VudCBvZiBmcmVlIHNwYWNlIHRvIGxlYXZlIHVuYWxsb2NhdGVkCiAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbVJlc2VydmVTcGFjZTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVtb3ZhYmxlOwpAQCAtMzgsNyArMzksNyBAQAogcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLCB1aW50NjRfdCByZXNlcnZlU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbW92YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlbW92YWJsZSwgdWludDY0X3QgbWF4RmlsZVNpemUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBTdG9yYWdlKCk7CiAKICAgICBpbmxpbmUgTXRwU3RvcmFnZUlEICAgICBnZXRTdG9yYWdlSUQoKSBjb25zdCB7IHJldHVybiBtU3RvcmFnZUlEOyB9CkBAIC01MCw2ICs1MSw3IEBACiAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKICAgICBpbmxpbmUgY29uc3QgY2hhciogICAgICBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltRmlsZVBhdGg7IH0KICAgICBpbmxpbmUgYm9vbCAgICAgICAgICAgICBpc1JlbW92YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1SZW1vdmFibGU7IH0KKyAgICBpbmxpbmUgdWludDY0X3QgICAgICAgICBnZXRNYXhGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1NYXhGaWxlU2l6ZTsgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MjZjYjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQTJkcEF1ZGlvSW50ZXJmYWNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIkEyZHBBdWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgImF1ZGlvL2xpYmEyZHAuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqc0EyZHBXYWtlTG9jayA9ICJBMmRwT3V0cHV0U3RyZWFtIjsKLSNkZWZpbmUgTUFYX1dSSVRFX1JFVFJJRVMgIDUKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIEEyZHBBdWRpb0ludGVyZmFjZTo6Y3JlYXRlQTJkcEludGVyZmFjZSgpCi0vL3sKLS8vICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3ID0gMDsKLS8vCi0vLyAgICBodyA9IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmNyZWF0ZSgpOwotLy8gICAgTE9HRCgibmV3IEEyZHBBdWRpb0ludGVyZmFjZShodzogJXApIiwgaHcpOwotLy8gICAgaHcgPSBuZXcgQTJkcEF1ZGlvSW50ZXJmYWNlKGh3KTsKLS8vICAgIHJldHVybiBodzsKLS8vfQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb0ludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykgOgotICAgIG1PdXRwdXQoMCksIG1IYXJkd2FyZUludGVyZmFjZShodyksIG1CbHVldG9vdGhFbmFibGVkKHRydWUpLCBtU3VzcGVuZGVkKGZhbHNlKQotewotfQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6On5BMmRwQXVkaW9JbnRlcmZhY2UoKQotewotICAgIGNsb3NlT3V0cHV0U3RyZWFtKChBdWRpb1N0cmVhbU91dCAqKW1PdXRwdXQpOwotICAgIGRlbGV0ZSBtSGFyZHdhcmVJbnRlcmZhY2U7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6aW5pdENoZWNrKCkKLXsKLSAgICBpZiAobUhhcmR3YXJlSW50ZXJmYWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmluaXRDaGVjaygpOwotfQotCi1BdWRpb1N0cmVhbU91dCogQTJkcEF1ZGlvSW50ZXJmYWNlOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICB1aW50MzJfdCBkZXZpY2VzLCBpbnQgKmZvcm1hdCwgdWludDMyX3QgKmNoYW5uZWxzLCB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKLXsKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZXMpKSB7Ci0gICAgICAgIExPR1YoIkEyZHBBdWRpb0ludGVyZmFjZTo6b3Blbk91dHB1dFN0cmVhbSgpIG9wZW4gSFcgZGV2aWNlOiAleCIsIGRldmljZXMpOwotICAgICAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gMDsKLQotICAgIC8vIG9ubHkgb25lIG91dHB1dCBzdHJlYW0gYWxsb3dlZAotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIGlmIChzdGF0dXMpCi0gICAgICAgICAgICAqc3RhdHVzID0gLTE7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBuZXcgb3V0cHV0IHN0cmVhbQotICAgIEEyZHBBdWRpb1N0cmVhbU91dCogb3V0ID0gbmV3IEEyZHBBdWRpb1N0cmVhbU91dCgpOwotICAgIGlmICgoZXJyID0gb3V0LT5zZXQoZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSkpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1PdXRwdXQgPSBvdXQ7Ci0gICAgICAgIG1PdXRwdXQtPnNldEJsdWV0b290aEVuYWJsZWQobUJsdWV0b290aEVuYWJsZWQpOwotICAgICAgICBtT3V0cHV0LT5zZXRTdXNwZW5kZWQobVN1c3BlbmRlZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVsZXRlIG91dDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzKQotICAgICAgICAqc3RhdHVzID0gZXJyOwotICAgIHJldHVybiBtT3V0cHV0OwotfQotCi12b2lkIEEyZHBBdWRpb0ludGVyZmFjZTo6Y2xvc2VPdXRwdXRTdHJlYW0oQXVkaW9TdHJlYW1PdXQqIG91dCkgewotICAgIGlmIChtT3V0cHV0ID09IDAgfHwgbU91dHB1dCAhPSBvdXQpIHsKLSAgICAgICAgbUhhcmR3YXJlSW50ZXJmYWNlLT5jbG9zZU91dHB1dFN0cmVhbShvdXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXQ7Ci0gICAgICAgIG1PdXRwdXQgPSAwOwotICAgIH0KLX0KLQotCi1BdWRpb1N0cmVhbUluKiBBMmRwQXVkaW9JbnRlcmZhY2U6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPm9wZW5JbnB1dFN0cmVhbShkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzdGF0dXMsIGFjb3VzdGljcyk7Ci19Ci0KLXZvaWQgQTJkcEF1ZGlvSW50ZXJmYWNlOjpjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmNsb3NlSW5wdXRTdHJlYW0oaW4pOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OnNldE1vZGUoaW50IG1vZGUpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+c2V0TW9kZShtb2RlKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+c2V0TWljTXV0ZShzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6Z2V0TWljTXV0ZShib29sKiBzdGF0ZSkKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5nZXRNaWNNdXRlKHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5OwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgTE9HVigic2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0KLSAgICBrZXkgPSAiYmx1ZXRvb3RoX2VuYWJsZWQiOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUJsdWV0b290aEVuYWJsZWQgPSAodmFsdWUgPT0gInRydWUiKTsKLSAgICAgICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgICAgIG1PdXRwdXQtPnNldEJsdWV0b290aEVuYWJsZWQobUJsdWV0b290aEVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLSAgICBrZXkgPSBTdHJpbmc4KCJBMmRwU3VzcGVuZGVkIik7Ci0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtU3VzcGVuZGVkID0gKHZhbHVlID09ICJ0cnVlIik7Ci0gICAgICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zZXRTdXNwZW5kZWQobVN1c3BlbmRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtLnNpemUoKSkgewotICAgICAgICBzdGF0dXNfdCBod1N0YXR1cyA9IG1IYXJkd2FyZUludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gaHdTdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1TdHJpbmc4IEEyZHBBdWRpb0ludGVyZmFjZTo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgYTJkcFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5OwotCi0gICAga2V5ID0gImJsdWV0b290aF9lbmFibGVkIjsKLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHZhbHVlID0gbUJsdWV0b290aEVuYWJsZWQgPyAidHJ1ZSIgOiAiZmFsc2UiOwotICAgICAgICBhMmRwUGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAga2V5ID0gIkEyZHBTdXNwZW5kZWQiOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgdmFsdWUgPSBtU3VzcGVuZGVkID8gInRydWUiIDogImZhbHNlIjsKLSAgICAgICAgYTJkcFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzICA9IGEyZHBQYXJhbS50b1N0cmluZygpOwotCi0gICAgaWYgKHBhcmFtLnNpemUoKSkgewotICAgICAgICBpZiAoa2V5VmFsdWVQYWlycyAhPSAiIikgewotICAgICAgICAgICAga2V5VmFsdWVQYWlycyArPSAiOyI7Ci0gICAgICAgIH0KLSAgICAgICAga2V5VmFsdWVQYWlycyArPSBtSGFyZHdhcmVJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgTE9HVigiZ2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIGtleVZhbHVlUGFpcnM7Ci19Ci0KLXNpemVfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KQotewotICAgIHJldHVybiBtSGFyZHdhcmVJbnRlcmZhY2UtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2KTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gbUhhcmR3YXJlSW50ZXJmYWNlLT5zZXRNYXN0ZXJWb2x1bWUodik7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgcmV0dXJuIG1IYXJkd2FyZUludGVyZmFjZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6QTJkcEF1ZGlvU3RyZWFtT3V0KCkgOgotICAgIG1GZCgtMSksIG1TdGFuZGJ5KHRydWUpLCBtU3RhcnRDb3VudCgwKSwgbVJldHJ5Q291bnQoMCksIG1EYXRhKE5VTEwpLAotICAgIC8vIGFzc3VtZSBCVCBlbmFibGVkIHRvIHN0YXJ0LCB0aGlzIGlzIHNhZmUgYmVjYXVzZSBpdHMgb25seSB0aGUKLSAgICAvLyBlbmFibGVkLT5kaXNhYmxlZCB0cmFuc2l0aW9uIHdlIGFyZSB3b3JyaWVkIGFib3V0Ci0gICAgbUJsdWV0b290aEVuYWJsZWQodHJ1ZSksIG1EZXZpY2UoMCksIG1DbG9zaW5nKGZhbHNlKSwgbVN1c3BlbmRlZChmYWxzZSkKLXsKLSAgICAvLyB1c2UgYW55IGFkZHJlc3MgYnkgZGVmYXVsdAotICAgIHN0cmNweShtQTJkcEFkZHJlc3MsICIwMDowMDowMDowMDowMDowMCIpOwotICAgIGluaXQoKTsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldCgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlLCBpbnQgKnBGb3JtYXQsIHVpbnQzMl90ICpwQ2hhbm5lbHMsIHVpbnQzMl90ICpwUmF0ZSkKLXsKLSAgICBpbnQgbEZvcm1hdCA9IHBGb3JtYXQgPyAqcEZvcm1hdCA6IDA7Ci0gICAgdWludDMyX3QgbENoYW5uZWxzID0gcENoYW5uZWxzID8gKnBDaGFubmVscyA6IDA7Ci0gICAgdWludDMyX3QgbFJhdGUgPSBwUmF0ZSA/ICpwUmF0ZSA6IDA7Ci0KLSAgICBMT0dEKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldCAleCwgJWQsICVkLCAlZFxuIiwgZGV2aWNlLCBsRm9ybWF0LCBsQ2hhbm5lbHMsIGxSYXRlKTsKLQotICAgIC8vIGZpeCB1cCBkZWZhdWx0cwotICAgIGlmIChsRm9ybWF0ID09IDApIGxGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICBpZiAobENoYW5uZWxzID09IDApIGxDaGFubmVscyA9IGNoYW5uZWxzKCk7Ci0gICAgaWYgKGxSYXRlID09IDApIGxSYXRlID0gc2FtcGxlUmF0ZSgpOwotCi0gICAgLy8gY2hlY2sgdmFsdWVzCi0gICAgaWYgKChsRm9ybWF0ICE9IGZvcm1hdCgpKSB8fAotICAgICAgICAgICAgKGxDaGFubmVscyAhPSBjaGFubmVscygpKSB8fAotICAgICAgICAgICAgKGxSYXRlICE9IHNhbXBsZVJhdGUoKSkpewotICAgICAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQoKTsKLSAgICAgICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGNoYW5uZWxzKCk7Ci0gICAgICAgIGlmIChwUmF0ZSkgKnBSYXRlID0gc2FtcGxlUmF0ZSgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGxGb3JtYXQ7Ci0gICAgaWYgKHBDaGFubmVscykgKnBDaGFubmVscyA9IGxDaGFubmVsczsKLSAgICBpZiAocFJhdGUpICpwUmF0ZSA9IGxSYXRlOwotCi0gICAgbURldmljZSA9IGRldmljZTsKLSAgICBtQnVmZmVyRHVyYXRpb25VcyA9ICgoYnVmZmVyU2l6ZSgpICogMTAwMCApLyBmcmFtZVNpemUoKSAvIHNhbXBsZVJhdGUoKSkgKiAxMDAwOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6On5BMmRwQXVkaW9TdHJlYW1PdXQoKQotewotICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dCBkZXN0cnVjdG9yIik7Ci0gICAgY2xvc2UoKTsKLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQgZGVzdHJ1Y3RvciByZXR1cm5pbmcgZnJvbSBjbG9zZSgpIik7Ci19Ci0KLXNzaXplX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IC0xOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBieXRlczsKLQotICAgICAgICBpZiAoIW1CbHVldG9vdGhFbmFibGVkIHx8IG1DbG9zaW5nIHx8IG1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6d3JpdGUoKSwgYnV0IGJsdWV0b290aCBkaXNhYmxlZCBcCi0gICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEVuYWJsZWQgJWQsIG1DbG9zaW5nICVkLCBtU3VzcGVuZGVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEVuYWJsZWQsIG1DbG9zaW5nLCBtU3VzcGVuZGVkKTsKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN0YW5kYnkpIHsKLSAgICAgICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrIChQQVJUSUFMX1dBS0VfTE9DSywgc0EyZHBXYWtlTG9jayk7Ci0gICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBpbml0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgPCAwKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBpbnQgcmV0cmllcyA9IE1BWF9XUklURV9SRVRSSUVTOwotICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCAmJiByZXRyaWVzKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBhMmRwX3dyaXRlKG1EYXRhLCBidWZmZXIsIHJlbWFpbmluZyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIExPR0UoImEyZHBfd3JpdGUgZmFpbGVkIGVycjogJWRcbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHJpZXMtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbWFpbmluZyAtPSBzdGF0dXM7Ci0gICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKWJ1ZmZlciArIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIEEyRFAgc2luayBydW5zIGFibm9ybWFsbHkgZmFzdCwgc2xlZXAgYSBsaXR0bGUgc28gdGhhdCBhdWRpb2ZsaW5nZXIgbWl4ZXIgdGhyZWFkCi0gICAgICAgIC8vIGRvZXMgbm8gc3BpbiBhbmQgc3RhcnZlIG90aGVyIHRocmVhZHMuCi0gICAgICAgIC8vIE5PVEU6IEl0IGlzIGxpa2VseSB0aGF0IHRoZSBBMkRQIGhlYWRzZXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkCi0gICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAoKHVpbnQzMl90KW5zMnVzKG5vdyAtIG1MYXN0V3JpdGVUaW1lKSA8IChtQnVmZmVyRHVyYXRpb25VcyA+PiAyKSkgewotICAgICAgICAgICAgTE9HVigiQTJEUCBzaW5rIHJ1bnMgdG9vIGZhc3QiKTsKLSAgICAgICAgICAgIHVzbGVlcChtQnVmZmVyRHVyYXRpb25VcyAtICh1aW50MzJfdCluczJ1cyhub3cgLSBtTGFzdFdyaXRlVGltZSkpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0V3JpdGVUaW1lID0gbm93OwotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0KLSAgICB9Ci1FcnJvcjoKLQotICAgIHN0YW5kYnkoKTsKLQotICAgIC8vIFNpbXVsYXRlIGF1ZGlvIG91dHB1dCB0aW1pbmcgaW4gY2FzZSBvZiBlcnJvcgotICAgIHVzbGVlcChtQnVmZmVyRHVyYXRpb25Vcyk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6aW5pdCgpCi17Ci0gICAgaWYgKCFtRGF0YSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhMmRwX2luaXQoNDQxMDAsIDIsICZtRGF0YSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJhMmRwX2luaXQgZmFpbGVkIGVycjogJWRcbiIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGEyZHBfc2V0X3NpbmsobURhdGEsIG1BMmRwQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0OjpzdGFuZGJ5KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHN0YW5kYnlfbCgpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c3RhbmRieV9sKCkKLXsKLSAgICBpbnQgcmVzdWx0ID0gTk9fRVJST1I7Ci0KLSAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIExPR1ZfSUYobUNsb3NpbmcgfHwgIW1CbHVldG9vdGhFbmFibGVkLCAiU3RhbmRieSBza2lwIHN0b3A6IGNsb3NpbmcgJWQgZW5hYmxlZCAlZCIsCi0gICAgICAgICAgICAgICAgbUNsb3NpbmcsIG1CbHVldG9vdGhFbmFibGVkKTsKLSAgICAgICAgaWYgKCFtQ2xvc2luZyAmJiBtQmx1ZXRvb3RoRW5hYmxlZCkgewotICAgICAgICAgICAgcmVzdWx0ID0gYTJkcF9zdG9wKG1EYXRhKTsKLSAgICAgICAgfQotICAgICAgICByZWxlYXNlX3dha2VfbG9jayhzQTJkcFdha2VMb2NrKTsKLSAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOCgiYTJkcF9zaW5rX2FkZHJlc3MiKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpbnQgZGV2aWNlOwotICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSBzdHJsZW4oIjAwOjAwOjAwOjAwOjAwOjAwIikpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEFkZHJlc3ModmFsdWUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLSAgICBrZXkgPSBTdHJpbmc4KCJjbG9zaW5nIik7Ci0gICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtQ2xvc2luZyA9ICh2YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgICBpZiAobUNsb3NpbmcpIHsKLSAgICAgICAgICAgIHN0YW5kYnkoKTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gICAga2V5ID0gQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmc7Ci0gICAgaWYgKHBhcmFtLmdldEludChrZXksIGRldmljZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZSkpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBpZiAocGFyYW0uc2l6ZSgpKSB7Ci0gICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotU3RyaW5nOCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBTdHJpbmc4IGtleSA9IFN0cmluZzgoImEyZHBfc2lua19hZGRyZXNzIik7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHZhbHVlID0gbUEyZHBBZGRyZXNzOwotICAgICAgICBwYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotICAgIGtleSA9IEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nOwotICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgcGFyYW0uYWRkSW50KGtleSwgKGludCltRGV2aWNlKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OmdldFBhcmFtZXRlcnMoKSAlcyIsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0QWRkcmVzcyhjb25zdCBjaGFyKiBhZGRyZXNzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChzdHJsZW4oYWRkcmVzcykgIT0gc3RybGVuKCIwMDowMDowMDowMDowMDowMCIpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgIHN0cmNweShtQTJkcEFkZHJlc3MsIGFkZHJlc3MpOwotICAgIGlmIChtRGF0YSkKLSAgICAgICAgYTJkcF9zZXRfc2luayhtRGF0YSwgbUEyZHBBZGRyZXNzKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldEJsdWV0b290aEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIExPR0QoInNldEJsdWV0b290aEVuYWJsZWQgJWQiLCBlbmFibGVkKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIG1CbHVldG9vdGhFbmFibGVkID0gZW5hYmxlZDsKLSAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIGNsb3NlX2woKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0U3VzcGVuZGVkKGJvb2wgb25PZmYpCi17Ci0gICAgTE9HVigic2V0U3VzcGVuZGVkICVkIiwgb25PZmYpOwotICAgIG1TdXNwZW5kZWQgPSBvbk9mZjsKLSAgICBzdGFuZGJ5KCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dWKCJBMmRwQXVkaW9TdHJlYW1PdXQ6OmNsb3NlKCkgY2FsbGluZyBjbG9zZV9sKCkiKTsKLSAgICByZXR1cm4gY2xvc2VfbCgpOwotfQotCi1zdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2VfbCgpCi17Ci0gICAgc3RhbmRieV9sKCk7Ci0gICAgaWYgKG1EYXRhKSB7Ci0gICAgICAgIExPR1YoIkEyZHBBdWRpb1N0cmVhbU91dDo6Y2xvc2VfbCgpIGNhbGxpbmcgYTJkcF9jbGVhbnVwKG1EYXRhKSIpOwotICAgICAgICBhMmRwX2NsZWFudXAobURhdGEpOwotICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkcml2ZXJGcmFtZXMpCi17Ci0gICAgLy9UT0RPOiBlbmFibGUgd2hlbiBzdXBwb3J0ZWQgYnkgZHJpdmVyCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmUyYzZhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBMkRQX0FVRElPX0hBUkRXQVJFX0gKLSNkZWZpbmUgQTJEUF9BVURJT19IQVJEV0FSRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb0hhcmR3YXJlQmFzZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQTJkcEF1ZGlvSW50ZXJmYWNlIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCi17Ci0gICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0OwotCi1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBMmRwQXVkaW9JbnRlcmZhY2UoQXVkaW9IYXJkd2FyZUludGVyZmFjZSogaHcpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb0ludGVyZmFjZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TW9kZShpbnQgbW9kZSk7Ci0KLSAgICAvLyBtaWMgbXV0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE1pY011dGUoYm9vbCogc3RhdGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQpOwotCi0gICAgLy8gY3JlYXRlIEkvTyBzdHJlYW1zCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbU91dCogb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmb3JtYXQ9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNoYW5uZWxzPTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlPTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dFN0cmVhbShBdWRpb1N0cmVhbU91dCogb3V0KTsKLQotICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpOwotICAgIHZpcnR1YWwgICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluKiBpbik7Ci0vLyAgICBzdGF0aWMgQXVkaW9IYXJkd2FyZUludGVyZmFjZSogY3JlYXRlQTJkcEludGVyZmFjZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0IDogcHVibGljIEF1ZGlvU3RyZWFtT3V0IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQTJkcEF1ZGlvU3RyZWFtT3V0KCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkEyZHBBdWRpb1N0cmVhbU91dCgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldCh1aW50MzJfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBSYXRlKTsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gNDQxMDA7IH0KLSAgICAgICAgLy8gU0JDIGNvZGVjIHdhbnRzIGEgbXVsdGlwbGUgb2YgNTEyCi0gICAgICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDUxMiAqIDIwOyB9Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOyB9Ci0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gKCgxMDAwKmJ1ZmZlclNpemUoKSkvZnJhbWVTaXplKCkpL3NhbXBsZVJhdGUoKSArIDIwMDsgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhbmRieSgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQTJkcEF1ZGlvSW50ZXJmYWNlOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGluaXQoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjbG9zZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNsb3NlX2woKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBZGRyZXNzKGNvbnN0IGNoYXIqIGFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEJsdWV0b290aEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRTdXNwZW5kZWQoYm9vbCBvbk9mZik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhbmRieV9sKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1GZDsKLSAgICAgICAgICAgICAgICBib29sICAgICAgICBtU3RhbmRieTsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtU3RhcnRDb3VudDsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICBtUmV0cnlDb3VudDsKLSAgICAgICAgICAgICAgICBjaGFyICAgICAgICBtQTJkcEFkZHJlc3NbMjBdOwotICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIG1EYXRhOwotICAgICAgICAgICAgICAgIE11dGV4ICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1CbHVldG9vdGhFbmFibGVkOwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1EZXZpY2U7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUNsb3Npbmc7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbVN1c3BlbmRlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICBtTGFzdFdyaXRlVGltZTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtQnVmZmVyRHVyYXRpb25VczsKLSAgICB9OwotCi0gICAgZnJpZW5kIGNsYXNzIEEyZHBBdWRpb1N0cmVhbU91dDsKLQotICAgIEEyZHBBdWRpb1N0cmVhbU91dCogICAgIG1PdXRwdXQ7Ci0gICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSAgKm1IYXJkd2FyZUludGVyZmFjZTsKLSAgICBjaGFyICAgICAgICBtQTJkcEFkZHJlc3NbMjBdOwotICAgIGJvb2wgICAgICAgIG1CbHVldG9vdGhFbmFibGVkOwotICAgIGJvb2wgICAgICAgIG1TdXNwZW5kZWQ7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEEyRFBfQVVESU9fSEFSRFdBUkVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA2OWE0YWRjLi5mYTQ5NTkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMSw3NyArMSw1IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAotI0FVRElPX1BPTElDWV9URVNUIDo9IHRydWUKLSNFTkFCTEVfQVVESU9fRFVNUCA6PSB0cnVlCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0KLWlmZXEgKCQoQVVESU9fUE9MSUNZX1RFU1QpLHRydWUpCi0gIEVOQUJMRV9BVURJT19EVU1QIDo9IHRydWUKLWVuZGlmCi0KLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcCBcCi0gICAgQXVkaW9IYXJkd2FyZVN0dWIuY3BwIFwKLSAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcAotCi1pZmVxICgkKEVOQUJMRV9BVURJT19EVU1QKSx0cnVlKQotICBMT0NBTF9TUkNfRklMRVMgKz0gQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAotICBMT0NBTF9DRkxBR1MgKz0gLURFTkFCTEVfQVVESU9fRFVNUAotZW5kaWYKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGliaGFyZHdhcmVfbGVnYWN5Ci0KLWlmZXEgKCQoc3RyaXAgJChCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8pKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURHRU5FUklDX0FVRElPCi1lbmRpZgotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ludGVyZmFjZQotCi1pZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQotICBMT0NBTF9TUkNfRklMRVMgKz0gQTJkcEF1ZGlvSW50ZXJmYWNlLmNwcAotICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmEyZHAKLSAgTE9DQUxfQ0ZMQUdTICs9IC1EV0lUSF9CTFVFVE9PVEggLURXSVRIX0EyRFAKLSAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZXopCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYm1lZGlhCi0KLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLSBMT0NBTF9MRExJQlMgKz0gLWxkbAotZWxzZQotIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5YmFzZQotCi1pZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURXSVRIX0EyRFAKLWVuZGlmCi0KLWlmZXEgKCQoQVVESU9fUE9MSUNZX1RFU1QpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtREFVRElPX1BPTElDWV9URVNUCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKQEAgLTgyLDQyICsxMCwyNCBAQAogICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCiAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAogCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlibWVkaWEgXAorICAgIGxpYmhhcmR3YXJlIFwKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAotICAgIGxpYmVmZmVjdHMKKyAgICBsaWJlZmZlY3RzIFwKKyAgICBsaWJkbCBcCisgICAgbGlicG93ZXJtYW5hZ2VyCiAKLWlmZXEgKCQoc3RyaXAgJChCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8pKSx0cnVlKQotICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmF1ZGlvaW50ZXJmYWNlIGxpYmF1ZGlvcG9saWN5YmFzZQotICBMT0NBTF9DRkxBR1MgKz0gLURHRU5FUklDX0FVRElPCi1lbHNlCi0gIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYXVkaW8gbGliYXVkaW9wb2xpY3kKLWVuZGlmCi0KLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLSBMT0NBTF9MRExJQlMgKz0gLWxkbAotZWxzZQotIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLWVuZGlmCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjcHVzdGF0cyBcCisgICAgbGlibWVkaWFfaGVscGVyCiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgogCi1pZmVxICgkKEJPQVJEX0hBVkVfQkxVRVRPT1RIKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURXSVRIX0JMVUVUT09USCAtRFdJVEhfQTJEUAotICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmEyZHAKLWVuZGlmCi0KLWlmZXEgKCQoQVVESU9fUE9MSUNZX1RFU1QpLHRydWUpCi0gIExPQ0FMX0NGTEFHUyArPSAtREFVRElPX1BPTElDWV9URVNUCi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi0gICAgaWZlcSAoJChIT1NUX09TKSxsaW51eCkKLSAgICAgICAgTE9DQUxfTERMSUJTICs9IC1scnQgLWxwdGhyZWFkCi0gICAgZW5kaWYKLWVuZGlmCi0KIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTExMTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotLyogLy9kZXZpY2Uvc2VydmVycy9BdWRpb0ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlckR1bXAiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiQXVkaW9EdW1wSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb0R1bXBJbnRlcmZhY2U6OkF1ZGlvRHVtcEludGVyZmFjZShBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiBodykKLSAgICA6IG1Qb2xpY3lDb21tYW5kcyhTdHJpbmc4KCIiKSksIG1GaWxlTmFtZShTdHJpbmc4KCIiKSkKLXsKLSAgICBpZihodyA9PSAwKSB7Ci0gICAgICAgIExPR0UoIkR1bXAgY29uc3RydWN0IGh3ID0gMCIpOwotICAgIH0KLSAgICBtRmluYWxJbnRlcmZhY2UgPSBodzsKLSAgICBMT0dWKCJDb25zdHJ1Y3RvciAlcCwgbUZpbmFsSW50ZXJmYWNlICVwIiwgdGhpcywgbUZpbmFsSW50ZXJmYWNlKTsKLX0KLQotCi1BdWRpb0R1bXBJbnRlcmZhY2U6On5BdWRpb0R1bXBJbnRlcmZhY2UoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oKEF1ZGlvU3RyZWFtT3V0ICopbU91dHB1dHNbaV0pOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBjbG9zZUlucHV0U3RyZWFtKChBdWRpb1N0cmVhbUluICopbUlucHV0c1tpXSk7Ci0gICAgfQotCi0gICAgaWYobUZpbmFsSW50ZXJmYWNlKSBkZWxldGUgbUZpbmFsSW50ZXJmYWNlOwotfQotCi0KLUF1ZGlvU3RyZWFtT3V0KiBBdWRpb0R1bXBJbnRlcmZhY2U6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQotewotICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRGaW5hbCA9IE5VTEw7Ci0gICAgaW50IGxGb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKLSAgICB1aW50MzJfdCBsQ2hhbm5lbHMgPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHVpbnQzMl90IGxSYXRlID0gNDQxMDA7Ci0KLQotICAgIG91dEZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cyk7Ci0gICAgaWYgKG91dEZpbmFsICE9IDApIHsKLSAgICAgICAgbEZvcm1hdCA9IG91dEZpbmFsLT5mb3JtYXQoKTsKLSAgICAgICAgbENoYW5uZWxzID0gb3V0RmluYWwtPmNoYW5uZWxzKCk7Ci0gICAgICAgIGxSYXRlID0gb3V0RmluYWwtPnNhbXBsZVJhdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBsRm9ybWF0ID0gKmZvcm1hdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IGxGb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgICAgIGxDaGFubmVscyA9ICpjaGFubmVsczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmNoYW5uZWxzID0gbENoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IDApIHsKLSAgICAgICAgICAgIGlmICgqc2FtcGxlUmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbFJhdGUgPSAqc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBsUmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSAqc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgfQotICAgIExPR1YoIm9wZW5PdXRwdXRTdHJlYW0oKSwgb3V0RmluYWwgJXAiLCBvdXRGaW5hbCk7Ci0KLSAgICBBdWRpb1N0cmVhbU91dER1bXAgKmR1bU91dHB1dCA9IG5ldyBBdWRpb1N0cmVhbU91dER1bXAodGhpcywgbU91dHB1dHMuc2l6ZSgpLCBvdXRGaW5hbCwKLSAgICAgICAgICAgIGRldmljZXMsIGxGb3JtYXQsIGxDaGFubmVscywgbFJhdGUpOwotICAgIG1PdXRwdXRzLmFkZChkdW1PdXRwdXQpOwotCi0gICAgcmV0dXJuIGR1bU91dHB1dDsKLX0KLQotdm9pZCBBdWRpb0R1bXBJbnRlcmZhY2U6OmNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpCi17Ci0gICAgQXVkaW9TdHJlYW1PdXREdW1wICpkdW1wT3V0ID0gKEF1ZGlvU3RyZWFtT3V0RHVtcCAqKW91dDsKLQotICAgIGlmIChtT3V0cHV0cy5pbmRleE9mKGR1bXBPdXQpIDwgMCkgewotICAgICAgICBMT0dXKCJBdHRlbXB0IHRvIGNsb3NlIGludmFsaWQgb3V0cHV0IHN0cmVhbSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTE9HVigiY2xvc2VPdXRwdXRTdHJlYW0oKSBvdXRwdXQgJXAiLCBvdXQpOwotCi0gICAgZHVtcE91dC0+c3RhbmRieSgpOwotICAgIGlmIChkdW1wT3V0LT5maW5hbFN0cmVhbSgpICE9IE5VTEwpIHsKLSAgICAgICAgbUZpbmFsSW50ZXJmYWNlLT5jbG9zZU91dHB1dFN0cmVhbShkdW1wT3V0LT5maW5hbFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBtT3V0cHV0cy5yZW1vdmUoZHVtcE91dCk7Ci0gICAgZGVsZXRlIGR1bXBPdXQ7Ci19Ci0KLUF1ZGlvU3RyZWFtSW4qIEF1ZGlvRHVtcEludGVyZmFjZTo6b3BlbklucHV0U3RyZWFtKHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICBBdWRpb1N0cmVhbUluKiBpbkZpbmFsID0gTlVMTDsKLSAgICBpbnQgbEZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOwotICAgIHVpbnQzMl90IGxDaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk87Ci0gICAgdWludDMyX3QgbFJhdGUgPSA4MDAwOwotCi0gICAgaW5GaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3BlbklucHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cywgYWNvdXN0aWNzKTsKLSAgICBpZiAoaW5GaW5hbCAhPSAwKSB7Ci0gICAgICAgIGxGb3JtYXQgPSBpbkZpbmFsLT5mb3JtYXQoKTsKLSAgICAgICAgbENoYW5uZWxzID0gaW5GaW5hbC0+Y2hhbm5lbHMoKTsKLSAgICAgICAgbFJhdGUgPSBpbkZpbmFsLT5zYW1wbGVSYXRlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKmZvcm1hdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbEZvcm1hdCA9ICpmb3JtYXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBsRm9ybWF0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKmNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBsQ2hhbm5lbHMgPSAqY2hhbm5lbHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpjaGFubmVscyA9IGxDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKnNhbXBsZVJhdGUgIT0gMCkgewotICAgICAgICAgICAgICAgIGxSYXRlID0gKnNhbXBsZVJhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gbFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgKnN0YXR1cyA9IE5PX0VSUk9SOwotICAgIH0KLSAgICBMT0dWKCJvcGVuSW5wdXRTdHJlYW0oKSwgaW5GaW5hbCAlcCIsIGluRmluYWwpOwotCi0gICAgQXVkaW9TdHJlYW1JbkR1bXAgKmR1bUlucHV0ID0gbmV3IEF1ZGlvU3RyZWFtSW5EdW1wKHRoaXMsIG1JbnB1dHMuc2l6ZSgpLCBpbkZpbmFsLAotICAgICAgICAgICAgZGV2aWNlcywgbEZvcm1hdCwgbENoYW5uZWxzLCBsUmF0ZSk7Ci0gICAgbUlucHV0cy5hZGQoZHVtSW5wdXQpOwotCi0gICAgcmV0dXJuIGR1bUlucHV0OwotfQotdm9pZCBBdWRpb0R1bXBJbnRlcmZhY2U6OmNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pCi17Ci0gICAgQXVkaW9TdHJlYW1JbkR1bXAgKmR1bXBJbiA9IChBdWRpb1N0cmVhbUluRHVtcCAqKWluOwotCi0gICAgaWYgKG1JbnB1dHMuaW5kZXhPZihkdW1wSW4pIDwgMCkgewotICAgICAgICBMT0dXKCJBdHRlbXB0IHRvIGNsb3NlIGludmFsaWQgaW5wdXQgc3RyZWFtIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZHVtcEluLT5zdGFuZGJ5KCk7Ci0gICAgaWYgKGR1bXBJbi0+ZmluYWxTdHJlYW0oKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaW5hbEludGVyZmFjZS0+Y2xvc2VJbnB1dFN0cmVhbShkdW1wSW4tPmZpbmFsU3RyZWFtKCkpOwotICAgIH0KLQotICAgIG1JbnB1dHMucmVtb3ZlKGR1bXBJbik7Ci0gICAgZGVsZXRlIGR1bXBJbjsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb0R1bXBJbnRlcmZhY2U6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgaW50IHZhbHVlSW50OwotICAgIExPR1YoInNldFBhcmFtZXRlcnMgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLQotICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfZmlsZV9uYW1lIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBtRmlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7Ci0gICAgICAgIG1Qb2xpY3lDb21tYW5kcyA9IHBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIExPR1YoInRlc3RfY21kX3BvbGljeSBjb21tYW5kICVzIHdyaXR0ZW4iLCBtUG9saWN5Q29tbWFuZHMuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKG1GaW5hbEludGVyZmFjZSAhPSAwICkgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVN0cmluZzggQXVkaW9EdW1wSW50ZXJmYWNlOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXNwb25zZTsKLSAgICBTdHJpbmc4IHZhbHVlOwotCi0vLyAgICBMT0dWKCJnZXRQYXJhbWV0ZXJzICVzIiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtUG9saWN5Q29tbWFuZHMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBBdWRpb1BhcmFtZXRlcihtUG9saWN5Q29tbWFuZHMpOwotICAgICAgICAgICAgcmVzcG9uc2UuYWRkSW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLmFkZEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKLS8vICAgICAgICBMT0dWKCJ0ZXN0X2NtZF9wb2xpY3kgY29tbWFuZCAlcyByZWFkIiwgbVBvbGljeUNvbW1hbmRzLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmVzcG9uc2UuYWRkKFN0cmluZzgoInRlc3RfY21kX2ZpbGVfbmFtZSIpLCBtRmlsZU5hbWUpOwotICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfZmlsZV9uYW1lIikpOwotICAgIH0KLQotICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHJlc3BvbnNlLnRvU3RyaW5nKCk7Ci0KLSAgICBpZiAocGFyYW0uc2l6ZSgpICYmIG1GaW5hbEludGVyZmFjZSAhPSAwICkgewotICAgICAgICBrZXlWYWx1ZVBhaXJzICs9ICI7IjsKLSAgICAgICAga2V5VmFsdWVQYWlycyArPSBtRmluYWxJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGtleVZhbHVlUGFpcnM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvRHVtcEludGVyZmFjZTo6c2V0TW9kZShpbnQgbW9kZSkKLXsKLSAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNb2RlKG1vZGUpOwotfQotCi1zaXplX3QgQXVkaW9EdW1wSW50ZXJmYWNlOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKLXsKLSAgICByZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvU3RyZWFtT3V0RHVtcDo6QXVkaW9TdHJlYW1PdXREdW1wKEF1ZGlvRHVtcEludGVyZmFjZSAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZmluYWxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpCi0gICAgOiBtSW50ZXJmYWNlKGludGVyZmFjZSksIG1JZChpZCksCi0gICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbHMoY2hhbm5lbHMpLCBtTGF0ZW5jeSgwKSwgbURldmljZShkZXZpY2VzKSwKLSAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtRmlsZSgwKSwgbUZpbGVDb3VudCgwKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBDb25zdHJ1Y3RvciAlcCwgbUludGVyZmFjZSAlcCwgbUZpbmFsU3RyZWFtICVwIiwgdGhpcywgbUludGVyZmFjZSwgbUZpbmFsU3RyZWFtKTsKLX0KLQotCi1BdWRpb1N0cmVhbU91dER1bXA6On5BdWRpb1N0cmVhbU91dER1bXAoKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBkZXN0cnVjdG9yIik7Ci0gICAgQ2xvc2UoKTsKLX0KLQotc3NpemVfdCBBdWRpb1N0cmVhbU91dER1bXA6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIHNzaXplX3QgcmV0OwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSkgewotICAgICAgICByZXQgPSBtRmluYWxTdHJlYW0tPndyaXRlKGJ1ZmZlciwgYnl0ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVzbGVlcCgoKChieXRlcyAqIDEwMDApIC8gZnJhbWVTaXplKCkpIC8gc2FtcGxlUmF0ZSgpKSAqIDEwMDApOwotICAgICAgICByZXQgPSBieXRlczsKLSAgICB9Ci0gICAgaWYoIW1GaWxlKSB7Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlLT5maWxlTmFtZSgpICE9ICIiKSB7Ci0gICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgICAgIHNwcmludGYobmFtZSwgIiVzX291dF8lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7Ci0gICAgICAgICAgICBtRmlsZSA9IGZvcGVuKG5hbWUsICJ3YiIpOwotICAgICAgICAgICAgTE9HVigiT3BlbmluZyBkdW1wIGZpbGUgJXMsIGZoICVwIiwgbmFtZSwgbUZpbGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtRmlsZSkgewotICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dER1bXA6OnN0YW5kYnkoKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcCBzdGFuZGJ5KCksIG1GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtRmlsZSwgbUZpbmFsU3RyZWFtKTsKLQotICAgIENsb3NlKCk7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c3RhbmRieSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpzYW1wbGVSYXRlKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zYW1wbGVSYXRlKCk7Ci0gICAgcmV0dXJuIG1TYW1wbGVSYXRlOwotfQotCi1zaXplX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpidWZmZXJTaXplKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5idWZmZXJTaXplKCk7Ci0gICAgcmV0dXJuIG1CdWZmZXJTaXplOwotfQotCi11aW50MzJfdCBBdWRpb1N0cmVhbU91dER1bXA6OmNoYW5uZWxzKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5jaGFubmVscygpOwotICAgIHJldHVybiBtQ2hhbm5lbHM7Ci19Ci1pbnQgQXVkaW9TdHJlYW1PdXREdW1wOjpmb3JtYXQoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPmZvcm1hdCgpOwotICAgIHJldHVybiBtRm9ybWF0OwotfQotdWludDMyX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpsYXRlbmN5KCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5sYXRlbmN5KCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0dXNfdCBBdWRpb1N0cmVhbU91dER1bXA6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtT3V0RHVtcDo6c2V0UGFyYW1ldGVycyAlcyIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgewotICAgICAgICByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7Ci0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBpbnQgdmFsdWVJbnQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInNldF9pZCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUlkID0gdmFsdWVJbnQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJmb3JtYXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChtRmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gdmFsdWVJbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoImNoYW5uZWxzIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAodmFsdWVJbnQgPT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTyB8fCB2YWx1ZUludCA9PSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTykgewotICAgICAgICAgICAgbUNoYW5uZWxzID0gdmFsdWVJbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAodmFsdWVJbnQgPiAwICYmIHZhbHVlSW50IDw9IDQ4MDAwKSB7Ci0gICAgICAgICAgICBpZiAobUZpbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1PdXREdW1wOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvU3RyZWFtT3V0RHVtcDo6Q2xvc2UoKQotewotICAgIGlmKG1GaWxlKSB7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgICAgIG1GaWxlID0gMDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0RHVtcDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbihkc3BGcmFtZXMpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb1N0cmVhbUluRHVtcDo6QXVkaW9TdHJlYW1JbkR1bXAoQXVkaW9EdW1wSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGZpbmFsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKQotICAgIDogbUludGVyZmFjZShpbnRlcmZhY2UpLCBtSWQoaWQpLAotICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1Gb3JtYXQoZm9ybWF0KSwgbUNoYW5uZWxzKGNoYW5uZWxzKSwgbURldmljZShkZXZpY2VzKSwKLSAgICAgIG1CdWZmZXJTaXplKDEwMjQpLCBtRmluYWxTdHJlYW0oZmluYWxTdHJlYW0pLCBtRmlsZSgwKSwgbUZpbGVDb3VudCgwKQotewotICAgIExPR1YoIkF1ZGlvU3RyZWFtSW5EdW1wIENvbnN0cnVjdG9yICVwLCBtSW50ZXJmYWNlICVwLCBtRmluYWxTdHJlYW0gJXAiLCB0aGlzLCBtSW50ZXJmYWNlLCBtRmluYWxTdHJlYW0pOwotfQotCi0KLUF1ZGlvU3RyZWFtSW5EdW1wOjp+QXVkaW9TdHJlYW1JbkR1bXAoKQotewotICAgIENsb3NlKCk7Ci19Ci0KLXNzaXplX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKQotewotICAgIHNzaXplX3QgcmV0OwotCi0gICAgaWYgKG1GaW5hbFN0cmVhbSkgewotICAgICAgICByZXQgPSBtRmluYWxTdHJlYW0tPnJlYWQoYnVmZmVyLCBieXRlcyk7Ci0gICAgICAgIGlmKCFtRmlsZSkgewotICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIlc19pbl8lZF8lZC5wY20iLCBtSW50ZXJmYWNlLT5maWxlTmFtZSgpLnN0cmluZygpLCBtSWQsICsrbUZpbGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAid2IiKTsKLSAgICAgICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGlucHV0IGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GaWxlKSB7Ci0gICAgICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdXNsZWVwKCgoKGJ5dGVzICogMTAwMCkgLyBmcmFtZVNpemUoKSkgLyBzYW1wbGVSYXRlKCkpICogMTAwMCk7Ci0gICAgICAgIHJldCA9IGJ5dGVzOwotICAgICAgICBpZighbUZpbGUpIHsKLSAgICAgICAgICAgIGNoYXIgbmFtZVsyNTVdOwotICAgICAgICAgICAgc3RyY3B5KG5hbWUsICIvc2RjYXJkL211c2ljL3NpbmU0NDAiKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVscygpID09IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8pIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9tbyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9zdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcm1hdCgpID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfMTZiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzhiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSgpIDwgMTYwMDApIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl84ayIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCAzMjAwMCkgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzIyayIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCA0ODAwMCkgewotICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzQ0ayIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl80OGsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiLndhdiIpOwotICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAicmIiKTsKLSAgICAgICAgICAgIExPR1YoIk9wZW5pbmcgaW5wdXQgcmVhZCBmaWxlICVzLCBmaCAlcCIsIG5hbWUsIG1GaWxlKTsKLSAgICAgICAgICAgIGlmIChtRmlsZSkgewotICAgICAgICAgICAgICAgIGZzZWVrKG1GaWxlLCBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobUZpbGUpIHsKLSAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gZnJlYWQoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwotICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PTAgJiYgYnl0ZXNSZWFkIDwgYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBmc2VlayhtRmlsZSwgQVVESU9fRFVNUF9XQVZFX0hEUl9TSVpFLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgZnJlYWQoKHVpbnQ4X3QgKilidWZmZXIrYnl0ZXNSZWFkLCBieXRlcy1ieXRlc1JlYWQsIDEsIG1GaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5EdW1wOjpzdGFuZGJ5KCkKLXsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbUluRHVtcCBzdGFuZGJ5KCksIG1GaWxlICVwLCBtRmluYWxTdHJlYW0gJXAiLCBtRmlsZSwgbUZpbmFsU3RyZWFtKTsKLQotICAgIENsb3NlKCk7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c3RhbmRieSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNldEdhaW4oZmxvYXQgZ2FpbikKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zZXRHYWluKGdhaW4pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNhbXBsZVJhdGUoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPnNhbXBsZVJhdGUoKTsKLSAgICByZXR1cm4gbVNhbXBsZVJhdGU7Ci19Ci0KLXNpemVfdCBBdWRpb1N0cmVhbUluRHVtcDo6YnVmZmVyU2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+YnVmZmVyU2l6ZSgpOwotICAgIHJldHVybiBtQnVmZmVyU2l6ZTsKLX0KLQotdWludDMyX3QgQXVkaW9TdHJlYW1JbkR1bXA6OmNoYW5uZWxzKCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5jaGFubmVscygpOwotICAgIHJldHVybiBtQ2hhbm5lbHM7Ci19Ci0KLWludCBBdWRpb1N0cmVhbUluRHVtcDo6Zm9ybWF0KCkgY29uc3QKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5mb3JtYXQoKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkR1bXA6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbUluRHVtcDo6c2V0UGFyYW1ldGVycygpIik7Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1JbkR1bXA6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwotCi0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICByZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLX0KLQotdW5zaWduZWQgaW50IEF1ZGlvU3RyZWFtSW5EdW1wOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAotewotICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUluRHVtcDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKG1GaW5hbFN0cmVhbSAhPSAwICkgcmV0dXJuIG1GaW5hbFN0cmVhbS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvU3RyZWFtSW5EdW1wOjpDbG9zZSgpCi17Ci0gICAgaWYobUZpbGUpIHsKLSAgICAgICAgZmNsb3NlKG1GaWxlKTsKLSAgICAgICAgbUZpbGUgPSAwOwotICAgIH0KLX0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNGNlNWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qIC8vZGV2aWNlL3NlcnZlcnMvQXVkaW9GbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT19EVU1QX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fRFVNUF9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvSGFyZHdhcmVCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUgNDQKLQotY2xhc3MgQXVkaW9EdW1wSW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1N0cmVhbU91dER1bXAgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXREdW1wKEF1ZGlvRHVtcEludGVyZmFjZSAqaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBmaW5hbFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvU3RyZWFtT3V0RHVtcCgpOwotCi0gICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDbG9zZSh2b2lkKTsKLSAgICBBdWRpb1N0cmVhbU91dCogICAgIGZpbmFsU3RyZWFtKCkgeyByZXR1cm4gbUZpbmFsU3RyZWFtOyB9Ci0gICAgdWludDMyX3QgICAgICAgICAgICBkZXZpY2UoKSB7IHJldHVybiBtRGV2aWNlOyB9Ci0gICAgaW50ICAgICAgICAgICAgICAgICBnZXRJZCgpICB7IHJldHVybiBtSWQ7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi1wcml2YXRlOgotICAgIEF1ZGlvRHVtcEludGVyZmFjZSAqbUludGVyZmFjZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBtSWQ7Ci0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtRm9ybWF0OyAgICAgICAgICAgICAgICAgICAvLwotICAgIHVpbnQzMl90IG1DaGFubmVsczsgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBjb25maWd1cmF0aW9uCi0gICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KLSAgICBzaXplX3QgIG1CdWZmZXJTaXplOwotICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgKm1GaW5hbFN0cmVhbTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICptRmlsZTsgICAgICAvLyBvdXRwdXQgZmlsZQotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVDb3VudDsKLX07Ci0KLWNsYXNzIEF1ZGlvU3RyZWFtSW5EdW1wIDogcHVibGljIEF1ZGlvU3RyZWFtSW4gewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbkR1bXAoQXVkaW9EdW1wSW50ZXJmYWNlICppbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogZmluYWxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb1N0cmVhbUluRHVtcCgpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0gICAgdmlydHVhbCBzc2l6ZV90ICAgICByZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBDbG9zZSh2b2lkKTsKLSAgICBBdWRpb1N0cmVhbUluKiAgICAgZmluYWxTdHJlYW0oKSB7IHJldHVybiBtRmluYWxTdHJlYW07IH0KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGRldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KLQotcHJpdmF0ZToKLSAgICBBdWRpb0R1bXBJbnRlcmZhY2UgKm1JbnRlcmZhY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgbUlkOwotICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOyAgICAgICAgICAgICAgIC8vCi0gICAgdWludDMyX3QgbUZvcm1hdDsgICAgICAgICAgICAgICAgICAgLy8KLSAgICB1aW50MzJfdCBtQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgY29uZmlndXJhdGlvbgotICAgIHVpbnQzMl90IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHNpemVfdCAgbUJ1ZmZlclNpemU7Ci0gICAgQXVkaW9TdHJlYW1JbiAgICAgICptRmluYWxTdHJlYW07Ci0gICAgRklMRSAgICAgICAgICAgICAgICAqbUZpbGU7ICAgICAgLy8gb3V0cHV0IGZpbGUKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlQ291bnQ7Ci19OwotCi1jbGFzcyBBdWRpb0R1bXBJbnRlcmZhY2UgOiBwdWJsaWMgQXVkaW9IYXJkd2FyZUJhc2UKLXsKLQotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EdW1wSW50ZXJmYWNlKEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3KTsKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZvcm1hdD0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHM9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGU9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cz0wKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpOwotCi0gICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9EdW1wSW50ZXJmYWNlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPmluaXRDaGVjaygpO30KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKTt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKTt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1vZGUoaW50IG1vZGUpOwotCi0gICAgLy8gbWljIG11dGUKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE1pY011dGUoYm9vbCBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0TWljTXV0ZShzdGF0ZSk7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWljTXV0ZShib29sKiBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+Z2V0TWljTXV0ZShzdGF0ZSk7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQpOwotCi0gICAgdmlydHVhbCBBdWRpb1N0cmVhbUluKiBvcGVuSW5wdXRTdHJlYW0odWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzLCBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyk7Ci0gICAgdmlydHVhbCAgICB2b2lkICAgICAgICBjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsgfQotCi0gICAgICAgICAgICBTdHJpbmc4ICAgICBmaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlTmFtZTsgfQotcHJvdGVjdGVkOgotCi0gICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSAgICAgICAgICAqbUZpbmFsSW50ZXJmYWNlOwotICAgIFNvcnRlZFZlY3RvcjxBdWRpb1N0cmVhbU91dER1bXAgKj4gICBtT3V0cHV0czsKLSAgICBTb3J0ZWRWZWN0b3I8QXVkaW9TdHJlYW1JbkR1bXAgKj4gICAgbUlucHV0czsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeUNvbW1hbmRzOwotICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVOYW1lOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQVVESU9fRFVNUF9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBkZmY5ZjMzLi4yMzU1ZDVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzEsNyArMzEsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CkBAIC00MCwyOCArNDIsMjQgQEAKIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KIAogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKIAotI2lmZGVmIFdJVEhfQTJEUAotI2luY2x1ZGUgIkEyZHBBdWRpb0ludGVyZmFjZS5oIgotI2VuZGlmCi0KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCi0KLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgorI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CisjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgorLy8gI2RlZmluZSBERUJVR19DUFVfVVNBR0UgMTAgIC8vIGxvZyBzdGF0aXN0aWNzIGV2ZXJ5IG4gd2FsbCBjbG9jayBzZWNvbmRzCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBnRWZmZWN0TGliUGF0aDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04Niw0MSArODQsMjMgQEAKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhcm5pbmdUaHJvdHRsZSA9IHNlY29uZHMoNSk7CiAKLQotI2RlZmluZSBBVURJT0ZMSU5HRVJfU0VDVVJJVFlfRU5BQkxFRCAxCisvLyBSZWNvcmRUaHJlYWQgbG9vcCBzbGVlcCB0aW1lIHVwb24gYXBwbGljYXRpb24gb3ZlcnJ1biBvciBhdWRpbyBIQUwgcmVhZCBlcnJvcgorc3RhdGljIGNvbnN0IGludCBrUmVjb3JkVGhyZWFkU2xlZXBVcyA9IDUwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGJvb2wgcmVjb3JkaW5nQWxsb3dlZCgpIHsKLSNpZm5kZWYgSEFWRV9BTkRST0lEX09TCi0gICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZiBBVURJT0ZMSU5HRVJfU0VDVVJJVFlfRU5BQkxFRAogICAgIGlmIChnZXRwaWQoKSA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIikpOwogICAgIGlmICghb2spIExPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwogICAgIHJldHVybiBvazsKLSNlbHNlCi0gICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIikpKQotICAgICAgICBMT0dXKCJXQVJOSU5HOiBOZWVkIHRvIGFkZCBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIHRvIG1hbmlmZXN0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewotI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmIEFVRElPRkxJTkdFUl9TRUNVUklUWV9FTkFCTEVECiAgICAgaWYgKGdldHBpZCgpID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7CiAgICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKSk7CiAgICAgaWYgKCFvaykgTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CiAgICAgcmV0dXJuIG9rOwotI2Vsc2UKLSAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKSkpCi0gICAgICAgIExPR1coIldBUk5JTkc6IE5lZWQgdG8gYWRkIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MgdG8gbWFuaWZlc3QiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgogfQogCiAvLyBUbyBjb2xsZWN0IHRoZSBhbXBsaWZpZXIgdXNhZ2UKQEAgLTEzNiwzNCArMTE2LDExMCBAQAogICAgIHNlcnZpY2UtPmFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CiB9CiAKK3N0YXRpYyBpbnQgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgY29uc3QgaHdfbW9kdWxlX3QgKiptb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGludCByYzsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIG1vZCk7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIG91dDsKKworICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4oKm1vZCwgZGV2KTsKKyAgICBMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCisgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICByZXR1cm4gMDsKKworb3V0OgorICAgICptb2QgPSBOVUxMOworICAgICpkZXYgPSBOVUxMOworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKKyAgICAicHJpbWFyeSIsCisgICAgImEyZHAiLAorICAgICJ1c2IiLAorfTsKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKCh4KSkvc2l6ZW9mKCgoeClbMF0pKSkKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkF1ZGlvRmxpbmdlcigpCiAgICAgOiBCbkF1ZGlvRmxpbmdlcigpLAotICAgICAgICBtQXVkaW9IYXJkd2FyZSgwKSwgbU1hc3RlclZvbHVtZSgxLjBmKSwgbU1hc3Rlck11dGUoZmFsc2UpLCBtTmV4dFVuaXF1ZUlkKDEpCisgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYoMCksIG1NYXN0ZXJWb2x1bWUoMS4wZiksIG1NYXN0ZXJNdXRlKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKSwKKyAgICAgICAgbUJ0TnJlYyhmYWxzZSkKIHsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6Om9uRmlyc3RSZWYoKQoreworICAgIGludCByYyA9IDA7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCisgICAgLyogVE9ETzogbW92ZSBhbGwgdGhpcyB3b3JrIGludG8gYW4gSW5pdCgpIGZ1bmN0aW9uICovCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKIAotICAgIG1BdWRpb0hhcmR3YXJlID0gQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6Y3JlYXRlKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF1ZGlvX2ludGVyZmFjZXMpOyBpKyspIHsKKyAgICAgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKworICAgICAgICByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKGF1ZGlvX2ludGVyZmFjZXNbaV0sICZtb2QsICZkZXYpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBMT0dJKCJMb2FkZWQgJXMgYXVkaW8gaW50ZXJmYWNlIGZyb20gJXMgKCVzKSIsIGF1ZGlvX2ludGVyZmFjZXNbaV0sCisgICAgICAgICAgICAgbW9kLT5uYW1lLCBtb2QtPmlkKTsKKyAgICAgICAgbUF1ZGlvSHdEZXZzLnB1c2goZGV2KTsKKworICAgICAgICBpZiAoIW1QcmltYXJ5SGFyZHdhcmVEZXYpIHsKKyAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYgPSBkZXY7CisgICAgICAgICAgICBMT0dJKCJVc2luZyAnJXMnICglcy4lcykgYXMgdGhlIHByaW1hcnkgYXVkaW8gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgbW9kLT5uYW1lLCBtb2QtPmlkLCBhdWRpb19pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lOSVQ7Ci0gICAgaWYgKG1BdWRpb0hhcmR3YXJlLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKLSAgICAgICAgbU1vZGUgPSBBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUw7Ci0gICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOwotICAgICAgICBtQXVkaW9IYXJkd2FyZS0+c2V0TW9kZShtTW9kZSk7Ci0gICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NQVNURVJfVk9MVU1FOwotICAgICAgICBtQXVkaW9IYXJkd2FyZS0+c2V0TWFzdGVyVm9sdW1lKDEuMGYpOwotICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoIkNvdWxkbid0IGV2ZW4gaW5pdGlhbGl6ZSB0aGUgc3R1YmJlZCBhdWRpbyBoYXJkd2FyZSEiKTsKKworICAgIGlmICghbVByaW1hcnlIYXJkd2FyZURldiB8fCBtQXVkaW9Id0RldnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgTE9HRSgiUHJpbWFyeSBhdWRpbyBpbnRlcmZhY2Ugbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbUF1ZGlvSHdEZXZzW2ldOworCisgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lOSVQ7CisgICAgICAgIHJjID0gZGV2LT5pbml0X2NoZWNrKGRldik7CisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKworICAgICAgICAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKKyAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOworICAgICAgICAgICAgZGV2LT5zZXRfbW9kZShkZXYsIG1Nb2RlKTsKKyAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NQVNURVJfVk9MVU1FOworICAgICAgICAgICAgZGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShkZXYsIDEuMGYpOworICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjppbml0Q2hlY2soKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QcmltYXJ5SGFyZHdhcmVEZXYgPT0gTlVMTCB8fCBtQXVkaW9Id0RldnMuc2l6ZSgpID09IDApCisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogQXVkaW9GbGluZ2VyOjp+QXVkaW9GbGluZ2VyKCkKIHsKKyAgICBpbnQgbnVtX2RldnMgPSBtQXVkaW9Id0RldnMuc2l6ZSgpOworCiAgICAgd2hpbGUgKCFtUmVjb3JkVGhyZWFkcy5pc0VtcHR5KCkpIHsKICAgICAgICAgLy8gY2xvc2VJbnB1dCgpIHdpbGwgcmVtb3ZlIGZpcnN0IGVudHJ5IGZyb20gbVJlY29yZFRocmVhZHMKICAgICAgICAgY2xvc2VJbnB1dChtUmVjb3JkVGhyZWFkcy5rZXlBdCgwKSk7CkBAIC0xNzIsMTIgKzIyOCwyNCBAQAogICAgICAgICAvLyBjbG9zZU91dHB1dCgpIHdpbGwgcmVtb3ZlIGZpcnN0IGVudHJ5IGZyb20gbVBsYXliYWNrVGhyZWFkcwogICAgICAgICBjbG9zZU91dHB1dChtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApKTsKICAgICB9Ci0gICAgaWYgKG1BdWRpb0hhcmR3YXJlKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9IYXJkd2FyZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldnM7IGkrKykgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbUF1ZGlvSHdEZXZzW2ldOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoZGV2KTsKICAgICB9CisgICAgbUF1ZGlvSHdEZXZzLmNsZWFyKCk7CiB9CiAKLQorYXVkaW9faHdfZGV2aWNlX3QqIEF1ZGlvRmxpbmdlcjo6ZmluZFN1aXRhYmxlSHdEZXZfbCh1aW50MzJfdCBkZXZpY2VzKQoreworICAgIC8qIGZpcnN0IG1hdGNoaW5nIEhXIGRldmljZSBpcyByZXR1cm5lZCAqLworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgIGlmICgoZGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMoZGV2KSAmIGRldmljZXMpID09IGRldmljZXMpCisgICAgICAgICAgICByZXR1cm4gZGV2OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CkBAIC0yNzYsOCArMzQ0LDEwIEBACiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQXVkaW9IYXJkd2FyZSkgewotICAgICAgICAgICAgbUF1ZGlvSGFyZHdhcmUtPmR1bXBTdGF0ZShmZCwgYXJncyk7CisgICAgICAgIC8vIGR1bXAgYWxsIGhhcmR3YXJlIGRldnMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgICAgICBkZXYtPmR1bXAoZGV2LCBmZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtMjkyLDggKzM2Miw4IEBACiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTMwOCw3ICszNzgsNyBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgaW50IGxTZXNzaW9uSWQ7CiAKLSAgICBpZiAoc3RyZWFtVHlwZSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSIpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CkBAIC0zMzQsNyArNDA0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIExPR1YoImNyZWF0ZVRyYWNrKCkgc2Vzc2lvbklkOiAlZCIsIChzZXNzaW9uSWQgPT0gTlVMTCkgPyAtMiA6ICpzZXNzaW9uSWQpOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0KSB7CkBAIC0zNTMsNyArNDIzLDcgQEAKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkX2woKTsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQpAQCAtMzYxLDcgKzQzMSw3IEBACiAgICAgICAgIExPR1YoImNyZWF0ZVRyYWNrKCkgbFNlc3Npb25JZDogJWQiLCBsU2Vzc2lvbklkKTsKIAogICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgbFNlc3Npb25JZCwgJmxTdGF0dXMpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsICZsU3RhdHVzKTsKIAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCkBAIC00MDksNyArNDc5LDcgQEAKICAgICByZXR1cm4gdGhyZWFkLT5jaGFubmVsQ291bnQoKTsKIH0KIAotaW50IEF1ZGlvRmxpbmdlcjo6Zm9ybWF0KGludCBvdXRwdXQpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwpAQCAtNDUzLDcgKzUyMyw3IEBACiAgICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NQVNURVJfVk9MVU1FOwotICAgICAgICBpZiAobUF1ZGlvSGFyZHdhcmUtPnNldE1hc3RlclZvbHVtZSh2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKG1QcmltYXJ5SGFyZHdhcmVEZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1QcmltYXJ5SGFyZHdhcmVEZXYsIHZhbHVlKSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgdmFsdWUgPSAxLjBmOwogICAgICAgICB9CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CkBAIC00NzUsNyArNTQ1LDcgQEAKICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgaWYgKChtb2RlIDwgMCkgfHwgKG1vZGUgPj0gQXVkaW9TeXN0ZW06Ok5VTV9NT0RFUykpIHsKKyAgICBpZiAoKG1vZGUgPCAwKSB8fCAobW9kZSA+PSBBVURJT19NT0RFX0NOVCkpIHsKICAgICAgICAgTE9HVygiSWxsZWdhbCB2YWx1ZTogc2V0TW9kZSglZCkiLCBtb2RlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC00ODMsNyArNTUzLDcgQEAKICAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawogICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01PREU7Ci0gICAgICAgIHJldCA9IG1BdWRpb0hhcmR3YXJlLT5zZXRNb2RlKG1vZGUpOworICAgICAgICByZXQgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5zZXRfbW9kZShtUHJpbWFyeUhhcmR3YXJlRGV2LCBtb2RlKTsKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CiAKQEAgLTUwNiwxNiArNTc2LDE2IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTUlDX01VVEU7Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldE1pY011dGUoc3RhdGUpOworICAgIHN0YXR1c190IHJldCA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPnNldF9taWNfbXV0ZShtUHJpbWFyeUhhcmR3YXJlRGV2LCBzdGF0ZSk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICByZXR1cm4gcmV0OwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6Z2V0TWljTXV0ZSgpIGNvbnN0CiB7Ci0gICAgYm9vbCBzdGF0ZSA9IEF1ZGlvU3lzdGVtOjpNT0RFX0lOVkFMSUQ7CisgICAgYm9vbCBzdGF0ZSA9IEFVRElPX01PREVfSU5WQUxJRDsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19HRVRfTUlDX01VVEU7Ci0gICAgbUF1ZGlvSGFyZHdhcmUtPmdldE1pY011dGUoJnN0YXRlKTsKKyAgICBtUHJpbWFyeUhhcmR3YXJlRGV2LT5nZXRfbWljX211dGUobVByaW1hcnlIYXJkd2FyZURldiwgJnN0YXRlKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIHJldHVybiBzdGF0ZTsKIH0KQEAgLTU1Miw3ICs2MjIsNyBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbSA8IDAgfHwgdWludDMyX3Qoc3RyZWFtKSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW0gPCAwIHx8IHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTg1LDggKzY1NSw4IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBpZiAoc3RyZWFtIDwgMCB8fCB1aW50MzJfdChzdHJlYW0pID49IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTIHx8Ci0gICAgICAgIHVpbnQzMl90KHN0cmVhbSkgPT0gQXVkaW9TeXN0ZW06OkVORk9SQ0VEX0FVRElCTEUpIHsKKyAgICBpZiAoc3RyZWFtIDwgMCB8fCB1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQgfHwKKyAgICAgICAgdWludDMyX3Qoc3RyZWFtKSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNjAwLDcgKzY3MCw3IEBACiAKIGZsb2F0IEF1ZGlvRmxpbmdlcjo6c3RyZWFtVm9sdW1lKGludCBzdHJlYW0sIGludCBvdXRwdXQpIGNvbnN0CiB7Ci0gICAgaWYgKHN0cmVhbSA8IDAgfHwgdWludDMyX3Qoc3RyZWFtKSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW0gPCAwIHx8IHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICByZXR1cm4gMC4wZjsKICAgICB9CiAKQEAgLTYyMSw3ICs2OTEsNyBAQAogCiBib29sIEF1ZGlvRmxpbmdlcjo6c3RyZWFtTXV0ZShpbnQgc3RyZWFtKSBjb25zdAogewotICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSAoaW50KUF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKSB7CisgICAgaWYgKHN0cmVhbSA8IDAgfHwgc3RyZWFtID49IChpbnQpQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTY0Myw5ICs3MTMsMzkgQEAKICAgICBpZiAoaW9IYW5kbGUgPT0gMCkgewogICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fU0VUX1BBUkFNRVRFUjsKLSAgICAgICAgcmVzdWx0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIHN0YXR1c190IGZpbmFsX3Jlc3VsdCA9IE5PX0VSUk9SOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2c1tpXTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRldi0+c2V0X3BhcmFtZXRlcnMoZGV2LCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGZpbmFsX3Jlc3VsdCA9IHJlc3VsdCA/OiBmaW5hbF9yZXN1bHQ7CisgICAgICAgIH0KICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlIHByZSBwcm9jZXNzaW5ncworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOworICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0tFWV9CVF9OUkVDKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAgICAgYm9vbCBidE5yZWMgPSAodmFsdWUgPT0gQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09OKTsKKyAgICAgICAgICAgIGlmIChtQnROcmVjICE9IGJ0TnJlYykgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrICp0cmFjayA9IHRocmVhZC0+dHJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9JTl9BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UoZGV2aWNlKSAmJiBidE5yZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnNldEVmZmVjdFN1c3BlbmRlZChGWF9JSURfQUVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnNldEVmZmVjdFN1c3BlbmRlZChGWF9JSURfTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnROcmVjID0gYnROcmVjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5hbF9yZXN1bHQ7CiAgICAgfQogCiAgICAgLy8gaG9sZCBhIHN0cm9uZyByZWYgb24gdGhyZWFkIGluIGNhc2UgY2xvc2VPdXRwdXQoKSBvciBjbG9zZUlucHV0KCkgaXMgY2FsbGVkCkBAIC02NTYsNiArNzU2LDE1IEBACiAgICAgICAgIHRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChpb0hhbmRsZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkLmdldCgpID09IHByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKKyAgICAgICAgICAgIC8vIGluZGljYXRlIG91dHB1dCBkZXZpY2UgY2hhbmdlIHRvIGFsbCBpbnB1dCB0aHJlYWRzIGZvciBwcmUgcHJvY2Vzc2luZworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSBOVUxMKSB7CkBAIC02NzEsNyArNzgwLDE1IEBACiAvLyAgICAgICAgICAgIGlvSGFuZGxlLCBrZXlzLnN0cmluZygpLCBnZXR0aWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKKyAgICAgICAgU3RyaW5nOCBvdXRfczg7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnNbaV07CisgICAgICAgICAgICBjaGFyICpzID0gZGV2LT5nZXRfcGFyYW1ldGVycyhkZXYsIGtleXMuc3RyaW5nKCkpOworICAgICAgICAgICAgb3V0X3M4ICs9IFN0cmluZzgocyk7CisgICAgICAgICAgICBmcmVlKHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRfczg7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTY4OSw3ICs4MDYsNyBAQAogCiBzaXplX3QgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvSGFyZHdhcmUtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CisgICAgcmV0dXJuIG1QcmltYXJ5SGFyZHdhcmVEZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtUHJpbWFyeUhhcmR3YXJlRGV2LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7CiB9CiAKIHVuc2lnbmVkIGludCBBdWRpb0ZsaW5nZXI6OmdldElucHV0RnJhbWVzTG9zdChpbnQgaW9IYW5kbGUpCkBAIC03MTYsNyArODMzLDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX1NFVF9WT0lDRV9WT0xVTUU7Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldFZvaWNlVm9sdW1lKHZhbHVlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1QcmltYXJ5SGFyZHdhcmVEZXYsIHZhbHVlKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogCiAgICAgcmV0dXJuIHJldDsKQEAgLTc5NiwxNyArOTEzLDIxIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgaW50IGlkKQorQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgaW50IGlkLCB1aW50MzJfdCBkZXZpY2UpCiAgICAgOiAgIFRocmVhZChmYWxzZSksCiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLCBtQ2hhbm5lbENvdW50KDApLAotICAgICAgICBtRnJhbWVTaXplKDEpLCBtRm9ybWF0KDApLCBtU3RhbmRieShmYWxzZSksIG1JZChpZCksIG1FeGl0aW5nKGZhbHNlKQorICAgICAgICBtRnJhbWVTaXplKDEpLCBtRm9ybWF0KDApLCBtU3RhbmRieShmYWxzZSksIG1JZChpZCksIG1FeGl0aW5nKGZhbHNlKSwKKyAgICAgICAgbURldmljZShkZXZpY2UpCiB7CisgICAgbURlYXRoUmVjaXBpZW50ID0gbmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcyk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6flRocmVhZEJhc2UoKQogewogICAgIG1QYXJhbUNvbmQuYnJvYWRjYXN0KCk7CiAgICAgbU5ld1BhcmFtZXRlcnMuY2xlYXIoKTsKKyAgICAvLyBkbyBub3QgbG9jayB0aGUgbXV0ZXggaW4gZGVzdHJ1Y3RvcgorICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpleGl0KCkKQEAgLTgzNSw3ICs5NTYsNyBAQAogICAgIHJldHVybiAoaW50KW1DaGFubmVsQ291bnQ7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Gb3JtYXQ7CiB9CkBAIC05MjEsNiArMTA0Miw4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgQ291bnQ6ICVkXG4iLCBtQ2hhbm5lbENvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBNYXNrOiAweCUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGcmFtZSBzaXplOiAlZFxuIiwgbUZyYW1lU2l6ZSk7CkBAIC05NTMsMjEgKzEwNzYsMjQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4tICVkIEVmZmVjdCBDaGFpbnM6XG4iLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSk7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1FZmZlY3RDaGFpbnNbaV07CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBjaGFpbi0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6YWNxdWlyZVdha2VMb2NrKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGFjcXVpcmVXYWtlTG9ja19sKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjphY3F1aXJlV2FrZUxvY2tfbCgpCit7CisgICAgaWYgKG1Qb3dlck1hbmFnZXIgPT0gMCkgeworICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKKyAgICAgICAgaWYgKGJpbmRlciA9PSAwKSB7CisgICAgICAgICAgICBMT0dXKCJUaHJlYWQgJXMgY2Fubm90IGNvbm5lY3QgdG8gdGhlIHBvd2VyIG1hbmFnZXIgc2VydmljZSIsIG1OYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOworICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KG1OYW1lKSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOworICAgICAgICB9CisgICAgICAgIExPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbU5hbWUsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVsZWFzZVdha2VMb2NrKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWxlYXNlV2FrZUxvY2tfbCgpCit7CisgICAgaWYgKG1XYWtlTG9ja1Rva2VuICE9IDApIHsKKyAgICAgICAgTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1OYW1lKTsKKyAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsKKyAgICAgICAgfQorICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmNsZWFyUG93ZXJNYW5hZ2VyKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CisgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQoreworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICB0aHJlYWQtPmNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgfQorICAgIExPR1coInBvd2VyIG1hbmFnZXIgc2VydmljZSBkaWVkICEhISIpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2V0RWZmZWN0U3VzcGVuZGVkKAorICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLCBib29sIHN1c3BlbmQsIGludCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbCh0eXBlLCBzdXNwZW5kLCBzZXNzaW9uSWQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2V0RWZmZWN0U3VzcGVuZGVkX2woCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsIGJvb2wgc3VzcGVuZCwgaW50IHNlc3Npb25JZCkKK3sKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CisgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhaW4tPnNldEVmZmVjdFN1c3BlbmRlZF9sKHR5cGUsIHN1c3BlbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhaW4tPnNldEVmZmVjdFN1c3BlbmRlZEFsbF9sKHN1c3BlbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgdXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCh0eXBlLCBzdXNwZW5kLCBzZXNzaW9uSWQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Y2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgaW50IGluZGV4ID0gbVN1c3BlbmRlZFNlc3Npb25zLmluZGV4T2ZLZXkoY2hhaW4tPnNlc3Npb25JZCgpKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvciA8aW50LCBzcDxTdXNwZW5kZWRTZXNzaW9uRGVzYz4gPiBzZXNzaW9uRWZmZWN0cyA9CisgICAgICAgICAgICBtU3VzcGVuZGVkU2Vzc2lvbnMuZWRpdFZhbHVlQXQoaW5kZXgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcCA8U3VzcGVuZGVkU2Vzc2lvbkRlc2M+IGRlc2MgPSBzZXNzaW9uRWZmZWN0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2MtPm1SZWZDb3VudDsgaisrKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkVmZmVjdHMua2V5QXQoaSkgPT0gRWZmZWN0Q2hhaW46OmtLZXlGb3JTdXNwZW5kQWxsKSB7CisgICAgICAgICAgICAgICAgY2hhaW4tPnNldEVmZmVjdFN1c3BlbmRlZEFsbF9sKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJjaGVja1N1c3BlbmRPbkFkZEVmZmVjdENoYWluX2woKSBzdXNwZW5kaW5nIGVmZmVjdHMgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tVHlwZS50aW1lTG93KTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+c2V0RWZmZWN0U3VzcGVuZGVkX2woJmRlc2MtPm1UeXBlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zT25SZW1vdmVFZmZlY3RDaGFpbl9sKAorICAgICAgICBjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQoreworICAgIGludCBpbmRleCA9IG1TdXNwZW5kZWRTZXNzaW9ucy5pbmRleE9mS2V5KGNoYWluLT5zZXNzaW9uSWQoKSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR1YoInVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zT25SZW1vdmVFZmZlY3RDaGFpbl9sKCkgcmVtb3ZlZCBzdXNwZW5kZWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICBjaGFpbi0+c2Vzc2lvbklkKCkpOworICAgIG1TdXNwZW5kZWRTZXNzaW9ucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCit7CisgICAgaW50IGluZGV4ID0gbVN1c3BlbmRlZFNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklkKTsKKworICAgIEtleWVkVmVjdG9yIDxpbnQsIHNwPFN1c3BlbmRlZFNlc3Npb25EZXNjPiA+IHNlc3Npb25FZmZlY3RzOworCisgICAgaWYgKHN1c3BlbmQpIHsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHNlc3Npb25FZmZlY3RzID0gbVN1c3BlbmRlZFNlc3Npb25zLmVkaXRWYWx1ZUF0KGluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdXNwZW5kZWRTZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBzZXNzaW9uRWZmZWN0cyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbkVmZmVjdHMgPSBtU3VzcGVuZGVkU2Vzc2lvbnMuZWRpdFZhbHVlQXQoaW5kZXgpOworICAgIH0KKworCisgICAgaW50IGtleSA9IEVmZmVjdENoYWluOjprS2V5Rm9yU3VzcGVuZEFsbDsKKyAgICBpZiAodHlwZSAhPSBOVUxMKSB7CisgICAgICAgIGtleSA9IHR5cGUtPnRpbWVMb3c7CisgICAgfQorICAgIGluZGV4ID0gc2Vzc2lvbkVmZmVjdHMuaW5kZXhPZktleShrZXkpOworCisgICAgc3AgPFN1c3BlbmRlZFNlc3Npb25EZXNjPiBkZXNjOworICAgIGlmIChzdXNwZW5kKSB7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBkZXNjID0gc2Vzc2lvbkVmZmVjdHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gbmV3IFN1c3BlbmRlZFNlc3Npb25EZXNjKCk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkZXNjLT5tVHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb25FZmZlY3RzLmFkZChrZXksIGRlc2MpOworICAgICAgICAgICAgTE9HVigidXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIHN1c3BlbmQgYWRkaW5nIGVmZmVjdCAlMDh4Iiwga2V5KTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmVmQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGVzYyA9IHNlc3Npb25FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoLS1kZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICAgICAgTE9HVigidXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIHJlc3RvcmUgcmVtb3ZpbmcgZWZmZWN0ICUwOHgiLCBrZXkpOworICAgICAgICAgICAgc2Vzc2lvbkVmZmVjdHMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkVmZmVjdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgTE9HVigidXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIHJlc3RvcmUgcmVtb3Zpbmcgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRTZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzZXNzaW9uRWZmZWN0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbVN1c3BlbmRlZFNlc3Npb25zLnJlcGxhY2VWYWx1ZUZvcihzZXNzaW9uSWQsIHNlc3Npb25FZmZlY3RzKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gVE9ETzogaW1wbGVtZW50IFBsYXliYWNrVGhyZWFkIG9yIFJlY29yZFRocmVhZCBzcGVjaWZpYyBiZWhhdmlvciBoZXJlCisKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgY2hhaW4tPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgIH0KK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQbGF5YmFja1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKQotICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQpLAorQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGxheWJhY2tUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZSkKKyAgICA6ICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBkZXZpY2UpLAogICAgICAgICBtTWl4QnVmZmVyKDApLCBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLCBtT3V0cHV0KG91dHB1dCksCi0gICAgICAgIG1MYXN0V3JpdGVUaW1lKDApLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAotICAgICAgICBtRGV2aWNlKGRldmljZSkKKyAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSkKIHsKKyAgICBzbnByaW50ZihtTmFtZSwga05hbWVMZW5ndGgsICJBdWRpb091dF8lZCIsIGlkKTsKKwogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CiAKICAgICBtTWFzdGVyVm9sdW1lID0gbUF1ZGlvRmxpbmdlci0+bWFzdGVyVm9sdW1lKCk7CiAgICAgbU1hc3Rlck11dGUgPSBtQXVkaW9GbGluZ2VyLT5tYXN0ZXJNdXRlKCk7CiAKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1Wb2x1bWVJbnRlcm5hbChzdHJlYW0pOwogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtTXV0ZShzdHJlYW0pOwogICAgIH0KQEAgLTk5NCw3ICsxMzM2LDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSAgQ2xpZW4gVHlwIEZtdCBDaG4gU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBtYXNrICAgU2Vzc2lvbiBCdWYgIFMgTSBGIFNSYXRlIExlZnRWIFJpZ2hWICBTZXJ2ICAgICAgIFVzZXIgICAgICAgTWFpbiBidWYgICBBdXggQnVmXG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTEwMDUsNyArMTM0Nyw3IEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIG1hc2sgICBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICB3cDxUcmFjaz4gd1RyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgaWYgKHdUcmFjayAhPSAwKSB7CkBAIC0xMDIwLDI0ICsxMzYyLDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4tICVkIEVmZmVjdCBDaGFpbnM6XG4iLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1FZmZlY3RDaGFpbnNbaV07Ci0gICAgICAgIGlmIChjaGFpbiAhPSAwKSB7Ci0gICAgICAgICAgICBjaGFpbi0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTEwNzgsMTIgKzE0MDIsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGxheWJhY2sgVGhyZWFkICVwIiwgdGhpcyk7Ci0KLSAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgcnVuKG1OYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKIC8vIFBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKQEAgLTEwOTEsOCArMTQxMCw4IEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCkBAIC0xMTAyLDExICsxNDIxLDE0IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbENvdW50ICE9IChpbnQpbUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6ICBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbENvdW50ICVkIGZvciBvdXRwdXQgJXAiLAotICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgbU91dHB1dCk7Ci0gICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxNYXNrICE9IG1DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgpAQCAtMTExNyw5ICsxNDM5LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtT3V0cHV0ID09IDApIHsKKyAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HRSgiQXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgbFN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKQEAgLTExMzAsMTIgKzE0NTIsMTIgQEAKICAgICAgICAgLy8gY29uZmxpY3RzIHdpbGwgaGFwcGVuIHdoZW4gdHJhY2tzIGFyZSBtb3ZlZCBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlciBieSBhdWRpbyBwb2xpY3kKICAgICAgICAgLy8gbWFuYWdlcgogICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbVR5cGUpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHQtPnNlc3Npb25JZCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSAhPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSl0LT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSAhPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpdC0+dHlwZSgpKSkgewogICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTE0Myw3ICsxNDY1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCk7CiAgICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xMTU0LDcgKzE0NzYsOCBAQAogICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgTE9HVigiY3JlYXRlVHJhY2tfbCgpIHNldHRpbmcgbWFpbiBidWZmZXIgJXAiLCBjaGFpbi0+aW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihjaGFpbi0+aW5CdWZmZXIoKSk7Ci0gICAgICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpdHJhY2stPnR5cGUoKSkpOworICAgICAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdCl0cmFjay0+dHlwZSgpKSk7CisgICAgICAgICAgICBjaGFpbi0+aW5jVHJhY2tDbnQoKTsKICAgICAgICAgfQogICAgIH0KICAgICBsU3RhdHVzID0gTk9fRVJST1I7CkBAIC0xMTY5LDcgKzE0OTIsNyBAQAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bGF0ZW5jeSgpIGNvbnN0CiB7CiAgICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQtPmxhdGVuY3koKTsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTIzOCw3ICsxNTYxLDcgQEAKICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HVigiYWRkVHJhY2tfbCgpIHN0YXJ0aW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhaW4tPnN0YXJ0VHJhY2soKTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+aW5jQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMjU2LDE0ICsxNTc5LDI5IEBACiB7CiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6VEVSTUlOQVRFRDsKICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKLSAgICAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjaykKK3sKKyAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgZGVsZXRlVHJhY2tOYW1lX2wodHJhY2stPm5hbWUoKSk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIGNoYWluLT5kZWNUcmFja0NudCgpOwogICAgIH0KIH0KIAogU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgcmV0dXJuIG1PdXRwdXQtPmdldFBhcmFtZXRlcnMoa2V5cyk7CisgICAgU3RyaW5nOCBvdXRfczg7CisgICAgY2hhciAqczsKKworICAgIHMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sIGtleXMuc3RyaW5nKCkpOworICAgIG91dF9zOCA9IFN0cmluZzgocyk7CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4gb3V0X3M4OwogfQogCiAvLyBkZXN0cm95VHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCkBAIC0xMjc2LDcgKzE2MTQsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsTWFzazsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTEyOTUsMTIgKzE2MzMsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpCiB7Ci0gICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxzID0gbU91dHB1dC0+Y2hhbm5lbHMoKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KUF1ZGlvU3lzdGVtOjpwb3BDb3VudChtQ2hhbm5lbHMpOwotICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5mb3JtYXQoKTsKLSAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KW1PdXRwdXQtPmZyYW1lU2l6ZSgpOwotICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+YnVmZmVyU2l6ZSgpIC8gbUZyYW1lU2l6ZTsKKyAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxNYXNrKTsKKyAgICBtRm9ybWF0ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVDb3VudCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pIC8gbUZyYW1lU2l6ZTsKIAogICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQ6IEFsd2F5cwogICAgIC8vIEFsbG9jYXRlIGEgc3RlcmVvIGJ1ZmZlciBldmVuIGlmIEhXIG91dHB1dCBpcyBtb25vLgpAQCAtMTMyNSwxMiArMTY2MywxMiBAQAogICAgIGlmIChoYWxGcmFtZXMgPT0gMCB8fCBkc3BGcmFtZXMgPT0gMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAobU91dHB1dCA9PSAwKSB7CisgICAgaWYgKGluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgKmhhbEZyYW1lcyA9IG1CeXRlc1dyaXR0ZW4vbU91dHB1dC0+ZnJhbWVTaXplKCk7CisgICAgKmhhbEZyYW1lcyA9IG1CeXRlc1dyaXR0ZW4gLyBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogCi0gICAgcmV0dXJuIG1PdXRwdXQtPmdldFJlbmRlclBvc2l0aW9uKGRzcEZyYW1lcyk7CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sIGRzcEZyYW1lcyk7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbihpbnQgc2Vzc2lvbklkKQpAQCAtMTM1NSw0OSArMTY5MywyMSBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKQogewotICAgIC8vIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdAorICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIHBsYWNlZCBpbiBzYW1lIHN0cmF0ZWd5IGFzIE1VU0lDIHN0cmVhbSBzbyB0aGF0CiAgICAgLy8gaXQgaXMgbW92ZWQgdG8gY29ycmVjdCBvdXRwdXQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2hlbiBBMkRQIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQKLSAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6TVVTSUMpOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmCiAgICAgICAgICAgICAgICAgISh0cmFjay0+bUNibGstPmZsYWdzICYgQ0JMS19JTlZBTElEX01TSykpIHsKLSAgICAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgdHJhY2stPnR5cGUoKSk7CisgICAgICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KSB0cmFjay0+dHlwZSgpKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7CisgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOwogfQogCi1zcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRFZmZlY3RDaGFpbihpbnQgc2Vzc2lvbklkKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKLX0KLQotc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0RWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbklkKQotewotICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKLQotICAgIHNpemVfdCBzaXplID0gbUVmZmVjdENoYWlucy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgaWYgKG1FZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpID09IHNlc3Npb25JZCkgewotICAgICAgICAgICAgY2hhaW4gPSBtRWZmZWN0Q2hhaW5zW2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNoYWluOwotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1vZGUodWludDMyX3QgbW9kZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNpemVfdCBzaXplID0gbUVmZmVjdENoYWlucy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0TW9kZV9sKG1vZGUpOwotICAgIH0KLX0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNDA1LDcgKzE3MTUsNyBAQAogICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSksCiAgICAgICAgIG1BdWRpb01peGVyKDApCiB7Ci0gICAgbVR5cGUgPSBQbGF5YmFja1RocmVhZDo6TUlYRVI7CisgICAgbVR5cGUgPSBUaHJlYWRCYXNlOjpNSVhFUjsKICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1GcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAKICAgICAvLyBGSVhNRSAtIEN1cnJlbnQgbWl4ZXIgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBzdGVyZW8gb3V0cHV0CkBAIC0xNDM0LDkgKzE3NDQsNDIgQEAKICAgICB1aW50MzJfdCBpZGxlU2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZVVzKCk7CiAgICAgdWludDMyX3Qgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKKyNpZmRlZiBERUJVR19DUFVfVVNBR0UKKyAgICBUaHJlYWRDcHVVc2FnZSBjcHU7CisgICAgY29uc3QgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyYgc3RhdHMgPSBjcHUuc3RhdGlzdGljcygpOworI2VuZGlmCisKKyAgICBhY3F1aXJlV2FrZUxvY2soKTsKIAogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CisjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCisgICAgICAgIGNwdS5zYW1wbGVBbmRFbmFibGUoKTsKKyAgICAgICAgdW5zaWduZWQgbiA9IHN0YXRzLm4oKTsKKyAgICAgICAgLy8gY3B1LmVsYXBzZWQoKSBpcyBleHBlbnNpdmUsIHNvIGRvbid0IGNhbGwgaXQgZXZlcnkgbG9vcAorICAgICAgICBpZiAoKG4gJiAxMjcpID09IDEpIHsKKyAgICAgICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gY3B1LmVsYXBzZWQoKTsKKyAgICAgICAgICAgIGlmIChlbGFwc2VkID49IERFQlVHX0NQVV9VU0FHRSAqIDEwMDAwMDAwMDBMTCkgeworICAgICAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47CisgICAgICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWVhbiA9IHN0YXRzLm1lYW4oKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3RkZGV2ID0gc3RhdHMuc3RkZGV2KCk7CisgICAgICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBzdGF0cy5taW5pbXVtKCk7CisgICAgICAgICAgICAgICAgZG91YmxlIG1heGltdW0gPSBzdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICAgICAgY3B1LnJlc2V0U3RhdGlzdGljcygpOworICAgICAgICAgICAgICAgIExPR0koIkNQVSB1c2FnZSBvdmVyIHBhc3QgJS4xZiBzZWNzICgldSBtaXhlciBsb29wcyBhdCAlLjFmIG1lYW4gbXMgcGVyIGxvb3ApOlxuICB1cyBwZXIgbWl4IGxvb3A6IG1lYW49JS4wZiBzdGRkZXY9JS4wZiBtaW49JS4wZiBtYXg9JS4wZlxuICAlJSBvZiB3YWxsOiBtZWFuPSUuMWYgc3RkZGV2PSUuMWYgbWluPSUuMWYgbWF4PSUuMWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCAqIC4wMDAwMDAwMDEsIG4sIHBlckxvb3AgKiAuMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiAqIC4wMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGRkZXYgKiAuMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSAqIC4wMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtICogLjAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gLyBwZXJMb29wMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkZGV2IC8gcGVyTG9vcDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0gLyBwZXJMb29wMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSAvIHBlckxvb3AxMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKICAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwogCiAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKQEAgLTE0NjAsNyArMTgwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpbyBoYXJkd2FyZSBlbnRlcmluZyBzdGFuZGJ5LCBtaXhlciAlcCwgbVN1c3BlbmRlZCAlZFxuIiwgdGhpcywgbVN1c3BlbmRlZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0NzEsMTAgKzE4MTQsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCB3ZSBoYXZlIHNvbWV0aGluZyB0byBkby4uLgogICAgICAgICAgICAgICAgICAgICBMT0dWKCJNaXhlclRocmVhZCAlcCBUSUQgJWQgZ29pbmcgdG8gc2xlZXBcbiIsIHRoaXMsIGdldHRpZCgpKTsKICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIk1peGVyVGhyZWFkICVwIFRJRCAlZCB3YWtpbmcgdXBcbiIsIHRoaXMsIGdldHRpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobU1hc3Rlck11dGUgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTE1MzcsNyArMTg4Miw3IEBACiAgICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CiAKLSAgICAgICAgICAgIGludCBieXRlc1dyaXR0ZW4gPSAoaW50KW1PdXRwdXQtPndyaXRlKG1NaXhCdWZmZXIsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgaW50IGJ5dGVzV3JpdHRlbiA9IChpbnQpbU91dHB1dC0+c3RyZWFtLT53cml0ZShtT3V0cHV0LT5zdHJlYW0sIG1NaXhCdWZmZXIsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgaWYgKGJ5dGVzV3JpdHRlbiA8IDApIG1CeXRlc1dyaXR0ZW4gLT0gbWl4QnVmZmVyU2l6ZTsKICAgICAgICAgICAgIG1OdW1Xcml0ZXMrKzsKICAgICAgICAgICAgIG1JbldyaXRlID0gZmFsc2U7CkBAIC0xNTcyLDkgKzE5MTcsMTEgQEAKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIH0KIAorICAgIHJlbGVhc2VXYWtlTG9jaygpOworCiAgICAgTE9HVigiTWl4ZXJUaHJlYWQgJXAgZXhpdGluZyIsIHRoaXMpOwogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTE1OTYsNyArMTk0Myw3IEBACiAgICAgICAgIG1hc3RlclZvbHVtZSA9IDA7CiAgICAgfQogICAgIC8vIERlbGVnYXRlIG1hc3RlciB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgaW4gb3V0cHV0IG1peCBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCi0gICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgdWludDMyX3QgdiA9ICh1aW50MzJfdCkobWFzdGVyVm9sdW1lICogKDEgPDwgMjQpKTsKICAgICAgICAgY2hhaW4tPnNldFZvbHVtZV9sKCZ2LCAmdik7CkBAIC0xNzA3LDcgKzIwNTQsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCAodm9pZCAqKXRyYWNrLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKXRyYWNrLT5jaGFubmVsTWFzaygpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCkBAIC0xNzM4LDcgKzIwODUsNyBAQAogICAgICAgICAgICAgICAgICAgICBMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsIHRyYWNrLT5uYW1lKCksIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW4KLSAgICAgICAgICAgICAgICAgICAgY2Jsay0+ZmxhZ3MgfD0gQ0JMS19ESVNBQkxFRF9PTjsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19ESVNBQkxFRF9PTiwgJmNibGstPmZsYWdzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1peGVyU3RhdHVzICE9IE1JWEVSX1RSQUNLU19SRUFEWSkgewogICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwogICAgICAgICAgICAgICAgIH0KQEAgLTE3NTcsMTIgKzIxMDQsMTEgQEAKICAgICAgICAgICAgICAgICBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLCBjaGFpbi5nZXQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhaW4tPnN0b3BUcmFjaygpOworICAgICAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzg3LDEwICsyMTMzLDggQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmICh0LT50eXBlKCkgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgdC0+bUNibGstPmxvY2subG9jaygpOwotICAgICAgICAgICAgdC0+bUNibGstPmZsYWdzIHw9IENCTEtfSU5WQUxJRF9PTjsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRF9PTiwgJnQtPm1DYmxrLT5mbGFncyk7CiAgICAgICAgICAgICB0LT5tQ2Jsay0+Y3Yuc2lnbmFsKCk7Ci0gICAgICAgICAgICB0LT5tQ2Jsay0+bG9jay51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE4MjQsMTQgKzIxNjgsMTQgQEAKICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKHZhbHVlICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTykgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwpAQCAtMTg1MCwxNSArMjE5NCwxNSBAQAogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CiAgICAgICAgICAgICAvLyB0aGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAobURldmljZSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKChpbnQpbURldmljZSAhPSB2YWx1ZSkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7CiAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgewogICAgICAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBkZXZpY2VXaXRob3V0U3BlYWtlcgotICAgICAgICAgICAgICAgICAgICA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FMTCAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgZGV2aWNlIChleGNlcHQgc3BlYWtlcikgaXMgb24KICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBkZXZpY2VXaXRob3V0U3BlYWtlciApIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YU90aGVyQXVkaW9EZXZpY2VPbjsKQEAgLTE4NzgsMTIgKzIyMjIsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwpAQCAtMTkyNyw3ICsyMjczLDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6YWN0aXZlU2xlZXBUaW1lVXMoKQogewotICAgIHJldHVybiAodWludDMyX3QpKG1PdXRwdXQtPmxhdGVuY3koKSAqIDEwMDApIC8gMjsKKyAgICByZXR1cm4gKHVpbnQzMl90KShtT3V0cHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1PdXRwdXQtPnN0cmVhbSkgKiAxMDAwKSAvIDI7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpCkBAIC0xOTQ0LDcgKzIyOTAsNyBAQAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKQogICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSkKIHsKLSAgICBtVHlwZSA9IFBsYXliYWNrVGhyZWFkOjpESVJFQ1Q7CisgICAgbVR5cGUgPSBUaHJlYWRCYXNlOjpESVJFQ1Q7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp+RGlyZWN0T3V0cHV0VGhyZWFkKCkKQEAgLTE5NzcsMTIgKzIzMjMsMTIgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmFwcGx5Vm9sdW1lKHVpbnQxNl90IGxlZnRWb2wsIHVpbnQxNl90IHJpZ2h0Vm9sLCBib29sIHJhbXApCiB7CiAgICAgLy8gRG8gbm90IGFwcGx5IHZvbHVtZSBvbiBjb21wcmVzc2VkIGF1ZGlvCi0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00obUZvcm1hdCkpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8vIGNvbnZlcnQgdG8gc2lnbmVkIDE2IGJpdCBiZWZvcmUgdm9sdW1lIGNhbGN1bGF0aW9uCi0gICAgaWYgKG1Gb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkgeworICAgIGlmIChtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpIHsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKW1NaXhCdWZmZXIgKyBjb3VudC0xOwogICAgICAgICBpbnQxNl90ICpkc3QgPSBtTWl4QnVmZmVyICsgY291bnQtMTsKQEAgLTIwMzUsNyArMjM4MSw3IEBACiAgICAgfQogCiAgICAgLy8gY29udmVydCBiYWNrIHRvIHVuc2lnbmVkIDggYml0IGFmdGVyIHZvbHVtZSBjYWxjdWxhdGlvbgotICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpIHsKKyAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUKSB7CiAgICAgICAgIHNpemVfdCBjb3VudCA9IG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKICAgICAgICAgaW50MTZfdCAqc3JjID0gbU1peEJ1ZmZlcjsKICAgICAgICAgdWludDhfdCAqZHN0ID0gKHVpbnQ4X3QgKiltTWl4QnVmZmVyOwpAQCAtMjA2Myw2ICsyNDA5LDggQEAKICAgICAvLyBoYXJkd2FyZSByZXNvdXJjZXMgYXMgc29vbiBhcyBwb3NzaWJsZQogICAgIG5zZWNzX3Qgc3RhbmRieURlbGF5ID0gbWljcm9zZWNvbmRzKGFjdGl2ZVNsZWVwVGltZSoyKTsKIAorICAgIGFjcXVpcmVXYWtlTG9jaygpOworCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKICAgICAgICAgYm9vbCByYW1wVm9sdW1lOwpAQCAtMjA5MSw3ICsyNDM5LDcgQEAKICAgICAgICAgICAgICAgICAvLyB3YWl0IHVudGlsIHdlIGhhdmUgc29tZXRoaW5nIHRvIGRvLi4uCiAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpbyBoYXJkd2FyZSBlbnRlcmluZyBzdGFuZGJ5LCBtaXhlciAlcFxuIiwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTIxMDIsOSArMjQ1MCwxMSBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgICAgICAgICAgICAgICAgICBMT0dWKCJEaXJlY3RPdXRwdXRUaHJlYWQgJXAgVElEICVkIGdvaW5nIHRvIHNsZWVwXG4iLCB0aGlzLCBnZXR0aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXQobUxvY2spOwogICAgICAgICAgICAgICAgICAgICBMT0dWKCJEaXJlY3RPdXRwdXRUaHJlYWQgJXAgVElEICVkIHdha2luZyB1cCBpbiBhY3RpdmUgbW9kZVxuIiwgdGhpcywgZ2V0dGlkKCkpOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtTWFzdGVyTXV0ZSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtMjE3Niw3ICsyNTI2LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXVkaW8gSEFMIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBzb2Z0d2FyZSB2b2x1bWUgdG8gbm9taW5hbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQtPnNldFZvbHVtZShsZWZ0LCByaWdodCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPnNldF92b2x1bWUobU91dHB1dC0+c3RyZWFtLCBsZWZ0LCByaWdodCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMS4wZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IDEuMGY7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMjQwLDExICsyNTkwLDEwIEBACiAgICAgICAgICAgICAgICAgaWYgKCFlZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGVmZmVjdENoYWluc1swXS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RvUmVtb3ZlLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrVG9SZW1vdmUtPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrVG9SZW1vdmUpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFja1RvUmVtb3ZlLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2tUb1JlbW92ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0yMjc3LDcgKzI2MjYsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgICAgICAgICB9CkBAIC0yMjk5LDcgKzI2NDgsNyBAQAogICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7Ci0gICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gKGludCltT3V0cHV0LT53cml0ZShtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGludCBieXRlc1dyaXR0ZW4gPSAoaW50KW1PdXRwdXQtPnN0cmVhbS0+d3JpdGUobU91dHB1dC0+c3RyZWFtLCBtTWl4QnVmZmVyLCBtaXhCdWZmZXJTaXplKTsKICAgICAgICAgICAgIGlmIChieXRlc1dyaXR0ZW4gPCAwKSBtQnl0ZXNXcml0dGVuIC09IG1peEJ1ZmZlclNpemU7CiAgICAgICAgICAgICBtTnVtV3JpdGVzKys7CiAgICAgICAgICAgICBtSW5Xcml0ZSA9IGZhbHNlOwpAQCAtMjMyMSw5ICsyNjcwLDExIEBACiAgICAgfQogCiAgICAgaWYgKCFtU3RhbmRieSkgewotICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CisgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICB9CiAKKyAgICByZWxlYXNlV2FrZUxvY2soKTsKKwogICAgIExPR1YoIkRpcmVjdE91dHB1dFRocmVhZCAlcCBleGl0aW5nIiwgdGhpcyk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtMjM2MSwxMiArMjcxMiwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKQEAgLTIzODYsOCArMjczOSw4IEBACiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6YWN0aXZlU2xlZXBUaW1lVXMoKQogewogICAgIHVpbnQzMl90IHRpbWU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgewotICAgICAgICB0aW1lID0gKHVpbnQzMl90KShtT3V0cHV0LT5sYXRlbmN5KCkgKiAxMDAwKSAvIDI7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgdGltZSA9ICh1aW50MzJfdCkobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pICogMTAwMCkgLyAyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRpbWUgPSAxMDAwMDsKICAgICB9CkBAIC0yMzk3LDcgKzI3NTAsNyBAQAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpCiB7CiAgICAgdWludDMyX3QgdGltZTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKICAgICAgICAgdGltZSA9ICh1aW50MzJfdCkoKChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUpICogMTAwMCkgLyAyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRpbWUgPSAxMDAwMDsKQEAgLTI0MDgsNyArMjc2MSw3IEBACiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c3VzcGVuZFNsZWVwVGltZVVzKCkKIHsKICAgICB1aW50MzJfdCB0aW1lOwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00obUZvcm1hdCkpIHsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogICAgICAgICB0aW1lID0gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKTsKICAgICB9IGVsc2UgewogICAgICAgICB0aW1lID0gMTAwMDA7CkBAIC0yNDIyLDcgKzI3NzUsNyBAQAogQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6RHVwbGljYXRpbmdUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkKiBtYWluVGhyZWFkLCBpbnQgaWQpCiAgICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkLCBtYWluVGhyZWFkLT5kZXZpY2UoKSksIG1XYWl0VGltZU1zKFVJTlRfTUFYKQogewotICAgIG1UeXBlID0gUGxheWJhY2tUaHJlYWQ6OkRVUExJQ0FUSU5HOworICAgIG1UeXBlID0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CiAgICAgYWRkT3V0cHV0VHJhY2sobWFpblRocmVhZCk7CiB9CiAKQEAgLTI0NDcsNiArMjgwMCw4IEBACiAgICAgdWludDMyX3Qgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgIGFjcXVpcmVXYWtlTG9jaygpOworCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKICAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwpAQCAtMjQ4Nyw5ICsyODQyLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoIkR1cGxpY2F0aW5nVGhyZWFkICVwIFRJRCAlZCBnb2luZyB0byBzbGVlcFxuIiwgdGhpcywgZ2V0dGlkKCkpOwogICAgICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiRHVwbGljYXRpbmdUaHJlYWQgJXAgVElEICVkIHdha2luZyB1cFxuIiwgdGhpcywgZ2V0dGlkKCkpOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtTWFzdGVyTXV0ZSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5hdWRpby5zaWxlbnQiLCB2YWx1ZSwgIjAiKTsKQEAgLTI1NzYsNiArMjkzNCw4IEBACiAgICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOwogICAgIH0KIAorICAgIHJlbGVhc2VXYWtlTG9jaygpOworCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0yNTg2LDEwICsyOTQ2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwogICAgIGlmIChvdXRwdXRUcmFjay0+Y2JsaygpICE9IE5VTEwpIHsKLSAgICAgICAgdGhyZWFkLT5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMsIDEuMGYpOworICAgICAgICB0aHJlYWQtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fQ05ULCAxLjBmKTsKICAgICAgICAgbU91dHB1dFRyYWNrcy5hZGQob3V0cHV0VHJhY2spOwogICAgICAgICBMT0dWKCJhZGRPdXRwdXRUcmFjaygpIHRyYWNrICVwLCBvbiB0aHJlYWQgJXAiLCBvdXRwdXRUcmFjaywgdGhyZWFkKTsKICAgICAgICAgdXBkYXRlV2FpdFRpbWUoKTsKQEAgLTI2NTQsOCArMzAxNCw4IEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTI2NzUsNiArMzAzNSw3IEBACiAKICAgICAvLyBMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICB1aW50OF90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKICAgIHNpemVfdCBidWZmZXJTaXplID0gZnJhbWVDb3VudCpjaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpOwogICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOwpAQCAtMjY4OSw3ICszMDUwLDggQEAKICAgICAgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwpAQCAtMjcxMyw3ICszMDc1LDggQEAKICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7CisgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwpAQCAtMjc4MCw3ICszMTQzLDExIEBACiB9CiAKIGludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbENvdW50KCkgY29uc3QgewotICAgIHJldHVybiAoaW50KW1DYmxrLT5jaGFubmVsQ291bnQ7CisgICAgcmV0dXJuIChjb25zdCBpbnQpbUNoYW5uZWxDb3VudDsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmNoYW5uZWxNYXNrKCkgY29uc3QgeworICAgIHJldHVybiBtQ2hhbm5lbE1hc2s7CiB9CiAKIHZvaWQqIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0IHsKQEAgLTI3OTIsOSArMzE1OSw5IEBACiAgICAgaWYgKGJ1ZmZlclN0YXJ0IDwgbUJ1ZmZlciB8fCBidWZmZXJTdGFydCA+IGJ1ZmZlckVuZCB8fCBidWZmZXJFbmQgPiBtQnVmZmVyRW5kIHx8CiAgICAgICAgICgodW5zaWduZWQgbG9uZylidWZmZXJTdGFydCAmICh1bnNpZ25lZCBsb25nKShjYmxrLT5mcmFtZVNpemUgLSAxKSkpIHsKICAgICAgICAgTE9HRSgiVHJhY2tCYXNlOjpnZXRCdWZmZXIgYnVmZmVyIG91dCBvZiByYW5nZTpcbiAgICBzdGFydDogJXAsIGVuZCAlcCAsIG1CdWZmZXIgJXAgbUJ1ZmZlckVuZCAlcFxuICAgIFwKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgJWQsIHNlcnZlckJhc2UgJWQsIHVzZXIgJWQsIHVzZXJCYXNlICVkLCBjaGFubmVsQ291bnQgJWQiLAorICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQiLAogICAgICAgICAgICAgICAgIGJ1ZmZlclN0YXJ0LCBidWZmZXJFbmQsIG1CdWZmZXIsIG1CdWZmZXJFbmQsCi0gICAgICAgICAgICAgICAgY2Jsay0+c2VydmVyLCBjYmxrLT5zZXJ2ZXJCYXNlLCBjYmxrLT51c2VyLCBjYmxrLT51c2VyQmFzZSwgY2Jsay0+Y2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yODA5LDEyICszMTc2LDEyIEBACiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIDAsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkKSwKICAgICBtTXV0ZShmYWxzZSksIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwgbU5hbWUoLTEpLCBtTWFpbkJ1ZmZlcihOVUxMKSwgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKQogewpAQCAtMjgzNCw3ICszMjAxLDcgQEAKICAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogICAgICAgICAvLyBOT1RFOiBhdWRpb190cmFja19jYmxrX3Q6OmZyYW1lU2l6ZSBmb3IgOCBiaXQgUENNIGRhdGEgaXMgYmFzZWQgb24gYSBzYW1wbGUgc2l6ZSBvZgogICAgICAgICAvLyAxNiBiaXQgYmVjYXVzZSBkYXRhIGlzIGNvbnZlcnRlZCB0byAxNiBiaXQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiBidWZmZXIgYnkgQXVkaW9UcmFjawotICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkgPyBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSA/IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YodWludDhfdCk7CiAgICAgfQogfQogCkBAIC0yODY1LDcgKzMyMzIsNyBAQAogICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCltU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKQEAgLTI4ODIsMTIgKzMyNDksMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgJTAzdSAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgMHglMDh4ICUwNXUgICAlMDR1ICUxZCAlMWQgJTFkICUwNXUgJTA1dSAlMDV1ICAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCiAgICAgICAgICAgICBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQsCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtU3RhdGUsCkBAIC0yOTQ5LDcgKzMzMTYsNyBAQAogICAgIGlmIChtQ2Jsay0+ZnJhbWVzUmVhZHkoKSA+PSBtQ2Jsay0+ZnJhbWVDb3VudCB8fAogICAgICAgICAgICAgKG1DYmxrLT5mbGFncyAmIENCTEtfRk9SQ0VSRUFEWV9NU0spKSB7CiAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMRUQ7Ci0gICAgICAgIG1DYmxrLT5mbGFncyAmPSB+Q0JMS19GT1JDRVJFQURZX01TSzsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZPUkNFUkVBRFlfTVNLLCAmbUNibGstPmZsYWdzKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTI5NzcsNyArMzM0NCw3IEBACiAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpICYmIHN0YXRlICE9IEFDVElWRSAmJiBzdGF0ZSAhPSBSRVNVTUlORykgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0aHJlYWQtPmlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCltU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHRocmVhZC0+bUxvY2subG9jaygpOwogCkBAIC0zMDE3LDcgKzMzODQsNyBAQAogICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiAoc3RhdGUgPT0gQUNUSVZFIHx8IHN0YXRlID09IFJFU1VNSU5HKSkgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCltU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAKQEAgLTMwMzksNyArMzQwNiw3IEBACiAgICAgICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSkgewogICAgICAgICAgICAgICAgIHRocmVhZC0+bUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAKQEAgLTMwNjMsMTQgKzM0MzAsMTIgQEAKICAgICAgICAgLy8gU1RPUFBFRCBzdGF0ZQogICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwogCi0gICAgICAgIG1DYmxrLT5sb2NrLmxvY2soKTsKLSAgICAgICAgLy8gTk9URTogcmVzZXQoKSB3aWxsIHJlc2V0IGNibGstPnVzZXIgYW5kIGNibGstPnNlcnZlciB3aXRoCi0gICAgICAgIC8vIHRoZSByaXNrIHRoYXQgYXQgdGhlIHNhbWUgdGltZSwgdGhlIEF1ZGlvTWl4ZXIgaXMgdHJ5aW5nIHRvIHJlYWQKLSAgICAgICAgLy8gZGF0YS4gSW4gdGhpcyBjYXNlLCBnZXROZXh0QnVmZmVyKCkgd291bGQgcmV0dXJuIGEgTlVMTCBwb2ludGVyCi0gICAgICAgIC8vIGFzIGF1ZGlvIGJ1ZmZlciA9PiB0aGUgQXVkaW9NaXhlciBjb2RlIE1VU1QgYWx3YXlzIHRlc3QgdGhhdCBwb2ludGVyCi0gICAgICAgIC8vIHJldHVybmVkIGJ5IGdldE5leHRCdWZmZXIoKSBpcyBub3QgTlVMTCEKLSAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgbUNibGstPmxvY2sudW5sb2NrKCk7CisgICAgICAgIC8vIGRvIG5vdCByZXNldCB0aGUgdHJhY2sgaWYgaXQgaXMgc3RpbGwgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc3RvcHBlZCBvciBwYXVzZWQuCisgICAgICAgIC8vIHRoaXMgd2lsbCBiZSBkb25lIGJ5IHByZXBhcmVUcmFja3NfbCgpIHdoZW4gdGhlIHRyYWNrIGlzIHN0b3BwZWQuCisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT5tQWN0aXZlVHJhY2tzLmluZGV4T2YodGhpcykgPCAwKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0zMDgyLDggKzM0NDcsOCBAQAogICAgICAgICBUcmFja0Jhc2U6OnJlc2V0KCk7CiAgICAgICAgIC8vIEZvcmNlIHVuZGVycnVuIGNvbmRpdGlvbiB0byBhdm9pZCBmYWxzZSB1bmRlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCiAgICAgICAgIC8vIHdyaXR0ZW4gdG8gYnVmZmVyCi0gICAgICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX1VOREVSUlVOX09OOwotICAgICAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRk9SQ0VSRUFEWV9NU0s7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GT1JDRVJFQURZX01TSywgJm1DYmxrLT5mbGFncyk7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU5fT04sICZtQ2Jsay0+ZmxhZ3MpOwogICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTElORzsKICAgICAgICAgbVJlc2V0RG9uZSA9IHRydWU7CiAgICAgfQpAQCAtMzEyNCwyMSArMzQ4OSwyMSBAQAogICAgICAgICAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgMCwgc2Vzc2lvbklkKSwKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgMCwgc2Vzc2lvbklkKSwKICAgICAgICAgbU92ZXJmbG93KGZhbHNlKQogewogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgTE9HVigiUmVjb3JkVHJhY2sgY29uc3RydWN0b3IsIHNpemUgJWQiLCAoaW50KW1CdWZmZXJFbmQgLSAoaW50KW1CdWZmZXIpOwotICAgICAgIGlmIChmb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSB7Ci0gICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKKyAgICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpIHsKKyAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gc2l6ZW9mKGludDhfdCk7CiAgICAgICAgfQpAQCAtMzIxMiwxNiArMzU3NywxNiBAQAogICAgICAgICBUcmFja0Jhc2U6OnJlc2V0KCk7CiAgICAgICAgIC8vIEZvcmNlIG92ZXJlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2Ugb3ZlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCiAgICAgICAgIC8vIHJlYWQgZnJvbSBidWZmZXIKLSAgICAgICAgbUNibGstPmZsYWdzIHw9IENCTEtfVU5ERVJSVU5fT047CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU5fT04sICZtQ2Jsay0+ZmxhZ3MpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgJTAzdSAlMDVkICAgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgMHglMDh4ICUwNWQgICAlMDR1ICUwMWQgJTA1dSAgJTA4eCAlMDh4XG4iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gTlVMTCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQsCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtU3RhdGUsCkBAIC0zMjM3LDEwICszNjAyLDEwIEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgRHVwbGljYXRpbmdUaHJlYWQgKnNvdXJjZVRocmVhZCwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpCi0gICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBOVUxMLCAwKSwKKyAgICA6ICAgVHJhY2sodGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCAwKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CiAKQEAgLTMyNTEsOCArMzYxNiwxMCBAQAogICAgICAgICBtQ2Jsay0+dm9sdW1lWzBdID0gbUNibGstPnZvbHVtZVsxXSA9IDB4MTAwMDsKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwotICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsIG1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNibGstPmNoYW5uZWxDb3VudCAlZCBtQnVmZmVyRW5kICVwIiwKLSAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwgbUNibGstPmJ1ZmZlcnMsIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNibGstPmNoYW5uZWxDb3VudCwgbUJ1ZmZlckVuZCk7CisgICAgICAgIExPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCBtQ2Jsay0+YnVmZmVycyAlcCwgIiBcCisgICAgICAgICAgICAgICAgIm1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNoYW5uZWxNYXNrIDB4JTA4eCBtQnVmZmVyRW5kICVwIiwKKyAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwgbUNibGstPmJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQsIG1DYmxrLT5zYW1wbGVSYXRlLCBtQ2hhbm5lbE1hc2ssIG1CdWZmZXJFbmQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1coIkVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJXAiLCBwbGF5YmFja1RocmVhZCk7CiAgICAgfQpAQCAtMzI4Nyw3ICszNjU0LDcgQEAKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUNibGstPmNoYW5uZWxDb3VudDsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtQ2hhbm5lbENvdW50OwogICAgIGJvb2wgb3V0cHV0QnVmZmVyRnVsbCA9IGZhbHNlOwogICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CiAgICAgaW5CdWZmZXIuaTE2ID0gZGF0YTsKQEAgLTM1NzIsOCArMzkzOSw4IEBACiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgaW50IGlucHV0LAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtMzYxMiwyNCArMzk3OSwyOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWRfbCgpOworICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOwogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIG5ldyByZWNvcmQgdHJhY2suIFRoZSByZWNvcmQgdHJhY2sgdXNlcyBvbmUgdHJhY2sgaW4gbUhhcmR3YXJlTWl4ZXJUaHJlYWQgYnkgY29udmVudGlvbi4KLSAgICAgICAgcmVjb3JkVHJhY2sgPSBuZXcgUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgbFNlc3Npb25JZCk7CisgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cyk7CiAgICAgfQotICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0Q2JsaygpID09IE5VTEwpIHsKKyAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWNvcmRUcmFjayBzbyB0aGF0IHRoZSBDbGllbnQKICAgICAgICAgLy8gZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAogICAgICAgICBjbGllbnQuY2xlYXIoKTsKICAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKLSAgICAgICAgbFN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIApAQCAtMzY3OCwxMSArNDA1MCwyMCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbUluICppbnB1dCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsIGludCBpZCkgOgotICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCksCi0gICAgbUlucHV0KGlucHV0KSwgbVJlc2FtcGxlcigwKSwgbVJzbXBPdXRCdWZmZXIoMCksIG1Sc21wSW5CdWZmZXIoMCkKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlKSA6CisgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBkZXZpY2UpLAorICAgIG1JbnB1dChpbnB1dCksIG1UcmFjayhOVUxMKSwgbVJlc2FtcGxlcigwKSwgbVJzbXBPdXRCdWZmZXIoMCksIG1Sc21wSW5CdWZmZXIoMCkKIHsKLSAgICBtUmVxQ2hhbm5lbENvdW50ID0gQXVkaW9TeXN0ZW06OnBvcENvdW50KGNoYW5uZWxzKTsKKyAgICBtVHlwZSA9IFRocmVhZEJhc2U6OlJFQ09SRDsKKworICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJWQiLCBpZCk7CisKKyAgICBtUmVxQ2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbHMpOwogICAgIG1SZXFTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7CiB9CkBAIC0zNjk5LDIxICs0MDgwLDE5IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVjb3JkIFRocmVhZCAlcCIsIHRoaXMpOwotCi0gICAgcnVuKGJ1ZmZlciwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICBydW4obU5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQogewogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CiAgICAgc3A8UmVjb3JkVHJhY2s+IGFjdGl2ZVRyYWNrOworICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CiAKKyAgICBhY3F1aXJlV2FrZUxvY2soKTsKKwogICAgIC8vIHN0YXJ0IHJlY29yZGluZwogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgewogCkBAIC0zNzI0LDIyICs0MTAzLDI0IEBACiAgICAgICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOwogICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayA9PSAwICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSBicmVhazsKIAorICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgICAgICAgICAgICAgTE9HVigiUmVjb3JkVGhyZWFkOiBsb29wIHN0b3BwaW5nIik7CiAgICAgICAgICAgICAgICAgLy8gZ28gdG8gc2xlZXAKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICBMT0dWKCJSZWNvcmRUaHJlYWQ6IGxvb3Agc3RhcnRpbmciKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzYxLDE0ICs0MTQyLDIwIEBACiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKICAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OkFDVElWRSAmJgogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoNTAwMCk7CisgICAgICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CisgICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoTElLRUxZKG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKSA9PSBOT19FUlJPUikpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7CkBAIC0zNzg0LDcgKzQxNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCArPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgLT0gZnJhbWVzSW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpbUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGZyYW1lc0luICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMTYgPSAoaW50MTZfdCAqKXNyYzsKQEAgLTM4MDQsMTEgKzQxOTEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCltQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQgfHwgbUZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+cmVhZChidWZmZXIucmF3LCBtSW5wdXRCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KW1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCB8fCBtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIGJ1ZmZlci5yYXcsIG1JbnB1dEJ5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5yZWFkKG1Sc21wSW5CdWZmZXIsIG1JbnB1dEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCBtUnNtcEluQnVmZmVyLCBtSW5wdXRCeXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkIDwgMCkgewpAQCAtMzgxNiw4ICs0MjAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdGFuZGJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoNTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKQEAgLTM4NjUsMjIgKzQyNTIsNzQgQEAKICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBwcm9jZXNzb3IgZm9yIGEgd2hpbGUgYmVmb3JlIGFza2luZyBmb3IgYSBuZXcgYnVmZmVyLgogICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBnaXZlIHRoZSBhcHBsaWNhdGlvbiBtb3JlIGNoYW5jZSB0byByZWFkIGZyb20gdGhlIGJ1ZmZlciBhbmQKICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgb3ZlcmZsb3cuCi0gICAgICAgICAgICAgICAgdXNsZWVwKDUwMDApOworICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOworICAgICAgICBlZmZlY3RDaGFpbnMuY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgIG1JbnB1dC0+c3RhbmRieSgpOworICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIH0KICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKIAogICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwogCisgICAgcmVsZWFzZVdha2VMb2NrKCk7CisKICAgICBMT0dWKCJSZWNvcmRUaHJlYWQgJXAgZXhpdGluZyIsIHRoaXMpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIAorCitzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+ICBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQoreworICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjazsKKyAgICBzdGF0dXNfdCBsU3RhdHVzOworCisgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgc2Vzc2lvbklkKTsKKworICAgICAgICBpZiAodHJhY2stPmdldENibGsoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgbVRyYWNrID0gdHJhY2suZ2V0KCk7CisgICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZSBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UoCisgICAgICAgICAgICAgICAgKGF1ZGlvX2RldmljZXNfdCkobURldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTEwpKSAmJiBtQXVkaW9GbGluZ2VyLT5idE5yZWMoKTsKKyAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCBzZXNzaW9uSWQpOworICAgIH0KKyAgICBsU3RhdHVzID0gTk9fRVJST1I7CisKK0V4aXQ6CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHRyYWNrOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RhcnQoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spCiB7CiAgICAgTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCIpOwpAQCAtMzk3MCw3ICs0NDA5LDcgQEAKIAogICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewogICAgICAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgVHJhY2s6XG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBTUmF0ZSAgU2VydiAgICAgVXNlclxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIENsaWVuIEZtdCBDaG4gbWFzayAgIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIApAQCAtMzk5Miw2ICs0NDMxLDcgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKyAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTQwMDMsMTQgKzQ0NDMsMTQgQEAKICAgICBpbnQgY2hhbm5lbENvdW50OwogCiAgICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKLSAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+cmVhZChtUnNtcEluQnVmZmVyLCBtSW5wdXRCeXRlcyk7CisgICAgICAgIG1CeXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwgbVJzbXBJbkJ1ZmZlciwgbUlucHV0Qnl0ZXMpOwogICAgICAgICBpZiAobUJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIExPR0UoIlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcigpIEVycm9yIHJlYWRpbmcgYXVkaW8gaW5wdXQiKTsKICAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkFDVElWRSkgewogICAgICAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvCiAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RhbmRieSgpOwotICAgICAgICAgICAgICAgIHVzbGVlcCg1MDAwKTsKKyAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXItPnJhdyA9IDA7CiAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwpAQCAtNDA2Miw3ICs0NTAyLDcgQEAKICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXFDaGFubmVsQ291bnQgPSBBdWRpb1N5c3RlbTo6cG9wQ291bnQodmFsdWUpOworICAgICAgICAgICAgcmVxQ2hhbm5lbENvdW50ID0gcG9wY291bnQodmFsdWUpOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewpAQCAtNDA3NSwxNyArNDUxNSw0MyBAQAogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHN0b3JlIGlucHV0IGRldmljZSBhbmQgb3V0cHV0IGRldmljZSBidXQgZG8gbm90IGZvcndhcmQgb3V0cHV0IGRldmljZSB0byBhdWRpbyBIQUwuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgc3RhdHVzIGlzIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBmb3Igb3V0cHV0IGRldmljZQorICAgICAgICAgICAgLy8gKHNlZSBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgaWYgKHZhbHVlICYgQVVESU9fREVWSUNFX09VVF9BTEwpIHsKKyAgICAgICAgICAgICAgICBtRGV2aWNlICY9ICh1aW50MzJfdCl+KHZhbHVlICYgQVVESU9fREVWSUNFX09VVF9BTEwpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURldmljZSAmPSAodWludDMyX3Qpfih2YWx1ZSAmIEFVRElPX0RFVklDRV9JTl9BTEwpOworICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZSBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2RldmljZXNfdCl2YWx1ZSkgJiYgbUF1ZGlvRmxpbmdlci0+YnROcmVjKCk7CisgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIG1UcmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIG1UcmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZXZpY2UgfD0gKHVpbnQzMl90KXZhbHVlOworICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgIG1JbnB1dC0+c3RhbmRieSgpOwotICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcik7CisgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZWNvbmZpZykgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBtSW5wdXQtPmZvcm1hdCgpICYmIHJlcUZvcm1hdCA9PSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCAmJgotICAgICAgICAgICAgICAgICAgICAoKGludCltSW5wdXQtPnNhbXBsZVJhdGUoKSA8PSAyICogcmVxU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnBvcENvdW50KG1JbnB1dC0+Y2hhbm5lbHMoKSkgPCAzKSAmJiAocmVxQ2hhbm5lbENvdW50IDwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCisgICAgICAgICAgICAgICAgICAgICgoaW50KW1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSA8PSAoMiAqIHJlcVNhbXBsaW5nUmF0ZSkpICYmCisgICAgICAgICAgICAgICAgICAgIChwb3Bjb3VudChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDwgMykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHJlcUNoYW5uZWxDb3VudCA8IDMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC00MTA2LDcgKzQ1NzIsMTMgQEAKIAogU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQogewotICAgIHJldHVybiBtSW5wdXQtPmdldFBhcmFtZXRlcnMoa2V5cyk7CisgICAgY2hhciAqczsKKyAgICBTdHJpbmc4IG91dF9zODsKKworICAgIHMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLCBrZXlzLnN0cmluZygpKTsKKyAgICBvdXRfczggPSBTdHJpbmc4KHMpOworICAgIGZyZWUocyk7CisgICAgcmV0dXJuIG91dF9zODsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKQEAgLTQxMTYsNyArNDU4OCw3IEBACiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRDoKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsTWFzazsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTQxMzgsMTIgKzQ2MTAsMTIgQEAKICAgICBpZiAobVJlc2FtcGxlcikgZGVsZXRlIG1SZXNhbXBsZXI7CiAgICAgbVJlc2FtcGxlciA9IDA7CiAKLSAgICBtU2FtcGxlUmF0ZSA9IG1JbnB1dC0+c2FtcGxlUmF0ZSgpOwotICAgIG1DaGFubmVscyA9IG1JbnB1dC0+Y2hhbm5lbHMoKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KUF1ZGlvU3lzdGVtOjpwb3BDb3VudChtQ2hhbm5lbHMpOwotICAgIG1Gb3JtYXQgPSBtSW5wdXQtPmZvcm1hdCgpOwotICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpbUlucHV0LT5mcmFtZVNpemUoKTsKLSAgICBtSW5wdXRCeXRlcyA9IG1JbnB1dC0+YnVmZmVyU2l6ZSgpOworICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsTWFzayA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KXBvcGNvdW50KG1DaGFubmVsTWFzayk7CisgICAgbUZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZyYW1lU2l6ZSA9ICh1aW50MTZfdClhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUlucHV0Qnl0ZXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtSW5wdXRCeXRlcyAvIG1GcmFtZVNpemU7CiAgICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF07CiAKQEAgLTQxNzMsNyArNDY0NSwyOCBAQAogCiB1bnNpZ25lZCBpbnQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCiB7Ci0gICAgcmV0dXJuIG1JbnB1dC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobUlucHV0LT5zdHJlYW0pOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgeworICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKKyAgICB9CisKKyAgICBpZiAobVRyYWNrICE9IE5VTEwgJiYgc2Vzc2lvbklkID09IG1UcmFjay0+c2Vzc2lvbklkKCkpIHsKKyAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dHJhY2soKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1UcmFjazsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDE5Miw2ICs0Njg1LDggQEAKICAgICB1aW50MzJfdCBmb3JtYXQgPSBwRm9ybWF0ID8gKnBGb3JtYXQgOiAwOwogICAgIHVpbnQzMl90IGNoYW5uZWxzID0gcENoYW5uZWxzID8gKnBDaGFubmVscyA6IDA7CiAgICAgdWludDMyX3QgbGF0ZW5jeSA9IHBMYXRlbmN5TXMgPyAqcExhdGVuY3lNcyA6IDA7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW07CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm91dEh3RGV2OwogCiAgICAgTE9HVigib3Blbk91dHB1dCgpLCBEZXZpY2UgJXgsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICVkLCBDaGFubmVscyAleCwgZmxhZ3MgJXgiLAogICAgICAgICAgICAgcERldmljZXMgPyAqcERldmljZXMgOiAwLApAQCAtNDIwMywyNiArNDY5OCwzMCBAQAogICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5PdXRwdXRTdHJlYW0oKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgIG91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbCgqcERldmljZXMpOworICAgIGlmIChvdXRId0RldiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0YXR1cyA9IG91dEh3RGV2LT5vcGVuX291dHB1dF9zdHJlYW0ob3V0SHdEZXYsICpwRGV2aWNlcywgKGludCAqKSZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbHMsICZzYW1wbGluZ1JhdGUsICZvdXRTdHJlYW0pOwogICAgIExPR1YoIm9wZW5PdXRwdXQoKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJWQsIENoYW5uZWxzICV4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgb3V0U3RyZWFtLAogICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgICBzdGF0dXMpOwogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICBpZiAob3V0cHV0ICE9IDApIHsKLSAgICAgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkX2woKTsKLSAgICAgICAgaWYgKChmbGFncyAmIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19ESVJFQ1QpIHx8Ci0gICAgICAgICAgICAoZm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB8fAotICAgICAgICAgICAgKGNoYW5uZWxzICE9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8pKSB7CisgICAgaWYgKG91dFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSk7CisgICAgICAgIGludCBpZCA9IG5leHRVbmlxdWVJZCgpOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUKSB8fAorICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgfHwKKyAgICAgICAgICAgIChjaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSB7CiAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7CiAgICAgICAgICAgICBMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQyNTUsNyArNDc1NCw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGludCBpZCA9IG5leHRVbmlxdWVJZF9sKCk7CisgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQgKnRocmVhZCA9IG5ldyBEdXBsaWNhdGluZ1RocmVhZCh0aGlzLCB0aHJlYWQxLCBpZCk7CiAgICAgdGhyZWFkLT5hZGRPdXRwdXRUcmFjayh0aHJlYWQyKTsKICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKQEAgLTQyNzgsOSArNDc3Nyw5IEBACiAKICAgICAgICAgTE9HVigiY2xvc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CiAKLSAgICAgICAgaWYgKHRocmVhZC0+dHlwZSgpID09IFBsYXliYWNrVGhyZWFkOjpNSVhFUikgeworICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnR5cGUoKSA9PSBQbGF5YmFja1RocmVhZDo6RFVQTElDQVRJTkcpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRpbmdUaHJlYWQgKmR1cFRocmVhZCA9IChEdXBsaWNhdGluZ1RocmVhZCAqKW1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgZHVwVGhyZWFkLT5yZW1vdmVPdXRwdXRUcmFjaygoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQyOTIsOCArNDc5MSwxMCBAQAogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKIAotICAgIGlmICh0aHJlYWQtPnR5cGUoKSAhPSBQbGF5YmFja1RocmVhZDo6RFVQTElDQVRJTkcpIHsKLSAgICAgICAgbUF1ZGlvSGFyZHdhcmUtPmNsb3NlT3V0cHV0U3RyZWFtKHRocmVhZC0+Z2V0T3V0cHV0KCkpOworICAgIGlmICh0aHJlYWQtPnR5cGUoKSAhPSBUaHJlYWRCYXNlOjpEVVBMSUNBVElORykgeworICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5nZXRPdXRwdXQoKTsKKyAgICAgICAgb3V0LT5od0Rldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShvdXQtPmh3RGV2LCBvdXQtPnN0cmVhbSk7CisgICAgICAgIGRlbGV0ZSBvdXQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTQzNDMsMjAgKzQ4NDQsMjUgQEAKICAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CiAgICAgdWludDMyX3QgcmVxRm9ybWF0ID0gZm9ybWF0OwogICAgIHVpbnQzMl90IHJlcUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmluU3RyZWFtOworICAgIGF1ZGlvX2h3X2RldmljZV90ICppbkh3RGV2OwogCiAgICAgaWYgKHBEZXZpY2VzID09IE5VTEwgfHwgKnBEZXZpY2VzID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbSgqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcylhY291c3RpY3MpOworICAgIGluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKCpwRGV2aWNlcyk7CisgICAgaWYgKGluSHdEZXYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0dXMgPSBpbkh3RGV2LT5vcGVuX2lucHV0X3N0cmVhbShpbkh3RGV2LCAqcERldmljZXMsIChpbnQgKikmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVscywgJnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpYWNvdXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSk7CiAgICAgTE9HVigib3BlbklucHV0KCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlZCwgQ2hhbm5lbHMgJXgsIGFjb3VzdGljcyAleCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgaW5TdHJlYW0sCiAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICBjaGFubmVscywKQEAgLTQzNjYsMzAgKzQ4NzIsMzggQEAKICAgICAvLyBJZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycyBhbmQgd2UgY2FuIGhhbmRsZSB0aGUgY29udmVyc2lvbiBpbnRlcm5hbGx5LAogICAgIC8vIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuIFRoZSBBdWRpb0ZsaW5nZXIgY2FuIHJlc2FtcGxlIHRoZSBpbnB1dCBhbmQgZG8gbW9ubyB0byBzdGVyZW8KICAgICAvLyBvciBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9ucyBvbiAxNiBiaXQgUENNIGlucHV0cy4KLSAgICBpZiAoaW5wdXQgPT0gMCAmJiBzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgIHJlcUZvcm1hdCA9PSBmb3JtYXQgJiYgZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUICYmCisgICAgaWYgKGluU3RyZWFtID09IE5VTEwgJiYgc3RhdHVzID09IEJBRF9WQUxVRSAmJgorICAgICAgICByZXFGb3JtYXQgPT0gZm9ybWF0ICYmIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgogICAgICAgICAoc2FtcGxpbmdSYXRlIDw9IDIgKiByZXFTYW1wbGluZ1JhdGUpICYmCi0gICAgICAgIChBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMpIDwgMykgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChyZXFDaGFubmVscykgPCAzKSkgeworICAgICAgICAocG9wY291bnQoY2hhbm5lbHMpIDwgMykgJiYgKHBvcGNvdW50KHJlcUNoYW5uZWxzKSA8IDMpKSB7CiAgICAgICAgIExPR1YoIm9wZW5JbnB1dCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWxzIik7Ci0gICAgICAgIGlucHV0ID0gbUF1ZGlvSGFyZHdhcmUtPm9wZW5JbnB1dFN0cmVhbSgqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcylhY291c3RpY3MpOworICAgICAgICBzdGF0dXMgPSBpbkh3RGV2LT5vcGVuX2lucHV0X3N0cmVhbShpbkh3RGV2LCAqcERldmljZXMsIChpbnQgKikmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbHMsICZzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19pbl9hY291c3RpY3NfdClhY291c3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSk7CiAgICAgfQogCi0gICAgaWYgKGlucHV0ICE9IDApIHsKLSAgICAgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkX2woKTsKLSAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKLSAgICAgICAgdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLCBpbnB1dCwgcmVxU2FtcGxpbmdSYXRlLCByZXFDaGFubmVscywgaWQpOworICAgIGlmIChpblN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0ID0gbmV3IEF1ZGlvU3RyZWFtSW4oaW5Id0RldiwgaW5TdHJlYW0pOworCisgICAgICAgIGludCBpZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCisgICAgICAgIC8vIFJlY29yVGhyZWFkIHJlcXVpcmUgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KKyAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcworICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAoKnBEZXZpY2VzKSB8IHByaW1hcnlPdXRwdXREZXZpY2VfbCgpOworICAgICAgICB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CiAgICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKICAgICAgICAgTE9HVigib3BlbklucHV0KCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKICAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUpICpwU2FtcGxpbmdSYXRlID0gcmVxU2FtcGxpbmdSYXRlOwogICAgICAgICBpZiAocEZvcm1hdCkgKnBGb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgIGlmIChwQ2hhbm5lbHMpICpwQ2hhbm5lbHMgPSByZXFDaGFubmVsczsKIAotICAgICAgICBpbnB1dC0+c3RhbmRieSgpOworICAgICAgICBpbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmaW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKIAogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCiAgICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CkBAIC00NDE4LDcgKzQ5MzIsOSBAQAogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKIAotICAgIG1BdWRpb0hhcmR3YXJlLT5jbG9zZUlucHV0U3RyZWFtKHRocmVhZC0+Z2V0SW5wdXQoKSk7CisgICAgQXVkaW9TdHJlYW1JbiAqaW4gPSB0aHJlYWQtPmdldElucHV0KCk7CisgICAgaW4tPmh3RGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0oaW4tPmh3RGV2LCBpbi0+c3RyZWFtKTsKKyAgICBkZWxldGUgaW47CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC00NDM4LDcgKzQ5NTQsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOwogICAgICAgICBpZiAodGhyZWFkICE9IGRzdFRocmVhZCAmJgotICAgICAgICAgICAgdGhyZWFkLT50eXBlKCkgIT0gUGxheWJhY2tUaHJlYWQ6OkRJUkVDVCkgeworICAgICAgICAgICAgdGhyZWFkLT50eXBlKCkgIT0gVGhyZWFkQmFzZTo6RElSRUNUKSB7CiAgICAgICAgICAgICBNaXhlclRocmVhZCAqc3JjVGhyZWFkID0gKE1peGVyVGhyZWFkICopdGhyZWFkOwogICAgICAgICAgICAgc3JjVGhyZWFkLT5pbnZhbGlkYXRlVHJhY2tzKHN0cmVhbSk7CiAgICAgICAgIH0KQEAgLTQ0NTAsOCArNDk2Niw3IEBACiAKIGludCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvU2Vzc2lvbklkKCkKIHsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIHJldHVybiBuZXh0VW5pcXVlSWRfbCgpOworICAgIHJldHVybiBuZXh0VW5pcXVlSWQoKTsKIH0KIAogLy8gY2hlY2tQbGF5YmFja1RocmVhZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKQEAgLTQ0NjksNyArNDk4NCw3IEBACiB7CiAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwogICAgIGlmICh0aHJlYWQgIT0gTlVMTCkgewotICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gUGxheWJhY2tUaHJlYWQ6OkRJUkVDVCkgeworICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB7CiAgICAgICAgICAgICB0aHJlYWQgPSBOVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtNDQ4Niw0MyArNTAwMSwzOSBAQAogICAgIHJldHVybiB0aHJlYWQ7CiB9CiAKLS8vIG5leHRVbmlxdWVJZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6Om5leHRVbmlxdWVJZF9sKCkKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bmV4dFVuaXF1ZUlkKCkKIHsKLSAgICByZXR1cm4gbU5leHRVbmlxdWVJZCsrOworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwogfQogCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpBdWRpb0ZsaW5nZXI6OnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKHRocmVhZC0+Z2V0T3V0cHV0KCktPmh3RGV2ID09IG1QcmltYXJ5SGFyZHdhcmVEZXYpIHsKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6cHJpbWFyeU91dHB1dERldmljZV9sKCkKK3sKKyAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gcHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKTsKKworICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkLT5kZXZpY2UoKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgRWZmZWN0IG1hbmFnZW1lbnQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQotewotICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgLy8gb25seSBhbGxvdyBsaWJyYXJpZXMgbG9hZGVkIGZyb20gL3N5c3RlbS9saWIvc291bmRmeCBmb3Igbm93Ci0gICAgaWYgKHN0cm5jbXAoZ0VmZmVjdExpYlBhdGgsIGxpYlBhdGgsIHN0cmxlbihnRWZmZWN0TGliUGF0aCkpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIEVmZmVjdExvYWRMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6dW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQotewotICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBFZmZlY3RVbmxvYWRMaWJyYXJ5KGhhbmRsZSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NTQyLDE1ICs1MDUzLDExIEBACiB9CiAKIAotLy8gdGhpcyBVVUlEIG11c3QgbWF0Y2ggdGhlIG9uZSBkZWZpbmVkIGluIG1lZGlhL2xpYmVmZmVjdHMvRWZmZWN0VmlzdWFsaXplci5jcHAKLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFZJU1VBTElaQVRJT05fVVVJRF8gPQotICAgIHsweGQwNjlkOWUwLCAweDgzMjksIDB4MTFkZiwgMHg5MTY4LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OwotCiBzcDxJRWZmZWN0PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdChwaWRfdCBwaWQsCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAogICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICBpbnQgaW8sCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgIGludCAqaWQsCkBAIC00NTU4LDEzICs1MDY1LDEyIEBACiB7CiAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwotICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBpdGZlOwogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICB3cDxDbGllbnQ+IHdjbGllbnQ7CiAKLSAgICBMT0dWKCJjcmVhdGVFZmZlY3QgcGlkICVkLCBjbGllbnQgJXAsIHByaW9yaXR5ICVkLCBzZXNzaW9uSWQgJWQsIG91dHB1dCAlZCIsCi0gICAgICAgICAgICBwaWQsIGVmZmVjdENsaWVudC5nZXQoKSwgcHJpb3JpdHksIHNlc3Npb25JZCwgb3V0cHV0KTsKKyAgICBMT0dWKCJjcmVhdGVFZmZlY3QgcGlkICVkLCBjbGllbnQgJXAsIHByaW9yaXR5ICVkLCBzZXNzaW9uSWQgJWQsIGlvICVkIiwKKyAgICAgICAgICAgIHBpZCwgZWZmZWN0Q2xpZW50LmdldCgpLCBwcmlvcml0eSwgc2Vzc2lvbklkLCBpbyk7CiAKICAgICBpZiAocERlc2MgPT0gTlVMTCkgewogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtNDU3MiwzNyArNTA3OCwyOSBAQAogICAgIH0KIAogICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYICYmICFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmICFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBTZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKKyAgICAvLyBTZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIHJlc2VydmVkIGZvciBvdXRwdXQgc3RhZ2UgZWZmZWN0cwogICAgIC8vIHRoYXQgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciAocnVubmluZyBpbiBzYW1lIHByb2Nlc3MpCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkKCkgIT0gcGlkKSB7CisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSAmJiBnZXRwaWQoKSAhPSBwaWQpIHsKICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gY2hlY2sgcmVjb3JkaW5nIHBlcm1pc3Npb24gZm9yIHZpc3VhbGl6ZXIKLSAgICBpZiAoKG1lbWNtcCgmcERlc2MtPnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDAgfHwKLSAgICAgICAgIG1lbWNtcCgmcERlc2MtPnV1aWQsICZWSVNVQUxJWkFUSU9OX1VVSURfLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCi0gICAgICAgICFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgaWYgKGlvID09IDApIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewogICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KLSAgICAgICAgICAgIC8vIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRQorICAgICAgICAgICAgLy8gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgb3V0cHV0IHJldHVybmVkIGJ5IGdldE91dHB1dEZvckVmZmVjdCgpIGlzIHJlbW92ZWQgYmVmb3JlIHdlIGxvY2sgdGhlCi0gICAgICAgICAgICAvLyBtdXRleCBiZWxvdywgdGhlIGNhbGwgdG8gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCkgYmVsb3cgd2lsbCBkZXRlY3QgaXQKKyAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pIGJlbG93IHdpbGwgZGV0ZWN0IGl0CiAgICAgICAgICAgICAvLyBhbmQgd2Ugd2lsbCBleGl0IHNhZmVseQotICAgICAgICAgICAgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdCgmZGVzYyk7CisgICAgICAgICAgICBpbyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JFZmZlY3QoJmRlc2MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NjQ2LDcgKzUxNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBhbiBhdXhpbGlhcnkgdmVyc2lvbiBvZiB0aGlzIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZCwgJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCB8fAorICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQ2NTksMTkgKzUxNTcsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZvciBzYW1lIGVmZmVjdCB0eXBlLCBjaG9zZSBhdXhpbGlhcnkgdmVyc2lvbiBvdmVyIGluc2VydCB2ZXJzaW9uIGlmCiAgICAgICAgICAgICAvLyBjb25uZWN0IHRvIG91dHB1dCBtaXggKENvbXBsaWFuY2UgdG8gT3BlblNMIEVTKQotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYICYmCisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgogICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgICAgICBtZW1jcHkoJmRlc2MsICZkLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCisgICAgICAgIC8vIGNoZWNrIHJlY29yZGluZyBwZXJtaXNzaW9uIGZvciB2aXN1YWxpemVyCisgICAgICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZCgpKSB7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXR1cm4gZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgICAgbWVtY3B5KHBEZXNjLCAmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKIApAQCAtNDY3OSwzMCArNTE4NCw0MCBAQAogICAgICAgICAvLyBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gSWYgb3V0cHV0IGlzIDAgaGVyZSwgc2Vzc2lvbklkIGlzIG5laXRoZXIgU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm9yIFNFU1NJT05fT1VUUFVUX01JWAogICAgICAgICAvLyBiZWNhdXNlIG9mIGNvZGUgY2hlY2tpbmcgb3V0cHV0IHdoZW4gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uLgotICAgICAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICAgICAgLy8gTm90ZTogaW8gaXMgbmV2ZXIgMCB3aGVuIGNyZWF0aW5nIGFuIGVmZmVjdCBvbiBhbiBpbnB1dAorICAgICAgICBpZiAoaW8gPT0gMCkgewogICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0aHJlYWQgd2hlcmUgdGhlIHNwZWNpZmllZCBhdWRpbyBzZXNzaW9uIGlzIHByZXNlbnQKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW8gPT0gMCkgeworICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGlvID0gbVJlY29yZFRocmVhZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gMCAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIG91dHB1dCA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CisgICAgICAgICAgICBpZiAoaW8gPT0gMCAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBpbyAlZCBmb3IgZWZmZWN0ICVzIiwgaW8sIGRlc2MubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChpbyk7CisgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0UoImNyZWF0ZUVmZmVjdCgpIHVua25vd24gb3V0cHV0IHRocmVhZCIpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIExPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBvdXRwdXQgJWQgZm9yIGVmZmVjdCAlcyIsIG91dHB1dCwgZGVzYy5uYW1lKTsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwotICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgIExPR0UoImNyZWF0ZUVmZmVjdCgpIHVua25vd24gb3V0cHV0IHRocmVhZCIpOwotICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGFsbG93IGF0dGFjaG1lbnQgb2YgZWZmZWN0IHRvIGlucHV0cwogCiAgICAgICAgIHdjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpOwogCkBAIC00NzI4LDEwICs1MjQzLDEwIEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjptb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwgaW50IHNyY091dHB1dCwgaW50IGRzdE91dHB1dCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb25JZCwgaW50IHNyY091dHB1dCwgaW50IGRzdE91dHB1dCkKIHsKICAgICBMT0dWKCJtb3ZlRWZmZWN0cygpIHNlc3Npb24gJWQsIHNyY091dHB1dCAlZCwgZHN0T3V0cHV0ICVkIiwKLSAgICAgICAgICAgIHNlc3Npb24sIHNyY091dHB1dCwgZHN0T3V0cHV0KTsKKyAgICAgICAgICAgIHNlc3Npb25JZCwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKHNyY091dHB1dCA9PSBkc3RPdXRwdXQpIHsKICAgICAgICAgTE9HVygibW92ZUVmZmVjdHMoKSBzYW1lIGRzdCBhbmQgc3JjIG91dHB1dHMgJWQiLCBkc3RPdXRwdXQpOwpAQCAtNDc1MCwyNCArNTI2NSwyNCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChkc3RUaHJlYWQtPm1Mb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNyY1RocmVhZC0+bUxvY2spOwotICAgIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb24sIHNyY1RocmVhZCwgZHN0VGhyZWFkLCBmYWxzZSk7CisgICAgbW92ZUVmZmVjdENoYWluX2woc2Vzc2lvbklkLCBzcmNUaHJlYWQsIGRzdFRocmVhZCwgZmFsc2UpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBtb3ZlRWZmZWN0Q2hhaW5fbCBtdXN0YmUgY2FsbGVkIHdpdGggYm90aCBzcmNUaHJlYWQgYW5kIGRzdFRocmVhZCBtTG9ja3MgaGVsZAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjptb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbiwKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqc3JjVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3RlcikKIHsKICAgICBMT0dWKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIHNlc3Npb24gJWQgZnJvbSB0aHJlYWQgJXAgdG8gdGhyZWFkICVwIiwKLSAgICAgICAgICAgIHNlc3Npb24sIHNyY1RocmVhZCwgZHN0VGhyZWFkKTsKKyAgICAgICAgICAgIHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQpOwogCi0gICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gc3JjVGhyZWFkLT5nZXRFZmZlY3RDaGFpbl9sKHNlc3Npb24pOworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IHNyY1RocmVhZC0+Z2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOwogICAgIGlmIChjaGFpbiA9PSAwKSB7CiAgICAgICAgIExPR1coIm1vdmVFZmZlY3RDaGFpbl9sKCkgZWZmZWN0IGNoYWluIGZvciBzZXNzaW9uICVkIG5vdCBvbiBzb3VyY2UgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICBzZXNzaW9uLCBzcmNUaHJlYWQpOworICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc3JjVGhyZWFkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNDgwMiw3ICs1MzE3LDcgQEAKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgmZWZmZWN0LT5kZXNjKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0T3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+aWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOwpAQCAtNDgxMSw4ICs1MzI2LDkgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKwogLy8gUGxheWJhY2tUaHJlYWQ6OmNyZWF0ZUVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVFZmZlY3RfbCgKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlPiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmNyZWF0ZUVmZmVjdF9sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKQEAgLTQ4MjUsMzUgKzUzNDEsMzUgQEAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKICAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwotICAgIHNwPFRyYWNrPiB0cmFjazsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CiAgICAgYm9vbCBjaGFpbkNyZWF0ZWQgPSBmYWxzZTsKICAgICBib29sIGVmZmVjdENyZWF0ZWQgPSBmYWxzZTsKICAgICBib29sIGVmZmVjdFJlZ2lzdGVyZWQgPSBmYWxzZTsKIAotICAgIGlmIChtT3V0cHV0ID09IDApIHsKKyAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HVygiY3JlYXRlRWZmZWN0X2woKSBBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICBsU3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0IG9uIHNlc3Npb24gb3RoZXIgdGhhbiAwCi0gICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgJiYKLSAgICAgICAgc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKLSAgICAgICAgTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGF1eGlsaWFyeSBlZmZlY3QgJXMgdG8gc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgc2Vzc2lvbklkKTsKLSAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIC8vIERvIG5vdCBhbGxvdyBlZmZlY3RzIHdpdGggc2Vzc2lvbiBJRCAwIG9uIGRpcmVjdCBvdXRwdXQgb3IgZHVwbGljYXRpbmcgdGhyZWFkcwogICAgIC8vIFRPRE86IGFkZCBydWxlIGZvciBodyBhY2NlbGVyYXRlZCBlZmZlY3RzIG9uIGRpcmVjdCBvdXRwdXRzIHdpdGggbm9uIFBDTSBmb3JtYXQKLSAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYgbVR5cGUgIT0gTUlYRVIpIHsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJiBtVHlwZSAhPSBNSVhFUikgewogICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgYXV4aWxpYXJ5IGVmZmVjdCAlcyB0byBzZXNzaW9uICVkIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQorICAgIC8vIE9ubHkgUHJlIHByb2Nlc3NvciBlZmZlY3RzIGFyZSBhbGxvd2VkIG9uIGlucHV0IHRocmVhZHMgYW5kIG9ubHkgb24gaW5wdXQgdGhyZWFkcworICAgIGlmICgobVR5cGUgPT0gUkVDT1JEICYmCisgICAgICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpIHx8CisgICAgICAgICAgICAobVR5cGUgIT0gUkVDT1JEICYmCisgICAgICAgICAgICAgICAgICAgIChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykpIHsKKyAgICAgICAgTE9HVygiY3JlYXRlRWZmZWN0X2woKSBlZmZlY3QgJXMgKGZsYWdzICUwOHgpIGNyZWF0ZWQgb24gd3JvbmcgdGhyZWFkIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPmZsYWdzLCBtVHlwZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICBMT0dWKCJjcmVhdGVFZmZlY3RfbCgpIHRocmVhZCAlcCBlZmZlY3QgJXMgb24gc2Vzc2lvbiAlZCIsIHRoaXMsIGRlc2MtPm5hbWUsIHNlc3Npb25JZCk7CiAKQEAgLTQ4NzYsNyArNTM5Miw3IEBACiAgICAgICAgIExPR1YoImNyZWF0ZUVmZmVjdF9sKCkgZ290IGVmZmVjdCAlcCBvbiBjaGFpbiAlcCIsIGVmZmVjdCA9PSAwID8gMCA6IGVmZmVjdC5nZXQoKSwgY2hhaW4uZ2V0KCkpOwogCiAgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgewotICAgICAgICAgICAgaW50IGlkID0gbUF1ZGlvRmxpbmdlci0+bmV4dFVuaXF1ZUlkX2woKTsKKyAgICAgICAgICAgIGludCBpZCA9IG1BdWRpb0ZsaW5nZXItPm5leHRVbmlxdWVJZCgpOwogICAgICAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKICAgICAgICAgICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoZGVzYywgbUlkLCBjaGFpbi0+c3RyYXRlZ3koKSwgc2Vzc2lvbklkLCBpZCk7CiAgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtNDkyNyw5ICs1NDQzLDIwIEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAorc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0RWZmZWN0X2woaW50IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKQoreworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OworCisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIGVmZmVjdCA9IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbChlZmZlY3RJZCk7CisgICAgfQorICAgIHJldHVybiBlZmZlY3Q7Cit9CisKIC8vIFBsYXliYWNrVGhyZWFkOjphZGRFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQKIC8vIFBsYXliYWNrVGhyZWFkOjptTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphZGRFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKIHsKICAgICAvLyBjaGVjayBmb3IgZXhpc3RpbmcgZWZmZWN0IGNoYWluIHdpdGggdGhlIHJlcXVlc3RlZCBhdWRpbyBzZXNzaW9uCiAgICAgaW50IHNlc3Npb25JZCA9IGVmZmVjdC0+c2Vzc2lvbklkKCk7CkBAIC00OTY1LDcgKzU0OTIsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpIHsKIAogICAgIExPR1YoInJlbW92ZUVmZmVjdF9sKCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKQEAgLTQ5ODQsOCArNTUxMSw1NSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkaXNjb25uZWN0RWZmZWN0KGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpsb2NrRWZmZWN0Q2hhaW5zX2woCisgICAgICAgIFZlY3RvcjxzcCA8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKQoreworICAgIGVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPmxvY2soKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp1bmxvY2tFZmZlY3RDaGFpbnMoCisgICAgICAgIFZlY3RvcjxzcCA8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdENoYWluc1tpXS0+dW5sb2NrKCk7CisgICAgfQorfQorCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEVmZmVjdENoYWluKGludCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworfQorCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCkKK3sKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChtRWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIGNoYWluID0gbUVmZmVjdENoYWluc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjaGFpbjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNldE1vZGUodWludDMyX3QgbW9kZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdENoYWlucy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0TW9kZV9sKG1vZGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSkgeworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBMT0dWKCJkaXNjb25uZWN0RWZmZWN0KCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKICAgICAvLyBkZWxldGUgdGhlIGVmZmVjdCBtb2R1bGUgaWYgcmVtb3ZpbmcgbGFzdCBoYW5kbGUgb24gaXQKQEAgLTUwMTksNiArNTU5Myw3IEBACiAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICBMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgdHJhY2stPnNldE1haW5CdWZmZXIgdHJhY2sgJXAgYnVmZmVyICVwIiwgdHJhY2suZ2V0KCksIGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBjaGFpbi0+aW5jVHJhY2tDbnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01MDI4LDIwICs1NjAzLDIwIEBACiAgICAgICAgICAgICBpZiAodHJhY2sgPT0gMCkgY29udGludWU7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICBMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWN0aXZhdGluZyB0cmFjayAlcCBvbiBzZXNzaW9uICVkIiwgdHJhY2suZ2V0KCksIHNlc3Npb24pOwotICAgICAgICAgICAgICAgIGNoYWluLT5zdGFydFRyYWNrKCk7CisgICAgICAgICAgICAgICAgY2hhaW4tPmluY0FjdGl2ZVRyYWNrQ250KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoYnVmZmVyLCBvd25zQnVmZmVyKTsKICAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKG1NaXhCdWZmZXIpOwotICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgaW5zZXJ0ZWQgYXQgZW5kIG9mIGVmZmVjdAorICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CiAgICAgLy8gY2hhaW5zIGxpc3QgaW4gb3JkZXIgdG8gYmUgcHJvY2Vzc2VkIGxhc3QgYXMgaXQgY29udGFpbnMgb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCBpcyBpbnNlcnRlZCBiZWZvcmUKLSAgICAvLyBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSB0byBiZSBwcm9jZXNzZWQKKyAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQorICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgdG8gYmUgcHJvY2Vzc2VkCiAgICAgLy8gYWZ0ZXIgdHJhY2sgc3BlY2lmaWMgZWZmZWN0cyBhbmQgYmVmb3JlIG91dHB1dCBzdGFnZQotICAgIC8vIEl0IGlzIHRoZXJlZm9yZSBtYW5kYXRvcnkgdGhhdCBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYID09IDAgYW5kCi0gICAgLy8gdGhhdCBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgPCBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYCisgICAgLy8gSXQgaXMgdGhlcmVmb3JlIG1hbmRhdG9yeSB0aGF0IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCA9PSAwIGFuZAorICAgIC8vIHRoYXQgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgPCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIG90aGVyIHNlc3Npb25zIGFyZSBpbnNlcnRlZCBhdCBiZWdpbm5pbmcgb2YgZWZmZWN0CiAgICAgLy8gY2hhaW5zIGxpc3QgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBvdXRwdXQgbWl4IGVmZmVjdHMuIFJlbGF0aXZlIG9yZGVyIGJldHdlZW4gb3RoZXIKICAgICAvLyBzZXNzaW9ucyBpcyBub3QgaW1wb3J0YW50CkBAIC01MDUxLDYgKzU2MjYsNyBAQAogICAgICAgICBpZiAobUVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCkgPCBzZXNzaW9uKSBicmVhazsKICAgICB9CiAgICAgbUVmZmVjdENoYWlucy5pbnNlcnRBdChjaGFpbiwgaSk7CisgICAgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTUwNjMsMTIgKzU2MzksMjUgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAoY2hhaW4gPT0gbUVmZmVjdENoYWluc1tpXSkgeworICAgICAgICAgICAgdXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNPblJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOwogICAgICAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIGRldGFjaCBhbGwgYWN0aXZlIHRyYWNrcyBmcm9tIHRoZSBjaGFpbgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCkgOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInJlbW92ZUVmZmVjdENoYWluX2woKTogc3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbi5nZXQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCB0cmFja3Mgd2l0aCBzYW1lIHNlc3Npb24gSUQgZnJvbSB0aGlzIGNoYWluCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY1RyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC01MDc3LDM1ICs1NjY2LDYgQEAKICAgICByZXR1cm4gbUVmZmVjdENoYWlucy5zaXplKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bG9ja0VmZmVjdENoYWluc19sKAotICAgICAgICBWZWN0b3I8c3AgPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+ID4mIGVmZmVjdENoYWlucykKLXsKLSAgICBlZmZlY3RDaGFpbnMgPSBtRWZmZWN0Q2hhaW5zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5sb2NrKCk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnVubG9ja0VmZmVjdENoYWlucygKLSAgICAgICAgVmVjdG9yPHNwIDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT51bmxvY2soKTsKLSAgICB9Ci19Ci0KLQotc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldEVmZmVjdF9sKGludCBzZXNzaW9uSWQsIGludCBlZmZlY3RJZCkKLXsKLSAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKLQotICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKLSAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woZWZmZWN0SWQpOwotICAgIH0KLSAgICByZXR1cm4gZWZmZWN0OwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdHRhY2hBdXhFZmZlY3QoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywgaW50IEVmZmVjdElkKQogewpAQCAtNTEyMSw4ICs1NjgxLDggQEAKICAgICBpZiAoRWZmZWN0SWQgPT0gMCkgewogICAgICAgICB0cmFjay0+c2V0QXV4QnVmZmVyKDAsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEF1eGlsaWFyeSBlZmZlY3RzIGFyZSBhbHdheXMgaW4gYXVkaW8gc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYCi0gICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZ2V0RWZmZWN0X2woQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpOworICAgICAgICAvLyBBdXhpbGlhcnkgZWZmZWN0cyBhcmUgYWx3YXlzIGluIGF1ZGlvIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZ2V0RWZmZWN0X2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBFZmZlY3RJZCk7CiAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewogICAgICAgICAgICAgaWYgKChlZmZlY3QtPmRlc2MoKS5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+c2V0QXV4QnVmZmVyKEVmZmVjdElkLCAoaW50MzJfdCAqKWVmZmVjdC0+aW5CdWZmZXIoKSk7CkBAIC01MTQ2LDYgKzU3MDYsMzcgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgLy8gb25seSBvbmUgY2hhaW4gcGVyIGlucHV0IHRocmVhZAorICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKKworICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihOVUxMKTsKKyAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKE5VTEwpOworCisgICAgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKworICAgIG1FZmZlY3RDaGFpbnMuYWRkKGNoYWluKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgTE9HVigicmVtb3ZlRWZmZWN0Q2hhaW5fbCgpICVwIGZyb20gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOworICAgIExPR1dfSUYobUVmZmVjdENoYWlucy5zaXplKCkgIT0gMSwKKyAgICAgICAgICAgICJyZW1vdmVFZmZlY3RDaGFpbl9sKCkgJXAgaW52YWxpZCBjaGFpbiBzaXplICVkIG9uIHRocmVhZCAlcCIsCisgICAgICAgICAgICBjaGFpbi5nZXQoKSwgbUVmZmVjdENoYWlucy5zaXplKCksIHRoaXMpOworICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zT25SZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdCgwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICBFZmZlY3RNb2R1bGUgaW1wbGVtZW50YXRpb24KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUxNTksNyArNTc1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtVGhyZWFkKHdUaHJlYWQpLCBtQ2hhaW4oY2hhaW4pLCBtSWQoaWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1FZmZlY3RJbnRlcmZhY2UoTlVMTCksCi0gICAgICBtU3RhdHVzKE5PX0lOSVQpLCBtU3RhdGUoSURMRSkKKyAgICAgIG1TdGF0dXMoTk9fSU5JVCksIG1TdGF0ZShJRExFKSwgbVN1c3BlbmRlZChmYWxzZSkKIHsKICAgICBMT0dWKCJDb25zdHJ1Y3RvciAlcCIsIHRoaXMpOwogICAgIGludCBsU3RhdHVzOwpAQCAtNTE2NywxMiArNTc1OCwxMSBAQAogICAgIGlmICh0aHJlYWQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIFBsYXliYWNrVGhyZWFkICpwID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwogCiAgICAgbWVtY3B5KCZtRGVzY3JpcHRvciwgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKIAogICAgIC8vIGNyZWF0ZSBlZmZlY3QgZW5naW5lIGZyb20gZWZmZWN0IGZhY3RvcnkKLSAgICBtU3RhdHVzID0gRWZmZWN0Q3JlYXRlKCZkZXNjLT51dWlkLCBzZXNzaW9uSWQsIHAtPmlkKCksICZtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICBtU3RhdHVzID0gRWZmZWN0Q3JlYXRlKCZkZXNjLT51dWlkLCBzZXNzaW9uSWQsIHRocmVhZC0+aWQoKSwgJm1FZmZlY3RJbnRlcmZhY2UpOwogCiAgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNTE5NSw2ICs1Nzg1LDEzIEBACiB7CiAgICAgTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8fAorICAgICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLT5zdHJlYW0oKS0+cmVtb3ZlX2F1ZGlvX2VmZmVjdCh0aHJlYWQtPnN0cmVhbSgpLCBtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAvLyByZWxlYXNlIGVmZmVjdCBlbmdpbmUKICAgICAgICAgRWZmZWN0UmVsZWFzZShtRWZmZWN0SW50ZXJmYWNlKTsKICAgICB9CkBAIC01MjE3LDE0ICs1ODE0LDE3IEBACiAgICAgfQogICAgIC8vIGlmIGluc2VydGVkIGluIGZpcnN0IHBsYWNlLCBtb3ZlIGVmZmVjdCBjb250cm9sIGZyb20gcHJldmlvdXMgb3duZXIgdG8gdGhpcyBoYW5kbGUKICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICBpZiAoaCAhPSAwKSB7Ci0gICAgICAgICAgICBoLT5zZXRDb250cm9sKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIGVuYWJsZWQgPSBoLT5lbmFibGVkKCk7CisgICAgICAgICAgICBoLT5zZXRDb250cm9sKGZhbHNlLypoYXNDb250cm9sKi8sIHRydWUgLypzaWduYWwqLywgZW5hYmxlZCAvKmVuYWJsZWQqLyk7CiAgICAgICAgIH0KLSAgICAgICAgaGFuZGxlLT5zZXRDb250cm9sKHRydWUsIGZhbHNlKTsKKyAgICAgICAgaGFuZGxlLT5zZXRDb250cm9sKHRydWUgLypoYXNDb250cm9sKi8sIGZhbHNlIC8qc2lnbmFsKi8sIGVuYWJsZWQgLyplbmFibGVkKi8pOwogICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBBTFJFQURZX0VYSVNUUzsKICAgICB9CisgICAgTE9HVigiYWRkSGFuZGxlKCkgJXAgYWRkZWQgaGFuZGxlICVwIGluIHBvc2l0aW9uICVkIiwgdGhpcywgaGFuZGxlLmdldCgpLCBpKTsKICAgICBtSGFuZGxlcy5pbnNlcnRBdChoYW5kbGUsIGkpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC01MjQwLDM4ICs1ODQwLDU2IEBACiAgICAgaWYgKGkgPT0gc2l6ZSkgewogICAgICAgICByZXR1cm4gc2l6ZTsKICAgICB9CisgICAgTE9HVigicmVtb3ZlSGFuZGxlKCkgJXAgcmVtb3ZlZCBoYW5kbGUgJXAgaW4gcG9zaXRpb24gJWQiLCB0aGlzLCBoYW5kbGUudW5zYWZlX2dldCgpLCBpKTsKKworICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgIEVmZmVjdEhhbmRsZSAqaGRsID0gaGFuZGxlLnVuc2FmZV9nZXQoKTsKKyAgICBpZiAoaGRsKSB7CisgICAgICAgIExPR1YoInJlbW92ZUhhbmRsZSgpIHVuc2FmZV9nZXQgT0siKTsKKyAgICAgICAgZW5hYmxlZCA9IGhkbC0+ZW5hYmxlZCgpOworICAgIH0KICAgICBtSGFuZGxlcy5yZW1vdmVBdChpKTsKICAgICBzaXplID0gbUhhbmRsZXMuc2l6ZSgpOwogICAgIC8vIGlmIHJlbW92ZWQgZnJvbSBmaXJzdCBwbGFjZSwgbW92ZSBlZmZlY3QgY29udHJvbCBmcm9tIHRoaXMgaGFuZGxlIHRvIG5leHQgaW4gbGluZQogICAgIGlmIChpID09IDAgJiYgc2l6ZSAhPSAwKSB7CiAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaCA9IG1IYW5kbGVzWzBdLnByb21vdGUoKTsKICAgICAgICAgaWYgKGggIT0gMCkgewotICAgICAgICAgICAgaC0+c2V0Q29udHJvbCh0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIGgtPnNldENvbnRyb2wodHJ1ZSAvKmhhc0NvbnRyb2wqLywgdHJ1ZSAvKnNpZ25hbCovICwgZW5hYmxlZCAvKmVuYWJsZWQqLyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBSZWxlYXNlIGVmZmVjdCBlbmdpbmUgaGVyZSBzbyB0aGF0IGl0IGlzIGRvbmUgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlbGVhc2VkCi0gICAgLy8gYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4KLSAgICAvLyBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZCBvbiB0aGlzIGVmZmVjdC4KLSAgICBpZiAoc2l6ZSA9PSAwICYmIG1FZmZlY3RJbnRlcmZhY2UgIT0gTlVMTCkgewotICAgICAgICAvLyByZWxlYXNlIGVmZmVjdCBlbmdpbmUKLSAgICAgICAgRWZmZWN0UmVsZWFzZShtRWZmZWN0SW50ZXJmYWNlKTsKLSAgICAgICAgbUVmZmVjdEludGVyZmFjZSA9IE5VTEw7CisgICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgorICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCisgICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgorICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgbVN0YXRlID0gREVTVFJPWUVEOwogICAgIH0KIAogICAgIHJldHVybiBzaXplOwogfQogCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZT4gQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbnRyb2xIYW5kbGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CisgICAgaWYgKG1IYW5kbGVzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGhhbmRsZSA9IG1IYW5kbGVzWzBdLnByb21vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworCisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRpc2Nvbm5lY3QoY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKQogeworICAgIExPR1YoImRpc2Nvbm5lY3QoKSAlcCBoYW5kbGUgJXAgIiwgdGhpcywgaGFuZGxlLnVuc2FmZV9nZXQoKSk7CiAgICAgLy8ga2VlcCBhIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhpcyBFZmZlY3RNb2R1bGUgdG8gYXZvaWQgY2FsbGluZyB0aGUKICAgICAvLyBkZXN0cnVjdG9yIGJlZm9yZSB3ZSBleGl0CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBrZWVwKHRoaXMpOwogICAgIHsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmRpc2Nvbm5lY3RFZmZlY3Qoa2VlcCwgaGFuZGxlKTsKKyAgICAgICAgICAgIHRocmVhZC0+ZGlzY29ubmVjdEVmZmVjdChrZWVwLCBoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNTMwNyw3ICs1OTI1LDcgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogLy9JRExFICwgQUNUSVZFCisgICAgZGVmYXVsdDogLy9JRExFICwgQUNUSVZFLCBERVNUUk9ZRUQKICAgICAgICAgYnJlYWs7CiAgICAgfQogfQpAQCAtNTMxNiw3ICs1OTM0LDcgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCB8fAorICAgIGlmIChtU3RhdGUgPT0gREVTVFJPWUVEIHx8IG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCB8fAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID09IE5VTEwgfHwKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC01MzUwLDcgKzU5NjgsNyBAQAogICAgICAgICAvLyBJZiBhbiBpbnNlcnQgZWZmZWN0IGlzIGlkbGUgYW5kIGlucHV0IGJ1ZmZlciBpcyBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgYnVmZmVyLAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja3MoKSAhPSAwKSB7CisgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiAyOyAgLy9hbHdheXMgc3RlcmVvIGhlcmUKICAgICAgICAgICAgIGludDE2X3QgKmluID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2OwogICAgICAgICAgICAgaW50MTZfdCAqb3V0ID0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnMxNjsKQEAgLTUzODMsMTkgKzYwMDEsMTkgQEAKIAogICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKICAgICBpZiAodGhyZWFkLT5jaGFubmVsQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgICAgICBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICAgICAgY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQogCiAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwogICAgIH0KICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxzOwotICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OwotICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNTQwNiw3ICs2MDI0LDcgQEAKICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIC8vIEluc2VydCBlZmZlY3Q6Ci0gICAgLy8gLSBpbiBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggb3IgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgIC8vIC0gaW4gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsCiAgICAgLy8gYWx3YXlzIG92ZXJ3cml0ZXMgb3V0cHV0IGJ1ZmZlcjogaW5wdXQgYnVmZmVyID09IG91dHB1dCBidWZmZXIKICAgICAvLyAtIGluIG90aGVyIHNlc3Npb25zOgogICAgIC8vICAgICAgbGFzdCBlZmZlY3QgaW4gdGhlIGNoYWluIGFjY3VtdWxhdGVzIGluIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciAhPSBvdXRwdXQgYnVmZmVyCkBAIC01NDgxLDkgKzYwOTksMjMgQEAKICAgICBpZiAoc3RhdHVzID09IDApIHsKICAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOwogICAgIH0KKyAgICBpZiAoc3RhdHVzID09IDAgJiYKKyAgICAgICAgICAgICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfHwKKyAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSkgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICB0aHJlYWQtPnN0cmVhbSgpLT5hZGRfYXVkaW9fZWZmZWN0KHRocmVhZC0+c3RyZWFtKCksIG1FZmZlY3RJbnRlcmZhY2UpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdG9wKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBzdG9wX2woKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN0b3BfbCgpCiB7CiAgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgewpAQCAtNTUwMCw2ICs2MTMyLDE0IEBACiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9CisgICAgaWYgKHN0YXR1cyA9PSAwICYmCisgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CisgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAgICAgdGhyZWFkLT5zdHJlYW0oKS0+cmVtb3ZlX2F1ZGlvX2VmZmVjdCh0aHJlYWQtPnN0cmVhbSgpLCBtRWZmZWN0SW50ZXJmYWNlKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC01NTEyLDcgKzYxNTIsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAvLyAgICBMT0dWKCJjb21tYW5kKCksIGNtZENvZGU6ICVkLCBtRWZmZWN0SW50ZXJmYWNlOiAlcCIsIGNtZENvZGUsIG1FZmZlY3RJbnRlcmZhY2UpOwogCi0gICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgIGlmIChtU3RhdGUgPT0gREVTVFJPWUVEIHx8IG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLApAQCAtNTU2MSw2ICs2MjAxLDggQEAKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElORzsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFU1RST1lFRDoKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsgLy8gc2ltcGx5IGlnbm9yZSBhcyB3ZSBhcmUgYmVpbmcgZGVzdHJveWVkCiAgICAgICAgIH0KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBoID0gbUhhbmRsZXNbaV0ucHJvbW90ZSgpOwpAQCAtNTU4Miw2ICs2MjI0LDcgQEAKICAgICBjYXNlIElETEU6CiAgICAgY2FzZSBTVE9QUElORzoKICAgICBjYXNlIFNUT1BQRUQ6CisgICAgY2FzZSBERVNUUk9ZRUQ6CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTU1OTcsNiArNjI0MCw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIGNhc2UgSURMRToKICAgICBjYXNlIFNUQVJUSU5HOgorICAgIGNhc2UgREVTVFJPWUVEOgogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01NjM5LDIyICs2MjgzLDQxIEBACiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKLSAgICAgICAgLy8gY29udmVydCBkZXZpY2UgYml0IGZpZWxkIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KLSAgICAgICAgZGV2aWNlID0gZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShkZXZpY2UpOwotICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGRldmljZSAmJiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSykgPT0gRUZGRUNUX0ZMQUdfREVWSUNFX0lORCkgeworICAgICAgICAvLyBhdWRpbyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzIG9uIFJlY29yZFRocmVhZCBjYW4gcmVjZWl2ZSBib3RoIG91dHB1dCBhbmQKKyAgICAgICAgLy8gaW5wdXQgZGV2aWNlIGluZGljYXRpb24gaW4gdGhlIHNhbWUgY2FsbAorICAgICAgICB1aW50MzJfdCBkZXYgPSBkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTDsKKyAgICAgICAgaWYgKGRldikgeworICAgICAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGNtZFN0YXR1czsKLSAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7Ci0gICAgICAgIHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgICAgIGRldiA9IGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTEw7CisgICAgICAgIGlmIChkZXYpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yoc3RhdHVzX3QpOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMyID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9JTlBVVF9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzMiA9IGNtZFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMyOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NjY1LDE3ICs2MzI4LDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCkgewotICAgICAgICAvLyBjb252ZXJ0IGF1ZGlvIG1vZGUgZnJvbSBBdWRpb1N5c3RlbSB0byBFZmZlY3RBcGkgZm9ybWF0LgotICAgICAgICBpbnQgZWZmZWN0TW9kZSA9IG1vZGVBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKG1vZGUpOwotICAgICAgICBpZiAoZWZmZWN0TW9kZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KICAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwogICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKICAgICAgICAgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVmZmVjdE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTU2ODUsNTEgKzYzNDMsMTUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0vLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIG9yIGF1ZGlvX2RldmljZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi1jb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c0RldmljZUNvbnZUYWJsZVtdID0gewotICAgIERFVklDRV9FQVJQSUVDRSwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfRUFSUElFQ0UKLSAgICBERVZJQ0VfU1BFQUtFUiwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUgotICAgIERFVklDRV9XSVJFRF9IRUFEU0VULCAvLyBjYXNlIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQKLSAgICBERVZJQ0VfV0lSRURfSEVBRFBIT05FLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUKLSAgICBERVZJQ0VfQkxVRVRPT1RIX1NDTywgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTwotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVAotICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCwgLy8gIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUCi0gICAgREVWSUNFX0JMVUVUT09USF9BMkRQLCAvLyAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAKLSAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUwotICAgIERFVklDRV9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSLCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSCi0gICAgREVWSUNFX0FVWF9ESUdJVEFMIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FVWF9ESUdJVEFMCi19OwotCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBkZXZpY2UpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRTdXNwZW5kZWQoYm9vbCBzdXNwZW5kZWQpCiB7Ci0gICAgdWludDMyX3QgZGV2aWNlT3V0ID0gMDsKLSAgICB3aGlsZSAoZGV2aWNlKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZGV2aWNlKTsKLSAgICAgICAgZGV2aWNlICY9IH4oMSA8PCBpKTsKLSAgICAgICAgaWYgKGkgPj0gc2l6ZW9mKHNEZXZpY2VDb252VGFibGUpL3NpemVvZih1aW50MzJfdCkpIHsKLSAgICAgICAgICAgIExPR0UoImRldmljZSBjb252ZXJ0aW9uIGVycm9yIGZvciBBdWRpb1N5c3RlbSBkZXZpY2UgMHglMDh4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGRldmljZU91dCB8PSAodWludDMyX3Qpc0RldmljZUNvbnZUYWJsZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZU91dDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7CiB9Ci0KLS8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUgb3IgYXVkaW9fbW9kZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi1jb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c01vZGVDb252VGFibGVbXSA9IHsKLSAgICBBVURJT19FRkZFQ1RfTU9ERV9OT1JNQUwsICAgLy8gQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMCi0gICAgQVVESU9fRUZGRUNUX01PREVfUklOR1RPTkUsIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX1JJTkdUT05FCi0gICAgQVVESU9fRUZGRUNUX01PREVfSU5fQ0FMTCwgIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwKLSAgICBBVURJT19FRkZFQ1RfTU9ERV9JTl9DQUxMICAgLy8gQXVkaW9TeXN0ZW06Ok1PREVfSU5fQ09NTVVOSUNBVElPTiwgc2FtZSBjb252ZXJzaW9uIGFzIGZvciBNT0RFX0lOX0NBTEwKLX07Ci0KLWludCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6bW9kZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgbW9kZSkKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN1c3BlbmRlZCgpCiB7Ci0gICAgaW50IG1vZGVPdXQgPSAtMTsKLSAgICBpZiAobW9kZSA8IHNpemVvZihzTW9kZUNvbnZUYWJsZSkgLyBzaXplb2YodWludDMyX3QpKSB7Ci0gICAgICAgIG1vZGVPdXQgPSAoaW50KXNNb2RlQ29udlRhYmxlW21vZGVdOwotICAgIH0KLSAgICByZXR1cm4gbW9kZU91dDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtU3VzcGVuZGVkOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC01NzYzLDcgKzYzODUsNyBAQAogICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUuY2xvY2tTZXEsIG1EZXNjcmlwdG9yLnR5cGUubm9kZVswXSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzFdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwNFhcblx0XHQtIGZsYWdzOiAlMDhYXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC01ODI4LDcgKzY0NTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSkKICAgICA6IEJuRWZmZWN0KCksCi0gICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0Q2xpZW50KGVmZmVjdENsaWVudCksIG1DbGllbnQoY2xpZW50KSwgbVByaW9yaXR5KHByaW9yaXR5KSwgbUhhc0NvbnRyb2woZmFsc2UpCisgICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0Q2xpZW50KGVmZmVjdENsaWVudCksIG1DbGllbnQoY2xpZW50KSwKKyAgICBtUHJpb3JpdHkocHJpb3JpdHkpLCBtSGFzQ29udHJvbChmYWxzZSksIG1FbmFibGVkKGZhbHNlKQogewogICAgIExPR1YoImNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CiAKQEAgLTU4NTEsMzAgKzY0NzQsNjYgQEAKIHsKICAgICBMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CiAgICAgZGlzY29ubmVjdCgpOworICAgIExPR1YoIkRlc3RydWN0b3IgRE9ORSAlcCIsIHRoaXMpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKIHsKKyAgICBMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKICAgICBpZiAoIW1IYXNDb250cm9sKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOwogCisgICAgbUVuYWJsZWQgPSB0cnVlOworCisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUVmZmVjdC0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICB0aHJlYWQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChtRWZmZWN0LCB0cnVlLCBtRWZmZWN0LT5zZXNzaW9uSWQoKSk7CisgICAgfQorCisgICAgLy8gY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKCkgY2FuIHN1c3BlbmQgdGhpcyBzYW1lIGVmZmVjdCB3aGVuIGVuYWJsZWQKKyAgICBpZiAobUVmZmVjdC0+c3VzcGVuZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKwogICAgIHJldHVybiBtRWZmZWN0LT5zZXRFbmFibGVkKHRydWUpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZGlzYWJsZSgpCiB7CisgICAgTE9HVigiZGlzYWJsZSAlcCIsIHRoaXMpOwogICAgIGlmICghbUhhc0NvbnRyb2wpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBpZiAobUVmZmVjdCA9PSBOVUxMKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgcmV0dXJuIG1FZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOworICAgIG1FbmFibGVkID0gZmFsc2U7CisKKyAgICBpZiAobUVmZmVjdC0+c3VzcGVuZGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUVmZmVjdC0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICB0aHJlYWQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChtRWZmZWN0LCBmYWxzZSwgbUVmZmVjdC0+c2Vzc2lvbklkKCkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmRpc2Nvbm5lY3QoKQogeworICAgIExPR1YoImRpc2Nvbm5lY3QgJXAiLCB0aGlzKTsKICAgICBpZiAobUVmZmVjdCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKICAgICBtRWZmZWN0LT5kaXNjb25uZWN0KHRoaXMpOworCisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUVmZmVjdC0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICB0aHJlYWQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChtRWZmZWN0LCBmYWxzZSwgbUVmZmVjdC0+c2Vzc2lvbklkKCkpOworICAgIH0KKwogICAgIC8vIHJlbGVhc2Ugc3Agb24gbW9kdWxlID0+IG1vZHVsZSBkZXN0cnVjdG9yIGNhbiBiZSBjYWxsZWQgbm93CiAgICAgbUVmZmVjdC5jbGVhcigpOwogICAgIGlmIChtQ2JsaykgewpAQCAtNTk2NiwxMSArNjYyNSwxMyBAQAogICAgIHJldHVybiBtQ2Jsa01lbW9yeTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6c2V0Q29udHJvbChib29sIGhhc0NvbnRyb2wsIGJvb2wgc2lnbmFsKQordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6c2V0Q29udHJvbChib29sIGhhc0NvbnRyb2wsIGJvb2wgc2lnbmFsLCBib29sIGVuYWJsZWQpCiB7CiAgICAgTE9HVigic2V0Q29udHJvbCAlcCBjb250cm9sICVkIiwgdGhpcywgaGFzQ29udHJvbCk7CiAKICAgICBtSGFzQ29udHJvbCA9IGhhc0NvbnRyb2w7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkOworCiAgICAgaWYgKHNpZ25hbCAmJiBtRWZmZWN0Q2xpZW50ICE9IDApIHsKICAgICAgICAgbUVmZmVjdENsaWVudC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoaGFzQ29udHJvbCk7CiAgICAgfQpAQCAtNjAyNiwxMSArNjY4NywxMSBAQAogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDaGFpbihjb25zdCB3cDxUaHJlYWRCYXNlPiYgd1RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQotICAgIDogbVRocmVhZCh3VGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1Pd25JbkJ1ZmZlcihmYWxzZSksCi0gICAgICAgICAgICBtVm9sdW1lQ3RybElkeCgtMSksIG1MZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbVJpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwKLSAgICAgICAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKQorICAgIDogbVRocmVhZCh3VGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1UcmFja0NudCgwKSwKKyAgICAgIG1Pd25JbkJ1ZmZlcihmYWxzZSksIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAorICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCiB7Ci0gICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7CisgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46On5FZmZlY3RDaGFpbigpCkBAIC02MDQxLDcgKzY3MDIsNyBAQAogCiB9CiAKLS8vIGdldEVmZmVjdEZyb21EZXNjX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFBsYXliYWNrVGhyZWFkOjptTG9jayBoZWxkCisvLyBnZXRFZmZlY3RGcm9tRGVzY19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Z2V0RWZmZWN0RnJvbURlc2NfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKQogewogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OwpAQCAtNjA1Niw3ICs2NzE3LDcgQEAKICAgICByZXR1cm4gZWZmZWN0OwogfQogCi0vLyBnZXRFZmZlY3RGcm9tSWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKKy8vIGdldEVmZmVjdEZyb21JZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Z2V0RWZmZWN0RnJvbUlkX2woaW50IGlkKQogewogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OwpAQCAtNjA3Miw2ICs2NzMzLDIyIEBACiAgICAgcmV0dXJuIGVmZmVjdDsKIH0KIAorLy8gZ2V0RWZmZWN0RnJvbVR5cGVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEVmZmVjdEZyb21UeXBlX2woCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUpCit7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAobWVtY21wKCZtRWZmZWN0c1tpXS0+ZGVzYygpLnR5cGUsIHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgZWZmZWN0ID0gbUVmZmVjdHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZWZmZWN0OworfQorCiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6cHJvY2Vzc19sKCkKIHsKQEAgLTYwODAsMTMgKzY3NTcsMTkgQEAKICAgICAgICAgTE9HVygicHJvY2Vzc19sKCk6IGNhbm5vdCBwcm9tb3RlIG1peGVyIHRocmVhZCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICBib29sIGlzR2xvYmFsU2Vzc2lvbiA9IChtU2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHx8Ci0gICAgICAgICAgICAobVNlc3Npb25JZCA9PSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UpOworICAgIGJvb2wgaXNHbG9iYWxTZXNzaW9uID0gKG1TZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB8fAorICAgICAgICAgICAgKG1TZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpOwogICAgIGJvb2wgdHJhY2tzT25TZXNzaW9uID0gZmFsc2U7CiAgICAgaWYgKCFpc0dsb2JhbFNlc3Npb24pIHsKLSAgICAgICAgdHJhY2tzT25TZXNzaW9uID0KLSAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+aGFzQXVkaW9TZXNzaW9uKG1TZXNzaW9uSWQpICYgUGxheWJhY2tUaHJlYWQ6OlRSQUNLX1NFU1NJT047CisgICAgICAgIHRyYWNrc09uU2Vzc2lvbiA9ICh0cmFja0NudCgpICE9IDApOworICAgIH0KKworICAgIC8vIGlmIG5vIHRyYWNrIGlzIGFjdGl2ZSwgaW5wdXQgYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBoZXJlIGFzIHRoZSBtaXhlciBwcm9jZXNzCisgICAgLy8gd2lsbCBub3QgZG8gaXQKKyAgICBpZiAodHJhY2tzT25TZXNzaW9uICYmCisgICAgICAgICAgICBhY3RpdmVUcmFja0NudCgpID09IDApIHsKKyAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOwogICAgIH0KIAogICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOwpAQCAtNjA5OSwxMyArNjc4Miw2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgbUVmZmVjdHNbaV0tPnVwZGF0ZVN0YXRlKCk7CiAgICAgfQotICAgIC8vIGlmIG5vIHRyYWNrIGlzIGFjdGl2ZSwgaW5wdXQgYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBoZXJlIGFzIHRoZSBtaXhlciBwcm9jZXNzCi0gICAgLy8gd2lsbCBub3QgZG8gaXQKLSAgICBpZiAodHJhY2tzT25TZXNzaW9uICYmCi0gICAgICAgIGFjdGl2ZVRyYWNrcygpID09IDApIHsKLSAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogcGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOwotICAgICAgICBtZW1zZXQobUluQnVmZmVyLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICB9CiB9CiAKIC8vIGFkZEVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZApAQCAtNjIzMiw2ICs2OTA4LDEwIEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChlZmZlY3QgPT0gbUVmZmVjdHNbaV0pIHsKKyAgICAgICAgICAgIC8vIGNhbGxpbmcgc3RvcCBoZXJlIHdpbGwgcmVtb3ZlIHByZS1wcm9jZXNzaW5nIGVmZmVjdCBmcm9tIHRoZSBhdWRpbyBIQUwuCisgICAgICAgICAgICAvLyBUaGlzIGlzIHNhZmUgYXMgd2UgaG9sZCB0aGUgRWZmZWN0Q2hhaW4gbXV0ZXggd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHdlIGFyZSBub3QgaW4KKyAgICAgICAgICAgIC8vIHRoZSBtaWRkbGUgb2YgYSByZWFkIGZyb20gYXVkaW8gSEFMCisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c3RvcCgpOwogICAgICAgICAgICAgaWYgKHR5cGUgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgICAgICBkZWxldGVbXSBlZmZlY3QtPmluQnVmZmVyKCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjM2Myw2ICs3MDQzLDE2NiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldEVmZmVjdFN1c3BlbmRlZF9sKAorICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLCBib29sIHN1c3BlbmQpCit7CisgICAgc3A8U3VzcGVuZGVkRWZmZWN0RGVzYz4gZGVzYzsKKyAgICAvLyB1c2UgZWZmZWN0IHR5cGUgVVVJRCB0aW1lbG93IGFzIGtleSBhcyB0aGVyZSBpcyBubyByZWFsIHJpc2sgb2YgaWRlbnRpY2FsCisgICAgLy8gdGltZUxvdyBmaWVsZHMgYW1vbmcgZWZmZWN0IHR5cGUgVVVJRHMuCisgICAgaW50IGluZGV4ID0gbVN1c3BlbmRlZEVmZmVjdHMuaW5kZXhPZktleSh0eXBlLT50aW1lTG93KTsKKyAgICBpZiAoc3VzcGVuZCkgeworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgZGVzYyA9IG1TdXNwZW5kZWRFZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzYyA9IG5ldyBTdXNwZW5kZWRFZmZlY3REZXNjKCk7CisgICAgICAgICAgICBtZW1jcHkoJmRlc2MtPm1UeXBlLCB0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgbVN1c3BlbmRlZEVmZmVjdHMuYWRkKHR5cGUtPnRpbWVMb3csIGRlc2MpOworICAgICAgICAgICAgTE9HVigic2V0RWZmZWN0U3VzcGVuZGVkX2woKSBhZGQgZW50cnkgZm9yICUwOHgiLCB0eXBlLT50aW1lTG93KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzYy0+bVJlZkNvdW50KysgPT0gMCkgeworICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBnZXRFZmZlY3RJZkVuYWJsZWQodHlwZSk7CisgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRWZmZWN0ID0gZWZmZWN0OworICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0U3VzcGVuZGVkKHRydWUpOworICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGVzYyA9IG1TdXNwZW5kZWRFZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoZGVzYy0+bVJlZkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIExPR1coInNldEVmZmVjdFN1c3BlbmRlZF9sKCkgcmVzdG9yZSByZWZjb3VudCBzaG91bGQgbm90IGJlIDAgJWQiLCBkZXNjLT5tUmVmQ291bnQpOworICAgICAgICAgICAgZGVzYy0+bVJlZkNvdW50ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1kZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICAgICAgTE9HVigic2V0RWZmZWN0U3VzcGVuZGVkX2woKSByZW1vdmUgZW50cnkgZm9yICUwOHgiLCBtU3VzcGVuZGVkRWZmZWN0cy5rZXlBdChpbmRleCkpOworICAgICAgICAgICAgaWYgKGRlc2MtPm1FZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZGVzYy0+bUVmZmVjdC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0U3VzcGVuZGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGUgPSBlZmZlY3QtPmNvbnRyb2xIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnNldEVuYWJsZWQoaGFuZGxlLT5lbmFibGVkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2MtPm1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdXNwZW5kZWRFZmZlY3RzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0RWZmZWN0U3VzcGVuZGVkQWxsX2woYm9vbCBzdXNwZW5kKQoreworICAgIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+IGRlc2M7CisKKyAgICBpbnQgaW5kZXggPSBtU3VzcGVuZGVkRWZmZWN0cy5pbmRleE9mS2V5KChpbnQpa0tleUZvclN1c3BlbmRBbGwpOworICAgIGlmIChzdXNwZW5kKSB7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBkZXNjID0gbVN1c3BlbmRlZEVmZmVjdHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXNjID0gbmV3IFN1c3BlbmRlZEVmZmVjdERlc2MoKTsKKyAgICAgICAgICAgIG1TdXNwZW5kZWRFZmZlY3RzLmFkZCgoaW50KWtLZXlGb3JTdXNwZW5kQWxsLCBkZXNjKTsKKyAgICAgICAgICAgIExPR1YoInNldEVmZmVjdFN1c3BlbmRlZEFsbF9sKCkgYWRkIGVudHJ5IGZvciAwIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCsrID09IDApIHsKKyAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IGVmZmVjdHMgPSBnZXRTdXNwZW5kRWxpZ2libGVFZmZlY3RzKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbCgmZWZmZWN0c1tpXS0+ZGVzYygpLnR5cGUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlc2MgPSBtU3VzcGVuZGVkRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCA8PSAwKSB7CisgICAgICAgICAgICBMT0dXKCJzZXRFZmZlY3RTdXNwZW5kZWRBbGxfbCgpIHJlc3RvcmUgcmVmY291bnQgc2hvdWxkIG5vdCBiZSAwICVkIiwgZGVzYy0+bVJlZkNvdW50KTsKKyAgICAgICAgICAgIGRlc2MtPm1SZWZDb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tZGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIFZlY3Rvcjxjb25zdCBlZmZlY3RfdXVpZF90ICo+IHR5cGVzOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VzcGVuZGVkRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtU3VzcGVuZGVkRWZmZWN0cy5rZXlBdChpKSA9PSAoaW50KWtLZXlGb3JTdXNwZW5kQWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQoJm1TdXNwZW5kZWRFZmZlY3RzLnZhbHVlQXQoaSktPm1UeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbCh0eXBlc1tpXSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HVigic2V0RWZmZWN0U3VzcGVuZGVkQWxsX2woKSByZW1vdmUgZW50cnkgZm9yICUwOHgiLCBtU3VzcGVuZGVkRWZmZWN0cy5rZXlBdChpbmRleCkpOworICAgICAgICAgICAgbVN1c3BlbmRlZEVmZmVjdHMucmVtb3ZlSXRlbSgoaW50KWtLZXlGb3JTdXNwZW5kQWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVmVjdG9yPCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gPiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpnZXRTdXNwZW5kRWxpZ2libGVFZmZlY3RzKCkKK3sKKyAgICBWZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBlZmZlY3RzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gbUVmZmVjdHNbaV0tPmRlc2MoKTsKKyAgICAgICAgLy8gYXV4aWxpYXJ5IGVmZmVjdHMgYW5kIHZpenVhbGl6ZXIgYXJlIG5ldmVyIHN1c3BlbmRlZCBvbiBvdXRwdXQgbWl4CisgICAgICAgIGlmICgobVNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICYmICgKKyAgICAgICAgICAgICgoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHx8CisgICAgICAgICAgICAgKG1lbWNtcCgmZGVzYy50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdHMuYWRkKG1FZmZlY3RzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdHM7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpnZXRFZmZlY3RJZkVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlKQoreworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OworICAgIGVmZmVjdCA9IGdldEVmZmVjdEZyb21UeXBlX2wodHlwZSk7CisgICAgaWYgKGVmZmVjdCAhPSAwICYmICFlZmZlY3QtPmlzRW5hYmxlZCgpKSB7CisgICAgICAgIGVmZmVjdC5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gZWZmZWN0OworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCit7CisgICAgaW50IGluZGV4ID0gbVN1c3BlbmRlZEVmZmVjdHMuaW5kZXhPZktleShlZmZlY3QtPmRlc2MoKS50eXBlLnRpbWVMb3cpOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBlZmZlY3QgaXMgbm90IHN1c3BlbmQgY2hlY2sgaWYgYWxsIGVmZmVjdHMgYXJlIHN1c3BlbmRlZAorICAgICAgICAgICAgaW5kZXggPSBtU3VzcGVuZGVkRWZmZWN0cy5pbmRleE9mS2V5KChpbnQpa0tleUZvclN1c3BlbmRBbGwpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKCZlZmZlY3QtPmRlc2MoKS50eXBlLCBlbmFibGVkKTsKKyAgICAgICAgICAgIGluZGV4ID0gbVN1c3BlbmRlZEVmZmVjdHMuaW5kZXhPZktleShlZmZlY3QtPmRlc2MoKS50eXBlLnRpbWVMb3cpOworICAgICAgICB9CisgICAgICAgIExPR1YoImNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCgpIGVuYWJsZSBzdXNwZW5kaW5nIGZ4ICUwOHgiLAorICAgICAgICAgICAgIGVmZmVjdC0+ZGVzYygpLnR5cGUudGltZUxvdyk7CisgICAgICAgIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+IGRlc2MgPSBtU3VzcGVuZGVkRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgLy8gaWYgZWZmZWN0IGlzIHJlcXVlc3RlZCB0byBzdXNwZW5kZWQgYnV0IHdhcyBub3QgeWV0IGVuYWJsZWQsIHN1cGVuZCBpdCBub3cuCisgICAgICAgIGlmIChkZXNjLT5tRWZmZWN0ID09IDApIHsKKyAgICAgICAgICAgIGRlc2MtPm1FZmZlY3QgPSBlZmZlY3Q7CisgICAgICAgICAgICBlZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgZWZmZWN0LT5zZXRTdXNwZW5kZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKCkgZGlzYWJsZSByZXN0b3JpbmcgZnggJTA4eCIsCisgICAgICAgICAgICAgZWZmZWN0LT5kZXNjKCkudHlwZS50aW1lTG93KTsKKyAgICAgICAgc3A8U3VzcGVuZGVkRWZmZWN0RGVzYz4gZGVzYyA9IG1TdXNwZW5kZWRFZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBkZXNjLT5tRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGVmZmVjdC0+c2V0U3VzcGVuZGVkKGZhbHNlKTsKKyAgICB9Cit9CisKICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IGVjM2QyMDIuLjc5MTM0MWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTMyLDE1ICszMiwxOSBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb0J1ZmZlclByb3ZpZGVyLmgiCiAKKyNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKQEAgLTQ5LDcgKzUzLDYgQEAKIGNsYXNzIEF1ZGlvQnVmZmVyOwogY2xhc3MgQXVkaW9SZXNhbXBsZXI7CiAKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjZGVmaW5lIExJS0VMWSggZXhwICkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIHRydWUgICkpCkBAIC03NSw4ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTg2LDcgKzg5LDcgQEAKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGludCBvdXRwdXQpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChpbnQgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0OwogCkBAIC0xNDYsMTAgKzE0OSw2IEBACiAKICAgICB2aXJ0dWFsIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKQEAgLTE2MCwxMyArMTU5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLCBpbnQgc3JjT3V0cHV0LCBpbnQgZHN0T3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uSWQsIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpOwogCiAgICAgZW51bSBoYXJkd2FyZV9jYWxsX3N0YXRlIHsKICAgICAgICAgQVVESU9fSFdfSURMRSA9IDAsCkBAIC0xOTIsOCArMTkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0yMDcsMTAgKzIwNiwxNSBAQAogCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0TW9kZSgpIHsgcmV0dXJuIG1Nb2RlOyB9CiAKKyAgICAgICAgICAgICAgICBib29sICAgICAgICBidE5yZWMoKSB7IHJldHVybiBtQnROcmVjOyB9CisKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyKCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvRmxpbmdlcigpOwogCisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworICAgIGF1ZGlvX2h3X2RldmljZV90KiAgICAgIGZpbmRTdWl0YWJsZUh3RGV2X2wodWludDMyX3QgZGV2aWNlcyk7CiAKICAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGVzLgogICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC0yNjgsMTMgKzI3MiwyNiBAQAogICAgIGNsYXNzIEVmZmVjdE1vZHVsZTsKICAgICBjbGFzcyBFZmZlY3RIYW5kbGU7CiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47CisgICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0OworICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluOwogCiAgICAgY2xhc3MgVGhyZWFkQmFzZSA6IHB1YmxpYyBUaHJlYWQgewogICAgIHB1YmxpYzoKLSAgICAgICAgVGhyZWFkQmFzZSAoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBpbnQgaWQpOworICAgICAgICBUaHJlYWRCYXNlIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCisKKyAgICAgICAgZW51bSB0eXBlIHsKKyAgICAgICAgICAgIE1JWEVSLCAgICAgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGlzIE1peGVyVGhyZWFkCisgICAgICAgICAgICBESVJFQ1QsICAgICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBpcyBEaXJlY3RPdXRwdXRUaHJlYWQKKyAgICAgICAgICAgIERVUExJQ0FUSU5HLCAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGlzIER1cGxpY2F0aW5nVGhyZWFkCisgICAgICAgICAgICBSRUNPUkQgICAgICAgICAgICAgIC8vIFRocmVhZCBjbGFzcyBpcyBSZWNvcmRUaHJlYWQKKyAgICAgICAgfTsKKwogICAgICAgICBzdGF0dXNfdCBkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICBzdGF0dXNfdCBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgdm9pZCBjbGVhclBvd2VyTWFuYWdlcigpOwogCiAgICAgICAgIC8vIGJhc2UgZm9yIHJlY29yZCBhbmQgcGxheWJhY2sKICAgICAgICAgY2xhc3MgVHJhY2tCYXNlIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIsIHB1YmxpYyBSZWZCYXNlIHsKQEAgLTI5OSw4ICszMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC0zMjcsMTIgKzM0NCwxNCBAQAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIGludCBmb3JtYXQoKSBjb25zdCB7CisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQoKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQoKSBjb25zdCA7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrKCkgY29uc3Q7CisKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlKCkgY29uc3Q7CiAKICAgICAgICAgICAgIHZvaWQqIGdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3Q7CkBAIC0zNTgsOSArMzc3LDExIEBACiAgICAgICAgICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1TdGF0ZTsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUNsaWVudFRpZDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZvcm1hdDsKICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZsYWdzOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOworICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ29uZmlnRXZlbnQgewpAQCAtMzcxLDkgKzM5MiwyNiBAQAogICAgICAgICAgICAgaW50IG1QYXJhbTsKICAgICAgICAgfTsKIAorICAgICAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKSA6IG1UaHJlYWQodGhyZWFkKSB7fQorICAgICAgICAgICAgdmlydHVhbCAgICAgflBNRGVhdGhSZWNpcGllbnQoKSB7fQorCisgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgUE1EZWF0aFJlY2lwaWVudChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7CisgICAgICAgICAgICAgICAgICAgICAgICBQTURlYXRoUmVjaXBpZW50JiBvcGVyYXRvciA9IChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7CisKKyAgICAgICAgICAgIHdwPFRocmVhZEJhc2U+IG1UaHJlYWQ7CisgICAgICAgIH07CisKKyAgICAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdDsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZvcm1hdCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHdha2VVcCgpICAgIHsgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7IH0KICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwpAQCAtMzg2LDExICs0MjQsMTAxIEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7fQogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGFuZGJ5KCkgeyByZXR1cm4gbVN0YW5kYnk7IH0KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgZGV2aWNlKCkgeyByZXR1cm4gbURldmljZTsgfQorICAgICAgICB2aXJ0dWFsICAgICBhdWRpb19zdHJlYW1fdCogc3RyZWFtKCkgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gY3JlYXRlRWZmZWN0X2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWVzIGZvciBoYXNBdWRpb1Nlc3Npb24gKGJpdCBmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgeworICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX1NFU1NJT04gPSAweDEsICAgLy8gdGhlIGF1ZGlvIHNlc3Npb24gY29ycmVzcG9uZHMgdG8gYXQgbGVhc3Qgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNLX1NFU1NJT04gPSAweDIgICAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgZWZmZWN0IGNoYWluIGNvcnJlc3BvbmRpbmcgdG8gc2Vzc2lvbiBJZC4KKyAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldEVmZmVjdENoYWluKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGdldEVmZmVjdENoYWluKCkgYnV0IG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZSBtdXRleCBsb2NrZWQKKyAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldEVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBlZmZlY3QgY2hhaW4gdG8gdGhlIGNoYWluIGxpc3QgKG1FZmZlY3RDaGFpbnMpCisgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW4gZWZmZWN0IGNoYWluIGZyb20gdGhlIGNoYWluIGxpc3QgKG1FZmZlY3RDaGFpbnMpCisgICAgICAgIHZpcnR1YWwgICAgIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9jayBtYWxsIGVmZmVjdCBjaGFpbnMgTXV0ZXhlcy4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlbGVhc2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhyZWFkQmFzZSBtdXRleCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbWl4ZXIgYW5kIGVmZmVjdHMuIFRoaXMgZ3VhcmFudGVlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdyaXR5IG9mIHRoZSBjaGFpbnMgZHVyaW5nIHRoZSBwcm9jZXNzLgorICAgICAgICAgICAgICAgICAgICB2b2lkIGxvY2tFZmZlY3RDaGFpbnNfbChWZWN0b3I8c3AgPEVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpOworICAgICAgICAgICAgICAgICAgICAvLyB1bmxvY2sgZWZmZWN0IGNoYWlucyBhZnRlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgdW5sb2NrRWZmZWN0Q2hhaW5zKFZlY3RvcjxzcCA8RWZmZWN0Q2hhaW4+ID4mIGVmZmVjdENoYWlucyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBhdWRpbyBtb2RlIHRvIGFsbCBlZmZlY3QgY2hhaW5zCisgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0TW9kZSh1aW50MzJfdCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGVmZmVjdCBtb2R1bGUgd2l0aCBjb3JyZXNwb25kaW5nIElEIG9uIHNwZWNpZmllZCBhdWRpbyBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RfbChpbnQgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYW5kIGVmZmVjdCBtb2R1bGUuIEFsc28gY3JlYXRlcyB0aGUgZWZmZWN0IGNoYWluIGlzIG5vbmUgZXhpc3RzIGZvcgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0cyBhdWRpbyBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGFkZEVmZmVjdF9sKGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW5kIGVmZmVjdCBtb2R1bGUuIEFsc28gcmVtb3ZlcyB0aGUgZWZmZWN0IGNoYWluIGlzIHRoaXMgd2FzIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGVmZmVjdAorICAgICAgICAgICAgICAgICAgICB2b2lkIHJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOworICAgICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYWxsIHRyYWNrcyBjb25uZWN0ZWQgdG8gYW4gYXV4aWxpYXJ5IGVmZmVjdAorICAgICAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkge30KKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBlaXRoZXIgRUZGRUNUX1NFU1NJT04gaWYgZWZmZWN0cyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QgaW4gb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYWluLCBvciBUUkFDS19TRVNTSU9OIGlmIHRyYWNrcyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QsIG9yIGJvdGgKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW1wb3J0YW50IGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBzdHJhdGVneSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFBsYXliYWNrVGhyZWFkIHdoaWNoIGltcGxlbWVudHMgdGhpcyBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKSB7IHJldHVybiAwOyB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBvciByZXN0b3JlIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZWZmZWN0IHBhc3NlZC4gYSBOVUxMCisgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgcG9pbnRlciBtZWFucyBzdXNwZW5kIGFsbCBlZmZlY3RzIGluIHRoZSBzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNvbWUgZWZmZWN0cyBtdXN0IGJlIHN1c3BlbmRlZC9yZXN0b3JlZCB3aGVuIGFuIGVmZmVjdCBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIGRpc2FibGVkCisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKIAogICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogICAgIHByb3RlY3RlZDoKIAorICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeSBkZXNjcmliaW5nIGFuIGVmZmVjdCBiZWluZyBzdXNwZW5kZWQgaW4gbVN1c3BlbmRlZFNlc3Npb25zIGtleWVkIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICBjbGFzcyBTdXNwZW5kZWRTZXNzaW9uRGVzYyA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgU3VzcGVuZGVkU2Vzc2lvbkRlc2MoKSA6IG1SZWZDb3VudCgwKSB7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbVJlZkNvdW50OyAgICAgICAgICAvLyBudW1iZXIgb2YgYWN0aXZlIHN1c3BlbmQgcmVxdWVzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgbVR5cGU7ICAgIC8vIGVmZmVjdCB0eXBlIFVVSUQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgbVN1c3BlbmRlZFNlc3Npb25zIHdoZW4gYW4gZWZmZWN0IHN1c3BlbmRlZCBvciByZXN0b3JlZAorICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVTdXNwZW5kZWRTZXNzaW9uc19sKGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBzb21lIGVmZmVjdHMgbXVzdCBiZSBzdXNwZW5kZWQgd2hlbiBhbiBlZmZlY3QgY2hhaW4gaXMgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBjaGVja1N1c3BlbmRPbkFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgbVN1c3BlbmRlZFNlc3Npb25zIHdoZW4gYW4gZWZmZWN0IGNoYWluIGlzIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgdm9pZCB1cGRhdGVTdXNwZW5kZWRTZXNzaW9uc09uUmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKKwogICAgICAgICBmcmllbmQgY2xhc3MgVHJhY2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBUcmFja0Jhc2U7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKQEAgLTQwMCwxNCArNTI4LDE1IEBACiAgICAgICAgIGZyaWVuZCBjbGFzcyBSZWNvcmRUaHJlYWQ7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBSZWNvcmRUcmFjazsKIAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVHlwZTsKICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Y7CiAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gICAgICAgIG1BdWRpb0ZsaW5nZXI7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1QYXJhbUNvbmQ7CiAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAgICAgICAgIG1OZXdQYXJhbWV0ZXJzOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtUGFyYW1TdGF0dXM7CkBAIC00MTUsMTggKzU0NCwyMyBAQAogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUlkOwogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRXhpdGluZzsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBtRWZmZWN0Q2hhaW5zOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAvLyBvdXRwdXQgZGV2aWNlIGZvciBQbGF5YmFja1RocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCArIG91dHB1dCBkZXZpY2VzIGZvciBSZWNvcmRUaHJlYWQKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAga05hbWVMZW5ndGggPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbU5hbWVba05hbWVMZW5ndGhdOworICAgICAgICAgICAgICAgICAgICBzcDxJUG93ZXJNYW5hZ2VyPiAgICAgICBtUG93ZXJNYW5hZ2VyOworICAgICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgc3A8UE1EZWF0aFJlY2lwaWVudD4gICAgbURlYXRoUmVjaXBpZW50OworICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIHN1c3BlbmRlZCBlZmZlY3RzIHBlciBzZXNzaW9uIGFuZCBwZXIgdHlwZS4gVGhlIGZpcnN0IHZlY3RvciBpcworICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCBieSBzZXNzaW9uIElELCB0aGUgc2Vjb25kIGJ5IHR5cGUgVVVJRCB0aW1lTG93IGZpZWxkCisgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPCBpbnQsIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZFNlc3Npb25EZXNjPiA+ID4gIG1TdXNwZW5kZWRTZXNzaW9uczsKICAgICB9OwogCiAgICAgLy8gLS0tIFBsYXliYWNrVGhyZWFkIC0tLQogICAgIGNsYXNzIFBsYXliYWNrVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UgewogICAgIHB1YmxpYzoKIAotICAgICAgICBlbnVtIHR5cGUgewotICAgICAgICAgICAgTUlYRVIsCi0gICAgICAgICAgICBESVJFQ1QsCi0gICAgICAgICAgICBEVVBMSUNBVElORwotICAgICAgICB9OwotCiAgICAgICAgIGVudW0gbWl4ZXJfc3RhdGUgewogICAgICAgICAgICAgTUlYRVJfSURMRSwKICAgICAgICAgICAgIE1JWEVSX1RSQUNLU19FTkFCTEVELApAQCAtNDQwLDggKzU3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwpAQCAtNDk1LDcgKzYyOSw3IEBACiAgICAgICAgICAgICB2b2lkIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGJvb2wgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG1TdHJlYW1UeXBlID09IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9DTlQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCkBAIC01MjgsOCArNjYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VHJhY2soICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cGxpY2F0aW5nVGhyZWFkICpzb3VyY2VUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk91dHB1dFRyYWNrKCk7CiAKQEAgLTU2Myw2ICs2OTcsOCBAQAogICAgICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKIAorICAgICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQorCiAgICAgICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdDsKIAogICAgICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOwpAQCAtNTgxLDE2ICs3MTcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgeyByZXR1cm4gbU91dHB1dDsgfQorICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90KiBzdHJlYW0oKSB7IHJldHVybiAmbU91dHB1dC0+c3RyZWFtLT5jb21tb247IH0KIAotICAgICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3VzcGVuZCgpIHsgbVN1c3BlbmRlZCsrOyB9CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlc3RvcmUoKSB7IGlmIChtU3VzcGVuZGVkKSBtU3VzcGVuZGVkLS07IH0KICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTdXNwZW5kZWQoKSB7IHJldHVybiAobVN1c3BlbmRlZCAhPSAwKTsgfQpAQCAtNTk5LDQ1ICs3MzUsMTYgQEAKICAgICAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSB7IHJldHVybiBtTWl4QnVmZmVyOyB9OwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gY3JlYXRlRWZmZWN0X2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWVzIGZvciBoYXNBdWRpb1Nlc3Npb24gKGJpdCBmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgewotICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX1NFU1NJT04gPSAweDEsICAgLy8gdGhlIGF1ZGlvIHNlc3Npb24gY29ycmVzcG9uZHMgdG8gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNLX1NFU1NJT04gPSAweDIgICAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRFZmZlY3RDaGFpbihpbnQgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldEVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwotICAgICAgICAgICAgICAgICAgICB2b2lkIGxvY2tFZmZlY3RDaGFpbnNfbChWZWN0b3I8c3AgPEVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpOwotICAgICAgICAgICAgICAgICAgICB2b2lkIHVubG9ja0VmZmVjdENoYWlucyhWZWN0b3I8c3AgPEVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RfbChpbnQgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCk7CisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3RfbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4gdHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCBzZXRNb2RlKHVpbnQzMl90IG1vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGFkZEVmZmVjdF9sKGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICB2b2lkIHJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgc2l6ZV90IHJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGludCBzZXNzaW9uSWQpOwogCiAgICAgICAgIHN0cnVjdCAgc3RyZWFtX3R5cGVfdCB7CiAgICAgICAgICAgICBzdHJlYW1fdHlwZV90KCkKQEAgLTY1MCw3ICs3NTcsNiBAQAogICAgICAgICB9OwogCiAgICAgcHJvdGVjdGVkOgotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlOwogICAgICAgICBpbnQxNl90KiAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhCdWZmZXI7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZDsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwpAQCAtNjc4LDI2ICs3ODQsMjIgQEAKIAogICAgICAgICBzdGF0dXNfdCAgICBhZGRUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwogICAgICAgICB2b2lkICAgICAgICBkZXN0cm95VHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKKyAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKIAogICAgICAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwogCi0gICAgICAgIHVpbnQzMl90ICAgIGRldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KLQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgc3RhdHVzX3QgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgICAgICBzdGF0dXNfdCAgICBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxUcmFjaz4gPiAgICAgICBtVHJhY2tzOwogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSB1c2VzIDEgYWRkaXRpb25uYWwgc3RyZWFtIHR5cGUgaW50ZXJuYWxseSBmb3IgdGhlIE91dHB1dFRyYWNrIHVzZWQgYnkgRHVwbGljYXRpbmdUaHJlYWQKLSAgICAgICAgc3RyZWFtX3R5cGVfdCAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZXNbQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMgKyAxXTsKKyAgICAgICAgc3RyZWFtX3R5cGVfdCAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVCArIDFdOwogICAgICAgICBBdWRpb1N0cmVhbU91dCogICAgICAgICAgICAgICAgIG1PdXRwdXQ7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZTsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtV3JpdGVzOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzOwogICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbldyaXRlOwotICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+ICAgICAgIG1FZmZlY3RDaGFpbnM7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZTsKICAgICB9OwogCiAgICAgY2xhc3MgTWl4ZXJUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtNzgxLDExICs4ODMsMTMgQEAKICAgICAgICAgICAgICAgZmxvYXQgc3RyZWFtVm9sdW1lSW50ZXJuYWwoaW50IHN0cmVhbSkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9CiAgICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgaW9IYW5kbGUsIHZvaWQgKnBhcmFtMik7CiAKLSAgICAgICAgICAgICAgaW50ICBuZXh0VW5pcXVlSWRfbCgpOwotICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqc3JjVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlUmVnaXN0ZXIpOworICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKTsKKyAgICAgICAgICAgICAgdWludDMyX3QgcHJpbWFyeU91dHB1dERldmljZV9sKCk7CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9CdWZmZXI7CiAKQEAgLTgyNiw4ICs5MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRUcmFjayhjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCk7CkBAIC04NDAsNiArOTQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc2V0T3ZlcmZsb3coKSB7IGJvb2wgdG1wID0gbU92ZXJmbG93OyBtT3ZlcmZsb3cgPSB0cnVlOyByZXR1cm4gdG1wOyB9CiAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsKICAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBSZWNvcmRUaHJlYWQ7CkBAIC04NTcsMTcgKzk2MiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgICAgICAgICB+UmVjb3JkVGhyZWFkKCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpIHsgcmV0dXJuIE5PX0VSUk9SOyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gKG1JbnB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQorICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gIGNyZWF0ZVJlY29yZFRyYWNrX2woCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0KFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBnZXRJbnB1dCgpIHsgcmV0dXJuIG1JbnB1dDsgfQorICAgICAgICAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3QqIHN0cmVhbSgpIHsgcmV0dXJuICZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uOyB9CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKQEAgLTg3Nyw5ICs5OTUsMTUgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7CiAgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKIAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IHJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIFJlY29yZFRyYWNrKiB0cmFjaygpOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICBSZWNvcmRUaHJlYWQoKTsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICAgICAgICAgICAgICAgICAgICAgICAqbUlucHV0OworICAgICAgICAgICAgICAgIFJlY29yZFRyYWNrKiAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFjazsKICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2s7CiAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQ7CiAgICAgICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7CkBAIC05MzYsNyArMTA2MCw4IEBACiAgICAgICAgICAgICBTVEFSVElORywKICAgICAgICAgICAgIEFDVElWRSwKICAgICAgICAgICAgIFNUT1BQSU5HLAotICAgICAgICAgICAgU1RPUFBFRAorICAgICAgICAgICAgU1RPUFBFRCwKKyAgICAgICAgICAgIERFU1RST1lFRAogICAgICAgICB9OwogCiAgICAgICAgIGludCAgICAgICAgIGlkKCkgeyByZXR1cm4gbUlkOyB9CkBAIC05NzAsNiArMTA5NSw3IEBACiAgICAgICAgIGludDE2X3QgICAgICpvdXRCdWZmZXIoKSB7IHJldHVybiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2OyB9CiAgICAgICAgIHZvaWQgICAgICAgIHNldENoYWluKGNvbnN0IHdwPEVmZmVjdENoYWluPiYgY2hhaW4pIHsgbUNoYWluID0gY2hhaW47IH0KICAgICAgICAgdm9pZCAgICAgICAgc2V0VGhyZWFkKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIHsgbVRocmVhZCA9IHRocmVhZDsgfQorICAgICAgICB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQogCiAgICAgICAgIHN0YXR1c190IGFkZEhhbmRsZShzcDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpOwogICAgICAgICB2b2lkIGRpc2Nvbm5lY3QoY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKTsKQEAgLTk4MSw2ICsxMTA3LDExIEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0RGV2aWNlKHVpbnQzMl90IGRldmljZSk7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcik7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0TW9kZSh1aW50MzJfdCBtb2RlKTsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICBzdG9wKCk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgc2V0U3VzcGVuZGVkKGJvb2wgc3VzcGVuZGVkKTsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICBzdXNwZW5kZWQoKTsKKworICAgICAgICBzcDxFZmZlY3RIYW5kbGU+IGNvbnRyb2xIYW5kbGUoKTsKIAogICAgICAgICBzdGF0dXNfdCAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtOTk1LDE0ICsxMTI2LDYgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhcnRfbCgpOwogICAgICAgICBzdGF0dXNfdCBzdG9wX2woKTsKIAotICAgICAgICAvLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIG9yIGF1ZGlvX2RldmljZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzRGV2aWNlQ29udlRhYmxlW107Ci0gICAgICAgIHN0YXRpYyB1aW50MzJfdCBkZXZpY2VBdWRpb1N5c3RlbVRvRWZmZWN0QXBpKHVpbnQzMl90IGRldmljZSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoaXMgdGFibGUgd2hlbiBBdWRpb1N5c3RlbTo6YXVkaW9fbW9kZSBvciBhdWRpb19tb2RlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNNb2RlQ29udlRhYmxlW107Ci0gICAgICAgIHN0YXRpYyBpbnQgbW9kZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgbW9kZSk7Ci0KICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgICAgICAvLyBtdXRleCBmb3IgcHJvY2VzcywgY29tbWFuZHMgYW5kIGhhbmRsZXMgbGlzdCBwcm90ZWN0aW9uCiAgICAgICAgIHdwPFRocmVhZEJhc2U+ICAgICAgbVRocmVhZDsgICAgLy8gcGFyZW50IHRocmVhZAogICAgICAgICB3cDxFZmZlY3RDaGFpbj4gICAgIG1DaGFpbjsgICAgIC8vIHBhcmVudCBlZmZlY3QgY2hhaW4KQEAgLTEwMTAsMTMgKzExMzMsMTQgQEAKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOyAvLyBhdWRpbyBzZXNzaW9uIElECiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2NyaXB0b3I7Ly8gZWZmZWN0IGRlc2NyaXB0b3IgcmVjZWl2ZWQgZnJvbSBlZmZlY3QgZW5naW5lCiAgICAgICAgIGVmZmVjdF9jb25maWdfdCAgICAgbUNvbmZpZzsgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uCi0gICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAgbUVmZmVjdEludGVyZmFjZTsgLy8gRWZmZWN0IG1vZHVsZSBDIEFQSQorICAgICAgICBlZmZlY3RfaGFuZGxlX3QgIG1FZmZlY3RJbnRlcmZhY2U7IC8vIEVmZmVjdCBtb2R1bGUgQyBBUEkKICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBzdGF0dXMKICAgICAgICAgdWludDMyX3QgbVN0YXRlOyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2YXRpb24gc3RhdGUgKGVmZmVjdF9zdGF0ZSkKICAgICAgICAgVmVjdG9yPCB3cDxFZmZlY3RIYW5kbGU+ID4gbUhhbmRsZXM7ICAgIC8vIGxpc3Qgb2YgY2xpZW50IGhhbmRsZXMKICAgICAgICAgdWludDMyX3QgbU1heERpc2FibGVXYWl0Q250OyAgICAvLyBtYXhpbXVtIGdyYWNlIHBlcmlvZCBiZWZvcmUgZm9yY2luZyBhbiBlZmZlY3Qgb2ZmIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZGluZyBkaXNhYmxlIGNvbW1hbmQuCiAgICAgICAgIHVpbnQzMl90IG1EaXNhYmxlV2FpdENudDsgICAgICAgLy8gY3VycmVudCBwcm9jZXNzKCkgY2FsbHMgY291bnQgZHVyaW5nIGRpc2FibGUgcGVyaW9kLgorICAgICAgICBib29sICAgICBtU3VzcGVuZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBzdXNwZW5kZWQ6IHRlbXBvcmFyaWx5IGRpc2FibGVkIGJ5IGZyYW1ld29yawogICAgIH07CiAKICAgICAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKQEAgLTEwNDksMTMgKzExNzMsMTcgQEAKIAogCiAgICAgICAgIC8vIEdpdmUgb3IgdGFrZSBjb250cm9sIG9mIGVmZmVjdCBtb2R1bGUKLSAgICAgICAgdm9pZCBzZXRDb250cm9sKGJvb2wgaGFzQ29udHJvbCwgYm9vbCBzaWduYWwpOworICAgICAgICAvLyAtIGhhc0NvbnRyb2w6IHRydWUgaWYgY29udHJvbCBpcyBnaXZlbiwgZmFsc2UgaWYgcmVtb3ZlZAorICAgICAgICAvLyAtIHNpZ25hbDogdHJ1ZSBjbGllbnQgYXBwIHNob3VsZCBiZSBzaWduYWxlZCBvZiBjaGFuZ2UsIGZhbHNlIG90aGVyd2lzZQorICAgICAgICAvLyAtIGVuYWJsZWQ6IHN0YXRlIG9mIHRoZSBlZmZlY3Qgd2hlbiBjb250cm9sIGlzIHBhc3NlZAorICAgICAgICB2b2lkIHNldENvbnRyb2woYm9vbCBoYXNDb250cm9sLCBib29sIHNpZ25hbCwgYm9vbCBlbmFibGVkKTsKICAgICAgICAgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CiAgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworICAgICAgICBib29sIGVuYWJsZWQoKSB7IHJldHVybiBtRW5hYmxlZDsgfQogCiAgICAgICAgIC8vIEdldHRlcnMKICAgICAgICAgaW50IGlkKCkgeyByZXR1cm4gbUVmZmVjdC0+aWQoKTsgfQpAQCAtMTA3OCw2ICsxMjA2LDggQEAKICAgICAgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOyAgICAgICAgLy8gcG9pbnRlciB0byBwYXJhbWV0ZXIgYXJlYSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgICAgIGludCBtUHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBhcHBsaWNhdGlvbiBwcmlvcml0eSB0byBjb250cm9sIHRoZSBlZmZlY3QKICAgICAgICAgYm9vbCBtSGFzQ29udHJvbDsgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGlzIGhhbmRsZSBpcyBjb250cm9sbGluZyB0aGUgZWZmZWN0CisgICAgICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBlbmFibGUgc3RhdGU6IG5lZWRlZCB3aGVuIHRoZSBlZmZlY3QgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgYWZ0ZXIgYmVpbmcgc3VzcGVuZGVkCiAgICAgfTsKIAogICAgIC8vIHRoZSBFZmZlY3RDaGFpbiBjbGFzcyByZXByZXNlbnRzIGEgZ3JvdXAgb2YgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIG9uZSBhdWRpbyBzZXNzaW9uLgpAQCAtMTA5Miw2ICsxMjIyLDEwIEBACiAgICAgICAgIEVmZmVjdENoYWluKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLCBpbnQgc2Vzc2lvbklkKTsKICAgICAgICAgfkVmZmVjdENoYWluKCk7CiAKKyAgICAgICAgLy8gc3BlY2lhbCBrZXkgdXNlZCBmb3IgYW4gZW50cnkgaW4gbVN1c3BlbmRlZEVmZmVjdHMga2V5ZWQgdmVjdG9yCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gYSBzdXNwZW5kIGFsbCByZXF1ZXN0LgorICAgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICBrS2V5Rm9yU3VzcGVuZEFsbCA9IDA7CisKICAgICAgICAgdm9pZCBwcm9jZXNzX2woKTsKIAogICAgICAgICB2b2lkIGxvY2soKSB7CkBAIC0xMTA0LDEyICsxMjM4LDEyIEBACiAgICAgICAgIHN0YXR1c190IGFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGhhbmRsZSk7CiAgICAgICAgIHNpemVfdCByZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBoYW5kbGUpOwogCi0gICAgICAgIGludCBzZXNzaW9uSWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKLSAgICAgICAgfQorICAgICAgICBpbnQgc2Vzc2lvbklkKCkgeyByZXR1cm4gbVNlc3Npb25JZDsgfQorICAgICAgICB2b2lkIHNldFNlc3Npb25JZChpbnQgc2Vzc2lvbklkKSB7IG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7IH0KIAogICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbUlkX2woaW50IGlkKTsKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tVHlwZV9sKGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUpOwogICAgICAgICBib29sIHNldFZvbHVtZV9sKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQpOwogICAgICAgICB2b2lkIHNldERldmljZV9sKHVpbnQzMl90IGRldmljZSk7CiAgICAgICAgIHZvaWQgc2V0TW9kZV9sKHVpbnQzMl90IG1vZGUpOwpAQCAtMTEyOCwxNCArMTI2MiwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXI7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIHN0YXJ0VHJhY2soKSB7bUFjdGl2ZVRyYWNrQ250Kys7fQotICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHttQWN0aXZlVHJhY2tDbnQtLTt9Ci0gICAgICAgIGludCBhY3RpdmVUcmFja3MoKSB7IHJldHVybiBtQWN0aXZlVHJhY2tDbnQ7fQorICAgICAgICB2b2lkIGluY1RyYWNrQ250KCkgeyBhbmRyb2lkX2F0b21pY19pbmMoJm1UcmFja0NudCk7IH0KKyAgICAgICAgdm9pZCBkZWNUcmFja0NudCgpIHsgYW5kcm9pZF9hdG9taWNfZGVjKCZtVHJhY2tDbnQpOyB9CisgICAgICAgIGludDMyX3QgdHJhY2tDbnQoKSB7IHJldHVybiBtVHJhY2tDbnQ7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlVHJhY2tDbnQoKSB7IGFuZHJvaWRfYXRvbWljX2luYygmbUFjdGl2ZVRyYWNrQ250KTsgfQorICAgICAgICB2b2lkIGRlY0FjdGl2ZVRyYWNrQ250KCkgeyBhbmRyb2lkX2F0b21pY19kZWMoJm1BY3RpdmVUcmFja0NudCk7IH0KKyAgICAgICAgaW50MzJfdCBhY3RpdmVUcmFja0NudCgpIHsgcmV0dXJuIG1BY3RpdmVUcmFja0NudDt9CiAKICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3koKSB7IHJldHVybiBtU3RyYXRlZ3k7IH0KICAgICAgICAgdm9pZCBzZXRTdHJhdGVneSh1aW50MzJfdCBzdHJhdGVneSkKICAgICAgICAgICAgICAgICAgeyBtU3RyYXRlZ3kgPSBzdHJhdGVneTsgfQogCisgICAgICAgIC8vIHN1c3BlbmQgZWZmZWN0IG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQpOworICAgICAgICAvLyBzdXNwZW5kIGFsbCBlbGlnaWJsZSBlZmZlY3RzCisgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkQWxsX2woYm9vbCBzdXNwZW5kKTsKKyAgICAgICAgLy8gY2hlY2sgaWYgZWZmZWN0cyBzaG91bGQgYmUgc3VzcGVuZCBvciByZXN0b3JlZCB3aGVuIGEgZ2l2ZW4gZWZmZWN0IGlzIGVuYWJsZSBvciBkaXNhYmxlZAorICAgICAgICB2aXJ0dWFsIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpOworCiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHByb3RlY3RlZDoKQEAgLTExNDMsMTMgKzEyOTAsMjkgQEAKICAgICAgICAgRWZmZWN0Q2hhaW4oY29uc3QgRWZmZWN0Q2hhaW4mKTsKICAgICAgICAgRWZmZWN0Q2hhaW4mIG9wZXJhdG9yID0oY29uc3QgRWZmZWN0Q2hhaW4mKTsKIAorICAgICAgICBjbGFzcyBTdXNwZW5kZWRFZmZlY3REZXNjIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTdXNwZW5kZWRFZmZlY3REZXNjKCkgOiBtUmVmQ291bnQoMCkge30KKworICAgICAgICAgICAgaW50IG1SZWZDb3VudDsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgbVR5cGU7CisgICAgICAgICAgICB3cDxFZmZlY3RNb2R1bGU+IG1FZmZlY3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gZ2V0IGEgbGlzdCBvZiBlZmZlY3QgbW9kdWxlcyB0byBzdXNwZW5kIHdoZW4gYW4gZWZmZWN0IG9mIHRoZSB0eXBlCisgICAgICAgIC8vIHBhc3NlZCBpcyBlbmFibGVkLgorICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBnZXRTdXNwZW5kRWxpZ2libGVFZmZlY3RzKCk7CisgICAgICAgIC8vIGdldCBhbiBlZmZlY3QgbW9kdWxlIGlmIGl0IGlzIGN1cnJlbnRseSBlbmFibGUKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RJZkVuYWJsZWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSk7CisKICAgICAgICAgd3A8VGhyZWFkQmFzZT4gbVRocmVhZDsgICAgIC8vIHBhcmVudCBtaXhlciB0aHJlYWQKICAgICAgICAgTXV0ZXggbUxvY2s7ICAgICAgICAgICAgICAgIC8vIG11dGV4IHByb3RlY3RpbmcgZWZmZWN0IGxpc3QKICAgICAgICAgVmVjdG9yPHNwPEVmZmVjdE1vZHVsZT4gPiBtRWZmZWN0czsgLy8gbGlzdCBvZiBlZmZlY3QgbW9kdWxlcwogICAgICAgICBpbnQgbVNlc3Npb25JZDsgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAogICAgICAgICBpbnQxNl90ICptSW5CdWZmZXI7ICAgICAgICAgLy8gY2hhaW4gaW5wdXQgYnVmZmVyCiAgICAgICAgIGludDE2X3QgKm1PdXRCdWZmZXI7ICAgICAgICAvLyBjaGFpbiBvdXRwdXQgYnVmZmVyCi0gICAgICAgIGludCBtQWN0aXZlVHJhY2tDbnQ7ICAgICAgICAvLyBudW1iZXIgb2YgYWN0aXZlIHRyYWNrcyBjb25uZWN0ZWQKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtQWN0aXZlVHJhY2tDbnQ7ICAvLyBudW1iZXIgb2YgYWN0aXZlIHRyYWNrcyBjb25uZWN0ZWQKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtVHJhY2tDbnQ7ICAgICAgICAvLyBudW1iZXIgb2YgdHJhY2tzIGNvbm5lY3RlZAogICAgICAgICBib29sIG1Pd25JbkJ1ZmZlcjsgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGUgY2hhaW4gb3ducyBpdHMgaW5wdXQgYnVmZmVyCiAgICAgICAgIGludCBtVm9sdW1lQ3RybElkeDsgICAgICAgICAvLyBpbmRleCBvZiBpbnNlcnQgZWZmZWN0IGhhdmluZyBjb250cm9sIG92ZXIgdm9sdW1lCiAgICAgICAgIHVpbnQzMl90IG1MZWZ0Vm9sdW1lOyAgICAgICAvLyBwcmV2aW91cyB2b2x1bWUgb24gbGVmdCBjaGFubmVsCkBAIC0xMTU3LDIzICsxMzIwLDQzIEBACiAgICAgICAgIHVpbnQzMl90IG1OZXdMZWZ0Vm9sdW1lOyAgICAgICAvLyBuZXcgdm9sdW1lIG9uIGxlZnQgY2hhbm5lbAogICAgICAgICB1aW50MzJfdCBtTmV3UmlnaHRWb2x1bWU7ICAgICAgLy8gbmV3IHZvbHVtZSBvbiByaWdodCBjaGFubmVsCiAgICAgICAgIHVpbnQzMl90IG1TdHJhdGVneTsgLy8gc3RyYXRlZ3kgZm9yIHRoaXMgZWZmZWN0IGNoYWluCisgICAgICAgIC8vIG1TdXNwZW5kZWRFZmZlY3RzIGxpc3RzIGFsbCBlZmZlY3QgY3VycmVudGx5IHN1c3BlbmRlZCBpbiB0aGUgY2hhaW4KKyAgICAgICAgLy8gdXNlIGVmZmVjdCB0eXBlIFVVSUQgdGltZWxvdyBmaWVsZCBhcyBrZXkuIFRoZXJlIGlzIG5vIHJlYWwgcmlzayBvZiBpZGVudGljYWwKKyAgICAgICAgLy8gdGltZUxvdyBmaWVsZHMgYW1vbmcgZWZmZWN0IHR5cGUgVVVJRHMuCisgICAgICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+ID4gbVN1c3BlbmRlZEVmZmVjdHM7CisgICAgfTsKKworICAgIHN0cnVjdCBBdWRpb1N0cmVhbU91dCB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICAgKmh3RGV2OworICAgICAgICBhdWRpb19zdHJlYW1fb3V0X3QgICpzdHJlYW07CisKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQoYXVkaW9faHdfZGV2aWNlX3QgKmRldiwgYXVkaW9fc3RyZWFtX291dF90ICpvdXQpIDoKKyAgICAgICAgICAgIGh3RGV2KGRldiksIHN0cmVhbShvdXQpIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgICAqaHdEZXY7CisgICAgICAgIGF1ZGlvX3N0cmVhbV9pbl90ICAgKnN0cmVhbTsKKworICAgICAgICBBdWRpb1N0cmVhbUluKGF1ZGlvX2h3X2RldmljZV90ICpkZXYsIGF1ZGlvX3N0cmVhbV9pbl90ICppbikgOgorICAgICAgICAgICAgaHdEZXYoZGV2KSwgc3RyZWFtKGluKSB7fQogICAgIH07CiAKICAgICBmcmllbmQgY2xhc3MgUmVjb3JkVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKIAotCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCB3cDxDbGllbnQ+ID4gICAgIG1DbGllbnRzOwogCiAgICAgICAgICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlTG9jazsKLSAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiAgICAgICAgICAgICBtQXVkaW9IYXJkd2FyZTsKKyAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCogICAgICAgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2OworICAgICAgICAgICAgICAgIFZlY3RvcjxhdWRpb19od19kZXZpY2VfdCo+ICAgICAgICAgIG1BdWRpb0h3RGV2czsKICAgICBtdXRhYmxlICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXM7CiAKIAogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50LCBzcDxQbGF5YmFja1RocmVhZD4gPiAgbVBsYXliYWNrVGhyZWFkczsKLSAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZDo6c3RyZWFtX3R5cGVfdCAgICAgICBtU3RyZWFtVHlwZXNbQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVNdOworICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkOjpzdHJlYW1fdHlwZV90ICAgICAgIG1TdHJlYW1UeXBlc1tBVURJT19TVFJFQU1fQ05UXTsKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyVm9sdW1lOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOwogCkBAIC0xMTgxLDEwICsxMzY0LDEyIEBACiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU5leHRVbmlxdWVJZDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtTW9kZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnROcmVjOwogCiB9OwogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNjMDMxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9IYXJkd2FyZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlICJBdWRpb0hhcmR3YXJlR2VuZXJpYy5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGtBdWRpb0RldmljZU5hbWUgPSAiL2Rldi9lYWMiOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvSGFyZHdhcmVHZW5lcmljOjpBdWRpb0hhcmR3YXJlR2VuZXJpYygpCi0gICAgOiBtT3V0cHV0KDApLCBtSW5wdXQoMCksICBtRmQoLTEpLCBtTWljTXV0ZShmYWxzZSkKLXsKLSAgICBtRmQgPSA6Om9wZW4oa0F1ZGlvRGV2aWNlTmFtZSwgT19SRFdSKTsKLX0KLQotQXVkaW9IYXJkd2FyZUdlbmVyaWM6On5BdWRpb0hhcmR3YXJlR2VuZXJpYygpCi17Ci0gICAgaWYgKG1GZCA+PSAwKSA6OmNsb3NlKG1GZCk7Ci0gICAgY2xvc2VPdXRwdXRTdHJlYW0oKEF1ZGlvU3RyZWFtT3V0ICopbU91dHB1dCk7Ci0gICAgY2xvc2VJbnB1dFN0cmVhbSgoQXVkaW9TdHJlYW1JbiAqKW1JbnB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjppbml0Q2hlY2soKQotewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBpZiAoOjphY2Nlc3Moa0F1ZGlvRGV2aWNlTmFtZSwgT19SRFdSKSA9PSBOT19FUlJPUikKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLUF1ZGlvU3RyZWFtT3V0KiBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCi17Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotCi0gICAgLy8gb25seSBvbmUgb3V0cHV0IHN0cmVhbSBhbGxvd2VkCi0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgKnN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBuZXcgb3V0cHV0IHN0cmVhbQotICAgIEF1ZGlvU3RyZWFtT3V0R2VuZXJpYyogb3V0ID0gbmV3IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYygpOwotICAgIHN0YXR1c190IGxTdGF0dXMgPSBvdXQtPnNldCh0aGlzLCBtRmQsIGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1PdXRwdXQgPSBvdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVsZXRlIG91dDsKLSAgICB9Ci0gICAgcmV0dXJuIG1PdXRwdXQ7Ci19Ci0KLXZvaWQgQXVkaW9IYXJkd2FyZUdlbmVyaWM6OmNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpIHsKLSAgICBpZiAobU91dHB1dCAmJiBvdXQgPT0gbU91dHB1dCkgewotICAgICAgICBkZWxldGUgbU91dHB1dDsKLSAgICAgICAgbU91dHB1dCA9IDA7Ci0gICAgfQotfQotCi1BdWRpb1N0cmVhbUluKiBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICB1aW50MzJfdCBkZXZpY2VzLCBpbnQgKmZvcm1hdCwgdWludDMyX3QgKmNoYW5uZWxzLCB1aW50MzJfdCAqc2FtcGxlUmF0ZSwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpCi17Ci0gICAgLy8gY2hlY2sgZm9yIHZhbGlkIGlucHV0IHNvdXJjZQotICAgIGlmICghQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZXMpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLQotICAgIC8vIG9ubHkgb25lIGlucHV0IHN0cmVhbSBhbGxvd2VkCi0gICAgaWYgKG1JbnB1dCkgewotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAqc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIG5ldyBvdXRwdXQgc3RyZWFtCi0gICAgQXVkaW9TdHJlYW1JbkdlbmVyaWMqIGluID0gbmV3IEF1ZGlvU3RyZWFtSW5HZW5lcmljKCk7Ci0gICAgc3RhdHVzX3QgbFN0YXR1cyA9IGluLT5zZXQodGhpcywgbUZkLCBkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBhY291c3RpY3MpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1JbnB1dCA9IGluOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZSBpbjsKLSAgICB9Ci0gICAgcmV0dXJuIG1JbnB1dDsKLX0KLQotdm9pZCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6Y2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluKiBpbikgewotICAgIGlmIChtSW5wdXQgJiYgaW4gPT0gbUlucHV0KSB7Ci0gICAgICAgIGRlbGV0ZSBtSW5wdXQ7Ci0gICAgICAgIG1JbnB1dCA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdikKLXsKLSAgICAvLyBJbXBsZW1lbnQ6IHNldCB2b2ljZSB2b2x1bWUKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdikKLXsKLSAgICAvLyBJbXBsZW1lbnQ6IHNldCBtYXN0ZXIgdm9sdW1lCi0gICAgLy8gcmV0dXJuIGVycm9yIC0gc29mdHdhcmUgbWl4ZXIgd2lsbCBoYW5kbGUgaXQKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCi17Ci0gICAgbU1pY011dGUgPSBzdGF0ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpnZXRNaWNNdXRlKGJvb2wqIHN0YXRlKQotewotICAgICpzdGF0ZSA9IG1NaWNNdXRlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUdlbmVyaWM6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmQoIkF1ZGlvSGFyZHdhcmVHZW5lcmljOjpkdW1wSW50ZXJuYWxzXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdG1GZDogJWQgbU1pY011dGU6ICVzXG4iLCAgbUZkLCBtTWljTXV0ZT8gInRydWUiOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKLSAgICBpZiAobUlucHV0KSB7Ci0gICAgICAgIG1JbnB1dC0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIG1PdXRwdXQtPmR1bXAoZmQsIGFyZ3MpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXRHZW5lcmljOjpzZXQoCi0gICAgICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICpodywKLSAgICAgICAgaW50IGZkLAotICAgICAgICB1aW50MzJfdCBkZXZpY2VzLAotICAgICAgICBpbnQgKnBGb3JtYXQsCi0gICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCi0gICAgICAgIHVpbnQzMl90ICpwUmF0ZSkKLXsKLSAgICBpbnQgbEZvcm1hdCA9IHBGb3JtYXQgPyAqcEZvcm1hdCA6IDA7Ci0gICAgdWludDMyX3QgbENoYW5uZWxzID0gcENoYW5uZWxzID8gKnBDaGFubmVscyA6IDA7Ci0gICAgdWludDMyX3QgbFJhdGUgPSBwUmF0ZSA/ICpwUmF0ZSA6IDA7Ci0KLSAgICAvLyBmaXggdXAgZGVmYXVsdHMKLSAgICBpZiAobEZvcm1hdCA9PSAwKSBsRm9ybWF0ID0gZm9ybWF0KCk7Ci0gICAgaWYgKGxDaGFubmVscyA9PSAwKSBsQ2hhbm5lbHMgPSBjaGFubmVscygpOwotICAgIGlmIChsUmF0ZSA9PSAwKSBsUmF0ZSA9IHNhbXBsZVJhdGUoKTsKLQotICAgIC8vIGNoZWNrIHZhbHVlcwotICAgIGlmICgobEZvcm1hdCAhPSBmb3JtYXQoKSkgfHwKLSAgICAgICAgICAgIChsQ2hhbm5lbHMgIT0gY2hhbm5lbHMoKSkgfHwKLSAgICAgICAgICAgIChsUmF0ZSAhPSBzYW1wbGVSYXRlKCkpKSB7Ci0gICAgICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGZvcm1hdCgpOwotICAgICAgICBpZiAocENoYW5uZWxzKSAqcENoYW5uZWxzID0gY2hhbm5lbHMoKTsKLSAgICAgICAgaWYgKHBSYXRlKSAqcFJhdGUgPSBzYW1wbGVSYXRlKCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKHBGb3JtYXQpICpwRm9ybWF0ID0gbEZvcm1hdDsKLSAgICBpZiAocENoYW5uZWxzKSAqcENoYW5uZWxzID0gbENoYW5uZWxzOwotICAgIGlmIChwUmF0ZSkgKnBSYXRlID0gbFJhdGU7Ci0KLSAgICBtQXVkaW9IYXJkd2FyZSA9IGh3OwotICAgIG1GZCA9IGZkOwotICAgIG1EZXZpY2UgPSBkZXZpY2VzOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotQXVkaW9TdHJlYW1PdXRHZW5lcmljOjp+QXVkaW9TdHJlYW1PdXRHZW5lcmljKCkKLXsKLX0KLQotc3NpemVfdCBBdWRpb1N0cmVhbU91dEdlbmVyaWM6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIHNzaXplX3QoOjp3cml0ZShtRmQsIGJ1ZmZlciwgYnl0ZXMpKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXRHZW5lcmljOjpzdGFuZGJ5KCkKLXsKLSAgICAvLyBJbXBsZW1lbnQ6IGF1ZGlvIGhhcmR3YXJlIHRvIHN0YW5kYnkgbW9kZQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXRHZW5lcmljOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1N0cmVhbU91dEdlbmVyaWM6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdHNhbXBsZSByYXRlOiAlZFxuIiwgc2FtcGxlUmF0ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRidWZmZXIgc2l6ZTogJWRcbiIsIGJ1ZmZlclNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0Y2hhbm5lbHM6ICVkXG4iLCBjaGFubmVscygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRmb3JtYXQ6ICVkXG4iLCBmb3JtYXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0ZGV2aWNlOiAlZFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bUF1ZGlvSGFyZHdhcmU6ICVwXG4iLCBtQXVkaW9IYXJkd2FyZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bUZkOiAlZFxuIiwgbUZkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7Ci0gICAgU3RyaW5nOCBrZXkgPSBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpbnQgZGV2aWNlOwotICAgIExPR1YoInNldFBhcmFtZXRlcnMoKSAlcyIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotCi0gICAgaWYgKHBhcmFtLmdldEludChrZXksIGRldmljZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtLnNpemUoKSkgewotICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1PdXRHZW5lcmljOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyk7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhcmFtLmFkZEludChrZXksIChpbnQpbURldmljZSk7Ci0gICAgfQotCi0gICAgTE9HVigiZ2V0UGFyYW1ldGVycygpICVzIiwgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0R2VuZXJpYzo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykKLXsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gcmVjb3JkIGZ1bmN0aW9ucwotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkdlbmVyaWM6OnNldCgKLSAgICAgICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMgKmh3LAotICAgICAgICBpbnQgZmQsCi0gICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgIGludCAqcEZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgdWludDMyX3QgKnBSYXRlLAotICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICBpZiAocEZvcm1hdCA9PSAwIHx8IHBDaGFubmVscyA9PSAwIHx8IHBSYXRlID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgTE9HVigiQXVkaW9TdHJlYW1JbkdlbmVyaWM6OnNldCglcCwgJWQsICVkLCAlZCwgJXUpIiwgaHcsIGZkLCAqcEZvcm1hdCwgKnBDaGFubmVscywgKnBSYXRlKTsKLSAgICAvLyBjaGVjayB2YWx1ZXMKLSAgICBpZiAoKCpwRm9ybWF0ICE9IGZvcm1hdCgpKSB8fAotICAgICAgICAoKnBDaGFubmVscyAhPSBjaGFubmVscygpKSB8fAotICAgICAgICAoKnBSYXRlICE9IHNhbXBsZVJhdGUoKSkpIHsKLSAgICAgICAgTE9HRSgiRXJyb3Igb3BlbmluZyBpbnB1dCBjaGFubmVsIik7Ci0gICAgICAgICpwRm9ybWF0ID0gZm9ybWF0KCk7Ci0gICAgICAgICpwQ2hhbm5lbHMgPSBjaGFubmVscygpOwotICAgICAgICAqcFJhdGUgPSBzYW1wbGVSYXRlKCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgbUF1ZGlvSGFyZHdhcmUgPSBodzsKLSAgICBtRmQgPSBmZDsKLSAgICBtRGV2aWNlID0gZGV2aWNlczsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUF1ZGlvU3RyZWFtSW5HZW5lcmljOjp+QXVkaW9TdHJlYW1JbkdlbmVyaWMoKQotewotfQotCi1zc2l6ZV90IEF1ZGlvU3RyZWFtSW5HZW5lcmljOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcykKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byByZWFkIGZyb20gdW5vcGVuZWQgZGV2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gOjpyZWFkKG1GZCwgYnVmZmVyLCBieXRlcyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5HZW5lcmljOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1N0cmVhbUluR2VuZXJpYzo6ZHVtcFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0c2FtcGxlIHJhdGU6ICVkXG4iLCBzYW1wbGVSYXRlKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGJ1ZmZlciBzaXplOiAlZFxuIiwgYnVmZmVyU2l6ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRjaGFubmVsczogJWRcbiIsIGNoYW5uZWxzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGZvcm1hdDogJWRcbiIsIGZvcm1hdCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRkZXZpY2U6ICVkXG4iLCBtRGV2aWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtQXVkaW9IYXJkd2FyZTogJXBcbiIsIG1BdWRpb0hhcmR3YXJlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtRmQ6ICVkXG4iLCBtRmQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbkdlbmVyaWM6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaW50IGRldmljZTsKLSAgICBMT0dWKCJzZXRQYXJhbWV0ZXJzKCkgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLQotICAgIGlmIChwYXJhbS5nZXRJbnQoa2V5LCBkZXZpY2UpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIGlmIChwYXJhbS5zaXplKCkpIHsKLSAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1TdHJpbmc4IEF1ZGlvU3RyZWFtSW5HZW5lcmljOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCi17Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlzKTsKLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyk7Ci0KLSAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhcmFtLmFkZEludChrZXksIChpbnQpbURldmljZSk7Ci0gICAgfQotCi0gICAgTE9HVigiZ2V0UGFyYW1ldGVycygpICVzIiwgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGU3OGQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPX0hBUkRXQVJFX0dFTkVSSUNfSAotI2RlZmluZSBBTkRST0lEX0FVRElPX0hBUkRXQVJFX0dFTkVSSUNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEF1ZGlvSGFyZHdhcmVHZW5lcmljOwotCi1jbGFzcyBBdWRpb1N0cmVhbU91dEdlbmVyaWMgOiBwdWJsaWMgQXVkaW9TdHJlYW1PdXQgewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXRHZW5lcmljKCkgOiBtQXVkaW9IYXJkd2FyZSgwKSwgbUZkKC0xKSB7fQotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvU3RyZWFtT3V0R2VuZXJpYygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXQoCi0gICAgICAgICAgICBBdWRpb0hhcmR3YXJlR2VuZXJpYyAqaHcsCi0gICAgICAgICAgICBpbnQgbUZkLAotICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGludCAqcEZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCi0gICAgICAgICAgICB1aW50MzJfdCAqcFJhdGUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gNDQxMDA7IH0KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiA0MDk2OyB9Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU87IH0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOyB9Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gMjA7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KLSAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YW5kYnkoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7Ci0gICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLXByaXZhdGU6Ci0gICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMgKm1BdWRpb0hhcmR3YXJlOwotICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgaW50ICAgICBtRmQ7Ci0gICAgdWludDMyX3QgbURldmljZTsKLX07Ci0KLWNsYXNzIEF1ZGlvU3RyZWFtSW5HZW5lcmljIDogcHVibGljIEF1ZGlvU3RyZWFtSW4gewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbkdlbmVyaWMoKSA6IG1BdWRpb0hhcmR3YXJlKDApLCBtRmQoLTEpIHt9Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9TdHJlYW1JbkdlbmVyaWMoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0KAotICAgICAgICAgICAgQXVkaW9IYXJkd2FyZUdlbmVyaWMgKmh3LAotICAgICAgICAgICAgaW50IG1GZCwKLSAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICBpbnQgKnBGb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgdWludDMyX3QgKnBSYXRlLAotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gODAwMDsgfQotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDMyMDsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9NT05POyB9Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0R2FpbihmbG9hdCBnYWluKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQotICAgIHZpcnR1YWwgc3NpemVfdCAgICAgcmVhZCh2b2lkKiBidWZmZXIsIHNzaXplX3QgYnl0ZXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpIHsgcmV0dXJuIE5PX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotCi1wcml2YXRlOgotICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICptQXVkaW9IYXJkd2FyZTsKLSAgICBNdXRleCAgIG1Mb2NrOwotICAgIGludCAgICAgbUZkOwotICAgIHVpbnQzMl90IG1EZXZpY2U7Ci19OwotCi0KLWNsYXNzIEF1ZGlvSGFyZHdhcmVHZW5lcmljIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlR2VuZXJpYygpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvSGFyZHdhcmVHZW5lcmljKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIG1pYyBtdXRlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TWljTXV0ZShib29sKiBzdGF0ZSk7Ci0KLSAgICAvLyBjcmVhdGUgSS9PIHN0cmVhbXMKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGludCAqZm9ybWF0PTAsCi0gICAgICAgICAgICB1aW50MzJfdCAqY2hhbm5lbHM9MCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlPTAsCi0gICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzPTApOwotICAgIHZpcnR1YWwgICAgdm9pZCAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oQXVkaW9TdHJlYW1PdXQqIG91dCk7Ci0KLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICBpbnQgKmZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpjaGFubmVscywKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLAotICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oQXVkaW9TdHJlYW1PdXRHZW5lcmljKiBvdXQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbkdlbmVyaWMqIGluKTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgQXVkaW9TdHJlYW1PdXRHZW5lcmljICAgKm1PdXRwdXQ7Ci0gICAgQXVkaW9TdHJlYW1JbkdlbmVyaWMgICAgKm1JbnB1dDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtRmQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbU1pY011dGU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0hBUkRXQVJFX0dFTkVSSUNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThlNGMwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSAiQXVkaW9IYXJkd2FyZVN0dWIuaCIKLSNpbmNsdWRlICJBdWRpb0hhcmR3YXJlR2VuZXJpYy5oIgotI2lmZGVmIFdJVEhfQTJEUAotI2luY2x1ZGUgIkEyZHBBdWRpb0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfQVVESU9fRFVNUAotI2luY2x1ZGUgIkF1ZGlvRHVtcEludGVyZmFjZS5oIgotI2VuZGlmCi0KLQotLy8gY2hhbmdlIHRvIDEgdG8gbG9nIHJvdXRpbmcgY2FsbHMKLSNkZWZpbmUgTE9HX1JPVVRJTkdfQ0FMTFMgMQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNpZiBMT0dfUk9VVElOR19DQUxMUwotc3RhdGljIGNvbnN0IGNoYXIqIHJvdXRpbmdNb2RlU3RyaW5nc1tdID0KLXsKLSAgICAiT1VUIE9GIFJBTkdFIiwKLSAgICAiSU5WQUxJRCIsCi0gICAgIkNVUlJFTlQiLAotICAgICJOT1JNQUwiLAotICAgICJSSU5HVE9ORSIsCi0gICAgIklOX0NBTEwiLAotICAgICJJTl9DT01NVU5JQ0FUSU9OIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIqIHJvdXRlTm9uZSA9ICJOT05FIjsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGRpc3BsYXlNb2RlKGludCBtb2RlKQotewotICAgIGlmICgobW9kZSA8IEF1ZGlvU3lzdGVtOjpNT0RFX0lOVkFMSUQpIHx8IChtb2RlID49IEF1ZGlvU3lzdGVtOjpOVU1fTU9ERVMpKQotICAgICAgICByZXR1cm4gcm91dGluZ01vZGVTdHJpbmdzWzBdOwotICAgIHJldHVybiByb3V0aW5nTW9kZVN0cmluZ3NbbW9kZSszXTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmNyZWF0ZSgpCi17Ci0gICAgLyoKLSAgICAgKiBGSVhNRTogVGhpcyBjb2RlIG5lZWRzIHRvIGluc3RhbnRpYXRlIHRoZSBjb3JyZWN0IGF1ZGlvIGRldmljZQotICAgICAqIGludGVyZmFjZS4gRm9yIG5vdyAtIHdlIHVzZSBjb21waWxlLXRpbWUgc3dpdGNoZXMuCi0gICAgICovCi0gICAgQXVkaW9IYXJkd2FyZUludGVyZmFjZSogaHcgPSAwOwotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLQotI2lmZGVmIEdFTkVSSUNfQVVESU8KLSAgICBodyA9IG5ldyBBdWRpb0hhcmR3YXJlR2VuZXJpYygpOwotI2Vsc2UKLSAgICAvLyBpZiBydW5uaW5nIGluIGVtdWxhdGlvbiAtIHVzZSB0aGUgZW11bGF0b3IgZHJpdmVyCi0gICAgaWYgKHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLCB2YWx1ZSwgMCkpIHsKLSAgICAgICAgTE9HRCgiUnVubmluZyBpbiBlbXVsYXRpb24gLSB1c2luZyBnZW5lcmljIGF1ZGlvIGRyaXZlciIpOwotICAgICAgICBodyA9IG5ldyBBdWRpb0hhcmR3YXJlR2VuZXJpYygpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgTE9HVigiQ3JlYXRpbmcgVmVuZG9yIFNwZWNpZmljIEF1ZGlvSGFyZHdhcmUiKTsKLSAgICAgICAgaHcgPSBjcmVhdGVBdWRpb0hhcmR3YXJlKCk7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKGh3LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dXKCJVc2luZyBzdHViYmVkIGF1ZGlvIGhhcmR3YXJlLiBObyBzb3VuZCB3aWxsIGJlIHByb2R1Y2VkLiIpOwotICAgICAgICBkZWxldGUgaHc7Ci0gICAgICAgIGh3ID0gbmV3IEF1ZGlvSGFyZHdhcmVTdHViKCk7Ci0gICAgfQotICAgIAotI2lmZGVmIFdJVEhfQTJEUAotICAgIGh3ID0gbmV3IEEyZHBBdWRpb0ludGVyZmFjZShodyk7Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9BVURJT19EVU1QCi0gICAgLy8gVGhpcyBjb2RlIGFkZHMgYSByZWNvcmQgb2YgYnVmZmVycyBpbiBhIGZpbGUgdG8gd3JpdGUgY2FsbHMgbWFkZSBieSBBdWRpb0ZsaW5nZXIuCi0gICAgLy8gSXQgcmVwbGFjZXMgdGhlIGN1cnJlbnQgQXVkaW9IYXJkd2FyZUludGVyZmFjZSBvYmplY3QgYnkgYW4gaW50ZXJtZWRpYXRlIG9uZSB3aGljaAotICAgIC8vIHdpbGwgcmVjb3JkIGJ1ZmZlcnMgaW4gYSBmaWxlIChhZnRlciBzZW5kaW5nIHRoZW0gdG8gaGFyZHdhcmUpIGZvciB0ZXN0aW5nIHB1cnBvc2UuCi0gICAgLy8gVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgYnkgZGVmaW5pbmcgc3ltYm9sIEVOQUJMRV9BVURJT19EVU1QLgotICAgIC8vIFRoZSBvdXRwdXQgZmlsZSBpcyBzZXQgd2l0aCBzZXRQYXJhbWV0ZXJzKCJ0ZXN0X2NtZF9maWxlX25hbWU9PG5hbWU+IikuIFBhdXNlIGFyZSBub3QgcmVjb3JkZWQgaW4gdGhlIGZpbGUuCi0gICAgTE9HVigib3BlbmluZyBQQ00gZHVtcCBpbnRlcmZhY2UiKTsKLSAgICBodyA9IG5ldyBBdWRpb0R1bXBJbnRlcmZhY2UoaHcpOyAgICAvLyByZXBsYWNlIGludGVyZmFjZQotI2VuZGlmCi0gICAgcmV0dXJuIGh3OwotfQotCi1BdWRpb1N0cmVhbU91dDo6fkF1ZGlvU3RyZWFtT3V0KCkKLXsKLX0KLQotQXVkaW9TdHJlYW1Jbjo6fkF1ZGlvU3RyZWFtSW4oKSB7fQotCi1BdWRpb0hhcmR3YXJlQmFzZTo6QXVkaW9IYXJkd2FyZUJhc2UoKQotewotICAgIG1Nb2RlID0gMDsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OnNldE1vZGUoaW50IG1vZGUpCi17Ci0jaWYgTE9HX1JPVVRJTkdfQ0FMTFMKLSAgICBMT0dEKCJzZXRNb2RlKCVzKSIsIGRpc3BsYXlNb2RlKG1vZGUpKTsKLSNlbmRpZgotICAgIGlmICgobW9kZSA8IDApIHx8IChtb2RlID49IEF1ZGlvU3lzdGVtOjpOVU1fTU9ERVMpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGlmIChtTW9kZSA9PSBtb2RlKQotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgbU1vZGUgPSBtb2RlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLVN0cmluZzggQXVkaW9IYXJkd2FyZUJhc2U6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleXMpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi0vLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi1zaXplX3QgQXVkaW9IYXJkd2FyZUJhc2U6OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KQotewotICAgIGlmIChzYW1wbGVSYXRlICE9IDgwMDApIHsKLSAgICAgICAgTE9HVygiZ2V0SW5wdXRCdWZmZXJTaXplIGJhZCBzYW1wbGluZyByYXRlOiAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgewotICAgICAgICBMT0dXKCJnZXRJbnB1dEJ1ZmZlclNpemUgYmFkIGZvcm1hdDogJWQiLCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNoYW5uZWxDb3VudCAhPSAxKSB7Ci0gICAgICAgIExPR1coImdldElucHV0QnVmZmVyU2l6ZSBiYWQgY2hhbm5lbCBjb3VudDogJWQiLCBjaGFubmVsQ291bnQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMzIwOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6ZHVtcFN0YXRlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0hhcmR3YXJlQmFzZTo6ZHVtcFN0YXRlXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRtTW9kZTogJWRcbiIsIG1Nb2RlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBkdW1wKGZkLCBhcmdzKTsgIC8vIER1bXAgdGhlIHN0YXRlIG9mIHRoZSBjb25jcmV0ZSBjaGlsZC4KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDgxMTUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyogLy9kZXZpY2Uvc2VydmVycy9BdWRpb0ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIkF1ZGlvSGFyZHdhcmVTdHViLmgiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvSGFyZHdhcmVTdHViOjpBdWRpb0hhcmR3YXJlU3R1YigpIDogbU1pY011dGUoZmFsc2UpCi17Ci19Ci0KLUF1ZGlvSGFyZHdhcmVTdHViOjp+QXVkaW9IYXJkd2FyZVN0dWIoKQotewotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlU3R1Yjo6aW5pdENoZWNrKCkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUF1ZGlvU3RyZWFtT3V0KiBBdWRpb0hhcmR3YXJlU3R1Yjo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCi17Ci0gICAgQXVkaW9TdHJlYW1PdXRTdHViKiBvdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXRTdHViKCk7Ci0gICAgc3RhdHVzX3QgbFN0YXR1cyA9IG91dC0+c2V0KGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gb3V0OwotICAgIGRlbGV0ZSBvdXQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQXVkaW9IYXJkd2FyZVN0dWI6OmNsb3NlT3V0cHV0U3RyZWFtKEF1ZGlvU3RyZWFtT3V0KiBvdXQpCi17Ci0gICAgZGVsZXRlIG91dDsKLX0KLQotQXVkaW9TdHJlYW1JbiogQXVkaW9IYXJkd2FyZVN0dWI6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3QgZGV2aWNlcywgaW50ICpmb3JtYXQsIHVpbnQzMl90ICpjaGFubmVscywgdWludDMyX3QgKnNhbXBsZVJhdGUsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMsIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQotewotICAgIC8vIGNoZWNrIGZvciB2YWxpZCBpbnB1dCBzb3VyY2UKLSAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0lucHV0RGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcylkZXZpY2VzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBdWRpb1N0cmVhbUluU3R1YiogaW4gPSBuZXcgQXVkaW9TdHJlYW1JblN0dWIoKTsKLSAgICBzdGF0dXNfdCBsU3RhdHVzID0gaW4tPnNldChmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBhY291c3RpY3MpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gaW47Ci0gICAgZGVsZXRlIGluOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIEF1ZGlvSGFyZHdhcmVTdHViOjpjbG9zZUlucHV0U3RyZWFtKEF1ZGlvU3RyZWFtSW4qIGluKQotewotICAgIGRlbGV0ZSBpbjsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZVN0dWI6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVTdHViOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZVN0dWI6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmQoIkF1ZGlvSGFyZHdhcmVTdHViOjpkdW1wSW50ZXJuYWxzXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdG1NaWNNdXRlOiAlc1xuIiwgbU1pY011dGU/ICJ0cnVlIjogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb0hhcmR3YXJlU3R1Yjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6c2V0KGludCAqcEZvcm1hdCwgdWludDMyX3QgKnBDaGFubmVscywgdWludDMyX3QgKnBSYXRlKQotewotICAgIGlmIChwRm9ybWF0KSAqcEZvcm1hdCA9IGZvcm1hdCgpOwotICAgIGlmIChwQ2hhbm5lbHMpICpwQ2hhbm5lbHMgPSBjaGFubmVscygpOwotICAgIGlmIChwUmF0ZSkgKnBSYXRlID0gc2FtcGxlUmF0ZSgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zc2l6ZV90IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpCi17Ci0gICAgLy8gZmFrZSB0aW1pbmcgZm9yIGF1ZGlvIG91dHB1dAotICAgIHVzbGVlcChieXRlcyAqIDEwMDAwMDAgLyBzaXplb2YoaW50MTZfdCkgLyBBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMoKSkgLyBzYW1wbGVSYXRlKCkpOwotICAgIHJldHVybiBieXRlczsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXRTdHViOjpzdGFuZGJ5KCkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9TdHJlYW1PdXRTdHViOjpkdW1wXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdHNhbXBsZSByYXRlOiAlZFxuIiwgc2FtcGxlUmF0ZSgpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGJ1ZmZlciBzaXplOiAlZFxuIiwgYnVmZmVyU2l6ZSgpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGNoYW5uZWxzOiAlZFxuIiwgY2hhbm5lbHMoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRmb3JtYXQ6ICVkXG4iLCBmb3JtYXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1TdHJpbmc4IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQotewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5cyk7Ci0gICAgcmV0dXJuIHBhcmFtLnRvU3RyaW5nKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtT3V0U3R1Yjo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykKLXsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JblN0dWI6OnNldChpbnQgKnBGb3JtYXQsIHVpbnQzMl90ICpwQ2hhbm5lbHMsIHVpbnQzMl90ICpwUmF0ZSwKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNzaXplX3QgQXVkaW9TdHJlYW1JblN0dWI6OnJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKQotewotICAgIC8vIGZha2UgdGltaW5nIGZvciBhdWRpbyBpbnB1dAotICAgIHVzbGVlcChieXRlcyAqIDEwMDAwMDAgLyBzaXplb2YoaW50MTZfdCkgLyBBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMoKSkgLyBzYW1wbGVSYXRlKCkpOwotICAgIG1lbXNldChidWZmZXIsIDAsIGJ5dGVzKTsKLSAgICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU3RyZWFtSW5TdHViOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1N0cmVhbUluU3R1Yjo6ZHVtcFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0c2FtcGxlIHJhdGU6ICVkXG4iLCBzYW1wbGVSYXRlKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGJ1ZmZlciBzaXplOiAlZFxuIiwgYnVmZmVyU2l6ZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRjaGFubmVsczogJWRcbiIsIGNoYW5uZWxzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdGZvcm1hdDogJWRcbiIsIGZvcm1hdCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVN0cmluZzggQXVkaW9TdHJlYW1JblN0dWI6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleXMpOwotICAgIHJldHVybiBwYXJhbS50b1N0cmluZygpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmEyOWRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIC8vZGV2aWNlL3NlcnZlcnMvQXVkaW9GbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPX0hBUkRXQVJFX1NUVUJfSAotI2RlZmluZSBBTkRST0lEX0FVRElPX0hBUkRXQVJFX1NUVUJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9IYXJkd2FyZUJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEF1ZGlvU3RyZWFtT3V0U3R1YiA6IHB1YmxpYyBBdWRpb1N0cmVhbU91dCB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXQoaW50ICpwRm9ybWF0LCB1aW50MzJfdCAqcENoYW5uZWxzLCB1aW50MzJfdCAqcFJhdGUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIDQ0MTAwOyB9Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gNDA5NjsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgY2hhbm5lbHMoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOyB9Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeyByZXR1cm4gTk9fRVJST1I7IH0KLSAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YW5kYnkoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeyByZXR1cm4gTk9fRVJST1I7fQotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotfTsKLQotY2xhc3MgQXVkaW9TdHJlYW1JblN0dWIgOiBwdWJsaWMgQXVkaW9TdHJlYW1JbiB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXQoaW50ICpwRm9ybWF0LCB1aW50MzJfdCAqcENoYW5uZWxzLCB1aW50MzJfdCAqcFJhdGUsIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiA4MDAwOyB9Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gMzIwOyB9Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBjaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk87IH0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRHYWluKGZsb2F0IGdhaW4pIHsgcmV0dXJuIE5PX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzc2l6ZV90ICAgICByZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFuZGJ5KCkgeyByZXR1cm4gTk9fRVJST1I7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeyByZXR1cm4gTk9fRVJST1I7fQotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QgeyByZXR1cm4gMDsgfQotfTsKLQotY2xhc3MgQXVkaW9IYXJkd2FyZVN0dWIgOiBwdWJsaWMgIEF1ZGlvSGFyZHdhcmVCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlU3R1YigpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvSGFyZHdhcmVTdHViKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIG1pYyBtdXRlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsgbU1pY011dGUgPSBzdGF0ZTsgIHJldHVybiAgTk9fRVJST1I7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE1pY011dGUoYm9vbCogc3RhdGUpIHsgKnN0YXRlID0gbU1pY011dGUgOyByZXR1cm4gTk9fRVJST1I7IH0KLQotICAgIC8vIGNyZWF0ZSBJL08gc3RyZWFtcwotICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1PdXQqIG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZm9ybWF0PTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjaGFubmVscz0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZT0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzPTApOwotICAgIHZpcnR1YWwgICAgdm9pZCAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oQXVkaW9TdHJlYW1PdXQqIG91dCk7Ci0KLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKTsKLSAgICB2aXJ0dWFsICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRTdHJlYW0oQXVkaW9TdHJlYW1JbiogaW4pOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIG1NaWNNdXRlOwotcHJpdmF0ZToKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQVVESU9fSEFSRFdBUkVfU1RVQl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggNTBkY2RhNy4uNmU5MzE5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMjYsNiArMjYsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02MSw2ICs2NSw3IEBACiAgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CiAgICAgICAgIHQtPmVuYWJsZWQgPSAwOwogICAgICAgICB0LT5mb3JtYXQgPSAxNjsKKyAgICAgICAgdC0+Y2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgICAgIHQtPmJ1ZmZlci5yYXcgPSAwOwogICAgICAgICB0LT5idWZmZXJQcm92aWRlciA9IDA7CiAgICAgICAgIHQtPmhvb2sgPSAwOwpAQCAtMTgwLDEzICsxODUsMTggQEAKIAogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBUUkFDSzoKLSAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZUludCkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlSW50KSkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWVJbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWVJbnQpOworICAgICAgICBpZiAobmFtZSA9PSBDSEFOTkVMX01BU0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbE1hc2sgIT0gbWFzaykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7CisgICAgICAgICAgICAgICAgaWYgKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbE1hc2sgPSBtYXNrOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCBtYXNrKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggODg0MDhhNy4uNzVjOTE3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC02MSw3ICs2MSw3IEBACiAKICAgICAgICAgLy8gc2V0IFBhcmFtZXRlciBuYW1lcwogICAgICAgICAvLyBmb3IgdGFyZ2V0IFRSQUNLCi0gICAgICAgIENIQU5ORUxfQ09VTlQgICA9IDB4NDAwMCwKKyAgICAgICAgQ0hBTk5FTF9NQVNLICAgID0gMHg0MDAwLAogICAgICAgICBGT1JNQVQgICAgICAgICAgPSAweDQwMDEsCiAgICAgICAgIE1BSU5fQlVGRkVSICAgICA9IDB4NDAwMiwKICAgICAgICAgQVVYX0JVRkZFUiAgICAgID0gMHg0MDAzLApAQCAtMTUwLDYgKzE1MCw3IEBACiAgICAgICAgIHVpbnQ4X3QgICAgIGVuYWJsZWQgICAgICA6IDE7CiAgICAgICAgIHVpbnQ4X3QgICAgIHJlc2VydmVkMCAgICA6IDM7CiAgICAgICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbE1hc2s7CiAKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgICAgICAgICAgICAgYnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIG11dGFibGUgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNzM0My4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5TWFuYWdlckJhc2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotCi0gICAgTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlOiAleCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMiLCBkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7Ci0KLSAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKLSAgICBpZiAoQXVkaW9TeXN0ZW06OnBvcENvdW50KGRldmljZSkgIT0gMSkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmIChzdHJsZW4oZGV2aWNlX2FkZHJlc3MpID49IE1BWF9ERVZJQ0VfQUREUkVTU19MRU4pIHsKLSAgICAgICAgTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBhZGRyZXNzOiAlcyIsIGRldmljZV9hZGRyZXNzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmlzT3V0cHV0RGV2aWNlKGRldmljZSkpIHsKLQotI2lmbmRlZiBXSVRIX0EyRFAKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgotICAgICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOwotCi0gICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMgfD0gZGV2aWNlOwotCi0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgICAgICAvLyBoYW5kbGUgQTJEUCBkZXZpY2UgY29ubmVjdGlvbgotICAgICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZUEyZHBDb25uZWN0aW9uKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMgJj0gfmRldmljZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNCbHVldG9vdGhTY29EZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBCVCBTQ08gIGRldmljZSwgYWRkcmVzcyAlcyIsIGRldmljZV9hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBTQ08gZGV2aWNlIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgbVNjb0RldmljZUFkZHJlc3MgPSBTdHJpbmc4KGRldmljZV9hZGRyZXNzLCBNQVhfREVWSUNFX0FERFJFU1NfTEVOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgotICAgICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmICghKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICY9IH5kZXZpY2U7Ci0KLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgICAgIC8vIGhhbmRsZSBBMkRQIGRldmljZSBkaXNjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFuZGxlQTJkcERpc2Nvbm5lY3Rpb24oZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyB8PSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzQmx1ZXRvb3RoU2NvRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNjb0RldmljZUFkZHJlc3MgPSAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXF1ZXN0IHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeQotICAgICAgICB1aW50MzJfdCBuZXdEZXZpY2UgPSBnZXROZXdEZXZpY2UobUhhcmR3YXJlT3V0cHV0LCBmYWxzZSk7Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIEEyRFAgb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoc3RhdGUgPT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSAmJiBBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGNsb3NlQTJkcE91dHB1dHMoKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7Ci0gICAgICAgIHNldE91dHB1dERldmljZShtSGFyZHdhcmVPdXRwdXQsIG5ld0RldmljZSk7Ci0KLSAgICAgICAgaWYgKGRldmljZSA9PSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08gfHwKLSAgICAgICAgICAgICAgICAgICBkZXZpY2UgPT0gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHx8Ci0gICAgICAgICAgICAgICAgICAgZGV2aWNlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcwotICAgIGlmIChBdWRpb1N5c3RlbTo6aXNJbnB1dERldmljZShkZXZpY2UpKSB7Ci0KLSAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXMgJiBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIHw9IGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgotICAgICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKLSAgICAgICAgICAgIGlmICghKG1BdmFpbGFibGVJbnB1dERldmljZXMgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzICY9IH5kZXZpY2U7Ci0gICAgICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7Ci0gICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAobmV3RGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgewotICAgICAgICAgICAgICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoYW5naW5nIGRldmljZSBmcm9tICV4IHRvICV4IGZvciBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIG5ld0RldmljZSwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IG5ld0RldmljZTsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KW5ld0RldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoYWN0aXZlSW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIExPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc091dHB1dERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIGlmIChkZXZpY2UgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcykgewotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgIGFkZHJlc3MgIT0gIiIgJiYgbUEyZHBEZXZpY2VBZGRyZXNzICE9IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNCbHVldG9vdGhTY29EZXZpY2UoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgIGFkZHJlc3MgIT0gIiIgJiYgbVNjb0RldmljZUFkZHJlc3MgIT0gYWRkcmVzcykgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEF1ZGlvU3lzdGVtOjppc0lucHV0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgaWYgKGRldmljZSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMpIHsKLSAgICAgICAgICAgIHN0YXRlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdGU7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c2V0UGhvbmVTdGF0ZShpbnQgc3RhdGUpCi17Ci0gICAgTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwotICAgIHVpbnQzMl90IG5ld0RldmljZSA9IDA7Ci0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBdWRpb1N5c3RlbTo6TlVNX01PREVTKSB7Ci0gICAgICAgIExPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgewotICAgICAgICBMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdwotICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOwotICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7Ci0gICAgYm9vbCBmb3JjZSA9IGZhbHNlOwotCi0gICAgLy8gYXJlIHdlIGVudGVyaW5nIG9yIHN0YXJ0aW5nIGEgY2FsbAotICAgIGlmICghaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzdGFydGluZyBhIGNhbGwKLSAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBmb3JjZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiAhaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGV4aXRpbmcgYSBjYWxsCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkgewotICAgICAgICBMT0dWKCIgIFN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQCi0gICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKLSAgICBuZXdEZXZpY2UgPSBnZXROZXdEZXZpY2UobUhhcmR3YXJlT3V0cHV0LCBmYWxzZSk7Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotI2VuZGlmCi0gICAgdXBkYXRlRGV2aWNlRm9yU3RyYXRlZ3koKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKLQotICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCi0gICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiBuZXdEZXZpY2UgPT0gMCkgewotICAgICAgICBuZXdEZXZpY2UgPSBod091dHB1dERlc2MtPmRldmljZSgpOwotICAgIH0KLQotICAgIC8vIHdoZW4gY2hhbmdpbmcgZnJvbSByaW5nIHRvbmUgdG8gaW4gY2FsbCBtb2RlLCBtdXRlIHRoZSByaW5naW5nIHRvbmUKLSAgICAvLyBpbW1lZGlhdGVseSBhbmQgZGVsYXkgdGhlIHJvdXRlIGNoYW5nZSB0byBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUKLSAgICAvLyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCi0gICAgaW50IGRlbGF5TXMgPSAwOwotICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSAmJiBvbGRTdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORSkgewotICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIGNoYW5nZSBjb21tYW5kIGJ5IHR3aWNlIHRoZSBvdXRwdXQgbGF0ZW5jeSB0byBoYXZlIHNvbWUgbWFyZ2luCi0gICAgICAgIC8vIGFuZCBiZSBzdXJlIHRoYXQgYXVkaW8gYnVmZmVycyBub3QgeWV0IGFmZmVjdGVkIGJ5IHRoZSBtdXRlIGFyZSBvdXQgd2hlbgotICAgICAgICAvLyB3ZSBhY3R1YWxseSBhcHBseSB0aGUgcm91dGUgY2hhbmdlCi0gICAgICAgIGRlbGF5TXMgPSBod091dHB1dERlc2MtPm1MYXRlbmN5KjI7Ci0gICAgICAgIHNldFN0cmVhbU11dGUoQXVkaW9TeXN0ZW06OlJJTkcsIHRydWUsIG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgfQotCi0gICAgLy8gY2hhbmdlIHJvdXRpbmcgaXMgbmVjZXNzYXJ5Ci0gICAgc2V0T3V0cHV0RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7Ci0KLSAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCi0gICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIExPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgLy8gdW5tdXRlIHRoZSByaW5naW5nIHRvbmUgYWZ0ZXIgYSBzdWZmaWNpZW50IGRlbGF5IGlmIGl0IHdhcyBtdXRlZCBiZWZvcmUKLSAgICAgICAgLy8gc2V0dGluZyBvdXRwdXQgZGV2aWNlIGFib3ZlCi0gICAgICAgIGlmIChvbGRTdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORSkgewotICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShBdWRpb1N5c3RlbTo6UklORywgZmFsc2UsIG1IYXJkd2FyZU91dHB1dCwgTVVURV9USU1FX01TKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQotICAgIGlmIChzdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBdWRpb1N5c3RlbTo6TVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c2V0UmluZ2VyTW9kZSh1aW50MzJfdCBtb2RlLCB1aW50MzJfdCBtYXNrKQotewotICAgIExPR1YoInNldFJpbmdlck1vZGUoKSBtb2RlICV4LCBtYXNrICV4IiwgbW9kZSwgbWFzayk7Ci0KLSAgICBtUmluZ2VyTW9kZSA9IG1vZGU7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKQotewotICAgIExPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtUGhvbmVTdGF0ZSk7Ci0KLSAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gZmFsc2U7Ci0gICAgc3dpdGNoKHVzYWdlKSB7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT046Ci0gICAgICAgIGlmIChjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX1NQRUFLRVIgJiYgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08gJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORSkgewotICAgICAgICAgICAgTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0NPTU1VTklDQVRJT04iLCBjb25maWcpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6Rk9SX01FRElBOgotICAgICAgICBpZiAoY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfQTJEUCAmJgotICAgICAgICAgICAgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQU5BTE9HX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfRElHSVRBTF9ET0NLICYmIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORSkgewotICAgICAgICAgICAgTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpGT1JfUkVDT1JEOgotICAgICAgICBpZiAoY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORSkgewotICAgICAgICAgICAgTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6Rk9SX0RPQ0s6Ci0gICAgICAgIGlmIChjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkUgJiYgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9DQVJfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9ERVNLX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0FOQUxPR19ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0RJR0lUQUxfRE9DSykgewotICAgICAgICAgICAgTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIHVzYWdlICVkIiwgdXNhZ2UpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgdWludDMyX3QgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwotI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSNlbmRpZgotICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7Ci0gICAgc2V0T3V0cHV0RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgbmV3RGV2aWNlKTsKLSAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwpIHsKLSAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG1IYXJkd2FyZU91dHB1dCwgbmV3RGV2aWNlLCAwLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7Ci0gICAgaWYgKGFjdGl2ZUlucHV0ICE9IDApIHsKLSAgICAgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOwotICAgICAgICBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7Ci0gICAgICAgIGlmIChuZXdEZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB7Ci0gICAgICAgICAgICBMT0dWKCJzZXRGb3JjZVVzZSgpIGNoYW5naW5nIGRldmljZSBmcm9tICV4IHRvICV4IGZvciBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgbmV3RGV2aWNlLCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBuZXdEZXZpY2U7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpbmV3RGV2aWNlKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGFjdGl2ZUlucHV0LCBwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi1BdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlKQotewotICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKLXsKLSAgICBMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgaWYgKHN0cmNtcChwcm9wZXJ0eSwgInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChhdG9pKHZhbHVlKSkgewotICAgICAgICAgICAgTE9HVigiRU5GT1JDRURfQVVESUJMRSBjYW5ub3QgYmUgbXV0ZWQiKTsKLSAgICAgICAgICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFXS5tQ2FuQmVNdXRlZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiRU5GT1JDRURfQVVESUJMRSBjYW4gYmUgbXV0ZWQiKTsKLSAgICAgICAgICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFXS5tQ2FuQmVNdXRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldE91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzKQotewotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDA7Ci0gICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKTsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIGZsYWdzICV4Iiwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGZsYWdzKTsKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaWYgKG1DdXJPdXRwdXQgIT0gMCkgewotICAgICAgICBMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7Ci0KLSAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dWKCJnZXRPdXRwdXQoKSBvcGVuaW5nIHRlc3Qgb3V0cHV0Iik7Ci0gICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gbVRlc3REZXZpY2U7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gbVRlc3RGb3JtYXQ7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbHMgPSBtVGVzdENoYW5uZWxzOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9IChBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzKShtRGlyZWN0T3V0cHV0ID8gQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCA6IDApOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSkgewotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSxtQ3VyT3V0cHV0KTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGFkZE91dHB1dChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dERlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtVGVzdE91dHB1dHNbbUN1ck91dHB1dF07Ci0gICAgfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCi0gICAgaWYgKG5lZWRzRGlyZWN0T3VwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGZsYWdzLCBkZXZpY2UpKSB7Ci0KLSAgICAgICAgTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyBkaXJlY3Qgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoKTsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0gKEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MpKGZsYWdzIHwgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotCi0gICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXRlZCBwYXJhbWV0ZXJzCi0gICAgICAgIGlmIChvdXRwdXQgPT0gMCB8fAotICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB8fAotICAgICAgICAgICAgKGZvcm1hdCAhPSAwICYmIGZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB8fAotICAgICAgICAgICAgKGNoYW5uZWxzICE9IDAgJiYgY2hhbm5lbHMgIT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxzKSkgewotICAgICAgICAgICAgTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIG91dHB1dERlc2M7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICBpZiAoY2hhbm5lbHMgIT0gMCAmJiBjaGFubmVscyAhPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTyAmJgotICAgICAgICBjaGFubmVscyAhPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvLyBvcGVuIGEgbm9uIGRpcmVjdCBvdXRwdXQKLQotICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuCi0gICAgLy8gd2hlbiBzdGFydE91dHB1dCgpIHdpbGwgYmUgY2FsbGVkCi0gICAgdWludDMyX3QgYTJkcERldmljZSA9IGRldmljZSAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0FMTF9BMkRQOwotICAgIGlmIChBdWRpb1N5c3RlbTo6cG9wQ291bnQoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZSkgPT0gMikgewotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICBpZiAoYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSAmJiBhMmRwRGV2aWNlICE9IDApIHsKLSAgICAgICAgICAgIC8vIGlmIHBsYXlpbmcgb24gMiBkZXZpY2VzIGFtb25nIHdoaWNoIG9uZSBpcyBBMkRQLCB1c2UgZHVwbGljYXRlZCBvdXRwdXQKLSAgICAgICAgICAgIExPR1YoImdldE91dHB1dCgpIHVzaW5nIGR1cGxpY2F0ZWQgb3V0cHV0Iik7Ci0gICAgICAgICAgICBMT0dXX0lGKChtQTJkcE91dHB1dCA9PSAwKSwgImdldE91dHB1dCgpIEEyRFAgZGV2aWNlIGluIG11bHRpcGxlICV4IHNlbGVjdGVkIGJ1dCBBMkRQIG91dHB1dCBub3Qgb3BlbmVkIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIG91dHB1dCA9IG1EdXBsaWNhdGVkT3V0cHV0OwotICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBwbGF5aW5nIG9uIDIgZGV2aWNlcyBhbW9uZyB3aGljaCBub25lIGlzIEEyRFAsIHVzZSBoYXJkd2FyZSBvdXRwdXQKLSAgICAgICAgICAgIG91dHB1dCA9IG1IYXJkd2FyZU91dHB1dDsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCJnZXRPdXRwdXQoKSB1c2luZyBvdXRwdXQgJWQgZm9yIDIgZGV2aWNlcyAleCIsIG91dHB1dCwgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICBpZiAoYTJkcERldmljZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBpZiBwbGF5aW5nIG9uIEEyRFAgZGV2aWNlLCB1c2UgYTJkcCBvdXRwdXQKLSAgICAgICAgICAgIExPR1dfSUYoKG1BMmRwT3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgQTJEUCBkZXZpY2UgJXggc2VsZWN0ZWQgYnV0IEEyRFAgb3V0cHV0IG5vdCBvcGVuZWQiLCBkZXZpY2UpOwotICAgICAgICAgICAgb3V0cHV0ID0gbUEyZHBPdXRwdXQ7Ci0gICAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlmIHBsYXlpbmcgb24gbm90IEEyRFAgZGV2aWNlLCB1c2UgaGFyZHdhcmUgb3V0cHV0Ci0gICAgICAgICAgICBvdXRwdXQgPSBtSGFyZHdhcmVPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIExPR1dfSUYoKG91dHB1dCA9PTApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLAotICAgICAgICAgICAgICAgIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncyk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3cgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0pOwotCi0jaWZkZWYgV0lUSF9BMkRQCi0gICAgaWYgKG1BMmRwT3V0cHV0ICE9IDAgICYmICFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIG1BMmRwT3V0cHV0KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIGluY3JlbWVuZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKLSAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCi0gICAgLy8gbmVjYXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKLSAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOwotCi0gICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZ2V0TmV3RGV2aWNlKG91dHB1dCkpOwotCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQotICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIsIG91dHB1dCwgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93IG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKTsKLQotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0Ci0gICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOwotICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKLQotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBnZXROZXdEZXZpY2Uob3V0cHV0KSwgZmFsc2UsIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOwotCi0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgIGlmIChtQTJkcE91dHB1dCAhPSAwICYmICFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmCi0gICAgICAgICAgICAgICAgc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KS0+bUxhdGVuY3kqMik7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAob3V0cHV0ICE9IG1IYXJkd2FyZU91dHB1dCkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIExPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIExPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpbnQgdGVzdEluZGV4ID0gdGVzdE91dHB1dEluZGV4KG91dHB1dCk7Ci0gICAgaWYgKHRlc3RJbmRleCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+cmVmQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKLSAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotICAgIGlmIChtT3V0cHV0cy52YWx1ZUF0KGluZGV4KS0+bUZsYWdzICYgQXVkaW9TeXN0ZW06Ok9VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7Ci0gICAgfQotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzKQotewotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gMDsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci0KLSAgICBMT0dWKCJnZXRJbnB1dCgpIGlucHV0U291cmNlICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIGFjb3VzdGljcyAleCIsIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGFjb3VzdGljcyk7Ci0KLSAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gYWRhcHQgY2hhbm5lbCBzZWxlY3Rpb24gdG8gaW5wdXQgc291cmNlCi0gICAgc3dpdGNoKGlucHV0U291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgICAgICBjaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX1ZPSUNFX1VQTElOSzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6Ci0gICAgICAgIGNoYW5uZWxzID0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICBjaGFubmVscyA9IChBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKCk7Ci0KLSAgICBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgaW5wdXREZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotICAgIGlucHV0RGVzYy0+bUNoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgaW5wdXREZXNjLT5tQWNvdXN0aWNzID0gYWNvdXN0aWNzOwotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50ID0gMDsKLSAgICBpbnB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoJmlucHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tQWNvdXN0aWNzKTsKLQotICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwotICAgIGlmIChpbnB1dCA9PSAwIHx8Ci0gICAgICAgIChzYW1wbGluZ1JhdGUgIT0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB8fAotICAgICAgICAoZm9ybWF0ICE9IGlucHV0RGVzYy0+bUZvcm1hdCkgfHwKLSAgICAgICAgKGNoYW5uZWxzICE9IGlucHV0RGVzYy0+bUNoYW5uZWxzKSkgewotICAgICAgICBMT0dWKCJnZXRJbnB1dCgpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAotICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscyk7Ci0gICAgICAgIGlmIChpbnB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGlucHV0RGVzYzsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOwotICAgIHJldHVybiBpbnB1dDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBMT0dXKCJzdGFydElucHV0KCkgdW5rbm93IGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaWYgKG1UZXN0SW5wdXQgPT0gMCkKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgewotICAgICAgICAvLyByZWZ1c2UgMiBhY3RpdmUgQXVkaW9SZWNvcmQgY2xpZW50cyBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgIGlmIChnZXRBY3RpdmVJbnB1dCgpICE9IDApIHsKLSAgICAgICAgICAgIExPR1coInN0YXJ0SW5wdXQoKSBpbnB1dCAlZCBmYWlsZWQ6IG90aGVyIGlucHV0IGFscmVhZHkgc3RhcnRlZCIsIGlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpaW5wdXREZXNjLT5tRGV2aWNlKTsKLQotICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIChpbnQpaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOwotICAgIExPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOwotCi0gICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAxOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIExPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygic3RvcElucHV0KCkgdW5rbm93IGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7Ci0gICAgICAgIExPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAwKTsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIExPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygicmVsZWFzZUlucHV0KCkgcmVsZWFzaW5nIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOwotICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7Ci0gICAgTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi17Ci0gICAgTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKLSAgICAgICAgTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbiA9IGluZGV4TWluOwotICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4ID0gaW5kZXhNYXg7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkKLXsKLQotICAgIGlmICgoaW5kZXggPCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbikgfHwgKGluZGV4ID4gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCi0gICAgaWYgKCFtU3RyZWFtc1tzdHJlYW1dLm1DYW5CZU11dGVkKSBpbmRleCA9IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotCi0gICAgTE9HVigic2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQsIGluZGV4ICVkIiwgc3RyZWFtLCBpbmRleCk7Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIgPSBpbmRleDsKLQotICAgIC8vIGNvbXB1dGUgYW5kIGFwcGx5IHN0cmVhbSB2b2x1bWUgb24gYWxsIG91dHB1dHMgYWNjb3JkaW5nIHRvIGNvbm5lY3RlZCBkZXZpY2UKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBtT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2UoKSk7Ci0gICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgKmluZGV4KQotewotICAgIGlmIChpbmRleCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIExPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIiwgc3RyZWFtKTsKLSAgICAqaW5kZXggPSAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXI7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKLXsKLSAgICBMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSIpOwotICAgIC8vIGFwcGx5IHNpbXBsZSBydWxlIHdoZXJlIGdsb2JhbCBlZmZlY3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgc2FtZSBvdXRwdXQgYXMgTVVTSUMgc3RyZWFtcwotICAgIHJldHVybiBnZXRPdXRwdXQoQXVkaW9TeXN0ZW06Ok1VU0lDKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6cmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBkZXNjLT5jcHVMb2FkID4gZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSkgewotICAgICAgICBMT0dXKCJyZWdpc3RlckVmZmVjdCgpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAotICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIChmbG9hdClkZXNjLT5jcHVMb2FkLzEwKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7Ci0gICAgICAgIExPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKLSAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZGVzYy0+Y3B1TG9hZDsKLSAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOwotICAgIExPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBvdXRwdXQgJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAotICAgICAgICAgICAgZGVzYy0+bmFtZSwgb3V0cHV0LCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOwotCi0gICAgTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBDUFUgJWQsIG1lbW9yeSAlZCIsIGRlc2MtPmNwdUxvYWQsIGRlc2MtPm1lbW9yeVVzYWdlKTsKLSAgICBMT0dWKCIgIHRvdGFsIENQVSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotCi0gICAgRWZmZWN0RGVzY3JpcHRvciAqcERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOwotICAgIG1lbWNweSAoJnBEZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBwRGVzYy0+bU91dHB1dCA9IG91dHB1dDsKLSAgICBwRGVzYy0+bVN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3k7Ci0gICAgcERlc2MtPm1TZXNzaW9uID0gc2Vzc2lvbjsKLSAgICBtRWZmZWN0cy5hZGQoaWQsIHBEZXNjKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgRWZmZWN0RGVzY3JpcHRvciAqcERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IHBEZXNjLT5tRGVzYy5jcHVMb2FkKSB7Ci0gICAgICAgIExPR1coInVucmVnaXN0ZXJFZmZlY3QoKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgIHBEZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7Ci0gICAgICAgIHBEZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7Ci0gICAgfQotICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC09IHBEZXNjLT5tRGVzYy5jcHVMb2FkOwotICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5IDwgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7Ci0gICAgICAgIExPR1coInVucmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQgdG9vIGJpZyBmb3IgdG90YWwgJWQiLAotICAgICAgICAgICAgICAgIHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0gICAgICAgIHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7Ci0gICAgfQotICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlOwotICAgIExPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBDUFUgJWQsIG1lbW9yeSAlZCIsCi0gICAgICAgICAgICBwRGVzYy0+bURlc2MubmFtZSwgaWQsIHBEZXNjLT5tRGVzYy5jcHVMb2FkLCBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpOwotICAgIExPR1YoIiAgdG90YWwgQ1BVICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0KLSAgICBtRWZmZWN0cy5yZW1vdmVJdGVtKGlkKTsKLSAgICBkZWxldGUgcERlc2M7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aXNTdHJlYW1BY3RpdmUoaW50IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1PdXRwdXRzLnZhbHVlQXQoaSktPm1SZWZDb3VudFtzdHJlYW1dICE9IDAgfHwKLSAgICAgICAgICAgIG5zMm1zKHN5c1RpbWUgLSBtT3V0cHV0cy52YWx1ZUF0KGkpLT5tU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSGFyZHdhcmUgT3V0cHV0OiAlZFxuIiwgbUhhcmR3YXJlT3V0cHV0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEEyRFAgT3V0cHV0OiAlZFxuIiwgbUEyZHBPdXRwdXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRHVwbGljYXRlZCBPdXRwdXQ6ICVkXG4iLCBtRHVwbGljYXRlZE91dHB1dCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBMkRQIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgbUEyZHBEZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0jZW5kaWYKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU0NPIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgbVNjb0RldmljZUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgT3V0cHV0IGRldmljZXM6ICUwOHhcbiIsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElucHV0IGRldmljZXM6ICUwOHhcbiIsIG1BdmFpbGFibGVJbnB1dERldmljZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtUGhvbmVTdGF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSaW5nZXIgbW9kZTogJWRcbiIsIG1SaW5nZXJNb2RlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX01FRElBXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfUkVDT1JEXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0RPQ0tdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbU91dHB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwgbUlucHV0cy5rZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyICBDYW4gYmUgbXV0ZWRcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQiLCBpKTsKLSAgICAgICAgbVN0cmVhbXNbaV0uZHVtcChidWZmZXIgKyAzLCBTSVpFKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKLSAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIG1FZmZlY3RzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtRWZmZWN0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb1BvbGljeU1hbmFnZXJCYXNlKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOgotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgVGhyZWFkKGZhbHNlKSwKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksCi0gICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKLSAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKLSAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSkKLXsKLSAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQXVkaW9TeXN0ZW06Ok5VTV9GT1JDRV9VU0U7IGkrKykgewotICAgICAgICBtRm9yY2VVc2VbaV0gPSBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7Ci0KLSAgICAvLyBkZXZpY2VzIGF2YWlsYWJsZSBieSBkZWZhdWx0IGFyZSBzcGVha2VyLCBlYXIgcGllY2UgYW5kIG1pY3JvcGhvbmUKLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0VBUlBJRUNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0KLSNpZmRlZiBXSVRIX0EyRFAKLSAgICBtQTJkcE91dHB1dCA9IDA7Ci0gICAgbUR1cGxpY2F0ZWRPdXRwdXQgPSAwOwotICAgIG1BMmRwRGV2aWNlQWRkcmVzcyA9IFN0cmluZzgoIiIpOwotI2VuZGlmCi0gICAgbVNjb0RldmljZUFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLQotICAgIC8vIG9wZW4gaGFyZHdhcmUgb3V0cHV0Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpOwotICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSAodWludDMyX3QpQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICBtSGFyZHdhcmVPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLQotICAgIGlmIChtSGFyZHdhcmVPdXRwdXQgPT0gMCkgewotICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCBzYW1wbGluZ1JhdGU6ICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZE91dHB1dChtSGFyZHdhcmVPdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCAodWludDMyX3QpQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUiwgdHJ1ZSk7Ci0gICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQotICAgIH0KLQotICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpZiAobUhhcmR3YXJlT3V0cHV0ICE9IDApIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1IYXJkd2FyZU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG1UZXN0RGV2aWNlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSA0NDEwMDsKLSAgICAgICAgbVRlc3RGb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKLSAgICAgICAgbVRlc3RDaGFubmVscyA9ICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7Ci0gICAgICAgIG1DdXJPdXRwdXQgPSAwOwotICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7Ci0gICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlckJhc2U6On5BdWRpb1BvbGljeU1hbmFnZXJCYXNlKCkKLXsKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGV4aXQoKTsKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgfQotICAgbU91dHB1dHMuY2xlYXIoKTsKLSAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgZGVsZXRlIG1JbnB1dHMudmFsdWVBdChpKTsKLSAgIH0KLSAgIG1JbnB1dHMuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aW5pdENoZWNrKCkKLXsKLSAgICByZXR1cm4gKG1IYXJkd2FyZU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKLX0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnRocmVhZExvb3AoKQotewotICAgIExPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICAgIFN0cmluZzggY29tbWFuZDsKLSAgICAgICAgaW50IHZhbHVlSW50OwotICAgICAgICBTdHJpbmc4IHZhbHVlOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7Ci0KLSAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKLQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKLSAgICAgICAgICAgIExPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOwotICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOwotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgewotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKLSAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKLSAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OklOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpNUDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQXVkaW9TeXN0ZW06OklOVkFMSURfRk9STUFUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImZvcm1hdCIpLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSk7Ci0gICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzID0gMDsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgU3RlcmVvIikgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOwotCi0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtSGFyZHdhcmVPdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSAodWludDMyX3QpQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgICAgICBtSGFyZHdhcmVPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAobUhhcmR3YXJlT3V0cHV0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCBzYW1wbGluZ1JhdGU6ICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOwotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSGFyZHdhcmVPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1IYXJkd2FyZU91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmV4aXQoKQotewotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICAgICAgcmVxdWVzdEV4aXQoKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6dGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICBpZiAob3V0cHV0ID09IG1UZXN0T3V0cHV0c1tpXSkgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotLy8gLS0tCi0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MpCi17Ci0gICAgb3V0cHV0RGVzYy0+bUlkID0gaWQ7Ci0gICAgbU91dHB1dHMuYWRkKGlkLCBvdXRwdXREZXNjKTsKLX0KLQotCi0jaWZkZWYgV0lUSF9BMkRQCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpoYW5kbGVBMmRwQ29ubmVjdGlvbihBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgLy8gd2hlbiBhbiBBMkRQIGRldmljZSBpcyBjb25uZWN0ZWQsIG9wZW4gYW4gQTJEUCBhbmQgYSBkdXBsaWNhdGVkIG91dHB1dAotICAgIExPR1YoIm9wZW5pbmcgQTJEUCBvdXRwdXQgZm9yIGRldmljZSAlcyIsIGRldmljZV9hZGRyZXNzKTsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKCk7Ci0gICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICBtQTJkcE91dHB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KCZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKLSAgICBpZiAobUEyZHBPdXRwdXQpIHsKLSAgICAgICAgLy8gYWRkIEEyRFAgb3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICAgYWRkT3V0cHV0KG1BMmRwT3V0cHV0LCBvdXRwdXREZXNjKTsKLQotICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKLQotICAgICAgICAvLyBzZXQgaW5pdGlhbCBzdHJlYW0gdm9sdW1lIGZvciBBMkRQIGRldmljZQotICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMobUEyZHBPdXRwdXQsIGRldmljZSk7Ci0gICAgICAgIGlmIChhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpKSB7Ci0gICAgICAgICAgICBtRHVwbGljYXRlZE91dHB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG1BMmRwT3V0cHV0LCBtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRHVwbGljYXRlZE91dHB1dCAhPSAwIHx8Ci0gICAgICAgICAgICAhYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSkgewotICAgICAgICAgICAgLy8gSWYgYm90aCBBMkRQIGFuZCBkdXBsaWNhdGVkIG91dHB1dHMgYXJlIG9wZW4sIHNlbmQgZGV2aWNlIGFkZHJlc3MgdG8gQTJEUCBoYXJkd2FyZQotICAgICAgICAgICAgLy8gaW50ZXJmYWNlCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICAgICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJhMmRwX3NpbmtfYWRkcmVzcyIpLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtQTJkcE91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBtQTJkcERldmljZUFkZHJlc3MgPSBTdHJpbmc4KGRldmljZV9hZGRyZXNzLCBNQVhfREVWSUNFX0FERFJFU1NfTEVOKTsKLQotICAgICAgICAgICAgaWYgKGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZHVwT3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPSBtT3V0cHV0cy52YWx1ZUZvcihtQTJkcE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxzID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxzOwotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gb3V0cHV0RGVzYy0+bUxhdGVuY3k7Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1EdXBsaWNhdGVkT3V0cHV0LCBkdXBPdXRwdXREZXNjKTsKLSAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMobUR1cGxpY2F0ZWRPdXRwdXQsIGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dXKCJnZXRPdXRwdXQoKSBjb3VsZCBub3Qgb3BlbiBkdXBsaWNhdGVkIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlT3V0cHV0LCBtQTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobUEyZHBPdXRwdXQpOwotICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtQTJkcE91dHB1dCk7Ci0gICAgICAgICAgICBtQTJkcE91dHB1dCA9IDA7Ci0gICAgICAgICAgICBkZWxldGUgb3V0cHV0RGVzYzsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IG9wZW4gQTJEUCBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgICAgIGRlbGV0ZSBvdXRwdXREZXNjOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotCi0gICAgaWYgKCFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpKSB7Ci0gICAgICAgIC8vIG11dGUgbXVzaWMgb24gQTJEUCBvdXRwdXQgaWYgYSBub3RpZmljYXRpb24gb3IgcmluZ3RvbmUgaXMgcGxheWluZwotICAgICAgICB1aW50MzJfdCByZWZDb3VudCA9IGh3T3V0cHV0RGVzYy0+c3RyYXRlZ3lSZWZDb3VudChTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVmQ291bnQ7IGkrKykgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtQTJkcE91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpoYW5kbGVBMmRwRGlzY29ubmVjdGlvbihBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgaWYgKG1BMmRwT3V0cHV0ID09IDApIHsKLSAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBBMkRQIGFuZCBubyBBMkRQIG91dHB1dCEiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChtQTJkcERldmljZUFkZHJlc3MgIT0gZGV2aWNlX2FkZHJlc3MpIHsKLSAgICAgICAgTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyB1bmtub3cgQTJEUCBzaW5rIGFkZHJlc3MgJXMiLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvLyBtdXRlIG1lZGlhIHN0cmF0ZWd5IHRvIGF2b2lkIG91dHB1dHRpbmcgc291bmQgb24gaGFyZHdhcmUgb3V0cHV0IHdoaWxlIG11c2ljIHN0cmVhbQotICAgIC8vIGlzIHN3aXRjaGVkIGZyb20gQTJEUCBvdXRwdXQgYW5kIGJlZm9yZSBtdXNpYyBpcyBwYXVzZWQgYnkgbXVzaWMgYXBwbGljYXRpb24KLSAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIG1IYXJkd2FyZU91dHB1dCk7Ci0gICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbUhhcmR3YXJlT3V0cHV0LCBNVVRFX1RJTUVfTVMpOwotCi0gICAgaWYgKCFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpKSB7Ci0gICAgICAgIC8vIHVubXV0ZSBtdXNpYyBvbiBBMkRQIG91dHB1dCBpZiBhIG5vdGlmaWNhdGlvbiBvciByaW5ndG9uZSBpcyBwbGF5aW5nCi0gICAgICAgIHVpbnQzMl90IHJlZkNvdW50ID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KS0+c3RyYXRlZ3lSZWZDb3VudChTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVmQ291bnQ7IGkrKykgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbUEyZHBPdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1BMmRwRGV2aWNlQWRkcmVzcyA9ICIiOwotICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNsb3NlQTJkcE91dHB1dHMoKQotewotCi0gICAgTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2xvc2luZyBBMkRQIGFuZCBkdXBsaWNhdGVkIG91dHB1dCEiKTsKLQotICAgIGlmIChtRHVwbGljYXRlZE91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCi0gICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIGhhcmR3YXJlIG91dHB1dCwgdGhlIHJlZmVyZW5jZQotICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgotICAgICAgICAvLyBoYXJkd2FyZSBvdXRwdXQuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbaV07Ci0gICAgICAgICAgICBod091dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwtcmVmQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1EdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgZGVsZXRlIG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtRHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgIG1EdXBsaWNhdGVkT3V0cHV0ID0gMDsKLSAgICB9Ci0gICAgaWYgKG1BMmRwT3V0cHV0ICE9IDApIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1BMmRwT3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKLQotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobUEyZHBPdXRwdXQpOwotICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVGb3IobUEyZHBPdXRwdXQpOwotICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgbUEyZHBPdXRwdXQgPSAwOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgdWludDMyX3QgcHJldkRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICB1aW50MzJfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UpOwotICAgIGJvb2wgYTJkcFdhc1VzZWQgPSBBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcykocHJldkRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgYm9vbCBhMmRwSXNVc2VkID0gQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZSgoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMpKGN1ckRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSAwOwotCi0gICAgaWYgKGEyZHBXYXNVc2VkICYmICFhMmRwSXNVc2VkKSB7Ci0gICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcFdhc1VzZWQgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChwcmV2RGV2aWNlKSA9PSAyKTsKLSAgICAgICAgZHN0T3V0cHV0ID0gbUhhcmR3YXJlT3V0cHV0OwotICAgICAgICBpZiAoZHVwVXNlZCkgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCBmcm9tIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBzcmNPdXRwdXQgPSBtRHVwbGljYXRlZE91dHB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBhMmRwIiwgc3RyYXRlZ3kpOwotICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUEyZHBPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGEyZHBJc1VzZWQgJiYgIWEyZHBXYXNVc2VkKSB7Ci0gICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcElzVXNlZCAmJiAoQXVkaW9TeXN0ZW06OnBvcENvdW50KGN1ckRldmljZSkgPT0gMik7Ci0gICAgICAgIHNyY091dHB1dCA9IG1IYXJkd2FyZU91dHB1dDsKLSAgICAgICAgaWYgKGR1cFVzZWQpIHsKLSAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gZHVwbGljYXRlZCIsIHN0cmF0ZWd5KTsKLSAgICAgICAgICAgIGRzdE91dHB1dCA9IG1EdXBsaWNhdGVkT3V0cHV0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCB0byBhMmRwIiwgc3RyYXRlZ3kpOwotICAgICAgICAgICAgZHN0T3V0cHV0ID0gbUEyZHBPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3JjT3V0cHV0ICE9IDAgJiYgZHN0T3V0cHV0ICE9IDApIHsKLSAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEVmZmVjdERlc2NyaXB0b3IgKmRlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1TZXNzaW9uICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSAmJgotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tU3RyYXRlZ3kgPT0gc3RyYXRlZ3kgJiYKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+bU91dHB1dCA9PSBzcmNPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIGVmZmVjdCAlZCB0byBvdXRwdXQgJWQiLCBtRWZmZWN0cy5rZXlBdChpKSwgZHN0T3V0cHV0KTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoZGVzYy0+bVNlc3Npb24sIHNyY091dHB1dCwgZHN0T3V0cHV0KTsKLSAgICAgICAgICAgICAgICBkZXNjLT5tT3V0cHV0ID0gZHN0T3V0cHV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1PdXRwdXQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLCBkc3RPdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi17Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tBMmRwU3VzcGVuZCgpCi17Ci0gICAgLy8gc3VzcGVuZCBBMkRQIG91dHB1dCBpZjoKLSAgICAvLyAgICAgIChOT1QgYWxyZWFkeSBzdXNwZW5kZWQpICYmCi0gICAgLy8gICAgICAoKFNDTyBkZXZpY2UgaXMgY29ubmVjdGVkICYmCi0gICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBmb3IgY29tbXVuaWNhdGlvbiB8fCBmb3IgcmVjb3JkIGlzIFNDTykpKSB8fAotICAgIC8vICAgICAgKHBob25lIHN0YXRlIGlzIHJpbmdpbmcgfHwgaW4gY2FsbCkKLSAgICAvLwotICAgIC8vIHJlc3RvcmUgQTJEUCBvdXRwdXQgaWY6Ci0gICAgLy8gICAgICAoQWxyZWFkeSBzdXNwZW5kZWQpICYmCi0gICAgLy8gICAgICAoKFNDTyBkZXZpY2UgaXMgTk9UIGNvbm5lY3RlZCB8fAotICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgTk9UIGZvciBjb21tdW5pY2F0aW9uICYmIE5PVCBmb3IgcmVjb3JkIGlzIFNDTykpKSAmJgotICAgIC8vICAgICAgKHBob25lIHN0YXRlIGlzIE5PVCByaW5naW5nICYmIE5PVCBpbiBjYWxsKQotICAgIC8vCi0gICAgaWYgKG1BMmRwT3V0cHV0ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgewotICAgICAgICBpZiAoKChtU2NvRGV2aWNlQWRkcmVzcyA9PSAiIikgfHwKLSAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pICYmCi0gICAgICAgICAgICAgIChtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9SRUNPUkRdICE9IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pKSkgJiYKLSAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlICE9IEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwpICYmCi0gICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSAhPSBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORSkpKSB7Ci0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KG1BMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKChtU2NvRGV2aWNlQWRkcmVzcyAhPSAiIikgJiYKLSAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dID09IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgICAgICAgIChtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9SRUNPUkRdID09IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pKSkgfHwKLSAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlID09IEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwpIHx8Ci0gICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORSkpKSB7Ci0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdXNwZW5kT3V0cHV0KG1BMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0jZW5kaWYKLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TmV3RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpCi17Ci0gICAgdWludDMyX3QgZGV2aWNlID0gMDsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIGhhcmR3YXJlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMjogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIGhhcmR3YXJlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBtZWRpYSBpcyBhY3RpdmUgb24gdGhlIGhhcmR3YXJlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IG1lZGlhCi0gICAgLy8gNDogdGhlIHN0cmF0ZWd5IERUTUYgaXMgYWN0aXZlIG9uIHRoZSBoYXJkd2FyZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBEVE1GCi0gICAgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgb3V0cHV0RGVzYy0+aXNVc2VkQnlTdHJhdGVneShTVFJBVEVHWV9QSE9ORSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1VzZWRCeVN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNVc2VkQnlTdHJhdGVneShTVFJBVEVHWV9NRURJQSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1VzZWRCeVN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7Ci0gICAgfQotCi0gICAgTE9HVigiZ2V0TmV3RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7Ci0gICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pIHsKLSAgICB1aW50MzJfdCBkZXZpY2VzOwotICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCi0gICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBMT0dFCi0gICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KLSAgICBpZiAoc3RyZWFtIDwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgMCB8fCBzdHJlYW0gPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKLSAgICAgICAgZGV2aWNlcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6cm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSk7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldFN0cmF0ZWd5KAotICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7Ci0gICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgIGNhc2UgQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEw6Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06OlJJTkc6Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6Tk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkFMQVJNOgotICAgIGNhc2UgQXVkaW9TeXN0ZW06OkVORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6RFRNRjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSIpOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06OlNZU1RFTToKLSAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotICAgIGNhc2UgQXVkaW9TeXN0ZW06OlRUUzoKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpNVVNJQzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgYm9vbCBmcm9tQ2FjaGUpCi17Ci0gICAgdWludDMyX3QgZGV2aWNlID0gMDsKLQotICAgIGlmIChmcm9tQ2FjaGUpIHsKLSAgICAgICAgTE9HVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOwotICAgIH0KLQotICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKLSAgICBjYXNlIFNUUkFURUdZX0RUTUY6Ci0gICAgICAgIGlmICghaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgLy8gd2hlbiBvZmYgY2FsbCwgRFRNRiBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIE1FRElBIHN0cmF0ZWd5Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6Ci0gICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5IG9yZGVyCi0gICAgICAgIC8vIG9mIHByaW9yaXR5Ci0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfQ09NTVVOSUNBVElPTl0pIHsKLSAgICAgICAgY2FzZSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPOgotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCi0gICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCi0gICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCi0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfRUFSUElFQ0U7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGVhcnBpZWNlIGRldmljZSBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQXVkaW9TeXN0ZW06OkZPUkNFX1NQRUFLRVI6Ci0jaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bwotICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmICFtQTJkcFN1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BVVhfRElHSVRBTDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKLQotICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5Ci0gICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZhbHNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgaWYgKGRldmljZSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKLSAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICBjYXNlIFNUUkFURUdZX01FRElBOiB7Ci0gICAgICAgIHVpbnQzMl90IGRldmljZTIgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKLSAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlMiA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKLSAgICAgICAgfQotI2lmZGVmIFdJVEhfQTJEUAotICAgICAgICBpZiAoKG1BMmRwT3V0cHV0ICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCAmJgotICAgICAgICAgICAgICAgIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04gfHwgYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSkpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gMCkgewotICAgICAgICAgICAgICAgIGRldmljZTIgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAmIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BVVhfRElHSVRBTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGV2aWNlIGlzIERFVklDRV9PVVRfU1BFQUtFUiBpZiB3ZSBjb21lIGZyb20gY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT04sIDAgb3RoZXJ3aXNlCi0gICAgICAgIGRldmljZSB8PSBkZXZpY2UyOwotICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKLSAgICAgICAgICAgIExPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3BlYWtlciBkZXZpY2Ugbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR1coImdldERldmljZUZvclN0cmF0ZWd5KCkgdW5rbm93biBzdHJhdGVneTogJWQiLCBzdHJhdGVneSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIExPR1YoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6dXBkYXRlRGV2aWNlRm9yU3RyYXRlZ3koKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90IGRldmljZSwgYm9vbCBmb3JjZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgb3V0cHV0ICVkIGRldmljZSAleCBkZWxheU1zICVkIiwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0KLQotICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDEtPm1JZCwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7Ci0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0Mi0+bUlkLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBXSVRIX0EyRFAKLSAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCi0gICAgaWYgKG91dHB1dCA9PSBtQTJkcE91dHB1dCkgewotICAgICAgICBkZXZpY2UgJj0gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQUxMX0EyRFA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlICY9IH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BTExfQTJEUDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHVpbnQzMl90IHByZXZEZXZpY2UgPSAodWludDMyX3Qpb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKLSAgICAvLyAgLSB0aGUgcmVxdWVzdGVkZSBkZXZpY2UgaXMgMAotICAgIC8vICAtIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlIGFuZCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkLgotICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucwotICAgIGlmICgoZGV2aWNlID09IDAgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmICFmb3JjZSkgewotICAgICAgICBMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlICV4IG9yIG51bGwgZGV2aWNlIGZvciBvdXRwdXQgJWQiLCBkZXZpY2UsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgIC8vIG11dGUgbWVkaWEgc3RyZWFtcyBpZiBib3RoIHNwZWFrZXIgYW5kIGhlYWRzZXQgYXJlIHNlbGVjdGVkCi0gICAgaWYgKG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQgJiYgQXVkaW9TeXN0ZW06OnBvcENvdW50KGRldmljZSkgPT0gMikgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIG91dHB1dCk7Ci0gICAgICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAotICAgICAgICB1c2xlZXAob3V0cHV0RGVzYy0+bUxhdGVuY3kqMioxMDAwKTsKLSAgICB9Ci0KLSAgICAvLyBkbyB0aGUgcm91dGluZwotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpZGV2aWNlKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSGFyZHdhcmVPdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCksIGRlbGF5TXMpOwotICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7Ci0KLSAgICAvLyBpZiBjaGFuZ2luZyBmcm9tIGEgY29tYmluZWQgaGVhZHNldCArIHNwZWFrZXIgcm91dGUsIHVubXV0ZSBtZWRpYSBzdHJlYW1zCi0gICAgaWYgKG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQgJiYgQXVkaW9TeXN0ZW06OnBvcENvdW50KHByZXZEZXZpY2UpID09IDIpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgb3V0cHV0LCBkZWxheU1zKTsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldERldmljZUZvcklucHV0U291cmNlKGludCBpbnB1dFNvdXJjZSkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2U7Ci0KLSAgICBzd2l0Y2goaW5wdXRTb3VyY2UpIHsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICBpZiAobUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfUkVDT1JEXSA9PSBBdWRpb1N5c3RlbTo6Rk9SQ0VfQlRfU0NPICYmCi0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzICYgQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXMgJiBBdWRpb1N5c3RlbTo6REVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgotICAgICAgICBpZiAoaGFzQmFja01pY3JvcGhvbmUoKSkgewotICAgICAgICAgICAgZGV2aWNlID0gQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9CQUNLX01JQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGRldmljZSA9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HVygiZ2V0SW5wdXQoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKLSAgICAgICAgZGV2aWNlID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIExPR1YoImdldERldmljZUZvcklucHV0U291cmNlKClpbnB1dCBzb3VyY2UgJWQsIGRldmljZSAlMDh4IiwgaW5wdXRTb3VyY2UsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0QWN0aXZlSW5wdXQoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUlucHV0cy52YWx1ZUF0KGkpLT5tUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6dm9sSW5kZXhUb0FtcGwodWludDMyX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAotICAgICAgICBpbnQgaW5kZXhJblVpKSB7Ci0gICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCi0gICAgaW50IG5iU3RlcHMgPSAxICsgc3RyZWFtRGVzYy5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUFYXSAtCi0gICAgICAgICAgICBzdHJlYW1EZXNjLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNSU5dOwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBzdHJlYW1EZXNjLm1JbmRleE1pbikpIC8KLSAgICAgICAgICAgIChzdHJlYW1EZXNjLm1JbmRleE1heCAtIHN0cmVhbURlc2MubUluZGV4TWluKTsKLQotICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKLSAgICBpbnQgc2VnbWVudCA9IDA7Ci0gICAgaWYgKHZvbElkeCA8IHN0cmVhbURlc2MubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1JTl0pIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAwLjBmOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgc3RyZWFtRGVzYy5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTFdKSB7Ci0gICAgICAgIHNlZ21lbnQgPSAwOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgc3RyZWFtRGVzYy5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTJdKSB7Ci0gICAgICAgIHNlZ21lbnQgPSAxOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IHN0cmVhbURlc2MubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1BWF0pIHsKLSAgICAgICAgc2VnbWVudCA9IDI7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAxLjBmOwotICAgIH0KLQotICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgotICAgIGZsb2F0IGRlY2liZWxzID0gc3RyZWFtRGVzYy5tVm9sRGJBdHRbc2VnbWVudF0gKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gc3RyZWFtRGVzYy5tVm9sSW5kZXhbc2VnbWVudF0pKSAqCi0gICAgICAgICAgICAgICAgKCAoc3RyZWFtRGVzYy5tVm9sRGJBdHRbc2VnbWVudCsxXSAtIHN0cmVhbURlc2MubVZvbERiQXR0W3NlZ21lbnRdKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKHN0cmVhbURlc2MubVZvbEluZGV4W3NlZ21lbnQrMV0gLSBzdHJlYW1EZXNjLm1Wb2xJbmRleFtzZWdtZW50XSkpICk7Ci0KLSAgICBmbG9hdCBhbXBsaWZpY2F0aW9uID0gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCi0KLSAgICBMT0dWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0gYW1wbD0lLjVmIiwKLSAgICAgICAgICAgIHN0cmVhbURlc2MubVZvbEluZGV4W3NlZ21lbnRdLCB2b2xJZHgsIHN0cmVhbURlc2MubVZvbEluZGV4W3NlZ21lbnQrMV0sCi0gICAgICAgICAgICBzdHJlYW1EZXNjLm1Wb2xEYkF0dFtzZWdtZW50XSwgZGVjaWJlbHMsIHN0cmVhbURlc2MubVZvbERiQXR0W3NlZ21lbnQrMV0sCi0gICAgICAgICAgICBhbXBsaWZpY2F0aW9uKTsKLQotICAgIHJldHVybiBhbXBsaWZpY2F0aW9uOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKSB7Ci0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgdm9sdW1lIGN1cnZlcyB0byBhICgtNDkuNSAtIDAgZEIpIGF0dGVudWF0aW9uIGluIDAuNWRCIHN0ZXBzCi0gICAgZm9yIChpbnQgaT0wIDsgaTwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMgOyBpKyspIHsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1JTl0gPSAxOwotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUlOXSA9IC00OS41ZjsKLSAgICAgICAgbVN0cmVhbXNbaV0ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTEtORUUxXSA9IDMzOwotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTFdID0gLTMzLjVmOwotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTJdID0gNjY7Ci0gICAgICAgIG1TdHJlYW1zW2ldLm1Wb2xEYkF0dFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xLTkVFMl0gPSAtMTcuMGY7Ci0gICAgICAgIC8vIGhlcmUgd2UgdXNlIDEwMCBzdGVwcyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMKLSAgICAgICAgLy8gd2hlbiBjb21wdXRpbmcgdGhlIHZvbHVtZSBpbiB2b2xJbmRleFRvQW1wbCgpCi0gICAgICAgIG1TdHJlYW1zW2ldLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xNQVhdID0gMTAwOwotICAgICAgICBtU3RyZWFtc1tpXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUFYXSA9IDAuMGY7Ci0gICAgfQotCi0gICAgLy8gTW9kaWZpY2F0aW9uIGZvciBtdXNpYzogbW9yZSBhdHRlbnVhdGlvbiBmb3IgbG93ZXIgdm9sdW1lcywgZmluZXIgc3RlcHMgYXQgaGlnaCB2b2x1bWVzCi0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUlOXSA9IDE7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUlOXSA9IC01OC4wZjsKLSAgICBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6TVVTSUNdLm1Wb2xJbmRleFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xLTkVFMV0gPSAyMDsKLSAgICBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6TVVTSUNdLm1Wb2xEYkF0dFtTdHJlYW1EZXNjcmlwdG9yOjpWT0xLTkVFMV0gPSAtNDAuMGY7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sSW5kZXhbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTJdID0gNjA7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MS05FRTJdID0gLTE3LjBmOwotICAgIG1TdHJlYW1zW0F1ZGlvU3lzdGVtOjpNVVNJQ10ubVZvbEluZGV4W1N0cmVhbURlc2NyaXB0b3I6OlZPTE1BWF0gPSAxMDA7Ci0gICAgbVN0cmVhbXNbQXVkaW9TeXN0ZW06Ok1VU0lDXS5tVm9sRGJBdHRbU3RyZWFtRGVzY3JpcHRvcjo6Vk9MTUFYXSA9IDAuMGY7Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNvbXB1dGVWb2x1bWUoaW50IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90IGRldmljZSkKLXsKLSAgICBmbG9hdCB2b2x1bWUgPSAxLjA7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKLQotICAgIGlmIChkZXZpY2UgPT0gMCkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICB9Ci0KLSAgICAvLyBpZiB2b2x1bWUgaXMgbm90IDAgKG5vdCBtdXRlZCksIGZvcmNlIG1lZGlhIHZvbHVtZSB0byBtYXggb24gZGlnaXRhbCBvdXRwdXQKLSAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpNVVNJQyAmJgotICAgICAgICBpbmRleCAhPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbiAmJgotICAgICAgICBkZXZpY2UgPT0gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQVVYX0RJR0lUQUwpIHsKLSAgICAgICAgcmV0dXJuIDEuMDsKLSAgICB9Ci0KLSAgICB2b2x1bWUgPSB2b2xJbmRleFRvQW1wbChkZXZpY2UsIHN0cmVhbURlc2MsIGluZGV4KTsKLQotICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucwotICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKLSAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCi0gICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKLSAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KLSAgICBpZiAoKGRldmljZSAmCi0gICAgICAgIChBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAotICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKLSAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKLSAgICAgICAgKChnZXRTdHJhdGVneSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSkgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6U1lTVEVNKSkgJiYKLSAgICAgICAgc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCkgewotICAgICAgICB2b2x1bWUgKj0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUjsKLSAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQotICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwotICAgICAgICAvLyBqdXN0IHN0b3BwZWQKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtBdWRpb1N5c3RlbTo6TVVTSUNdIHx8IG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7Ci0gICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbCA9IGNvbXB1dGVWb2x1bWUoQXVkaW9TeXN0ZW06Ok1VU0lDLCBtU3RyZWFtc1tBdWRpb1N5c3RlbTo6TVVTSUNdLm1JbmRleEN1ciwgb3V0cHV0LCBkZXZpY2UpOwotICAgICAgICAgICAgZmxvYXQgbWluVm9sID0gKG11c2ljVm9sID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTikgPyBtdXNpY1ZvbCA6IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU47Ci0gICAgICAgICAgICBpZiAodm9sdW1lID4gbWluVm9sKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lID0gbWluVm9sOwotICAgICAgICAgICAgICAgIExPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sLCBtdXNpY1ZvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdm9sdW1lOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjaGVja0FuZFNldFZvbHVtZShpbnQgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgdWludDMyX3QgZGV2aWNlLCBpbnQgZGVsYXlNcywgYm9vbCBmb3JjZSkKLXsKLQotICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAotICAgIGlmIChtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICBMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsIHN0cmVhbSwgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQotICAgIGlmICgoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMICYmIG1Gb3JjZVVzZVtBdWRpb1N5c3RlbTo6Rk9SX0NPTU1VTklDQVRJT05dID09IEF1ZGlvU3lzdGVtOjpGT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08gJiYgbUZvcmNlVXNlW0F1ZGlvU3lzdGVtOjpGT1JfQ09NTVVOSUNBVElPTl0gIT0gQXVkaW9TeXN0ZW06OkZPUkNFX0JUX1NDTykpIHsKLSAgICAgICAgTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCi0gICAgICAgICAgICAgc3RyZWFtLCBtRm9yY2VVc2VbQXVkaW9TeXN0ZW06OkZPUl9DT01NVU5JQ0FUSU9OXSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKLSAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAotICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKLSAgICAgICAgICAgIGZvcmNlKSB7Ci0gICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKLSAgICAgICAgTE9HVigic2V0U3RyZWFtVm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAotICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpEVE1GIHx8Ci0gICAgICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIC8vIG9mZnNldCB2YWx1ZSB0byByZWZsZWN0IGFjdHVhbCBoYXJkd2FyZSB2b2x1bWUgdGhhdCBuZXZlciByZWFjaGVzIDAKLSAgICAgICAgICAgIC8vIDElIGNvcnJlc3BvbmRzIHJvdWdobHkgdG8gZmlyc3Qgc3RlcCBpbiBWT0lDRV9DQUxMIHN0cmVhbSB2b2x1bWUgc2V0dGluZyAoc2VlIEF1ZGlvU2VydmljZS5qYXZhKQotICAgICAgICAgICAgdm9sdW1lID0gMC4wMSArIDAuOTkgKiB2b2x1bWU7Ci0gICAgICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcwotICAgICAgICAgICAgLy8gZW5hYmxlZAotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwsIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMIHx8Ci0gICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6QkxVRVRPT1RIX1NDTykgewotICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKLSAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAotICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpWT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtSGFyZHdhcmVPdXRwdXQpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6YXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgdWludDMyX3QgZGV2aWNlLCBpbnQgZGVsYXlNcywgYm9vbCBmb3JjZSkKLXsKLSAgICBMT0dWKCJhcHBseVN0cmVhbVZvbHVtZXMoKSBmb3Igb3V0cHV0ICVkIGFuZCBkZXZpY2UgJXgiLCBvdXRwdXQsIGRldmljZSk7Ci0KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKLSAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleEN1ciwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIGJvb2wgb24sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMpCi17Ci0gICAgTE9HVigic2V0U3RyYXRlZ3lNdXRlKCkgc3RyYXRlZ3kgJWQsIG11dGUgJWQsIG91dHB1dCAlZCIsIHN0cmF0ZWd5LCBvbiwgb3V0cHV0KTsKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnNldFN0cmVhbU11dGUoaW50IHN0cmVhbSwgYm9vbCBvbiwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcykKLXsKLSAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotCi0gICAgTE9HVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIiwgc3RyZWFtLCBvbiwgb3V0cHV0LCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0pOwotCi0gICAgaWYgKG9uKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2MubUNhbkJlTXV0ZWQpIHsKLSAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dCwgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dXKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCBzdHJlYW1EZXNjLm1JbmRleEN1ciwgb3V0cHV0LCBvdXRwdXREZXNjLT5kZXZpY2UoKSwgZGVsYXlNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGludCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCi17Ci0gICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKLSAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQotICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAotICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKLSAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCi0gICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0Ci0KLSAgICBpZiAoZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0pID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICBMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMb3dWaXNpYmlsaXR5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtKSkgewotICAgICAgICAgICAgICAgIExPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywgQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjppc0luQ2FsbCgpCi17Ci0gICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKSB7Ci0gICAgcmV0dXJuICgoc3RhdGUgPT0gQXVkaW9TeXN0ZW06Ok1PREVfSU5fQ0FMTCkgfHwKLSAgICAgICAgICAgIChzdGF0ZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6bmVlZHNEaXJlY3RPdXB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlKQotewotICAgcmV0dXJuICgoZmxhZ3MgJiBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfRElSRUNUKSB8fAotICAgICAgICAgIChmb3JtYXQgIT0wICYmICFBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00oZm9ybWF0KSkpOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCi17Ci0gICAgcmV0dXJuIE1BWF9FRkZFQ1RTX0NQVV9MT0FEOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKLXsKLSAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwotfQotCi0vLyAtLS0gQXVkaW9PdXRwdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkKLSAgICA6IG1JZCgwKSwgbVNhbXBsaW5nUmF0ZSgwKSwgbUZvcm1hdCgwKSwgbUNoYW5uZWxzKDApLCBtTGF0ZW5jeSgwKSwKLSAgICBtRmxhZ3MoKEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MpMCksIG1EZXZpY2UoMCksIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKQotewotICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgIG1SZWZDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOwotICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKLSAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKLSAgICB9Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkKLXsKLSAgICB1aW50MzJfdCBkZXZpY2UgPSAwOwotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBkZXZpY2UgPSBtT3V0cHV0MS0+bURldmljZSB8IG1PdXRwdXQyLT5tRGV2aWNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IG1EZXZpY2U7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgZGVsdGEpCi17Ci0gICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cwotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLSAgICB9Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgewotICAgICAgICBMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLCBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKLSAgICBMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpyZWZDb3VudCgpCi17Ci0gICAgdWludDMyX3QgcmVmY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgIHJlZmNvdW50ICs9IG1SZWZDb3VudFtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZmNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnN0cmF0ZWd5UmVmQ291bnQocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLXsKLSAgICB1aW50MzJfdCByZWZDb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTOyBpKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIHJlZkNvdW50ICs9IG1SZWZDb3VudFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVmQ291bnQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIEF1ZGlvSW5wdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLUF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcigpCi0gICAgOiBtU2FtcGxpbmdSYXRlKDApLCBtRm9ybWF0KDApLCBtQ2hhbm5lbHMoMCksCi0gICAgIG1BY291c3RpY3MoKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpMCksIG1EZXZpY2UoMCksIG1SZWZDb3VudCgwKQotewotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEFjb3VzdGljcyAlMDh4XG4iLCBtQWNvdXN0aWNzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OlN0cmVhbURlc2NyaXB0b3I6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAlZFxuIiwKLSAgICAgICAgICAgIG1JbmRleE1pbiwKLSAgICAgICAgICAgIG1JbmRleE1heCwKLSAgICAgICAgICAgIG1JbmRleEN1ciwKLSAgICAgICAgICAgIG1DYW5CZU11dGVkKTsKLX0KLQotLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6RWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgT3V0cHV0OiAlZFxuIiwgbU91dHB1dCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBiNjE0YzQ4Li42ZDA2ZDgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMzAsMjEgKzMwLDIwIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKLQotI2lmbmRlZiBIQVZFX0dFVFRJRAotIyBkZWZpbmUgZ2V0dGlkIGdldHBpZAotI2VuZGlmCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIHN0YXRpYyBjb25zdCBjaGFyICprRGVhZGxvY2tlZFN0cmluZyA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0NtZERlYWRsb2NrZWRTdHJpbmcgPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogCkBAIC01MiwyMSArNTEsMjUgQEAKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSAyMDAwMDsKIAogc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKCkgewotI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgogICAgIGlmIChnZXRwaWQoKSA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIikpOwogICAgIGlmICghb2spIExPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwogICAgIHJldHVybiBvazsKIH0KIAorbmFtZXNwYWNlIHsKKyAgICBleHRlcm4gc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzOworfTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5U2VydmljZSgpCi0gICAgOiBCbkF1ZGlvUG9saWN5U2VydmljZSgpICwgbXBQb2xpY3lNYW5hZ2VyKE5VTEwpCisgICAgOiBCbkF1ZGlvUG9saWN5U2VydmljZSgpICwgbXBBdWRpb1BvbGljeURldihOVUxMKSAsIG1wQXVkaW9Qb2xpY3koTlVMTCkKIHsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGU7CisgICAgaW50IGZvcmNlZF92YWw7CisgICAgaW50IHJjOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtNzUsMzIgKzc4LDM4IEBACiAgICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQ29tbWFuZFRocmVhZCIpKTsKIAotI2lmIChkZWZpbmVkIEdFTkVSSUNfQVVESU8pIHx8IChkZWZpbmVkIEFVRElPX1BPTElDWV9URVNUKQotICAgIG1wUG9saWN5TWFuYWdlciA9IG5ldyBBdWRpb1BvbGljeU1hbmFnZXJCYXNlKHRoaXMpOwotICAgIExPR1YoImJ1aWxkIGZvciBHRU5FUklDX0FVRElPIC0gdXNpbmcgZ2VuZXJpYyBhdWRpbyBwb2xpY3kiKTsKLSNlbHNlCi0gICAgLy8gaWYgcnVubmluZyBpbiBlbXVsYXRpb24gLSB1c2UgdGhlIGVtdWxhdG9yIGRyaXZlcgotICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmtlcm5lbC5xZW11IiwgdmFsdWUsIDApKSB7Ci0gICAgICAgIExPR1YoIlJ1bm5pbmcgaW4gZW11bGF0aW9uIC0gdXNpbmcgZ2VuZXJpYyBhdWRpbyBwb2xpY3kiKTsKLSAgICAgICAgbXBQb2xpY3lNYW5hZ2VyID0gbmV3IEF1ZGlvUG9saWN5TWFuYWdlckJhc2UodGhpcyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBMT0dWKCJVc2luZyBoYXJkd2FyZSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kiKTsKLSAgICAgICAgbXBQb2xpY3lNYW5hZ2VyID0gY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKHRoaXMpOwotICAgIH0KLSNlbmRpZgorICAgIC8qIGluc3RhbnRpYXRlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciAqLworICAgIHJjID0gaHdfZ2V0X21vZHVsZShBVURJT19QT0xJQ1lfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybjsKIAotICAgIGlmICgobXBQb2xpY3lNYW5hZ2VyICE9IE5VTEwpICYmIChtcFBvbGljeU1hbmFnZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewotICAgICAgICBkZWxldGUgbXBQb2xpY3lNYW5hZ2VyOwotICAgICAgICBtcFBvbGljeU1hbmFnZXIgPSBOVUxMOwotICAgIH0KKyAgICByYyA9IGF1ZGlvX3BvbGljeV9kZXZfb3Blbihtb2R1bGUsICZtcEF1ZGlvUG9saWN5RGV2KTsKKyAgICBMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBwb2xpY3kgZGV2aWNlICglcykiLCBzdHJlcnJvcigtcmMpKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybjsKIAotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJDb3VsZCBub3QgY3JlYXRlIEF1ZGlvUG9saWN5TWFuYWdlciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGxvYWQgcHJvcGVydGllcwotICAgICAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgbXBQb2xpY3lNYW5hZ2VyLT5zZXRTeXN0ZW1Qcm9wZXJ0eSgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlKTsKKyAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcEF1ZGlvUG9saWN5KTsKKyAgICBMT0dFX0lGKHJjLCAiY291bGRuJ3QgY3JlYXRlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm47CisKKyAgICByYyA9IG1wQXVkaW9Qb2xpY3ktPmluaXRfY2hlY2sobXBBdWRpb1BvbGljeSk7CisgICAgTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm47CisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBmb3JjZWRfdmFsID0gc3RydG9sKHZhbHVlLCBOVUxMLCAwKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfY2FuX211dGVfZW5mb3JjZWRfYXVkaWJsZShtcEF1ZGlvUG9saWN5LCAhZm9yY2VkX3ZhbCk7CisKKyAgICBMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7CisKKyAgICAvLyBsb2FkIGF1ZGlvIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKICAgICB9CiB9CiAKQEAgLTExMSw1NyArMTIwLDg0IEBACiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQuY2xlYXIoKTsKIAotICAgIGlmIChtcFBvbGljeU1hbmFnZXIpIHsKLSAgICAgICAgZGVsZXRlIG1wUG9saWN5TWFuYWdlcjsKKworICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJlIHByb2Nlc3NpbmcgcmVzb3VyY2VzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIElucHV0U291cmNlRGVzYyAqc291cmNlID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IHNvdXJjZS0+bUVmZmVjdHM7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgZGVsZXRlIGVmZmVjdHNbal0tPm1OYW1lOworICAgICAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBwYXJhbXMgPSBlZmZlY3RzW2pdLT5tUGFyYW1zOworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwYXJhbXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1zW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgICAgICBkZWxldGUgZWZmZWN0c1tqXTsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBzb3VyY2U7CiAgICAgfQorICAgIG1JbnB1dFNvdXJjZXMuY2xlYXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1JbnB1dHMuY2xlYXIoKTsKKworICAgIGlmIChtcEF1ZGlvUG9saWN5ICYmIG1wQXVkaW9Qb2xpY3lEZXYpCisgICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOworICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2KQorICAgICAgICBhdWRpb19wb2xpY3lfZGV2X2Nsb3NlKG1wQXVkaW9Qb2xpY3lEZXYpOwogfQogCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIHN0YXRlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoZGV2aWNlKSAmJiAhQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoZGV2aWNlKSkgeworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKLSAgICAgICAgICAgIHN0YXRlICE9IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKIH0KIAotQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoaW50IHN0YXRlKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEF1ZGlvU3lzdGVtOjpOVU1fTU9ERVMpIHsKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xNzEsMjQ0ICsyMDcsMzMxIEBACiAgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcFBvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzaykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBtcFBvbGljeU1hbmFnZXItPnNldFJpbmdlck1vZGUobW9kZSwgbWFzayk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X3Jpbmdlcl9tb2RlKG1wQXVkaW9Qb2xpY3ksIG1vZGUsIG1hc2spOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQXVkaW9TeXN0ZW06Ok5VTV9GT1JDRV9VU0UpIHsKKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBdWRpb1N5c3RlbTo6TlVNX0ZPUkNFX0NPTkZJRykgeworICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBMT0dWKCJzZXRGb3JjZVVzZSgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSwgY29uZmlnKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLUF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSkKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Rk9SQ0VfTk9ORTsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkU7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBdWRpb1N5c3RlbTo6TlVNX0ZPUkNFX1VTRSkgewotICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OkZPUkNFX05PTkU7CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSk7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBMT0dWKCJnZXRPdXRwdXQoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbHMsIGZsYWdzKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVscywgZmxhZ3MpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIExPR1YoInN0YXJ0T3V0cHV0KCkgdGlkICVkIiwgZ2V0dGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RvcE91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTE9HVigicmVsZWFzZU91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQpOworICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7CiB9CiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoaW50IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBhY291c3RpY3MpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gbXBBdWRpb1BvbGljeS0+Z2V0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVscywgYWNvdXN0aWNzKTsKKworICAgIGlmIChpbnB1dCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KChhdWRpb19zb3VyY2VfdClpbnB1dFNvdXJjZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIHNzaXplX3QgaWR4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBJbnB1dERlc2MgKmlucHV0RGVzYzsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBpbnB1dERlc2MgPSBuZXcgSW5wdXREZXNjKCk7CisgICAgICAgIGlucHV0RGVzYy0+bVNlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbjsKKyAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7CisgICAgfQorCisgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIExPR1coIkZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gaW5wdXQgJWQiLCBlZmZlY3QtPm1OYW1lLCBpbnB1dCk7CisgICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlZmZlY3QtPm1QYXJhbXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGZ4LT5zZXRQYXJhbWV0ZXIoZWZmZWN0LT5tUGFyYW1zW2pdKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERlc2MtPm1FZmZlY3RzLmFkZChmeCk7CisgICAgfQorICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCB0cnVlKTsKKyAgICByZXR1cm4gaW5wdXQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoaW5wdXQpOworCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoaW5wdXQpOworCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3BfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KGlucHV0KTsKKyAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJbnB1dERlc2MgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisgICAgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChpbnB1dERlc2MsIGZhbHNlKTsKKyAgICBpbnB1dERlc2MtPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgZGVsZXRlIGlucHV0RGVzYzsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQotICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgeworICAgIGlmIChzdHJlYW0gPCAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIG1wUG9saWN5TWFuYWdlci0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICBpZiAoc3RyZWFtIDwgMCB8fCBzdHJlYW0gPj0gQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMpIHsKKyAgICBpZiAoc3RyZWFtIDwgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX0NOVCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgKmluZGV4KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50ICppbmRleCkKIHsKLSAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgaWYgKHN0cmVhbSA8IDAgfHwgc3RyZWFtID49IEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTKSB7CisgICAgaWYgKHN0cmVhbSA8IDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9DTlQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCit1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJhdGVneV9mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQordWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZXNfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0X2Zvcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgb3V0cHV0LCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCiB7Ci0gICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnVucmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGlkKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGludCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbUlucHV0cy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOworICAgICAgICBpZiAoaSA8ICpjb3VudCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc2NyaXB0b3JzICsgaSwgJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7CisgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICB9CisgICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewpAQCAtNDM1LDcgKzU1OCw3IEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wUG9saWN5TWFuYWdlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUG9saWN5TWFuYWdlciBJbnRlcmZhY2U6ICVwXG4iLCBtcEF1ZGlvUG9saWN5KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC00NjUsOCArNTg4LDggQEAKICAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1wUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgbXBQb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKKyAgICAgICAgaWYgKG1wQXVkaW9Qb2xpY3kpIHsKKyAgICAgICAgICAgIG1wQXVkaW9Qb2xpY3ktPmR1bXAobXBBdWRpb1BvbGljeSwgZmQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CkBAIC00ODgsNiArNjExLDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UHJlUHJvY2Vzc29yRW5hYmxlZChJbnB1dERlc2MgKmlucHV0RGVzYywgYm9vbCBlbmFibGVkKQoreworICAgIFZlY3RvcjxzcDxBdWRpb0VmZmVjdD4gPiBmeFZlY3RvciA9IGlucHV0RGVzYy0+bUVmZmVjdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmeFZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBmeFZlY3Rvci5pdGVtQXQoaSk7CisgICAgICAgIGZ4LT5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAogICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewpAQCAtNDk1LDE1NCArNjI3LDYgQEAKIH0KIAogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6b3Blbk91dHB1dCh1aW50MzJfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBMT0dXKCJvcGVuT3V0cHV0KCkgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KHBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIExPR1coIm9wZW5EdXBsaWNhdGVPdXRwdXQoKSBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIExPR1coInN1c3BlbmRPdXRwdXQoKSBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIpOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBMT0dXKCJyZXN0b3JlT3V0cHV0KCkgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiKTsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9wZW5JbnB1dCh1aW50MzJfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWNvdXN0aWNzKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgTE9HVygib3BlbklucHV0KCkgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQocERldmljZXMsIHBTYW1wbGluZ1JhdGUsICh1aW50MzJfdCAqKXBGb3JtYXQsIHBDaGFubmVscywgYWNvdXN0aWNzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKLXsKLSAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9sdW1lQ29tbWFuZCgoaW50KXN0cmVhbSwgdm9sdW1lLCAoaW50KW91dHB1dCwgZGVsYXlNcyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtT3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5zZXRTdHJlYW1PdXRwdXQoc3RyZWFtLCBvdXRwdXQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om1vdmVFZmZlY3RzKGludCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIChpbnQpc3JjT3V0cHV0LCAoaW50KWRzdE91dHB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnBhcmFtZXRlcnNDb21tYW5kKChpbnQpaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsIGRlbGF5TXMpOwotfQotCi1TdHJpbmc4IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykKLXsKLSAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvSGFuZGxlLCBrZXlzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZCh0b25lLCBzdHJlYW0pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwotfQotCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSkKQEAgLTg1OSw3ICs4NDMsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cGFyYW1ldGVyc0NvbW1hbmQoaW50IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKQEAgLTg2OCw3ICs4NTIsNyBAQAogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7CiAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKICAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKLSAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IGtleVZhbHVlUGFpcnM7CisgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMgPSBTdHJpbmc4KGtleVZhbHVlUGFpcnMpOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CiAgICAgaWYgKGRlbGF5TXMgPT0gMCkgewogICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CkBAIC04NzgsNyArODYyLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKICAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCi0gICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBpb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLCBpb0hhbmRsZSwgZGVsYXlNcyk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CiAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwpAQCAtMTAyMyw0ICsxMDA3LDUyMCBAQAogICAgICAgICAgICAgbVBhcmFtKTsKIH0KIAorLyoqKioqKiogaGVscGVycyBmb3IgdGhlIHNlcnZpY2Vfb3BzIGNhbGxiYWNrcyBkZWZpbmVkIGJlbG93ICoqKioqKioqKi8KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnBhcmFtZXRlcnNDb21tYW5kKChpbnQpaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoKGludClzdHJlYW0sIHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpb3V0cHV0LCBkZWxheU1zKTsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikKKyAgICAgICAgTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKKyAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKQorICAgICAgICBMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAorICAgICAgICAgICAgIHRvbmUpOworICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCit7CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvIHByZS1wcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgY2hhciAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjprSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXSA9IHsKKyAgICBNSUNfU1JDX1RBRywKKyAgICBWT0lDRV9VTF9TUkNfVEFHLAorICAgIFZPSUNFX0RMX1NSQ19UQUcsCisgICAgVk9JQ0VfQ0FMTF9TUkNfVEFHLAorICAgIENBTUNPUkRFUl9TUkNfVEFHLAorICAgIFZPSUNFX1JFQ19TUkNfVEFHLAorICAgIFZPSUNFX0NPTU1fU1JDX1RBRworfTsKKworLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgorLy8gQVVESU9fU09VUkNFX0NOVCBpcyBubyBtYXRjaCBmb3VuZAorYXVkaW9fc291cmNlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBBVURJT19TT1VSQ0VfTUlDOyBpIDwgQVVESU9fU09VUkNFX0NOVDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwga0lucHV0U291cmNlTmFtZXNbaSAtIEFVRElPX1NPVVJDRV9NSUNdKSA9PSAwKSB7CisgICAgICAgICAgICBMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Cit9CisKK3NpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKK3sKKyAgICAvLyAqY3VyU2l6ZSBpcyBhdCBsZWFzdCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpCisgICAgc2l6ZV90IHBvcyA9ICgoKmN1clNpemUgLSAxICkgLyBzaXplICsgMSkgKiBzaXplOworCisgICAgaWYgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgeworICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7CisgICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKKyAgICB9CisgICAgKmN1clNpemUgPSBwb3MgKyBzaXplOworICAgIHJldHVybiBwb3M7Cit9CisKK3NpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCit7CisgICAgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU0hPUlRfVEFHLCBzaXplb2YoU0hPUlRfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihzaG9ydCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKHNob3J0KWF0b2kobm9kZS0+dmFsdWUpOworICAgICAgICBMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgc2hvcnQgJWQiLCAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihzaG9ydCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIElOVF9UQUcsIHNpemVvZihJTlRfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihpbnQpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBhdG9pKG5vZGUtPnZhbHVlKTsKKyAgICAgICAgTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGludCAlZCIsICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihpbnQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBGTE9BVF9UQUcsIHNpemVvZihGTE9BVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGZsb2F0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgICooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoZmxvYXQpYXRvZihub2RlLT52YWx1ZSk7CisgICAgICAgIExPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBmbG9hdCAlZiIsKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7CisgICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBCT09MX1RBRywgc2l6ZW9mKEJPT0xfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihib29sKSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgIGlmIChzdHJuY21wKG5vZGUtPnZhbHVlLCAiZmFsc2UiLCBzdHJsZW4oImZhbHNlIikgKyAxKSA9PSAwKSB7CisgICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGJvb2wgJXMiLCooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGJvb2wpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBTVFJJTkdfVEFHLCBzaXplb2YoU1RSSU5HX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJubGVuKG5vZGUtPnZhbHVlLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpOworICAgICAgICBpZiAoKmN1clNpemUgKyBsZW4gKyAxID4gKnRvdFNpemUpIHsKKyAgICAgICAgICAgICp0b3RTaXplID0gKmN1clNpemUgKyBsZW4gKyAxOworICAgICAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KHBhcmFtICsgKmN1clNpemUsIG5vZGUtPnZhbHVlLCBsZW4pOworICAgICAgICAqY3VyU2l6ZSArPSBsZW47CisgICAgICAgIHBhcmFtWypjdXJTaXplXSA9ICdcMCc7CisgICAgICAgIExPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzdHJpbmcgJXMiLCBwYXJhbSArICpjdXJTaXplIC0gbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgTE9HVygicmVhZFBhcmFtVmFsdWUoKSB1bmtub3duIHBhcmFtIHR5cGUgJXMiLCBub2RlLT5uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworZWZmZWN0X3BhcmFtX3QgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqcGFyYW07CisgICAgY25vZGUgKnZhbHVlOworICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KTsKKyAgICBzaXplX3QgdG90U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCk7CisgICAgZWZmZWN0X3BhcmFtX3QgKmZ4X3BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHRvdFNpemUpOworCisgICAgcGFyYW0gPSBjb25maWdfZmluZChyb290LCBQQVJBTV9UQUcpOworICAgIHZhbHVlID0gY29uZmlnX2ZpbmQocm9vdCwgVkFMVUVfVEFHKTsKKyAgICBpZiAocGFyYW0gPT0gTlVMTCAmJiB2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRyeSB0byBwYXJzZSBzaW1wbGUgcGFyYW1ldGVyIGZvcm0ge2ludCBpbnR9CisgICAgICAgIHBhcmFtID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgLy8gTm90ZTogdGhhdCBhIHBhaXIgb2YgcmFuZG9tIHN0cmluZ3MgaXMgcmVhZCBhcyAwIDAKKyAgICAgICAgICAgIGludCAqcHRyID0gKGludCAqKWZ4X3BhcmFtLT5kYXRhOworICAgICAgICAgICAgaW50ICpwdHIyID0gKGludCAqKSgoY2hhciAqKXBhcmFtICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSk7CisgICAgICAgICAgICBMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcHRyICVwIHB0cjIgJXAiLCBwdHIsIHB0cjIpOworICAgICAgICAgICAgKnB0cisrID0gYXRvaShwYXJhbS0+bmFtZSk7CisgICAgICAgICAgICAqcHRyID0gYXRvaShwYXJhbS0+dmFsdWUpOworICAgICAgICAgICAgZnhfcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICBmeF9wYXJhbS0+dnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIHJldHVybiBmeF9wYXJhbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtZXRlciBkZXNjcmlwdGlvbiAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IDA7CisgICAgcGFyYW0gPSBwYXJhbS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKHBhcmFtKSB7CisgICAgICAgIExPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHBhcmFtIG9mIHR5cGUgJXMiLCBwYXJhbS0+bmFtZSk7CisgICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUocGFyYW0sIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZnhfcGFyYW0tPnBzaXplICs9IHNpemU7CisgICAgICAgIHBhcmFtID0gcGFyYW0tPm5leHQ7CisgICAgfQorCisgICAgLy8gYWxpZ24gc3RhcnQgb2YgdmFsdWUgZmllbGQgb24gMzIgYml0IGJvdW5kYXJ5CisgICAgY3VyU2l6ZSA9ICgoY3VyU2l6ZSAtIDEgKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKworICAgIGZ4X3BhcmFtLT52c2l6ZSA9IDA7CisgICAgdmFsdWUgPSB2YWx1ZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKHZhbHVlKSB7CisgICAgICAgIExPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHZhbHVlIG9mIHR5cGUgJXMiLCB2YWx1ZS0+bmFtZSk7CisgICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUodmFsdWUsIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZnhfcGFyYW0tPnZzaXplICs9IHNpemU7CisgICAgICAgIHZhbHVlID0gdmFsdWUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ4X3BhcmFtOworCitlcnJvcjoKKyAgICBkZWxldGUgZnhfcGFyYW07CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcnMoKSBsb2FkaW5nIHBhcmFtICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwYXJhbSA9IGxvYWRFZmZlY3RQYXJhbWV0ZXIobm9kZSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6SW5wdXRTb3VyY2VEZXNjICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRJbnB1dFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBlbXB0eSBlbGVtZW50ICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBJbnB1dFNvdXJjZURlc2MgKnNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZURlc2MoKTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVmZmVjdHNbaV0tPm1OYW1lLCBub2RlLT5uYW1lLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBmb3VuZCBlZmZlY3QgJXMgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IGVmZmVjdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBlZmZlY3QgJXMgbm90IGluIGxpc3QiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoKmVmZmVjdHNbaV0pOworICAgICAgICBsb2FkRWZmZWN0UGFyYW1ldGVycyhub2RlLCBlZmZlY3QtPm1QYXJhbXMpOworICAgICAgICBMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBhZGRpbmcgZWZmZWN0ICVzIHV1aWQgJTA4eCIsIGVmZmVjdC0+bU5hbWUsIGVmZmVjdC0+bVV1aWQudGltZUxvdyk7CisgICAgICAgIHNvdXJjZS0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBpZiAoc291cmNlLT5tRWZmZWN0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBubyB2YWxpZCBlZmZlY3RzIGZvdW5kIGluIHNvdXJjZSAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICBkZWxldGUgc291cmNlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBQUkVQUk9DRVNTSU5HX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0U291cmNlTmFtZVRvRW51bShub2RlLT5uYW1lKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ05UKSB7CisgICAgICAgICAgICBMT0dXKCJsb2FkSW5wdXRTb3VyY2VzKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgTE9HVigibG9hZElucHV0U291cmNlcygpIGxvYWRpbmcgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIElucHV0U291cmNlRGVzYyAqZGVzYyA9IGxvYWRJbnB1dFNvdXJjZShub2RlLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6OkVmZmVjdERlc2MgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoKTsKKyAgICBlZmZlY3QtPm1OYW1lID0gc3RyZHVwKHJvb3QtPm5hbWUpOworICAgIG1lbWNweSgmZWZmZWN0LT5tVXVpZCwgJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisKKyAgICByZXR1cm4gZWZmZWN0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIExPR1YoImxvYWRFZmZlY3RzKCkgbG9hZGluZyBlZmZlY3QgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisKKyAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0czsKKyAgICBsb2FkRWZmZWN0cyhyb290LCBlZmZlY3RzKTsKKyAgICBsb2FkSW5wdXRTb3VyY2VzKHJvb3QsIGVmZmVjdHMpOworCisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Cit9CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOworfQorCitzdGF0aWMgaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpCisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdGljIGludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjb3VzdGljcykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQocERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY291c3RpY3MpOworfQorCitzdGF0aWMgaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitzdGF0aWMgaW50IGFwc19zZXRfc3RyZWFtX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFmLT5zZXRTdHJlYW1PdXRwdXQoc3RyZWFtLCBvdXRwdXQpOworfQorCitzdGF0aWMgaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSwgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCAoaW50KXNyY19vdXRwdXQsIChpbnQpZHN0X291dHB1dCk7Cit9CisKK3N0YXRpYyBjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQoreworICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKKyAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGt2X3BhaXJzLCBkZWxheV9tcyk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworc3RhdGljIGludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOworfQorCitzdGF0aWMgaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworfTsgLy8gZXh0ZXJuICJDIgorCituYW1lc3BhY2UgeworICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wcyA9IHsKKyAgICAgICAgb3Blbl9vdXRwdXQgICAgICAgICAgIDogYXBzX29wZW5fb3V0cHV0LAorICAgICAgICBvcGVuX2R1cGxpY2F0ZV9vdXRwdXQgOiBhcHNfb3Blbl9kdXBfb3V0cHV0LAorICAgICAgICBjbG9zZV9vdXRwdXQgICAgICAgICAgOiBhcHNfY2xvc2Vfb3V0cHV0LAorICAgICAgICBzdXNwZW5kX291dHB1dCAgICAgICAgOiBhcHNfc3VzcGVuZF9vdXRwdXQsCisgICAgICAgIHJlc3RvcmVfb3V0cHV0ICAgICAgICA6IGFwc19yZXN0b3JlX291dHB1dCwKKyAgICAgICAgb3Blbl9pbnB1dCAgICAgICAgICAgIDogYXBzX29wZW5faW5wdXQsCisgICAgICAgIGNsb3NlX2lucHV0ICAgICAgICAgICA6IGFwc19jbG9zZV9pbnB1dCwKKyAgICAgICAgc2V0X3N0cmVhbV92b2x1bWUgICAgIDogYXBzX3NldF9zdHJlYW1fdm9sdW1lLAorICAgICAgICBzZXRfc3RyZWFtX291dHB1dCAgICAgOiBhcHNfc2V0X3N0cmVhbV9vdXRwdXQsCisgICAgICAgIHNldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19zZXRfcGFyYW1ldGVycywKKyAgICAgICAgZ2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX2dldF9wYXJhbWV0ZXJzLAorICAgICAgICBzdGFydF90b25lICAgICAgICAgICAgOiBhcHNfc3RhcnRfdG9uZSwKKyAgICAgICAgc3RvcF90b25lICAgICAgICAgICAgIDogYXBzX3N0b3BfdG9uZSwKKyAgICAgICAgc2V0X3ZvaWNlX3ZvbHVtZSAgICAgIDogYXBzX3NldF92b2ljZV92b2x1bWUsCisgICAgICAgIG1vdmVfZWZmZWN0cyAgICAgICAgICA6IGFwc19tb3ZlX2VmZmVjdHMsCisgICAgfTsKK307IC8vIG5hbWVzcGFjZSA8dW5uYW1lZD4KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCBmYWFkODkzLi44MzRiNzk0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0xNywxMSArMTcsMTcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICiAKLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiw3ICszOCw3IEBACiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCiAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotICAgIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKKy8vICAgIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OwpAQCAtNDcsNTYgKzUzLDYwIEBACiAgICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgdmlydHVhbCBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGludCBzdGF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSaW5nZXJNb2RlKHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IG1hc2spOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKTsKLSAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEF1ZGlvU3lzdGVtOjpGT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyBmbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19JTkRJUkVDVCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OkZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzKTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2luX2Fjb3VzdGljc190KTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgKmluZGV4KTsKIAotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShpbnQgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0xMDcsNDAgKzExNywyMSBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKICAgICAvLwotICAgIC8vIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCisgICAgLy8gSGVscGVycyBmb3IgdGhlIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgaW1wbGVtZW50YXRpb24uCisgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQKKyAgICAvLyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBvbGljeSBzZXJ2aWNlLgogICAgIC8vCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuT3V0cHV0KHVpbnQzMl90ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KHVpbnQzMl90ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWNvdXN0aWNzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0b25lLCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpOwpAQCAtMTgwLDcgKzE3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoaW50IHR5cGUgPSAwLCBpbnQgc3RyZWFtID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGludCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgaW50IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoaW50IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChpbnQgaW9IYW5kbGUsIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAKQEAgLTIzNCwxNSArMjI1LDYzIEBACiAgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCiAgICAgfTsKIAorICAgIGNsYXNzIEVmZmVjdERlc2MgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0RGVzYygpIHt9CisgICAgICAgIHZpcnR1YWwgfkVmZmVjdERlc2MoKSB7fQorICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKKyAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOworICAgIH07CisKKyAgICBjbGFzcyBJbnB1dFNvdXJjZURlc2MgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5wdXRTb3VyY2VEZXNjKCkge30KKyAgICAgICAgdmlydHVhbCB+SW5wdXRTb3VyY2VEZXNjKCkge30KKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IG1FZmZlY3RzOworICAgIH07CisKKworICAgIGNsYXNzIElucHV0RGVzYyB7CisgICAgcHVibGljOgorICAgICAgICBJbnB1dERlc2MoKSB7fQorICAgICAgICB2aXJ0dWFsIH5JbnB1dERlc2MoKSB7fQorICAgICAgICBpbnQgbVNlc3Npb25JZDsKKyAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPm1FZmZlY3RzOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV07CisKKyAgICB2b2lkIHNldFByZVByb2Nlc3NvckVuYWJsZWQoSW5wdXREZXNjICppbnB1dERlc2MsIGJvb2wgZW5hYmxlZCk7CisgICAgc3RhdHVzX3QgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKyAgICBzdGF0dXNfdCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBFZmZlY3REZXNjICpsb2FkRWZmZWN0KGNub2RlICpyb290KTsKKyAgICBzdGF0dXNfdCBsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOworICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKKyAgICBJbnB1dFNvdXJjZURlc2MgKmxvYWRJbnB1dFNvdXJjZShjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICB2b2lkIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpOworICAgIGVmZmVjdF9wYXJhbV90ICpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KTsKKyAgICBzaXplX3QgcmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7CisgICAgc2l6ZV90IGdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7CisKICAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGllcy4KICAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpOwogCiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIG1wUG9saWN5TWFuYWdlcjsgICAgICAgICAgLy8gdGhlIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCiAgICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCisgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9fc291cmNlX3QsIElucHV0U291cmNlRGVzYyogPiBtSW5wdXRTb3VyY2VzOworICAgIEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgSW5wdXREZXNjKiA+IG1JbnB1dHM7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCmluZGV4IDFkMjQ3YmQuLjRkNzIxZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TUkMiCisKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTIyLDggKzI0LDYgQEAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMuaCIKIAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1NSQyIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBiNTJmYzY5Li5lMzU0MzVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEsMzggKzEsNSBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMgU2V0IFVTRV9DQU1FUkFfU1RVQiBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGhhcmR3YXJlIGNhbWVyYS4KLQotIyBmb3JjZSB0aGVzZSBidWlsZHMgdG8gdXNlIGNhbWVyYSBzdHViIG9ubHkKLWlmbmVxICgkKGZpbHRlciBzb29uZXIgZ2VuZXJpYyBzaW0sJChUQVJHRVRfREVWSUNFKSksKQotICBVU0VfQ0FNRVJBX1NUVUI6PXRydWUKLWVuZGlmCi0KLWlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSwpCi0gIFVTRV9DQU1FUkFfU1RVQjo9ZmFsc2UKLWVuZGlmCi0KLWlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSx0cnVlKQotIwotIyBsaWJjYW1lcmFzdHViCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICBDYW1lcmFIYXJkd2FyZVN0dWIuY3BwICAgICAgXAotICAgIEZha2VDYW1lcmEuY3BwCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXN0dWIKLQotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1BST0NFU1MKLWVuZGlmCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJ1aQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi1lbmRpZiAjIFVTRV9DQU1FUkFfU1RVQgotCiAjCiAjIGxpYmNhbWVyYXNlcnZpY2UKICMKQEAgLTQ5LDE5ICsxNiw5IEBACiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJtZWRpYSBcCiAgICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKLSAgICBsaWJndWkKKyAgICBsaWJndWkgXAorICAgIGxpYmhhcmR3YXJlCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKIAotaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1BST0NFU1MKLWVuZGlmCi0KLWlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSwgdHJ1ZSkKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliY2FtZXJhc3R1YgotZWxzZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjYW1lcmEgCi1lbmRpZgotCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU0NGIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkFfSEFSRFdBUkVfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9hbmRyb2lkX25hdGl2ZV9idWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgdm9pZCAoKm5vdGlmeV9jYWxsYmFjaykoaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXh0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7CisKK3R5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2spKGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcik7CisKK3R5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2tfdGltZXN0YW1wKShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcik7CisKKy8qKgorICogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlCisgKiBjYW1lcmEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIsIHVzZWQgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcKKyAqIHBhcmFtZXRlcnMsIGxpdmUgcHJldmlld2luZywgYW5kIHRha2luZyBwaWN0dXJlcy4KKyAqCisgKiBJdCBpcyBhIHJlZmVyZW5jZWQgY291bnRlZCBpbnRlcmZhY2Ugd2l0aCBSZWZCYXNlIGFzIGl0cyBiYXNlIGNsYXNzLgorICogQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSB0byByZXRyaWV2ZSBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZQorICogaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgYW5kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZQorICogZm9sbG93aW5nIHN0ZXBzIGRlc2NyaWJlIGEgdHlwaWNhbCBzZXF1ZW5jZToKKyAqCisgKiAgIC0jIEFmdGVyIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCksIGdldFBhcmFtZXRlcnMoKSBhbmQKKyAqICAgICAgc2V0UGFyYW1ldGVycygpIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnN0YW5jZS4KKyAqICAgICAgQ2FtZXJhU2VydmljZSBjYWxscyBnZXRQcmV2aWV3SGVhcCgpIHRvIGVzdGFibGlzaCBhY2Nlc3MgdG8gdGhlCisgKiAgICAgIHByZXZpZXcgaGVhcCBzbyBpdCBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIFN1cmZhY2VGbGluZ2VyIGZvcgorICogICAgICBlZmZpY2llbnQgZGlzcGxheSB1cGRhdGluZyB3aGlsZSBpbiBwcmV2aWV3IG1vZGUuCisgKiAgIC0jIHN0YXJ0UHJldmlldygpIGlzIGNhbGxlZC4gIFRoZSBjYW1lcmEgaW5zdGFuY2UgdGhlbiBwZXJpb2RpY2FsbHkKKyAqICAgICAgc2VuZHMgdGhlIG1lc3NhZ2UgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FIChpZiBlbmFibGVkKSBlYWNoIHRpbWUKKyAqICAgICAgYSBuZXcgcHJldmlldyBmcmFtZSBpcyBhdmFpbGFibGUuICBJZiBkYXRhIGNhbGxiYWNrIGNvZGUgbmVlZHMgdG8gdXNlCisgKiAgICAgIHRoaXMgbWVtb3J5IGFmdGVyIHJldHVybmluZywgaXQgbXVzdCBjb3B5IHRoZSBkYXRhLgorICoKKyAqIFByaW9yIHRvIHRha2luZyBhIHBpY3R1cmUsIENhbWVyYVNlcnZpY2UgY2FsbHMgYXV0b2ZvY3VzKCkuIFdoZW4gYXV0bworICogZm9jdXNpbmcgaGFzIGNvbXBsZXRlZCwgdGhlIGNhbWVyYSBpbnN0YW5jZSBzZW5kcyBhIENBTUVSQV9NU0dfRk9DVVMgbm90aWZpY2F0aW9uLAorICogd2hpY2ggaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gd2hldGhlciBmb2N1c2luZyB3YXMgc3VjY2Vzc2Z1bC4gVGhlIGNhbWVyYSBpbnN0YW5jZQorICogb25seSBzZW5kcyB0aGlzIG1lc3NhZ2Ugb25jZSBhbmQgaXQgaXMgdXAgIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIGF1dG9Gb2N1cygpCisgKiBhZ2FpbiBpZiByZWZvY3VzaW5nIGlzIGRlc2lyZWQuCisgKgorICogQ2FtZXJhU2VydmljZSBjYWxscyB0YWtlUGljdHVyZSgpIHRvIHJlcXVlc3QgdGhlIGNhbWVyYSBpbnN0YW5jZSB0YWtlIGEKKyAqIHBpY3R1cmUuIEF0IHRoaXMgcG9pbnQsIGlmIGEgc2h1dHRlciwgcG9zdHZpZXcsIHJhdywgYW5kL29yIGNvbXByZXNzZWQgY2FsbGJhY2sKKyAqIGlzIGRlc2lyZWQsIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgbXVzdCBiZSBlbmFibGVkLiBBcyB3aXRoIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwKKyAqIGFueSBtZW1vcnkgcHJvdmlkZWQgaW4gYSBkYXRhIGNhbGxiYWNrIG11c3QgYmUgY29waWVkIGlmIGl0J3MgbmVlZGVkIGFmdGVyIHJldHVybmluZy4KKyAqLworCitjbGFzcyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworcHVibGljOgorICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKGh3X21vZHVsZV90ICptb2R1bGUsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgeworICAgICAgICBtRGV2aWNlID0gMDsKKyAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICBMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcywgdGhpcyAlcCIsIG5hbWUsIHRoaXMpOworICAgICAgICBpbnQgcmMgPSBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJjICE9IE9LKQorICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IG9wZW4gY2FtZXJhICVzOiAlZCIsIG5hbWUsIHJjKTsKKyAgICAgICAgaW5pdEhhbFByZXZpZXdXaW5kb3coKTsKKyAgICB9CisKKyAgICB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoKQorICAgIHsKKyAgICAgICAgTE9HSSgiRGVzdHJveWluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGludCByYyA9IG1EZXZpY2UtPmNvbW1vbi5jbG9zZSgmbURldmljZS0+Y29tbW9uKTsKKyAgICAgICAgaWYgKHJjICE9IE9LKQorICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNsb3NlIGNhbWVyYSAlczogJWQiLCBtTmFtZS5zdHJpbmcoKSwgcmMpOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIEFOYXRpdmVXaW5kb3cgdG8gd2hpY2ggcHJldmlldyBmcmFtZXMgYXJlIHNlbnQgKi8KKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykgYnVmICVwIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSwgYnVmLmdldCgpKTsKKworICAgICAgICBpZiAobURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cpIHsKKyAgICAgICAgICAgIG1QcmV2aWV3V2luZG93ID0gYnVmOworICAgICAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cudXNlciA9IHRoaXM7CisgICAgICAgICAgICBMT0dWKCIlcyAmbUhhbFByZXZpZXdXaW5kb3cgJXAgbUhhbFByZXZpZXdXaW5kb3cudXNlciAlcCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgJm1IYWxQcmV2aWV3V2luZG93LCBtSGFsUHJldmlld1dpbmRvdy51c2VyKTsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnNldF9wcmV2aWV3X3dpbmRvdyhtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBidWYuZ2V0KCkgPyAmbUhhbFByZXZpZXdXaW5kb3cubncgOiAwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqIFNldCB0aGUgbm90aWZpY2F0aW9uIGFuZCBkYXRhIGNhbGxiYWNrcyAqLworICAgIHZvaWQgc2V0Q2FsbGJhY2tzKG5vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFjayBkYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wIGRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpCisgICAgeworICAgICAgICBtTm90aWZ5Q2IgPSBub3RpZnlfY2I7CisgICAgICAgIG1EYXRhQ2IgPSBkYXRhX2NiOworICAgICAgICBtRGF0YUNiVGltZXN0YW1wID0gZGF0YV9jYl90aW1lc3RhbXA7CisgICAgICAgIG1DYlVzZXIgPSB1c2VyOworCisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworCisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnNldF9jYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+c2V0X2NhbGxiYWNrcyhtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19kYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2RhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dldF9tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYWxsIHRha2UgYSBtc2d0eXBlLAorICAgICAqIHdoaWNoIGlzIGEgYml0bWFzayBvZiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbgorICAgICAqIGluY2x1ZGUvdWkvQ2FtZXJhLmgKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBhIG1lc3NhZ2UsIG9yIHNldCBvZiBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPmVuYWJsZV9tc2dfdHlwZSkKKyAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+ZW5hYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGUgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIE9uY2UgcmVjZWl2ZWQgYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBjYW1lcmEgaGFsCisgICAgICogc2hvdWxkIG5vdCByZWx5IG9uIGl0cyBjbGllbnQgdG8gY2FsbCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKSB0byByZWxlYXNlCisgICAgICogdmlkZW8gcmVjb3JkaW5nIGZyYW1lcyBzZW50IG91dCBieSB0aGUgY2FtZXJhbCBoYWwgYmVmb3JlIGFuZCBhZnRlciB0aGUKKyAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSBjYWxsLiBDYW1lcmEgaGFsIGNsaWVudHMgbXVzdCBub3QKKyAgICAgKiBtb2RpZnkvYWNjZXNzIGFueSB2aWRlbyByZWNvcmRpbmcgZnJhbWUgYWZ0ZXIgY2FsbGluZworICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLgorICAgICAqLworICAgIHZvaWQgZGlzYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPmRpc2FibGVfbXNnX3R5cGUpCisgICAgICAgICAgICBtRGV2aWNlLT5vcHMtPmRpc2FibGVfbXNnX3R5cGUobURldmljZSwgbXNnVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgd2hldGhlciBhIG1lc3NhZ2UsIG9yIGEgc2V0IG9mIG1lc3NhZ2VzLCBpcyBlbmFibGVkLgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9wZXJhdGVzIGFzIGFuIEFORCwgaWYgYW55IG9mIHRoZSBtZXNzYWdlcworICAgICAqIHF1ZXJpZWQgYXJlIG9mZiwgdGhpcyB3aWxsIHJldHVybiBmYWxzZS4KKyAgICAgKi8KKyAgICBpbnQgbXNnVHlwZUVuYWJsZWQoaW50MzJfdCBtc2dUeXBlKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPm1zZ190eXBlX2VuYWJsZWQpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5tc2dfdHlwZV9lbmFibGVkKG1EZXZpY2UsIG1zZ1R5cGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgcHJldmlldyBtb2RlLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0UHJldmlldygpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c3RhcnRfcHJldmlldykKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnN0YXJ0X3ByZXZpZXcobURldmljZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcuCisgICAgICovCisgICAgdm9pZCBzdG9wUHJldmlldygpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c3RvcF9wcmV2aWV3KQorICAgICAgICAgICAgbURldmljZS0+b3BzLT5zdG9wX3ByZXZpZXcobURldmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHByZXZpZXcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBpbnQgcHJldmlld0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnByZXZpZXdfZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnByZXZpZXdfZW5hYmxlZChtRGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUgbWV0YSBkYXRhIG9yIHJlYWwgWVVWIGRhdGEgaW4KKyAgICAgKiB0aGUgdmlkZW8gYnVmZmVycyBzZW5kIG91dCB2aWEgQ0FNRVJBX01TR19WSURFT19GUlJBTUUgZm9yIGEKKyAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbi4gSWYgaXQgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgY2FtZXJhCisgICAgICogaGFsIGJlaGF2aW9yIGlzIHRvIHN0b3JlIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzdGFydFJlY29yZGluZygpIGluIG9yZGVyCisgICAgICogdG8gYmUgZWZmZWN0aXZlLgorICAgICAqCisgICAgICogSWYgbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgdmlkZW8gYnVmZmVycywgaXQgaXMgdXAgdG8gdGhlCisgICAgICogcmVjZWl2ZXIgb2YgdGhlIHZpZGVvIGJ1ZmZlcnMgdG8gaW50ZXJwcmV0IHRoZSBjb250ZW50cyBhbmQKKyAgICAgKiB0byBmaW5kIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBtZXRhIGRhdGEKKyAgICAgKiBpbiB0aGUgYnVmZmVyLiBIb3cgdGhpcyBpcyBkb25lIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mCisgICAgICogdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBTb21lIGNhbWVyYSBoYWwgbWF5IG5vdCBzdXBwb3J0IHN0b3JpbmcgbWV0YSBkYXRhIGluIHRoZSB2aWRlbworICAgICAqIGJ1ZmZlcnMsIGJ1dCBhbGwgY2FtZXJhIGhhbCBzaG91bGQgc3VwcG9ydCBzdG9yaW5nIHJlYWwgWVVWIGRhdGEKKyAgICAgKiBpbiB0aGUgdmlkZW8gYnVmZmVycy4gSWYgdGhlIGNhbWVyYSBoYWwgZG9lcyBub3Qgc3VwcG9ydCBzdG9yaW5nCisgICAgICogdGhlIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycyB3aGVuIGl0IGlzIHJlcXVlc3RlZCB0byBkbworICAgICAqIGRvLCBJTlZBTElEX09QRVJBVElPTiBtdXN0IGJlIHJldHVybmVkLiBJdCBpcyB2ZXJ5IHVzZWZ1bCBmb3IKKyAgICAgKiB0aGUgY2FtZXJhIGhhbCB0byBwYXNzIG1ldGEgZGF0YSByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIGZyYW1lCisgICAgICogZGF0YSBkaXJlY3RseSB0byB0aGUgdmlkZW8gZW5jb2Rlciwgc2luY2UgdGhlIGFtb3VudCBvZiB0aGUKKyAgICAgKiB1bmNvbXByZXNzZWQgZnJhbWUgZGF0YSBjYW4gYmUgdmVyeSBsYXJnZSBpZiB2aWRlbyBzaXplIGlzIGxhcmdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZSBpZiB0cnVlIHRvIGluc3RydWN0IHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlCisgICAgICogICAgICBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnM7IGZhbHNlIHRvIGluc3RydWN0CisgICAgICogICAgICB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSByZWFsIFlVViBkYXRhIGluIHRoZSB2aWRlbworICAgICAqICAgICAgYnVmZmVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgb24gc3VjY2Vzcy4KKyAgICAgKi8KKworICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoaW50IGVuYWJsZSkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5zdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycykKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKG1EZXZpY2UsIGVuYWJsZSk7CisgICAgICAgIHJldHVybiBlbmFibGUgPyBJTlZBTElEX09QRVJBVElPTjogT0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgcmVjb3JkIG1vZGUuIFdoZW4gYSByZWNvcmQgaW1hZ2UgaXMgYXZhaWxhYmxlIGEgQ0FNRVJBX01TR19WSURFT19GUkFNRQorICAgICAqIG1lc3NhZ2UgaXMgc2VudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZyYW1lLiBFdmVyeSByZWNvcmQgZnJhbWUgbXVzdCBiZSByZWxlYXNlZAorICAgICAqIGJ5IGEgY2FtZXJhbCBoYWwgY2xpZW50IHZpYSByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKSBiZWZvcmUgdGhlIGNsaWVudCBjYWxscworICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLiBBZnRlciB0aGUgY2xpZW50IGNhbGxzCisgICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSksIGl0IGlzIGNhbWVyYSBoYWwncyByZXNwb25zaWJpbGl0eQorICAgICAqIHRvIG1hbmFnZSB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nIGZyYW1lcywgYW5kIHRoZSBjbGllbnQgbXVzdAorICAgICAqIG5vdCBtb2RpZnkvYWNjZXNzIGFueSB2aWRlbyByZWNvcmRpbmcgZnJhbWVzLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5zdGFydF9yZWNvcmRpbmcpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zdGFydF9yZWNvcmRpbmcobURldmljZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHJlY29yZGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3BSZWNvcmRpbmcoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnN0b3BfcmVjb3JkaW5nKQorICAgICAgICAgICAgbURldmljZS0+b3BzLT5zdG9wX3JlY29yZGluZyhtRGV2aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVjb3JkaW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgaW50IHJlY29yZGluZ0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnJlY29yZGluZ19lbmFibGVkKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+cmVjb3JkaW5nX2VuYWJsZWQobURldmljZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGEgcmVjb3JkIGZyYW1lIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ0FNRVJBX01TR19WSURFT19GUkFNRS4KKyAgICAgKgorICAgICAqIEl0IGlzIGNhbWVyYSBoYWwgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gcmVsZWFzZSB2aWRlbyByZWNvcmRpbmcKKyAgICAgKiBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYSBoYWwgYmVmb3JlIHRoZSBjYW1lcmEgaGFsIHJlY2VpdmVzCisgICAgICogYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLiBBZnRlciBpdCByZWNlaXZlcworICAgICAqIHRoZSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MKKyAgICAgKiByZXNwb25zaWJpbGl0eSBvZiBtYW5hZ2luZyB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nCisgICAgICogZnJhbWVzLgorICAgICAqLworICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+cmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUpIHsKKyAgICAgICAgICAgIHNzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICAgICAgICAgIHZvaWQgKmRhdGEgPSAoKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkpICsgb2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+cmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUobURldmljZSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhdXRvIGZvY3VzLCB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrIHJvdXRpbmUgaXMgY2FsbGVkCisgICAgICogd2l0aCBDQU1FUkFfTVNHX0ZPQ1VTIG9uY2Ugd2hlbiBmb2N1c2luZyBpcyBjb21wbGV0ZS4gYXV0b0ZvY3VzKCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBpZiBhbm90aGVyIGF1dG8gZm9jdXMgaXMgbmVlZGVkLgorICAgICAqLworICAgIHN0YXR1c190IGF1dG9Gb2N1cygpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+YXV0b19mb2N1cykKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmF1dG9fZm9jdXMobURldmljZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGF1dG8tZm9jdXMgZnVuY3Rpb24uIElmIHRoZSBhdXRvLWZvY3VzIGlzIHN0aWxsIGluIHByb2dyZXNzLAorICAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjYW5jZWwgaXQuIFdoZXRoZXIgdGhlIGF1dG8tZm9jdXMgaXMgaW4gcHJvZ3Jlc3MKKyAgICAgKiBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGZvY3VzIHBvc2l0aW9uIHRvIHRoZSBkZWZhdWx0LgorICAgICAqIElmIHRoZSBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWZvY3VzLCB0aGlzIGlzIGEgbm8tb3AuCisgICAgICovCisgICAgc3RhdHVzX3QgY2FuY2VsQXV0b0ZvY3VzKCkKKyAgICB7CisgICAgICAgIExPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICBpZiAobURldmljZS0+b3BzLT5jYW5jZWxfYXV0b19mb2N1cykKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9hdXRvX2ZvY3VzKG1EZXZpY2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSBhIHBpY3R1cmUuCisgICAgICovCisgICAgc3RhdHVzX3QgdGFrZVBpY3R1cmUoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnRha2VfcGljdHVyZSkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnRha2VfcGljdHVyZShtRGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCBhIHBpY3R1cmUgdGhhdCB3YXMgc3RhcnRlZCB3aXRoIHRha2VQaWN0dXJlLiAgQ2FsbGluZyB0aGlzCisgICAgICogbWV0aG9kIHdoZW4gbm8gcGljdHVyZSBpcyBiZWluZyB0YWtlbiBpcyBhIG5vLW9wLgorICAgICAqLworICAgIHN0YXR1c190IGNhbmNlbFBpY3R1cmUoKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPmNhbmNlbF9waWN0dXJlKQorICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+Y2FuY2VsX3BpY3R1cmUobURldmljZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiBUaGlzIHJldHVybnMgQkFEX1ZBTFVFIGlmIGFueSBwYXJhbWV0ZXIgaXMKKyAgICAgKiBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzICZwYXJhbXMpCisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+c2V0X3BhcmFtZXRlcnMpCisgICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmxhdHRlbigpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiAqLworICAgIENhbWVyYVBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpIGNvbnN0CisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJtczsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+Z2V0X3BhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGNoYXIgKnRlbXAgPSBtRGV2aWNlLT5vcHMtPmdldF9wYXJhbWV0ZXJzKG1EZXZpY2UpOworICAgICAgICAgICAgU3RyaW5nOCBzdHJfcGFybXModGVtcCk7CisgICAgICAgICAgICBpZiAobURldmljZS0+b3BzLT5wdXRfcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgICBtRGV2aWNlLT5vcHMtPnB1dF9wYXJhbWV0ZXJzKG1EZXZpY2UsIHRlbXApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyZWUodGVtcCk7CisgICAgICAgICAgICBwYXJtcy51bmZsYXR0ZW4oc3RyX3Bhcm1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFybXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBjb21tYW5kIHRvIGNhbWVyYSBkcml2ZXIuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKQorICAgIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnNlbmRfY29tbWFuZCkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnNlbmRfY29tbWFuZChtRGV2aWNlLCBjbWQsIGFyZzEsIGFyZzIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaXMKKyAgICAgKiAqbm90KiBkb25lIGluIHRoZSBkZXN0cnVjdG9yLgorICAgICAqLworICAgIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGlmIChtRGV2aWNlLT5vcHMtPnJlbGVhc2UpCisgICAgICAgICAgICBtRGV2aWNlLT5vcHMtPnJlbGVhc2UobURldmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcCBzdGF0ZSBvZiB0aGUgY2FtZXJhIGhhcmR3YXJlCisgICAgICovCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CisgICAgeworICAgICAgICBMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPm9wcy0+ZHVtcCkKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmR1bXAobURldmljZSwgZmQpOworICAgICAgICByZXR1cm4gT0s7IC8vIEl0J3MgZmluZSBpZiB0aGUgSEFMIGRvZXNuJ3QgaW1wbGVtZW50IGR1bXAoKQorICAgIH0KKworcHJpdmF0ZToKKyAgICBjYW1lcmFfZGV2aWNlX3QgKm1EZXZpY2U7CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIHN0YXRpYyB2b2lkIF9fbm90aWZ5X2NiKGludDMyX3QgbXNnX3R5cGUsIGludDMyX3QgZXh0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQgKnVzZXIpCisgICAgeworICAgICAgICBMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpfX3RoaXMgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOworICAgICAgICBfX3RoaXMtPm1Ob3RpZnlDYihtc2dfdHlwZSwgZXh0MSwgZXh0MiwgX190aGlzLT5tQ2JVc2VyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBfX2RhdGFfY2IoaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKKyAgICB7CisgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CisgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOworICAgICAgICBpZiAoaW5kZXggPj0gbWVtLT5tTnVtQnVmcykgeworICAgICAgICAgICAgTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIF9fdGhpcy0+bURhdGFDYihtc2dfdHlwZSwgbWVtLT5tQnVmZmVyc1tpbmRleF0sIG1ldGFkYXRhLCBfX3RoaXMtPm1DYlVzZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIF9fZGF0YV9jYl90aW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCisgICAgeworICAgICAgICBMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICpfX3RoaXMgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOworICAgICAgICAvLyBTdGFydCByZWZjb3VudGluZyB0aGUgaGVhcCBvYmplY3QgZnJvbSBoZXJlIG9uLiAgV2hlbiB0aGUgY2xpZW50cworICAgICAgICAvLyBkcm9wIGFsbCByZWZlcmVuY2VzLCBpdCB3aWxsIGJlIGRlc3Ryb3llZCAoYXMgd2VsbCBhcyB0aGUgZW5jbG9zZWQKKyAgICAgICAgLy8gTWVtb3J5SGVhcEJhc2UuCisgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOworICAgICAgICBpZiAoaW5kZXggPj0gbWVtLT5tTnVtQnVmcykgeworICAgICAgICAgICAgTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIF9fdGhpcy0+bURhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ190eXBlLCBtZW0tPm1CdWZmZXJzW2luZGV4XSwgX190aGlzLT5tQ2JVc2VyKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IGNvbWJpbmVzIGEgTWVtb3J5SGVhcEJhc2UgYW5kIGEgTWVtb3J5QmFzZQorICAgIC8vIGluIG9uZS4gIFNpbmNlIHdlIHRlbmQgdG8gdXNlIHRoZW0gaW4gYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCwgdGhpcyBpcworICAgIC8vIGhhbmR5LgorCisgICAgY2xhc3MgQ2FtZXJhSGVhcE1lbW9yeSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkoaW50IGZkLCBzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmZmVycyA9IDEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmU2l6ZShidWZfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUJ1ZnMobnVtX2J1ZmZlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1IZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGZkLCBidWZfc2l6ZSAqIG51bV9idWZmZXJzKTsKKyAgICAgICAgICAgIGNvbW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFIZWFwTWVtb3J5KHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZmZXJzID0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmcyhudW1fYnVmZmVycykKKyAgICAgICAgeworICAgICAgICAgICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoYnVmX3NpemUgKiBudW1fYnVmZmVycyk7CisgICAgICAgICAgICBjb21tb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb21tb25Jbml0aWFsaXphdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS5kYXRhID0gbUhlYXAtPmJhc2UoKTsKKyAgICAgICAgICAgIGhhbmRsZS5zaXplID0gbUJ1ZlNpemUgKiBtTnVtQnVmczsKKyAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUgPSB0aGlzOworCisgICAgICAgICAgICBtQnVmZmVycyA9IG5ldyBzcDxNZW1vcnlCYXNlPlttTnVtQnVmc107CisgICAgICAgICAgICBmb3IgKHVpbnRfdCBpID0gMDsgaSA8IG1OdW1CdWZzOyBpKyspCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0gPSBuZXcgTWVtb3J5QmFzZShtSGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBtQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKTsKKworICAgICAgICAgICAgaGFuZGxlLnJlbGVhc2UgPSBfX3B1dF9tZW1vcnk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIZWFwTWVtb3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlIFtdIG1CdWZmZXJzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG1CdWZTaXplOworICAgICAgICB1aW50X3QgbU51bUJ1ZnM7CisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBtSGVhcDsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gKm1CdWZmZXJzOworCisgICAgICAgIGNhbWVyYV9tZW1vcnlfdCBoYW5kbGU7CisgICAgfTsKKworICAgIHN0YXRpYyBjYW1lcmFfbWVtb3J5X3QqIF9fZ2V0X21lbW9yeShpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQorICAgIHsKKyAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeSAqbWVtOworICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoYnVmX3NpemUsIG51bV9idWZzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoZmQsIGJ1Zl9zaXplLCBudW1fYnVmcyk7CisgICAgICAgIG1lbS0+aW5jU3Ryb25nKG1lbSk7CisgICAgICAgIHJldHVybiAmbWVtLT5oYW5kbGU7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgX19wdXRfbWVtb3J5KGNhbWVyYV9tZW1vcnlfdCAqZGF0YSkKKyAgICB7CisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW0gPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSk7CisgICAgICAgIG1lbS0+ZGVjU3Ryb25nKG1lbSk7CisgICAgfQorCisgICAgc3RhdGljIEFOYXRpdmVXaW5kb3cgKl9fdG9fYW53KHZvaWQgKnVzZXIpCisgICAgeworICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqX190aGlzID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOworICAgICAgICByZXR1cm4gX190aGlzLT5tUHJldmlld1dpbmRvdy5nZXQoKTsKKyAgICB9CisjZGVmaW5lIGFudyhuKSBfX3RvX2FudygoKHN0cnVjdCBjYW1lcmFfcHJldmlld193aW5kb3cgKiluKS0+dXNlcikKKworICAgIHN0YXRpYyBpbnQgX19kZXF1ZXVlX2J1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsIGludCAqc3RyaWRlKQorICAgIHsKKyAgICAgICAgaW50IHJjOworICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CisgICAgICAgIHJjID0gYS0+ZGVxdWV1ZUJ1ZmZlcihhLCAmYW5iKTsKKyAgICAgICAgaWYgKCFyYykgeworICAgICAgICAgICAgKmJ1ZmZlciA9ICZhbmItPmhhbmRsZTsKKyAgICAgICAgICAgICpzdHJpZGUgPSBhbmItPnN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZW9mKCgodHlwZSAqKSAwKS0+bWVtYmVyKSAqX19tcHRyID0gKHB0cik7ICAgICBcCisgICAgICAgICh0eXBlICopICgoY2hhciAqKSBfX21wdHIgLSAoY2hhciAqKSgmKCh0eXBlICopMCktPm1lbWJlcikpOyB9KQorI2VuZGlmCisKKyAgICBzdGF0aWMgaW50IF9fbG9ja19idWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBhLT5sb2NrQnVmZmVyKGEsCisgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IF9fZW5xdWV1ZV9idWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBhLT5xdWV1ZUJ1ZmZlcihhLAorICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSk7CisgICAgfQorCisgICAgc3RhdGljIGludCBfX2NhbmNlbF9idWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBhLT5jYW5jZWxCdWZmZXIoYSwKKyAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSkpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19zZXRfYnVmZmVyX2NvdW50KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYSwgY291bnQpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19zZXRfYnVmZmVyc19nZW9tZXRyeShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgfQorCisgICAgc3RhdGljIGludCBfX3NldF9jcm9wKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkKKyAgICB7CisgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CisgICAgICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjcm9wOworICAgICAgICBjcm9wLmxlZnQgPSBsZWZ0OworICAgICAgICBjcm9wLnRvcCA9IHRvcDsKKyAgICAgICAgY3JvcC5yaWdodCA9IHJpZ2h0OworICAgICAgICBjcm9wLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJmNyb3ApOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgX19zZXRfdXNhZ2Uoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywgaW50IHVzYWdlKQorICAgIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGEsIHVzYWdlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IF9fc2V0X3N3YXBfaW50ZXJ2YWwoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywgaW50IGludGVydmFsKQorICAgIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKKyAgICAgICAgcmV0dXJuIGEtPnNldFN3YXBJbnRlcnZhbChhLCBpbnRlcnZhbCk7CisgICAgfQorCisgICAgc3RhdGljIGludCBfX2dldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvdW50KQorICAgIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKKyAgICAgICAgcmV0dXJuIGEtPnF1ZXJ5KGEsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgY291bnQpOworICAgIH0KKworICAgIHZvaWQgaW5pdEhhbFByZXZpZXdXaW5kb3coKQorICAgIHsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuY2FuY2VsX2J1ZmZlciA9IF9fY2FuY2VsX2J1ZmZlcjsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncubG9ja19idWZmZXIgPSBfX2xvY2tfYnVmZmVyOworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5kZXF1ZXVlX2J1ZmZlciA9IF9fZGVxdWV1ZV9idWZmZXI7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmVucXVldWVfYnVmZmVyID0gX19lbnF1ZXVlX2J1ZmZlcjsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X2J1ZmZlcl9jb3VudCA9IF9fc2V0X2J1ZmZlcl9jb3VudDsKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgPSBfX3NldF9idWZmZXJzX2dlb21ldHJ5OworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfY3JvcCA9IF9fc2V0X2Nyb3A7CisgICAgICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF91c2FnZSA9IF9fc2V0X3VzYWdlOworICAgICAgICBtSGFsUHJldmlld1dpbmRvdy5udy5zZXRfc3dhcF9pbnRlcnZhbCA9IF9fc2V0X3N3YXBfaW50ZXJ2YWw7CisKKyAgICAgICAgbUhhbFByZXZpZXdXaW5kb3cubncuZ2V0X21pbl91bmRlcXVldWVkX2J1ZmZlcl9jb3VudCA9CisgICAgICAgICAgICAgICAgX19nZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50OworICAgIH0KKworICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICBtUHJldmlld1dpbmRvdzsKKworICAgIHN0cnVjdCBjYW1lcmFfcHJldmlld193aW5kb3cgeworICAgICAgICBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzIG53OworICAgICAgICB2b2lkICp1c2VyOworICAgIH07CisKKyAgICBzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93IG1IYWxQcmV2aWV3V2luZG93OworCisgICAgbm90aWZ5X2NhbGxiYWNrICAgICAgICAgbU5vdGlmeUNiOworICAgIGRhdGFfY2FsbGJhY2sgICAgICAgICAgIG1EYXRhQ2I7CisgICAgZGF0YV9jYWxsYmFja190aW1lc3RhbXAgbURhdGFDYlRpbWVzdGFtcDsKKyAgICB2b2lkICptQ2JVc2VyOworfTsKKworfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKaW5kZXggMDdiNWEzNy4uODYzZjE5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCkBAIC0xODAsNyArMTgwLDcgQEAKIAogICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBvZiBhIG5ldyBmcmFtZS4KICAgICAgICAgaWYgKG1Nc2dFbmFibGVkICYgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKQotICAgICAgICAgICAgbURhdGFDYihDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsIGJ1ZmZlciwgbUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgIG1EYXRhQ2IoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBidWZmZXIsIE5VTEwsIG1DYWxsYmFja0Nvb2tpZSk7CiAKICAgICAgICAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIHBvaW50ZXIuCiAgICAgICAgIG1DdXJyZW50UHJldmlld0ZyYW1lID0gKG1DdXJyZW50UHJldmlld0ZyYW1lICsgMSkgJSBrQnVmZmVyQ291bnQ7CkBAIC0yOTAsMTQgKzI5MCwxNCBAQAogICAgICAgICBzcDxNZW1vcnlCYXNlPiBtZW0gPSBuZXcgTWVtb3J5QmFzZShtUmF3SGVhcCwgMCwgdyAqIGggKiAzIC8gMik7CiAgICAgICAgIEZha2VDYW1lcmEgY2FtKHcsIGgpOwogICAgICAgICBjYW0uZ2V0TmV4dEZyYW1lQXNZdXY0MjAoKHVpbnQ4X3QgKiltUmF3SGVhcC0+YmFzZSgpKTsKLSAgICAgICAgbURhdGFDYihDQU1FUkFfTVNHX1JBV19JTUFHRSwgbWVtLCBtQ2FsbGJhY2tDb29raWUpOworICAgICAgICBtRGF0YUNiKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0sIE5VTEwsIG1DYWxsYmFja0Nvb2tpZSk7CiAgICAgfQogCiAgICAgaWYgKG1Nc2dFbmFibGVkICYgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKSB7CiAgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGtDYW5uZWRKcGVnU2l6ZSk7CiAgICAgICAgIHNwPE1lbW9yeUJhc2U+IG1lbSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIDAsIGtDYW5uZWRKcGVnU2l6ZSk7CiAgICAgICAgIG1lbWNweShoZWFwLT5iYXNlKCksIGtDYW5uZWRKcGVnLCBrQ2FubmVkSnBlZ1NpemUpOwotICAgICAgICBtRGF0YUNiKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgbWVtLCBtQ2FsbGJhY2tDb29raWUpOworICAgICAgICBtRGF0YUNiKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgbWVtLCBOVUxMLCBtQ2FsbGJhY2tDb29raWUpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCmluZGV4IDliNjZhNzYuLmM2ZDg3NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oCkBAIC03MywxNCArNzMsNyBAQAogICAgICAgICBDYW1lcmFIYXJkd2FyZVN0dWIqIG1IYXJkd2FyZTsKICAgICBwdWJsaWM6CiAgICAgICAgIFByZXZpZXdUaHJlYWQoQ2FtZXJhSGFyZHdhcmVTdHViKiBodykgOgotI2lmZGVmIFNJTkdMRV9QUk9DRVNTCi0gICAgICAgICAgICAvLyBJbiBzaW5nbGUgcHJvY2VzcyBtb2RlIHRoaXMgdGhyZWFkIG5lZWRzIHRvIGJlIGEgamF2YSB0aHJlYWQsCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSB3b24ndCBiZSBjYWxsaW5nIHRocm91Z2ggdGhlIGJpbmRlci4KLSAgICAgICAgICAgIFRocmVhZCh0cnVlKSwKLSNlbHNlCi0gICAgICAgICAgICBUaHJlYWQoZmFsc2UpLAotI2VuZGlmCi0gICAgICAgICAgICAgIG1IYXJkd2FyZShodykgeyB9CisgICAgICAgICAgICAgICAgVGhyZWFkKGZhbHNlKSwgbUhhcmR3YXJlKGh3KSB7IH0KICAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7CiAgICAgICAgICAgICBydW4oIkNhbWVyYVByZXZpZXdUaHJlYWQiLCBQUklPUklUWV9VUkdFTlRfRElTUExBWSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggYTA5ZTE2Yi4uZTE5M2JlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKICovCiAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0zNyw2ICszOCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY5LDI0ICs3MSwzNCBAQAogc3RhdGljIENhbWVyYVNlcnZpY2UgKmdDYW1lcmFTZXJ2aWNlOwogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkKLTptU291bmRSZWYoMCkKKzptU291bmRSZWYoMCksIG1Nb2R1bGUoMCkKIHsKICAgICBMT0dJKCJDYW1lcmFTZXJ2aWNlIHN0YXJ0ZWQgKHBpZD0lZCkiLCBnZXRwaWQoKSk7Ci0KLSAgICBtTnVtYmVyT2ZDYW1lcmFzID0gSEFMX2dldE51bWJlck9mQ2FtZXJhcygpOwotICAgIGlmIChtTnVtYmVyT2ZDYW1lcmFzID4gTUFYX0NBTUVSQVMpIHsKLSAgICAgICAgTE9HRSgiTnVtYmVyIG9mIGNhbWVyYXMoJWQpID4gTUFYX0NBTUVSQVMoJWQpLiIsCi0gICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOwotICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gTUFYX0NBTUVSQVM7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKLSAgICAgICAgc2V0Q2FtZXJhRnJlZShpKTsKLSAgICB9Ci0KICAgICBnQ2FtZXJhU2VydmljZSA9IHRoaXM7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgQm5DYW1lcmFTZXJ2aWNlOjpvbkZpcnN0UmVmKCk7CisKKyAgICBpZiAoaHdfZ2V0X21vZHVsZShDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAgICAgICAgIChjb25zdCBod19tb2R1bGVfdCAqKikmbU1vZHVsZSkgPCAwKSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBsb2FkIGNhbWVyYSBIQUwgbW9kdWxlIik7CisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IG1Nb2R1bGUtPmdldF9udW1iZXJfb2ZfY2FtZXJhcygpOworICAgICAgICBpZiAobU51bWJlck9mQ2FtZXJhcyA+IE1BWF9DQU1FUkFTKSB7CisgICAgICAgICAgICBMT0dFKCJOdW1iZXIgb2YgY2FtZXJhcyglZCkgPiBNQVhfQ0FNRVJBUyglZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOworICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IE1BWF9DQU1FUkFTOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFGcmVlKGkpOworICAgICAgICB9CisgICAgfQorfQorCiBDYW1lcmFTZXJ2aWNlOjp+Q2FtZXJhU2VydmljZSgpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgewogICAgICAgICBpZiAobUJ1c3lbaV0pIHsKQEAgLTEwMywxMiArMTE1LDE5IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbykgeworICAgIGlmICghbU1vZHVsZSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKICAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBIQUxfZ2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgY2FtZXJhSW5mbyk7Ci0gICAgcmV0dXJuIE9LOworICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOworICAgIHN0YXR1c190IHJjID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbyk7CisgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gaW5mby5mYWNpbmc7CisgICAgY2FtZXJhSW5mby0+b3JpZW50YXRpb24gPSBpbmZvLm9yaWVudGF0aW9uOworICAgIHJldHVybiByYzsKIH0KIAogc3A8SUNhbWVyYT4gQ2FtZXJhU2VydmljZTo6Y29ubmVjdCgKQEAgLTExNiw2ICsxMzUsMTEgQEAKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogCisgICAgaWYgKCFtTW9kdWxlKSB7CisgICAgICAgIExPR0UoIkNhbWVyYSBIQUwgbW9kdWxlIG5vdCBsb2FkZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CiAgICAgICAgIExPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmFJZCAlZCkuIiwKQEAgLTEyMyw2ICsxNDcsMTQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgic3lzLnNlY3BvbGljeS5jYW1lcmEuZGlzYWJsZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoc3RyY21wKHZhbHVlLCAiMSIpID09IDApIHsKKyAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2FibGVkIGJ5IERldmljZVBvbGljeU1hbmFnZXIuCisgICAgICAgIExPR0koIkNhbWVyYSBpcyBkaXNhYmxlZC4gY29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgaWYgKG1DbGllbnRbY2FtZXJhSWRdICE9IDApIHsKICAgICAgICAgY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwpAQCAtMTQ2LDE1ICsxNzgsMTkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlID0gSEFMX29wZW5DYW1lcmFIYXJkd2FyZShjYW1lcmFJZCk7Ci0gICAgaWYgKGhhcmR3YXJlID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiRmFpbCB0byBvcGVuIGNhbWVyYSBoYXJkd2FyZSAoaWQ9JWQpIiwgY2FtZXJhSWQpOworICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOworICAgIGlmIChtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSAhPSBPSykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIENhbWVyYUluZm8gaW5mbzsKLSAgICBIQUxfZ2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgJmluZm8pOwotICAgIGNsaWVudCA9IG5ldyBDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LCBoYXJkd2FyZSwgY2FtZXJhSWQsIGluZm8uZmFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisKKyAgICBjaGFyIGNhbWVyYV9kZXZpY2VfbmFtZVsxMF07CisgICAgc25wcmludGYoY2FtZXJhX2RldmljZV9uYW1lLCBzaXplb2YoY2FtZXJhX2RldmljZV9uYW1lKSwgIiVkIiwgY2FtZXJhSWQpOworCisgICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCZtTW9kdWxlLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kZXZpY2VfbmFtZSksCisgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGluZm8uZmFjaW5nLCBjYWxsaW5nUGlkKTsKICAgICBtQ2xpZW50W2NhbWVyYUlkXSA9IGNsaWVudDsKICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFgiKTsKICAgICByZXR1cm4gY2xpZW50OwpAQCAtMjQ0LDcgKzI4MCw3IEBACiBzdGF0aWMgTWVkaWFQbGF5ZXIqIG5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpIHsKICAgICBNZWRpYVBsYXllciogbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKICAgICBpZiAobXAtPnNldERhdGFTb3VyY2UoZmlsZSwgTlVMTCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbXAtPnNldEF1ZGlvU3RyZWFtVHlwZShBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRSk7CisgICAgICAgIG1wLT5zZXRBdWRpb1N0cmVhbVR5cGUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpOwogICAgICAgICBtcC0+cHJlcGFyZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBsb2FkIENhbWVyYVNlcnZpY2Ugc291bmRzOiAlcyIsIGZpbGUpOwpAQCAtMjgzLDcgKzMxOSw3IEBACiAgICAgICAgIC8vIGRvIG5vdCBwbGF5IHRoZSBzb3VuZCBpZiBzdHJlYW0gdm9sdW1lIGlzIDAKICAgICAgICAgLy8gKHR5cGljYWxseSBiZWNhdXNlIHJpbmdlciBtb2RlIGlzIHNpbGVudCkuCiAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFLCAmaW5kZXgpOworICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICZpbmRleCk7CiAgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CiAgICAgICAgICAgICBwbGF5ZXItPnNlZWtUbygwKTsKICAgICAgICAgICAgIHBsYXllci0+c3RhcnQoKTsKQEAgLTMxNCwxMyArMzUwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FtZXJhSWQpOwogCi0gICAgLy8gRW5hYmxlIHpvb20sIGVycm9yLCBhbmQgZm9jdXMgbWVzc2FnZXMgYnkgZGVmYXVsdAotICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19FUlJPUiB8Ci0gICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1pPT00gfAotICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19GT0NVUyk7CisgICAgLy8gRW5hYmxlIHpvb20sIGVycm9yLCBmb2N1cywgYW5kIG1ldGFkYXRhIG1lc3NhZ2VzIGJ5IGRlZmF1bHQKKyAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfRVJST1IgfCBDQU1FUkFfTVNHX1pPT00gfCBDQU1FUkFfTVNHX0ZPQ1VTIHwKKyAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSk7CiAKICAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBGUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CisgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKDAsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIGNhbWVyYVNlcnZpY2UtPnNldENhbWVyYUJ1c3koY2FtZXJhSWQpOwpAQCAtMzg0LDYgKzQxOSwxMCBAQAogICAgIC8vIGFsbG93IGFueW9uZSB0byB1c2UgY2FtZXJhIChhZnRlciB0aGV5IGxvY2sgdGhlIGNhbWVyYSkKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwogICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBMT0dFKCJOb3QgYWxsb3dlZCB0byB1bmxvY2sgY2FtZXJhIGR1cmluZyByZWNvcmRpbmcuIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICAgICAgbUNsaWVudFBpZCA9IDA7CiAgICAgICAgIExPRzEoImNsZWFyIG1DYW1lcmFDbGllbnQgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIHJlZmVyZW5jZSB0byBJQ2FtZXJhQ2xpZW50IHNvIHRoYXQgd2hlbiB0aGUgYXBwCkBAIC00MTAsNyArNDQ5LDcgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOworICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICBtQ2FtZXJhQ2xpZW50ID0gY2xpZW50OwogCkBAIC00MTgsNiArNDU3LDE3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0aWMgdm9pZCBkaXNjb25uZWN0V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiB3aW5kb3cpIHsKKyAgICBpZiAod2luZG93ICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCh3aW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HVygibmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiZGlzY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CkBAIC00NDksNiArNDk5LDcgQEAKIAogICAgIC8vIFJlbGVhc2UgdGhlIGhlbGQgQU5hdGl2ZVdpbmRvdyByZXNvdXJjZXMuCiAgICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKKyAgICAgICAgZGlzY29ubmVjdFdpbmRvdyhtUHJldmlld1dpbmRvdyk7CiAgICAgICAgIG1QcmV2aWV3V2luZG93ID0gMDsKICAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKICAgICB9CkBAIC00NjIsNzcgKzUxMyw3MyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIHNldCB0aGUgU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7Ci0gICAgTE9HMSgic2V0UHJldmlld0Rpc3BsYXkoJXApIChwaWQgJWQpIiwgc3VyZmFjZS5nZXQoKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAorICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgd2luZG93KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCi0gICAgcmVzdWx0ID0gTk9fRVJST1I7Ci0KICAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCi0gICAgLy8gYXNCaW5kZXIoKSBpcyBzYWZlIG9uIE5VTEwgKHJldHVybnMgTlVMTCkKLSAgICBpZiAoZ2V0SVN1cmZhY2Uoc3VyZmFjZSktPmFzQmluZGVyKCkgPT0gbVN1cmZhY2UpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoYmluZGVyID09IG1TdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICBMT0cxKCJjbGVhcmluZyBvbGQgcHJldmlldyBzdXJmYWNlICVwIiwgbVN1cmZhY2UuZ2V0KCkpOwotICAgIH0KLSAgICBtU3VyZmFjZSA9IGdldElTdXJmYWNlKHN1cmZhY2UpLT5hc0JpbmRlcigpOwotICAgIG1QcmV2aWV3V2luZG93ID0gc3VyZmFjZTsKLQotICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCByZWdpc3RlciBwcmV2aWV3Ci0gICAgLy8gYnVmZmVycyBub3cuCi0gICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0obVByZXZpZXdXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24pOwotICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKKyAgICBpZiAod2luZG93ICE9IDApIHsKKyAgICAgICAgcmVzdWx0ID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCh3aW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIm5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gSWYgcHJldmlldyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCisgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgeworICAgICAgICBpZiAod2luZG93ICE9IDApIHsKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSh3aW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSh3aW5kb3cuZ2V0KCksIG1PcmllbnRhdGlvbik7CisgICAgICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cod2luZG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRXZlcnl0aGluZyBoYXMgc3VjY2VlZGVkLiAgRGlzY29ubmVjdCB0aGUgb2xkIHdpbmRvdyBhbmQgcmVtZW1iZXIgdGhlCisgICAgICAgIC8vIG5ldyB3aW5kb3cuCisgICAgICAgIGRpc2Nvbm5lY3RXaW5kb3cobVByZXZpZXdXaW5kb3cpOworICAgICAgICBtU3VyZmFjZSA9IGJpbmRlcjsKKyAgICAgICAgbVByZXZpZXdXaW5kb3cgPSB3aW5kb3c7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgYWZ0ZXIgd2UgY29ubmVjdGVkIHRvIHRoZSBuZXcgd2luZG93LCBzbworICAgICAgICAvLyBkaXNjb25uZWN0IGhlcmUuCisgICAgICAgIGRpc2Nvbm5lY3RXaW5kb3cod2luZG93KTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCisvLyBzZXQgdGhlIFN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIExPRzEoInNldFByZXZpZXdEaXNwbGF5KCVwKSAocGlkICVkKSIsIHN1cmZhY2UuZ2V0KCksIGdldENhbGxpbmdQaWQoKSk7CisKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIoc3VyZmFjZSAhPSAwID8gc3VyZmFjZS0+YXNCaW5kZXIoKSA6IDApOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyhzdXJmYWNlKTsKKyAgICByZXR1cm4gc2V0UHJldmlld1dpbmRvdyhiaW5kZXIsIHdpbmRvdyk7Cit9CisKIC8vIHNldCB0aGUgU3VyZmFjZVRleHR1cmUgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3VGV4dHVyZSgKICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2VUZXh0dXJlPiYgc3VyZmFjZVRleHR1cmUpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGV4dHVyZSglcCkgKHBpZCAlZCkiLCBzdXJmYWNlVGV4dHVyZS5nZXQoKSwKICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCi0gICAgLy8gcmV0dXJuIGlmIG5vIGNoYW5nZSBpbiBzdXJmYWNlLgotICAgIC8vIGFzQmluZGVyKCkgaXMgc2FmZSBvbiBOVUxMIChyZXR1cm5zIE5VTEwpCi0gICAgaWYgKHN1cmZhY2VUZXh0dXJlLT5hc0JpbmRlcigpID09IG1TdXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgTE9HMSgiY2xlYXJpbmcgb2xkIHByZXZpZXcgc3VyZmFjZSAlcCIsIG1TdXJmYWNlLmdldCgpKTsKLSAgICB9Ci0gICAgbVN1cmZhY2UgPSBzdXJmYWNlVGV4dHVyZS0+YXNCaW5kZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXI7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwogICAgIGlmIChzdXJmYWNlVGV4dHVyZSAhPSAwKSB7Ci0gICAgICAgIG1QcmV2aWV3V2luZG93ID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN1cmZhY2VUZXh0dXJlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtUHJldmlld1dpbmRvdyA9IDA7CisgICAgICAgIGJpbmRlciA9IHN1cmZhY2VUZXh0dXJlLT5hc0JpbmRlcigpOworICAgICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3VyZmFjZVRleHR1cmUpOwogICAgIH0KLQotICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCBzZXQgb3ZlcmxheSBvciByZWdpc3RlciBwcmV2aWV3Ci0gICAgLy8gYnVmZmVycyBub3cuCi0gICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICAvLyBYWFg6IFdoYXQgaWYgdGhlIG5ldyBwcmV2aWV3IHdpbmRvdyBpcyAwPwotICAgICAgICBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0obVByZXZpZXdXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24pOwotICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHNldFByZXZpZXdXaW5kb3coYmluZGVyLCB3aW5kb3cpOwogfQogCiAvLyBzZXQgdGhlIHByZXZpZXcgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQpAQCAtNTQzLDcgKzU5MCw3IEBACiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBjYWxsYmFja19mbGFnOwotICAgIGlmIChtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKKyAgICBpZiAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgewogICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKQEAgLTU5Nyw2ICs2NDQsOCBAQAogICAgIH0KIAogICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7CisgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShtUHJldmlld1dpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOwogICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShtUHJldmlld1dpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24pOwogICAgIH0KQEAgLTY2NiwyMCArNzE1LDYgQEAKICAgICBtSGFyZHdhcmUtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShtZW0pOwogfQogCi1pbnQzMl90IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKSBjb25zdCB7Ci0gICAgTE9HMSgiZ2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIG1IYXJkd2FyZS0+Z2V0TnVtYmVyT2ZWaWRlb0J1ZmZlcnMoKTsKLX0KLQotc3A8SU1lbW9yeT4gQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRWaWRlb0J1ZmZlcihpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgTE9HMSgiZ2V0VmlkZW9CdWZmZXI6ICVkIiwgaW5kZXgpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gMDsKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5nZXRWaWRlb0J1ZmZlcihpbmRleCk7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RvcmVNZXRhRGF0YUluQnVmZmVycyhib29sIGVuYWJsZWQpCiB7CiAgICAgTE9HMSgic3RvcmVNZXRhRGF0YUluQnVmZmVyczogJXMiLCBlbmFibGVkPyAidHJ1ZSI6ICJmYWxzZSIpOwpAQCAtNzM0LDYgKzc2OSwxMSBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCisgICAgaWYgKG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCB0YWtlIHBpY3R1cmUgZHVyaW5nIHJlY29yZGluZy4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmICgobXNnVHlwZSAmIENBTUVSQV9NU0dfUkFXX0lNQUdFKSAmJgogICAgICAgICAobXNnVHlwZSAmIENBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSkpIHsKICAgICAgICAgTE9HRSgiQ0FNRVJBX01TR19SQVdfSU1BR0UgYW5kIENBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSIKQEAgLTkzOCw3ICs5NzgsNyBAQAogICAgIHN3aXRjaCAobXNnVHlwZSkgewogICAgICAgICBjYXNlIENBTUVSQV9NU0dfU0hVVFRFUjoKICAgICAgICAgICAgIC8vIGV4dDEgaXMgdGhlIGRpbWVuc2lvbiBvZiB0aGUgeXV2IHBpY3R1cmUuCi0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVNodXR0ZXIoKGltYWdlX3JlY3RfdHlwZSAqKWV4dDEpOworICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVTaHV0dGVyKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShtc2dUeXBlLCBleHQxLCBleHQyKTsKQEAgLTk0NywyMiArOTg3LDIyIEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcikgeworICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLCB2b2lkKiB1c2VyKSB7CiAgICAgTE9HMigiZGF0YUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwogCiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOwogICAgIGlmIChjbGllbnQgPT0gMCkgcmV0dXJuOwogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAKLSAgICBpZiAoZGF0YVB0ciA9PSAwKSB7CisgICAgaWYgKGRhdGFQdHIgPT0gMCAmJiBtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIk51bGwgZGF0YSByZXR1cm5lZCBpbiBkYXRhIGNhbGxiYWNrIik7CiAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHN3aXRjaCAobXNnVHlwZSkgeworICAgIHN3aXRjaCAobXNnVHlwZSAmIH5DQU1FUkFfTVNHX1BSRVZJRVdfTUVUQURBVEEpIHsKICAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVByZXZpZXdEYXRhKGRhdGFQdHIpOworICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVQcmV2aWV3RGF0YShtc2dUeXBlLCBkYXRhUHRyLCBtZXRhZGF0YSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FOgogICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVQb3N0dmlldyhkYXRhUHRyKTsKQEAgLTk3NCw3ICsxMDE0LDcgQEAKICAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoZGF0YVB0cik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY0RhdGEobXNnVHlwZSwgZGF0YVB0cik7CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNEYXRhKG1zZ1R5cGUsIGRhdGFQdHIsIG1ldGFkYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KQEAgLTk5Nyw5ICsxMDM3LDcgQEAKIH0KIAogLy8gc25hcHNob3QgdGFrZW4gY2FsbGJhY2sKLS8vICJzaXplIiBpcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB5dXYgcGljdHVyZSBmb3IgcmVnaXN0ZXJCdWZmZXIuCi0vLyBJZiBpdCBpcyBOVUxMLCB1c2UgdGhlIHBpY3R1cmUgc2l6ZSBmcm9tIHBhcmFtZXRlcnMuCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVTaHV0dGVyKHZvaWQpIHsKICAgICBpZiAobVBsYXlTaHV0dGVyU291bmQpIHsKICAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9TSFVUVEVSKTsKICAgICB9CkBAIC0xMDE2LDcgKzEwNTQsOSBAQAogfQogCiAvLyBwcmV2aWV3IGNhbGxiYWNrIC0gZnJhbWUgYnVmZmVyIHVwZGF0ZQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZVByZXZpZXdEYXRhKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVQcmV2aWV3RGF0YShpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpIHsKICAgICBzc2l6ZV90IG9mZnNldDsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKQEAgLTEwMjUsNyArMTA2NSw3IEBACiAgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAKICAgICAvLyBpcyBjYWxsYmFjayBlbmFibGVkPwotICAgIGlmICghKGZsYWdzICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykpIHsKKyAgICBpZiAoIShmbGFncyAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSkgewogICAgICAgICAvLyBJZiB0aGUgZW5hYmxlIGJpdCBpcyBvZmYsIHRoZSBjb3B5LW91dCBhbmQgb25lLXNob3QgYml0cyBhcmUgaWdub3JlZAogICAgICAgICBMT0cyKCJmcmFtZSBjYWxsYmFjayBpcyBkaXNhYmxlZCIpOwogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTEwMzYsMjMgKzEwNzYsMjMgQEAKICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKIAogICAgIC8vIGNsZWFyIGNhbGxiYWNrIGZsYWdzIGlmIG5vIGNsaWVudCBvciBvbmUtc2hvdCBtb2RlCi0gICAgaWYgKGMgPT0gMCB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spKSB7CisgICAgaWYgKGMgPT0gMCB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSkgewogICAgICAgICBMT0cyKCJEaXNhYmxlIHByZXZpZXcgY2FsbGJhY2siKTsKLSAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CisgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnICY9IH4oQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOwogICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIAogICAgIGlmIChjICE9IDApIHsKICAgICAgICAgLy8gSXMgdGhlIHJlY2VpdmVkIGZyYW1lIGNvcGllZCBvdXQgb3Igbm90PwotICAgICAgICBpZiAoZmxhZ3MgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKKyAgICAgICAgaWYgKGZsYWdzICYgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSykgewogICAgICAgICAgICAgTE9HMigiZnJhbWUgaXMgY29waWVkIik7Ci0gICAgICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoYywgaGVhcCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShtc2dUeXBlLCBjLCBoZWFwLCBvZmZzZXQsIHNpemUsIG1ldGFkYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPRzIoImZyYW1lIGlzIGZvcndhcmRlZCIpOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBtZW0pOworICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIG1lbSwgbWV0YWRhdGEpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMDY2LDcgKzExMDYsNyBAQAogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUsIG1lbSk7CisgICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FLCBtZW0sIE5VTEwpOwogICAgIH0KIH0KIApAQCAtMTA4MSw3ICsxMTIxLDcgQEAKICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1JBV19JTUFHRSwgbWVtKTsKKyAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0sIE5VTEwpOwogICAgIH0KIH0KIApAQCAtMTA5Miw3ICsxMTMyLDcgQEAKICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIG1lbSk7CisgICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIG1lbSwgTlVMTCk7CiAgICAgfQogfQogCkBAIC0xMTA3LDExICsxMTQ3LDExIEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVHZW5lcmljRGF0YShpbnQzMl90IG1zZ1R5cGUsCi0gICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpIHsKKyAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7CiAgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgZGF0YVB0cik7CisgICAgICAgIGMtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyLCBtZXRhZGF0YSk7CiAgICAgfQogfQogCkBAIC0xMTI1LDggKzExNjUsOSBAQAogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKAotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50LCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7CiAgICAgTE9HMigiY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lIik7CiAgICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIGNvcHkgb3V0IG9mIHBtZW0gYmVmb3JlIHNlbmRpbmcgdGhpcyB0bwogICAgIC8vIHRoZSBjYWxsYmFjay4gRm9yIGVmZmljaWVuY3ksIHJldXNlIHRoZSBzYW1lIE1lbW9yeUhlYXBCYXNlCkBAIC0xMTU4LDcgKzExOTksNyBAQAogICAgIH0KIAogICAgIG1Mb2NrLnVubG9jaygpOwotICAgIGNsaWVudC0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgZnJhbWUpOworICAgIGNsaWVudC0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGZyYW1lLCBtZXRhZGF0YSk7CiB9CiAKIGludCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldE9yaWVudGF0aW9uKGludCBkZWdyZWVzLCBib29sIG1pcnJvcikgewpAQCAtMTI1NywxMiArMTI5OCw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxJU3VyZmFjZT4gQ2FtZXJhU2VydmljZTo6Z2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHsKLSAgICBpZiAoc3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBzdXJmYWNlLT5nZXRJU3VyZmFjZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzcDxJU3VyZmFjZT4oMCk7Ci0gICAgfQotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDFjNDNiMDAuLjU3YWJmODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE5LDkgKzE5LDggQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KIAogLyogVGhpcyBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaWYgd2UgY2FuIGhhdmUgbW9yZSBjYW1lcmFzICovCiAjZGVmaW5lIE1BWF9DQU1FUkFTIDIKQEAgLTMwLDYgKzI5LDcgQEAKIAogY2xhc3MgTWVtb3J5SGVhcEJhc2U7CiBjbGFzcyBNZWRpYVBsYXllcjsKK2NsYXNzIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOwogCiBjbGFzcyBDYW1lcmFTZXJ2aWNlIDoKICAgICBwdWJsaWMgQmluZGVyU2VydmljZTxDYW1lcmFTZXJ2aWNlPiwKQEAgLTUzLDYgKzUzLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIAogICAgIGVudW0gc291bmRfa2luZCB7CiAgICAgICAgIFNPVU5EX1NIVVRURVIgPSAwLApAQCAtNzksMTIgKzgwLDYgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCi0gICAgLy8gVXNlZCBieSBDbGllbnQgb2JqZWN0cyB0byBleHRyYWN0IHRoZSBJU3VyZmFjZSBmcm9tIGEgU3VyZmFjZSBvYmplY3QuCi0gICAgLy8gVGhpcyBpcyB1c2VkIGJlY2F1c2UgbWFraW5nIENsaWVudCBhIGZyaWVuZCBjbGFzcyBvZiBTdXJmYWNlIHdvdWxkCi0gICAgLy8gcmVxdWlyZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgaW4gU3VyZmFjZS5oIHNpbmNlIENsaWVudCBpcyBhIG5lc3RlZAotICAgIC8vIGNsYXNzLgotICAgIHN0YXRpYyBzcDxJU3VyZmFjZT4gZ2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTk5LDggKzk0LDYgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHByZXZpZXdFbmFibGVkKCk7Ci0gICAgICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIGdldE51bWJlck9mVmlkZW9CdWZmZXJzKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgIGdldFZpZGVvQnVmZmVyKGludDMyX3QgaW5kZXgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGJvb2wgZW5hYmxlZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UmVjb3JkaW5nKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BSZWNvcmRpbmcoKTsKQEAgLTE0NywyNyArMTQwLDM2IEBACiAKICAgICAgICAgLy8gdGhlc2UgYXJlIHN0YXRpYyBjYWxsYmFjayBmdW5jdGlvbnMKICAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgbm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcik7Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKTsKKyAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsIHZvaWQqIHVzZXIpOwogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOwogICAgICAgICAvLyBjb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZQogICAgICAgICBzdGF0aWMgc3A8Q2xpZW50PiAgICAgICBnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpOwogICAgICAgICAvLyBoYW5kbGVycyBmb3IgbWVzc2FnZXMKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpOwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcmV2aWV3RGF0YShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcih2b2lkKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJldmlld0RhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmF3UGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdlbmVyaWNOb3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdlbmVyaWNEYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7CiAKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKTsKIAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24sIGJvb2wgbWlycm9yKTsKIAorICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRQcmV2aWV3V2luZG93KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiB3aW5kb3cpOworCiAgICAgICAgIC8vIHRoZXNlIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+ICAgICAgICAgICAgICAgbUNhbWVyYVNlcnZpY2U7ICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gICAgICAgICAgICAgICBtQ2FtZXJhQ2xpZW50OwpAQCAtMjA3LDYgKzIwOSw4IEBACiAgICAgICAgIC8vIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkLiBJdCByZXR1cm5zIHRydWUgaWYgbUxvY2sgaXMgZ3JhYmJlZC4KICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbG9ja0lmTWVzc2FnZVdhbnRlZChpbnQzMl90IG1zZ1R5cGUpOwogICAgIH07CisKKyAgICBjYW1lcmFfbW9kdWxlX3QgKm1Nb2R1bGU7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCmluZGV4IGNmNGU0MmYuLmNmNzMwMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAogICAgICAgICAgICAgICAgIGxpYnVpIFwKICAgICAgICAgICAgICAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICAgICAgICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQKKyAgICAgICAgICAgICAgICBsaWJndWkKIAogIyBEaXNhYmxlIGl0IGJlY2F1c2UgdGhlIElTdXJmYWNlIGludGVyZmFjZSBtYXkgY2hhbmdlLCBhbmQgYmVmb3JlIHdlIGhhdmUgYQogIyBjaGFuY2UgdG8gZml4IHRoaXMgdGVzdCwgd2UgZG9uJ3Qgd2FudCB0byBicmVhayBub3JtYWwgYnVpbGRzLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAKaW5kZXggOGEyMjhmZC4uZTM5MGFlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQ2FtZXJhU2VydmljZVRlc3QuY3BwCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYUNsaWVudC5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZS5oPgotI2luY2x1ZGUgPHVpL092ZXJsYXkuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgpAQCAtMzExLDggKzMxMCw2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcnMoY29uc3QgQnVmZmVySGVhcCYgYnVmZmVycyk7CiAgICAgdmlydHVhbCB2b2lkIHBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpOwogICAgIHZpcnR1YWwgdm9pZCB1bnJlZ2lzdGVyQnVmZmVycygpOwotICAgIHZpcnR1YWwgc3A8T3ZlcmxheVJlZj4gY3JlYXRlT3ZlcmxheSgKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IG9yaWVudGF0aW9uKTsKICAgICB2aXJ0dWFsIHNwPEdyYXBoaWNCdWZmZXI+IHJlcXVlc3RCdWZmZXIoaW50IGJ1ZmZlcklkeCwgaW50IHVzYWdlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7CiAKQEAgLTM4MSwxMyArMzc4LDYgQEAKICAgICB9CiB9CiAKLXNwPE92ZXJsYXlSZWY+IE1TdXJmYWNlOjpjcmVhdGVPdmVybGF5KHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0LAotICAgICAgICBpbnQzMl90IG9yaWVudGF0aW9uKSB7Ci0gICAgLy8gTm90IGltcGxlbWVudGVkLgotICAgIEFTU0VSVCgwKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQogLy8KIC8vICBVdGlsaXRpZXMgdG8gdXNlIHRoZSBIb2xkZXIgc2VydmljZQogLy8KQEAgLTgzMCwxMCArODIwLDEwIEBACiAgICAgICAgICAgICBBU1NFUlQoYy0+cHJldmlld0VuYWJsZWQoKSA9PSB0cnVlKTsKICAgICAgICAgICAgIHNsZWVwKDIpOwogICAgICAgICAgICAgYy0+c3RvcFByZXZpZXcoKTsKLSAgICAgICAgICAgIGlmICgodiAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spID09IDApIHsKKyAgICAgICAgICAgIGlmICgodiAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2MtPmFzc2VydERhdGEoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBNQ2FtZXJhQ2xpZW50OjpFUSwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgodiAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgodiAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY2MtPmFzc2VydERhdGEoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FLCBNQ2FtZXJhQ2xpZW50OjpHRSwgMTApOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGNjLT5hc3NlcnREYXRhKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwpAQCAtODQ5LDcgKzgzOSw3IEBACiAgICAgICAgIEFTU0VSVChjLT5yZWNvcmRpbmdFbmFibGVkKCkgPT0gZmFsc2UpOwogICAgICAgICBzcDxNU3VyZmFjZT4gc3VyZmFjZSA9IG5ldyBNU3VyZmFjZSgpOwogICAgICAgICBBU1NFUlQoYy0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkgPT0gTk9fRVJST1IpOwotICAgICAgICBjLT5zZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOworICAgICAgICBjLT5zZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKICAgICAgICAgY2MtPnNldFJlbGVhc2VyKGMuZ2V0KCkpOwogICAgICAgICBjLT5zdGFydFJlY29yZGluZygpOwogICAgICAgICBBU1NFUlQoYy0+cmVjb3JkaW5nRW5hYmxlZCgpID09IHRydWUpOwpAQCAtODcwLDcgKzg2MCw3IEBACiAKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbShjLT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICBwYXJhbS5zZXRQcmV2aWV3U2l6ZSh3LCBoKTsKLSAgICAgICAgYy0+c2V0UHJldmlld0NhbGxiYWNrRmxhZyhGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKTsKKyAgICAgICAgYy0+c2V0UHJldmlld0NhbGxiYWNrRmxhZyhDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CiAgICAgICAgIGMtPnNldFBhcmFtZXRlcnMocGFyYW0uZmxhdHRlbigpKTsKIAogICAgICAgICBjLT5zdGFydFByZXZpZXcoKTsK